diff --git a/public/assets/.sprockets-manifest-1ecf1692b9cfa13c0271559a479b9688.json b/public/assets/.sprockets-manifest-1ecf1692b9cfa13c0271559a479b9688.json
index 5ef6ec3879aaffa67c1e7f6a33172186ed2ba521..2da3d146442f4bb28554fdf2c971336590ecb8d0 100644
--- a/public/assets/.sprockets-manifest-1ecf1692b9cfa13c0271559a479b9688.json
+++ b/public/assets/.sprockets-manifest-1ecf1692b9cfa13c0271559a479b9688.json
@@ -1 +1 @@
-{"files":{"modernizr-34f958b565f8b625d03a9216afe69e6819d4d0bb5eb423e48c532aab27d533b0.js":{"logical_path":"modernizr.js","mtime":"2020-04-06T16:47:39+02:00","size":51364,"digest":"34f958b565f8b625d03a9216afe69e6819d4d0bb5eb423e48c532aab27d533b0","integrity":"sha256-NPlYtWX4tiXQOpIWr+aeaBnU0LtetCPkjFMqqyfVM7A="},"active_admin/print-9ca4108e628bcfc6e44c479857ca1db74875fcc9c7966d070fe80be7bb50c98b.css":{"logical_path":"active_admin/print.css","mtime":"2020-04-06T16:47:39+02:00","size":7086,"digest":"9ca4108e628bcfc6e44c479857ca1db74875fcc9c7966d070fe80be7bb50c98b","integrity":"sha256-nKQQjmKLz8bkTEeYV8odt0h1/MnHlm0HD+gL57tQyYs="},"manifest-39627dc52fb1b4829654c355d77d306701477a489888ca0be3235350102e858f.js":{"logical_path":"manifest.js","mtime":"2020-04-06T16:47:39+02:00","size":6,"digest":"39627dc52fb1b4829654c355d77d306701477a489888ca0be3235350102e858f","integrity":"sha256-OWJ9xS+xtIKWVMNV130wZwFHekiYiMoL4yNTUBAuhY8="},"agendadescommuns-0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33.png":{"logical_path":"agendadescommuns.png","mtime":"2020-04-06T16:47:39+02:00","size":2760,"digest":"0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33","integrity":"sha256-ABe+9T9iYcs7+VLUt4DGQwc2lxSy4eLU659p39mGqzM="},"alert-762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906.png":{"logical_path":"alert.png","mtime":"2020-04-06T16:47:39+02:00","size":47876,"digest":"762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906","integrity":"sha256-dirOlHkygkOkQGE0a2TE1rmX6WPGjfxr3dnk0kEZKQY="},"baby_gnu_adl-463a81820aa2d4ffd8e7210dbce1a19ffcac67ef362aa7b092280c6f95c903fc.png":{"logical_path":"baby_gnu_adl.png","mtime":"2020-04-06T16:47:39+02:00","size":7411,"digest":"463a81820aa2d4ffd8e7210dbce1a19ffcac67ef362aa7b092280c6f95c903fc","integrity":"sha256-RjqBggqi1P/Y5yENvOGhn/ysZ+82KqewkigMb5XJA/w="},"baby_gnu_adl-97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e.svg":{"logical_path":"baby_gnu_adl.svg","mtime":"2020-04-06T16:47:39+02:00","size":109635,"digest":"97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e","integrity":"sha256-lyUQBdMiXPHVi4xJfWt5BdvJVgzIrNUBGPzOYNCiZ54="},"communs-0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33.png":{"logical_path":"communs.png","mtime":"2020-04-06T16:47:39+02:00","size":2760,"digest":"0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33","integrity":"sha256-ABe+9T9iYcs7+VLUt4DGQwc2lxSy4eLU659p39mGqzM="},"lef-small-93285d531af463f877951d63fe844a6e9600b782c2c81f78723b730072fa942e.png":{"logical_path":"lef-small.png","mtime":"2020-04-06T16:47:40+02:00","size":1059,"digest":"93285d531af463f877951d63fe844a6e9600b782c2c81f78723b730072fa942e","integrity":"sha256-kyhdUxr0Y/h3lR1j/oRKbpYAt4LCyB94cjtzAHL6lC4="},"linux-presentation-day-863b30562924505dd21841220861f83643d310e0b943a0e6a905462ddfac86f1.png":{"logical_path":"linux-presentation-day.png","mtime":"2020-04-06T16:47:39+02:00","size":9358,"digest":"863b30562924505dd21841220861f83643d310e0b943a0e6a905462ddfac86f1","integrity":"sha256-hjswVikkUF3SGEEiCGH4NkPTEOC5Q6DmqQVGLd+shvE="},"osm_logo-0e91a8acd0a92c1bf14204322322e57c65c2a7e318fec6907252fed929b7d6d3.svg":{"logical_path":"osm_logo.svg","mtime":"2020-04-06T16:47:39+02:00","size":89730,"digest":"0e91a8acd0a92c1bf14204322322e57c65c2a7e318fec6907252fed929b7d6d3","integrity":"sha256-DpGorNCpLBvxQgQyIyLlfGXCp+MY/saQclL+2Sm31tM="},"priorite-logiciel-libre-je-soutiens-april_2_m-6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc.png":{"logical_path":"priorite-logiciel-libre-je-soutiens-april_2_m.png","mtime":"2020-04-06T16:47:39+02:00","size":16952,"digest":"6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc","integrity":"sha256-ZELkVOlu1FzB68QGc6bFC9KGucKOpqi1hXLpT31kWfw="},"regions/CA-QC-70699e6a6e25c69040a3f1548b0afd829c4903ccca2760b6c10f49cc87d5d174.png":{"logical_path":"regions/CA-QC.png","mtime":"2020-04-06T16:47:40+02:00","size":469,"digest":"70699e6a6e25c69040a3f1548b0afd829c4903ccca2760b6c10f49cc87d5d174","integrity":"sha256-cGmeam4lxpBAo/FUiwr9gpxJA8zKJ2C2wQ9JzIfV0XQ="},"team-65c86021cf8a1154493664094aeafcbe3e5aa13dc675bb8ef34b220481db98fa.png":{"logical_path":"team.png","mtime":"2020-04-06T16:47:39+02:00","size":3586,"digest":"65c86021cf8a1154493664094aeafcbe3e5aa13dc675bb8ef34b220481db98fa","integrity":"sha256-ZchgIc+KEVRJNmQJSur8vj5aoT3GdbuO80siBIHbmPo="},"flags/4x3/ad-f67c4e5a3f709ead53c04d9ff35614e6c67517c3d3289170f7a317390f661497.svg":{"logical_path":"flags/4x3/ad.svg","mtime":"2020-02-08T21:52:35+01:00","size":33972,"digest":"f67c4e5a3f709ead53c04d9ff35614e6c67517c3d3289170f7a317390f661497","integrity":"sha256-9nxOWj9wnq1TwE2f81YU5sZ1F8PTKJFw96MXOQ9mFJc="},"flags/1x1/ad-a315836ec2c9dcc11ef9bfd8b18aa7ccfc2d31435cbf46a2c31930836076e09c.svg":{"logical_path":"flags/1x1/ad.svg","mtime":"2020-02-08T21:52:35+01:00","size":32745,"digest":"a315836ec2c9dcc11ef9bfd8b18aa7ccfc2d31435cbf46a2c31930836076e09c","integrity":"sha256-oxWDbsLJ3MEe+b/YsYqnzPwtMUNcv0aiwxkwg2B24Jw="},"flags/4x3/ae-7a3b3dc0f50b5310014cfbcc8200a5f1ce568127bf43452e40e8158e0cff2d2e.svg":{"logical_path":"flags/4x3/ae.svg","mtime":"2020-02-08T21:52:35+01:00","size":257,"digest":"7a3b3dc0f50b5310014cfbcc8200a5f1ce568127bf43452e40e8158e0cff2d2e","integrity":"sha256-ejs9wPULUxABTPvMggCl8c5WgSe/Q0UuQOgVjgz/LS4="},"flags/1x1/ae-bcdd9a4da09598785f3e31db4ff431e22687b2ead18209a3e615600655068cd5.svg":{"logical_path":"flags/1x1/ae.svg","mtime":"2020-02-08T21:52:35+01:00","size":265,"digest":"bcdd9a4da09598785f3e31db4ff431e22687b2ead18209a3e615600655068cd5","integrity":"sha256-vN2aTaCVmHhfPjHbT/Qx4iaHsurRggmj5hVgBlUGjNU="},"flags/4x3/af-01601b521fa86582e32c39eed8c88480afec1f801b6de929b52ed7e49da47260.svg":{"logical_path":"flags/4x3/af.svg","mtime":"2020-02-08T21:52:35+01:00","size":21279,"digest":"01601b521fa86582e32c39eed8c88480afec1f801b6de929b52ed7e49da47260","integrity":"sha256-AWAbUh+oZYLjLDnu2MiEgK/sH4AbbekptS7X5J2kcmA="},"flags/1x1/af-6332cf754a5e2866db631923e1f7cfc52a0a554d32b97bcf19f8263819e4ca7d.svg":{"logical_path":"flags/1x1/af.svg","mtime":"2020-02-08T21:52:35+01:00","size":21145,"digest":"6332cf754a5e2866db631923e1f7cfc52a0a554d32b97bcf19f8263819e4ca7d","integrity":"sha256-YzLPdUpeKGbbYxkj4ffPxSoKVU0yuXvPGfgmOBnkyn0="},"flags/4x3/ag-cb6952d821bac7855231c2cb4d1c44f7c730f6b3621518ab20f30d2b9afe604b.svg":{"logical_path":"flags/4x3/ag.svg","mtime":"2020-02-08T21:52:35+01:00","size":748,"digest":"cb6952d821bac7855231c2cb4d1c44f7c730f6b3621518ab20f30d2b9afe604b","integrity":"sha256-y2lS2CG6x4VSMcLLTRxE98cw9rNiFRirIPMNK5r+YEs="},"flags/1x1/ag-14f7d9978487aaf4446b55167e85a711c48a13ff07edac175c172969a38650c4.svg":{"logical_path":"flags/1x1/ag.svg","mtime":"2020-02-08T21:52:35+01:00","size":764,"digest":"14f7d9978487aaf4446b55167e85a711c48a13ff07edac175c172969a38650c4","integrity":"sha256-FPfZl4SHqvREa1UWfoWnEcSKE/8H7awXXBcpaaOGUMQ="},"flags/4x3/ai-f07c6cc0646fdfa441b9a506e1d46e8dce0d97b37222292e9c6733c995dc89bc.svg":{"logical_path":"flags/4x3/ai.svg","mtime":"2020-02-08T21:52:35+01:00","size":42208,"digest":"f07c6cc0646fdfa441b9a506e1d46e8dce0d97b37222292e9c6733c995dc89bc","integrity":"sha256-8HxswGRv36RBuaUG4dRujc4Nl7NyIikunGczyZXcibw="},"flags/1x1/ai-95099e544de29bcea3ba735de535823f2e19aeb4043e82dbc1d9862f9262b810.svg":{"logical_path":"flags/1x1/ai.svg","mtime":"2020-02-08T21:52:35+01:00","size":47975,"digest":"95099e544de29bcea3ba735de535823f2e19aeb4043e82dbc1d9862f9262b810","integrity":"sha256-lQmeVE3im86junNd5TWCPy4ZrrQEPoLbwdmGL5JiuBA="},"flags/4x3/al-9b997f2720de861e1b0ccec8ddf42a2890795ebf50817f9223e1ceba712c9b03.svg":{"logical_path":"flags/4x3/al.svg","mtime":"2020-02-08T21:52:35+01:00","size":3221,"digest":"9b997f2720de861e1b0ccec8ddf42a2890795ebf50817f9223e1ceba712c9b03","integrity":"sha256-m5l/JyDehh4bDM7I3fQqKJB5Xr9QgX+SI+HOunEsmwM="},"flags/1x1/al-94852d2711fc23abf3423534b9edb950a0c6aabf1d2d98bf2643f3c7dadfac09.svg":{"logical_path":"flags/1x1/al.svg","mtime":"2020-02-08T21:52:35+01:00","size":3228,"digest":"94852d2711fc23abf3423534b9edb950a0c6aabf1d2d98bf2643f3c7dadfac09","integrity":"sha256-lIUtJxH8I6vzQjU0ue25UKDGqr8dLZi/JkPzx9rfrAk="},"flags/4x3/am-85a199ec21d1af74a256335ead0c1e38592bb603d8da81feda4678945e9e00e6.svg":{"logical_path":"flags/4x3/am.svg","mtime":"2020-02-08T21:52:35+01:00","size":226,"digest":"85a199ec21d1af74a256335ead0c1e38592bb603d8da81feda4678945e9e00e6","integrity":"sha256-haGZ7CHRr3SiVjNerQweOFkrtgPY2oH+2kZ4lF6eAOY="},"flags/1x1/am-869391b014ac299924d30777d72a4aba430752177290a90a1fc3255a7ad79ee7.svg":{"logical_path":"flags/1x1/am.svg","mtime":"2020-02-08T21:52:35+01:00","size":234,"digest":"869391b014ac299924d30777d72a4aba430752177290a90a1fc3255a7ad79ee7","integrity":"sha256-hpORsBSsKZkk0wd31ypKukMHUhdykKkKH8MlWnrXnuc="},"flags/4x3/ao-29224a61bf632826d530cda55d87c2615884bd2c2c3a322036ed468e34d85c75.svg":{"logical_path":"flags/4x3/ao.svg","mtime":"2020-02-08T21:52:35+01:00","size":1608,"digest":"29224a61bf632826d530cda55d87c2615884bd2c2c3a322036ed468e34d85c75","integrity":"sha256-KSJKYb9jKCbVMM2lXYfCYViEvSwsOjIgNu1GjjTYXHU="},"flags/1x1/ao-048eacbc862fe1868cf0ec73457b70a8b49a598c80dea049856f0e1fd6fec83e.svg":{"logical_path":"flags/1x1/ao.svg","mtime":"2020-02-08T21:52:35+01:00","size":1608,"digest":"048eacbc862fe1868cf0ec73457b70a8b49a598c80dea049856f0e1fd6fec83e","integrity":"sha256-BI6svIYv4YaM8OxzRXtwqLSaWYyA3qBJhW8OH9b+yD4="},"flags/4x3/aq-b401a776d2f1a7944170114f0aeeceab5e1d962df3de7ed1eff47d96824b73fd.svg":{"logical_path":"flags/4x3/aq.svg","mtime":"2020-02-08T21:52:35+01:00","size":2974,"digest":"b401a776d2f1a7944170114f0aeeceab5e1d962df3de7ed1eff47d96824b73fd","integrity":"sha256-tAGndtLxp5RBcBFPCu7Oq14dli3z3n7R7/R9loJLc/0="},"flags/1x1/aq-a8d7ce9bfb860b6e2b58608b50bf2cafc5220c77f6d049ab7770891f64334531.svg":{"logical_path":"flags/1x1/aq.svg","mtime":"2020-02-08T21:52:35+01:00","size":3183,"digest":"a8d7ce9bfb860b6e2b58608b50bf2cafc5220c77f6d049ab7770891f64334531","integrity":"sha256-qNfOm/uGC24rWGCLUL8sr8UiDHf20Emrd3CJH2QzRTE="},"flags/4x3/ar-bf73475bb707100874dec538ce4b7e1b5afc4ed67dc50a8a800ee519e51cc826.svg":{"logical_path":"flags/4x3/ar.svg","mtime":"2020-02-08T21:52:35+01:00","size":3430,"digest":"bf73475bb707100874dec538ce4b7e1b5afc4ed67dc50a8a800ee519e51cc826","integrity":"sha256-v3NHW7cHEAh03sU4zkt+G1r8TtZ9xQqKgA7lGeUcyCY="},"flags/1x1/ar-fc6582cc6d3ef0782805d8497ee77ab2d836c53422e91007e48f81a4a9fa2e60.svg":{"logical_path":"flags/1x1/ar.svg","mtime":"2020-02-08T21:52:35+01:00","size":3503,"digest":"fc6582cc6d3ef0782805d8497ee77ab2d836c53422e91007e48f81a4a9fa2e60","integrity":"sha256-/GWCzG0+8HgoBdhJfud6stg2xTQi6RAH5I+BpKn6LmA="},"flags/4x3/as-79d395190345206ea03475b67b44638e1111562411504b60646483c9c0b0f7d1.svg":{"logical_path":"flags/4x3/as.svg","mtime":"2020-02-08T21:52:35+01:00","size":8098,"digest":"79d395190345206ea03475b67b44638e1111562411504b60646483c9c0b0f7d1","integrity":"sha256-edOVGQNFIG6gNHW2e0RjjhERViQRUEtgZGSDycCw99E="},"flags/1x1/as-04f0db77c5d8610a55c69508b226a7c338924f8cf7d6577d5d6590e85ee57183.svg":{"logical_path":"flags/1x1/as.svg","mtime":"2020-02-08T21:52:35+01:00","size":7845,"digest":"04f0db77c5d8610a55c69508b226a7c338924f8cf7d6577d5d6590e85ee57183","integrity":"sha256-BPDbd8XYYQpVxpUIsianwziST4z31ld9XWWQ6F7lcYM="},"flags/4x3/at-3d197de8f1f0096a2b0d440b6fc7d80821585a6637e646c05487a87718bf6b5f.svg":{"logical_path":"flags/4x3/at.svg","mtime":"2020-02-08T21:52:35+01:00","size":243,"digest":"3d197de8f1f0096a2b0d440b6fc7d80821585a6637e646c05487a87718bf6b5f","integrity":"sha256-PRl96PHwCWorDUQLb8fYCCFYWmY35kbAVIeodxi/a18="},"flags/1x1/at-ec4db9aeac793827ac7c8e40c072a76f7675010058cc8c8dfd3a86bb5acfa6b8.svg":{"logical_path":"flags/1x1/at.svg","mtime":"2020-02-08T21:52:35+01:00","size":245,"digest":"ec4db9aeac793827ac7c8e40c072a76f7675010058cc8c8dfd3a86bb5acfa6b8","integrity":"sha256-7E25rqx5OCesfI5AwHKnb3Z1AQBYzIyN/TqGu1rPprg="},"flags/4x3/au-126fa2500a315287a5f847f4d958bb929f11da9b39f35912cc440c0fcffb8b12.svg":{"logical_path":"flags/4x3/au.svg","mtime":"2020-02-08T21:52:35+01:00","size":1335,"digest":"126fa2500a315287a5f847f4d958bb929f11da9b39f35912cc440c0fcffb8b12","integrity":"sha256-Em+iUAoxUoel+Ef02Vi7kp8R2ps581kSzEQMD8/7ixI="},"flags/1x1/au-bf990dcc957c9f74eb908e8ffa733f1731277bf6ec8b7301a6ea1ed92b59cc4b.svg":{"logical_path":"flags/1x1/au.svg","mtime":"2020-02-08T21:52:35+01:00","size":1320,"digest":"bf990dcc957c9f74eb908e8ffa733f1731277bf6ec8b7301a6ea1ed92b59cc4b","integrity":"sha256-v5kNzJV8n3TrkI6P+nM/FzEne/bsi3MBpuoe2StZzEs="},"flags/4x3/aw-4524643452423e95f3b0dbe6216b059a9e52126b34c73ae4b3c17b682f893aa6.svg":{"logical_path":"flags/4x3/aw.svg","mtime":"2020-02-08T21:52:35+01:00","size":9948,"digest":"4524643452423e95f3b0dbe6216b059a9e52126b34c73ae4b3c17b682f893aa6","integrity":"sha256-RSRkNFJCPpXzsNvmIWsFmp5SEms0xzrks8F7aC+JOqY="},"flags/1x1/aw-f7002bceef55486a442bf6bf433be0c60d0b15b2aa548b81c524c67ccf0565a8.svg":{"logical_path":"flags/1x1/aw.svg","mtime":"2020-02-08T21:52:35+01:00","size":12088,"digest":"f7002bceef55486a442bf6bf433be0c60d0b15b2aa548b81c524c67ccf0565a8","integrity":"sha256-9wArzu9VSGpEK/a/Qzvgxg0LFbKqVIuBxSTGfM8FZag="},"flags/4x3/ax-c297e0eb654ca62e58f5eb3abb70df9f245e4919490f29bd0f1d49c4fe052d90.svg":{"logical_path":"flags/4x3/ax.svg","mtime":"2020-02-08T21:52:35+01:00","size":556,"digest":"c297e0eb654ca62e58f5eb3abb70df9f245e4919490f29bd0f1d49c4fe052d90","integrity":"sha256-wpfg62VMpi5Y9es6u3DfnyReSRlJDym9Dx1JxP4FLZA="},"flags/1x1/ax-a1245689ecbf321c0a9e556bba17f3c9f2aeb8b1f63d14fcb591d76a87f12880.svg":{"logical_path":"flags/1x1/ax.svg","mtime":"2020-02-08T21:52:35+01:00","size":544,"digest":"a1245689ecbf321c0a9e556bba17f3c9f2aeb8b1f63d14fcb591d76a87f12880","integrity":"sha256-oSRWiey/MhwKnlVruhfzyfKuuLH2PRT8tZHXaofxKIA="},"flags/4x3/az-132e68d5e0386d3b9fa05b4288a0fd66f1414e2bc7af6b9d437b6935a7dfa00c.svg":{"logical_path":"flags/4x3/az.svg","mtime":"2020-02-08T21:52:35+01:00","size":515,"digest":"132e68d5e0386d3b9fa05b4288a0fd66f1414e2bc7af6b9d437b6935a7dfa00c","integrity":"sha256-Ey5o1eA4bTufoFtCiKD9ZvFBTivHr2udQ3tpNaffoAw="},"flags/1x1/az-3990c0526b933bd650285d821f2b93e432a73ba709869549b8ef75b051d3bd2d.svg":{"logical_path":"flags/1x1/az.svg","mtime":"2020-02-08T21:52:35+01:00","size":501,"digest":"3990c0526b933bd650285d821f2b93e432a73ba709869549b8ef75b051d3bd2d","integrity":"sha256-OZDAUmuTO9ZQKF2CHyuT5DKnO6cJhpVJuO91sFHTvS0="},"flags/4x3/ba-89dd0c1600d94741de7d667a487310193a0c48c4cf1a5159c3bf9dd37d65d2b5.svg":{"logical_path":"flags/4x3/ba.svg","mtime":"2020-02-08T21:52:35+01:00","size":1306,"digest":"89dd0c1600d94741de7d667a487310193a0c48c4cf1a5159c3bf9dd37d65d2b5","integrity":"sha256-id0MFgDZR0HefWZ6SHMQGToMSMTPGlFZw7+d031l0rU="},"flags/1x1/ba-2dbe90eb12b937f4a9ae8db95760930a3e318f4ce5829ac05e292ead698bae5a.svg":{"logical_path":"flags/1x1/ba.svg","mtime":"2020-02-08T21:52:35+01:00","size":1247,"digest":"2dbe90eb12b937f4a9ae8db95760930a3e318f4ce5829ac05e292ead698bae5a","integrity":"sha256-Lb6Q6xK5N/Spro25V2CTCj4xj0zlgprAXikurWmLrlo="},"flags/4x3/bb-16f8249ff958bfbc18fb1f23a5282000347bffdb5769ac620966185b1dcb57f6.svg":{"logical_path":"flags/4x3/bb.svg","mtime":"2020-02-08T21:52:35+01:00","size":613,"digest":"16f8249ff958bfbc18fb1f23a5282000347bffdb5769ac620966185b1dcb57f6","integrity":"sha256-Fvgkn/lYv7wY+x8jpSggADR7/9tXaaxiCWYYWx3LV/Y="},"flags/1x1/bb-fae92d8426196ae24ffa561aca72613fae651a5e9c0bcda63ecc877add05b060.svg":{"logical_path":"flags/1x1/bb.svg","mtime":"2020-02-08T21:52:35+01:00","size":616,"digest":"fae92d8426196ae24ffa561aca72613fae651a5e9c0bcda63ecc877add05b060","integrity":"sha256-+ukthCYZauJP+lYaynJhP65lGl6cC82mPsyHet0FsGA="},"flags/4x3/bd-8dac0547e73ee25a04148a3f0fd026a90e56c23b7e92921565d4263050ba77a6.svg":{"logical_path":"flags/4x3/bd.svg","mtime":"2020-02-08T21:52:35+01:00","size":193,"digest":"8dac0547e73ee25a04148a3f0fd026a90e56c23b7e92921565d4263050ba77a6","integrity":"sha256-jawFR+c+4loEFIo/D9AmqQ5Wwjt+kpIVZdQmMFC6d6Y="},"flags/1x1/bd-ecc3c3e87d4cc59c8350f2b4d7dca8f5cf46bdb26319db0ee80b744482af50c1.svg":{"logical_path":"flags/1x1/bd.svg","mtime":"2020-02-08T21:52:35+01:00","size":195,"digest":"ecc3c3e87d4cc59c8350f2b4d7dca8f5cf46bdb26319db0ee80b744482af50c1","integrity":"sha256-7MPD6H1MxZyDUPK019yo9c9GvbJjGdsO6At0RIKvUME="},"flags/4x3/be-a180ca68521188017bb5367f19e503d9599d6cbecd61bf054e59a57f58e648ae.svg":{"logical_path":"flags/4x3/be.svg","mtime":"2020-02-08T21:52:35+01:00","size":293,"digest":"a180ca68521188017bb5367f19e503d9599d6cbecd61bf054e59a57f58e648ae","integrity":"sha256-oYDKaFIRiAF7tTZ/GeUD2VmdbL7NYb8FTlmlf1jmSK4="},"flags/1x1/be-c8d4194137bd01955285b329dfdf996490d16c3116a92ce2f322e354b6d7494e.svg":{"logical_path":"flags/1x1/be.svg","mtime":"2020-02-08T21:52:35+01:00","size":293,"digest":"c8d4194137bd01955285b329dfdf996490d16c3116a92ce2f322e354b6d7494e","integrity":"sha256-yNQZQTe9AZVShbMp39+ZZJDRbDEWqSzi8yLjVLbXSU4="},"flags/4x3/bf-6b214936ef89f19133d4a84e99cdf0cfdb99d6409f2f373f6d18694423013313.svg":{"logical_path":"flags/4x3/bf.svg","mtime":"2020-02-08T21:52:35+01:00","size":360,"digest":"6b214936ef89f19133d4a84e99cdf0cfdb99d6409f2f373f6d18694423013313","integrity":"sha256-ayFJNu+J8ZEz1KhOmc3wz9uZ1kCfLzc/bRhpRCMBMxM="},"flags/1x1/bf-04c7d61aa314adab5a41bd79d77aa780c10136bb6b8f4c62423e61e23e3851ee.svg":{"logical_path":"flags/1x1/bf.svg","mtime":"2020-02-08T21:52:35+01:00","size":386,"digest":"04c7d61aa314adab5a41bd79d77aa780c10136bb6b8f4c62423e61e23e3851ee","integrity":"sha256-BMfWGqMUrataQb1513qngMEBNrtrj0xiQj5h4j44Ue4="},"flags/4x3/bg-dd3985ba746942b0e65bc52a280cc4d28fb24fd2c7d9e22ac9afd2d75ee7bfc4.svg":{"logical_path":"flags/4x3/bg.svg","mtime":"2020-02-08T21:52:35+01:00","size":289,"digest":"dd3985ba746942b0e65bc52a280cc4d28fb24fd2c7d9e22ac9afd2d75ee7bfc4","integrity":"sha256-3TmFunRpQrDmW8UqKAzE0o+yT9LH2eIqya/S117nv8Q="},"flags/1x1/bg-f59294a736d5bdc0f102b58d70dbe45d02bd92df822820bf95336840f75a0746.svg":{"logical_path":"flags/1x1/bg.svg","mtime":"2020-02-08T21:52:35+01:00","size":297,"digest":"f59294a736d5bdc0f102b58d70dbe45d02bd92df822820bf95336840f75a0746","integrity":"sha256-9ZKUpzbVvcDxArWNcNvkXQK9kt+CKCC/lTNoQPdaB0Y="},"flags/4x3/bh-7c82c4a6ba963172c6c1b4423f39a0ebe9c999449cc7dd87018917943db4735c.svg":{"logical_path":"flags/4x3/bh.svg","mtime":"2020-02-08T21:52:35+01:00","size":546,"digest":"7c82c4a6ba963172c6c1b4423f39a0ebe9c999449cc7dd87018917943db4735c","integrity":"sha256-fILEprqWMXLGwbRCPzmg6+nJmUScx92HAYkXlD20c1w="},"flags/1x1/bh-6893aac3e55c6480e9dac0c023ec2179f6c12a0da82a0bc2717134384c097e88.svg":{"logical_path":"flags/1x1/bh.svg","mtime":"2020-02-08T21:52:35+01:00","size":572,"digest":"6893aac3e55c6480e9dac0c023ec2179f6c12a0da82a0bc2717134384c097e88","integrity":"sha256-aJOqw+VcZIDp2sDAI+whefbBKg2oKgvCcXE0OEwJfog="},"flags/4x3/bi-4fcd0116f7f93c0564c6955806f3c3563d0ea7334ae406f29a897255845c923c.svg":{"logical_path":"flags/4x3/bi.svg","mtime":"2020-02-08T21:52:35+01:00","size":1074,"digest":"4fcd0116f7f93c0564c6955806f3c3563d0ea7334ae406f29a897255845c923c","integrity":"sha256-T80BFvf5PAVkxpVYBvPDVj0OpzNK5AbymolyVYRckjw="},"flags/1x1/bi-91c34eb431b26be67852782a0b93e1d7d577a925454d6c8cea00a0d872d2de8a.svg":{"logical_path":"flags/1x1/bi.svg","mtime":"2020-02-08T21:52:35+01:00","size":1048,"digest":"91c34eb431b26be67852782a0b93e1d7d577a925454d6c8cea00a0d872d2de8a","integrity":"sha256-kcNOtDGya+Z4UngqC5Ph19V3qSVFTWyM6gCg2HLS3oo="},"flags/4x3/bj-63bddb4268f5f8c2ed867041bcf058fb18fcd9d1e0799e01286fca2d5e961c7f.svg":{"logical_path":"flags/4x3/bj.svg","mtime":"2020-02-08T21:52:35+01:00","size":499,"digest":"63bddb4268f5f8c2ed867041bcf058fb18fcd9d1e0799e01286fca2d5e961c7f","integrity":"sha256-Y73bQmj1+MLthnBBvPBY+xj82dHgeZ4BKG/KLV6WHH8="},"flags/1x1/bj-e2606c5a8498c474a6b6708626b88108fcb73840344766566dc56f804279cdfc.svg":{"logical_path":"flags/1x1/bj.svg","mtime":"2020-02-08T21:52:35+01:00","size":502,"digest":"e2606c5a8498c474a6b6708626b88108fcb73840344766566dc56f804279cdfc","integrity":"sha256-4mBsWoSYxHSmtnCGJriBCPy3OEA0R2ZWbcVvgEJ5zfw="},"flags/4x3/bl-824a7265f48789d5e1ad5c5b0042a13a7d2d4357210e5bd8124fca19931e8c74.svg":{"logical_path":"flags/4x3/bl.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"824a7265f48789d5e1ad5c5b0042a13a7d2d4357210e5bd8124fca19931e8c74","integrity":"sha256-gkpyZfSHidXhrVxbAEKhOn0tQ1chDlvYEk/KGZMejHQ="},"flags/1x1/bl-ba6a7881b0ca72ac57aee4d823ae611ab4ad24a938ee9e01a7a4d5ae04cfccf6.svg":{"logical_path":"flags/1x1/bl.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"ba6a7881b0ca72ac57aee4d823ae611ab4ad24a938ee9e01a7a4d5ae04cfccf6","integrity":"sha256-ump4gbDKcqxXruTYI65hGrStJKk47p4Bp6TVrgTPzPY="},"flags/4x3/bm-2e2f09e5a4edf4b18afff581656f50b0b4c37783db29591ff00ca768f7f755bc.svg":{"logical_path":"flags/4x3/bm.svg","mtime":"2020-02-08T21:52:35+01:00","size":22650,"digest":"2e2f09e5a4edf4b18afff581656f50b0b4c37783db29591ff00ca768f7f755bc","integrity":"sha256-Li8J5aTt9LGK//WBZW9QsLTDd4PbKVkf8AynaPf3Vbw="},"flags/1x1/bm-f553f953f8784ea4d67a5197f5d808a67747eb8a1cb56990d6838e690090d2d6.svg":{"logical_path":"flags/1x1/bm.svg","mtime":"2020-02-08T21:52:35+01:00","size":22337,"digest":"f553f953f8784ea4d67a5197f5d808a67747eb8a1cb56990d6838e690090d2d6","integrity":"sha256-9VP5U/h4TqTWelGX9dgIpndH64octWmQ1oOOaQCQ0tY="},"flags/4x3/bn-bcf9967c12eb6397346cb5b960ae92efa41f314f780d09a3d7c81f5dacac4180.svg":{"logical_path":"flags/4x3/bn.svg","mtime":"2020-02-08T21:52:35+01:00","size":14387,"digest":"bcf9967c12eb6397346cb5b960ae92efa41f314f780d09a3d7c81f5dacac4180","integrity":"sha256-vPmWfBLrY5c0bLW5YK6S76QfMU94DQmj18gfXaysQYA="},"flags/1x1/bn-1d1aad3fe9fd33ce922eba33c9ae6047a5646349239c20d1bc7307ec6d19a043.svg":{"logical_path":"flags/1x1/bn.svg","mtime":"2020-02-08T21:52:35+01:00","size":14521,"digest":"1d1aad3fe9fd33ce922eba33c9ae6047a5646349239c20d1bc7307ec6d19a043","integrity":"sha256-HRqtP+n9M86SLrozya5gR6VkY0kjnCDRvHMH7G0ZoEM="},"flags/4x3/bo-fa423f2bb4ab6e8e9dd399ad73781ea8d9cbafd30f1b7ee0bcecfb9e7b75581e.svg":{"logical_path":"flags/4x3/bo.svg","mtime":"2020-02-08T21:52:35+01:00","size":118272,"digest":"fa423f2bb4ab6e8e9dd399ad73781ea8d9cbafd30f1b7ee0bcecfb9e7b75581e","integrity":"sha256-+kI/K7Srbo6d05mtc3geqNnLr9MPG37gvOz7nnt1WB4="},"flags/1x1/bo-f5faa29e40191e0c76070ac1a1d2a1f2b18e9cd358b8a77cefaed8efc49a265e.svg":{"logical_path":"flags/1x1/bo.svg","mtime":"2020-02-08T21:52:35+01:00","size":119850,"digest":"f5faa29e40191e0c76070ac1a1d2a1f2b18e9cd358b8a77cefaed8efc49a265e","integrity":"sha256-9fqinkAZHgx2BwrBodKh8rGOnNNYuKd8767Y78SaJl4="},"flags/4x3/bq-493c92ab19204c3ad319e6caba021df050132b99bd57a8f9b74131b78229c29e.svg":{"logical_path":"flags/4x3/bq.svg","mtime":"2020-02-08T21:52:35+01:00","size":227,"digest":"493c92ab19204c3ad319e6caba021df050132b99bd57a8f9b74131b78229c29e","integrity":"sha256-STySqxkgTDrTGebKugId8FATK5m9V6j5t0Ext4Ipwp4="},"flags/1x1/bq-6e30bbeabc2aa097f657a411984b3c23278a8fcce2fc016b1cd6d2262f672d33.svg":{"logical_path":"flags/1x1/bq.svg","mtime":"2020-02-08T21:52:35+01:00","size":231,"digest":"6e30bbeabc2aa097f657a411984b3c23278a8fcce2fc016b1cd6d2262f672d33","integrity":"sha256-bjC76rwqoJf2V6QRmEs8IyeKj8zi/AFrHNbSJi9nLTM="},"flags/4x3/br-cf3ba80ec2c9fd4d3c845c3a3c43a2b9d81cf90707a2918789e8b1f596833e01.svg":{"logical_path":"flags/4x3/br.svg","mtime":"2020-02-08T21:52:35+01:00","size":8244,"digest":"cf3ba80ec2c9fd4d3c845c3a3c43a2b9d81cf90707a2918789e8b1f596833e01","integrity":"sha256-zzuoDsLJ/U08hFw6PEOiudgc+QcHopGHieix9ZaDPgE="},"flags/1x1/br-7bf4e4b31650ac25f0bc6c86eb87491a7e5a8eac13acccfcbde44346c88728f6.svg":{"logical_path":"flags/1x1/br.svg","mtime":"2020-02-08T21:52:35+01:00","size":7852,"digest":"7bf4e4b31650ac25f0bc6c86eb87491a7e5a8eac13acccfcbde44346c88728f6","integrity":"sha256-e/TksxZQrCXwvGyG64dJGn5ajqwTrMz8veRDRsiHKPY="},"flags/4x3/bs-69f60b5fea96b67dd939e597099994921bb3dc3bcf31b8dee7cc45be2885c836.svg":{"logical_path":"flags/4x3/bs.svg","mtime":"2020-02-08T21:52:35+01:00","size":549,"digest":"69f60b5fea96b67dd939e597099994921bb3dc3bcf31b8dee7cc45be2885c836","integrity":"sha256-afYLX+qWtn3ZOeWXCZmUkhuz3DvPMbje58xFviiFyDY="},"flags/1x1/bs-f5d6acf7ef7a240dc09ac88710fd77fd3494501104392db74d5c540d482f2262.svg":{"logical_path":"flags/1x1/bs.svg","mtime":"2020-02-08T21:52:35+01:00","size":571,"digest":"f5d6acf7ef7a240dc09ac88710fd77fd3494501104392db74d5c540d482f2262","integrity":"sha256-9das9+96JA3AmsiHEP13/TSUUBEEOS23TVxUDUgvImI="},"flags/4x3/bt-6c20b0c00e12d5898be0239a0c66ce775debd0bd536de56a271859a0285a039e.svg":{"logical_path":"flags/4x3/bt.svg","mtime":"2020-02-08T21:52:35+01:00","size":25345,"digest":"6c20b0c00e12d5898be0239a0c66ce775debd0bd536de56a271859a0285a039e","integrity":"sha256-bCCwwA4S1YmL4COaDGbOd13r0L1TbeVqJxhZoChaA54="},"flags/1x1/bt-58de3ca9438811ef1920e2f84c4ba4ce32d01069f4d197ab5d577de6acbe0c85.svg":{"logical_path":"flags/1x1/bt.svg","mtime":"2020-02-08T21:52:35+01:00","size":25172,"digest":"58de3ca9438811ef1920e2f84c4ba4ce32d01069f4d197ab5d577de6acbe0c85","integrity":"sha256-WN48qUOIEe8ZIOL4TEukzjLQEGn00ZerXVd95qy+DIU="},"flags/4x3/bv-ff173190fc339b3cb8b6e8235bc5e373853d7127fd94cbc32ac737e839aeb586.svg":{"logical_path":"flags/4x3/bv.svg","mtime":"2020-02-08T21:52:35+01:00","size":582,"digest":"ff173190fc339b3cb8b6e8235bc5e373853d7127fd94cbc32ac737e839aeb586","integrity":"sha256-/xcxkPwzmzy4tugjW8Xjc4U9cSf9lMvDKsc36DmutYY="},"flags/1x1/bv-59616ff1a722959064c83927ca2e49c1fce42a9b18e91b9ecbb74f62527aff43.svg":{"logical_path":"flags/1x1/bv.svg","mtime":"2020-02-08T21:52:35+01:00","size":585,"digest":"59616ff1a722959064c83927ca2e49c1fce42a9b18e91b9ecbb74f62527aff43","integrity":"sha256-WWFv8acilZBkyDknyi5JwfzkKpsY6Ruey7dPYlJ6/0M="},"flags/4x3/bw-4bb1d3131b88c65b5decc67f7b44903e931bca2fcac841942591c599f0cbb850.svg":{"logical_path":"flags/4x3/bw.svg","mtime":"2020-02-08T21:52:35+01:00","size":255,"digest":"4bb1d3131b88c65b5decc67f7b44903e931bca2fcac841942591c599f0cbb850","integrity":"sha256-S7HTExuIxltd7MZ/e0SQPpMbyi/KyEGUJZHFmfDLuFA="},"flags/1x1/bw-e08f50c0836ca5858aed7b0526aed6fb630da8dc6b6b96bd9a476af599dc89d6.svg":{"logical_path":"flags/1x1/bw.svg","mtime":"2020-02-08T21:52:35+01:00","size":257,"digest":"e08f50c0836ca5858aed7b0526aed6fb630da8dc6b6b96bd9a476af599dc89d6","integrity":"sha256-4I9QwINspYWK7XsFJq7W+2MNqNxra5a9mkdq9ZncidY="},"flags/4x3/by-324ac96bfbe075781c664be3b9e2ac6b4d2a46dd2b418ca0920284f64394c7d4.svg":{"logical_path":"flags/4x3/by.svg","mtime":"2020-02-08T21:52:35+01:00","size":5998,"digest":"324ac96bfbe075781c664be3b9e2ac6b4d2a46dd2b418ca0920284f64394c7d4","integrity":"sha256-MkrJa/vgdXgcZkvjueKsa00qRt0rQYygkgKE9kOUx9Q="},"flags/1x1/by-37b80e8bf7e51fef99a8307d6dffb04ee164790ceeafef606d516ca333e9488a.svg":{"logical_path":"flags/1x1/by.svg","mtime":"2020-02-08T21:52:35+01:00","size":6105,"digest":"37b80e8bf7e51fef99a8307d6dffb04ee164790ceeafef606d516ca333e9488a","integrity":"sha256-N7gOi/flH++ZqDB9bf+wTuFkeQzur+9gbVFsozPpSIo="},"flags/4x3/bz-156fdc45f8c15c9520a1ea9fc0f395f294f02077408ea1938c222a37cfbb7f1d.svg":{"logical_path":"flags/4x3/bz.svg","mtime":"2020-02-08T21:52:35+01:00","size":46916,"digest":"156fdc45f8c15c9520a1ea9fc0f395f294f02077408ea1938c222a37cfbb7f1d","integrity":"sha256-FW/cRfjBXJUgoeqfwPOV8pTwIHdAjqGTjCIqN8+7fx0="},"flags/1x1/bz-24577d4e7b29b33ab3b1d37914c8479889baa7e8c8399c6d1c99faed31ab053a.svg":{"logical_path":"flags/1x1/bz.svg","mtime":"2020-02-08T21:52:35+01:00","size":47160,"digest":"24577d4e7b29b33ab3b1d37914c8479889baa7e8c8399c6d1c99faed31ab053a","integrity":"sha256-JFd9TnspszqzsdN5FMhHmIm6p+jIOZxtHJn67TGrBTo="},"flags/4x3/ca-0d57cab46d5dbb0012a5e4ae0a9efee3baee90d5d157950a6c5d67edf2daa58f.svg":{"logical_path":"flags/4x3/ca.svg","mtime":"2020-02-08T21:52:35+01:00","size":731,"digest":"0d57cab46d5dbb0012a5e4ae0a9efee3baee90d5d157950a6c5d67edf2daa58f","integrity":"sha256-DVfKtG1duwASpeSuCp7+47rukNXRV5UKbF1n7fLapY8="},"flags/1x1/ca-192a6fb0544e5a6f33a32149d62f1e7ac0a1d61c5c5afa57f3a42346ca8e8c90.svg":{"logical_path":"flags/1x1/ca.svg","mtime":"2020-02-08T21:52:35+01:00","size":712,"digest":"192a6fb0544e5a6f33a32149d62f1e7ac0a1d61c5c5afa57f3a42346ca8e8c90","integrity":"sha256-GSpvsFROWm8zoyFJ1i8eesCh1hxcWvpX86QjRsqOjJA="},"flags/4x3/cc-a35f2a9e10a28d6918ced65e0623b03bb2fbf1f20670b581bc0a409d33b4e843.svg":{"logical_path":"flags/4x3/cc.svg","mtime":"2020-02-08T21:52:35+01:00","size":3144,"digest":"a35f2a9e10a28d6918ced65e0623b03bb2fbf1f20670b581bc0a409d33b4e843","integrity":"sha256-o18qnhCijWkYztZeBiOwO7L78fIGcLWBvApAnTO06EM="},"flags/1x1/cc-d2025eefc9d30f724f3fcd95c0fd9f7938930ecb01af7e0cd6ee6553d7358eb6.svg":{"logical_path":"flags/1x1/cc.svg","mtime":"2020-02-08T21:52:35+01:00","size":3092,"digest":"d2025eefc9d30f724f3fcd95c0fd9f7938930ecb01af7e0cd6ee6553d7358eb6","integrity":"sha256-0gJe78nTD3JPP82VwP2feTiTDssBr34M1u5lU9c1jrY="},"flags/4x3/cd-5d2127c991b30522ae0a29d05facbc88728c050d7e333a60d614af1545459c5c.svg":{"logical_path":"flags/4x3/cd.svg","mtime":"2020-02-08T21:52:35+01:00","size":352,"digest":"5d2127c991b30522ae0a29d05facbc88728c050d7e333a60d614af1545459c5c","integrity":"sha256-XSEnyZGzBSKuCinQX6y8iHKMBQ1+Mzpg1hSvFUVFnFw="},"flags/1x1/cd-59dacf424d1c8c779db66c5b7f2a93a3c8f14976c2975ccfb07639676a1602e3.svg":{"logical_path":"flags/1x1/cd.svg","mtime":"2020-02-08T21:52:35+01:00","size":510,"digest":"59dacf424d1c8c779db66c5b7f2a93a3c8f14976c2975ccfb07639676a1602e3","integrity":"sha256-WdrPQk0cjHedtmxbfyqTo8jxSXbCl1zPsHY5Z2oWAuM="},"flags/4x3/cf-ac0aaffba354d848eba2501a402ee81dc96a56ad0acd3741ec9905e76c372e1e.svg":{"logical_path":"flags/4x3/cf.svg","mtime":"2020-02-08T21:52:35+01:00","size":689,"digest":"ac0aaffba354d848eba2501a402ee81dc96a56ad0acd3741ec9905e76c372e1e","integrity":"sha256-rAqv+6NU2EjrolAaQC7oHclqVq0KzTdB7JkF52w3Lh4="},"flags/1x1/cf-e637674faf7edcdad37182192d038448c157421ab0c69377d9b8e56ab2c0249d.svg":{"logical_path":"flags/1x1/cf.svg","mtime":"2020-02-08T21:52:35+01:00","size":635,"digest":"e637674faf7edcdad37182192d038448c157421ab0c69377d9b8e56ab2c0249d","integrity":"sha256-5jdnT69+3NrTcYIZLQOESMFXQhqwxpN32bjlarLAJJ0="},"flags/4x3/cg-3729f717c83c9df7d0543a1a5d4a506efe184bdfeb39f9260b4b63edf19d2538.svg":{"logical_path":"flags/4x3/cg.svg","mtime":"2020-02-08T21:52:35+01:00","size":484,"digest":"3729f717c83c9df7d0543a1a5d4a506efe184bdfeb39f9260b4b63edf19d2538","integrity":"sha256-Nyn3F8g8nffQVDoaXUpQbv4YS9/rOfkmC0tj7fGdJTg="},"flags/1x1/cg-8353ff1f251714b1b8905eec1722378426719955d0637d206d35d1dcfa68ddcf.svg":{"logical_path":"flags/1x1/cg.svg","mtime":"2020-02-08T21:52:35+01:00","size":472,"digest":"8353ff1f251714b1b8905eec1722378426719955d0637d206d35d1dcfa68ddcf","integrity":"sha256-g1P/HyUXFLG4kF7sFyI3hCZxmVXQY30gbTXR3Ppo3c8="},"flags/4x3/ch-6739edee6d1ef72c4ed97cfe723d3bb7f17e4df5390f3a4ae234f1ffdeece0cf.svg":{"logical_path":"flags/4x3/ch.svg","mtime":"2020-02-08T21:52:35+01:00","size":300,"digest":"6739edee6d1ef72c4ed97cfe723d3bb7f17e4df5390f3a4ae234f1ffdeece0cf","integrity":"sha256-Zznt7m0e9yxO2Xz+cj07t/F+TfU5DzpK4jTx/97s4M8="},"flags/1x1/ch-7c3dec465228981c57a90a3a7b3a6c42dd3e699230663e770b55008ce6d14208.svg":{"logical_path":"flags/1x1/ch.svg","mtime":"2020-02-08T21:52:35+01:00","size":298,"digest":"7c3dec465228981c57a90a3a7b3a6c42dd3e699230663e770b55008ce6d14208","integrity":"sha256-fD3sRlIomBxXqQo6ezpsQt0+aZIwZj53C1UAjObRQgg="},"flags/4x3/ci-3e076d13c9524149508c442f8f727424660124e3591280d8ae9bddf9d8272a1e.svg":{"logical_path":"flags/4x3/ci.svg","mtime":"2020-02-08T21:52:35+01:00","size":283,"digest":"3e076d13c9524149508c442f8f727424660124e3591280d8ae9bddf9d8272a1e","integrity":"sha256-PgdtE8lSQUlQjEQvj3J0JGYBJONZEoDYrpvd+dgnKh4="},"flags/1x1/ci-691a0a8577b7d555fc90dc7170adc9ec7571191cb3507c46c0e8516fd1778a91.svg":{"logical_path":"flags/1x1/ci.svg","mtime":"2020-02-08T21:52:35+01:00","size":286,"digest":"691a0a8577b7d555fc90dc7170adc9ec7571191cb3507c46c0e8516fd1778a91","integrity":"sha256-aRoKhXe31VX8kNxxcK3J7HVxGRyzUHxGwOhRb9F3ipE="},"flags/4x3/ck-9cff098e505afde9bf5166cb7b0c409178575633b913ce08c1c700d08c477db6.svg":{"logical_path":"flags/4x3/ck.svg","mtime":"2020-02-08T21:52:35+01:00","size":1887,"digest":"9cff098e505afde9bf5166cb7b0c409178575633b913ce08c1c700d08c477db6","integrity":"sha256-nP8JjlBa/em/UWbLewxAkXhXVjO5E84IwccA0IxHfbY="},"flags/1x1/ck-9c8dffa3bd5953d8a121780831f25b58738e67f3be71961894c56dfd25848c88.svg":{"logical_path":"flags/1x1/ck.svg","mtime":"2020-02-08T21:52:35+01:00","size":1846,"digest":"9c8dffa3bd5953d8a121780831f25b58738e67f3be71961894c56dfd25848c88","integrity":"sha256-nI3/o71ZU9ihIXgIMfJbWHOOZ/O+cZYYlMVt/SWEjIg="},"flags/4x3/cl-a4c57ec2bb9adcb67e1850256e5165227b764187d6941a38d95d0def5144699b.svg":{"logical_path":"flags/4x3/cl.svg","mtime":"2020-02-08T21:52:35+01:00","size":560,"digest":"a4c57ec2bb9adcb67e1850256e5165227b764187d6941a38d95d0def5144699b","integrity":"sha256-pMV+wrua3LZ+GFAlblFlInt2QYfWlBo42V0N71FEaZs="},"flags/1x1/cl-5a3e95cf63358e3911c97404818c2cddfd46414d8445e47d6976ee166c48926c.svg":{"logical_path":"flags/1x1/cl.svg","mtime":"2020-02-08T21:52:35+01:00","size":577,"digest":"5a3e95cf63358e3911c97404818c2cddfd46414d8445e47d6976ee166c48926c","integrity":"sha256-Wj6Vz2M1jjkRyXQEgYws3f1GQU2EReR9aXbuFmxIkmw="},"flags/4x3/cm-5dce9f36d92a61bdc0c482141bdb4f55bfcec0a2ecc745db643a7953e2e5a722.svg":{"logical_path":"flags/4x3/cm.svg","mtime":"2020-02-08T21:52:35+01:00","size":827,"digest":"5dce9f36d92a61bdc0c482141bdb4f55bfcec0a2ecc745db643a7953e2e5a722","integrity":"sha256-Xc6fNtkqYb3AxIIUG9tPVb/OwKLsx0XbZDp5U+LlpyI="},"flags/1x1/cm-d8d21f54c44df5df9edef227691384a4ad37c15ff57c8aa0dead684d19eac8cd.svg":{"logical_path":"flags/1x1/cm.svg","mtime":"2020-02-08T21:52:35+01:00","size":827,"digest":"d8d21f54c44df5df9edef227691384a4ad37c15ff57c8aa0dead684d19eac8cd","integrity":"sha256-2NIfVMRN9d+e3vInaROEpK03wV/1fIqg3q1oTRnqyM0="},"flags/4x3/cn-48ce1c2837bb806a6aaf8b7a9878b6d040c0d069a0ffca9a8a49e7a31aa30e7f.svg":{"logical_path":"flags/4x3/cn.svg","mtime":"2020-02-08T21:52:35+01:00","size":804,"digest":"48ce1c2837bb806a6aaf8b7a9878b6d040c0d069a0ffca9a8a49e7a31aa30e7f","integrity":"sha256-SM4cKDe7gGpqr4t6mHi20EDA0Gmg/8qaiknnoxqjDn8="},"flags/1x1/cn-e6be64c6c4a976e64d39bfe8a6ae4a5b1d38a6aa1b138ddcacf34a942dff50bc.svg":{"logical_path":"flags/1x1/cn.svg","mtime":"2020-02-08T21:52:35+01:00","size":746,"digest":"e6be64c6c4a976e64d39bfe8a6ae4a5b1d38a6aa1b138ddcacf34a942dff50bc","integrity":"sha256-5r5kxsSpduZNOb/opq5KWx04pqobE43crPNKlC3/ULw="},"flags/4x3/co-648d3ff596a0ecf3e85ac17c53abe1d7ca4759688e10a7a3a8b56f096ba6b6f7.svg":{"logical_path":"flags/4x3/co.svg","mtime":"2020-02-08T21:52:35+01:00","size":292,"digest":"648d3ff596a0ecf3e85ac17c53abe1d7ca4759688e10a7a3a8b56f096ba6b6f7","integrity":"sha256-ZI0/9Zag7PPoWsF8U6vh18pHWWiOEKejqLVvCWumtvc="},"flags/1x1/co-d3c16180c6bce630f762aff789104d10e9dbc949e740535a61396cd0ec34c1a1.svg":{"logical_path":"flags/1x1/co.svg","mtime":"2020-02-08T21:52:35+01:00","size":292,"digest":"d3c16180c6bce630f762aff789104d10e9dbc949e740535a61396cd0ec34c1a1","integrity":"sha256-08FhgMa85jD3Yq/3iRBNEOnbyUnnQFNaYTls0Ow0waE="},"flags/4x3/cr-84aec60f19bd33e1ac1a209155fec8d372e17cb59dc1346bb9124e5cc867375d.svg":{"logical_path":"flags/4x3/cr.svg","mtime":"2020-02-08T21:52:35+01:00","size":296,"digest":"84aec60f19bd33e1ac1a209155fec8d372e17cb59dc1346bb9124e5cc867375d","integrity":"sha256-hK7GDxm9M+GsGiCRVf7I03LhfLWdwTRruRJOXMhnN10="},"flags/1x1/cr-5371cf8bc5ad1a805155c1b3065e420a0a418c8d63b472bc545890289a365b35.svg":{"logical_path":"flags/1x1/cr.svg","mtime":"2020-02-08T21:52:35+01:00","size":296,"digest":"5371cf8bc5ad1a805155c1b3065e420a0a418c8d63b472bc545890289a365b35","integrity":"sha256-U3HPi8WtGoBRVcGzBl5CCgpBjI1jtHK8VFiQKJo2WzU="},"flags/4x3/cu-bb3f857e02aeab606120d9f164283f07a44b227f12aad7d6d344c7579f7b3ff0.svg":{"logical_path":"flags/4x3/cu.svg","mtime":"2020-02-08T21:52:35+01:00","size":619,"digest":"bb3f857e02aeab606120d9f164283f07a44b227f12aad7d6d344c7579f7b3ff0","integrity":"sha256-uz+FfgKuq2BhINnxZCg/B6RLIn8SqtfW00THV597P/A="},"flags/1x1/cu-02c0054169b874a8d231de1f45b2d0884de48848157734e0ddcd0f684c05c18d.svg":{"logical_path":"flags/1x1/cu.svg","mtime":"2020-02-08T21:52:35+01:00","size":576,"digest":"02c0054169b874a8d231de1f45b2d0884de48848157734e0ddcd0f684c05c18d","integrity":"sha256-AsAFQWm4dKjSMd4fRbLQiE3kiEgVdzTg3c0PaEwFwY0="},"flags/4x3/cv-90ee90ab59713454a218d8c300c71139e62655de80bfbea81df93142a529b81f.svg":{"logical_path":"flags/4x3/cv.svg","mtime":"2020-02-08T21:52:35+01:00","size":1414,"digest":"90ee90ab59713454a218d8c300c71139e62655de80bfbea81df93142a529b81f","integrity":"sha256-kO6Qq1lxNFSiGNjDAMcROeYmVd6Av76oHfkxQqUpuB8="},"flags/1x1/cv-2cf3eede97a468d28459ccc2271c28bb5b6029af2388b0301f6203be55e49308.svg":{"logical_path":"flags/1x1/cv.svg","mtime":"2020-02-08T21:52:35+01:00","size":1362,"digest":"2cf3eede97a468d28459ccc2271c28bb5b6029af2388b0301f6203be55e49308","integrity":"sha256-LPPu3pekaNKEWczCJxwou1tgKa8jiLAwH2IDvlXkkwg="},"flags/4x3/cw-d46beb7b10b40fa82cfd40eb86a3b3879f59f5da2a2f5ef91d121ab9b16c0aad.svg":{"logical_path":"flags/4x3/cw.svg","mtime":"2020-02-08T21:52:35+01:00","size":678,"digest":"d46beb7b10b40fa82cfd40eb86a3b3879f59f5da2a2f5ef91d121ab9b16c0aad","integrity":"sha256-1GvrexC0D6gs/UDrhqOzh59Z9doqL175HRIaubFsCq0="},"flags/1x1/cw-ba78c834e61b24a8a2b6bc7c80ab9f14e42c3c69415941ddb7c8c1f652ccd8b5.svg":{"logical_path":"flags/1x1/cw.svg","mtime":"2020-02-08T21:52:35+01:00","size":685,"digest":"ba78c834e61b24a8a2b6bc7c80ab9f14e42c3c69415941ddb7c8c1f652ccd8b5","integrity":"sha256-unjINOYbJKiitrx8gKufFOQsPGlBWUHdt8jB9lLM2LU="},"flags/4x3/cx-28187fb9d91bedc6f239b107d26eb6ec1cc2a0c7730810306c5a6b313c14f2b2.svg":{"logical_path":"flags/4x3/cx.svg","mtime":"2020-02-08T21:52:35+01:00","size":2469,"digest":"28187fb9d91bedc6f239b107d26eb6ec1cc2a0c7730810306c5a6b313c14f2b2","integrity":"sha256-KBh/udkb7cbyObEH0m627BzCoMdzCBAwbFprMTwU8rI="},"flags/1x1/cx-8ebe073d997f93d092a493300ea1d234c91aef80c6e8f431e88aa7f8e724f9a6.svg":{"logical_path":"flags/1x1/cx.svg","mtime":"2020-02-08T21:52:35+01:00","size":2508,"digest":"8ebe073d997f93d092a493300ea1d234c91aef80c6e8f431e88aa7f8e724f9a6","integrity":"sha256-jr4HPZl/k9CSpJMwDqHSNMka74DG6PQx6Iqn+Ock+aY="},"flags/4x3/cy-8d633ecabc7968bb8a869c62545f122aacbbc3e108c25ceb421bb8bc8734b9be.svg":{"logical_path":"flags/4x3/cy.svg","mtime":"2020-02-08T21:52:35+01:00","size":5949,"digest":"8d633ecabc7968bb8a869c62545f122aacbbc3e108c25ceb421bb8bc8734b9be","integrity":"sha256-jWM+yrx5aLuKhpxiVF8SKqy7w+EIwlzrQhu4vIc0ub4="},"flags/1x1/cy-6ef37fdd7518f18727bec1ed9741bb4d1f854dde7ef1a7e9fd2f4ba6291a7790.svg":{"logical_path":"flags/1x1/cy.svg","mtime":"2020-02-08T21:52:35+01:00","size":6053,"digest":"6ef37fdd7518f18727bec1ed9741bb4d1f854dde7ef1a7e9fd2f4ba6291a7790","integrity":"sha256-bvN/3XUY8YcnvsHtl0G7TR+FTd5+8afp/S9Lpikad5A="},"flags/4x3/cz-6c94e3d53fc1ae5982d8eb058b76d86f07d3fb4cd325698fea3291fa35504c56.svg":{"logical_path":"flags/4x3/cz.svg","mtime":"2020-02-08T21:52:35+01:00","size":481,"digest":"6c94e3d53fc1ae5982d8eb058b76d86f07d3fb4cd325698fea3291fa35504c56","integrity":"sha256-bJTj1T/BrlmC2OsFi3bYbwfT+0zTJWmP6jKR+jVQTFY="},"flags/1x1/cz-af9898ebd32559cdbea2fd17b351e5eedafccada6fbc6a2b7952cad78369817e.svg":{"logical_path":"flags/1x1/cz.svg","mtime":"2020-02-08T21:52:35+01:00","size":483,"digest":"af9898ebd32559cdbea2fd17b351e5eedafccada6fbc6a2b7952cad78369817e","integrity":"sha256-r5iY69MlWc2+ov0Xs1Hl7tr8ytpvvGoreVLK14NpgX4="},"flags/4x3/de-e7323083675d25107c85f0cea6534bd21d21e77e6d524d92e1b2d0a4e21117a1.svg":{"logical_path":"flags/4x3/de.svg","mtime":"2020-02-08T21:52:35+01:00","size":216,"digest":"e7323083675d25107c85f0cea6534bd21d21e77e6d524d92e1b2d0a4e21117a1","integrity":"sha256-5zIwg2ddJRB8hfDOplNL0h0h535tUk2S4bLQpOIRF6E="},"flags/1x1/de-fdb60146952d3b2d104310b28882a0ecde44d808240c3bab2cd6c302a538b266.svg":{"logical_path":"flags/1x1/de.svg","mtime":"2020-02-08T21:52:35+01:00","size":224,"digest":"fdb60146952d3b2d104310b28882a0ecde44d808240c3bab2cd6c302a538b266","integrity":"sha256-/bYBRpUtOy0QQxCyiIKg7N5E2AgkDDurLNbDAqU4smY="},"flags/4x3/dj-546da4a0dae9b1ab74dc6ac6076d0c706f37ef2a0d799342dd0345e11f770f03.svg":{"logical_path":"flags/4x3/dj.svg","mtime":"2020-02-08T21:52:35+01:00","size":588,"digest":"546da4a0dae9b1ab74dc6ac6076d0c706f37ef2a0d799342dd0345e11f770f03","integrity":"sha256-VG2koNrpsat03GrGB20McG837yoNeZNC3QNF4R93DwM="},"flags/1x1/dj-c0481b667f003d9d5a3c93861023a97a98224227ac19aa7e07b5b6edd35fe900.svg":{"logical_path":"flags/1x1/dj.svg","mtime":"2020-02-08T21:52:35+01:00","size":588,"digest":"c0481b667f003d9d5a3c93861023a97a98224227ac19aa7e07b5b6edd35fe900","integrity":"sha256-wEgbZn8APZ1aPJOGECOpepgiQiesGap+B7W27dNf6QA="},"flags/4x3/dk-a13735c0337ab4679cd8679508bf5e8067637ab611ca5c54172c621d740420e5.svg":{"logical_path":"flags/4x3/dk.svg","mtime":"2020-02-08T21:52:35+01:00","size":242,"digest":"a13735c0337ab4679cd8679508bf5e8067637ab611ca5c54172c621d740420e5","integrity":"sha256-oTc1wDN6tGec2GeVCL9egGdjerYRylxUFyxiHXQEIOU="},"flags/1x1/dk-822a3b8b6948f49aa81fe7620bd173453d9a45406a9680f24bad7e714e58cb7c.svg":{"logical_path":"flags/1x1/dk.svg","mtime":"2020-02-08T21:52:35+01:00","size":238,"digest":"822a3b8b6948f49aa81fe7620bd173453d9a45406a9680f24bad7e714e58cb7c","integrity":"sha256-gio7i2lI9JqoH+diC9FzRT2aRUBqloDyS61+cU5Yy3w="},"flags/4x3/dm-7713fabd3cf341694b4c1ef5d1379820773722b61c190234ac7416f2872e3940.svg":{"logical_path":"flags/4x3/dm.svg","mtime":"2020-02-08T21:52:35+01:00","size":16026,"digest":"7713fabd3cf341694b4c1ef5d1379820773722b61c190234ac7416f2872e3940","integrity":"sha256-dxP6vTzzQWlLTB710TeYIHc3IrYcGQI0rHQW8ocuOUA="},"flags/1x1/dm-33d984fc9897bb2a3bd16c6672b876effc1a8adc0c57ad122a16db54061e4e46.svg":{"logical_path":"flags/1x1/dm.svg","mtime":"2020-02-08T21:52:35+01:00","size":16514,"digest":"33d984fc9897bb2a3bd16c6672b876effc1a8adc0c57ad122a16db54061e4e46","integrity":"sha256-M9mE/JiXuyo70Wxmcrh27/waitwMV60SKhbbVAYeTkY="},"flags/4x3/do-714b6f307ea3a9c3d30348684b8574e8b7f5078f51649dfa97ae2a69a7108b4a.svg":{"logical_path":"flags/4x3/do.svg","mtime":"2020-02-08T21:52:35+01:00","size":394146,"digest":"714b6f307ea3a9c3d30348684b8574e8b7f5078f51649dfa97ae2a69a7108b4a","integrity":"sha256-cUtvMH6jqcPTA0hoS4V06Lf1B49RZJ36l64qaacQi0o="},"flags/1x1/do-d37306c4b346f89ea14739144374caad69652be31e8ce8e2504c9a0d422a4857.svg":{"logical_path":"flags/1x1/do.svg","mtime":"2020-02-08T21:52:35+01:00","size":391714,"digest":"d37306c4b346f89ea14739144374caad69652be31e8ce8e2504c9a0d422a4857","integrity":"sha256-03MGxLNG+J6hRzkUQ3TKrWllK+MejOjiUEyaDUIqSFc="},"flags/4x3/dz-a96e943c830558fe9823044aac2bfb3f6a4caf3bd3c57943352280a7f6b68cb1.svg":{"logical_path":"flags/4x3/dz.svg","mtime":"2020-02-08T21:52:35+01:00","size":301,"digest":"a96e943c830558fe9823044aac2bfb3f6a4caf3bd3c57943352280a7f6b68cb1","integrity":"sha256-qW6UPIMFWP6YIwRKrCv7P2pMrzvTxXlDNSKAp/a2jLE="},"flags/1x1/dz-09400d3b2c58e641a1641a687b81476761d05f9d0ff65861aeaa33c7f508cda4.svg":{"logical_path":"flags/1x1/dz.svg","mtime":"2020-02-08T21:52:35+01:00","size":312,"digest":"09400d3b2c58e641a1641a687b81476761d05f9d0ff65861aeaa33c7f508cda4","integrity":"sha256-CUANOyxY5kGhZBpoe4FHZ2HQX50P9lhhrqozx/UIzaQ="},"flags/4x3/ec-6762ba85ea0f7bb289b0aa6219c797e5243103d281b1462c61b61030fa329d5e.svg":{"logical_path":"flags/4x3/ec.svg","mtime":"2020-02-08T21:52:35+01:00","size":29417,"digest":"6762ba85ea0f7bb289b0aa6219c797e5243103d281b1462c61b61030fa329d5e","integrity":"sha256-Z2K6heoPe7KJsKpiGceX5SQxA9KBsUYsYbYQMPoynV4="},"flags/1x1/ec-7410a75a013738fbb8cbd756d967380e02ae54ca74e9ef9a41c4b583c2c2794f.svg":{"logical_path":"flags/1x1/ec.svg","mtime":"2020-02-08T21:52:35+01:00","size":29972,"digest":"7410a75a013738fbb8cbd756d967380e02ae54ca74e9ef9a41c4b583c2c2794f","integrity":"sha256-dBCnWgE3OPu4y9dW2Wc4DgKuVMp06e+aQcS1g8LCeU8="},"flags/4x3/ee-ce3b622214bd9eefb43373cae2811ea8cf6ef6a16bb6afbaa5bcaaea34024da0.svg":{"logical_path":"flags/4x3/ee.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"ce3b622214bd9eefb43373cae2811ea8cf6ef6a16bb6afbaa5bcaaea34024da0","integrity":"sha256-zjtiIhS9nu+0M3PK4oEeqM9u9qFrtq+6pbyq6jQCTaA="},"flags/1x1/ee-a207a8363b4dde44f59951501c2cb539419e92b0814b25d6448710ced52226f8.svg":{"logical_path":"flags/1x1/ee.svg","mtime":"2020-02-08T21:52:35+01:00","size":355,"digest":"a207a8363b4dde44f59951501c2cb539419e92b0814b25d6448710ced52226f8","integrity":"sha256-ogeoNjtN3kT1mVFQHCy1OUGekrCBSyXWRIcQztUiJvg="},"flags/4x3/eg-16a11fa93856ddc5fd46f8811adfc93660175724b20eaab55ff046855a352d2c.svg":{"logical_path":"flags/4x3/eg.svg","mtime":"2020-02-08T21:52:35+01:00","size":9978,"digest":"16a11fa93856ddc5fd46f8811adfc93660175724b20eaab55ff046855a352d2c","integrity":"sha256-FqEfqThW3cX9RviBGt/JNmAXVySyDqq1X/BGhVo1LSw="},"flags/1x1/eg-9f4d098c604326bbc3692f9e2f335dbc9b34bdf2706565bf448380f0a889d1e2.svg":{"logical_path":"flags/1x1/eg.svg","mtime":"2020-02-08T21:52:35+01:00","size":9992,"digest":"9f4d098c604326bbc3692f9e2f335dbc9b34bdf2706565bf448380f0a889d1e2","integrity":"sha256-n00JjGBDJrvDaS+eLzNdvJs0vfJwZWW/RIOA8KiJ0eI="},"flags/4x3/eh-9cf4a74d29c1a1afc4137deeb5b678d55c8fbdf8d181217267f3a5cce6a76a97.svg":{"logical_path":"flags/4x3/eh.svg","mtime":"2020-02-08T21:52:35+01:00","size":878,"digest":"9cf4a74d29c1a1afc4137deeb5b678d55c8fbdf8d181217267f3a5cce6a76a97","integrity":"sha256-nPSnTSnBoa/EE33utbZ41VyPvfjRgSFyZ/OlzOanapc="},"flags/1x1/eh-16c3327dbcf3483e634b3536b056324b5478212dae6d060f2ffb2ec961cd382f.svg":{"logical_path":"flags/1x1/eh.svg","mtime":"2020-02-08T21:52:35+01:00","size":828,"digest":"16c3327dbcf3483e634b3536b056324b5478212dae6d060f2ffb2ec961cd382f","integrity":"sha256-FsMyfbzzSD5jSzU2sFYyS1R4IS2ubQYPL/suyWHNOC8="},"flags/4x3/er-69a1e1e45289d1282df4b1e5ce5e712d69fbe314abd0c922353fce90814c543e.svg":{"logical_path":"flags/4x3/er.svg","mtime":"2020-02-08T21:52:35+01:00","size":3207,"digest":"69a1e1e45289d1282df4b1e5ce5e712d69fbe314abd0c922353fce90814c543e","integrity":"sha256-aaHh5FKJ0Sgt9LHlzl5xLWn74xSr0MkiNT/OkIFMVD4="},"flags/1x1/er-90d49408e58955cf1cf3185b0193e03c4a107042d47ef5e975dbbe10c6ef7f4a.svg":{"logical_path":"flags/1x1/er.svg","mtime":"2020-02-08T21:52:35+01:00","size":3395,"digest":"90d49408e58955cf1cf3185b0193e03c4a107042d47ef5e975dbbe10c6ef7f4a","integrity":"sha256-kNSUCOWJVc8c8xhbAZPgPEoQcELUfvXpddu+EMbvf0o="},"flags/4x3/es-50e59681c6b6412498bd9cbfc473abedc713db75c54c538b839db3c394d64499.svg":{"logical_path":"flags/4x3/es.svg","mtime":"2020-02-08T21:52:35+01:00","size":92574,"digest":"50e59681c6b6412498bd9cbfc473abedc713db75c54c538b839db3c394d64499","integrity":"sha256-UOWWgca2QSSYvZy/xHOr7ccT23XFTFOLg52zw5TWRJk="},"flags/1x1/es-29c68fa3c9c8c2adacdc2eb0162e9c2fa998faa408836900ec6285000476800d.svg":{"logical_path":"flags/1x1/es.svg","mtime":"2020-02-08T21:52:35+01:00","size":94269,"digest":"29c68fa3c9c8c2adacdc2eb0162e9c2fa998faa408836900ec6285000476800d","integrity":"sha256-KcaPo8nIwq2s3C6wFi6cL6mY+qQIg2kA7GKFAAR2gA0="},"flags/4x3/et-14263ba7ea890fd0a4d89a2791343ecb7acc89aab1fc2593e00a6093b22251df.svg":{"logical_path":"flags/4x3/et.svg","mtime":"2020-02-08T21:52:35+01:00","size":1243,"digest":"14263ba7ea890fd0a4d89a2791343ecb7acc89aab1fc2593e00a6093b22251df","integrity":"sha256-FCY7p+qJD9Ck2JonkTQ+y3rMiaqx/CWT4Apgk7IiUd8="},"flags/1x1/et-086eefb70e9adad537cc1c640a72cc0fa843ec7a9b06b2778aa98b2db055bfe6.svg":{"logical_path":"flags/1x1/et.svg","mtime":"2020-02-08T21:52:35+01:00","size":1242,"digest":"086eefb70e9adad537cc1c640a72cc0fa843ec7a9b06b2778aa98b2db055bfe6","integrity":"sha256-CG7vtw6a2tU3zBxkCnLMD6hD7HqbBrJ3iqmLLbBVv+Y="},"flags/4x3/fi-a4c41caa02a4f6803ea0d6c36de4beebf20d150e3df742b1369a4099c2ff648e.svg":{"logical_path":"flags/4x3/fi.svg","mtime":"2020-02-08T21:52:35+01:00","size":240,"digest":"a4c41caa02a4f6803ea0d6c36de4beebf20d150e3df742b1369a4099c2ff648e","integrity":"sha256-pMQcqgKk9oA+oNbDbeS+6/INFQ4990KxNppAmcL/ZI4="},"flags/1x1/fi-c5fdf318fac5fdfc94fe54268618e58a2bc5933617ead09992900f90cc25de9a.svg":{"logical_path":"flags/1x1/fi.svg","mtime":"2020-02-08T21:52:35+01:00","size":243,"digest":"c5fdf318fac5fdfc94fe54268618e58a2bc5933617ead09992900f90cc25de9a","integrity":"sha256-xf3zGPrF/fyU/lQmhhjliivFkzYX6tCZkpAPkMwl3po="},"flags/4x3/fj-cb0cc4b3b5c202f07487ee519f48b3eadb47035f5f2d5d3f99d20f81e48d6b79.svg":{"logical_path":"flags/4x3/fj.svg","mtime":"2020-02-08T21:52:35+01:00","size":27388,"digest":"cb0cc4b3b5c202f07487ee519f48b3eadb47035f5f2d5d3f99d20f81e48d6b79","integrity":"sha256-ywzEs7XCAvB0h+5Rn0iz6ttHA19fLV0/mdIPgeSNa3k="},"flags/1x1/fj-c2c7fd536841925e7647b2d510d6a0c58700e2a8ded0e42008fb93ffacde101f.svg":{"logical_path":"flags/1x1/fj.svg","mtime":"2020-02-08T21:52:35+01:00","size":27519,"digest":"c2c7fd536841925e7647b2d510d6a0c58700e2a8ded0e42008fb93ffacde101f","integrity":"sha256-wsf9U2hBkl52R7LVENagxYcA4qje0OQgCPuT/6zeEB8="},"flags/4x3/fk-cb61eaa0d7221823f7d17de59ea88ed16b506f9585ab0c7291cf839449d82968.svg":{"logical_path":"flags/4x3/fk.svg","mtime":"2020-02-08T21:52:35+01:00","size":30453,"digest":"cb61eaa0d7221823f7d17de59ea88ed16b506f9585ab0c7291cf839449d82968","integrity":"sha256-y2HqoNciGCP30X3lnqiO0WtQb5WFqwxykc+DlEnYKWg="},"flags/1x1/fk-a871742380ae157d1211a63cc35cd3621b1bf6de6d67e4a8e3565ad200b1d8cf.svg":{"logical_path":"flags/1x1/fk.svg","mtime":"2020-02-08T21:52:35+01:00","size":30648,"digest":"a871742380ae157d1211a63cc35cd3621b1bf6de6d67e4a8e3565ad200b1d8cf","integrity":"sha256-qHF0I4CuFX0SEaY8w1zTYhsb9t5tZ+So41Za0gCx2M8="},"flags/4x3/fm-079b937562a9a412aae8fb762b571ddb49bf23627943c97247b6a9bbdb768153.svg":{"logical_path":"flags/4x3/fm.svg","mtime":"2020-02-08T21:52:35+01:00","size":773,"digest":"079b937562a9a412aae8fb762b571ddb49bf23627943c97247b6a9bbdb768153","integrity":"sha256-B5uTdWKppBKq6Pt2K1cd20m/I2J5Q8lyR7apu9t2gVM="},"flags/1x1/fm-dbec73633ecd8a6c50f56d54df36bbe6a2f8fb534ac7658477c82cad14a806a8.svg":{"logical_path":"flags/1x1/fm.svg","mtime":"2020-02-08T21:52:35+01:00","size":763,"digest":"dbec73633ecd8a6c50f56d54df36bbe6a2f8fb534ac7658477c82cad14a806a8","integrity":"sha256-2+xzYz7NimxQ9W1U3za75qL4+1NKx2WEd8gsrRSoBqg="},"flags/4x3/fo-27279c2481bb1cb3e44850a948987d6a8411acffa770c3aecd1b76d4c5853413.svg":{"logical_path":"flags/4x3/fo.svg","mtime":"2020-02-08T21:52:35+01:00","size":567,"digest":"27279c2481bb1cb3e44850a948987d6a8411acffa770c3aecd1b76d4c5853413","integrity":"sha256-JyecJIG7HLPkSFCpSJh9aoQRrP+ncMOuzRt21MWFNBM="},"flags/1x1/fo-7cb4fdbba1c7223702d843cb0709ddc799f89f909dfe101e3e36d6bf36c3e67f.svg":{"logical_path":"flags/1x1/fo.svg","mtime":"2020-02-08T21:52:35+01:00","size":537,"digest":"7cb4fdbba1c7223702d843cb0709ddc799f89f909dfe101e3e36d6bf36c3e67f","integrity":"sha256-fLT9u6HHIjcC2EPLBwndx5n4n5Cd/hAePjbWvzbD5n8="},"flags/4x3/fr-30ed2f68dc9a17927643640f48f3d2a858bd041770547035349c6e79713cd84e.svg":{"logical_path":"flags/4x3/fr.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"30ed2f68dc9a17927643640f48f3d2a858bd041770547035349c6e79713cd84e","integrity":"sha256-MO0vaNyaF5J2Q2QPSPPSqFi9BBdwVHA1NJxueXE82E4="},"flags/1x1/fr-6b849151204c66fa661c30b34e62919a13b9e66b7cd37a4fc8962e8e0baf9bdc.svg":{"logical_path":"flags/1x1/fr.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"6b849151204c66fa661c30b34e62919a13b9e66b7cd37a4fc8962e8e0baf9bdc","integrity":"sha256-a4SRUSBMZvpmHDCzTmKRmhO55mt803pPyJYujguvm9w="},"flags/4x3/ga-e3840f9d5bd6ee08db748d37a534500b837bee0f8ce65987b2f099a6afd2cc63.svg":{"logical_path":"flags/4x3/ga.svg","mtime":"2020-02-08T21:52:35+01:00","size":277,"digest":"e3840f9d5bd6ee08db748d37a534500b837bee0f8ce65987b2f099a6afd2cc63","integrity":"sha256-44QPnVvW7gjbdI03pTRQC4N77g+M5lmHsvCZpq/SzGM="},"flags/1x1/ga-9eafd5388042b3d2258ac6223075b726426210136b9851b637973105721b64d9.svg":{"logical_path":"flags/1x1/ga.svg","mtime":"2020-02-08T21:52:35+01:00","size":281,"digest":"9eafd5388042b3d2258ac6223075b726426210136b9851b637973105721b64d9","integrity":"sha256-nq/VOIBCs9IlisYiMHW3JkJiEBNrmFG2N5cxBXIbZNk="},"flags/4x3/gb-ce93c8a6b974d63998e263f6d25f898fc20580a28464457f2f4463b687e4fe8d.svg":{"logical_path":"flags/4x3/gb.svg","mtime":"2020-02-08T21:52:35+01:00","size":834,"digest":"ce93c8a6b974d63998e263f6d25f898fc20580a28464457f2f4463b687e4fe8d","integrity":"sha256-zpPIprl01jmY4mP20l+Jj8IFgKKEZEV/L0Rjtofk/o0="},"flags/1x1/gb-1d93e1ce2e2e10c1709e4dc50ac956c007b2c1a63a4bc22ddfd64354f79ad457.svg":{"logical_path":"flags/1x1/gb.svg","mtime":"2020-02-08T21:52:35+01:00","size":792,"digest":"1d93e1ce2e2e10c1709e4dc50ac956c007b2c1a63a4bc22ddfd64354f79ad457","integrity":"sha256-HZPhzi4uEMFwnk3FCslWwAeywaY6S8It39ZDVPea1Fc="},"flags/4x3/gd-7c3a6b6068bbd9a6abc98c2297dd4acd5e31022e5a4210fc0e1205ec28498fa2.svg":{"logical_path":"flags/4x3/gd.svg","mtime":"2020-02-08T21:52:35+01:00","size":1694,"digest":"7c3a6b6068bbd9a6abc98c2297dd4acd5e31022e5a4210fc0e1205ec28498fa2","integrity":"sha256-fDprYGi72aaryYwil91KzV4xAi5aQhD8DhIF7ChJj6I="},"flags/1x1/gd-2310bc03d9e8ddc8599b40891bfb10b812b07023881599a7e02e3028d1bc9ca8.svg":{"logical_path":"flags/1x1/gd.svg","mtime":"2020-02-08T21:52:35+01:00","size":1834,"digest":"2310bc03d9e8ddc8599b40891bfb10b812b07023881599a7e02e3028d1bc9ca8","integrity":"sha256-IxC8A9no3chZm0CJG/sQuBKwcCOIFZmn4C4wKNG8nKg="},"flags/4x3/ge-501c0135fb8c377dbd2859ff6290b47ef4907a8e2ab2ae1e39116b716db6795f.svg":{"logical_path":"flags/4x3/ge.svg","mtime":"2020-02-08T21:52:35+01:00","size":1400,"digest":"501c0135fb8c377dbd2859ff6290b47ef4907a8e2ab2ae1e39116b716db6795f","integrity":"sha256-UBwBNfuMN329KFn/YpC0fvSQeo4qsq4eORFrcW22eV8="},"flags/1x1/ge-ca9ee36883ec12048fbb7fbbfaf231c0d4848ae0b07dab74a46d53b7b34d8114.svg":{"logical_path":"flags/1x1/ge.svg","mtime":"2020-02-08T21:52:35+01:00","size":1544,"digest":"ca9ee36883ec12048fbb7fbbfaf231c0d4848ae0b07dab74a46d53b7b34d8114","integrity":"sha256-yp7jaIPsEgSPu3+7+vIxwNSEiuCwfat0pG1Tt7NNgRQ="},"flags/4x3/gf-7c165f90bfe6ac3674903632182221a992f017ff706354b1761002382e89c2c2.svg":{"logical_path":"flags/4x3/gf.svg","mtime":"2020-02-08T21:52:35+01:00","size":261,"digest":"7c165f90bfe6ac3674903632182221a992f017ff706354b1761002382e89c2c2","integrity":"sha256-fBZfkL/mrDZ0kDYyGCIhqZLwF/9wY1SxdhACOC6JwsI="},"flags/1x1/gf-8838337b15cdcf143fac16c714e8dbf2d893d2ea8f1c8ef06dadcb652dfec41c.svg":{"logical_path":"flags/1x1/gf.svg","mtime":"2020-02-08T21:52:35+01:00","size":264,"digest":"8838337b15cdcf143fac16c714e8dbf2d893d2ea8f1c8ef06dadcb652dfec41c","integrity":"sha256-iDgzexXNzxQ/rBbHFOjb8tiT0uqPHI7wba3LZS3+xBw="},"flags/4x3/gg-2c7bfc50d5bcd374b5f6107974d06af24e70edba31ad71a225e0c2ecc2d6e778.svg":{"logical_path":"flags/4x3/gg.svg","mtime":"2020-02-08T21:52:35+01:00","size":598,"digest":"2c7bfc50d5bcd374b5f6107974d06af24e70edba31ad71a225e0c2ecc2d6e778","integrity":"sha256-LHv8UNW803S19hB5dNBq8k5w7boxrXGiJeDC7MLW53g="},"flags/1x1/gg-509489b1792831bb27d6975c76aa0a2ac2fa2c3906bcf844f616de5e0fbbc359.svg":{"logical_path":"flags/1x1/gg.svg","mtime":"2020-02-08T21:52:35+01:00","size":628,"digest":"509489b1792831bb27d6975c76aa0a2ac2fa2c3906bcf844f616de5e0fbbc359","integrity":"sha256-UJSJsXkoMbsn1pdcdqoKKsL6LDkGvPhE9hbeXg+7w1k="},"flags/4x3/gh-79c187756e93df22fae571ad9419629c5247c016e32a74471e0d461048fdf5cf.svg":{"logical_path":"flags/4x3/gh.svg","mtime":"2020-02-08T21:52:35+01:00","size":286,"digest":"79c187756e93df22fae571ad9419629c5247c016e32a74471e0d461048fdf5cf","integrity":"sha256-ecGHdW6T3yL65XGtlBlinFJHwBbjKnRHHg1GEEj99c8="},"flags/1x1/gh-e7bf18e6337982ee31e3673ab93e722b3410b7a4c202656a4bc3887d8656286b.svg":{"logical_path":"flags/1x1/gh.svg","mtime":"2020-02-08T21:52:35+01:00","size":299,"digest":"e7bf18e6337982ee31e3673ab93e722b3410b7a4c202656a4bc3887d8656286b","integrity":"sha256-578Y5jN5gu4x42c6uT5yKzQQt6TCAmVqS8OIfYZWKGs="},"flags/4x3/gi-ed99b369c8c77e64abd59fab1f28155d71b4378b49625c66ab0ab6dff4f88087.svg":{"logical_path":"flags/4x3/gi.svg","mtime":"2020-02-08T21:52:35+01:00","size":2972,"digest":"ed99b369c8c77e64abd59fab1f28155d71b4378b49625c66ab0ab6dff4f88087","integrity":"sha256-7ZmzacjHfmSr1Z+rHygVXXG0N4tJYlxmqwq23/T4gIc="},"flags/1x1/gi-2e563e96e766e13c0a9c5a3a372059a44739bb696e853d71a6f6b08c491dfb9a.svg":{"logical_path":"flags/1x1/gi.svg","mtime":"2020-02-08T21:52:35+01:00","size":2964,"digest":"2e563e96e766e13c0a9c5a3a372059a44739bb696e853d71a6f6b08c491dfb9a","integrity":"sha256-LlY+ludm4TwKnFo6NyBZpEc5u2luhT1xpvawjEkd+5o="},"flags/4x3/gl-612e560dbad68d540be672b80e22c54db43d6e2070523e81c156ccd6b3fc4260.svg":{"logical_path":"flags/4x3/gl.svg","mtime":"2020-02-08T21:52:35+01:00","size":229,"digest":"612e560dbad68d540be672b80e22c54db43d6e2070523e81c156ccd6b3fc4260","integrity":"sha256-YS5WDbrWjVQL5nK4DiLFTbQ9biBwUj6BwVbM1rP8QmA="},"flags/1x1/gl-a9bb35d2b9ff27638658d9ad6b9e2c4f452072b9a80b508d32e76d37bf62cf6e.svg":{"logical_path":"flags/1x1/gl.svg","mtime":"2020-02-08T21:52:35+01:00","size":243,"digest":"a9bb35d2b9ff27638658d9ad6b9e2c4f452072b9a80b508d32e76d37bf62cf6e","integrity":"sha256-qbs10rn/J2OGWNmta54sT0UgcrmoC1CNMudtN79iz24="},"flags/4x3/gm-4a6f9670a41548cceaced2b728e4bc56acbc4a3ba5544e7a097f7dae7a8bb045.svg":{"logical_path":"flags/4x3/gm.svg","mtime":"2020-02-08T21:52:35+01:00","size":543,"digest":"4a6f9670a41548cceaced2b728e4bc56acbc4a3ba5544e7a097f7dae7a8bb045","integrity":"sha256-Sm+WcKQVSMzqztK3KOS8Vqy8SjulVE56CX99rnqLsEU="},"flags/1x1/gm-b67f9f6bce2f8c8700c198de8bfafac72d01b8a1e55b77f71e8cafdc58f8af5c.svg":{"logical_path":"flags/1x1/gm.svg","mtime":"2020-02-08T21:52:35+01:00","size":385,"digest":"b67f9f6bce2f8c8700c198de8bfafac72d01b8a1e55b77f71e8cafdc58f8af5c","integrity":"sha256-tn+fa84vjIcAwZjei/r6xy0BuKHlW3f3Hoyv3Fj4r1w="},"flags/4x3/gn-873b4eb52f34c7558bef93cfd1b82117b5c32c9fbc0610f8821ccd22f28abe28.svg":{"logical_path":"flags/4x3/gn.svg","mtime":"2020-02-08T21:52:35+01:00","size":298,"digest":"873b4eb52f34c7558bef93cfd1b82117b5c32c9fbc0610f8821ccd22f28abe28","integrity":"sha256-hztOtS80x1WL75PP0bghF7XDLJ+8BhD4ghzNIvKKvig="},"flags/1x1/gn-72f51dc30cf0ed5459ad0f239cf3043eac05ece75945bcaf4ea6653af868c504.svg":{"logical_path":"flags/1x1/gn.svg","mtime":"2020-02-08T21:52:35+01:00","size":298,"digest":"72f51dc30cf0ed5459ad0f239cf3043eac05ece75945bcaf4ea6653af868c504","integrity":"sha256-cvUdwwzw7VRZrQ8jnPMEPqwF7OdZRbyvTqZlOvhoxQQ="},"flags/4x3/gp-4559cad3eb2d173214161d16b0237c68f5c817749a39c862fa7b23dfb4aee923.svg":{"logical_path":"flags/4x3/gp.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"4559cad3eb2d173214161d16b0237c68f5c817749a39c862fa7b23dfb4aee923","integrity":"sha256-RVnK0+stFzIUFh0WsCN8aPXIF3SaOchi+nsj37Su6SM="},"flags/1x1/gp-d6669532054db5b7e441f4858c28920246a65ca3e8a15518c64c7bbb4f9c6416.svg":{"logical_path":"flags/1x1/gp.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"d6669532054db5b7e441f4858c28920246a65ca3e8a15518c64c7bbb4f9c6416","integrity":"sha256-1maVMgVNtbfkQfSFjCiSAkamXKPooVUYxkx7u0+cZBY="},"flags/4x3/gq-0c8dfe7f9543307056bbe6d6e44a16c17201228e5344d5afec1ccf1b9a5eb2f9.svg":{"logical_path":"flags/4x3/gq.svg","mtime":"2020-02-08T21:52:35+01:00","size":5188,"digest":"0c8dfe7f9543307056bbe6d6e44a16c17201228e5344d5afec1ccf1b9a5eb2f9","integrity":"sha256-DI3+f5VDMHBWu+bW5EoWwXIBIo5TRNWv7BzPG5pesvk="},"flags/1x1/gq-ecb761e6db59b9bf8ba37533eaf0c60b7fcc7c0dfa2fcf281ee84c970dcb10f8.svg":{"logical_path":"flags/1x1/gq.svg","mtime":"2020-02-08T21:52:35+01:00","size":5280,"digest":"ecb761e6db59b9bf8ba37533eaf0c60b7fcc7c0dfa2fcf281ee84c970dcb10f8","integrity":"sha256-7Ldh5ttZub+Lo3Uz6vDGC3/MfA36L88oHuhMlw3LEPg="},"flags/4x3/gr-4a4086310397bffa682d439be8650a9e28d94e32963b6411b61435292ac4cf80.svg":{"logical_path":"flags/4x3/gr.svg","mtime":"2020-02-08T21:52:35+01:00","size":818,"digest":"4a4086310397bffa682d439be8650a9e28d94e32963b6411b61435292ac4cf80","integrity":"sha256-SkCGMQOXv/poLUOb6GUKnijZTjKWO2QRthQ1KSrEz4A="},"flags/1x1/gr-0cbd171892c0568b055d3b6585d58ac13dd60dfbcfad16eda1f4f9ead11dd16f.svg":{"logical_path":"flags/1x1/gr.svg","mtime":"2020-02-08T21:52:35+01:00","size":875,"digest":"0cbd171892c0568b055d3b6585d58ac13dd60dfbcfad16eda1f4f9ead11dd16f","integrity":"sha256-DL0XGJLAVosFXTtlhdWKwT3WDfvPrRbtofT56tEd0W8="},"flags/4x3/gs-e45169a93a9e94c15f5cb765a6c863319171fb9b4dce56094411829cd688d486.svg":{"logical_path":"flags/4x3/gs.svg","mtime":"2020-02-08T21:52:35+01:00","size":34658,"digest":"e45169a93a9e94c15f5cb765a6c863319171fb9b4dce56094411829cd688d486","integrity":"sha256-5FFpqTqelMFfXLdlpshjMZFx+5tNzlYJRBGCnNaI1IY="},"flags/1x1/gs-3efc9e1b32961f9aa9d7faa2626e596282b63d049f6717c2378b28e3f508e79a.svg":{"logical_path":"flags/1x1/gs.svg","mtime":"2020-02-08T21:52:35+01:00","size":35151,"digest":"3efc9e1b32961f9aa9d7faa2626e596282b63d049f6717c2378b28e3f508e79a","integrity":"sha256-PvyeGzKWH5qp1/qiYm5ZYoK2PQSfZxfCN4so4/UI55o="},"flags/4x3/gt-64a7345cf66facf7f323d2142aebb4172191108a78ac7493b1a6077b78ac8ec5.svg":{"logical_path":"flags/4x3/gt.svg","mtime":"2020-02-08T21:52:35+01:00","size":37857,"digest":"64a7345cf66facf7f323d2142aebb4172191108a78ac7493b1a6077b78ac8ec5","integrity":"sha256-ZKc0XPZvrPfzI9IUKuu0FyGREIp4rHSTsaYHe3isjsU="},"flags/1x1/gt-436a2af3d95cf3cb13ded897f319cfd6e2c087d678ad0e971c198b0d2c029911.svg":{"logical_path":"flags/1x1/gt.svg","mtime":"2020-02-08T21:52:35+01:00","size":37857,"digest":"436a2af3d95cf3cb13ded897f319cfd6e2c087d678ad0e971c198b0d2c029911","integrity":"sha256-Q2oq89lc88sT3tiX8xnP1uLAh9Z4rQ6XHBmLDSwCmRE="},"flags/4x3/gu-f560822ee237e5277829e63613a615a2ee3d8cc6196dffffe0f0d56a49b11c53.svg":{"logical_path":"flags/4x3/gu.svg","mtime":"2020-02-08T21:52:35+01:00","size":4859,"digest":"f560822ee237e5277829e63613a615a2ee3d8cc6196dffffe0f0d56a49b11c53","integrity":"sha256-9WCCLuI35Sd4KeY2E6YVou49jMYZbf//4PDVakmxHFM="},"flags/1x1/gu-a71c9d290c66c1a0929b05436dc6a8229b1147d7cc62336e04c9adf697030450.svg":{"logical_path":"flags/1x1/gu.svg","mtime":"2020-02-08T21:52:35+01:00","size":4644,"digest":"a71c9d290c66c1a0929b05436dc6a8229b1147d7cc62336e04c9adf697030450","integrity":"sha256-pxydKQxmwaCSmwVDbcaoIpsRR9fMYjNuBMmt9pcDBFA="},"flags/4x3/gw-0dc9ec17735ed605b68672947ce55c49a4ec1551491ccd121f482c1875cdf219.svg":{"logical_path":"flags/4x3/gw.svg","mtime":"2020-02-08T21:52:35+01:00","size":816,"digest":"0dc9ec17735ed605b68672947ce55c49a4ec1551491ccd121f482c1875cdf219","integrity":"sha256-DcnsF3Ne1gW2hnKUfOVcSaTsFVFJHM0SH0gsGHXN8hk="},"flags/1x1/gw-7868c305e4a64b0d8ebfd3f7cb8c881841d71a7e0c3ead2683fe503c80de0674.svg":{"logical_path":"flags/1x1/gw.svg","mtime":"2020-02-08T21:52:35+01:00","size":892,"digest":"7868c305e4a64b0d8ebfd3f7cb8c881841d71a7e0c3ead2683fe503c80de0674","integrity":"sha256-eGjDBeSmSw2Ov9P3y4yIGEHXGn4MPq0mg/5QPIDeBnQ="},"flags/4x3/gy-c9126e544c62508abfb898f0af0bd79c46f4c767c9ed6f928418a24b0f246d85.svg":{"logical_path":"flags/4x3/gy.svg","mtime":"2020-02-08T21:52:35+01:00","size":491,"digest":"c9126e544c62508abfb898f0af0bd79c46f4c767c9ed6f928418a24b0f246d85","integrity":"sha256-yRJuVExiUIq/uJjwrwvXnEb0x2fJ7W+ShBiiSw8kbYU="},"flags/1x1/gy-0e3b849ce460f8ab1ec7cf66a25be1ba91e89b72d8b0aa679a0553464f37a972.svg":{"logical_path":"flags/1x1/gy.svg","mtime":"2020-02-08T21:52:35+01:00","size":484,"digest":"0e3b849ce460f8ab1ec7cf66a25be1ba91e89b72d8b0aa679a0553464f37a972","integrity":"sha256-DjuEnORg+Ksex89molvhupHom3LYsKpnmgVTRk83qXI="},"flags/4x3/hk-cece9126ccbf9151feadfed75791ebf32d4a16beab12f182404519d0cc24eec7.svg":{"logical_path":"flags/4x3/hk.svg","mtime":"2020-02-08T21:52:35+01:00","size":3511,"digest":"cece9126ccbf9151feadfed75791ebf32d4a16beab12f182404519d0cc24eec7","integrity":"sha256-zs6RJsy/kVH+rf7XV5Hr8y1KFr6rEvGCQEUZ0Mwk7sc="},"flags/1x1/hk-9fad00e06f9034877149394914baa2bc3292223b0e32df2b1f9399d4de6e167d.svg":{"logical_path":"flags/1x1/hk.svg","mtime":"2020-02-08T21:52:35+01:00","size":3561,"digest":"9fad00e06f9034877149394914baa2bc3292223b0e32df2b1f9399d4de6e167d","integrity":"sha256-n60A4G+QNIdxSTlJFLqivDKSIjsOMt8rH5OZ1N5uFn0="},"flags/4x3/hm-4b4923b81da24d62ebf31a9bc0addf76beef84593374b1cbd03ba19f3b12e3e9.svg":{"logical_path":"flags/4x3/hm.svg","mtime":"2020-02-08T21:52:35+01:00","size":1328,"digest":"4b4923b81da24d62ebf31a9bc0addf76beef84593374b1cbd03ba19f3b12e3e9","integrity":"sha256-S0kjuB2iTWLr8xqbwK3fdr7vhFkzdLHL0DuhnzsS4+k="},"flags/1x1/hm-776c822113a22e83581234d05f40bfc0ed38b60648d87f513f3da3fff96ffb61.svg":{"logical_path":"flags/1x1/hm.svg","mtime":"2020-02-08T21:52:35+01:00","size":1312,"digest":"776c822113a22e83581234d05f40bfc0ed38b60648d87f513f3da3fff96ffb61","integrity":"sha256-d2yCIROiLoNYEjTQX0C/wO04tgZI2H9RPz2j//lv+2E="},"flags/4x3/hn-855c830786283862a5f399e0d69dffe52b6223b91b32e31b55d55c82f2fa32c9.svg":{"logical_path":"flags/4x3/hn.svg","mtime":"2020-02-08T21:52:35+01:00","size":1115,"digest":"855c830786283862a5f399e0d69dffe52b6223b91b32e31b55d55c82f2fa32c9","integrity":"sha256-hVyDB4YoOGKl85ng1p3/5StiI7kbMuMbVdVcgvL6Msk="},"flags/1x1/hn-64c38bac9403417c4e276bf5536d284fc5410fc04b80acd39a961d298f430dbd.svg":{"logical_path":"flags/1x1/hn.svg","mtime":"2020-02-08T21:52:35+01:00","size":1119,"digest":"64c38bac9403417c4e276bf5536d284fc5410fc04b80acd39a961d298f430dbd","integrity":"sha256-ZMOLrJQDQXxOJ2v1U20oT8VBD8BLgKzTmpYdKY9DDb0="},"flags/4x3/hr-c8cad861f7398a22b9d27ea682d2778df0dde8e146d30142b5294daf988854af.svg":{"logical_path":"flags/4x3/hr.svg","mtime":"2020-02-08T21:52:35+01:00","size":41617,"digest":"c8cad861f7398a22b9d27ea682d2778df0dde8e146d30142b5294daf988854af","integrity":"sha256-yMrYYfc5iiK50n6mgtJ3jfDd6OFG0wFCtSlNr5iIVK8="},"flags/1x1/hr-60c093df6760e4cc6abe26c37a52be3b51458f02712f18e11f08b07dc623b489.svg":{"logical_path":"flags/1x1/hr.svg","mtime":"2020-02-08T21:52:35+01:00","size":41808,"digest":"60c093df6760e4cc6abe26c37a52be3b51458f02712f18e11f08b07dc623b489","integrity":"sha256-YMCT32dg5MxqvibDelK+O1FFjwJxLxjhHwiwfcYjtIk="},"flags/4x3/ht-fe81da06228fa36e7f211bec0d9f0c020f5b9c7f81534b4cb2251848aa276b16.svg":{"logical_path":"flags/4x3/ht.svg","mtime":"2020-02-08T21:52:35+01:00","size":15231,"digest":"fe81da06228fa36e7f211bec0d9f0c020f5b9c7f81534b4cb2251848aa276b16","integrity":"sha256-/oHaBiKPo25/IRvsDZ8MAg9bnH+BU0tMsiUYSKonaxY="},"flags/1x1/ht-dd0197c078859c5a66ff3a51d3a3f92809768e36bfabdec0fc0ab60d068afcd9.svg":{"logical_path":"flags/1x1/ht.svg","mtime":"2020-02-08T21:52:35+01:00","size":15317,"digest":"dd0197c078859c5a66ff3a51d3a3f92809768e36bfabdec0fc0ab60d068afcd9","integrity":"sha256-3QGXwHiFnFpm/zpR06P5KAl2jja/q97A/Aq2DQaK/Nk="},"flags/4x3/hu-9aa998e636687aede491e307f3d068dbe58f2d90bfdfaec0e7ad03baa5b36344.svg":{"logical_path":"flags/4x3/hu.svg","mtime":"2020-02-08T21:52:35+01:00","size":277,"digest":"9aa998e636687aede491e307f3d068dbe58f2d90bfdfaec0e7ad03baa5b36344","integrity":"sha256-mqmY5jZoeu3kkeMH89Bo2+WPLZC/367A560DuqWzY0Q="},"flags/1x1/hu-06858d0fbd4320496e849010e35c8fe82eb618188cf6ec329aef93f5e7af1c23.svg":{"logical_path":"flags/1x1/hu.svg","mtime":"2020-02-08T21:52:35+01:00","size":279,"digest":"06858d0fbd4320496e849010e35c8fe82eb618188cf6ec329aef93f5e7af1c23","integrity":"sha256-BoWND71DIEluhJAQ41yP6C62GBiM9uwymu+T9eevHCM="},"flags/4x3/id-775dbfedd6533afdf5bd017ccc1ad4f8f4238cbe87393d9c837a669196f17293.svg":{"logical_path":"flags/4x3/id.svg","mtime":"2020-02-08T21:52:35+01:00","size":240,"digest":"775dbfedd6533afdf5bd017ccc1ad4f8f4238cbe87393d9c837a669196f17293","integrity":"sha256-d12/7dZTOv31vQF8zBrU+PQjjL6HOT2cg3pmkZbxcpM="},"flags/1x1/id-3920ce662a7ea937b2c11707d8e1f53db52611dd004edf753b0389ed490d9d29.svg":{"logical_path":"flags/1x1/id.svg","mtime":"2020-02-08T21:52:35+01:00","size":242,"digest":"3920ce662a7ea937b2c11707d8e1f53db52611dd004edf753b0389ed490d9d29","integrity":"sha256-OSDOZip+qTeywRcH2OH1PbUmEd0ATt91OwOJ7UkNnSk="},"flags/4x3/ie-6368a1c92440fcf80d3c35607543bcaa2d4662d6e0bc7acf6749ddbc418a72c0.svg":{"logical_path":"flags/4x3/ie.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"6368a1c92440fcf80d3c35607543bcaa2d4662d6e0bc7acf6749ddbc418a72c0","integrity":"sha256-Y2ihySRA/PgNPDVgdUO8qi1GYtbgvHrPZ0ndvEGKcsA="},"flags/1x1/ie-1997e9de640fa764677aa8f5d52f7888bb24a029160e8f67b06dbd043b4f11b3.svg":{"logical_path":"flags/1x1/ie.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"1997e9de640fa764677aa8f5d52f7888bb24a029160e8f67b06dbd043b4f11b3","integrity":"sha256-GZfp3mQPp2Rneqj11S94iLskoCkWDo9nsG29BDtPEbM="},"flags/4x3/il-d76883a2330f9a05a4a64990ba955fc1be90bb46bcb19ae548c21816e7e74178.svg":{"logical_path":"flags/4x3/il.svg","mtime":"2020-02-08T21:52:35+01:00","size":898,"digest":"d76883a2330f9a05a4a64990ba955fc1be90bb46bcb19ae548c21816e7e74178","integrity":"sha256-12iDojMPmgWkpkmQupVfwb6Qu0a8sZrlSMIYFufnQXg="},"flags/1x1/il-f5e643d0e10169a438119dc441ea3100b52a2ff569bbb3a3ad6d1131b47602d8.svg":{"logical_path":"flags/1x1/il.svg","mtime":"2020-02-08T21:52:35+01:00","size":851,"digest":"f5e643d0e10169a438119dc441ea3100b52a2ff569bbb3a3ad6d1131b47602d8","integrity":"sha256-9eZD0OEBaaQ4EZ3EQeoxALUqL/Vpu7OjrW0RMbR2Atg="},"flags/4x3/im-bbae8aa9dd129f8446556afe4904194ad43377d882f9a705fcf1da2bdbfabccf.svg":{"logical_path":"flags/4x3/im.svg","mtime":"2020-02-08T21:52:35+01:00","size":9948,"digest":"bbae8aa9dd129f8446556afe4904194ad43377d882f9a705fcf1da2bdbfabccf","integrity":"sha256-u66Kqd0Sn4RGVWr+SQQZStQzd9iC+acF/PHaK9v6vM8="},"flags/1x1/im-767d72c2e72d732d65c9b016adad983778dfbbb2b5b52e71830f4e41297728d3.svg":{"logical_path":"flags/1x1/im.svg","mtime":"2020-02-08T21:52:35+01:00","size":10295,"digest":"767d72c2e72d732d65c9b016adad983778dfbbb2b5b52e71830f4e41297728d3","integrity":"sha256-dn1ywuctcy1lybAWra2YN3jfu7K1tS5xgw9OQSl3KNM="},"flags/4x3/in-519e33321b8b2ba70a0b7557d66c62d7efdc9723896c49f82528b107028ffe29.svg":{"logical_path":"flags/4x3/in.svg","mtime":"2020-02-08T21:52:35+01:00","size":1077,"digest":"519e33321b8b2ba70a0b7557d66c62d7efdc9723896c49f82528b107028ffe29","integrity":"sha256-UZ4zMhuLK6cKC3VX1mxi1+/clyOJbEn4JSixBwKP/ik="},"flags/1x1/in-27831f76dc6a218a529b6e5d0eafc4c19c999461327b7c013f59226c0601a361.svg":{"logical_path":"flags/1x1/in.svg","mtime":"2020-02-08T21:52:35+01:00","size":1091,"digest":"27831f76dc6a218a529b6e5d0eafc4c19c999461327b7c013f59226c0601a361","integrity":"sha256-J4MfdtxqIYpSm25dDq/EwZyZlGEye3wBP1kibAYBo2E="},"flags/4x3/io-8d25a8e98f682199b413adfbcb6898c37058c9bae085e427fbab03d56e8c0de6.svg":{"logical_path":"flags/4x3/io.svg","mtime":"2020-02-08T21:52:35+01:00","size":27446,"digest":"8d25a8e98f682199b413adfbcb6898c37058c9bae085e427fbab03d56e8c0de6","integrity":"sha256-jSWo6Y9oIZm0E637y2iYw3BYybrgheQn+6sD1W6MDeY="},"flags/1x1/io-627f3b0cef72fd91ff426d74a007dc32d74c9fe677cf2c8355cba84359e16fde.svg":{"logical_path":"flags/1x1/io.svg","mtime":"2020-02-08T21:52:35+01:00","size":27497,"digest":"627f3b0cef72fd91ff426d74a007dc32d74c9fe677cf2c8355cba84359e16fde","integrity":"sha256-Yn87DO9y/ZH/Qm10oAfcMtdMn+Z3zyyDVcuoQ1nhb94="},"flags/4x3/iq-96b24d1439184d0a4c35ca7cea65e5f20469a0e8c8438963aad016e59c399cc6.svg":{"logical_path":"flags/4x3/iq.svg","mtime":"2020-02-08T21:52:35+01:00","size":1479,"digest":"96b24d1439184d0a4c35ca7cea65e5f20469a0e8c8438963aad016e59c399cc6","integrity":"sha256-lrJNFDkYTQpMNcp86mXl8gRpoOjIQ4ljqtAW5Zw5nMY="},"flags/1x1/iq-af04db139f8c44cfe0c612e2c05e848ccfad88fbbfcb58e88cdb7c80db365669.svg":{"logical_path":"flags/1x1/iq.svg","mtime":"2020-02-08T21:52:35+01:00","size":1484,"digest":"af04db139f8c44cfe0c612e2c05e848ccfad88fbbfcb58e88cdb7c80db365669","integrity":"sha256-rwTbE5+MRM/gxhLiwF6EjM+tiPu/y1jojNt8gNs2Vmk="},"flags/4x3/ir-db2c230d355ade2b1ac235ec647bb1535e4703c639a44f9ce112473272ee1019.svg":{"logical_path":"flags/4x3/ir.svg","mtime":"2020-02-08T21:52:35+01:00","size":15484,"digest":"db2c230d355ade2b1ac235ec647bb1535e4703c639a44f9ce112473272ee1019","integrity":"sha256-2ywjDTVa3isawjXsZHuxU15HA8Y5pE+c4RJHMnLuEBk="},"flags/1x1/ir-c648cbf56fc8f324fda477ea816783c9df8a7d398f45f5f94acc1c16c8877b63.svg":{"logical_path":"flags/1x1/ir.svg","mtime":"2020-02-08T21:52:35+01:00","size":15387,"digest":"c648cbf56fc8f324fda477ea816783c9df8a7d398f45f5f94acc1c16c8877b63","integrity":"sha256-xkjL9W/I8yT9pHfqgWeDyd+KfTmPRfX5SswcFsiHe2M="},"flags/4x3/is-29508693138977229758b0f322ba34e90dbcd7a8a74e8820729933d24051d9a7.svg":{"logical_path":"flags/4x3/is.svg","mtime":"2020-02-08T21:52:35+01:00","size":521,"digest":"29508693138977229758b0f322ba34e90dbcd7a8a74e8820729933d24051d9a7","integrity":"sha256-KVCGkxOJdyKXWLDzIro06Q2816inToggcpkz0kBR2ac="},"flags/1x1/is-b1c5db1d4b4853b8144f1d88ababbf14fc88752340457ba3e2c94ab5d54c9c01.svg":{"logical_path":"flags/1x1/is.svg","mtime":"2020-02-08T21:52:35+01:00","size":529,"digest":"b1c5db1d4b4853b8144f1d88ababbf14fc88752340457ba3e2c94ab5d54c9c01","integrity":"sha256-scXbHUtIU7gUTx2Iq6u/FPyIdSNARXuj4slKtdVMnAE="},"flags/4x3/it-d2c168050fc509adac1163b097b0ed409217560735b27802ae9259587c146562.svg":{"logical_path":"flags/4x3/it.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"d2c168050fc509adac1163b097b0ed409217560735b27802ae9259587c146562","integrity":"sha256-0sFoBQ/FCa2sEWOwl7DtQJIXVgc1sngCrpJZWHwUZWI="},"flags/1x1/it-592d34fb666430fa00f98d333623d5efa3c8e0e65ac4eee06bbc4c1de7ce4bea.svg":{"logical_path":"flags/1x1/it.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"592d34fb666430fa00f98d333623d5efa3c8e0e65ac4eee06bbc4c1de7ce4bea","integrity":"sha256-WS00+2ZkMPoA+Y0zNiPV76PI4OZaxO7ga7xMHefOS+o="},"flags/4x3/je-b363a4e3a21630f10791c2ebeb7f918320816ef87c155d4fd29ce37982f4df35.svg":{"logical_path":"flags/4x3/je.svg","mtime":"2020-02-08T21:52:35+01:00","size":4776,"digest":"b363a4e3a21630f10791c2ebeb7f918320816ef87c155d4fd29ce37982f4df35","integrity":"sha256-s2Ok46IWMPEHkcLr63+RgyCBbvh8FV1P0pzjeYL03zU="},"flags/1x1/je-6d43f74e30e099bc056da925ec34c0200708f0a6e90da34db1e59d54ce10cfd9.svg":{"logical_path":"flags/1x1/je.svg","mtime":"2020-02-08T21:52:35+01:00","size":4757,"digest":"6d43f74e30e099bc056da925ec34c0200708f0a6e90da34db1e59d54ce10cfd9","integrity":"sha256-bUP3TjDgmbwFbakl7DTAIAcI8KbpDaNNseWdVM4Qz9k="},"flags/4x3/jm-3d133fbc2564f29e036855e8be224d1579fe66fe49e0f5a2ba0bdcf3cb272823.svg":{"logical_path":"flags/4x3/jm.svg","mtime":"2020-02-08T21:52:35+01:00","size":392,"digest":"3d133fbc2564f29e036855e8be224d1579fe66fe49e0f5a2ba0bdcf3cb272823","integrity":"sha256-PRM/vCVk8p4DaFXoviJNFXn+Zv5J4PWiugvc88snKCM="},"flags/1x1/jm-1aea8ea5d8cbc717fa3ef331d8caa9a1421c88a7bd076e40f8276a5b6f8d0467.svg":{"logical_path":"flags/1x1/jm.svg","mtime":"2020-02-08T21:52:35+01:00","size":392,"digest":"1aea8ea5d8cbc717fa3ef331d8caa9a1421c88a7bd076e40f8276a5b6f8d0467","integrity":"sha256-GuqOpdjLxxf6PvMx2MqpoUIciKe9B25A+CdqW2+NBGc="},"flags/4x3/jo-eee432339f8ea6750987e1121187eb4b53ec537dd7ccb240c018de63f7a92db6.svg":{"logical_path":"flags/4x3/jo.svg","mtime":"2020-02-08T21:52:35+01:00","size":717,"digest":"eee432339f8ea6750987e1121187eb4b53ec537dd7ccb240c018de63f7a92db6","integrity":"sha256-7uQyM5+OpnUJh+ESEYfrS1PsU33XzLJAwBjeY/epLbY="},"flags/1x1/jo-7969b2083c535c85b7e714b755459a6606940e0b5ddb1b71e24daf0a180d14aa.svg":{"logical_path":"flags/1x1/jo.svg","mtime":"2020-02-08T21:52:35+01:00","size":694,"digest":"7969b2083c535c85b7e714b755459a6606940e0b5ddb1b71e24daf0a180d14aa","integrity":"sha256-eWmyCDxTXIW35xS3VUWaZgaUDgtd2xtx4k2vChgNFKo="},"flags/4x3/jp-2eadcfc67ba8cd50c1da86e08e6778e0102c3072865dab8c312cc88006da0abe.svg":{"logical_path":"flags/4x3/jp.svg","mtime":"2020-02-08T21:52:35+01:00","size":484,"digest":"2eadcfc67ba8cd50c1da86e08e6778e0102c3072865dab8c312cc88006da0abe","integrity":"sha256-Lq3PxnuozVDB2obgjmd44BAsMHKGXauMMSzIgAbaCr4="},"flags/1x1/jp-551281a75e6c6fd64eb65b39f56102b52c182f6c38ee045c9422f6592f0f65c5.svg":{"logical_path":"flags/1x1/jp.svg","mtime":"2020-02-08T21:52:35+01:00","size":500,"digest":"551281a75e6c6fd64eb65b39f56102b52c182f6c38ee045c9422f6592f0f65c5","integrity":"sha256-VRKBp15sb9ZOtls59WECtSwYL2w47gRclCL2WS8PZcU="},"flags/4x3/ke-45790bc3ec1ed8ed0124777a7c9e09163353b5af4ff70ae6604a61b53712df4b.svg":{"logical_path":"flags/4x3/ke.svg","mtime":"2020-02-08T21:52:35+01:00","size":1383,"digest":"45790bc3ec1ed8ed0124777a7c9e09163353b5af4ff70ae6604a61b53712df4b","integrity":"sha256-RXkLw+we2O0BJHd6fJ4JFjNTta9P9wrmYEphtTcS30s="},"flags/1x1/ke-2cca24ecf024b801543c0572efc9969ffdaf25cec313e2149c64961839bc301b.svg":{"logical_path":"flags/1x1/ke.svg","mtime":"2020-02-08T21:52:35+01:00","size":1495,"digest":"2cca24ecf024b801543c0572efc9969ffdaf25cec313e2149c64961839bc301b","integrity":"sha256-LMok7PAkuAFUPAVy78mWn/2vJc7DE+IUnGSWGDm8MBs="},"flags/4x3/kg-3879f8931d74cc9c5927261f4095b2bb786f3d62c803b2a96ec550a23fae9f49.svg":{"logical_path":"flags/4x3/kg.svg","mtime":"2020-02-08T21:52:35+01:00","size":3387,"digest":"3879f8931d74cc9c5927261f4095b2bb786f3d62c803b2a96ec550a23fae9f49","integrity":"sha256-OHn4kx10zJxZJyYfQJWyu3hvPWLIA7KpbsVQoj+un0k="},"flags/1x1/kg-74318932808f85b72df308358f2f2699ab0cb7ab4f7ad3c84c4be4024f0fb140.svg":{"logical_path":"flags/1x1/kg.svg","mtime":"2020-02-08T21:52:35+01:00","size":3337,"digest":"74318932808f85b72df308358f2f2699ab0cb7ab4f7ad3c84c4be4024f0fb140","integrity":"sha256-dDGJMoCPhbct8wg1jy8mmasMt6tPetPITEvkAk8PsUA="},"flags/4x3/kh-7409fab4ba4e676db7b5c61020b97893b1735fe0b8e39e9b4f96108400be704e.svg":{"logical_path":"flags/4x3/kh.svg","mtime":"2020-02-08T21:52:35+01:00","size":7295,"digest":"7409fab4ba4e676db7b5c61020b97893b1735fe0b8e39e9b4f96108400be704e","integrity":"sha256-dAn6tLpOZ223tcYQILl4k7FzX+C4456bT5YQhAC+cE4="},"flags/1x1/kh-2603f6a61b400cb12b87397eeba60ae1707511467d5e0c430c05809bf89e5042.svg":{"logical_path":"flags/1x1/kh.svg","mtime":"2020-02-08T21:52:35+01:00","size":7296,"digest":"2603f6a61b400cb12b87397eeba60ae1707511467d5e0c430c05809bf89e5042","integrity":"sha256-JgP2phtADLErhzl+66YK4XB1EUZ9XgxDDAWAm/ieUEI="},"flags/4x3/ki-617c1b52f3d9aee99d094edbd1775cae77aade266a1318eb4671b2bb1620ded5.svg":{"logical_path":"flags/4x3/ki.svg","mtime":"2020-02-08T21:52:35+01:00","size":5818,"digest":"617c1b52f3d9aee99d094edbd1775cae77aade266a1318eb4671b2bb1620ded5","integrity":"sha256-YXwbUvPZrumdCU7b0Xdcrneq3iZqExjrRnGyuxYg3tU="},"flags/1x1/ki-74615266b440a24f09abdeae3853d7e1111f0eba77df71ccd176d83fbd1fd9ad.svg":{"logical_path":"flags/1x1/ki.svg","mtime":"2020-02-08T21:52:35+01:00","size":5955,"digest":"74615266b440a24f09abdeae3853d7e1111f0eba77df71ccd176d83fbd1fd9ad","integrity":"sha256-dGFSZrRAok8Jq96uOFPX4REfDrp333HM0XbYP70f2a0="},"flags/4x3/km-0c9bcbf7e677a541fc8dff6f848c9d92b6982ac2934ae75faa56a2b846bb5698.svg":{"logical_path":"flags/4x3/km.svg","mtime":"2020-02-08T21:52:35+01:00","size":1061,"digest":"0c9bcbf7e677a541fc8dff6f848c9d92b6982ac2934ae75faa56a2b846bb5698","integrity":"sha256-DJvL9+Z3pUH8jf9vhIydkraYKsKTSudfqlaiuEa7Vpg="},"flags/1x1/km-81b0fbe53d09194270e8ed4cbe9be8eb1ae727e77957005369ad8bdc651dd1c8.svg":{"logical_path":"flags/1x1/km.svg","mtime":"2020-02-08T21:52:35+01:00","size":1044,"digest":"81b0fbe53d09194270e8ed4cbe9be8eb1ae727e77957005369ad8bdc651dd1c8","integrity":"sha256-gbD75T0JGUJw6O1Mvpvo6xrnJ+d5VwBTaa2L3GUd0cg="},"flags/4x3/kn-0442f55f81cd3b1057c609301f0af2b503d89a895a954af8c970df997e92bd03.svg":{"logical_path":"flags/4x3/kn.svg","mtime":"2020-02-08T21:52:35+01:00","size":816,"digest":"0442f55f81cd3b1057c609301f0af2b503d89a895a954af8c970df997e92bd03","integrity":"sha256-BEL1X4HNOxBXxgkwHwrytQPYmolalUr4yXDfmX6SvQM="},"flags/1x1/kn-897c34ef54bee486f0d24d2191e2400f49a19d98efb19f8c3f1a27fb0b97131a.svg":{"logical_path":"flags/1x1/kn.svg","mtime":"2020-02-08T21:52:35+01:00","size":820,"digest":"897c34ef54bee486f0d24d2191e2400f49a19d98efb19f8c3f1a27fb0b97131a","integrity":"sha256-iXw071S+5Ibw0k0hkeJAD0mhnZjvsZ+MPxon+wuXExo="},"flags/4x3/kp-a54f7201982b29530381b71a5e2a11c1153860f22c04c0a2d91bb0d20fedf78e.svg":{"logical_path":"flags/4x3/kp.svg","mtime":"2020-02-08T21:52:35+01:00","size":792,"digest":"a54f7201982b29530381b71a5e2a11c1153860f22c04c0a2d91bb0d20fedf78e","integrity":"sha256-pU9yAZgrKVMDgbcaXioRwRU4YPIsBMCi2Ruw0g/t944="},"flags/1x1/kp-758eccd89ef3707808fb68d931f086e49333904f4cc67c88468f3c96fb43b7b6.svg":{"logical_path":"flags/1x1/kp.svg","mtime":"2020-02-08T21:52:35+01:00","size":855,"digest":"758eccd89ef3707808fb68d931f086e49333904f4cc67c88468f3c96fb43b7b6","integrity":"sha256-dY7M2J7zcHgI+2jZMfCG5JMzkE9MxnyIRo88lvtDt7Y="},"flags/4x3/kr-c0b9b2c854133410c0ad9cadbc10b1e0bacf0305519883126d55bfa3214f9d06.svg":{"logical_path":"flags/4x3/kr.svg","mtime":"2020-02-08T21:52:35+01:00","size":1827,"digest":"c0b9b2c854133410c0ad9cadbc10b1e0bacf0305519883126d55bfa3214f9d06","integrity":"sha256-wLmyyFQTNBDArZytvBCx4LrPAwVRmIMSbVW/oyFPnQY="},"flags/1x1/kr-7c0457ac5d284b28b742ea2e061a1aa2a35f63171e464b3a7eb501a48756ce7b.svg":{"logical_path":"flags/1x1/kr.svg","mtime":"2020-02-08T21:52:35+01:00","size":1733,"digest":"7c0457ac5d284b28b742ea2e061a1aa2a35f63171e464b3a7eb501a48756ce7b","integrity":"sha256-fARXrF0oSyi3QuouBhoaoqNfYxceRks6frUBpIdWzns="},"flags/4x3/kw-81c3d5d25c7b840ef14783b51d18c6b7cfc61f94932c664bbc9e5879fef020eb.svg":{"logical_path":"flags/4x3/kw.svg","mtime":"2020-02-08T21:52:35+01:00","size":506,"digest":"81c3d5d25c7b840ef14783b51d18c6b7cfc61f94932c664bbc9e5879fef020eb","integrity":"sha256-gcPV0lx7hA7xR4O1HRjGt8/GH5STLGZLvJ5Yef7wIOs="},"flags/1x1/kw-66670211a67a4e61d4652a19d821dc5195f01a28a3a9b28b7e4c6048cd86b19c.svg":{"logical_path":"flags/1x1/kw.svg","mtime":"2020-02-08T21:52:35+01:00","size":510,"digest":"66670211a67a4e61d4652a19d821dc5195f01a28a3a9b28b7e4c6048cd86b19c","integrity":"sha256-ZmcCEaZ6TmHUZSoZ2CHcUZXwGiijqbKLfkxgSM2GsZw="},"flags/4x3/ky-0f4ab66d951ae33f800d680aaa5704804ba9c8844d4d80e5bee2e3fa0e100af3.svg":{"logical_path":"flags/4x3/ky.svg","mtime":"2020-02-08T21:52:35+01:00","size":21886,"digest":"0f4ab66d951ae33f800d680aaa5704804ba9c8844d4d80e5bee2e3fa0e100af3","integrity":"sha256-D0q2bZUa4z+ADWgKqlcEgEupyIRNTYDlvuLj+g4QCvM="},"flags/1x1/ky-fb5f57bb58b74d23377bad9954a75ab88d1587af68546ce137a6ae7a88a7701e.svg":{"logical_path":"flags/1x1/ky.svg","mtime":"2020-02-08T21:52:35+01:00","size":22495,"digest":"fb5f57bb58b74d23377bad9954a75ab88d1587af68546ce137a6ae7a88a7701e","integrity":"sha256-+19Xu1i3TSM3e62ZVKdauI0Vh69oVGzhN6aueoincB4="},"flags/4x3/kz-39edc952c598c71be2c9510944a8faf708d8e4b367b5ad78a688d1cd37f522eb.svg":{"logical_path":"flags/4x3/kz.svg","mtime":"2020-02-08T21:52:35+01:00","size":11339,"digest":"39edc952c598c71be2c9510944a8faf708d8e4b367b5ad78a688d1cd37f522eb","integrity":"sha256-Oe3JUsWYxxviyVEJRKj69wjY5LNnta14pojRzTf1Ius="},"flags/1x1/kz-924c04dc19267b049f35213af0e2b0c540933c06389433cb4aacd8dda33b286c.svg":{"logical_path":"flags/1x1/kz.svg","mtime":"2020-02-08T21:52:35+01:00","size":11433,"digest":"924c04dc19267b049f35213af0e2b0c540933c06389433cb4aacd8dda33b286c","integrity":"sha256-kkwE3BkmewSfNSE68OKwxUCTPAY4lDPLSqzY3aM7KGw="},"flags/4x3/la-e3a36a3bd0003442c3a21d3a192995fa6fb3b3c08a2daadc8f38f62736b5b1e3.svg":{"logical_path":"flags/4x3/la.svg","mtime":"2020-02-08T21:52:35+01:00","size":457,"digest":"e3a36a3bd0003442c3a21d3a192995fa6fb3b3c08a2daadc8f38f62736b5b1e3","integrity":"sha256-46NqO9AANELDoh06GSmV+m+zs8CKLarcjzj2Jza1seM="},"flags/1x1/la-c9d4223a897e5e2938a4892bbc593d3828093b9439fc3f6de21520e4013ddbc5.svg":{"logical_path":"flags/1x1/la.svg","mtime":"2020-02-08T21:52:35+01:00","size":507,"digest":"c9d4223a897e5e2938a4892bbc593d3828093b9439fc3f6de21520e4013ddbc5","integrity":"sha256-ydQiOol+Xik4pIkrvFk9OCgJO5Q5/D9t4hUg5AE928U="},"flags/4x3/lb-508c2a5a9b50d604895675b9f1c1e5914c394a7f468f5d823eb0476acaacbc7f.svg":{"logical_path":"flags/4x3/lb.svg","mtime":"2020-02-08T21:52:35+01:00","size":2814,"digest":"508c2a5a9b50d604895675b9f1c1e5914c394a7f468f5d823eb0476acaacbc7f","integrity":"sha256-UIwqWptQ1gSJVnW58cHlkUw5Sn9Gj12CPrBHasqsvH8="},"flags/1x1/lb-10c9ba8ea7aa3189f16a7273c837982a887fc4ddfc9d514d8f5a660d72356f7f.svg":{"logical_path":"flags/1x1/lb.svg","mtime":"2020-02-08T21:52:35+01:00","size":2754,"digest":"10c9ba8ea7aa3189f16a7273c837982a887fc4ddfc9d514d8f5a660d72356f7f","integrity":"sha256-EMm6jqeqMYnxanJzyDeYKoh/xN38nVFNj1pmDXI1b38="},"flags/4x3/lc-04ccd92fb1578654181febaea30ebd6b6620f56115730b2a2d673c712307bf5c.svg":{"logical_path":"flags/4x3/lc.svg","mtime":"2020-02-08T21:52:35+01:00","size":373,"digest":"04ccd92fb1578654181febaea30ebd6b6620f56115730b2a2d673c712307bf5c","integrity":"sha256-BMzZL7FXhlQYH+uuow69a2Yg9WEVcwsqLWc8cSMHv1w="},"flags/1x1/lc-4ffb53afb8bd296d526ac26fd8007afc74855e92833a893d3c934a5d12eb152a.svg":{"logical_path":"flags/1x1/lc.svg","mtime":"2020-02-08T21:52:35+01:00","size":373,"digest":"4ffb53afb8bd296d526ac26fd8007afc74855e92833a893d3c934a5d12eb152a","integrity":"sha256-T/tTr7i9KW1SasJv2AB6/HSFXpKDOok9PJNKXRLrFSo="},"flags/4x3/li-3058dc4aeaf2bd2da8cb910892137d732b56e5e9d342e565a4059de1a8e40e40.svg":{"logical_path":"flags/4x3/li.svg","mtime":"2020-02-08T21:52:35+01:00","size":8327,"digest":"3058dc4aeaf2bd2da8cb910892137d732b56e5e9d342e565a4059de1a8e40e40","integrity":"sha256-MFjcSuryvS2oy5EIkhN9cytW5enTQuVlpAWd4ajkDkA="},"flags/1x1/li-0780a4f218b9ee466e33d14274b8a01575a86b3787b347e3269a3b301c220d5f.svg":{"logical_path":"flags/1x1/li.svg","mtime":"2020-02-08T21:52:35+01:00","size":8350,"digest":"0780a4f218b9ee466e33d14274b8a01575a86b3787b347e3269a3b301c220d5f","integrity":"sha256-B4Ck8hi57kZuM9FCdLigFXWoazeHs0fjJpo7MBwiDV8="},"flags/4x3/lk-a13d6ab1da51be3b1d2c5b80f4d866c923d42b017e197469e1bfc0dd021c4bfe.svg":{"logical_path":"flags/4x3/lk.svg","mtime":"2020-02-08T21:52:35+01:00","size":11333,"digest":"a13d6ab1da51be3b1d2c5b80f4d866c923d42b017e197469e1bfc0dd021c4bfe","integrity":"sha256-oT1qsdpRvjsdLFuA9NhmySPUKwF+GXRp4b/A3QIcS/4="},"flags/1x1/lk-99759363f0df6b868fd1398bf05666c680bafe1eeec8b859b64d450930213e02.svg":{"logical_path":"flags/1x1/lk.svg","mtime":"2020-02-08T21:52:35+01:00","size":11345,"digest":"99759363f0df6b868fd1398bf05666c680bafe1eeec8b859b64d450930213e02","integrity":"sha256-mXWTY/Dfa4aP0TmL8FZmxoC6/h7uyLhZtk1FCTAhPgI="},"flags/4x3/lr-b06a1d70899826b305ce387fa31e1fa0bdb3bcb17c1392f15f995ce1dba723cf.svg":{"logical_path":"flags/4x3/lr.svg","mtime":"2020-02-08T21:52:35+01:00","size":724,"digest":"b06a1d70899826b305ce387fa31e1fa0bdb3bcb17c1392f15f995ce1dba723cf","integrity":"sha256-sGodcImYJrMFzjh/ox4foL2zvLF8E5LxX5lc4dunI88="},"flags/1x1/lr-820a9d023e5b1e68ed640bfaba8f84ad4379c42a6c5c982cb76b0390dd2bcbdd.svg":{"logical_path":"flags/1x1/lr.svg","mtime":"2020-02-08T21:52:35+01:00","size":697,"digest":"820a9d023e5b1e68ed640bfaba8f84ad4379c42a6c5c982cb76b0390dd2bcbdd","integrity":"sha256-ggqdAj5bHmjtZAv6uo+ErUN5xCpsXJgst2sDkN0ry90="},"flags/4x3/ls-d02bcefe7c298c153665f35c33eedb08e2e2b345350e4bf1714a87abf86b2d0e.svg":{"logical_path":"flags/4x3/ls.svg","mtime":"2020-02-08T21:52:35+01:00","size":1222,"digest":"d02bcefe7c298c153665f35c33eedb08e2e2b345350e4bf1714a87abf86b2d0e","integrity":"sha256-0CvO/nwpjBU2ZfNcM+7bCOLis0U1DkvxcUqHq/hrLQ4="},"flags/1x1/ls-85c731c313a46db12bdb27fe229e9f7d052b447c624663b73ffa1dbab97f03fb.svg":{"logical_path":"flags/1x1/ls.svg","mtime":"2020-02-08T21:52:35+01:00","size":1245,"digest":"85c731c313a46db12bdb27fe229e9f7d052b447c624663b73ffa1dbab97f03fb","integrity":"sha256-hccxwxOkbbEr2yf+Ip6ffQUrRHxiRmO3P/odurl/A/s="},"flags/4x3/lt-c08eb18a15d2003cb544432b11c5081d3d5741370669b4df306d1c6bce14cb51.svg":{"logical_path":"flags/4x3/lt.svg","mtime":"2020-02-08T21:52:35+01:00","size":445,"digest":"c08eb18a15d2003cb544432b11c5081d3d5741370669b4df306d1c6bce14cb51","integrity":"sha256-wI6xihXSADy1REMrEcUIHT1XQTcGabTfMG0ca84Uy1E="},"flags/1x1/lt-c1bd7e3d289ac9b0df06d47237780eaf4d30f01281ed50a7df9a22bc3a2489c5.svg":{"logical_path":"flags/1x1/lt.svg","mtime":"2020-02-08T21:52:35+01:00","size":445,"digest":"c1bd7e3d289ac9b0df06d47237780eaf4d30f01281ed50a7df9a22bc3a2489c5","integrity":"sha256-wb1+PSiaybDfBtRyN3gOr00w8BKB7VCn35oivDokicU="},"flags/4x3/lu-99e7b6adb3a9e0f867b17eb3b1f0f33db92fd27cfd7b651f62453f359bace22f.svg":{"logical_path":"flags/4x3/lu.svg","mtime":"2020-02-08T21:52:35+01:00","size":231,"digest":"99e7b6adb3a9e0f867b17eb3b1f0f33db92fd27cfd7b651f62453f359bace22f","integrity":"sha256-mee2rbOp4PhnsX6zsfDzPbkv0nz9e2UfYkU/NZus4i8="},"flags/1x1/lu-ab544445f16afa450549288ac86c2cc9a458a9d7747b3a89d5ecef7db9c83ce7.svg":{"logical_path":"flags/1x1/lu.svg","mtime":"2020-02-08T21:52:35+01:00","size":235,"digest":"ab544445f16afa450549288ac86c2cc9a458a9d7747b3a89d5ecef7db9c83ce7","integrity":"sha256-q1RERfFq+kUFSSiKyGwsyaRYqdd0ezqJ1ezvfbnIPOc="},"flags/4x3/lv-f8844d50b89f0369f73d580d3676553e7e55dd8ab2460e592a29a530d9bed886.svg":{"logical_path":"flags/4x3/lv.svg","mtime":"2020-02-08T21:52:35+01:00","size":236,"digest":"f8844d50b89f0369f73d580d3676553e7e55dd8ab2460e592a29a530d9bed886","integrity":"sha256-+IRNULifA2n3PVgNNnZVPn5V3YqyRg5ZKimlMNm+2IY="},"flags/1x1/lv-baeced49dd4249e36a25b0f23a5c601a69e9dee3137627cd4450194b85a99dd4.svg":{"logical_path":"flags/1x1/lv.svg","mtime":"2020-02-08T21:52:35+01:00","size":240,"digest":"baeced49dd4249e36a25b0f23a5c601a69e9dee3137627cd4450194b85a99dd4","integrity":"sha256-uuztSd1CSeNqJbDyOlxgGmnp3uMTdifNRFAZS4WpndQ="},"flags/4x3/ly-03209121483967f9d74849fb9261de23e9ff2e02c4e40b29f1cda0631b8a5fae.svg":{"logical_path":"flags/4x3/ly.svg","mtime":"2020-02-08T21:52:35+01:00","size":534,"digest":"03209121483967f9d74849fb9261de23e9ff2e02c4e40b29f1cda0631b8a5fae","integrity":"sha256-AyCRIUg5Z/nXSEn7kmHeI+n/LgLE5Asp8c2gYxuKX64="},"flags/1x1/ly-1e6e070aaa4bfc97a5a446a39bf746ab3c4c81d9f62c975cab164e16de3a3ffe.svg":{"logical_path":"flags/1x1/ly.svg","mtime":"2020-02-08T21:52:35+01:00","size":533,"digest":"1e6e070aaa4bfc97a5a446a39bf746ab3c4c81d9f62c975cab164e16de3a3ffe","integrity":"sha256-Hm4HCqpL/JelpEajm/dGqzxMgdn2LJdcqxZOFt46P/4="},"flags/4x3/ma-9a25cc7c2868fa45b251dd1b99a0be3b583df69732146142020fe9c6c0c95b63.svg":{"logical_path":"flags/4x3/ma.svg","mtime":"2020-02-08T21:52:35+01:00","size":253,"digest":"9a25cc7c2868fa45b251dd1b99a0be3b583df69732146142020fe9c6c0c95b63","integrity":"sha256-miXMfCho+kWyUd0bmaC+O1g99pcyFGFCAg/pxsDJW2M="},"flags/1x1/ma-4f18b9c355b8b8bf0db69badb235a183dbd558deb6439bf03b4f18e56837a7f3.svg":{"logical_path":"flags/1x1/ma.svg","mtime":"2020-02-08T21:52:35+01:00","size":253,"digest":"4f18b9c355b8b8bf0db69badb235a183dbd558deb6439bf03b4f18e56837a7f3","integrity":"sha256-Txi5w1W4uL8NtputsjWhg9vVWN62Q5vwO08Y5Wg3p/M="},"flags/4x3/mc-b0c50599ea2a550680a6a867579930e0b47d3e05193a7294a26b7849a7ad35e2.svg":{"logical_path":"flags/4x3/mc.svg","mtime":"2020-02-08T21:52:35+01:00","size":240,"digest":"b0c50599ea2a550680a6a867579930e0b47d3e05193a7294a26b7849a7ad35e2","integrity":"sha256-sMUFmeoqVQaApqhnV5kw4LR9PgUZOnKUomt4SaetNeI="},"flags/1x1/mc-8f1fe6210338399d8791d91f39234b1a09acf2aa5e0387696048dc7068534a28.svg":{"logical_path":"flags/1x1/mc.svg","mtime":"2020-02-08T21:52:35+01:00","size":240,"digest":"8f1fe6210338399d8791d91f39234b1a09acf2aa5e0387696048dc7068534a28","integrity":"sha256-jx/mIQM4OZ2HkdkfOSNLGgms8qpeA4dpYEjccGhTSig="},"flags/4x3/md-8849eef7bdf916e962f7bb31af87c8d47aef33f9f4a2017b2ce55c4166e79643.svg":{"logical_path":"flags/4x3/md.svg","mtime":"2020-02-08T21:52:35+01:00","size":11283,"digest":"8849eef7bdf916e962f7bb31af87c8d47aef33f9f4a2017b2ce55c4166e79643","integrity":"sha256-iEnu9735Fuli97sxr4fI1HrvM/n0ogF7LOVcQWbnlkM="},"flags/1x1/md-43f1bb4157545abe6e79215459efb548d913bbe7922078cd40cb722a4e19d9b4.svg":{"logical_path":"flags/1x1/md.svg","mtime":"2020-02-08T21:52:35+01:00","size":11387,"digest":"43f1bb4157545abe6e79215459efb548d913bbe7922078cd40cb722a4e19d9b4","integrity":"sha256-Q/G7QVdUWr5ueSFUWe+1SNkTu+eSIHjNQMtyKk4Z2bQ="},"flags/4x3/me-983d452d43cfb8d628bfc5c0cf4991c2ba3cf0e39e70aa5353cfd4e9ec3da62d.svg":{"logical_path":"flags/4x3/me.svg","mtime":"2020-02-08T21:52:35+01:00","size":63177,"digest":"983d452d43cfb8d628bfc5c0cf4991c2ba3cf0e39e70aa5353cfd4e9ec3da62d","integrity":"sha256-mD1FLUPPuNYov8XAz0mRwro88OOecKpTU8/U6ew9pi0="},"flags/1x1/me-104d6a96038ef06d3d8b89c9221996f3649b5b821139b11b2e07695b0f6fda2f.svg":{"logical_path":"flags/1x1/me.svg","mtime":"2020-02-08T21:52:35+01:00","size":64191,"digest":"104d6a96038ef06d3d8b89c9221996f3649b5b821139b11b2e07695b0f6fda2f","integrity":"sha256-EE1qlgOO8G09i4nJIhmW82SbW4IRObEbLgdpWw9v2i8="},"flags/4x3/mf-31fb851bfcc2340d2fa43e86a099cc7becfc8e7f996a4d2ca56bd050e6537086.svg":{"logical_path":"flags/4x3/mf.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"31fb851bfcc2340d2fa43e86a099cc7becfc8e7f996a4d2ca56bd050e6537086","integrity":"sha256-MfuFG/zCNA0vpD6GoJnMe+z8jn+Zak0spWvQUOZTcIY="},"flags/1x1/mf-fe20ce9bf911631d6e79edf21c8cff0716f2dc1ffded39515735444d9a66fa55.svg":{"logical_path":"flags/1x1/mf.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"fe20ce9bf911631d6e79edf21c8cff0716f2dc1ffded39515735444d9a66fa55","integrity":"sha256-/iDOm/kRYx1uee3yHIz/Bxby3B/97TlRVzVETZpm+lU="},"flags/4x3/mg-5effe963e29f804a26f95dbbc9519add454a0fd9eb918ddfeb55e1e99a1a2701.svg":{"logical_path":"flags/4x3/mg.svg","mtime":"2020-02-08T21:52:35+01:00","size":305,"digest":"5effe963e29f804a26f95dbbc9519add454a0fd9eb918ddfeb55e1e99a1a2701","integrity":"sha256-Xv/pY+KfgEom+V27yVGa3UVKD9nrkY3f61Xh6ZoaJwE="},"flags/1x1/mg-9e546cfb78810d9b25c814a84aadd6907880b8e0cdd2e4e30738b519e7c1ac91.svg":{"logical_path":"flags/1x1/mg.svg","mtime":"2020-02-08T21:52:35+01:00","size":305,"digest":"9e546cfb78810d9b25c814a84aadd6907880b8e0cdd2e4e30738b519e7c1ac91","integrity":"sha256-nlRs+3iBDZslyBSoSq3WkHiAuODN0uTjBzi1GefBrJE="},"flags/4x3/mh-d8cfd123007dbb99aa700c335957926a6d5e877ab49680c79629a32716d7a782.svg":{"logical_path":"flags/4x3/mh.svg","mtime":"2020-02-08T21:52:35+01:00","size":744,"digest":"d8cfd123007dbb99aa700c335957926a6d5e877ab49680c79629a32716d7a782","integrity":"sha256-2M/RIwB9u5mqcAwzWVeSam1eh3q0loDHlimjJxbXp4I="},"flags/1x1/mh-3fe03d4d063a4729fc8b68fd5e9d7d2eef6e65c4e82954c83f76b138cea2eb45.svg":{"logical_path":"flags/1x1/mh.svg","mtime":"2020-02-08T21:52:35+01:00","size":767,"digest":"3fe03d4d063a4729fc8b68fd5e9d7d2eef6e65c4e82954c83f76b138cea2eb45","integrity":"sha256-P+A9TQY6Ryn8i2j9Xp19Lu9uZcToKVTIP3axOM6i60U="},"flags/4x3/mk-6e8071d15f2ff125d30bf89d000dcb47db9545cf9b7ff04f1474650ec2f4d25c.svg":{"logical_path":"flags/4x3/mk.svg","mtime":"2020-02-08T21:52:35+01:00","size":385,"digest":"6e8071d15f2ff125d30bf89d000dcb47db9545cf9b7ff04f1474650ec2f4d25c","integrity":"sha256-boBx0V8v8SXTC/idAA3LR9uVRc+bf/BPFHRlDsL00lw="},"flags/1x1/mk-fdc9212f9f311cbface56b6587468a2e845111b697edc11b7edda9fcf100c1d5.svg":{"logical_path":"flags/1x1/mk.svg","mtime":"2020-02-08T21:52:35+01:00","size":413,"digest":"fdc9212f9f311cbface56b6587468a2e845111b697edc11b7edda9fcf100c1d5","integrity":"sha256-/ckhL58xHL+s5Wtlh0aKLoRREbaX7cEbft2p/PEAwdU="},"flags/4x3/ml-a730102e0c6f6362de9c10ef8da6cf7b123465d01a297e7a89808b01fa4771cd.svg":{"logical_path":"flags/4x3/ml.svg","mtime":"2020-02-08T21:52:35+01:00","size":279,"digest":"a730102e0c6f6362de9c10ef8da6cf7b123465d01a297e7a89808b01fa4771cd","integrity":"sha256-pzAQLgxvY2LenBDvjabPexI0ZdAaKX56iYCLAfpHcc0="},"flags/1x1/ml-a661355da206b0cb7ac4c84b6cdf7e411fbca8fcb271ae999fa60d5c67578192.svg":{"logical_path":"flags/1x1/ml.svg","mtime":"2020-02-08T21:52:35+01:00","size":282,"digest":"a661355da206b0cb7ac4c84b6cdf7e411fbca8fcb271ae999fa60d5c67578192","integrity":"sha256-pmE1XaIGsMt6xMhLbN9+QR+8qPyyca6Zn6YNXGdXgZI="},"flags/4x3/mm-6d0d207d662477110f2b863488088818d8400386358dcbc669a2d8c54d1bae16.svg":{"logical_path":"flags/4x3/mm.svg","mtime":"2020-02-08T21:52:35+01:00","size":851,"digest":"6d0d207d662477110f2b863488088818d8400386358dcbc669a2d8c54d1bae16","integrity":"sha256-bQ0gfWYkdxEPK4Y0iAiIGNhAA4Y1jcvGaaLYxU0brhY="},"flags/1x1/mm-de7d46b6543343af61ba997045cb41a707bd0db1e7a5879971ca8fddcbdf9e99.svg":{"logical_path":"flags/1x1/mm.svg","mtime":"2020-02-08T21:52:35+01:00","size":868,"digest":"de7d46b6543343af61ba997045cb41a707bd0db1e7a5879971ca8fddcbdf9e99","integrity":"sha256-3n1GtlQzQ69huplwRctBpwe9DbHnpYeZccqP3cvfnpk="},"flags/4x3/mn-656eb51e88bfce82401e4080eb791ddf16d571cbba102cdd4316c5de4711ac65.svg":{"logical_path":"flags/4x3/mn.svg","mtime":"2020-02-08T21:52:35+01:00","size":1256,"digest":"656eb51e88bfce82401e4080eb791ddf16d571cbba102cdd4316c5de4711ac65","integrity":"sha256-ZW61Hoi/zoJAHkCA63kd3xbVccu6ECzdQxbF3kcRrGU="},"flags/1x1/mn-ad22cb2c195a7d8ca8e4174db011d5f58238ee25039b5b2da2649d8ca8b00123.svg":{"logical_path":"flags/1x1/mn.svg","mtime":"2020-02-08T21:52:35+01:00","size":1263,"digest":"ad22cb2c195a7d8ca8e4174db011d5f58238ee25039b5b2da2649d8ca8b00123","integrity":"sha256-rSLLLBlafYyo5BdNsBHV9YI47iUDm1stomSdjKiwASM="},"flags/4x3/mo-37a1088aa687af13951bc93886e3e51cb246eccfde1b56528f189327ea291792.svg":{"logical_path":"flags/4x3/mo.svg","mtime":"2020-02-08T21:52:35+01:00","size":1516,"digest":"37a1088aa687af13951bc93886e3e51cb246eccfde1b56528f189327ea291792","integrity":"sha256-N6EIiqaHrxOVG8k4huPlHLJG7M/eG1ZSjxiTJ+opF5I="},"flags/1x1/mo-b463a1c37b69131d662e3fb2ae937583458824a09bcf68fc7ed2d7fd729138d1.svg":{"logical_path":"flags/1x1/mo.svg","mtime":"2020-02-08T21:52:35+01:00","size":1550,"digest":"b463a1c37b69131d662e3fb2ae937583458824a09bcf68fc7ed2d7fd729138d1","integrity":"sha256-tGOhw3tpEx1mLj+yrpN1g0WIJKCbz2j8ftLX/XKRONE="},"flags/4x3/mp-ecd12cadc358fdf293e856c0a3ffc09409123cabd3c7201225b2d21b59551e14.svg":{"logical_path":"flags/4x3/mp.svg","mtime":"2020-02-08T21:52:35+01:00","size":23425,"digest":"ecd12cadc358fdf293e856c0a3ffc09409123cabd3c7201225b2d21b59551e14","integrity":"sha256-7NEsrcNY/fKT6FbAo//AlAkSPKvTxyASJbLSG1lVHhQ="},"flags/1x1/mp-d1f4ba10c1409e713253f1fbb107eeccbd4ec1a8f9036663f1ac1991aee53835.svg":{"logical_path":"flags/1x1/mp.svg","mtime":"2020-02-08T21:52:35+01:00","size":23663,"digest":"d1f4ba10c1409e713253f1fbb107eeccbd4ec1a8f9036663f1ac1991aee53835","integrity":"sha256-0fS6EMFAnnEyU/H7sQfuzL1Owaj5A2Zj8awZka7lODU="},"flags/4x3/mq-b4e1b08a93c1364c79e6d61f95b16fca5b884da6e77835bc0e0adfff8ecc2d7f.svg":{"logical_path":"flags/4x3/mq.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"b4e1b08a93c1364c79e6d61f95b16fca5b884da6e77835bc0e0adfff8ecc2d7f","integrity":"sha256-tOGwipPBNkx55tYflbFvyluITabneDW8Dgrf/47MLX8="},"flags/1x1/mq-19cb6f7cb7354c3fd40e987c93a2d76329d34b2ed3873c3f25fe56802f251ea8.svg":{"logical_path":"flags/1x1/mq.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"19cb6f7cb7354c3fd40e987c93a2d76329d34b2ed3873c3f25fe56802f251ea8","integrity":"sha256-GctvfLc1TD/UDph8k6LXYynTSy7Thzw/Jf5WgC8lHqg="},"flags/4x3/mr-9f64af3ed5c6d8d1f68b5cb09fd1aa9d28c3c95107e063f64a0ef95f0cb9429a.svg":{"logical_path":"flags/4x3/mr.svg","mtime":"2020-02-08T21:52:35+01:00","size":450,"digest":"9f64af3ed5c6d8d1f68b5cb09fd1aa9d28c3c95107e063f64a0ef95f0cb9429a","integrity":"sha256-n2SvPtXG2NH2i1ywn9GqnSjDyVEH4GP2Sg75Xwy5Qpo="},"flags/1x1/mr-0e79b7bcc669bb871d94021db2b78b162b9867c7eaf934d8f7a3025fd5903576.svg":{"logical_path":"flags/1x1/mr.svg","mtime":"2020-02-08T21:52:35+01:00","size":438,"digest":"0e79b7bcc669bb871d94021db2b78b162b9867c7eaf934d8f7a3025fd5903576","integrity":"sha256-Dnm3vMZpu4cdlAIdsreLFiuYZ8fq+TTY96MCX9WQNXY="},"flags/4x3/ms-32620dd70353777b2ee62951556976f398cd38ae359b5a8c97311a1dc61eb8bc.svg":{"logical_path":"flags/4x3/ms.svg","mtime":"2020-02-08T21:52:35+01:00","size":6792,"digest":"32620dd70353777b2ee62951556976f398cd38ae359b5a8c97311a1dc61eb8bc","integrity":"sha256-MmIN1wNTd3su5ilRVWl285jNOK41m1qMlzEaHcYeuLw="},"flags/1x1/ms-4104d4f36cb5cf1c6de78e52e90bc3c5b8bfa262617b16a737673feb8c30a00c.svg":{"logical_path":"flags/1x1/ms.svg","mtime":"2020-02-08T21:52:35+01:00","size":6700,"digest":"4104d4f36cb5cf1c6de78e52e90bc3c5b8bfa262617b16a737673feb8c30a00c","integrity":"sha256-QQTU82y1zxxt545S6QvDxbi/omJhexanN2c/64wwoAw="},"flags/4x3/mt-0c9819aa69b34b84c1ee43620922737122eb38f107be9864a0690ac66ef8aa64.svg":{"logical_path":"flags/4x3/mt.svg","mtime":"2020-02-08T21:52:35+01:00","size":8807,"digest":"0c9819aa69b34b84c1ee43620922737122eb38f107be9864a0690ac66ef8aa64","integrity":"sha256-DJgZqmmzS4TB7kNiCSJzcSLrOPEHvphkoGkKxm74qmQ="},"flags/1x1/mt-3c3fe71f2a2bf0d961fd145ad7e48ca1e9d3a05cce514354714ba4568503d106.svg":{"logical_path":"flags/1x1/mt.svg","mtime":"2020-02-08T21:52:35+01:00","size":10519,"digest":"3c3fe71f2a2bf0d961fd145ad7e48ca1e9d3a05cce514354714ba4568503d106","integrity":"sha256-PD/nHyor8Nlh/RRa1+SMoenToFzOUUNUcUukVoUD0QY="},"flags/4x3/mu-c78c23f1499756b9db762ae434ca354d1481447fa94c66bc10aca9443b399059.svg":{"logical_path":"flags/4x3/mu.svg","mtime":"2020-02-08T21:52:35+01:00","size":322,"digest":"c78c23f1499756b9db762ae434ca354d1481447fa94c66bc10aca9443b399059","integrity":"sha256-x4wj8UmXVrnbdirkNMo1TRSBRH+pTGa8EKypRDs5kFk="},"flags/1x1/mu-91ebc79d0fa306127ea8b7a33f77d5b28f35c516ea91ff0468c7344dc838db69.svg":{"logical_path":"flags/1x1/mu.svg","mtime":"2020-02-08T21:52:35+01:00","size":322,"digest":"91ebc79d0fa306127ea8b7a33f77d5b28f35c516ea91ff0468c7344dc838db69","integrity":"sha256-kevHnQ+jBhJ+qLejP3fVso81xRbqkf8EaMc0Tcg422k="},"flags/4x3/mv-a17c947e17adae6aacef01a3e131c4150aa094911b53fbaead41783683e008eb.svg":{"logical_path":"flags/4x3/mv.svg","mtime":"2020-02-08T21:52:35+01:00","size":292,"digest":"a17c947e17adae6aacef01a3e131c4150aa094911b53fbaead41783683e008eb","integrity":"sha256-oXyUfhetrmqs7wGj4THEFQqglJEbU/uurUF4NoPgCOs="},"flags/1x1/mv-d138e94d9d2ed093ef1425c1164493b780202f9a7f7937241a7b081b79ff8b01.svg":{"logical_path":"flags/1x1/mv.svg","mtime":"2020-02-08T21:52:35+01:00","size":310,"digest":"d138e94d9d2ed093ef1425c1164493b780202f9a7f7937241a7b081b79ff8b01","integrity":"sha256-0TjpTZ0u0JPvFCXBFkSTt4AgL5p/eTckGnsIG3n/iwE="},"flags/4x3/mw-21f116afdf71df80e3c59084c6ba640814fa5389430328ff55c9403b5c239632.svg":{"logical_path":"flags/4x3/mw.svg","mtime":"2020-02-08T21:52:35+01:00","size":3721,"digest":"21f116afdf71df80e3c59084c6ba640814fa5389430328ff55c9403b5c239632","integrity":"sha256-IfEWr99x34DjxZCExrpkCBT6U4lDAyj/VclAO1wjljI="},"flags/1x1/mw-5c2228d3f1cf1f9cf8cb158e813202981828c11e8caf117836fc57fa6bc1c788.svg":{"logical_path":"flags/1x1/mw.svg","mtime":"2020-02-08T21:52:35+01:00","size":3930,"digest":"5c2228d3f1cf1f9cf8cb158e813202981828c11e8caf117836fc57fa6bc1c788","integrity":"sha256-XCIo0/HPH5z4yxWOgTICmBgowR6MrxF4NvxX+mvBx4g="},"flags/4x3/mx-a235f9b16921590b7e78caa6f76339361356946eaf0046badd10732b4647c0b6.svg":{"logical_path":"flags/4x3/mx.svg","mtime":"2020-02-08T21:52:35+01:00","size":95864,"digest":"a235f9b16921590b7e78caa6f76339361356946eaf0046badd10732b4647c0b6","integrity":"sha256-ojX5sWkhWQt+eMqm92M5NhNWlG6vAEa63RBzK0ZHwLY="},"flags/1x1/mx-cdab01ebcdccc020ca16e1355ef1fd18ca0043b501f399ca8edc48adfa8c7292.svg":{"logical_path":"flags/1x1/mx.svg","mtime":"2020-02-08T21:52:35+01:00","size":91341,"digest":"cdab01ebcdccc020ca16e1355ef1fd18ca0043b501f399ca8edc48adfa8c7292","integrity":"sha256-zasB683MwCDKFuE1XvH9GMoAQ7UB85nKjtxIrfqMcpI="},"flags/4x3/my-0ed63574cf5f20c0663ab8cd1f700e150fb641fd0b93602ba013abbfaae5ee59.svg":{"logical_path":"flags/4x3/my.svg","mtime":"2020-02-08T21:52:35+01:00","size":1284,"digest":"0ed63574cf5f20c0663ab8cd1f700e150fb641fd0b93602ba013abbfaae5ee59","integrity":"sha256-DtY1dM9fIMBmOrjNH3AOFQ+2Qf0Lk2AroBOrv6rl7lk="},"flags/1x1/my-5e8d31ef06ffc8af33a5616d760592ecd022c52afc8ba33c721f1e4989da0628.svg":{"logical_path":"flags/1x1/my.svg","mtime":"2020-02-08T21:52:35+01:00","size":1275,"digest":"5e8d31ef06ffc8af33a5616d760592ecd022c52afc8ba33c721f1e4989da0628","integrity":"sha256-Xo0x7wb/yK8zpWFtdgWS7NAixSr8i6M8ch8eSYnaBig="},"flags/4x3/mz-752e2293917b1d2ece3f097104caeadf6a679054a779e9d3be8e49dc324bb88a.svg":{"logical_path":"flags/4x3/mz.svg","mtime":"2020-02-08T21:52:35+01:00","size":2623,"digest":"752e2293917b1d2ece3f097104caeadf6a679054a779e9d3be8e49dc324bb88a","integrity":"sha256-dS4ik5F7HS7OPwlxBMrq32pnkFSneenTvo5J3DJLuIo="},"flags/1x1/mz-300cba975ad43c962ceca0d266ded1fe3d21d6b4d701d657fb42b27268ea2964.svg":{"logical_path":"flags/1x1/mz.svg","mtime":"2020-02-08T21:52:35+01:00","size":2604,"digest":"300cba975ad43c962ceca0d266ded1fe3d21d6b4d701d657fb42b27268ea2964","integrity":"sha256-MAy6l1rUPJYs7KDSZt7R/j0h1rTXAdZX+0KycmjqKWQ="},"flags/4x3/na-a0655a2e70751278e6a60d31e818f672864a6e68e8b3d3361b2fbb70fa9bfef8.svg":{"logical_path":"flags/4x3/na.svg","mtime":"2020-02-08T21:52:35+01:00","size":1005,"digest":"a0655a2e70751278e6a60d31e818f672864a6e68e8b3d3361b2fbb70fa9bfef8","integrity":"sha256-oGVaLnB1Enjmpg0x6Bj2coZKbmjos9M2Gy+7cPqb/vg="},"flags/1x1/na-1ce089a189db5be15eb05df8155f9bd017b61fc1a497e5b3021ff2ca664e122d.svg":{"logical_path":"flags/1x1/na.svg","mtime":"2020-02-08T21:52:35+01:00","size":983,"digest":"1ce089a189db5be15eb05df8155f9bd017b61fc1a497e5b3021ff2ca664e122d","integrity":"sha256-HOCJoYnbW+FesF34FV+b0Be2H8Gkl+WzAh/yymZOEi0="},"flags/4x3/nc-0c7171d91c44414ed69808611db588f1283ee7e34ea8a74a9a5101ba4b1cb305.svg":{"logical_path":"flags/4x3/nc.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"0c7171d91c44414ed69808611db588f1283ee7e34ea8a74a9a5101ba4b1cb305","integrity":"sha256-DHFx2RxEQU7WmAhhHbWI8Sg+5+NOqKdKmlEBukscswU="},"flags/1x1/nc-d3a1629f06dc3200af7669f2d895fce1908d2c1ca02d71e530bdfa6646a9516c.svg":{"logical_path":"flags/1x1/nc.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"d3a1629f06dc3200af7669f2d895fce1908d2c1ca02d71e530bdfa6646a9516c","integrity":"sha256-06FinwbcMgCvdmny2JX84ZCNLBygLXHlML36ZkapUWw="},"flags/4x3/ne-2b61d30a6cb4554535538e3b753926853e8c629a494a347286b9731c803548e4.svg":{"logical_path":"flags/4x3/ne.svg","mtime":"2020-02-08T21:52:35+01:00","size":279,"digest":"2b61d30a6cb4554535538e3b753926853e8c629a494a347286b9731c803548e4","integrity":"sha256-K2HTCmy0VUU1U447dTkmhT6MYppJSjRyhrlzHIA1SOQ="},"flags/1x1/ne-9c5f798ccd7d3dd3771ae628b4a39dfb2a4578fefd2e006f3ce89c3e494d0cb1.svg":{"logical_path":"flags/1x1/ne.svg","mtime":"2020-02-08T21:52:35+01:00","size":285,"digest":"9c5f798ccd7d3dd3771ae628b4a39dfb2a4578fefd2e006f3ce89c3e494d0cb1","integrity":"sha256-nF95jM19PdN3GuYotKOd+ypFeP79LgBvPOicPklNDLE="},"flags/4x3/nf-4e615baa83a8b4db3e39fe1d251ab913943d64e0cd320f251d619ab54e7512d3.svg":{"logical_path":"flags/4x3/nf.svg","mtime":"2020-02-08T21:52:35+01:00","size":5845,"digest":"4e615baa83a8b4db3e39fe1d251ab913943d64e0cd320f251d619ab54e7512d3","integrity":"sha256-TmFbqoOotNs+Of4dJRq5E5Q9ZODNMg8lHWGatU51EtM="},"flags/1x1/nf-45403247c90050484813acf23c50f543779528e346317274373c3c24fd830103.svg":{"logical_path":"flags/1x1/nf.svg","mtime":"2020-02-08T21:52:35+01:00","size":5598,"digest":"45403247c90050484813acf23c50f543779528e346317274373c3c24fd830103","integrity":"sha256-RUAyR8kAUEhIE6zyPFD1Q3eVKONGMXJ0Nzw8JP2DAQM="},"flags/4x3/ng-d52fd188be973f31dd34e5a0b3fed0de68fe736c8a41c6028d9c248c038c8641.svg":{"logical_path":"flags/4x3/ng.svg","mtime":"2020-02-08T21:52:35+01:00","size":263,"digest":"d52fd188be973f31dd34e5a0b3fed0de68fe736c8a41c6028d9c248c038c8641","integrity":"sha256-1S/RiL6XPzHdNOWgs/7Q3mj+c2yKQcYCjZwkjAOMhkE="},"flags/1x1/ng-f22edcc5867554d69ecbe15add0fbbb1389631f3ced07a4f820065c7770c65f5.svg":{"logical_path":"flags/1x1/ng.svg","mtime":"2020-02-08T21:52:35+01:00","size":263,"digest":"f22edcc5867554d69ecbe15add0fbbb1389631f3ced07a4f820065c7770c65f5","integrity":"sha256-8i7cxYZ1VNaey+Fa3Q+7sTiWMfPO0HpPggBlx3cMZfU="},"flags/4x3/ni-2fbb883e46fbe3b2ecfed9dac004ceb546f25c77a84a5966eea224674aebc610.svg":{"logical_path":"flags/4x3/ni.svg","mtime":"2020-02-08T21:52:35+01:00","size":18584,"digest":"2fbb883e46fbe3b2ecfed9dac004ceb546f25c77a84a5966eea224674aebc610","integrity":"sha256-L7uIPkb747Ls/tnawATOtUbyXHeoSllm7qIkZ0rrxhA="},"flags/1x1/ni-214aed148b615c4846f842b47f99cf178ac62a96cf18c5dd6b23467184b56680.svg":{"logical_path":"flags/1x1/ni.svg","mtime":"2020-02-08T21:52:35+01:00","size":18664,"digest":"214aed148b615c4846f842b47f99cf178ac62a96cf18c5dd6b23467184b56680","integrity":"sha256-IUrtFIthXEhG+EK0f5nPF4rGKpbPGMXdayNGcYS1ZoA="},"flags/4x3/nl-4f0ecea529dd4c0099dd41a7801fa5ac44aa04cd872ca31e11efd58b5a813774.svg":{"logical_path":"flags/4x3/nl.svg","mtime":"2020-02-08T21:52:35+01:00","size":367,"digest":"4f0ecea529dd4c0099dd41a7801fa5ac44aa04cd872ca31e11efd58b5a813774","integrity":"sha256-Tw7OpSndTACZ3UGngB+lrESqBM2HLKMeEe/Vi1qBN3Q="},"flags/1x1/nl-9c8f60e638879d642487818975e58c61cd3102f0e68c360708243c076436ff68.svg":{"logical_path":"flags/1x1/nl.svg","mtime":"2020-02-08T21:52:35+01:00","size":375,"digest":"9c8f60e638879d642487818975e58c61cd3102f0e68c360708243c076436ff68","integrity":"sha256-nI9g5jiHnWQkh4GJdeWMYc0xAvDmjDYHCCQ8B2Q2/2g="},"flags/4x3/no-270f7ee9d1d2efa6abf16f693faba8586adae842d79d8aad9e3f37e96c27cbce.svg":{"logical_path":"flags/4x3/no.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"270f7ee9d1d2efa6abf16f693faba8586adae842d79d8aad9e3f37e96c27cbce","integrity":"sha256-Jw9+6dHS76ar8W9pP6uoWGra6ELXnYqtnj836Wwny84="},"flags/1x1/no-7d377325e8c5ec4de0376e9f4c13463f183af637e6c443716f22020c7a313979.svg":{"logical_path":"flags/1x1/no.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"7d377325e8c5ec4de0376e9f4c13463f183af637e6c443716f22020c7a313979","integrity":"sha256-fTdzJejF7E3gN26fTBNGPxg69jfmxENxbyICDHoxOXk="},"flags/4x3/np-69637ddb3a173c4522a71598278aa32462e1762e34dd99c9dc99a515433a6cf8.svg":{"logical_path":"flags/4x3/np.svg","mtime":"2020-02-08T21:52:35+01:00","size":1061,"digest":"69637ddb3a173c4522a71598278aa32462e1762e34dd99c9dc99a515433a6cf8","integrity":"sha256-aWN92zoXPEUipxWYJ4qjJGLhdi403ZnJ3JmlFUM6bPg="},"flags/1x1/np-44ead118cce3a1fcbb720cc8d6eab6ecb6b62292315f61ae5963a40262ee11d2.svg":{"logical_path":"flags/1x1/np.svg","mtime":"2020-02-08T21:52:35+01:00","size":1199,"digest":"44ead118cce3a1fcbb720cc8d6eab6ecb6b62292315f61ae5963a40262ee11d2","integrity":"sha256-ROrRGMzjofy7cgzI1uq27La2IpIxX2GuWWOkAmLuEdI="},"flags/4x3/nr-0bd3c0ba7bbac4bd5985b838096eeebd67711d39065619ef092fa4bb55b22a6d.svg":{"logical_path":"flags/4x3/nr.svg","mtime":"2020-02-08T21:52:35+01:00","size":648,"digest":"0bd3c0ba7bbac4bd5985b838096eeebd67711d39065619ef092fa4bb55b22a6d","integrity":"sha256-C9PAunu6xL1Zhbg4CW7uvWdxHTkGVhnvCS+ku1WyKm0="},"flags/1x1/nr-63b9c44e5dd66a59895f52707dc24db5bd1eab6e535298d24e414c0f2dafcb3c.svg":{"logical_path":"flags/1x1/nr.svg","mtime":"2020-02-08T21:52:35+01:00","size":671,"digest":"63b9c44e5dd66a59895f52707dc24db5bd1eab6e535298d24e414c0f2dafcb3c","integrity":"sha256-Y7nETl3WalmJX1JwfcJNtb0eq25TUpjSTkFMDy2vyzw="},"flags/4x3/nu-259989e1eea0cbf6b41a33176a4c9c1eaa2e7ae6571ad80a324c6309bd5aa5fc.svg":{"logical_path":"flags/4x3/nu.svg","mtime":"2020-02-08T21:52:35+01:00","size":1748,"digest":"259989e1eea0cbf6b41a33176a4c9c1eaa2e7ae6571ad80a324c6309bd5aa5fc","integrity":"sha256-JZmJ4e6gy/a0GjMXakycHqoueuZXGtgKMkxjCb1apfw="},"flags/1x1/nu-1cb535708f64ed8b386a245e571e677e935009af92f2b214760a2832c1ee1b53.svg":{"logical_path":"flags/1x1/nu.svg","mtime":"2020-02-08T21:52:35+01:00","size":1736,"digest":"1cb535708f64ed8b386a245e571e677e935009af92f2b214760a2832c1ee1b53","integrity":"sha256-HLU1cI9k7Ys4aiReVx5nfpNQCa+S8rIUdgooMsHuG1M="},"flags/4x3/nz-90ceca2a683fbec395a91b77b0880cea99c3b2cbdb24caa5474925cbdcc3675e.svg":{"logical_path":"flags/4x3/nz.svg","mtime":"2020-02-08T21:52:35+01:00","size":3019,"digest":"90ceca2a683fbec395a91b77b0880cea99c3b2cbdb24caa5474925cbdcc3675e","integrity":"sha256-kM7KKmg/vsOVqRt3sIgM6pnDssvbJMqlR0kly9zDZ14="},"flags/1x1/nz-b0d78f165a72edd46599222a2ea5f6a91a8252975cb03e33c4ca08e389859aac.svg":{"logical_path":"flags/1x1/nz.svg","mtime":"2020-02-08T21:52:35+01:00","size":3045,"digest":"b0d78f165a72edd46599222a2ea5f6a91a8252975cb03e33c4ca08e389859aac","integrity":"sha256-sNePFlpy7dRlmSIqLqX2qRqCUpdcsD4zxMoI44mFmqw="},"flags/4x3/om-aadcca7bc7ad318400097b84849dd64c4744306cd9b4f152fba34f2e84116965.svg":{"logical_path":"flags/4x3/om.svg","mtime":"2020-02-08T21:52:35+01:00","size":22891,"digest":"aadcca7bc7ad318400097b84849dd64c4744306cd9b4f152fba34f2e84116965","integrity":"sha256-qtzKe8etMYQACXuEhJ3WTEdEMGzZtPFS+6NPLoQRaWU="},"flags/1x1/om-705e2bd2b2fc7d13c152aa06bfb9e6ee4ad8b299f8c06ca16adad0b18b2b18ed.svg":{"logical_path":"flags/1x1/om.svg","mtime":"2020-02-08T21:52:35+01:00","size":22875,"digest":"705e2bd2b2fc7d13c152aa06bfb9e6ee4ad8b299f8c06ca16adad0b18b2b18ed","integrity":"sha256-cF4r0rL8fRPBUqoGv7nm7krYspn4wGyhatrQsYsrGO0="},"flags/4x3/pa-027e679bd65dcaa2c53145a14669c1e674a467a889ef702cbe2a260f7ca8ad38.svg":{"logical_path":"flags/4x3/pa.svg","mtime":"2020-02-08T21:52:35+01:00","size":746,"digest":"027e679bd65dcaa2c53145a14669c1e674a467a889ef702cbe2a260f7ca8ad38","integrity":"sha256-An5nm9ZdyqLFMUWhRmnB5nSkZ6iJ73AsviomD3yorTg="},"flags/1x1/pa-edeb4faeadaa286de7fdc667e25d38ad0cdbccaec5023182fed6a3c74e8b09eb.svg":{"logical_path":"flags/1x1/pa.svg","mtime":"2020-02-08T21:52:35+01:00","size":662,"digest":"edeb4faeadaa286de7fdc667e25d38ad0cdbccaec5023182fed6a3c74e8b09eb","integrity":"sha256-7etPrq2qKG3n/cZn4l04rQzbzK7FAjGC/tajx06LCes="},"flags/4x3/pe-7ec59842737c90d6ff543f1831fd69b51e1e7ee1b068c3ac6259cbf2c214d611.svg":{"logical_path":"flags/4x3/pe.svg","mtime":"2020-02-08T21:52:35+01:00","size":74343,"digest":"7ec59842737c90d6ff543f1831fd69b51e1e7ee1b068c3ac6259cbf2c214d611","integrity":"sha256-fsWYQnN8kNb/VD8YMf1ptR4efuGwaMOsYlnL8sIU1hE="},"flags/1x1/pe-97d1b8ed1d4ed5e5f0348a731ca4a3a4b9abc7d440447dc87a521f229f375ed3.svg":{"logical_path":"flags/1x1/pe.svg","mtime":"2020-02-08T21:52:35+01:00","size":73629,"digest":"97d1b8ed1d4ed5e5f0348a731ca4a3a4b9abc7d440447dc87a521f229f375ed3","integrity":"sha256-l9G47R1O1eXwNIpzHKSjpLmrx9RARH3IelIfIp83XtM="},"flags/4x3/pf-27955c73c5be4043c5b7ddf64c8f46d11c6648e3b1fc0efe028b8afea21a40e1.svg":{"logical_path":"flags/4x3/pf.svg","mtime":"2020-02-08T21:52:35+01:00","size":4292,"digest":"27955c73c5be4043c5b7ddf64c8f46d11c6648e3b1fc0efe028b8afea21a40e1","integrity":"sha256-J5Vcc8W+QEPFt932TI9G0RxmSOOx/A7+AouK/qIaQOE="},"flags/1x1/pf-83e3e1d36fba45e015c62f938e6d182029edc05ebfdc50bcb33860f36f96d73a.svg":{"logical_path":"flags/1x1/pf.svg","mtime":"2020-02-08T21:52:35+01:00","size":4235,"digest":"83e3e1d36fba45e015c62f938e6d182029edc05ebfdc50bcb33860f36f96d73a","integrity":"sha256-g+Ph02+6ReAVxi+Tjm0YICntwF6/3FC8szhg82+W1zo="},"flags/4x3/pg-c2fdd2551f9044c461eccfae2d7ba0a347a99143f6002b71a429942af0217897.svg":{"logical_path":"flags/4x3/pg.svg","mtime":"2020-02-08T21:52:35+01:00","size":1671,"digest":"c2fdd2551f9044c461eccfae2d7ba0a347a99143f6002b71a429942af0217897","integrity":"sha256-wv3SVR+QRMRh7M+uLXugo0epkUP2ACtxpCmUKvAheJc="},"flags/1x1/pg-cf60257fa85f9270b1e9980e703435186110167f76c153bc460c10ee8b2d4b09.svg":{"logical_path":"flags/1x1/pg.svg","mtime":"2020-02-08T21:52:35+01:00","size":2111,"digest":"cf60257fa85f9270b1e9980e703435186110167f76c153bc460c10ee8b2d4b09","integrity":"sha256-z2Alf6hfknCx6ZgOcDQ1GGEQFn92wVO8RgwQ7ostSwk="},"flags/4x3/ph-bf3394850a6cec6a535420eabce263e7f8193413e4af1fb317c76da025388c1b.svg":{"logical_path":"flags/4x3/ph.svg","mtime":"2020-02-08T21:52:35+01:00","size":1303,"digest":"bf3394850a6cec6a535420eabce263e7f8193413e4af1fb317c76da025388c1b","integrity":"sha256-vzOUhQps7GpTVCDqvOJj5/gZNBPkrx+zF8dtoCU4jBs="},"flags/1x1/ph-006c3218effe4269252cb9638de82ea339eb2894951705c630533ceffa842169.svg":{"logical_path":"flags/1x1/ph.svg","mtime":"2020-02-08T21:52:35+01:00","size":1303,"digest":"006c3218effe4269252cb9638de82ea339eb2894951705c630533ceffa842169","integrity":"sha256-AGwyGO/+QmklLLljjeguoznrKJSVFwXGMFM87/qEIWk="},"flags/4x3/pk-b64f6a32e5bb598f57cfe49c4899c2021f2d153653f3d92101e6e11b2158e500.svg":{"logical_path":"flags/4x3/pk.svg","mtime":"2020-02-08T21:52:35+01:00","size":743,"digest":"b64f6a32e5bb598f57cfe49c4899c2021f2d153653f3d92101e6e11b2158e500","integrity":"sha256-tk9qMuW7WY9Xz+ScSJnCAh8tFTZT89khAebhGyFY5QA="},"flags/1x1/pk-d2d58def913c9081c5eeeda5f0b6895068ec13c955694e359531e23422145e60.svg":{"logical_path":"flags/1x1/pk.svg","mtime":"2020-02-08T21:52:35+01:00","size":694,"digest":"d2d58def913c9081c5eeeda5f0b6895068ec13c955694e359531e23422145e60","integrity":"sha256-0tWN75E8kIHF7u2l8LaJUGjsE8lVaU41lTHiNCIUXmA="},"flags/4x3/pl-f55a710991a94c2e6c2f9f1a7a4a36ebb84b24b7c9d9df4e1ffe86d61321fa6f.svg":{"logical_path":"flags/4x3/pl.svg","mtime":"2020-02-08T21:52:35+01:00","size":228,"digest":"f55a710991a94c2e6c2f9f1a7a4a36ebb84b24b7c9d9df4e1ffe86d61321fa6f","integrity":"sha256-9VpxCZGpTC5sL58aeko267hLJLfJ2d9OH/6G1hMh+m8="},"flags/1x1/pl-fafb539259385f2b99df910cff085710a9b4d9706b74e4e0f8a6ef627615c4e7.svg":{"logical_path":"flags/1x1/pl.svg","mtime":"2020-02-08T21:52:35+01:00","size":228,"digest":"fafb539259385f2b99df910cff085710a9b4d9706b74e4e0f8a6ef627615c4e7","integrity":"sha256-+vtTklk4XyuZ35EM/whXEKm02XBrdOTg+KbvYnYVxOc="},"flags/4x3/pm-8f6338d2ae3e0e42adc9754720ca21ad4979095cf6d7467a8db5a5a1c3e0b2a5.svg":{"logical_path":"flags/4x3/pm.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"8f6338d2ae3e0e42adc9754720ca21ad4979095cf6d7467a8db5a5a1c3e0b2a5","integrity":"sha256-j2M40q4+DkKtyXVHIMohrUl5CVz210Z6jbWlocPgsqU="},"flags/1x1/pm-63029c6198dc42c404ec39807a99528b1d198eeeea6f9a1e309548242480140b.svg":{"logical_path":"flags/1x1/pm.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"63029c6198dc42c404ec39807a99528b1d198eeeea6f9a1e309548242480140b","integrity":"sha256-YwKcYZjcQsQE7DmAeplSix0Zju7qb5oeMJVIJCSAFAs="},"flags/4x3/pn-4006c11ca83011c0dd60a13ac30b27da0578b9f1368bd8c6de5aab423f6662d8.svg":{"logical_path":"flags/4x3/pn.svg","mtime":"2020-02-08T21:52:35+01:00","size":10953,"digest":"4006c11ca83011c0dd60a13ac30b27da0578b9f1368bd8c6de5aab423f6662d8","integrity":"sha256-QAbBHKgwEcDdYKE6wwsn2gV4ufE2i9jG3lqrQj9mYtg="},"flags/1x1/pn-6c433f7f9cb79c6d5ed7bbeade8a495e3b26ca2604f4fd3995096109684ac5dd.svg":{"logical_path":"flags/1x1/pn.svg","mtime":"2020-02-08T21:52:35+01:00","size":8624,"digest":"6c433f7f9cb79c6d5ed7bbeade8a495e3b26ca2604f4fd3995096109684ac5dd","integrity":"sha256-bEM/f5y3nG1e17vq3opJXjsmyiYE9P05lQlhCWhKxd0="},"flags/4x3/pr-6287e1515fa80e2d05133ed93f14ca03a1be6909a9ef6c736fd60f9c9fe73132.svg":{"logical_path":"flags/4x3/pr.svg","mtime":"2020-02-08T21:52:35+01:00","size":634,"digest":"6287e1515fa80e2d05133ed93f14ca03a1be6909a9ef6c736fd60f9c9fe73132","integrity":"sha256-YofhUV+oDi0FEz7ZPxTKA6G+aQmp72xzb9YPnJ/nMTI="},"flags/1x1/pr-526985b3a6d2d6de577ed0ed92d0b49ce854667e3ff630304813fd5af15527cd.svg":{"logical_path":"flags/1x1/pr.svg","mtime":"2020-02-08T21:52:35+01:00","size":622,"digest":"526985b3a6d2d6de577ed0ed92d0b49ce854667e3ff630304813fd5af15527cd","integrity":"sha256-UmmFs6bS1t5XftDtktC0nOhUZn4/9jAwSBP9WvFVJ80="},"flags/4x3/ps-31f50e1fcb44b9aa6e9ce4473c3085f744e70ea0fa1fd8d85787f4e7b0c4a69b.svg":{"logical_path":"flags/4x3/ps.svg","mtime":"2020-02-08T21:52:35+01:00","size":558,"digest":"31f50e1fcb44b9aa6e9ce4473c3085f744e70ea0fa1fd8d85787f4e7b0c4a69b","integrity":"sha256-MfUOH8tEuapunORHPDCF90TnDqD6H9jYV4f057DEpps="},"flags/1x1/ps-c43918bc71bef71b24dd46e8cacc53e0df53e02dcce6199d06d11a4637f08a04.svg":{"logical_path":"flags/1x1/ps.svg","mtime":"2020-02-08T21:52:35+01:00","size":544,"digest":"c43918bc71bef71b24dd46e8cacc53e0df53e02dcce6199d06d11a4637f08a04","integrity":"sha256-xDkYvHG+9xsk3UboysxT4N9T4C3M5hmdBtEaRjfwigQ="},"flags/4x3/pt-9aab20caed714ee47fc408f017037aea94a649b3ba4d87e2da37870ee31e4f92.svg":{"logical_path":"flags/4x3/pt.svg","mtime":"2020-02-08T21:52:35+01:00","size":8393,"digest":"9aab20caed714ee47fc408f017037aea94a649b3ba4d87e2da37870ee31e4f92","integrity":"sha256-mqsgyu1xTuR/xAjwFwN66pSmSbO6TYfi2jeHDuMeT5I="},"flags/1x1/pt-a309869e5018c9690a65ebdf8a2d69d61f82772068a7920f9680ed0581ae5966.svg":{"logical_path":"flags/1x1/pt.svg","mtime":"2020-02-08T21:52:35+01:00","size":8775,"digest":"a309869e5018c9690a65ebdf8a2d69d61f82772068a7920f9680ed0581ae5966","integrity":"sha256-owmGnlAYyWkKZevfii1p1h+CdyBop5IPloDtBYGuWWY="},"flags/4x3/pw-9262037d114d0f61571c74f9a5455809709b43e6565443ae2667981eecb5f12a.svg":{"logical_path":"flags/4x3/pw.svg","mtime":"2020-02-08T21:52:35+01:00","size":467,"digest":"9262037d114d0f61571c74f9a5455809709b43e6565443ae2667981eecb5f12a","integrity":"sha256-kmIDfRFND2FXHHT5pUVYCXCbQ+ZWVEOuJmeYHuy18So="},"flags/1x1/pw-a6f42019653ae26d43c6e9b7bef83fc98cff8ec5e8d0c50ad7cb0a17d5e565a6.svg":{"logical_path":"flags/1x1/pw.svg","mtime":"2020-02-08T21:52:35+01:00","size":511,"digest":"a6f42019653ae26d43c6e9b7bef83fc98cff8ec5e8d0c50ad7cb0a17d5e565a6","integrity":"sha256-pvQgGWU64m1Dxum3vvg/yYz/jsXo0MUK18sKF9XlZaY="},"flags/4x3/py-5bc9e9f0dee94ae3d9bd80ae6fb1aac297dc81a1c592d0a73bc3383bce73af74.svg":{"logical_path":"flags/4x3/py.svg","mtime":"2020-02-08T21:52:35+01:00","size":17312,"digest":"5bc9e9f0dee94ae3d9bd80ae6fb1aac297dc81a1c592d0a73bc3383bce73af74","integrity":"sha256-W8np8N7pSuPZvYCub7GqwpfcgaHFktCnO8M4O85zr3Q="},"flags/1x1/py-182eff300f4507fd9399fb6310d1cd3b45adadd7924ad2814003c7111ec5c0de.svg":{"logical_path":"flags/1x1/py.svg","mtime":"2020-02-08T21:52:35+01:00","size":17478,"digest":"182eff300f4507fd9399fb6310d1cd3b45adadd7924ad2814003c7111ec5c0de","integrity":"sha256-GC7/MA9FB/2TmftjENHNO0WtrdeSStKBQAPHER7FwN4="},"flags/4x3/qa-32c93970f8e521850eddfaf2a89dfff987f0ae3b0b73a253c301b61cf547cf9e.svg":{"logical_path":"flags/4x3/qa.svg","mtime":"2020-02-08T21:52:35+01:00","size":362,"digest":"32c93970f8e521850eddfaf2a89dfff987f0ae3b0b73a253c301b61cf547cf9e","integrity":"sha256-Msk5cPjlIYUO3fryqJ3/+YfwrjsLc6JTwwG2HPVHz54="},"flags/1x1/qa-182e4d8ace2607d0c02d3c29d65eb084af71092357006bc41cd601981ec3b81c.svg":{"logical_path":"flags/1x1/qa.svg","mtime":"2020-02-08T21:52:35+01:00","size":359,"digest":"182e4d8ace2607d0c02d3c29d65eb084af71092357006bc41cd601981ec3b81c","integrity":"sha256-GC5Nis4mB9DALTwp1l6whK9xCSNXAGvEHNYBmB7DuBw="},"flags/4x3/re-8b2ea1f2727c266a2b80cb12a9b7195f6b656f521552b67893b6761a07f9bc92.svg":{"logical_path":"flags/4x3/re.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"8b2ea1f2727c266a2b80cb12a9b7195f6b656f521552b67893b6761a07f9bc92","integrity":"sha256-iy6h8nJ8JmorgMsSqbcZX2tlb1IVUrZ4k7Z2Ggf5vJI="},"flags/1x1/re-07eb7d855022bc678b47b0ce5fd05da5044d6dde86ad3697d4ae55c68ff447c1.svg":{"logical_path":"flags/1x1/re.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"07eb7d855022bc678b47b0ce5fd05da5044d6dde86ad3697d4ae55c68ff447c1","integrity":"sha256-B+t9hVAivGeLR7DOX9BdpQRNbd6GrTaX1K5Vxo/0R8E="},"flags/4x3/ro-4ab797571e1d9eb326486f75654a4590fd33f20444f85b77ba0997eb6138c21f.svg":{"logical_path":"flags/4x3/ro.svg","mtime":"2020-02-08T21:52:35+01:00","size":308,"digest":"4ab797571e1d9eb326486f75654a4590fd33f20444f85b77ba0997eb6138c21f","integrity":"sha256-SreXVx4dnrMmSG91ZUpFkP0z8gRE+Ft3ugmX62E4wh8="},"flags/1x1/ro-ddfcbaec04d11bf7f95abebd1d3a42b2862b1af8fca9b02764a6ed0e409a1d75.svg":{"logical_path":"flags/1x1/ro.svg","mtime":"2020-02-08T21:52:35+01:00","size":308,"digest":"ddfcbaec04d11bf7f95abebd1d3a42b2862b1af8fca9b02764a6ed0e409a1d75","integrity":"sha256-3fy67ATRG/f5Wr69HTpCsoYrGvj8qbAnZKbtDkCaHXU="},"flags/4x3/rs-dd8a52473ea40e23b393b5f4a30d1edd91865aab167f0c1835ae84b15dcce585.svg":{"logical_path":"flags/4x3/rs.svg","mtime":"2020-02-08T21:52:35+01:00","size":187640,"digest":"dd8a52473ea40e23b393b5f4a30d1edd91865aab167f0c1835ae84b15dcce585","integrity":"sha256-3YpSRz6kDiOzk7X0ow0e3ZGGWqsWfwwYNa6EsV3M5YU="},"flags/1x1/rs-42bf40209c92e4e7169daf29fbcb7253b2804eee7a463051529327f38851f865.svg":{"logical_path":"flags/1x1/rs.svg","mtime":"2020-02-08T21:52:35+01:00","size":187503,"digest":"42bf40209c92e4e7169daf29fbcb7253b2804eee7a463051529327f38851f865","integrity":"sha256-Qr9AIJyS5OcWna8p+8tyU7KATu56RjBRUpMn84hR+GU="},"flags/4x3/ru-13f4525a4caad6e31afa523d2bc4a0c1e6377c0bef1bfd872682130d3f199d1d.svg":{"logical_path":"flags/4x3/ru.svg","mtime":"2020-02-08T21:52:35+01:00","size":289,"digest":"13f4525a4caad6e31afa523d2bc4a0c1e6377c0bef1bfd872682130d3f199d1d","integrity":"sha256-E/RSWkyq1uMa+lI9K8SgweY3fAvvG/2HJoITDT8ZnR0="},"flags/1x1/ru-b9792a963faf667447e0456dba5be80a3b37c197a4284d1539a3433721d9e2fe.svg":{"logical_path":"flags/1x1/ru.svg","mtime":"2020-02-08T21:52:35+01:00","size":293,"digest":"b9792a963faf667447e0456dba5be80a3b37c197a4284d1539a3433721d9e2fe","integrity":"sha256-uXkqlj+vZnRH4EVtulvoCjs3wZekKE0VOaNDNyHZ4v4="},"flags/4x3/rw-bc38bcd6e19d2941839b253af6e863b13338cde1174874f9674471026c15e422.svg":{"logical_path":"flags/4x3/rw.svg","mtime":"2020-02-08T21:52:35+01:00","size":750,"digest":"bc38bcd6e19d2941839b253af6e863b13338cde1174874f9674471026c15e422","integrity":"sha256-vDi81uGdKUGDmyU69uhjsTM4zeEXSHT5Z0RxAmwV5CI="},"flags/1x1/rw-456698123775b83d2b0fa1b9fe073f9ccdba0b6bf39a703b8979dcce158eb32c.svg":{"logical_path":"flags/1x1/rw.svg","mtime":"2020-02-08T21:52:35+01:00","size":751,"digest":"456698123775b83d2b0fa1b9fe073f9ccdba0b6bf39a703b8979dcce158eb32c","integrity":"sha256-RWaYEjd1uD0rD6G5/gc/nM26C2vzmnA7iXnczhWOsyw="},"flags/4x3/sa-2b2fd6abb48415d5407c576c24a24fbd80af5877ef06cf2d026452f6c67f5f4d.svg":{"logical_path":"flags/4x3/sa.svg","mtime":"2020-02-08T21:52:35+01:00","size":10303,"digest":"2b2fd6abb48415d5407c576c24a24fbd80af5877ef06cf2d026452f6c67f5f4d","integrity":"sha256-Ky/Wq7SEFdVAfFdsJKJPvYCvWHfvBs8tAmRS9sZ/X00="},"flags/1x1/sa-d9ebc73e7957f86604164dd5054fb32601ad14d7dfd4bfe73da5bdd10bb2f8ae.svg":{"logical_path":"flags/1x1/sa.svg","mtime":"2020-02-08T21:52:35+01:00","size":10233,"digest":"d9ebc73e7957f86604164dd5054fb32601ad14d7dfd4bfe73da5bdd10bb2f8ae","integrity":"sha256-2evHPnlX+GYEFk3VBU+zJgGtFNff1L/nPaW90Quy+K4="},"flags/4x3/sb-37761927039d0a37ba0995c59fd31bbe36c8a0ca161e5b72b8131e3659f8dddf.svg":{"logical_path":"flags/4x3/sb.svg","mtime":"2020-02-08T21:52:35+01:00","size":950,"digest":"37761927039d0a37ba0995c59fd31bbe36c8a0ca161e5b72b8131e3659f8dddf","integrity":"sha256-N3YZJwOdCje6CZXFn9MbvjbIoMoWHltyuBMeNln43d8="},"flags/1x1/sb-bedbf8464cd82f391bfe6178c63055b650d0cf3aee60c37fa79a586f95783b79.svg":{"logical_path":"flags/1x1/sb.svg","mtime":"2020-02-08T21:52:35+01:00","size":956,"digest":"bedbf8464cd82f391bfe6178c63055b650d0cf3aee60c37fa79a586f95783b79","integrity":"sha256-vtv4RkzYLzkb/mF4xjBVtlDQzzruYMN/p5pYb5V4O3k="},"flags/4x3/sc-f6a2f8f37be93f07600b491b52cb58d80d74b92d8ace0af313f4ce081b0d1345.svg":{"logical_path":"flags/4x3/sc.svg","mtime":"2020-02-08T21:52:35+01:00","size":568,"digest":"f6a2f8f37be93f07600b491b52cb58d80d74b92d8ace0af313f4ce081b0d1345","integrity":"sha256-9qL483vpPwdgC0kbUstY2A10uS2KzgrzE/TOCBsNE0U="},"flags/1x1/sc-5dcd01b98c34460c9624280fb5047811fbae7d976620cd0a70ad4263a9085b60.svg":{"logical_path":"flags/1x1/sc.svg","mtime":"2020-02-08T21:52:35+01:00","size":573,"digest":"5dcd01b98c34460c9624280fb5047811fbae7d976620cd0a70ad4263a9085b60","integrity":"sha256-Xc0BuYw0RgyWJCgPtQR4EfuufZdmIM0KcK1CY6kIW2A="},"flags/4x3/sd-cc9cf97e8a37622b9e1bad28811d46c4471595afa448dc055e0e3aae7687fe4b.svg":{"logical_path":"flags/4x3/sd.svg","mtime":"2020-02-08T21:52:35+01:00","size":494,"digest":"cc9cf97e8a37622b9e1bad28811d46c4471595afa448dc055e0e3aae7687fe4b","integrity":"sha256-zJz5foo3YiueG60ogR1GxEcVla+kSNwFXg46rnaH/ks="},"flags/1x1/sd-1f5d13f9780085acbaad13d959b1918c796ba7b0450954b15d145e87cebe045c.svg":{"logical_path":"flags/1x1/sd.svg","mtime":"2020-02-08T21:52:35+01:00","size":496,"digest":"1f5d13f9780085acbaad13d959b1918c796ba7b0450954b15d145e87cebe045c","integrity":"sha256-H10T+XgAhay6rRPZWbGRjHlrp7BFCVSxXRReh86+BFw="},"flags/4x3/se-84b06bcd5bd90ea8dd6d1c3c8d2799a843c47b0256ce098aef75414964618286.svg":{"logical_path":"flags/4x3/se.svg","mtime":"2020-02-08T21:52:35+01:00","size":688,"digest":"84b06bcd5bd90ea8dd6d1c3c8d2799a843c47b0256ce098aef75414964618286","integrity":"sha256-hLBrzVvZDqjdbRw8jSeZqEPEewJWzgmK73VBSWRhgoY="},"flags/1x1/se-39f128686652cf914f8601110fcc9ac879bca204407013b93aff4ca4fb2ed9bc.svg":{"logical_path":"flags/1x1/se.svg","mtime":"2020-02-08T21:52:35+01:00","size":701,"digest":"39f128686652cf914f8601110fcc9ac879bca204407013b93aff4ca4fb2ed9bc","integrity":"sha256-OfEoaGZSz5FPhgERD8yayHm8ogRAcBO5Ov9MpPsu2bw="},"flags/4x3/sg-a82acd90077e76318ddb0be96999d9695b9a9f4627e8a0f341d3987a62747dcc.svg":{"logical_path":"flags/4x3/sg.svg","mtime":"2020-02-08T21:52:35+01:00","size":890,"digest":"a82acd90077e76318ddb0be96999d9695b9a9f4627e8a0f341d3987a62747dcc","integrity":"sha256-qCrNkAd+djGN2wvpaZnZaVuan0Yn6KDzQdOYemJ0fcw="},"flags/1x1/sg-c22e093634568aae249bf35f9ddcaa6796b5f27d76c39ff5336abf7f1b8a47d4.svg":{"logical_path":"flags/1x1/sg.svg","mtime":"2020-02-08T21:52:35+01:00","size":954,"digest":"c22e093634568aae249bf35f9ddcaa6796b5f27d76c39ff5336abf7f1b8a47d4","integrity":"sha256-wi4JNjRWiq4km/NfndyqZ5a18n12w5/1M2q/fxuKR9Q="},"flags/4x3/sh-57470d9a75955f0fac605a94e853bab524c7461a4c025e809fb09db762ebe46f.svg":{"logical_path":"flags/4x3/sh.svg","mtime":"2020-02-08T21:52:35+01:00","size":29702,"digest":"57470d9a75955f0fac605a94e853bab524c7461a4c025e809fb09db762ebe46f","integrity":"sha256-V0cNmnWVXw+sYFqU6FO6tSTHRhpMAl6An7Cdt2Lr5G8="},"flags/1x1/sh-8d06a0fff61e51eb65357d138e00736545835b8649aa2694152f4cdc9f941c16.svg":{"logical_path":"flags/1x1/sh.svg","mtime":"2020-02-08T21:52:35+01:00","size":30308,"digest":"8d06a0fff61e51eb65357d138e00736545835b8649aa2694152f4cdc9f941c16","integrity":"sha256-jQag//YeUetlNX0TjgBzZUWDW4ZJqiaUFS9M3J+UHBY="},"flags/4x3/si-289d6417f154323e7922df09ffc0f49ded31548c7ee8020c39cb85724ffbcea8.svg":{"logical_path":"flags/4x3/si.svg","mtime":"2020-02-08T21:52:35+01:00","size":2055,"digest":"289d6417f154323e7922df09ffc0f49ded31548c7ee8020c39cb85724ffbcea8","integrity":"sha256-KJ1kF/FUMj55It8J/8D0ne0xVIx+6AIMOcuFck/7zqg="},"flags/1x1/si-ca40a5f4f38119d6f52ffd3ddb36af95951a2aa1fadcd897f5bc1641bb2e0051.svg":{"logical_path":"flags/1x1/si.svg","mtime":"2020-02-08T21:52:35+01:00","size":2068,"digest":"ca40a5f4f38119d6f52ffd3ddb36af95951a2aa1fadcd897f5bc1641bb2e0051","integrity":"sha256-ykCl9POBGdb1L/092zavlZUaKqH63NiX9bwWQbsuAFE="},"flags/4x3/sj-67d4cdd268d0c0cd93fc561b506cb5646cb508385c93ed350d11f94aa1c83833.svg":{"logical_path":"flags/4x3/sj.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"67d4cdd268d0c0cd93fc561b506cb5646cb508385c93ed350d11f94aa1c83833","integrity":"sha256-Z9TN0mjQwM2T/FYbUGy1ZGy1CDhck+01DRH5SqHIODM="},"flags/1x1/sj-f7c489607033138039612d6abe7f4b0b4b6dada5cac75d78204f404a0d292b1c.svg":{"logical_path":"flags/1x1/sj.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"f7c489607033138039612d6abe7f4b0b4b6dada5cac75d78204f404a0d292b1c","integrity":"sha256-98SJYHAzE4A5YS1qvn9LC0ttraXKx114IE9ASg0pKxw="},"flags/4x3/sk-a0bdbb7f5d6998ffe9fcbc80bbdf0e6cff3629740d2ce1b8d61025e0a8b322b5.svg":{"logical_path":"flags/4x3/sk.svg","mtime":"2020-02-08T21:52:35+01:00","size":1208,"digest":"a0bdbb7f5d6998ffe9fcbc80bbdf0e6cff3629740d2ce1b8d61025e0a8b322b5","integrity":"sha256-oL27f11pmP/p/LyAu98ObP82KXQNLOG41hAl4KizIrU="},"flags/1x1/sk-a82a813b2d81af9be1aa775f22b2c2457d11e870e072d7e23957a11d0878faed.svg":{"logical_path":"flags/1x1/sk.svg","mtime":"2020-02-08T21:52:35+01:00","size":1187,"digest":"a82a813b2d81af9be1aa775f22b2c2457d11e870e072d7e23957a11d0878faed","integrity":"sha256-qCqBOy2Br5vhqndfIrLCRX0R6HDgctfiOVehHQh4+u0="},"flags/4x3/sl-be265bed24cfe0b25778201f251e52e4e721e3d319795875913805d1aea84ebb.svg":{"logical_path":"flags/4x3/sl.svg","mtime":"2020-02-08T21:52:35+01:00","size":278,"digest":"be265bed24cfe0b25778201f251e52e4e721e3d319795875913805d1aea84ebb","integrity":"sha256-viZb7STP4LJXeCAfJR5S5Och49MZeVh1kTgF0a6oTrs="},"flags/1x1/sl-cb8bccbaa21957f006ed4ae0144da81c999e93bd8014023b16b500fdcdc397d3.svg":{"logical_path":"flags/1x1/sl.svg","mtime":"2020-02-08T21:52:35+01:00","size":441,"digest":"cb8bccbaa21957f006ed4ae0144da81c999e93bd8014023b16b500fdcdc397d3","integrity":"sha256-y4vMuqIZV/AG7UrgFE2oHJmek72AFAI7FrUA/c3Dl9M="},"flags/4x3/sm-d7818df3f8f2d5dbed27dc5a0a80b1e41cdcd6130eeff221da58f0321e925f27.svg":{"logical_path":"flags/4x3/sm.svg","mtime":"2020-02-08T21:52:35+01:00","size":15960,"digest":"d7818df3f8f2d5dbed27dc5a0a80b1e41cdcd6130eeff221da58f0321e925f27","integrity":"sha256-14GN8/jy1dvtJ9xaCoCx5Bzc1hMO7/Ih2ljwMh6SXyc="},"flags/1x1/sm-6f87660dcac925bbdb036c79a0e20d3b208215d327be4c4764ae1069d6464efd.svg":{"logical_path":"flags/1x1/sm.svg","mtime":"2020-02-08T21:52:35+01:00","size":15881,"digest":"6f87660dcac925bbdb036c79a0e20d3b208215d327be4c4764ae1069d6464efd","integrity":"sha256-b4dmDcrJJbvbA2x5oOINOyCCFdMnvkxHZK4QadZGTv0="},"flags/4x3/sn-b131b17a374bcfbd00d442d282fa52f0e4e0e448cda1cdfaac25a95ff56443c0.svg":{"logical_path":"flags/4x3/sn.svg","mtime":"2020-02-08T21:52:35+01:00","size":427,"digest":"b131b17a374bcfbd00d442d282fa52f0e4e0e448cda1cdfaac25a95ff56443c0","integrity":"sha256-sTGxejdLz70A1ELSgvpS8OTg5EjNoc36rCWpX/VkQ8A="},"flags/1x1/sn-d180d3ce9846966dee6a3d9433ede7d24801dc4311636aabd470ec5b8765d772.svg":{"logical_path":"flags/1x1/sn.svg","mtime":"2020-02-08T21:52:35+01:00","size":418,"digest":"d180d3ce9846966dee6a3d9433ede7d24801dc4311636aabd470ec5b8765d772","integrity":"sha256-0YDTzphGlm3uaj2UM+3n0kgB3EMRY2qr1HDsW4dl13I="},"flags/4x3/so-3b5b77b371299478144a94b60c99524fb6b99bfedb3dcc976ab70185e07f399e.svg":{"logical_path":"flags/4x3/so.svg","mtime":"2020-02-08T21:52:35+01:00","size":494,"digest":"3b5b77b371299478144a94b60c99524fb6b99bfedb3dcc976ab70185e07f399e","integrity":"sha256-O1t3s3EplHgUSpS2DJlST7a5m/7bPcyXarcBheB/OZ4="},"flags/1x1/so-50aa941f2d2954285ef9e5ac260cdd264a73cf2e4b0c627677f04141fff2afd3.svg":{"logical_path":"flags/1x1/so.svg","mtime":"2020-02-08T21:52:35+01:00","size":501,"digest":"50aa941f2d2954285ef9e5ac260cdd264a73cf2e4b0c627677f04141fff2afd3","integrity":"sha256-UKqUHy0pVChe+eWsJgzdJkpzzy5LDGJ2d/BBQf/yr9M="},"flags/4x3/sr-94d0f0aefcbdea8d7ba35648eda5037e99bf4126723ce36416582ea43b08d3e2.svg":{"logical_path":"flags/4x3/sr.svg","mtime":"2020-02-08T21:52:35+01:00","size":318,"digest":"94d0f0aefcbdea8d7ba35648eda5037e99bf4126723ce36416582ea43b08d3e2","integrity":"sha256-lNDwrvy96o17o1ZI7aUDfpm/QSZyPONkFlgupDsI0+I="},"flags/1x1/sr-3944d683068d437471725d22fd71ccbe6a63ae307ff9775690417d3bf262cf82.svg":{"logical_path":"flags/1x1/sr.svg","mtime":"2020-02-08T21:52:35+01:00","size":323,"digest":"3944d683068d437471725d22fd71ccbe6a63ae307ff9775690417d3bf262cf82","integrity":"sha256-OUTWgwaNQ3Rxcl0i/XHMvmpjrjB/+XdWkEF9O/Jiz4I="},"flags/4x3/ss-f391e5002cbce83f97f7d1a11c284fa2e36a7d6dc734757d733656801ab17d0a.svg":{"logical_path":"flags/4x3/ss.svg","mtime":"2020-02-08T21:52:35+01:00","size":389,"digest":"f391e5002cbce83f97f7d1a11c284fa2e36a7d6dc734757d733656801ab17d0a","integrity":"sha256-85HlACy86D+X99GhHChPouNqfW3HNHV9czZWgBqxfQo="},"flags/1x1/ss-853bd9f713d2f6b1fe540a82e8bf4754912da21575b3fe756b8741767f318f7a.svg":{"logical_path":"flags/1x1/ss.svg","mtime":"2020-02-08T21:52:35+01:00","size":400,"digest":"853bd9f713d2f6b1fe540a82e8bf4754912da21575b3fe756b8741767f318f7a","integrity":"sha256-hTvZ9xPS9rH+VAqC6L9HVJEtohV1s/51a4dBdn8xj3o="},"flags/4x3/st-b52bb48a2c0800f5cb4b07bdd93c3908f77bcb6800be883ebf943bbd3d99d42c.svg":{"logical_path":"flags/4x3/st.svg","mtime":"2020-02-08T21:52:35+01:00","size":919,"digest":"b52bb48a2c0800f5cb4b07bdd93c3908f77bcb6800be883ebf943bbd3d99d42c","integrity":"sha256-tSu0iiwIAPXLSwe92Tw5CPd7y2gAvog+v5Q7vT2Z1Cw="},"flags/1x1/st-d8b5b1c8b9fe947086a4d277d2ac5d6b9cff188dfd37bda66c8bf5e02c5facc8.svg":{"logical_path":"flags/1x1/st.svg","mtime":"2020-02-08T21:52:35+01:00","size":923,"digest":"d8b5b1c8b9fe947086a4d277d2ac5d6b9cff188dfd37bda66c8bf5e02c5facc8","integrity":"sha256-2LWxyLn+lHCGpNJ30qxda5z/GI39N72mbIv14CxfrMg="},"flags/4x3/sv-6d02d63c7f04c9388e98f892cc43d8daa2110fc84242758d5627fcd247bfd09b.svg":{"logical_path":"flags/4x3/sv.svg","mtime":"2020-02-08T21:52:35+01:00","size":84037,"digest":"6d02d63c7f04c9388e98f892cc43d8daa2110fc84242758d5627fcd247bfd09b","integrity":"sha256-bQLWPH8EyTiOmPiSzEPY2qIRD8hCQnWNVif80ke/0Js="},"flags/1x1/sv-fb4c8d7eb98396a93c5b9c37195d70e809e0d71d8b8f9316e842121f95bb82ea.svg":{"logical_path":"flags/1x1/sv.svg","mtime":"2020-02-08T21:52:35+01:00","size":84509,"digest":"fb4c8d7eb98396a93c5b9c37195d70e809e0d71d8b8f9316e842121f95bb82ea","integrity":"sha256-+0yNfrmDlqk8W5w3GV1w6Ang1x2Lj5MW6EISH5W7guo="},"flags/4x3/sx-fb6a7b1cbc5b29eeeb39a5aec64ef7aad432c37bbe848d29955a3786b9763224.svg":{"logical_path":"flags/4x3/sx.svg","mtime":"2020-02-08T21:52:35+01:00","size":13306,"digest":"fb6a7b1cbc5b29eeeb39a5aec64ef7aad432c37bbe848d29955a3786b9763224","integrity":"sha256-+2p7HLxbKe7rOaWuxk73qtQyw3u+hI0plVo3hrl2MiQ="},"flags/1x1/sx-a37b124212f8530b921aef7657cfb35c2895a731c7a06f333faee4c93f32806a.svg":{"logical_path":"flags/1x1/sx.svg","mtime":"2020-02-08T21:52:35+01:00","size":13115,"digest":"a37b124212f8530b921aef7657cfb35c2895a731c7a06f333faee4c93f32806a","integrity":"sha256-o3sSQhL4UwuSGu92V8+zXCiVpzHHoG8zP67kyT8ygGo="},"flags/4x3/sy-e35f8d88c864ed4f38edb2f9f96d5bd69f6df078b50515b8c5467bf6b1689f50.svg":{"logical_path":"flags/4x3/sy.svg","mtime":"2020-02-08T21:52:35+01:00","size":568,"digest":"e35f8d88c864ed4f38edb2f9f96d5bd69f6df078b50515b8c5467bf6b1689f50","integrity":"sha256-41+NiMhk7U847bL5+W1b1p9t8Hi1BRW4xUZ79rFon1A="},"flags/1x1/sy-5d537bd5b42b58f6e8a7e33fbe5942a16126abb639edf9cb58b88938c57ebaa9.svg":{"logical_path":"flags/1x1/sy.svg","mtime":"2020-02-08T21:52:35+01:00","size":582,"digest":"5d537bd5b42b58f6e8a7e33fbe5942a16126abb639edf9cb58b88938c57ebaa9","integrity":"sha256-XVN71bQrWPbop+M/vllCoWEmq7Y57fnLWLiJOMV+uqk="},"flags/4x3/sz-c65ae592e943217787848364bdb4c57335869f4626ce705adabdc2620669c1c6.svg":{"logical_path":"flags/4x3/sz.svg","mtime":"2020-02-08T21:52:35+01:00","size":6755,"digest":"c65ae592e943217787848364bdb4c57335869f4626ce705adabdc2620669c1c6","integrity":"sha256-xlrlkulDIXeHhINkvbTFczWGn0YmznBa2r3CYgZpwcY="},"flags/1x1/sz-dd3d1c65bdf09317553f205e588e3dc7336acec1cb9315bfbe0f5bd8ca5bba3f.svg":{"logical_path":"flags/1x1/sz.svg","mtime":"2020-02-08T21:52:35+01:00","size":6706,"digest":"dd3d1c65bdf09317553f205e588e3dc7336acec1cb9315bfbe0f5bd8ca5bba3f","integrity":"sha256-3T0cZb3wkxdVPyBeWI49xzNqzsHLkxW/vg9b2Mpbuj8="},"flags/4x3/tc-594b6cc87040836c6d6777afb5833d565d3e5e75f404350a51443ec4588a1ccb.svg":{"logical_path":"flags/4x3/tc.svg","mtime":"2020-02-08T21:52:35+01:00","size":14585,"digest":"594b6cc87040836c6d6777afb5833d565d3e5e75f404350a51443ec4588a1ccb","integrity":"sha256-WUtsyHBAg2xtZ3evtYM9Vl0+XnX0BDUKUUQ+xFiKHMs="},"flags/1x1/tc-34a37006252eea340488220585c31d047b57e3e7934c77180d930972aaceadc3.svg":{"logical_path":"flags/1x1/tc.svg","mtime":"2020-02-08T21:52:35+01:00","size":14843,"digest":"34a37006252eea340488220585c31d047b57e3e7934c77180d930972aaceadc3","integrity":"sha256-NKNwBiUu6jQEiCIFhcMdBHtX4+eTTHcYDZMJcqrOrcM="},"flags/4x3/td-b67a1978e3badb895ff640c80bb6c0e33eac354220c08cf3fc93d62bf5d685a3.svg":{"logical_path":"flags/4x3/td.svg","mtime":"2020-02-08T21:52:35+01:00","size":270,"digest":"b67a1978e3badb895ff640c80bb6c0e33eac354220c08cf3fc93d62bf5d685a3","integrity":"sha256-tnoZeOO624lf9kDIC7bA4z6sNUIgwIzz/JPWK/XWhaM="},"flags/1x1/td-556b3a7991c17010cb7e1ff23c4edcc2dcdb8c406a128d407fd165ea8a19d311.svg":{"logical_path":"flags/1x1/td.svg","mtime":"2020-02-08T21:52:35+01:00","size":282,"digest":"556b3a7991c17010cb7e1ff23c4edcc2dcdb8c406a128d407fd165ea8a19d311","integrity":"sha256-VWs6eZHBcBDLfh/yPE7cwtzbjEBqEo1Af9Fl6ooZ0xE="},"flags/4x3/tf-35cd83351521f3022a43e01f0c40f34663a66ac1e92045979f31d3fd65c16d02.svg":{"logical_path":"flags/4x3/tf.svg","mtime":"2020-02-08T21:52:35+01:00","size":1091,"digest":"35cd83351521f3022a43e01f0c40f34663a66ac1e92045979f31d3fd65c16d02","integrity":"sha256-Nc2DNRUh8wIqQ+AfDEDzRmOmasHpIEWXnzHT/WXBbQI="},"flags/1x1/tf-485e71f61ff577735dbc4ba1025515c22a83c48ee7f3a2ed49804766c35f6ea5.svg":{"logical_path":"flags/1x1/tf.svg","mtime":"2020-02-08T21:52:35+01:00","size":1199,"digest":"485e71f61ff577735dbc4ba1025515c22a83c48ee7f3a2ed49804766c35f6ea5","integrity":"sha256-SF5x9h/1d3NdvEuhAlUVwiqDxI7n86LtSYBHZsNfbqU="},"flags/4x3/tg-24b25f4c2213fe35e5f5586d7ab23abf0c25ad2049708cd52ba72e1ec7b754ff.svg":{"logical_path":"flags/4x3/tg.svg","mtime":"2020-02-08T21:52:35+01:00","size":725,"digest":"24b25f4c2213fe35e5f5586d7ab23abf0c25ad2049708cd52ba72e1ec7b754ff","integrity":"sha256-JLJfTCIT/jXl9VhterI6vwwlrSBJcIzVK6cuHse3VP8="},"flags/1x1/tg-05f3d98392a5ec3e4aecf8f629d3d03f05ac55abb7d9d84187d599acfe271374.svg":{"logical_path":"flags/1x1/tg.svg","mtime":"2020-02-08T21:52:35+01:00","size":736,"digest":"05f3d98392a5ec3e4aecf8f629d3d03f05ac55abb7d9d84187d599acfe271374","integrity":"sha256-BfPZg5Kl7D5K7Pj2KdPQPwWsVau32dhBh9WZrP4nE3Q="},"flags/4x3/th-cc936bacd84dddd15454ef06bc64e357f83854af34692fc37363272d61f637d4.svg":{"logical_path":"flags/4x3/th.svg","mtime":"2020-02-08T21:52:35+01:00","size":287,"digest":"cc936bacd84dddd15454ef06bc64e357f83854af34692fc37363272d61f637d4","integrity":"sha256-zJNrrNhN3dFUVO8GvGTjV/g4VK80aS/Dc2MnLWH2N9Q="},"flags/1x1/th-de82cbd770db2be53a8e3d59d86e2b748a5d3f96eb8584f7b9364cefbd06a172.svg":{"logical_path":"flags/1x1/th.svg","mtime":"2020-02-08T21:52:35+01:00","size":288,"digest":"de82cbd770db2be53a8e3d59d86e2b748a5d3f96eb8584f7b9364cefbd06a172","integrity":"sha256-3oLL13DbK+U6jj1Z2G4rdIpdP5brhYT3uTZM770GoXI="},"flags/4x3/tj-b90bf3e2dd63265d55b67962b160df65f021c42b6ea304e2943c10b9e2a8749d.svg":{"logical_path":"flags/4x3/tj.svg","mtime":"2020-02-08T21:52:35+01:00","size":1831,"digest":"b90bf3e2dd63265d55b67962b160df65f021c42b6ea304e2943c10b9e2a8749d","integrity":"sha256-uQvz4t1jJl1VtnlisWDfZfAhxCtuowTilDwQueKodJ0="},"flags/1x1/tj-5f6571e74b1f8720f9ecc2d3aa2098ca45d2e7ad6602b2a57c206384719b9f36.svg":{"logical_path":"flags/1x1/tj.svg","mtime":"2020-02-08T21:52:35+01:00","size":1788,"digest":"5f6571e74b1f8720f9ecc2d3aa2098ca45d2e7ad6602b2a57c206384719b9f36","integrity":"sha256-X2Vx50sfhyD57MLTqiCYykXS561mArKlfCBjhHGbnzY="},"flags/4x3/tk-602520b29b909c96baea17a38eb654d6c6fbc7088f46a0cb8d8fe34ff92e3cb8.svg":{"logical_path":"flags/4x3/tk.svg","mtime":"2020-02-08T21:52:35+01:00","size":791,"digest":"602520b29b909c96baea17a38eb654d6c6fbc7088f46a0cb8d8fe34ff92e3cb8","integrity":"sha256-YCUgspuQnJa66hejjrZU1sb7xwiPRqDLjY/jT/kuPLg="},"flags/1x1/tk-fe1dc8aaa0643a45a74ecec8aec09f0fe2207d104bb3c28c0b84405f1275aeba.svg":{"logical_path":"flags/1x1/tk.svg","mtime":"2020-02-08T21:52:35+01:00","size":781,"digest":"fe1dc8aaa0643a45a74ecec8aec09f0fe2207d104bb3c28c0b84405f1275aeba","integrity":"sha256-/h3IqqBkOkWnTs7IrsCfD+IgfRBLs8KMC4RAXxJ1rro="},"flags/4x3/tl-ebdb862aa5ae5de1a72242571deaa70bfb222f488a93b70e304f2075b474d54b.svg":{"logical_path":"flags/4x3/tl.svg","mtime":"2020-02-08T21:52:35+01:00","size":600,"digest":"ebdb862aa5ae5de1a72242571deaa70bfb222f488a93b70e304f2075b474d54b","integrity":"sha256-69uGKqWuXeGnIkJXHeqnC/siL0iKk7cOME8gdbR01Us="},"flags/1x1/tl-485f02183bdb192ba3ce6e5f076e184112739f883ae0a8fde33c454377b848d6.svg":{"logical_path":"flags/1x1/tl.svg","mtime":"2020-02-08T21:52:35+01:00","size":582,"digest":"485f02183bdb192ba3ce6e5f076e184112739f883ae0a8fde33c454377b848d6","integrity":"sha256-SF8CGDvbGSujzm5fB24YQRJzn4g64Kj94zxFQ3e4SNY="},"flags/4x3/tm-5ddb4128bf0becd7c60413d5418027f5f01ca4bc72561d54b94febfee7a5a24b.svg":{"logical_path":"flags/4x3/tm.svg","mtime":"2020-02-08T21:52:35+01:00","size":32579,"digest":"5ddb4128bf0becd7c60413d5418027f5f01ca4bc72561d54b94febfee7a5a24b","integrity":"sha256-XdtBKL8L7NfGBBPVQYAn9fAcpLxyVh1UuU/r/ueloks="},"flags/1x1/tm-3521ad569a4095aa8d4166d5d9094fccfdbb3ea411207ad685b6dd5814ef3392.svg":{"logical_path":"flags/1x1/tm.svg","mtime":"2020-02-08T21:52:35+01:00","size":31884,"digest":"3521ad569a4095aa8d4166d5d9094fccfdbb3ea411207ad685b6dd5814ef3392","integrity":"sha256-NSGtVppAlaqNQWbV2QlPzP27PqQRIHrWhbbdWBTvM5I="},"flags/4x3/tn-ca27eb50d88b11d20b5b09e2bbecb7753267222489920c526608e5d2acd22d79.svg":{"logical_path":"flags/4x3/tn.svg","mtime":"2020-02-08T21:52:35+01:00","size":753,"digest":"ca27eb50d88b11d20b5b09e2bbecb7753267222489920c526608e5d2acd22d79","integrity":"sha256-yifrUNiLEdILWwniu+y3dTJnIiSJkgxSZgjl0qzSLXk="},"flags/1x1/tn-222c6cd4742c558f48ebcacb47ea334057642fffa3456a1c75e0fad9e728d09b.svg":{"logical_path":"flags/1x1/tn.svg","mtime":"2020-02-08T21:52:35+01:00","size":743,"digest":"222c6cd4742c558f48ebcacb47ea334057642fffa3456a1c75e0fad9e728d09b","integrity":"sha256-Iixs1HQsVY9I68rLR+ozQFdkL/+jRWocdeD62eco0Js="},"flags/4x3/to-c9c509fc24f591fbe52bbf732c44291384c787796e1fc9c703a973587c3f8ad1.svg":{"logical_path":"flags/4x3/to.svg","mtime":"2020-02-08T21:52:35+01:00","size":358,"digest":"c9c509fc24f591fbe52bbf732c44291384c787796e1fc9c703a973587c3f8ad1","integrity":"sha256-ycUJ/CT1kfvlK79zLEQpE4THh3luH8nHA6lzWHw/itE="},"flags/1x1/to-cf26dfb44b56b915b2f11896355cb778b938ed54423311d69d7cda9626887dda.svg":{"logical_path":"flags/1x1/to.svg","mtime":"2020-02-08T21:52:35+01:00","size":364,"digest":"cf26dfb44b56b915b2f11896355cb778b938ed54423311d69d7cda9626887dda","integrity":"sha256-zybftEtWuRWy8RiWNVy3eLk47VRCMxHWnXzaliaIfdo="},"flags/4x3/tr-c40f697070cf8d8358785b9203d1c8f438976e3cd644a87d9ee16fa9960deaa4.svg":{"logical_path":"flags/4x3/tr.svg","mtime":"2020-02-08T21:52:35+01:00","size":557,"digest":"c40f697070cf8d8358785b9203d1c8f438976e3cd644a87d9ee16fa9960deaa4","integrity":"sha256-xA9pcHDPjYNYeFuSA9HI9DiXbjzWRKh9nuFvqZYN6qQ="},"flags/1x1/tr-627dcf91a1e5153c045e33a3459b5d56002530fddd3fc53927f4d0fb7ea004a5.svg":{"logical_path":"flags/1x1/tr.svg","mtime":"2020-02-08T21:52:35+01:00","size":578,"digest":"627dcf91a1e5153c045e33a3459b5d56002530fddd3fc53927f4d0fb7ea004a5","integrity":"sha256-Yn3PkaHlFTwEXjOjRZtdVgAlMP3dP8U5J/TQ+36gBKU="},"flags/4x3/tt-04786ffedbde2c96a30ad1cbf4db000848f14bd700324651fc88364e5f3c2fd0.svg":{"logical_path":"flags/4x3/tt.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"04786ffedbde2c96a30ad1cbf4db000848f14bd700324651fc88364e5f3c2fd0","integrity":"sha256-BHhv/tveLJajCtHL9NsACEjxS9cAMkZR/Ig2Tl88L9A="},"flags/1x1/tt-6a3c73bfa7782366d95e673d847ef8f84c0475b364d359def1efd264297bac30.svg":{"logical_path":"flags/1x1/tt.svg","mtime":"2020-02-08T21:52:35+01:00","size":323,"digest":"6a3c73bfa7782366d95e673d847ef8f84c0475b364d359def1efd264297bac30","integrity":"sha256-ajxzv6d4I2bZXmc9hH74+EwEdbNk01ne8e/SZCl7rDA="},"flags/4x3/tv-20b56e7c0a2fbaa2a0b7b1bd87afc6368440f175fb3a0589de5e34e99d163fd7.svg":{"logical_path":"flags/4x3/tv.svg","mtime":"2020-02-08T21:52:35+01:00","size":2299,"digest":"20b56e7c0a2fbaa2a0b7b1bd87afc6368440f175fb3a0589de5e34e99d163fd7","integrity":"sha256-ILVufAovuqKgt7G9h6/GNoRA8XX7OgWJ3l406Z0WP9c="},"flags/1x1/tv-8bce1d7bde2e20dcc473ed3a33c66e4bedcf1acf2d2fff6d54353a480b8cafbc.svg":{"logical_path":"flags/1x1/tv.svg","mtime":"2020-02-08T21:52:35+01:00","size":2166,"digest":"8bce1d7bde2e20dcc473ed3a33c66e4bedcf1acf2d2fff6d54353a480b8cafbc","integrity":"sha256-i84de94uINzEc+06M8ZuS+3PGs8tL/9tVDU6SAuMr7w="},"flags/4x3/tw-36070ac0a15ab1f4811478da62e7678756a9aa266b141ed0549aba1c0e04333a.svg":{"logical_path":"flags/4x3/tw.svg","mtime":"2020-02-08T21:52:35+01:00","size":945,"digest":"36070ac0a15ab1f4811478da62e7678756a9aa266b141ed0549aba1c0e04333a","integrity":"sha256-NgcKwKFasfSBFHjaYudnh1apqiZrFB7QVJq6HA4EMzo="},"flags/1x1/tw-fd7a0db2f3808842ca99176f097356fe9e6f3c120d6aa9e8c4a9c2dd4c3943ba.svg":{"logical_path":"flags/1x1/tw.svg","mtime":"2020-02-08T21:52:35+01:00","size":960,"digest":"fd7a0db2f3808842ca99176f097356fe9e6f3c120d6aa9e8c4a9c2dd4c3943ba","integrity":"sha256-/XoNsvOAiELKmRdvCXNW/p5vPBINaqnoxKnC3Uw5Q7o="},"flags/4x3/tz-51ad7d69f059075df61b9226468af0d78642af4ad34a7540f64c5bea82e803d7.svg":{"logical_path":"flags/4x3/tz.svg","mtime":"2020-02-08T21:52:35+01:00","size":546,"digest":"51ad7d69f059075df61b9226468af0d78642af4ad34a7540f64c5bea82e803d7","integrity":"sha256-Ua19afBZB132G5ImRorw14ZCr0rTSnVA9kxb6oLoA9c="},"flags/1x1/tz-0703f29a7ae02a9a1753cb1726dd2934d75ed3a12e8d63faa9fa866e1fe61440.svg":{"logical_path":"flags/1x1/tz.svg","mtime":"2020-02-08T21:52:35+01:00","size":605,"digest":"0703f29a7ae02a9a1753cb1726dd2934d75ed3a12e8d63faa9fa866e1fe61440","integrity":"sha256-BwPymnrgKpoXU8sXJt0pNNde06EujWP6qfqGbh/mFEA="},"flags/4x3/ua-7f7db03c3b492aaacd11b0abac70d543a7c0ec5265a36d529bbb80a7c432d81a.svg":{"logical_path":"flags/4x3/ua.svg","mtime":"2020-02-08T21:52:35+01:00","size":241,"digest":"7f7db03c3b492aaacd11b0abac70d543a7c0ec5265a36d529bbb80a7c432d81a","integrity":"sha256-f32wPDtJKqrNEbCrrHDVQ6fA7FJlo21Sm7uAp8Qy2Bo="},"flags/1x1/ua-25192fa80f120edb1dd1c4757fd7b79ef38f5e1729238f4135003e6a1501bf28.svg":{"logical_path":"flags/1x1/ua.svg","mtime":"2020-02-08T21:52:35+01:00","size":241,"digest":"25192fa80f120edb1dd1c4757fd7b79ef38f5e1729238f4135003e6a1501bf28","integrity":"sha256-JRkvqA8SDtsd0cR1f9e3nvOPXhcpI49BNQA+ahUBvyg="},"flags/4x3/ug-7635df53eafdf411be0809df835bfbcffd61badd6c4df3db0909c8b3188015a0.svg":{"logical_path":"flags/4x3/ug.svg","mtime":"2020-02-08T21:52:35+01:00","size":3959,"digest":"7635df53eafdf411be0809df835bfbcffd61badd6c4df3db0909c8b3188015a0","integrity":"sha256-djXfU+r99BG+CAnfg1v7z/1hut1sTfPbCQnIsxiAFaA="},"flags/1x1/ug-537f34f64e723fbe7cb7902ea0e61303f1ada79214197efc39ebe2c52ce24186.svg":{"logical_path":"flags/1x1/ug.svg","mtime":"2020-02-08T21:52:35+01:00","size":4038,"digest":"537f34f64e723fbe7cb7902ea0e61303f1ada79214197efc39ebe2c52ce24186","integrity":"sha256-U3809k5yP758t5AuoOYTA/Gtp5IUGX78OevixSziQYY="},"flags/4x3/um-a0ae80e34bbf94677dd6052ea87cc0090aba747dab5440e5ca6e231f7f07c96d.svg":{"logical_path":"flags/4x3/um.svg","mtime":"2020-02-08T21:52:35+01:00","size":4524,"digest":"a0ae80e34bbf94677dd6052ea87cc0090aba747dab5440e5ca6e231f7f07c96d","integrity":"sha256-oK6A40u/lGd91gUuqHzACQq6dH2rVEDlym4jH38HyW0="},"flags/1x1/um-3f1bc09babe7fdcf32518bb49d1aac3a66d0204f955eacca291c58d4f4ef895a.svg":{"logical_path":"flags/1x1/um.svg","mtime":"2020-02-08T21:52:35+01:00","size":3975,"digest":"3f1bc09babe7fdcf32518bb49d1aac3a66d0204f955eacca291c58d4f4ef895a","integrity":"sha256-PxvAm6vn/c8yUYu0nRqsOmbQIE+VXqzKKRxY1PTviVo="},"flags/4x3/us-aefd8f7e57d11f7b0416d01d9c665ab3848b10af849f35a4d772d58d24d83329.svg":{"logical_path":"flags/4x3/us.svg","mtime":"2020-02-08T21:52:35+01:00","size":4468,"digest":"aefd8f7e57d11f7b0416d01d9c665ab3848b10af849f35a4d772d58d24d83329","integrity":"sha256-rv2PflfRH3sEFtAdnGZas4SLEK+EnzWk13LVjSTYMyk="},"flags/1x1/us-87af45be9346e8c820312976abe332ee11f8931e29fa361328d28660a711b1e2.svg":{"logical_path":"flags/1x1/us.svg","mtime":"2020-02-08T21:52:35+01:00","size":3924,"digest":"87af45be9346e8c820312976abe332ee11f8931e29fa361328d28660a711b1e2","integrity":"sha256-h69FvpNG6MggMSl2q+My7hH4kx4p+jYTKNKGYKcRseI="},"flags/4x3/uy-9f636c8283abf56cc930746fd427c1d1644dcf8736c537629df13f760da96ebc.svg":{"logical_path":"flags/4x3/uy.svg","mtime":"2020-02-08T21:52:35+01:00","size":1721,"digest":"9f636c8283abf56cc930746fd427c1d1644dcf8736c537629df13f760da96ebc","integrity":"sha256-n2NsgoOr9WzJMHRv1CfB0WRNz4c2xTdinfE/dg2pbrw="},"flags/1x1/uy-e216b762a93ec55bf9b4ae3d35b7febe0b192a12246fd66c45139ce77fb2095e.svg":{"logical_path":"flags/1x1/uy.svg","mtime":"2020-02-08T21:52:35+01:00","size":1718,"digest":"e216b762a93ec55bf9b4ae3d35b7febe0b192a12246fd66c45139ce77fb2095e","integrity":"sha256-4ha3Yqk+xVv5tK49Nbf+vgsZKhIkb9ZsRROc53+yCV4="},"flags/4x3/uz-697d596705372323beddccb3626d1ce405b36249315c6b006ff1529e24909ceb.svg":{"logical_path":"flags/4x3/uz.svg","mtime":"2020-02-08T21:52:35+01:00","size":1457,"digest":"697d596705372323beddccb3626d1ce405b36249315c6b006ff1529e24909ceb","integrity":"sha256-aX1ZZwU3IyO+3cyzYm0c5AWzYkkxXGsAb/FSniSQnOs="},"flags/1x1/uz-aa34cbe4f6f0e4b5d890975578d28cc9b1e88ebd503d3bdca693748eb29b3353.svg":{"logical_path":"flags/1x1/uz.svg","mtime":"2020-02-08T21:52:35+01:00","size":1457,"digest":"aa34cbe4f6f0e4b5d890975578d28cc9b1e88ebd503d3bdca693748eb29b3353","integrity":"sha256-qjTL5Pbw5LXYkJdVeNKMybHojr1QPTvcppN0jrKbM1M="},"flags/4x3/va-d24d3c5bee108c396997c3d5b2bd2273433752d8c222eb531650e51551a4afd0.svg":{"logical_path":"flags/4x3/va.svg","mtime":"2020-02-08T21:52:35+01:00","size":91241,"digest":"d24d3c5bee108c396997c3d5b2bd2273433752d8c222eb531650e51551a4afd0","integrity":"sha256-0k08W+4QjDlpl8PVsr0ic0M3UtjCIutTFlDlFVGkr9A="},"flags/1x1/va-01160c1bffda12f0b94554ba0c50162a88da807943617334bd4c57a030985e95.svg":{"logical_path":"flags/1x1/va.svg","mtime":"2020-02-08T21:52:35+01:00","size":90876,"digest":"01160c1bffda12f0b94554ba0c50162a88da807943617334bd4c57a030985e95","integrity":"sha256-ARYMG//aEvC5RVS6DFAWKojagHlDYXM0vUxXoDCYXpU="},"flags/4x3/vc-ddf979bee2889414e5a05ac55f39a9c93f34e0aff0d35f007605049a2d8b5afb.svg":{"logical_path":"flags/4x3/vc.svg","mtime":"2020-02-08T21:52:35+01:00","size":454,"digest":"ddf979bee2889414e5a05ac55f39a9c93f34e0aff0d35f007605049a2d8b5afb","integrity":"sha256-3fl5vuKIlBTloFrFXzmpyT804K/w018AdgUEmi2LWvs="},"flags/1x1/vc-ac776e16dec19ff2e2d9238f541dae5d977282b451a83ab3d4122efed2392be9.svg":{"logical_path":"flags/1x1/vc.svg","mtime":"2020-02-08T21:52:35+01:00","size":501,"digest":"ac776e16dec19ff2e2d9238f541dae5d977282b451a83ab3d4122efed2392be9","integrity":"sha256-rHduFt7Bn/Li2SOPVB2uXZdygrRRqDqz1BIu/tI5K+k="},"flags/4x3/ve-e23abd006cc75a8c4f9ec1cb122b46f9b52e26c5606532d2c868277d4ccd523b.svg":{"logical_path":"flags/4x3/ve.svg","mtime":"2020-02-08T21:52:35+01:00","size":1171,"digest":"e23abd006cc75a8c4f9ec1cb122b46f9b52e26c5606532d2c868277d4ccd523b","integrity":"sha256-4jq9AGzHWoxPnsHLEitG+bUuJsVgZTLSyGgnfUzNUjs="},"flags/1x1/ve-1480713f28719e0a83da2c5f1333407dbfa5bcc0de8c9ba718fcf47273ee95ef.svg":{"logical_path":"flags/1x1/ve.svg","mtime":"2020-02-08T21:52:35+01:00","size":1191,"digest":"1480713f28719e0a83da2c5f1333407dbfa5bcc0de8c9ba718fcf47273ee95ef","integrity":"sha256-FIBxPyhxngqD2ixfEzNAfb+lvMDejJunGPz0cnPule8="},"flags/4x3/vg-7f8f24a4d6995e4dd39e3d9098dad5e14649821fa12ffc200edf0a586285ee15.svg":{"logical_path":"flags/4x3/vg.svg","mtime":"2020-02-08T21:52:35+01:00","size":24818,"digest":"7f8f24a4d6995e4dd39e3d9098dad5e14649821fa12ffc200edf0a586285ee15","integrity":"sha256-f48kpNaZXk3Tnj2QmNrV4UZJgh+hL/wgDt8KWGKF7hU="},"flags/1x1/vg-b464b6a78e46c29df9e4bdadc2646208f11c59168706456075f970552a24efa8.svg":{"logical_path":"flags/1x1/vg.svg","mtime":"2020-02-08T21:52:35+01:00","size":24997,"digest":"b464b6a78e46c29df9e4bdadc2646208f11c59168706456075f970552a24efa8","integrity":"sha256-tGS2p45Gwp355L2twmRiCPEcWRaHBkVgdflwVSok76g="},"flags/4x3/vi-58311325a293b046044976d899f288ce0fbe9bfd705a23947a9b38d7991983d7.svg":{"logical_path":"flags/4x3/vi.svg","mtime":"2020-02-08T21:52:35+01:00","size":8775,"digest":"58311325a293b046044976d899f288ce0fbe9bfd705a23947a9b38d7991983d7","integrity":"sha256-WDETJaKTsEYESXbYmfKIzg++m/1wWiOUeps415kZg9c="},"flags/1x1/vi-1c132d2cff66cdbdb7b6acf504bb0cd9d7579595d80c3fa6604ff24ca7a0184d.svg":{"logical_path":"flags/1x1/vi.svg","mtime":"2020-02-08T21:52:35+01:00","size":8730,"digest":"1c132d2cff66cdbdb7b6acf504bb0cd9d7579595d80c3fa6604ff24ca7a0184d","integrity":"sha256-HBMtLP9mzb23tqz1BLsM2ddXlZXYDD+mYE/yTKegGE0="},"flags/4x3/vn-a918d3c9cdc368b1d2ff9614d58cbcd1d43b725889b0ba18f5d4e693071e389a.svg":{"logical_path":"flags/4x3/vn.svg","mtime":"2020-02-08T21:52:35+01:00","size":492,"digest":"a918d3c9cdc368b1d2ff9614d58cbcd1d43b725889b0ba18f5d4e693071e389a","integrity":"sha256-qRjTyc3DaLHS/5YU1Yy80dQ7cliJsLoY9dTmkwceOJo="},"flags/1x1/vn-895e428ae3d98c99dbb02088cf8ef040bfb031df6f16c3c8fc3678505d869791.svg":{"logical_path":"flags/1x1/vn.svg","mtime":"2020-02-08T21:52:35+01:00","size":501,"digest":"895e428ae3d98c99dbb02088cf8ef040bfb031df6f16c3c8fc3678505d869791","integrity":"sha256-iV5CiuPZjJnbsCCIz47wQL+wMd9vFsPI/DZ4UF2Gl5E="},"flags/4x3/vu-2c286c778a7bed03cb603ab24b68dc91868f4f054cf4f851bdd17aa16731571c.svg":{"logical_path":"flags/4x3/vu.svg","mtime":"2020-02-08T21:52:35+01:00","size":3771,"digest":"2c286c778a7bed03cb603ab24b68dc91868f4f054cf4f851bdd17aa16731571c","integrity":"sha256-LChsd4p77QPLYDqyS2jckYaPTwVM9PhRvdF6oWcxVxw="},"flags/1x1/vu-51ef23121e2641ebeeac50d31c4e52b7d00d3ab1bc9fc0ad95ea86fd3631975a.svg":{"logical_path":"flags/1x1/vu.svg","mtime":"2020-02-08T21:52:35+01:00","size":3740,"digest":"51ef23121e2641ebeeac50d31c4e52b7d00d3ab1bc9fc0ad95ea86fd3631975a","integrity":"sha256-Ue8jEh4mQevurFDTHE5St9ANOrG8n8CtleqG/TYxl1o="},"flags/4x3/wf-f7e9ac5edac196ac32d7bafa04b5c0d924b89e9d7e4f3535a6a26c6c1523639c.svg":{"logical_path":"flags/4x3/wf.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"f7e9ac5edac196ac32d7bafa04b5c0d924b89e9d7e4f3535a6a26c6c1523639c","integrity":"sha256-9+msXtrBlqwy17r6BLXA2SS4np1+TzU1pqJsbBUjY5w="},"flags/1x1/wf-95a920a79aa32d92f8a362321aae4230e17025ac04d976593f4423d0c37c1aee.svg":{"logical_path":"flags/1x1/wf.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"95a920a79aa32d92f8a362321aae4230e17025ac04d976593f4423d0c37c1aee","integrity":"sha256-lakgp5qjLZL4o2IyGq5CMOFwJawE2XZZP0Qj0MN8Gu4="},"flags/4x3/ws-efc6505a802a3fa2018bc102fc2e11db8c738464c619381b6edc32d0a89341a3.svg":{"logical_path":"flags/4x3/ws.svg","mtime":"2020-02-08T21:52:35+01:00","size":663,"digest":"efc6505a802a3fa2018bc102fc2e11db8c738464c619381b6edc32d0a89341a3","integrity":"sha256-78ZQWoAqP6IBi8EC/C4R24xzhGTGGTgbbtwy0KiTQaM="},"flags/1x1/ws-e3afb81c037c814620027bf61ac5e266683cab7ba5796ecf10b64c110cfcb932.svg":{"logical_path":"flags/1x1/ws.svg","mtime":"2020-02-08T21:52:35+01:00","size":645,"digest":"e3afb81c037c814620027bf61ac5e266683cab7ba5796ecf10b64c110cfcb932","integrity":"sha256-46+4HAN8gUYgAnv2GsXiZmg8q3uleW7PELZMEQz8uTI="},"flags/4x3/ye-fd88856e70d66b01b4f0f608936a61cf3b1d9dad40a2932fc5da4d01f72a447b.svg":{"logical_path":"flags/4x3/ye.svg","mtime":"2020-02-08T21:52:35+01:00","size":278,"digest":"fd88856e70d66b01b4f0f608936a61cf3b1d9dad40a2932fc5da4d01f72a447b","integrity":"sha256-/YiFbnDWawG08PYIk2phzzsdna1AopMvxdpNAfcqRHs="},"flags/1x1/ye-0c0e32330871e6d83af54affb7dadbbe736f9799068508211fbae54db9bbdcc6.svg":{"logical_path":"flags/1x1/ye.svg","mtime":"2020-02-08T21:52:35+01:00","size":278,"digest":"0c0e32330871e6d83af54affb7dadbbe736f9799068508211fbae54db9bbdcc6","integrity":"sha256-DA4yMwhx5tg69Ur/t9rbvnNvl5kGhQghH7rlTbm73MY="},"flags/4x3/yt-2eef17b543424082d9f9b42a67e84c20b52e7f7eae8c4326d60711158da51d5b.svg":{"logical_path":"flags/4x3/yt.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"2eef17b543424082d9f9b42a67e84c20b52e7f7eae8c4326d60711158da51d5b","integrity":"sha256-Lu8XtUNCQILZ+bQqZ+hMILUuf36ujEMm1gcRFY2lHVs="},"flags/1x1/yt-911da8075337fd8f75ecc8a338c294cb771c6b9a08576f96c9de1437888cd2a7.svg":{"logical_path":"flags/1x1/yt.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"911da8075337fd8f75ecc8a338c294cb771c6b9a08576f96c9de1437888cd2a7","integrity":"sha256-kR2oB1M3/Y917MijOMKUy3cca5oIV2+Wyd4UN4iM0qc="},"flags/4x3/za-45991a2aee307198510e56bf92523070aac4241cafe6c3ddb8f89b20a61d6371.svg":{"logical_path":"flags/4x3/za.svg","mtime":"2020-02-08T21:52:35+01:00","size":856,"digest":"45991a2aee307198510e56bf92523070aac4241cafe6c3ddb8f89b20a61d6371","integrity":"sha256-RZkaKu4wcZhRDla/klIwcKrEJByv5sPduPibIKYdY3E="},"flags/1x1/za-bc09a89b29311ea7e582ef60bf4e18aff7c29de6fbefe309463ca765723a0ce8.svg":{"logical_path":"flags/1x1/za.svg","mtime":"2020-02-08T21:52:35+01:00","size":875,"digest":"bc09a89b29311ea7e582ef60bf4e18aff7c29de6fbefe309463ca765723a0ce8","integrity":"sha256-vAmomykxHqflgu9gv04Yr/fCneb77+MJRjynZXI6DOg="},"flags/4x3/zm-07c0f30d86e66d0cad9d66cd9c9384d9cce1844f159d245deff6717101fe49c2.svg":{"logical_path":"flags/4x3/zm.svg","mtime":"2020-02-08T21:52:35+01:00","size":5508,"digest":"07c0f30d86e66d0cad9d66cd9c9384d9cce1844f159d245deff6717101fe49c2","integrity":"sha256-B8DzDYbmbQytnWbNnJOE2czhhE8VnSRd7/ZxcQH+ScI="},"flags/1x1/zm-fc5bce3834c71fe36617ea5f57f0bd1dcf3880a7c6aa515dcf92ae067f796241.svg":{"logical_path":"flags/1x1/zm.svg","mtime":"2020-02-08T21:52:35+01:00","size":5429,"digest":"fc5bce3834c71fe36617ea5f57f0bd1dcf3880a7c6aa515dcf92ae067f796241","integrity":"sha256-/FvOODTHH+NmF+pfV/C9Hc84gKfGqlFdz5KuBn95YkE="},"flags/4x3/zw-5217c74f14d9fdda244b69c5982bbabee052ac0f1cc0704926e8b1e621e50f9a.svg":{"logical_path":"flags/4x3/zw.svg","mtime":"2020-02-08T21:52:35+01:00","size":6791,"digest":"5217c74f14d9fdda244b69c5982bbabee052ac0f1cc0704926e8b1e621e50f9a","integrity":"sha256-UhfHTxTZ/dokS2nFmCu6vuBSrA8cwHBJJuix5iHlD5o="},"flags/1x1/zw-a33b191c631709b9e1d85e06f5b15535fb544d4668c8bef865ede2a0b6a88ed9.svg":{"logical_path":"flags/1x1/zw.svg","mtime":"2020-02-08T21:52:35+01:00","size":6770,"digest":"a33b191c631709b9e1d85e06f5b15535fb544d4668c8bef865ede2a0b6a88ed9","integrity":"sha256-ozsZHGMXCbnh2F4G9bFVNftUTUZoyL74Ze3ioLaojtk="},"flags/4x3/es-ct-bcbb454a50c9a647efd43dcf041445f15e8dd70654bde530bf62401d4fb7738d.svg":{"logical_path":"flags/4x3/es-ct.svg","mtime":"2020-02-08T21:52:35+01:00","size":261,"digest":"bcbb454a50c9a647efd43dcf041445f15e8dd70654bde530bf62401d4fb7738d","integrity":"sha256-vLtFSlDJpkfv1D3PBBRF8V6N1wZUveUwv2JAHU+3c40="},"flags/1x1/es-ct-7f13eb2b2f5c11dccd7043286bed7540d4dad4b1a8367b0aca1b8405a351b2ef.svg":{"logical_path":"flags/1x1/es-ct.svg","mtime":"2020-02-08T21:52:35+01:00","size":260,"digest":"7f13eb2b2f5c11dccd7043286bed7540d4dad4b1a8367b0aca1b8405a351b2ef","integrity":"sha256-fxPrKy9cEdzNcEMoa+11QNTa1LGoNnsKyhuEBaNRsu8="},"flags/4x3/eu-5f129db64306353251b78f998d531d2f1019404cfa890ae63ed70dc316c7f240.svg":{"logical_path":"flags/4x3/eu.svg","mtime":"2020-02-08T21:52:35+01:00","size":1252,"digest":"5f129db64306353251b78f998d531d2f1019404cfa890ae63ed70dc316c7f240","integrity":"sha256-XxKdtkMGNTJRt4+ZjVMdLxAZQEz6iQrmPtcNwxbH8kA="},"flags/1x1/eu-ec59ac8daf2a63ea8e299ad63a208445d68a96affe6a10a7328acb6799d44127.svg":{"logical_path":"flags/1x1/eu.svg","mtime":"2020-02-08T21:52:35+01:00","size":1253,"digest":"ec59ac8daf2a63ea8e299ad63a208445d68a96affe6a10a7328acb6799d44127","integrity":"sha256-7Fmsja8qY+qOKZrWOiCERdaKlq/+ahCnMorLZ5nUQSc="},"flags/4x3/gb-eng-1895f4e35ae299f5d869da2462ffcf98df4b08dcddc531c8f175e49720001a14.svg":{"logical_path":"flags/4x3/gb-eng.svg","mtime":"2020-02-08T21:52:35+01:00","size":245,"digest":"1895f4e35ae299f5d869da2462ffcf98df4b08dcddc531c8f175e49720001a14","integrity":"sha256-GJX041rimfXYadokYv/PmN9LCNzdxTHI8XXklyAAGhQ="},"flags/1x1/gb-eng-d11afb87f40f35acda435a886ea044bd5e0b6f363ba0c7319f1d0181551fecf3.svg":{"logical_path":"flags/1x1/gb-eng.svg","mtime":"2020-02-08T21:52:35+01:00","size":235,"digest":"d11afb87f40f35acda435a886ea044bd5e0b6f363ba0c7319f1d0181551fecf3","integrity":"sha256-0Rr7h/QPNazaQ1qIbqBEvV4LbzY7oMcxnx0BgVUf7PM="},"flags/4x3/gb-nir-b280f09c787f495c1074376cd67537b40216f672917e7d204bb12b8e7c72afaf.svg":{"logical_path":"flags/4x3/gb-nir.svg","mtime":"2020-02-08T21:52:35+01:00","size":23738,"digest":"b280f09c787f495c1074376cd67537b40216f672917e7d204bb12b8e7c72afaf","integrity":"sha256-soDwnHh/SVwQdDds1nU3tAIW9nKRfn0gS7Erjnxyr68="},"flags/1x1/gb-nir-2e516e72e0e8e244ef430e6608322f8c4fb276807ab033279b2a6570dd68fd41.svg":{"logical_path":"flags/1x1/gb-nir.svg","mtime":"2020-02-08T21:52:35+01:00","size":25263,"digest":"2e516e72e0e8e244ef430e6608322f8c4fb276807ab033279b2a6570dd68fd41","integrity":"sha256-LlFucuDo4kTvQw5mCDIvjE+ydoB6sDMnmyplcN1o/UE="},"flags/4x3/gb-sct-1b9e407802ae901cf8da740c382ec2b19821837d76271a73346e0c63c2244506.svg":{"logical_path":"flags/4x3/gb-sct.svg","mtime":"2020-02-08T21:52:35+01:00","size":234,"digest":"1b9e407802ae901cf8da740c382ec2b19821837d76271a73346e0c63c2244506","integrity":"sha256-G55AeAKukBz42nQMOC7CsZghg312JxpzNG4MY8IkRQY="},"flags/1x1/gb-sct-d01e8a06a340e30ce52e8a3aba7ca6207afb96fdb238a815cc6cb92df8fa5df3.svg":{"logical_path":"flags/1x1/gb-sct.svg","mtime":"2020-02-08T21:52:35+01:00","size":242,"digest":"d01e8a06a340e30ce52e8a3aba7ca6207afb96fdb238a815cc6cb92df8fa5df3","integrity":"sha256-0B6KBqNA4wzlLoo6unymIHr7lv2yOKgVzGy5Lfj6XfM="},"flags/4x3/gb-wls-5232b3e376a19866cddec8225cba242783b2a48063811957f1ce5a2c347c5bc9.svg":{"logical_path":"flags/4x3/gb-wls.svg","mtime":"2020-02-08T21:52:35+01:00","size":9188,"digest":"5232b3e376a19866cddec8225cba242783b2a48063811957f1ce5a2c347c5bc9","integrity":"sha256-UjKz43ahmGbN3sgiXLokJ4OypIBjgRlX8c5aLDR8W8k="},"flags/1x1/gb-wls-126615bc3597fda1ca4ee931ef24f6c2cf2547998c06db9c1ded69fe66c479e9.svg":{"logical_path":"flags/1x1/gb-wls.svg","mtime":"2020-02-08T21:52:35+01:00","size":9083,"digest":"126615bc3597fda1ca4ee931ef24f6c2cf2547998c06db9c1ded69fe66c479e9","integrity":"sha256-EmYVvDWX/aHKTukx7yT2ws8lR5mMBtucHe1p/mbEeek="},"flags/4x3/un-31dece22ae18c3e01e86648ef3ef45f2f5b3d9d28a1e2bbbcdb1d87c37af55af.svg":{"logical_path":"flags/4x3/un.svg","mtime":"2020-02-08T21:52:35+01:00","size":20268,"digest":"31dece22ae18c3e01e86648ef3ef45f2f5b3d9d28a1e2bbbcdb1d87c37af55af","integrity":"sha256-Md7OIq4Yw+AehmSO8+9F8vWz2dKKHiu7zbHYfDevVa8="},"flags/1x1/un-455b5f3173ca9ac64f2135fac4ead7217d7fbe07551d0d2cc60216f83208f798.svg":{"logical_path":"flags/1x1/un.svg","mtime":"2020-02-08T21:52:35+01:00","size":20476,"digest":"455b5f3173ca9ac64f2135fac4ead7217d7fbe07551d0d2cc60216f83208f798","integrity":"sha256-RVtfMXPKmsZPITX6xOrXIX1/vgdVHQ0sxgIW+DII95g="},"leaflet/dist/images/layers-1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6.png":{"logical_path":"leaflet/dist/images/layers.png","mtime":"2020-04-06T16:47:40+02:00","size":696,"digest":"1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6","integrity":"sha256-Hbvp0CjikvNvy6j4s6KNXokydU/CIVuaxp5M3s9RB8Y="},"leaflet/dist/images/layers-2x-066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf.png":{"logical_path":"leaflet/dist/images/layers-2x.png","mtime":"2020-04-06T16:47:40+02:00","size":1259,"digest":"066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf","integrity":"sha256-Bm2sqFDY/77wB68AsG6sABVyje4nnFHzy2xxbffELt8="},"leaflet/dist/images/marker-icon-574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437.png":{"logical_path":"leaflet/dist/images/marker-icon.png","mtime":"2020-04-06T16:47:40+02:00","size":1466,"digest":"574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437","integrity":"sha256-V0w6XMqF9BFAhbaEFZbWLwDXyJLHsD8oy/owHesdxDc="},"markers-soft-e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739.png":{"logical_path":"markers-soft.png","mtime":"2020-04-06T16:47:40+02:00","size":41226,"digest":"e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739","integrity":"sha256-54eE5O1wqv/d1zwxX6tZAjPMTntyOI191HoUeW/Hxzk="},"markers-shadow-8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20.png":{"logical_path":"markers-shadow.png","mtime":"2020-04-06T16:47:40+02:00","size":535,"digest":"8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20","integrity":"sha256-hwOiJicQ9ePSnmXSrN+Q1lEuFZ4RnSe4I0cx2KYgiiA="},"markers-soft@2x-c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf.png":{"logical_path":"markers-soft@2x.png","mtime":"2020-04-06T16:47:40+02:00","size":66408,"digest":"c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf","integrity":"sha256-wedyU6i/vjDOwkiF1wRvRDt267ZvTJYfdwg7A/Sly68="},"markers-shadow@2x-b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a.png":{"logical_path":"markers-shadow@2x.png","mtime":"2020-04-06T16:47:40+02:00","size":1469,"digest":"b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a","integrity":"sha256-shpTa+JzE/tQT2n1iZ/wsSRbJ2VxdprAjWwyw1Z25Ho="},"events-f12a16c68c84767cfc222c763d56e2209bc4d5ad519f05095f2d4429c0b1a315.js":{"logical_path":"events.js","mtime":"2020-04-06T16:47:40+02:00","size":1220,"digest":"f12a16c68c84767cfc222c763d56e2209bc4d5ad519f05095f2d4429c0b1a315","integrity":"sha256-8SoWxoyEdnz8Iix2PVbiIJvE1a1RnwUJXy1EKcCxoxU="},"filter-2ec96b9d0c650c880941d7e9fd568decd1d587dc037d106144a07ad103b0e0ca.js":{"logical_path":"filter.js","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"2ec96b9d0c650c880941d7e9fd568decd1d587dc037d106144a07ad103b0e0ca","integrity":"sha256-LslrnQxlDIgJQdfp/VaN7NHVh9wDfRBhRKB60QOw4Mo="},"flash-41f5b95206f7a684b89eb997846a01155f94ab0b6568b4275704d3f285f599d7.js":{"logical_path":"flash.js","mtime":"2020-04-06T16:47:40+02:00","size":82,"digest":"41f5b95206f7a684b89eb997846a01155f94ab0b6568b4275704d3f285f599d7","integrity":"sha256-QfW5Ugb3poS4nrmXhGoBFV+UqwtlaLQnVwTT8oX1mdc="},"frTypo-fed98b7d2ce187c2a3cff9153ac6aa2dbf7b91d33809da77c6561ff34d1be836.js":{"logical_path":"frTypo.js","mtime":"2020-04-06T16:47:40+02:00","size":1962,"digest":"fed98b7d2ce187c2a3cff9153ac6aa2dbf7b91d33809da77c6561ff34d1be836","integrity":"sha256-/tmLfSzhh8Kjz/kVOsaqLb97kdM4Cdp3xlYf800b6DY="},"maps-e86261c3df6f4ff292d786ab7261c98c408f466557b2f4915ae6dc25c1a05819.js":{"logical_path":"maps.js","mtime":"2020-01-07T21:15:22+01:00","size":3970,"digest":"e86261c3df6f4ff292d786ab7261c98c408f466557b2f4915ae6dc25c1a05819","integrity":"sha256-6GJhw99vT/KS14arcmHJjECPRmVXsvSRWubcJcGgWBk="},"moderations-c5471afdd75123fdbb36ee14b85e6633c8127d0c115e35931616c329a8605380.js":{"logical_path":"moderations.js","mtime":"2020-04-06T16:47:40+02:00","size":377,"digest":"c5471afdd75123fdbb36ee14b85e6633c8127d0c115e35931616c329a8605380","integrity":"sha256-xUca/ddRI/27Nu4UuF5mM8gSfQwRXjWTFhbDKahgU4A="},"notes-85819c738920d4fe3e6b89716788590d27b2db4b11802c0a0cdd48baefb18fcb.js":{"logical_path":"notes.js","mtime":"2020-04-06T16:47:40+02:00","size":31,"digest":"85819c738920d4fe3e6b89716788590d27b2db4b11802c0a0cdd48baefb18fcb","integrity":"sha256-hYGcc4kg1P4+a4lxZ4hZDSey20sRgCwKDN1Iuu+xj8s="},"orgas-85819c738920d4fe3e6b89716788590d27b2db4b11802c0a0cdd48baefb18fcb.js":{"logical_path":"orgas.js","mtime":"2020-04-06T16:47:40+02:00","size":31,"digest":"85819c738920d4fe3e6b89716788590d27b2db4b11802c0a0cdd48baefb18fcb","integrity":"sha256-hYGcc4kg1P4+a4lxZ4hZDSey20sRgCwKDN1Iuu+xj8s="},"pages-9dcc8cb3626a9f198ab95f9e64bb4d269167a7405dd07f94140f5ec6d32b6084.js":{"logical_path":"pages.js","mtime":"2020-04-05T17:14:06+02:00","size":694,"digest":"9dcc8cb3626a9f198ab95f9e64bb4d269167a7405dd07f94140f5ec6d32b6084","integrity":"sha256-ncyMs2JqnxmKuV+eZLtNJpFnp0Bd0H+UFA9extMrYIQ="},"pagination-ab6b8afabe3d53764287ed9d0ee9d4b7092cab98cdfb453a54471066fed05aa5.js":{"logical_path":"pagination.js","mtime":"2020-01-16T20:20:11+01:00","size":728,"digest":"ab6b8afabe3d53764287ed9d0ee9d4b7092cab98cdfb453a54471066fed05aa5","integrity":"sha256-q2uK+r49U3ZCh+2dDunUtwksq5jN+0U6VEcQZv7QWqU="},"stats-40295d647e6144715bc9fb45f60096ddff913afddf11844aeacda47cbed68400.js":{"logical_path":"stats.js","mtime":"2020-04-06T16:47:40+02:00","size":908,"digest":"40295d647e6144715bc9fb45f60096ddff913afddf11844aeacda47cbed68400","integrity":"sha256-QCldZH5hRHFbyftF9gCW3f+ROv3fEYRK6s2kfL7WhAA="},"_variables-d0ff5974b6aa52cf562bea5921840c032a860a91a3512f7fe8f768f6bbe005f6.css":{"logical_path":"_variables.css","mtime":"2020-04-06T16:47:40+02:00","size":0,"digest":"d0ff5974b6aa52cf562bea5921840c032a860a91a3512f7fe8f768f6bbe005f6","integrity":"sha256-0P9ZdLaqUs9WK+pZIYQMAyqGCpGjUS9/6Pdo9rvgBfY="},"agendadescommuns-734d24884af76ee167fcf102dbdbec43e5b2726e65f40c350ad3800f7ee99f55.css":{"logical_path":"agendadescommuns.css","mtime":"2020-04-06T16:47:40+02:00","size":939,"digest":"734d24884af76ee167fcf102dbdbec43e5b2726e65f40c350ad3800f7ee99f55","integrity":"sha256-c00kiEr3buFn/PEC29vsQ+Wycm5l9Aw1CtOAD37pn1U="},"all-a55a9ed762f8344ecd74346308ae7066a283d34302fbce1ef5924ad5ce19bb27.css":{"logical_path":"all.css","mtime":"2020-04-06T16:47:40+02:00","size":2745,"digest":"a55a9ed762f8344ecd74346308ae7066a283d34302fbce1ef5924ad5ce19bb27","integrity":"sha256-pVqe12L4NE7NdDRjCK5wZqKD00MC+84e9ZJK1c4Zuyc="},"digest-e13dd03a72165cef5027b81a774f458fe1a6910d2baaae84bae560b3199a77c3.css":{"logical_path":"digest.css","mtime":"2020-04-06T16:47:40+02:00","size":304,"digest":"e13dd03a72165cef5027b81a774f458fe1a6910d2baaae84bae560b3199a77c3","integrity":"sha256-4T3QOnIWXO9QJ7gad09Fj+GmkQ0rqq6EuuVgsxmad8M="},"events-bb56649a8c5b11d0b8005a8e23e7560f34d7b79fcccccffe4a1407102cfffed6.css":{"logical_path":"events.css","mtime":"2020-04-06T16:47:40+02:00","size":3191,"digest":"bb56649a8c5b11d0b8005a8e23e7560f34d7b79fcccccffe4a1407102cfffed6","integrity":"sha256-u1ZkmoxbEdC4AFqOI+dWDzTXt5/MzM/+ShQHECz//tY="},"frTypo-ebcaa45fa7c0bf7821d05959aaceda63d26a30d30079e70619932b0e1d49f512.css":{"logical_path":"frTypo.css","mtime":"2020-04-06T16:47:40+02:00","size":76,"digest":"ebcaa45fa7c0bf7821d05959aaceda63d26a30d30079e70619932b0e1d49f512","integrity":"sha256-68qkX6fAv3gh0FlZqs7aY9JqMNMAeecGGZMrDh1J9RI="},"maps-644829bf7b14b0c1b73efb7b2d44049969271bd969174b5bf7c53d0159cf424c.css":{"logical_path":"maps.css","mtime":"2020-01-17T21:34:48+01:00","size":536,"digest":"644829bf7b14b0c1b73efb7b2d44049969271bd969174b5bf7c53d0159cf424c","integrity":"sha256-ZEgpv3sUsMG3Pvt7LUQEmWknG9lpF0tb98U9AVnPQkw="},"mobile-59b7aeed8e7ee6e2ced7bb7a6f26ae9e4e2ed3c514a584c0e706128b4ad7fe36.css":{"logical_path":"mobile.css","mtime":"2020-04-06T16:47:40+02:00","size":2414,"digest":"59b7aeed8e7ee6e2ced7bb7a6f26ae9e4e2ed3c514a584c0e706128b4ad7fe36","integrity":"sha256-Wbeu7Y5+5uLO17t6byaunk4u08UUpYTA5wYSi0rX/jY="},"notes-e607250b9cef023a762c009acc65c3320ec1f6d5814a30aa3c1ba907b4f8cb5f.css":{"logical_path":"notes.css","mtime":"2020-04-06T16:47:40+02:00","size":37,"digest":"e607250b9cef023a762c009acc65c3320ec1f6d5814a30aa3c1ba907b4f8cb5f","integrity":"sha256-5gclC5zvAjp2LACazGXDMg7B9tWBSjCqPBupB7T4y18="},"orgas-dd7a2a3fc67e9fa14675e1b59263b8f83e052274d6b900875b0ee4494143ad80.css":{"logical_path":"orgas.css","mtime":"2020-04-06T16:47:40+02:00","size":672,"digest":"dd7a2a3fc67e9fa14675e1b59263b8f83e052274d6b900875b0ee4494143ad80","integrity":"sha256-3XoqP8Z+n6FGdeG1kmO4+D4FInTWuQCHWw7kSUFDrYA="},"pages-5eed9147c9cfe84eb1299bc0ca0d8b0c81fb0c07ecb38e26949e7d4e483746e2.css":{"logical_path":"pages.css","mtime":"2020-04-06T16:47:40+02:00","size":75,"digest":"5eed9147c9cfe84eb1299bc0ca0d8b0c81fb0c07ecb38e26949e7d4e483746e2","integrity":"sha256-Xu2RR8nP6E6xKZvAyg2LDIH7DAfss44mlJ59Tkg3RuI="},"region-d285b5ecdf6d5b5ee68faac92854e4868a609e5509b90e90047178ac45649153.css":{"logical_path":"region.css","mtime":"2019-12-22T12:30:30+01:00","size":1903,"digest":"d285b5ecdf6d5b5ee68faac92854e4868a609e5509b90e90047178ac45649153","integrity":"sha256-0oW17N9tW17mj6rJKFTkhopgnlUJuQ6QBHF4rEVkkVM="},"scaffolds-c26fee551087c3b72541cae52a1cc6b454f153e2d04c01d4b35b9ec1ae6cf09b.css":{"logical_path":"scaffolds.css","mtime":"2020-04-06T16:47:40+02:00","size":430,"digest":"c26fee551087c3b72541cae52a1cc6b454f153e2d04c01d4b35b9ec1ae6cf09b","integrity":"sha256-wm/uVRCHw7clQcrlKhzGtFTxU+LQTAHUs1uewa5s8Js="},"sessions-d0ff5974b6aa52cf562bea5921840c032a860a91a3512f7fe8f768f6bbe005f6.css":{"logical_path":"sessions.css","mtime":"2020-04-06T16:47:40+02:00","size":0,"digest":"d0ff5974b6aa52cf562bea5921840c032a860a91a3512f7fe8f768f6bbe005f6","integrity":"sha256-0P9ZdLaqUs9WK+pZIYQMAyqGCpGjUS9/6Pdo9rvgBfY="},"tags-c338d658bc3a1e40d8c6694d1fab6a633686ccc2c626563f890384fab38c20f0.css":{"logical_path":"tags.css","mtime":"2020-02-08T21:52:35+01:00","size":1399,"digest":"c338d658bc3a1e40d8c6694d1fab6a633686ccc2c626563f890384fab38c20f0","integrity":"sha256-wzjWWLw6HkDYxmlNH6tqYzaGzMLGJlY/iQOE+rOMIPA="},"versions-3e2a6ffdc6f7728b0e5e517a208c4d1a72167a6d4da6bc4d36db4941150926bb.css":{"logical_path":"versions.css","mtime":"2020-04-06T16:47:40+02:00","size":47,"digest":"3e2a6ffdc6f7728b0e5e517a208c4d1a72167a6d4da6bc4d36db4941150926bb","integrity":"sha256-Pipv/cb3cosOXlF6IIxNGnIWem1NprxNNttJQRUJJrs="},"moderations-d96d93c516d69b280e4d312ec96d2c13f3650e03c57cc08bf582b2d26bf2882e.css":{"logical_path":"moderations.css","mtime":"2019-12-25T17:18:51+01:00","size":939,"digest":"d96d93c516d69b280e4d312ec96d2c13f3650e03c57cc08bf582b2d26bf2882e","integrity":"sha256-2W2TxRbWmygOTTEuyW0sE/NlDgPFfMCL9YKy0mvyiC4="},"region-0d416c6171a588eb6a1a40642f2984f08b0b205d2eab077b12bd859fd60cef3e.css":{"logical_path":"region.css","mtime":"2020-04-06T16:47:40+02:00","size":1871,"digest":"0d416c6171a588eb6a1a40642f2984f08b0b205d2eab077b12bd859fd60cef3e","integrity":"sha256-DUFsYXGliOtqGkBkLymE8IsLIF0uqwd7Er2Fn9YM7z4="},"stats-e46b6e6ffdd66de16d29c029216debae3fc6f81d83e21bc8be2700df34cb4f20.css":{"logical_path":"stats.css","mtime":"2019-12-25T17:18:51+01:00","size":403,"digest":"e46b6e6ffdd66de16d29c029216debae3fc6f81d83e21bc8be2700df34cb4f20","integrity":"sha256-5Gtub/3WbeFtKcApIW3rrj/G+B2D4hvIvicA3zTLTyA="},"moderations-ede8f4f2808ab572908780f2daea2ea4e76b1d0b0c5735d744bb7cc51fb69895.css":{"logical_path":"moderations.css","mtime":"2020-04-06T16:47:40+02:00","size":979,"digest":"ede8f4f2808ab572908780f2daea2ea4e76b1d0b0c5735d744bb7cc51fb69895","integrity":"sha256-7ej08oCKtXKQh4Dy2uoupOdrHQsMVzXXRLt8xR+2mJU="},"stats-a22ad34b2184e63c6ee60f75829dcae68c2a3e9094a0af419e06306b5b68af45.css":{"logical_path":"stats.css","mtime":"2020-04-06T16:47:40+02:00","size":505,"digest":"a22ad34b2184e63c6ee60f75829dcae68c2a3e9094a0af419e06306b5b68af45","integrity":"sha256-oirTSyGE5jxu5g91gp3K5owqPpCUoK9BngYwa1tor0U="},"tinymce/skins/ui/oxide-dark/content.mobile.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.mobile.css","mtime":"2022-04-11T11:07:13+02:00","size":294,"digest":null,"integrity":"sha256-7qF/Ddgyp8cwRME7hp57kTRuMu/iJl84uTHyxgQL6F8="},"tinymce/skins/ui/oxide-dark/content.mobile.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.mobile.min.css","mtime":"2022-04-11T11:07:13+02:00","size":294,"digest":null,"integrity":"sha256-7qF/Ddgyp8cwRME7hp57kTRuMu/iJl84uTHyxgQL6F8="},"tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff":{"logical_path":"tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff","mtime":"2022-04-11T11:07:13+02:00","size":4624,"digest":null,"integrity":"sha256-5kvxVqQy1j9bNLRWe1E9wNNRtJFhx/YI+4JXS/3Z0hM="},"tinymce/skins/ui/oxide/content.mobile.css":{"logical_path":"tinymce/skins/ui/oxide/content.mobile.css","mtime":"2022-04-11T11:07:13+02:00","size":294,"digest":null,"integrity":"sha256-7qF/Ddgyp8cwRME7hp57kTRuMu/iJl84uTHyxgQL6F8="},"tinymce/skins/ui/oxide/content.mobile.min.css":{"logical_path":"tinymce/skins/ui/oxide/content.mobile.min.css","mtime":"2022-04-11T11:07:13+02:00","size":294,"digest":null,"integrity":"sha256-7qF/Ddgyp8cwRME7hp57kTRuMu/iJl84uTHyxgQL6F8="},"tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff":{"logical_path":"tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff","mtime":"2022-04-11T11:07:13+02:00","size":4624,"digest":null,"integrity":"sha256-5kvxVqQy1j9bNLRWe1E9wNNRtJFhx/YI+4JXS/3Z0hM="},"tinymce-rails.manifest-e761884522a9ca2dac475b68bac1946c990fb9af8b676d3b6b45692a920c8d04.js":{"logical_path":"tinymce-rails.manifest.js","mtime":"2020-04-06T16:47:39+02:00","size":3,"digest":"e761884522a9ca2dac475b68bac1946c990fb9af8b676d3b6b45692a920c8d04","integrity":"sha256-52GIRSKpyi2sR1tousGUbJkPua+LZ207a0VpKpIMjQQ="},"tinymce/skins/content/dark/content-6d10d0c4a63ab02f8fb5d35269832ba1e26d4e74e419d01f4c66c5282d3dd1af.css":{"logical_path":"tinymce/skins/content/dark/content.css","mtime":"2020-04-06T16:47:39+02:00","size":832,"digest":"6d10d0c4a63ab02f8fb5d35269832ba1e26d4e74e419d01f4c66c5282d3dd1af","integrity":"sha256-bRDQxKY6sC+PtdNSaYMroeJtTnTkGdAfTGbFKC090a8="},"tinymce/skins/content/dark/content.min-6d10d0c4a63ab02f8fb5d35269832ba1e26d4e74e419d01f4c66c5282d3dd1af.css":{"logical_path":"tinymce/skins/content/dark/content.min.css","mtime":"2020-04-06T16:47:39+02:00","size":832,"digest":"6d10d0c4a63ab02f8fb5d35269832ba1e26d4e74e419d01f4c66c5282d3dd1af","integrity":"sha256-bRDQxKY6sC+PtdNSaYMroeJtTnTkGdAfTGbFKC090a8="},"tinymce/skins/content/default/content-6c8756ba3e02f97451d5c55be85537c3fc75da6e9edea7121c8b9e64aa903528.css":{"logical_path":"tinymce/skins/content/default/content.css","mtime":"2020-04-06T16:47:39+02:00","size":707,"digest":"6c8756ba3e02f97451d5c55be85537c3fc75da6e9edea7121c8b9e64aa903528","integrity":"sha256-bIdWuj4C+XRR1cVb6FU3w/x12m6e3qcSHIueZKqQNSg="},"tinymce/skins/content/default/content.min-6c8756ba3e02f97451d5c55be85537c3fc75da6e9edea7121c8b9e64aa903528.css":{"logical_path":"tinymce/skins/content/default/content.min.css","mtime":"2020-04-06T16:47:39+02:00","size":707,"digest":"6c8756ba3e02f97451d5c55be85537c3fc75da6e9edea7121c8b9e64aa903528","integrity":"sha256-bIdWuj4C+XRR1cVb6FU3w/x12m6e3qcSHIueZKqQNSg="},"tinymce/skins/content/document/content-cef2580b983fd570768ec93bed32544cfd4f3aeb5cc71da988e5acaa803c276f.css":{"logical_path":"tinymce/skins/content/document/content.css","mtime":"2020-04-06T16:47:39+02:00","size":791,"digest":"cef2580b983fd570768ec93bed32544cfd4f3aeb5cc71da988e5acaa803c276f","integrity":"sha256-zvJYC5g/1XB2jsk77TJUTP1POutcxx2piOWsqoA8J28="},"tinymce/skins/content/document/content.min-cef2580b983fd570768ec93bed32544cfd4f3aeb5cc71da988e5acaa803c276f.css":{"logical_path":"tinymce/skins/content/document/content.min.css","mtime":"2020-04-06T16:47:39+02:00","size":791,"digest":"cef2580b983fd570768ec93bed32544cfd4f3aeb5cc71da988e5acaa803c276f","integrity":"sha256-zvJYC5g/1XB2jsk77TJUTP1POutcxx2piOWsqoA8J28="},"tinymce/skins/content/writer/content-eb8e48d175f37ee3a4deb4fafb4cde5f579420b4ba62c14e96e6da9fd937b622.css":{"logical_path":"tinymce/skins/content/writer/content.css","mtime":"2020-04-06T16:47:39+02:00","size":728,"digest":"eb8e48d175f37ee3a4deb4fafb4cde5f579420b4ba62c14e96e6da9fd937b622","integrity":"sha256-645I0XXzfuOk3rT6+0zeX1eUILS6YsFOluban9k3tiI="},"tinymce/skins/content/writer/content.min-eb8e48d175f37ee3a4deb4fafb4cde5f579420b4ba62c14e96e6da9fd937b622.css":{"logical_path":"tinymce/skins/content/writer/content.min.css","mtime":"2020-04-06T16:47:39+02:00","size":728,"digest":"eb8e48d175f37ee3a4deb4fafb4cde5f579420b4ba62c14e96e6da9fd937b622","integrity":"sha256-645I0XXzfuOk3rT6+0zeX1eUILS6YsFOluban9k3tiI="},"tinymce/skins/ui/oxide-dark/content.mobile-72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.mobile.css","mtime":"2020-04-06T16:47:39+02:00","size":294,"digest":"72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064","integrity":"sha256-clFMbAK98C/nJ8v0qPyNBz3uj8+u376EdEmmIb/w8GQ="},"tinymce/skins/ui/oxide-dark/content.mobile.min-72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.mobile.min.css","mtime":"2020-04-06T16:47:39+02:00","size":294,"digest":"72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064","integrity":"sha256-clFMbAK98C/nJ8v0qPyNBz3uj8+u376EdEmmIb/w8GQ="},"tinymce/skins/ui/oxide-dark/skin.mobile-8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.css","mtime":"2020-04-06T16:47:39+02:00","size":20783,"digest":"8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a","integrity":"sha256-im0d74Ken0Iv2S24iFdAWuUSioFtsMM8+OTv9RNzizo="},"tinymce/skins/ui/oxide-dark/skin.mobile.min-8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.min.css","mtime":"2020-04-06T16:47:39+02:00","size":20783,"digest":"8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a","integrity":"sha256-im0d74Ken0Iv2S24iFdAWuUSioFtsMM8+OTv9RNzizo="},"tinymce/skins/ui/oxide/content.mobile-72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064.css":{"logical_path":"tinymce/skins/ui/oxide/content.mobile.css","mtime":"2020-04-06T16:47:39+02:00","size":294,"digest":"72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064","integrity":"sha256-clFMbAK98C/nJ8v0qPyNBz3uj8+u376EdEmmIb/w8GQ="},"tinymce/skins/ui/oxide/content.mobile.min-72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064.css":{"logical_path":"tinymce/skins/ui/oxide/content.mobile.min.css","mtime":"2020-04-06T16:47:39+02:00","size":294,"digest":"72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064","integrity":"sha256-clFMbAK98C/nJ8v0qPyNBz3uj8+u376EdEmmIb/w8GQ="},"tinymce/skins/ui/oxide/skin.mobile-8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.css","mtime":"2020-04-06T16:47:39+02:00","size":20783,"digest":"8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a","integrity":"sha256-im0d74Ken0Iv2S24iFdAWuUSioFtsMM8+OTv9RNzizo="},"tinymce/skins/ui/oxide/skin.mobile.min-8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.min.css","mtime":"2020-04-06T16:47:39+02:00","size":20783,"digest":"8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a","integrity":"sha256-im0d74Ken0Iv2S24iFdAWuUSioFtsMM8+OTv9RNzizo="},"tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile-e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213.woff":{"logical_path":"tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff","mtime":"2020-04-06T16:47:39+02:00","size":4624,"digest":"e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213","integrity":"sha256-5kvxVqQy1j9bNLRWe1E9wNNRtJFhx/YI+4JXS/3Z0hM="},"tinymce/skins/ui/oxide/fonts/tinymce-mobile-e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213.woff":{"logical_path":"tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff","mtime":"2020-04-06T16:47:39+02:00","size":4624,"digest":"e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213","integrity":"sha256-5kvxVqQy1j9bNLRWe1E9wNNRtJFhx/YI+4JXS/3Z0hM="},"maps-81cfae958ef9248cab2f666cc53c8a003cf1e11bcb0b90297c01c87fde557e25.js":{"logical_path":"maps.js","mtime":"2020-04-06T16:47:40+02:00","size":3760,"digest":"81cfae958ef9248cab2f666cc53c8a003cf1e11bcb0b90297c01c87fde557e25","integrity":"sha256-gc+ulY75JIyrL2ZsxTyKADzx4RvLC5ApfAHIf95VfiU="},"lef-6508797f5a020d87aa0db27dcddd904ba3cc9e438adb1c90f5163af8377acaee.png":{"logical_path":"lef.png","mtime":"2020-04-06T16:47:39+02:00","size":24674,"digest":"6508797f5a020d87aa0db27dcddd904ba3cc9e438adb1c90f5163af8377acaee","integrity":"sha256-ZQh5f1oCDYeqDbJ9zd2QS6PMnkOK2xyQ9RY6+Dd6yu4="},"list-36f999a19ad2efdd776921f8c8a1cbcc168ab9735fec39326a040907b72f6f2c.js":{"logical_path":"list.js","mtime":"2020-02-04T18:01:42+01:00","size":1103,"digest":"36f999a19ad2efdd776921f8c8a1cbcc168ab9735fec39326a040907b72f6f2c","integrity":"sha256-NvmZoZrS7913aSH4yKHLzBaKuXNf7DkyagQJB7cvbyw="},"maps-2cbe926bbfbadc48d08ee61a7fad5dfd9d56573ff070d94c4045cf79daa919ba.css":{"logical_path":"maps.css","mtime":"2020-04-06T16:47:40+02:00","size":524,"digest":"2cbe926bbfbadc48d08ee61a7fad5dfd9d56573ff070d94c4045cf79daa919ba","integrity":"sha256-LL6Sa7+63EjQjuYaf61d/Z1WVz/wcNlMQEXPedqpGbo="},"list-e31f674476f4f7c5b464b1ee3c6832f4dc7d0588597a383a6fb372127b2b27bd.js":{"logical_path":"list.js","mtime":"2020-04-06T16:47:40+02:00","size":1272,"digest":"e31f674476f4f7c5b464b1ee3c6832f4dc7d0588597a383a6fb372127b2b27bd","integrity":"sha256-4x9nRHb098W0ZLHuPGgy9Nx9BYhZejg6b7NyEnsrJ70="},"list-efff25153e0f94f2af353b02e239c51da65e3a1250369a9960ca35648925d9f7.css":{"logical_path":"list.css","mtime":"2020-04-06T16:47:40+02:00","size":940,"digest":"efff25153e0f94f2af353b02e239c51da65e3a1250369a9960ca35648925d9f7","integrity":"sha256-7/8lFT4PlPKvNTsC4jnFHaZeOhJQNpqZYMo1ZIkl2fc="},"flags/4x3/ad-af21bc50f12e6076f79dbddb6049ea32bf747e4a9dbf628781eaf29e81c6232c.svg":{"logical_path":"flags/4x3/ad.svg","mtime":"2020-04-06T16:47:40+02:00","size":33473,"digest":"af21bc50f12e6076f79dbddb6049ea32bf747e4a9dbf628781eaf29e81c6232c","integrity":"sha256-ryG8UPEuYHb3nb3bYEnqMr90fkqdv2KHgerynoHGIyw="},"flags/1x1/ad-5f301eee62631c50459507a29617ac02cc8106359da22b9705d3b73e50dcb839.svg":{"logical_path":"flags/1x1/ad.svg","mtime":"2020-04-06T16:47:40+02:00","size":32253,"digest":"5f301eee62631c50459507a29617ac02cc8106359da22b9705d3b73e50dcb839","integrity":"sha256-XzAe7mJjHFBFlQeilhesAsyBBjWdoiuXBdO3PlDcuDk="},"flags/4x3/ae-660f600189f77fbacd2099f5b898864e08a67d0cfe3905c390dcf6b86489dbe4.svg":{"logical_path":"flags/4x3/ae.svg","mtime":"2020-04-06T16:47:40+02:00","size":254,"digest":"660f600189f77fbacd2099f5b898864e08a67d0cfe3905c390dcf6b86489dbe4","integrity":"sha256-Zg9gAYn3f7rNIJn1uJiGTgimfQz+OQXDkNz2uGSJ2+Q="},"flags/1x1/ae-09943e355944d6870f74093d858503de204f02ca78f70122a5a7d74897134b6d.svg":{"logical_path":"flags/1x1/ae.svg","mtime":"2020-04-06T16:47:40+02:00","size":262,"digest":"09943e355944d6870f74093d858503de204f02ca78f70122a5a7d74897134b6d","integrity":"sha256-CZQ+NVlE1ocPdAk9hYUD3iBPAsp49wEipafXSJcTS20="},"flags/4x3/af-c7bfd83db1aefc08972a093aca88285194feb05ab87fb5ede44acb107a2f84e0.svg":{"logical_path":"flags/4x3/af.svg","mtime":"2020-04-06T16:47:40+02:00","size":21066,"digest":"c7bfd83db1aefc08972a093aca88285194feb05ab87fb5ede44acb107a2f84e0","integrity":"sha256-x7/YPbGu/AiXKgk6yogoUZT+sFq4f7Xt5ErLEHovhOA="},"flags/1x1/af-f0fe67d6b190381b4b7a039173c8d74a2dc8f7773ca6ac79de25b0b14c8b80f0.svg":{"logical_path":"flags/1x1/af.svg","mtime":"2020-04-06T16:47:40+02:00","size":20928,"digest":"f0fe67d6b190381b4b7a039173c8d74a2dc8f7773ca6ac79de25b0b14c8b80f0","integrity":"sha256-8P5n1rGQOBtLegORc8jXSi3I93c8pqx53iWwsUyLgPA="},"flags/4x3/ag-a986cf9b57900ccf9ac75cf39b5f519385e80dc6319fbf584c33e08e5b913d50.svg":{"logical_path":"flags/4x3/ag.svg","mtime":"2020-04-06T16:47:40+02:00","size":749,"digest":"a986cf9b57900ccf9ac75cf39b5f519385e80dc6319fbf584c33e08e5b913d50","integrity":"sha256-qYbPm1eQDM+ax1zzm19Rk4XoDcYxn79YTDPgjluRPVA="},"flags/1x1/ag-b0ee8dc5572db906f3765696c41fbaef3df72651fe0eaa306acfaa310ab80d06.svg":{"logical_path":"flags/1x1/ag.svg","mtime":"2020-04-06T16:47:40+02:00","size":761,"digest":"b0ee8dc5572db906f3765696c41fbaef3df72651fe0eaa306acfaa310ab80d06","integrity":"sha256-sO6NxVctuQbzdlaWxB+67z33JlH+Dqowas+qMQq4DQY="},"flags/4x3/ai-efd0c274edd8ce7fc9b665c783f1fc297218b699965677ea0762fe46c0cceff6.svg":{"logical_path":"flags/4x3/ai.svg","mtime":"2020-04-06T16:47:40+02:00","size":48259,"digest":"efd0c274edd8ce7fc9b665c783f1fc297218b699965677ea0762fe46c0cceff6","integrity":"sha256-79DCdO3Yzn/JtmXHg/H8KXIYtpmWVnfqB2L+RsDM7/Y="},"flags/1x1/ai-b6ba8568e879a3c78e19c6aa712b47617c9ec91ab03de656f43a41bbbc1cf02f.svg":{"logical_path":"flags/1x1/ai.svg","mtime":"2020-04-06T16:47:40+02:00","size":48199,"digest":"b6ba8568e879a3c78e19c6aa712b47617c9ec91ab03de656f43a41bbbc1cf02f","integrity":"sha256-trqFaOh5o8eOGcaqcStHYXyeyRqwPeZW9DpBu7wc8C8="},"flags/4x3/al-87476e4c4b339983bcda71637a718eed1670bed1e39d7419db41b8f9db3a9485.svg":{"logical_path":"flags/4x3/al.svg","mtime":"2020-04-06T16:47:40+02:00","size":3206,"digest":"87476e4c4b339983bcda71637a718eed1670bed1e39d7419db41b8f9db3a9485","integrity":"sha256-h0duTEszmYO82nFjenGO7RZwvtHjnXQZ20G4+ds6lIU="},"flags/1x1/al-b8c66c9d8f77fe6292e524164c8072fdaf2728daae036fe52cf541dc8dcea217.svg":{"logical_path":"flags/1x1/al.svg","mtime":"2020-04-06T16:47:40+02:00","size":3205,"digest":"b8c66c9d8f77fe6292e524164c8072fdaf2728daae036fe52cf541dc8dcea217","integrity":"sha256-uMZsnY93/mKS5SQWTIBy/a8nKNquA2/lLPVB3I3Oohc="},"flags/4x3/am-8244966df26ff96a23e4d1ec5411c7f8fdd2b935c48189dfb2e258bda95e986e.svg":{"logical_path":"flags/4x3/am.svg","mtime":"2020-04-06T16:47:40+02:00","size":223,"digest":"8244966df26ff96a23e4d1ec5411c7f8fdd2b935c48189dfb2e258bda95e986e","integrity":"sha256-gkSWbfJv+Woj5NHsVBHH+P3SuTXEgYnfsuJYvalemG4="},"flags/1x1/am-48d3c9b60f3f9f482d83cd54459703e760b1a9524a290a491290588eb656387b.svg":{"logical_path":"flags/1x1/am.svg","mtime":"2020-04-06T16:47:40+02:00","size":231,"digest":"48d3c9b60f3f9f482d83cd54459703e760b1a9524a290a491290588eb656387b","integrity":"sha256-SNPJtg8/n0gtg81URZcD52CxqVJKKQpJEpBYjrZWOHs="},"flags/4x3/ao-7ac46e1cd0c7d36c3229911376e38f7a9f578f627bd889f23ab5d5c9597cbc36.svg":{"logical_path":"flags/4x3/ao.svg","mtime":"2020-04-06T16:47:40+02:00","size":1588,"digest":"7ac46e1cd0c7d36c3229911376e38f7a9f578f627bd889f23ab5d5c9597cbc36","integrity":"sha256-esRuHNDH02wyKZETduOPep9Xj2J72InyOrXVyVl8vDY="},"flags/1x1/ao-b4bdbc4113ca80e45c6f96cf620a4638a4fea2dbd143780cc086531bb968ee63.svg":{"logical_path":"flags/1x1/ao.svg","mtime":"2020-04-06T16:47:40+02:00","size":1588,"digest":"b4bdbc4113ca80e45c6f96cf620a4638a4fea2dbd143780cc086531bb968ee63","integrity":"sha256-tL28QRPKgORcb5bPYgpGOKT+otvRQ3gMwIZTG7lo7mM="},"flags/4x3/aq-62ee1988140dee84b7c8dd5ffa27db67b3242505b9ac16a91981cd05599c49b4.svg":{"logical_path":"flags/4x3/aq.svg","mtime":"2020-04-06T16:47:40+02:00","size":6143,"digest":"62ee1988140dee84b7c8dd5ffa27db67b3242505b9ac16a91981cd05599c49b4","integrity":"sha256-Yu4ZiBQN7oS3yN1f+ifbZ7MkJQW5rBapGYHNBVmcSbQ="},"flags/1x1/aq-2fd9279bb4fe7bd6cb53aeab191764e3602ca9e5324e306dd178e9b229ab6d93.svg":{"logical_path":"flags/1x1/aq.svg","mtime":"2020-04-06T16:47:40+02:00","size":5958,"digest":"2fd9279bb4fe7bd6cb53aeab191764e3602ca9e5324e306dd178e9b229ab6d93","integrity":"sha256-L9knm7T+e9bLU66rGRdk42AsqeUyTjBt0XjpsimrbZM="},"flags/4x3/ar-036d9c340499588b37c3ff853da7ea105eb35fae876d7cfe034ebe3cc3764cd8.svg":{"logical_path":"flags/4x3/ar.svg","mtime":"2020-04-06T16:47:40+02:00","size":3402,"digest":"036d9c340499588b37c3ff853da7ea105eb35fae876d7cfe034ebe3cc3764cd8","integrity":"sha256-A22cNASZWIs3w/+FPafqEF6zX66HbXz+A06+PMN2TNg="},"flags/1x1/ar-3c7a866d916efd9ab117bebd9651daceee196ee95e420f6fd6be8c8839c067d4.svg":{"logical_path":"flags/1x1/ar.svg","mtime":"2020-04-06T16:47:40+02:00","size":3473,"digest":"3c7a866d916efd9ab117bebd9651daceee196ee95e420f6fd6be8c8839c067d4","integrity":"sha256-PHqGbZFu/ZqxF769llHazu4ZbuleQg9v1r6MiDnAZ9Q="},"flags/4x3/as-3193ab22284dbfe3b88049d07de78b43be8bd841ff00e71e84e3c957cbdaee6a.svg":{"logical_path":"flags/4x3/as.svg","mtime":"2020-04-06T16:47:40+02:00","size":8068,"digest":"3193ab22284dbfe3b88049d07de78b43be8bd841ff00e71e84e3c957cbdaee6a","integrity":"sha256-MZOrIihNv+O4gEnQfeeLQ76L2EH/AOcehOPJV8va7mo="},"flags/1x1/as-e8ce581d75d4d6262dcd1abdd577273cbb06d2b15e13df17427c8881775d5c81.svg":{"logical_path":"flags/1x1/as.svg","mtime":"2020-04-06T16:47:40+02:00","size":7828,"digest":"e8ce581d75d4d6262dcd1abdd577273cbb06d2b15e13df17427c8881775d5c81","integrity":"sha256-6M5YHXXU1iYtzRq91XcnPLsG0rFeE98XQnyIgXddXIE="},"flags/4x3/at-1e513e59cf959d38287ad72edc6f07cda754b7621efb04ed74c333df73ff4176.svg":{"logical_path":"flags/4x3/at.svg","mtime":"2020-04-06T16:47:40+02:00","size":240,"digest":"1e513e59cf959d38287ad72edc6f07cda754b7621efb04ed74c333df73ff4176","integrity":"sha256-HlE+Wc+VnTgoetcu3G8HzadUt2Ie+wTtdMMz33P/QXY="},"flags/1x1/at-73ae6b3c0378e6855da2f6f164668218485117334175d68e44f88a3846a1e179.svg":{"logical_path":"flags/1x1/at.svg","mtime":"2020-04-06T16:47:40+02:00","size":242,"digest":"73ae6b3c0378e6855da2f6f164668218485117334175d68e44f88a3846a1e179","integrity":"sha256-c65rPAN45oVdovbxZGaCGEhRFzNBddaORPiKOEah4Xk="},"flags/4x3/au-213bcc5e8c0c7defccd96f191f39e53f873da8129e55d230faafdd683d4168f9.svg":{"logical_path":"flags/4x3/au.svg","mtime":"2020-04-06T16:47:40+02:00","size":1546,"digest":"213bcc5e8c0c7defccd96f191f39e53f873da8129e55d230faafdd683d4168f9","integrity":"sha256-ITvMXowMfe/M2W8ZHznlP4c9qBKeVdIw+q/daD1BaPk="},"flags/1x1/au-dfc984d3a89cfdcaf4417482af869ee04c6d0399aa2905c7d3b5d09d5af4aa5a.svg":{"logical_path":"flags/1x1/au.svg","mtime":"2020-04-06T16:47:40+02:00","size":1483,"digest":"dfc984d3a89cfdcaf4417482af869ee04c6d0399aa2905c7d3b5d09d5af4aa5a","integrity":"sha256-38mE06ic/cr0QXSCr4ae4ExtA5mqKQXH07XQnVr0qlo="},"flags/4x3/aw-424db29f64f3c72757bc5542144a2347d30102d17aeb30ae977559fd68e6f637.svg":{"logical_path":"flags/4x3/aw.svg","mtime":"2020-04-06T16:47:40+02:00","size":9951,"digest":"424db29f64f3c72757bc5542144a2347d30102d17aeb30ae977559fd68e6f637","integrity":"sha256-Qk2yn2TzxydXvFVCFEojR9MBAtF66zCul3VZ/Wjm9jc="},"flags/1x1/aw-b5162dba277197f89aa8ea36a1b50ec057d38b2e8d7229eadbe55fcc7fae20ac.svg":{"logical_path":"flags/1x1/aw.svg","mtime":"2020-04-06T16:47:40+02:00","size":12084,"digest":"b5162dba277197f89aa8ea36a1b50ec057d38b2e8d7229eadbe55fcc7fae20ac","integrity":"sha256-tRYtuidxl/iaqOo2obUOwFfTiy6Ncinq2+VfzH+uIKw="},"flags/4x3/ax-e0b7f6dd55f2611d2a69e9f111dc39c5342069c32855f72933ff53e6f7488811.svg":{"logical_path":"flags/4x3/ax.svg","mtime":"2020-04-06T16:47:40+02:00","size":559,"digest":"e0b7f6dd55f2611d2a69e9f111dc39c5342069c32855f72933ff53e6f7488811","integrity":"sha256-4Lf23VXyYR0qaenxEdw5xTQgacMoVfcpM/9T5vdIiBE="},"flags/1x1/ax-952771b31fc59cffe5c33677e6d701bcb782262e86a01e7a591eab5a11e47eb3.svg":{"logical_path":"flags/1x1/ax.svg","mtime":"2020-04-06T16:47:40+02:00","size":541,"digest":"952771b31fc59cffe5c33677e6d701bcb782262e86a01e7a591eab5a11e47eb3","integrity":"sha256-lSdxsx/FnP/lwzZ35tcBvLeCJi6GoB56WR6rWhHkfrM="},"flags/4x3/az-3a16ff227d8a0295cf07c9f3fcab7e4004f0c4b6f18c5858dc1633cf6b16fe78.svg":{"logical_path":"flags/4x3/az.svg","mtime":"2020-04-06T16:47:40+02:00","size":512,"digest":"3a16ff227d8a0295cf07c9f3fcab7e4004f0c4b6f18c5858dc1633cf6b16fe78","integrity":"sha256-Ohb/In2KApXPB8nz/Kt+QATwxLbxjFhY3BYzz2sW/ng="},"flags/1x1/az-ce76ab744019e9980d0b9dda74b664e933461cf96eeb305a858a39b9a38b9b17.svg":{"logical_path":"flags/1x1/az.svg","mtime":"2020-04-06T16:47:40+02:00","size":498,"digest":"ce76ab744019e9980d0b9dda74b664e933461cf96eeb305a858a39b9a38b9b17","integrity":"sha256-znardEAZ6ZgNC53adLZk6TNGHPlu6zBahYo5uaOLmxc="},"flags/4x3/ba-0145a56b0f2d7e25856b2c62fcef5a8e2d62257ec67c0806fa0e92933082503e.svg":{"logical_path":"flags/4x3/ba.svg","mtime":"2020-04-06T16:47:40+02:00","size":1310,"digest":"0145a56b0f2d7e25856b2c62fcef5a8e2d62257ec67c0806fa0e92933082503e","integrity":"sha256-AUWlaw8tfiWFayxi/O9aji1iJX7GfAgG+g6SkzCCUD4="},"flags/1x1/ba-b4466a08b71725f8b5057ef0946b19d77a4d23eed0b81fd1abe4380dd6dde3c1.svg":{"logical_path":"flags/1x1/ba.svg","mtime":"2020-04-06T16:47:40+02:00","size":1242,"digest":"b4466a08b71725f8b5057ef0946b19d77a4d23eed0b81fd1abe4380dd6dde3c1","integrity":"sha256-tEZqCLcXJfi1BX7wlGsZ13pNI+7QuB/Rq+Q4Ddbd48E="},"flags/4x3/bb-667b79ca265802e179cfdc8ab06295e9e23301659f610ea11005b7415ae98673.svg":{"logical_path":"flags/4x3/bb.svg","mtime":"2020-04-06T16:47:40+02:00","size":609,"digest":"667b79ca265802e179cfdc8ab06295e9e23301659f610ea11005b7415ae98673","integrity":"sha256-Znt5yiZYAuF5z9yKsGKV6eIzAWWfYQ6hEAW3QVrphnM="},"flags/1x1/bb-2ce0c4f55ba85069897fa15337b07e10470c9846698257bea85971d4307b417c.svg":{"logical_path":"flags/1x1/bb.svg","mtime":"2020-04-06T16:47:40+02:00","size":609,"digest":"2ce0c4f55ba85069897fa15337b07e10470c9846698257bea85971d4307b417c","integrity":"sha256-LODE9VuoUGmJf6FTN7B+EEcMmEZpgle+qFlx1DB7QXw="},"flags/4x3/bd-d5ee762ba69448db5fadd6a18f5213ca922c0f04fe7d47bca6983afbb301fe2e.svg":{"logical_path":"flags/4x3/bd.svg","mtime":"2020-04-06T16:47:40+02:00","size":190,"digest":"d5ee762ba69448db5fadd6a18f5213ca922c0f04fe7d47bca6983afbb301fe2e","integrity":"sha256-1e52K6aUSNtfrdahj1ITypIsDwT+fUe8ppg6+7MB/i4="},"flags/1x1/bd-749b63aa937201843f63cedfd7d0db3019ddf95b931b4be80693716fd2b84cce.svg":{"logical_path":"flags/1x1/bd.svg","mtime":"2020-04-06T16:47:40+02:00","size":192,"digest":"749b63aa937201843f63cedfd7d0db3019ddf95b931b4be80693716fd2b84cce","integrity":"sha256-dJtjqpNyAYQ/Y87f19DbMBnd+VuTG0voBpNxb9K4TM4="},"flags/4x3/be-b3df2b94815bb9f38846ee9bf98e13f70cee99f9b08d80b95f96117255bb14ae.svg":{"logical_path":"flags/4x3/be.svg","mtime":"2020-04-06T16:47:40+02:00","size":290,"digest":"b3df2b94815bb9f38846ee9bf98e13f70cee99f9b08d80b95f96117255bb14ae","integrity":"sha256-s98rlIFbufOIRu6b+Y4T9wzumfmwjYC5X5YRclW7FK4="},"flags/1x1/be-b998bdfa696aaa291b5c97eb783c3b525082462dc1fa69d32ded3a3df758eacc.svg":{"logical_path":"flags/1x1/be.svg","mtime":"2020-04-06T16:47:40+02:00","size":290,"digest":"b998bdfa696aaa291b5c97eb783c3b525082462dc1fa69d32ded3a3df758eacc","integrity":"sha256-uZi9+mlqqikbXJfreDw7UlCCRi3B+mnTLe06PfdY6sw="},"flags/4x3/bf-bb500b0772dba72a64a3cede92898c2803bb9fbd72743826590cce2a8f4dd066.svg":{"logical_path":"flags/4x3/bf.svg","mtime":"2020-04-06T16:47:40+02:00","size":357,"digest":"bb500b0772dba72a64a3cede92898c2803bb9fbd72743826590cce2a8f4dd066","integrity":"sha256-u1ALB3Lbpypko87ekomMKAO7n71ydDgmWQzOKo9N0GY="},"flags/1x1/bf-8f795ecc74ce0431b735094709b535fe2f6ffc49efc32976106ba332741c2244.svg":{"logical_path":"flags/1x1/bf.svg","mtime":"2020-04-06T16:47:40+02:00","size":383,"digest":"8f795ecc74ce0431b735094709b535fe2f6ffc49efc32976106ba332741c2244","integrity":"sha256-j3lezHTOBDG3NQlHCbU1/i9v/Envwyl2EGujMnQcIkQ="},"flags/4x3/bg-c67e049a9f003f098e554808e74e3359970e4df9adcfb69b33dcb7bfd5b7a8c5.svg":{"logical_path":"flags/4x3/bg.svg","mtime":"2020-04-06T16:47:40+02:00","size":286,"digest":"c67e049a9f003f098e554808e74e3359970e4df9adcfb69b33dcb7bfd5b7a8c5","integrity":"sha256-xn4Emp8APwmOVUgI504zWZcOTfmtz7abM9y3v9W3qMU="},"flags/1x1/bg-9ddbc7b674ff21cbf2c0d82ae5e701f89902c4ce8841585e25d8e5ce36902205.svg":{"logical_path":"flags/1x1/bg.svg","mtime":"2020-04-06T16:47:40+02:00","size":294,"digest":"9ddbc7b674ff21cbf2c0d82ae5e701f89902c4ce8841585e25d8e5ce36902205","integrity":"sha256-ndvHtnT/IcvywNgq5ecB+JkCxM6IQVheJdjlzjaQIgU="},"flags/4x3/bh-b89b1dd1f40b59b119a3788653182317859e93b7e506ba08516de97b8590803e.svg":{"logical_path":"flags/4x3/bh.svg","mtime":"2020-04-06T16:47:40+02:00","size":517,"digest":"b89b1dd1f40b59b119a3788653182317859e93b7e506ba08516de97b8590803e","integrity":"sha256-uJsd0fQLWbEZo3iGUxgjF4Wek7flBroIUW3pe4WQgD4="},"flags/1x1/bh-9a6f53af3af276804af165a6df525364ab0775485e209f3f84a351a9c8537df8.svg":{"logical_path":"flags/1x1/bh.svg","mtime":"2020-04-06T16:47:40+02:00","size":538,"digest":"9a6f53af3af276804af165a6df525364ab0775485e209f3f84a351a9c8537df8","integrity":"sha256-mm9TrzrydoBK8WWm31JTZKsHdUheIJ8/hKNRqchTffg="},"flags/4x3/bi-d9cc0b58ddd6c7a1147999f96ff25d4fd80e00a71636f2e0dba952f0c5771532.svg":{"logical_path":"flags/4x3/bi.svg","mtime":"2020-04-06T16:47:40+02:00","size":1074,"digest":"d9cc0b58ddd6c7a1147999f96ff25d4fd80e00a71636f2e0dba952f0c5771532","integrity":"sha256-2cwLWN3Wx6EUeZn5b/JdT9gOAKcWNvLg26lS8MV3FTI="},"flags/1x1/bi-78476c6682fd0fdc9d621974a6e8daab640383db2f95603a9acdbfbc1d8ebfc3.svg":{"logical_path":"flags/1x1/bi.svg","mtime":"2020-04-06T16:47:40+02:00","size":1042,"digest":"78476c6682fd0fdc9d621974a6e8daab640383db2f95603a9acdbfbc1d8ebfc3","integrity":"sha256-eEdsZoL9D9ydYhl0pujaq2QDg9svlWA6ms2/vB2Ov8M="},"flags/4x3/bj-9085e2dc8e991e0dc1e0192979ca19db8dd9e22cd8ec7228f6289e2b8231a9c2.svg":{"logical_path":"flags/4x3/bj.svg","mtime":"2020-04-06T16:47:40+02:00","size":502,"digest":"9085e2dc8e991e0dc1e0192979ca19db8dd9e22cd8ec7228f6289e2b8231a9c2","integrity":"sha256-kIXi3I6ZHg3B4BkpecoZ243Z4izY7HIo9iieK4IxqcI="},"flags/1x1/bj-126f6103d81a930d8d8e185e1064c6502e99d1709e622e371b551f6b0f460ccb.svg":{"logical_path":"flags/1x1/bj.svg","mtime":"2020-04-06T16:47:40+02:00","size":499,"digest":"126f6103d81a930d8d8e185e1064c6502e99d1709e622e371b551f6b0f460ccb","integrity":"sha256-Em9hA9gakw2NjhheEGTGUC6Z0XCeYi43G1Ufaw9GDMs="},"flags/4x3/bl-1c0fc0dc03abc76091b6e9b874ab94975b4fb6898ff39dd8fc4705f81b1c94f2.svg":{"logical_path":"flags/4x3/bl.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"1c0fc0dc03abc76091b6e9b874ab94975b4fb6898ff39dd8fc4705f81b1c94f2","integrity":"sha256-HA/A3AOrx2CRtum4dKuUl1tPtomP853Y/EcF+BsclPI="},"flags/1x1/bl-b41eb06ebe9a9ad8176b247be6884b2d2562261aac85b148bb4fc953477701b3.svg":{"logical_path":"flags/1x1/bl.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"b41eb06ebe9a9ad8176b247be6884b2d2562261aac85b148bb4fc953477701b3","integrity":"sha256-tB6wbr6amtgXayR75ohLLSViJhqshbFIu0/JU0d3AbM="},"flags/4x3/bm-13cb511dd4f639bcb07b08499c6a596ef4a300745a740f5158e70bef9823913a.svg":{"logical_path":"flags/4x3/bm.svg","mtime":"2020-04-06T16:47:40+02:00","size":22569,"digest":"13cb511dd4f639bcb07b08499c6a596ef4a300745a740f5158e70bef9823913a","integrity":"sha256-E8tRHdT2ObywewhJnGpZbvSjAHRadA9RWOcL75gjkTo="},"flags/1x1/bm-1af07e53e38af85994614d0e3a1edfae8f5c74091a82c63a051ac1ae889e5125.svg":{"logical_path":"flags/1x1/bm.svg","mtime":"2020-04-06T16:47:40+02:00","size":22270,"digest":"1af07e53e38af85994614d0e3a1edfae8f5c74091a82c63a051ac1ae889e5125","integrity":"sha256-GvB+U+OK+FmUYU0OOh7fro9cdAkagsY6BRrBroieUSU="},"flags/4x3/bn-7c5eafd90f22b14301a5784167e70326557e8732de95e702d9780afb9ba351f6.svg":{"logical_path":"flags/4x3/bn.svg","mtime":"2020-04-06T16:47:40+02:00","size":14213,"digest":"7c5eafd90f22b14301a5784167e70326557e8732de95e702d9780afb9ba351f6","integrity":"sha256-fF6v2Q8isUMBpXhBZ+cDJlV+hzLelecC2XgK+5ujUfY="},"flags/1x1/bn-58930c2508f1ade40240bc93e4fad7de229e1f7b6ca3e5f8bdb97fecda54f24e.svg":{"logical_path":"flags/1x1/bn.svg","mtime":"2020-04-06T16:47:40+02:00","size":14359,"digest":"58930c2508f1ade40240bc93e4fad7de229e1f7b6ca3e5f8bdb97fecda54f24e","integrity":"sha256-WJMMJQjxreQCQLyT5PrX3iKeH3tso+X4vbl/7NpU8k4="},"flags/4x3/bo-4ab35795d73ec5cc7ce784bedbd1c72c7ab5402f3665998d998c1b6e244bf4bc.svg":{"logical_path":"flags/4x3/bo.svg","mtime":"2020-04-06T16:47:40+02:00","size":117062,"digest":"4ab35795d73ec5cc7ce784bedbd1c72c7ab5402f3665998d998c1b6e244bf4bc","integrity":"sha256-SrNXldc+xcx854S+29HHLHq1QC82ZZmNmYwbbiRL9Lw="},"flags/1x1/bo-2a091af9404186fae5b2a5044b061ace8ffa53a874187caf007842ca70bb4294.svg":{"logical_path":"flags/1x1/bo.svg","mtime":"2020-04-06T16:47:40+02:00","size":118659,"digest":"2a091af9404186fae5b2a5044b061ace8ffa53a874187caf007842ca70bb4294","integrity":"sha256-Kgka+UBBhvrlsqUESwYazo/6U6h0GHyvAHhCynC7QpQ="},"flags/4x3/bq-4f69e04ac3651b9112d1411a085bd6d632544c593fad9d20c27616d809746f07.svg":{"logical_path":"flags/4x3/bq.svg","mtime":"2020-04-06T16:47:40+02:00","size":224,"digest":"4f69e04ac3651b9112d1411a085bd6d632544c593fad9d20c27616d809746f07","integrity":"sha256-T2ngSsNlG5ES0UEaCFvW1jJUTFk/rZ0gwnYW2Al0bwc="},"flags/1x1/bq-21e4c616d5cd5c0486640b66400d9c8559cab08650e7601e291c4f5b1643a6ab.svg":{"logical_path":"flags/1x1/bq.svg","mtime":"2020-04-06T16:47:40+02:00","size":228,"digest":"21e4c616d5cd5c0486640b66400d9c8559cab08650e7601e291c4f5b1643a6ab","integrity":"sha256-IeTGFtXNXASGZAtmQA2chVnKsIZQ52AeKRxPWxZDpqs="},"flags/4x3/br-5626545274de6de8e4e2c0f800b7b664bc3521f0ee9bc98547f3cbec3effe2d8.svg":{"logical_path":"flags/4x3/br.svg","mtime":"2020-04-06T16:47:40+02:00","size":8097,"digest":"5626545274de6de8e4e2c0f800b7b664bc3521f0ee9bc98547f3cbec3effe2d8","integrity":"sha256-ViZUUnTebejk4sD4ALe2ZLw1IfDum8mFR/PL7D7/4tg="},"flags/1x1/br-38e5114c9912eb4f5f1944b4e43eeb96791ef552d855a2f16e177ce7ce145d5e.svg":{"logical_path":"flags/1x1/br.svg","mtime":"2020-04-06T16:47:40+02:00","size":7686,"digest":"38e5114c9912eb4f5f1944b4e43eeb96791ef552d855a2f16e177ce7ce145d5e","integrity":"sha256-OOURTJkS609fGUS05D7rlnke9VLYVaLxbhd8584UXV4="},"flags/4x3/bs-d45540c1f333ad6b70ae998b317d6c545b2f608b896dc384da069459dd6f0838.svg":{"logical_path":"flags/4x3/bs.svg","mtime":"2020-04-06T16:47:40+02:00","size":552,"digest":"d45540c1f333ad6b70ae998b317d6c545b2f608b896dc384da069459dd6f0838","integrity":"sha256-1FVAwfMzrWtwrpmLMX1sVFsvYIuJbcOE2gaUWd1vCDg="},"flags/1x1/bs-f10d64856c57efee0f27b3e7960de782f38e026aa55402e801f10bd5ab505dcf.svg":{"logical_path":"flags/1x1/bs.svg","mtime":"2020-04-06T16:47:40+02:00","size":568,"digest":"f10d64856c57efee0f27b3e7960de782f38e026aa55402e801f10bd5ab505dcf","integrity":"sha256-8Q1khWxX7+4PJ7Pnlg3ngvOOAmqlVALoAfEL1atQXc8="},"flags/4x3/bt-6f109e6e0465742b9a132f29d356bab77e47f8429263056d4dd77f1f6cdae063.svg":{"logical_path":"flags/4x3/bt.svg","mtime":"2020-04-06T16:47:40+02:00","size":25227,"digest":"6f109e6e0465742b9a132f29d356bab77e47f8429263056d4dd77f1f6cdae063","integrity":"sha256-bxCebgRldCuaEy8p01a6t35H+EKSYwVtTdd/H2za4GM="},"flags/1x1/bt-569e13412ede4f000d327ac29c21c49b051d6043719fdad19eabec3a04d44f36.svg":{"logical_path":"flags/1x1/bt.svg","mtime":"2020-04-06T16:47:40+02:00","size":25045,"digest":"569e13412ede4f000d327ac29c21c49b051d6043719fdad19eabec3a04d44f36","integrity":"sha256-Vp4TQS7eTwANMnrCnCHEmwUdYENxn9rRnqvsOgTUTzY="},"flags/4x3/bv-f251755196f171e5d7ab2684a09ce6dfef2037cc273bb14460934e1a2c1c538e.svg":{"logical_path":"flags/4x3/bv.svg","mtime":"2020-04-06T16:47:40+02:00","size":585,"digest":"f251755196f171e5d7ab2684a09ce6dfef2037cc273bb14460934e1a2c1c538e","integrity":"sha256-8lF1UZbxceXXqyaEoJzm3+8gN8wnO7FEYJNOGiwcU44="},"flags/1x1/bv-6be2ac5c2b7b353de7dd361efd3a55c228ba00ca60ade0b664d177e3182bbe8f.svg":{"logical_path":"flags/1x1/bv.svg","mtime":"2020-04-06T16:47:40+02:00","size":582,"digest":"6be2ac5c2b7b353de7dd361efd3a55c228ba00ca60ade0b664d177e3182bbe8f","integrity":"sha256-a+KsXCt7NT3n3TYe/TpVwii6AMpgreC2ZNF34xgrvo8="},"flags/4x3/bw-115b2165fe0c1f881a45409a24bc3bcfd42de9a1cdad5686ed36b06c0d646262.svg":{"logical_path":"flags/4x3/bw.svg","mtime":"2020-04-06T16:47:40+02:00","size":252,"digest":"115b2165fe0c1f881a45409a24bc3bcfd42de9a1cdad5686ed36b06c0d646262","integrity":"sha256-EVshZf4MH4gaRUCaJLw7z9Qt6aHNrVaG7TawbA1kYmI="},"flags/1x1/bw-df92e4d60f9cd10c1607dd60b8b10d63b10c9dbe30e0a026ad04670dc06a0e86.svg":{"logical_path":"flags/1x1/bw.svg","mtime":"2020-04-06T16:47:40+02:00","size":254,"digest":"df92e4d60f9cd10c1607dd60b8b10d63b10c9dbe30e0a026ad04670dc06a0e86","integrity":"sha256-35Lk1g+c0QwWB91guLENY7EMnb4w4KAmrQRnDcBqDoY="},"flags/4x3/by-91b26dd7a972c1eba9a387e521bb4db94c891635bb0dd2b55238e4552ca39047.svg":{"logical_path":"flags/4x3/by.svg","mtime":"2020-04-06T16:47:40+02:00","size":5962,"digest":"91b26dd7a972c1eba9a387e521bb4db94c891635bb0dd2b55238e4552ca39047","integrity":"sha256-kbJt16lyweupo4flIbtNuUyJFjW7DdK1UjjkVSyjkEc="},"flags/1x1/by-b7ada8d1fb46487c83b827c16b69f51274e42c655fa537a7ffffa4b20468cafc.svg":{"logical_path":"flags/1x1/by.svg","mtime":"2020-04-06T16:47:40+02:00","size":6086,"digest":"b7ada8d1fb46487c83b827c16b69f51274e42c655fa537a7ffffa4b20468cafc","integrity":"sha256-t62o0ftGSHyDuCfBa2n1EnTkLGVfpTen//+ksgRoyvw="},"flags/4x3/bz-173ecf7b1acfb23e569b7f305630bfe1a39943ebf504ad66ac3f5d613e121c9a.svg":{"logical_path":"flags/4x3/bz.svg","mtime":"2020-04-06T16:47:40+02:00","size":46427,"digest":"173ecf7b1acfb23e569b7f305630bfe1a39943ebf504ad66ac3f5d613e121c9a","integrity":"sha256-Fz7PexrPsj5Wm38wVjC/4aOZQ+v1BK1mrD9dYT4SHJo="},"flags/1x1/bz-1d05349d5a497be367155310b692e7aec42e80797378d748178b70d379da1249.svg":{"logical_path":"flags/1x1/bz.svg","mtime":"2020-04-06T16:47:40+02:00","size":46678,"digest":"1d05349d5a497be367155310b692e7aec42e80797378d748178b70d379da1249","integrity":"sha256-HQU0nVpJe+NnFVMQtpLnrsQugHlzeNdIF4tw03naEkk="},"flags/4x3/ca-5bda905693ffed32df95f79a8eeac1fbf062630de05f48875e109c35681e2331.svg":{"logical_path":"flags/4x3/ca.svg","mtime":"2020-04-06T16:47:40+02:00","size":728,"digest":"5bda905693ffed32df95f79a8eeac1fbf062630de05f48875e109c35681e2331","integrity":"sha256-W9qQVpP/7TLflfeajurB+/BiYw3gX0iHXhCcNWgeIzE="},"flags/1x1/ca-85ee89fa698c2efcad4817723fac44311ca520da3be63f52a10e21c3f65e8fad.svg":{"logical_path":"flags/1x1/ca.svg","mtime":"2020-04-06T16:47:40+02:00","size":708,"digest":"85ee89fa698c2efcad4817723fac44311ca520da3be63f52a10e21c3f65e8fad","integrity":"sha256-he6J+mmMLvytSBdyP6xEMRylINo75j9SoQ4hw/Zej60="},"flags/4x3/cc-d49eb3730b2cbe3eaa7028d5bd5f425caafd83154cf47523c27279c10257d3f6.svg":{"logical_path":"flags/4x3/cc.svg","mtime":"2020-04-06T16:47:40+02:00","size":3123,"digest":"d49eb3730b2cbe3eaa7028d5bd5f425caafd83154cf47523c27279c10257d3f6","integrity":"sha256-1J6zcwssvj6qcCjVvV9CXKr9gxVM9HUjwnJ5wQJX0/Y="},"flags/1x1/cc-7c46b5f38449f3320ae45f9511a36e1b1c22894f84977c235208ebfb8dea9970.svg":{"logical_path":"flags/1x1/cc.svg","mtime":"2020-04-06T16:47:40+02:00","size":3083,"digest":"7c46b5f38449f3320ae45f9511a36e1b1c22894f84977c235208ebfb8dea9970","integrity":"sha256-fEa184RJ8zIK5F+VEaNuGxwiiU+El3wjUgjr+43qmXA="},"flags/4x3/cd-3e5799ffef91d8cb30dc6b847867e209e82cbffe277445202c5f291d36ef0248.svg":{"logical_path":"flags/4x3/cd.svg","mtime":"2020-04-06T16:47:40+02:00","size":349,"digest":"3e5799ffef91d8cb30dc6b847867e209e82cbffe277445202c5f291d36ef0248","integrity":"sha256-PleZ/++R2Msw3GuEeGfiCegsv/4ndEUgLF8pHTbvAkg="},"flags/1x1/cd-600e736963214a9f6701463345f91b569dab9e68f7668317df2f40def88e2d6e.svg":{"logical_path":"flags/1x1/cd.svg","mtime":"2020-04-06T16:47:40+02:00","size":507,"digest":"600e736963214a9f6701463345f91b569dab9e68f7668317df2f40def88e2d6e","integrity":"sha256-YA5zaWMhSp9nAUYzRfkbVp2rnmj3ZoMX3y9A3viOLW4="},"flags/4x3/cf-44e68fe825719854c92a8285944e619288d5f651fd17f874153081449c100d1f.svg":{"logical_path":"flags/4x3/cf.svg","mtime":"2020-04-06T16:47:40+02:00","size":691,"digest":"44e68fe825719854c92a8285944e619288d5f651fd17f874153081449c100d1f","integrity":"sha256-ROaP6CVxmFTJKoKFlE5hkojV9lH9F/h0FTCBRJwQDR8="},"flags/1x1/cf-b3a61e22f7d8bdc611d532720cf8ed292eab336063c5699036755dc160154175.svg":{"logical_path":"flags/1x1/cf.svg","mtime":"2020-04-06T16:47:40+02:00","size":632,"digest":"b3a61e22f7d8bdc611d532720cf8ed292eab336063c5699036755dc160154175","integrity":"sha256-s6YeIvfYvcYR1TJyDPjtKS6rM2BjxWmQNnVdwWAVQXU="},"flags/4x3/cg-7e4f9efc379203b9cc9677042de4c07bd411308c80074919035c08fe131dbca2.svg":{"logical_path":"flags/4x3/cg.svg","mtime":"2020-04-06T16:47:40+02:00","size":487,"digest":"7e4f9efc379203b9cc9677042de4c07bd411308c80074919035c08fe131dbca2","integrity":"sha256-fk+e/DeSA7nMlncELeTAe9QRMIyAB0kZA1wI/hMdvKI="},"flags/1x1/cg-20a742a21789fc04344e90463c05b35ee2fe86a624d3b6432b4edd6bd3fe651d.svg":{"logical_path":"flags/1x1/cg.svg","mtime":"2020-04-06T16:47:40+02:00","size":469,"digest":"20a742a21789fc04344e90463c05b35ee2fe86a624d3b6432b4edd6bd3fe651d","integrity":"sha256-IKdCoheJ/AQ0TpBGPAWzXuL+hqYk07ZDK07da9P+ZR0="},"flags/4x3/ch-4e94e5c3a524345e7c24f3807ab2ca812225ea6ccdb59ec67125b0ea3ed02cd5.svg":{"logical_path":"flags/4x3/ch.svg","mtime":"2020-04-06T16:47:40+02:00","size":297,"digest":"4e94e5c3a524345e7c24f3807ab2ca812225ea6ccdb59ec67125b0ea3ed02cd5","integrity":"sha256-TpTlw6UkNF58JPOAerLKgSIl6mzNtZ7GcSWw6j7QLNU="},"flags/1x1/ch-a0660f7371c42a1e8be299a9ff0d762ed12b578ea438df33890aae8eba431106.svg":{"logical_path":"flags/1x1/ch.svg","mtime":"2020-04-06T16:47:40+02:00","size":295,"digest":"a0660f7371c42a1e8be299a9ff0d762ed12b578ea438df33890aae8eba431106","integrity":"sha256-oGYPc3HEKh6L4pmp/w12LtErV46kON8ziQqujrpDEQY="},"flags/4x3/ci-d7fd4124cb8f4d9cc2d70bd2c87543fd279750bd7082d51e5916fea65847e992.svg":{"logical_path":"flags/4x3/ci.svg","mtime":"2020-04-06T16:47:40+02:00","size":280,"digest":"d7fd4124cb8f4d9cc2d70bd2c87543fd279750bd7082d51e5916fea65847e992","integrity":"sha256-1/1BJMuPTZzC1wvSyHVD/SeXUL1wgtUeWRb+plhH6ZI="},"flags/1x1/ci-ba7f763547ca1b9243fcf644d83f3100546f7fe557f22fb380b5fcddef7e02bc.svg":{"logical_path":"flags/1x1/ci.svg","mtime":"2020-04-06T16:47:40+02:00","size":283,"digest":"ba7f763547ca1b9243fcf644d83f3100546f7fe557f22fb380b5fcddef7e02bc","integrity":"sha256-un92NUfKG5JD/PZE2D8xAFRvf+VX8i+zgLX83e9+Arw="},"flags/4x3/ck-95e850b027e198e275840a2c96fde8be006f7c4b50d274c2da10dcfad50d3cf8.svg":{"logical_path":"flags/4x3/ck.svg","mtime":"2020-04-06T16:47:40+02:00","size":2097,"digest":"95e850b027e198e275840a2c96fde8be006f7c4b50d274c2da10dcfad50d3cf8","integrity":"sha256-lehQsCfhmOJ1hAoslv3ovgBvfEtQ0nTC2hDc+tUNPPg="},"flags/1x1/ck-a60ec48dfd291bcf6e032345fdcf72edc995efaeb749534a38d192d81891b754.svg":{"logical_path":"flags/1x1/ck.svg","mtime":"2020-04-06T16:47:40+02:00","size":2020,"digest":"a60ec48dfd291bcf6e032345fdcf72edc995efaeb749534a38d192d81891b754","integrity":"sha256-pg7Ejf0pG89uAyNF/c9y7cmV7663SVNKONGS2BiRt1Q="},"flags/4x3/cl-b0c3f433217a039247b2c7f3f8694d05237ba684726b604a33c102d10f279fde.svg":{"logical_path":"flags/4x3/cl.svg","mtime":"2020-04-06T16:47:40+02:00","size":563,"digest":"b0c3f433217a039247b2c7f3f8694d05237ba684726b604a33c102d10f279fde","integrity":"sha256-sMP0MyF6A5JHssfz+GlNBSN7poRya2BKM8EC0Q8nn94="},"flags/1x1/cl-250f409f558fe17f01f32614ebf6275c2fcce776ce50ec959642babbc67036e0.svg":{"logical_path":"flags/1x1/cl.svg","mtime":"2020-04-06T16:47:40+02:00","size":574,"digest":"250f409f558fe17f01f32614ebf6275c2fcce776ce50ec959642babbc67036e0","integrity":"sha256-JQ9An1WP4X8B8yYU6/YnXC/M53bOUOyVlkK6u8ZwNuA="},"flags/4x3/cm-1b2e52b5962f38e58da1973b23796ccefae0e82321856c61bda68bd3f277ea6f.svg":{"logical_path":"flags/4x3/cm.svg","mtime":"2020-04-06T16:47:40+02:00","size":824,"digest":"1b2e52b5962f38e58da1973b23796ccefae0e82321856c61bda68bd3f277ea6f","integrity":"sha256-Gy5StZYvOOWNoZc7I3lszvrg6CMhhWxhvaaL0/J36m8="},"flags/1x1/cm-809ea5ab516c4e59ee5f90c4b0515365c3d41d77544ff10abb1dea88c9f377e4.svg":{"logical_path":"flags/1x1/cm.svg","mtime":"2020-04-06T16:47:40+02:00","size":824,"digest":"809ea5ab516c4e59ee5f90c4b0515365c3d41d77544ff10abb1dea88c9f377e4","integrity":"sha256-gJ6lq1FsTlnuX5DEsFFTZcPUHXdUT/EKux3qiMnzd+Q="},"flags/4x3/cn-e80d714480a795617992d733d0678e5ad5025f8852b35d20a402a78fce4ccaf8.svg":{"logical_path":"flags/4x3/cn.svg","mtime":"2020-04-06T16:47:40+02:00","size":801,"digest":"e80d714480a795617992d733d0678e5ad5025f8852b35d20a402a78fce4ccaf8","integrity":"sha256-6A1xRICnlWF5ktcz0GeOWtUCX4hSs10gpAKnj85Myvg="},"flags/1x1/cn-ab9a2dc6b1aaeaa7017b96904b7a760517ac9e57ee589ee6dd1238c7754bd8f6.svg":{"logical_path":"flags/1x1/cn.svg","mtime":"2020-04-06T16:47:40+02:00","size":743,"digest":"ab9a2dc6b1aaeaa7017b96904b7a760517ac9e57ee589ee6dd1238c7754bd8f6","integrity":"sha256-q5otxrGq6qcBe5aQS3p2BResnlfuWJ7m3RI4x3VL2PY="},"flags/4x3/co-bc15eabb8dc37b36d7be228c68a2f7a62957a3ba9e4d8c35db50b919c9d150da.svg":{"logical_path":"flags/4x3/co.svg","mtime":"2020-04-06T16:47:40+02:00","size":289,"digest":"bc15eabb8dc37b36d7be228c68a2f7a62957a3ba9e4d8c35db50b919c9d150da","integrity":"sha256-vBXqu43DezbXviKMaKL3pilXo7qeTYw121C5GcnRUNo="},"flags/1x1/co-cb36ae4084e1e678bed8e0a64397e0109f9afc95c241a04c8e3da36a577cfaf2.svg":{"logical_path":"flags/1x1/co.svg","mtime":"2020-04-06T16:47:40+02:00","size":289,"digest":"cb36ae4084e1e678bed8e0a64397e0109f9afc95c241a04c8e3da36a577cfaf2","integrity":"sha256-yzauQITh5ni+2OCmQ5fgEJ+a/JXCQaBMjj2jald8+vI="},"flags/4x3/cr-12fe80c814de382b53955ab5223514278f7b4985f51c32fd1f60356280e1e5cd.svg":{"logical_path":"flags/4x3/cr.svg","mtime":"2020-04-06T16:47:40+02:00","size":293,"digest":"12fe80c814de382b53955ab5223514278f7b4985f51c32fd1f60356280e1e5cd","integrity":"sha256-Ev6AyBTeOCtTlVq1IjUUJ497SYX1HDL9H2A1YoDh5c0="},"flags/1x1/cr-c7830f0e5b8025c1f9205b2d89ce1b7ac81ec64f6a9e9093da9a2d9e05206b49.svg":{"logical_path":"flags/1x1/cr.svg","mtime":"2020-04-06T16:47:40+02:00","size":293,"digest":"c7830f0e5b8025c1f9205b2d89ce1b7ac81ec64f6a9e9093da9a2d9e05206b49","integrity":"sha256-x4MPDluAJcH5IFstic4besgexk9qnpCT2potngUga0k="},"flags/4x3/cu-0a09bdca54a5347ba1238476ea90ea7d7d99fec7163df43e762313ddbce9b145.svg":{"logical_path":"flags/4x3/cu.svg","mtime":"2020-04-06T16:47:40+02:00","size":622,"digest":"0a09bdca54a5347ba1238476ea90ea7d7d99fec7163df43e762313ddbce9b145","integrity":"sha256-Cgm9ylSlNHuhI4R26pDqfX2Z/scWPfQ+diMT3bzpsUU="},"flags/1x1/cu-f5f7e6c58d9ee8046fb142f0d35f23df7e49763b35305b7fcc719db23554b404.svg":{"logical_path":"flags/1x1/cu.svg","mtime":"2020-04-06T16:47:40+02:00","size":573,"digest":"f5f7e6c58d9ee8046fb142f0d35f23df7e49763b35305b7fcc719db23554b404","integrity":"sha256-9ffmxY2e6ARvsULw018j335Jdjs1MFt/zHGdsjVUtAQ="},"flags/4x3/cv-3ab6aaaf11d9a3a6f2fba17248ea85d36967163214e98b0bb30123d0b3def532.svg":{"logical_path":"flags/4x3/cv.svg","mtime":"2020-04-06T16:47:40+02:00","size":1415,"digest":"3ab6aaaf11d9a3a6f2fba17248ea85d36967163214e98b0bb30123d0b3def532","integrity":"sha256-OraqrxHZo6by+6FySOqF02lnFjIU6YsLswEj0LPe9TI="},"flags/1x1/cv-698aea344d6bb9f87de513ff525d16fdb2590ad1cd7b2d1200878c1e7cd2ce64.svg":{"logical_path":"flags/1x1/cv.svg","mtime":"2020-04-06T16:47:40+02:00","size":1357,"digest":"698aea344d6bb9f87de513ff525d16fdb2590ad1cd7b2d1200878c1e7cd2ce64","integrity":"sha256-aYrqNE1rufh95RP/Ul0W/bJZCtHNey0SAIeMHnzSzmQ="},"flags/4x3/cw-186b6d2347845c903689468db9a51cec41d7458461725fcdcecab27eebc3c376.svg":{"logical_path":"flags/4x3/cw.svg","mtime":"2020-04-06T16:47:40+02:00","size":681,"digest":"186b6d2347845c903689468db9a51cec41d7458461725fcdcecab27eebc3c376","integrity":"sha256-GGttI0eEXJA2iUaNuaUc7EHXRYRhcl/NzsqyfuvDw3Y="},"flags/1x1/cw-e1c281f45124597730be155051b4628bf25974ff4dac5f990262c5f074ab7484.svg":{"logical_path":"flags/1x1/cw.svg","mtime":"2020-04-06T16:47:40+02:00","size":682,"digest":"e1c281f45124597730be155051b4628bf25974ff4dac5f990262c5f074ab7484","integrity":"sha256-4cKB9FEkWXcwvhVQUbRii/JZdP9NrF+ZAmLF8HSrdIQ="},"flags/4x3/cx-aaf17168e49e9efc24b259929e40b7b135f78f4ee327577ab57e9a14fe8dfe9d.svg":{"logical_path":"flags/4x3/cx.svg","mtime":"2020-04-06T16:47:40+02:00","size":2455,"digest":"aaf17168e49e9efc24b259929e40b7b135f78f4ee327577ab57e9a14fe8dfe9d","integrity":"sha256-qvFxaOSenvwkslmSnkC3sTX3j07jJ1d6tX6aFP6N/p0="},"flags/1x1/cx-8af706f9e34d7867578f025a073e033c901b05012519a65bac5d319b961f1a99.svg":{"logical_path":"flags/1x1/cx.svg","mtime":"2020-04-06T16:47:40+02:00","size":2496,"digest":"8af706f9e34d7867578f025a073e033c901b05012519a65bac5d319b961f1a99","integrity":"sha256-ivcG+eNNeGdXjwJaBz4DPJAbBQElGaZbrF0xm5YfGpk="},"flags/4x3/cy-88d041c0eec06dab21e4d9c777ead616f2ab97eedef8b619f78f95dd51e74ab7.svg":{"logical_path":"flags/4x3/cy.svg","mtime":"2020-04-06T16:47:40+02:00","size":5866,"digest":"88d041c0eec06dab21e4d9c777ead616f2ab97eedef8b619f78f95dd51e74ab7","integrity":"sha256-iNBBwO7Abash5NnHd+rWFvKrl+7e+LYZ94+V3VHnSrc="},"flags/1x1/cy-0e1f361ed98ca9f027657583276d0f0e404fcedc95cb314fd5122793e4cec9ba.svg":{"logical_path":"flags/1x1/cy.svg","mtime":"2020-04-06T16:47:40+02:00","size":5955,"digest":"0e1f361ed98ca9f027657583276d0f0e404fcedc95cb314fd5122793e4cec9ba","integrity":"sha256-Dh82HtmMqfAnZXWDJ20PDkBPztyVyzFP1RInk+TOybo="},"flags/4x3/cz-a094f93ce465415ead374aa60fb7ea55921b956683f2809d6a08b1af81ffd609.svg":{"logical_path":"flags/4x3/cz.svg","mtime":"2020-04-06T16:47:40+02:00","size":484,"digest":"a094f93ce465415ead374aa60fb7ea55921b956683f2809d6a08b1af81ffd609","integrity":"sha256-oJT5PORlQV6tN0qmD7fqVZIblWaD8oCdagixr4H/1gk="},"flags/1x1/cz-fca144bdc4bc563cc612a0bc931738ab096a362323982a4ac1e2f74d66792c77.svg":{"logical_path":"flags/1x1/cz.svg","mtime":"2020-04-06T16:47:40+02:00","size":480,"digest":"fca144bdc4bc563cc612a0bc931738ab096a362323982a4ac1e2f74d66792c77","integrity":"sha256-/KFEvcS8VjzGEqC8kxc4qwlqNiMjmCpKweL3TWZ5LHc="},"flags/4x3/de-226631a8fa9deee07022680ce0461b7a09b416b616c56ebcaf21f50e2b34ea8f.svg":{"logical_path":"flags/4x3/de.svg","mtime":"2020-04-06T16:47:40+02:00","size":213,"digest":"226631a8fa9deee07022680ce0461b7a09b416b616c56ebcaf21f50e2b34ea8f","integrity":"sha256-ImYxqPqd7uBwImgM4EYbegm0FrYWxW68ryH1Dis06o8="},"flags/1x1/de-d7cc619b1c880981e17adba3bd44cb8addfff1d63e7cb2b4d59a88abe5ff31e0.svg":{"logical_path":"flags/1x1/de.svg","mtime":"2020-04-06T16:47:40+02:00","size":221,"digest":"d7cc619b1c880981e17adba3bd44cb8addfff1d63e7cb2b4d59a88abe5ff31e0","integrity":"sha256-18xhmxyICYHhetujvUTLit3/8dY+fLK01ZqIq+X/MeA="},"flags/4x3/dj-55b23581525743a29fb3602ae988dc91e8f6f5ea07d66337ea8051bf92e7c3ae.svg":{"logical_path":"flags/4x3/dj.svg","mtime":"2020-04-06T16:47:40+02:00","size":591,"digest":"55b23581525743a29fb3602ae988dc91e8f6f5ea07d66337ea8051bf92e7c3ae","integrity":"sha256-VbI1gVJXQ6Kfs2Aq6Yjckej29eoH1mM36oBRv5Lnw64="},"flags/1x1/dj-ffd9ebcba08793bb8ed7e508cd1187d9e867e43ca0c9c669c6eca2a7c0e61896.svg":{"logical_path":"flags/1x1/dj.svg","mtime":"2020-04-06T16:47:40+02:00","size":585,"digest":"ffd9ebcba08793bb8ed7e508cd1187d9e867e43ca0c9c669c6eca2a7c0e61896","integrity":"sha256-/9nry6CHk7uO1+UIzRGH2ehn5DygycZpxuyip8DmGJY="},"flags/4x3/dk-c29517b4eb6b056475330a26a3f929c0523ef80268a8457ca5d44a7def3cdf44.svg":{"logical_path":"flags/4x3/dk.svg","mtime":"2020-04-06T16:47:40+02:00","size":239,"digest":"c29517b4eb6b056475330a26a3f929c0523ef80268a8457ca5d44a7def3cdf44","integrity":"sha256-wpUXtOtrBWR1Mwomo/kpwFI++AJoqEV8pdRKfe8830Q="},"flags/1x1/dk-feeb27682ce93b2e5fe14a32a67aa7141f505725daf8b6018864b0bbec103469.svg":{"logical_path":"flags/1x1/dk.svg","mtime":"2020-04-06T16:47:40+02:00","size":235,"digest":"feeb27682ce93b2e5fe14a32a67aa7141f505725daf8b6018864b0bbec103469","integrity":"sha256-/usnaCzpOy5f4UoypnqnFB9QVyXa+LYBiGSwu+wQNGk="},"flags/4x3/dm-80221b928ecc38c82c3d290b36be1c6c9388a51e9533c31c197016b00e63b070.svg":{"logical_path":"flags/4x3/dm.svg","mtime":"2020-04-06T16:47:40+02:00","size":15975,"digest":"80221b928ecc38c82c3d290b36be1c6c9388a51e9533c31c197016b00e63b070","integrity":"sha256-gCIbko7MOMgsPSkLNr4cbJOIpR6VM8McGXAWsA5jsHA="},"flags/1x1/dm-e5d72576962d7a5ecd56631c5a2541c1359f15f086a3d384c563983c40fc2711.svg":{"logical_path":"flags/1x1/dm.svg","mtime":"2020-04-06T16:47:40+02:00","size":16457,"digest":"e5d72576962d7a5ecd56631c5a2541c1359f15f086a3d384c563983c40fc2711","integrity":"sha256-5dcldpYtel7NVmMcWiVBwTWfFfCGo9OExWOYPED8JxE="},"flags/4x3/do-d399ea939e23c000ce12ba4f7c4d4abccdd28f783248b819ebb20b90546f619f.svg":{"logical_path":"flags/4x3/do.svg","mtime":"2020-04-06T16:47:40+02:00","size":393849,"digest":"d399ea939e23c000ce12ba4f7c4d4abccdd28f783248b819ebb20b90546f619f","integrity":"sha256-05nqk54jwADOErpPfE1KvM3Sj3gySLgZ67ILkFRvYZ8="},"flags/1x1/do-2af33aacc98dde2ca5cc2f3499370e9715b5f76b5ca7446de00490083346754c.svg":{"logical_path":"flags/1x1/do.svg","mtime":"2020-04-06T16:47:40+02:00","size":391369,"digest":"2af33aacc98dde2ca5cc2f3499370e9715b5f76b5ca7446de00490083346754c","integrity":"sha256-KvM6rMmN3iylzC80mTcOlxW192tcp0Rt4ASQCDNGdUw="},"flags/4x3/dz-6a1e2abb0d8a33b0209a37123e44710b4b27b50723a5d2ab7fb8746c88447cf6.svg":{"logical_path":"flags/4x3/dz.svg","mtime":"2020-04-06T16:47:40+02:00","size":294,"digest":"6a1e2abb0d8a33b0209a37123e44710b4b27b50723a5d2ab7fb8746c88447cf6","integrity":"sha256-ah4quw2KM7AgmjcSPkRxC0sntQcjpdKrf7h0bIhEfPY="},"flags/1x1/dz-75568129d430536c4a994d05f114e0b1b91e10af7350d635f2da721f73d4871c.svg":{"logical_path":"flags/1x1/dz.svg","mtime":"2020-04-06T16:47:40+02:00","size":305,"digest":"75568129d430536c4a994d05f114e0b1b91e10af7350d635f2da721f73d4871c","integrity":"sha256-dVaBKdQwU2xKmU0F8RTgsbkeEK9zUNY18tpyH3PUhxw="},"flags/4x3/ec-63bf6e3ac63634199c0929715a715109f8ad229c526c08bfbe7f6a7a9f30fcde.svg":{"logical_path":"flags/4x3/ec.svg","mtime":"2020-04-06T16:47:40+02:00","size":29320,"digest":"63bf6e3ac63634199c0929715a715109f8ad229c526c08bfbe7f6a7a9f30fcde","integrity":"sha256-Y79uOsY2NBmcCSlxWnFRCfitIpxSbAi/vn9qep8w/N4="},"flags/1x1/ec-672567f45dcd0d543af21e7518c41bf8fe74fa090141736b414697b682971f84.svg":{"logical_path":"flags/1x1/ec.svg","mtime":"2020-04-06T16:47:40+02:00","size":29875,"digest":"672567f45dcd0d543af21e7518c41bf8fe74fa090141736b414697b682971f84","integrity":"sha256-ZyVn9F3NDVQ68h51GMQb+P50+gkBQXNrQUaXtoKXH4Q="},"flags/4x3/ee-b4c2ebcd79e821fb8ee37e39d688560a79dee100a981402224a4f2bd9762e41e.svg":{"logical_path":"flags/4x3/ee.svg","mtime":"2020-04-06T16:47:40+02:00","size":321,"digest":"b4c2ebcd79e821fb8ee37e39d688560a79dee100a981402224a4f2bd9762e41e","integrity":"sha256-tMLrzXnoIfuO43451ohWCnne4QCpgUAiJKTyvZdi5B4="},"flags/1x1/ee-53df0c62e5835adce98e59520ae55ddb9f2a35882c5aba2ccb4021d6b0ee88fd.svg":{"logical_path":"flags/1x1/ee.svg","mtime":"2020-04-06T16:47:40+02:00","size":352,"digest":"53df0c62e5835adce98e59520ae55ddb9f2a35882c5aba2ccb4021d6b0ee88fd","integrity":"sha256-U98MYuWDWtzpjllSCuVd258qNYgsWrosy0Ah1rDuiP0="},"flags/4x3/eg-83f4a01c0e76210691d46b0cff7ec97b6ed93290c32a1e94fab96efd3d9b7d42.svg":{"logical_path":"flags/4x3/eg.svg","mtime":"2020-04-06T16:47:40+02:00","size":9899,"digest":"83f4a01c0e76210691d46b0cff7ec97b6ed93290c32a1e94fab96efd3d9b7d42","integrity":"sha256-g/SgHA52IQaR1GsM/37Je27ZMpDDKh6U+rlu/T2bfUI="},"flags/1x1/eg-6234c7747c535705d9b6725f4a6a09158774f288cb14d7e99295822c4e561c22.svg":{"logical_path":"flags/1x1/eg.svg","mtime":"2020-04-06T16:47:40+02:00","size":9913,"digest":"6234c7747c535705d9b6725f4a6a09158774f288cb14d7e99295822c4e561c22","integrity":"sha256-YjTHdHxTVwXZtnJfSmoJFYd08ojLFNfpkpWCLE5WHCI="},"flags/4x3/eh-62f153a1a4ea6e8ed2f79f26ed10eccbbb295bed16ecb46f4e77a6f5f49df639.svg":{"logical_path":"flags/4x3/eh.svg","mtime":"2020-04-06T16:47:40+02:00","size":873,"digest":"62f153a1a4ea6e8ed2f79f26ed10eccbbb295bed16ecb46f4e77a6f5f49df639","integrity":"sha256-YvFToaTqbo7S958m7RDsy7spW+0W7LRvTnem9fSd9jk="},"flags/1x1/eh-15abbba286e48ba50c4aec3b765d8c05f9b4c53ae385a7c8a38d3cebd688b03c.svg":{"logical_path":"flags/1x1/eh.svg","mtime":"2020-04-06T16:47:40+02:00","size":817,"digest":"15abbba286e48ba50c4aec3b765d8c05f9b4c53ae385a7c8a38d3cebd688b03c","integrity":"sha256-Fau7oobki6UMSuw7dl2MBfm0xTrjhafIo40869aIsDw="},"flags/4x3/er-4c57685960d0cd27bc4ee6cc8356f2ed8d0a5cc54a22b5b503529091705a2b04.svg":{"logical_path":"flags/4x3/er.svg","mtime":"2020-04-06T16:47:40+02:00","size":3187,"digest":"4c57685960d0cd27bc4ee6cc8356f2ed8d0a5cc54a22b5b503529091705a2b04","integrity":"sha256-TFdoWWDQzSe8TubMg1by7Y0KXMVKIrW1A1KQkXBaKwQ="},"flags/1x1/er-29ca0e1f31a14f5ee5674a3fcec9aec0ec652b458b66cffd60ac0839fc364729.svg":{"logical_path":"flags/1x1/er.svg","mtime":"2020-04-06T16:47:40+02:00","size":3371,"digest":"29ca0e1f31a14f5ee5674a3fcec9aec0ec652b458b66cffd60ac0839fc364729","integrity":"sha256-KcoOHzGhT17lZ0o/zsmuwOxlK0WLZs/9YKwIOfw2Ryk="},"flags/4x3/es-ab3d438837b7f1c4ebce6980cc9274cd2e6adcc8af9be6f5cfc47ef2c4c464e3.svg":{"logical_path":"flags/4x3/es.svg","mtime":"2020-04-06T16:47:40+02:00","size":90819,"digest":"ab3d438837b7f1c4ebce6980cc9274cd2e6adcc8af9be6f5cfc47ef2c4c464e3","integrity":"sha256-qz1DiDe38cTrzmmAzJJ0zS5q3Mivm+b1z8R+8sTEZOM="},"flags/1x1/es-bfe2d95adf69f339badcf901e33d12c0b6146d7d16a1100b12c3abc13dc3521c.svg":{"logical_path":"flags/1x1/es.svg","mtime":"2020-04-06T16:47:40+02:00","size":92546,"digest":"bfe2d95adf69f339badcf901e33d12c0b6146d7d16a1100b12c3abc13dc3521c","integrity":"sha256-v+LZWt9p8zm63PkB4z0SwLYUbX0WoRALEsOrwT3DUhw="},"flags/4x3/et-e28f1f69ecf1b26e002d8c8dad55ec8af5e822b3cca7f111c399e72b4e0f9c79.svg":{"logical_path":"flags/4x3/et.svg","mtime":"2020-04-06T16:47:40+02:00","size":1233,"digest":"e28f1f69ecf1b26e002d8c8dad55ec8af5e822b3cca7f111c399e72b4e0f9c79","integrity":"sha256-4o8faezxsm4ALYyNrVXsivXoIrPMp/ERw5nnK04PnHk="},"flags/1x1/et-59795d6d33015e4ec1042861541df6c2034e8e1880869d695a1fea5a951e2e71.svg":{"logical_path":"flags/1x1/et.svg","mtime":"2020-04-06T16:47:40+02:00","size":1226,"digest":"59795d6d33015e4ec1042861541df6c2034e8e1880869d695a1fea5a951e2e71","integrity":"sha256-WXldbTMBXk7BBChhVB32wgNOjhiAhp1pWh/qWpUeLnE="},"flags/4x3/fi-83783a7dc69702dfbb59833d81c309748ffb04574aab8ed1cb7589189c0f80d2.svg":{"logical_path":"flags/4x3/fi.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"83783a7dc69702dfbb59833d81c309748ffb04574aab8ed1cb7589189c0f80d2","integrity":"sha256-g3g6fcaXAt+7WYM9gcMJdI/7BFdKq47Ry3WJGJwPgNI="},"flags/1x1/fi-6c32372acfba871cdcd22614f0ebbf58ea2b88de648ee4e843a2bbda5c0a3336.svg":{"logical_path":"flags/1x1/fi.svg","mtime":"2020-04-06T16:47:40+02:00","size":240,"digest":"6c32372acfba871cdcd22614f0ebbf58ea2b88de648ee4e843a2bbda5c0a3336","integrity":"sha256-bDI3Ks+6hxzc0iYU8Ou/WOoriN5kjuToQ6K72lwKMzY="},"flags/4x3/fj-4972d31a0e0d2516c08a305844e5310bf8963d7cca69cc86ed4ed2e121f41be9.svg":{"logical_path":"flags/4x3/fj.svg","mtime":"2020-04-06T16:47:40+02:00","size":27237,"digest":"4972d31a0e0d2516c08a305844e5310bf8963d7cca69cc86ed4ed2e121f41be9","integrity":"sha256-SXLTGg4NJRbAijBYROUxC/iWPXzKacyG7U7S4SH0G+k="},"flags/1x1/fj-36ff3e628fc0bee99878cc9740e54a7b95e9599c263595b5db0c8be2c6ab8978.svg":{"logical_path":"flags/1x1/fj.svg","mtime":"2020-04-06T16:47:40+02:00","size":27518,"digest":"36ff3e628fc0bee99878cc9740e54a7b95e9599c263595b5db0c8be2c6ab8978","integrity":"sha256-Nv8+Yo/AvumYeMyXQOVKe5XpWZwmNZW12wyL4sariXg="},"flags/4x3/fk-6d11c1ecbf413d27f4068e211b7f5f46e83b9067c9fd73ea9c3f5d48c7bbb457.svg":{"logical_path":"flags/4x3/fk.svg","mtime":"2020-04-06T16:47:40+02:00","size":31973,"digest":"6d11c1ecbf413d27f4068e211b7f5f46e83b9067c9fd73ea9c3f5d48c7bbb457","integrity":"sha256-bRHB7L9BPSf0Bo4hG39fRug7kGfJ/XPqnD9dSMe7tFc="},"flags/1x1/fk-2705e5d996f753fdd666b1d3a7c6f4085adc070be85957ba71fa1f07f17eca79.svg":{"logical_path":"flags/1x1/fk.svg","mtime":"2020-04-06T16:47:40+02:00","size":31798,"digest":"2705e5d996f753fdd666b1d3a7c6f4085adc070be85957ba71fa1f07f17eca79","integrity":"sha256-JwXl2Zb3U/3WZrHTp8b0CFrcBwvoWVe6cfofB/F+ynk="},"flags/4x3/fm-881458469239020624b90d2601d347330d21dd7b512c011cba2bcb0c4dc4ea75.svg":{"logical_path":"flags/4x3/fm.svg","mtime":"2020-04-06T16:47:40+02:00","size":776,"digest":"881458469239020624b90d2601d347330d21dd7b512c011cba2bcb0c4dc4ea75","integrity":"sha256-iBRYRpI5AgYkuQ0mAdNHMw0h3XtRLAEcuivLDE3E6nU="},"flags/1x1/fm-0b0d81c2932c2a3a114f5095a9e89e6ac274c54d0cd9e794136a339ad4df8cb4.svg":{"logical_path":"flags/1x1/fm.svg","mtime":"2020-04-06T16:47:40+02:00","size":759,"digest":"0b0d81c2932c2a3a114f5095a9e89e6ac274c54d0cd9e794136a339ad4df8cb4","integrity":"sha256-Cw2BwpMsKjoRT1CVqeieasJ0xU0M2eeUE2ozmtTfjLQ="},"flags/4x3/fo-c0b32df51365a3947ddcda18c15575c5c617b75b29330d78e606e684f3304334.svg":{"logical_path":"flags/4x3/fo.svg","mtime":"2020-04-06T16:47:40+02:00","size":570,"digest":"c0b32df51365a3947ddcda18c15575c5c617b75b29330d78e606e684f3304334","integrity":"sha256-wLMt9RNlo5R93NoYwVV1xcYXt1spMw145gbmhPMwQzQ="},"flags/1x1/fo-5910fc8006f125ce3c7ec5b93b86ccbe0a79e5fbc2e60a9a9b481c882d1bac7c.svg":{"logical_path":"flags/1x1/fo.svg","mtime":"2020-04-06T16:47:40+02:00","size":534,"digest":"5910fc8006f125ce3c7ec5b93b86ccbe0a79e5fbc2e60a9a9b481c882d1bac7c","integrity":"sha256-WRD8gAbxJc48fsW5O4bMvgp55fvC5gqam0gciC0brHw="},"flags/4x3/fr-63667b36ddd95d29a9f163e3ab4b9f7000dcd310350c565c19b975a0a2418117.svg":{"logical_path":"flags/4x3/fr.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"63667b36ddd95d29a9f163e3ab4b9f7000dcd310350c565c19b975a0a2418117","integrity":"sha256-Y2Z7Nt3ZXSmp8WPjq0ufcADc0xA1DFZcGbl1oKJBgRc="},"flags/1x1/fr-5d247ee39647a05667b52e04510b76ae465c009da242ff8d98637d138ea410ff.svg":{"logical_path":"flags/1x1/fr.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"5d247ee39647a05667b52e04510b76ae465c009da242ff8d98637d138ea410ff","integrity":"sha256-XSR+45ZHoFZntS4EUQt2rkZcAJ2iQv+NmGN9E46kEP8="},"flags/4x3/ga-6cf1908ef7a47d61ead3f969bb5dfb96e4b691b66291e2cd7dc71c513d1a5659.svg":{"logical_path":"flags/4x3/ga.svg","mtime":"2020-04-06T16:47:40+02:00","size":274,"digest":"6cf1908ef7a47d61ead3f969bb5dfb96e4b691b66291e2cd7dc71c513d1a5659","integrity":"sha256-bPGQjvekfWHq0/lpu137luS2kbZikeLNfcccUT0aVlk="},"flags/1x1/ga-2b2ea5084b741bf0b1dd1ebc87ee72e4e9fad78046275d37becb41831d259686.svg":{"logical_path":"flags/1x1/ga.svg","mtime":"2020-04-06T16:47:40+02:00","size":278,"digest":"2b2ea5084b741bf0b1dd1ebc87ee72e4e9fad78046275d37becb41831d259686","integrity":"sha256-Ky6lCEt0G/Cx3R68h+5y5On614BGJ103vstBgx0lloY="},"flags/4x3/gb-825310f9bcc8892559317bfc87fc28d5d7bad06c02d562b5740aafcf4b040803.svg":{"logical_path":"flags/4x3/gb.svg","mtime":"2020-04-06T16:47:40+02:00","size":538,"digest":"825310f9bcc8892559317bfc87fc28d5d7bad06c02d562b5740aafcf4b040803","integrity":"sha256-glMQ+bzIiSVZMXv8h/wo1de60GwC1WK1dAqvz0sECAM="},"flags/1x1/gb-6ce6ebb0c16f1f4aa74a78a5db382783545d1ca28f2b6133b6228b4dff0340f0.svg":{"logical_path":"flags/1x1/gb.svg","mtime":"2020-04-06T16:47:40+02:00","size":541,"digest":"6ce6ebb0c16f1f4aa74a78a5db382783545d1ca28f2b6133b6228b4dff0340f0","integrity":"sha256-bObrsMFvH0qnSnil2zgng1RdHKKPK2EztiKLTf8DQPA="},"flags/4x3/gd-eb435c57c240fd302400f1ecb887ec63c672b524032bd0e7c6261ae6a2f1e249.svg":{"logical_path":"flags/4x3/gd.svg","mtime":"2020-04-06T16:47:40+02:00","size":1681,"digest":"eb435c57c240fd302400f1ecb887ec63c672b524032bd0e7c6261ae6a2f1e249","integrity":"sha256-60NcV8JA/TAkAPHsuIfsY8ZytSQDK9DnxiYa5qLx4kk="},"flags/1x1/gd-407dac34390ab8b1ed80fafa4f7ef1fe3225d1d92c5403a80264b4956177e51d.svg":{"logical_path":"flags/1x1/gd.svg","mtime":"2020-04-06T16:47:40+02:00","size":1828,"digest":"407dac34390ab8b1ed80fafa4f7ef1fe3225d1d92c5403a80264b4956177e51d","integrity":"sha256-QH2sNDkKuLHtgPr6T37x/jIl0dksVAOoAmS0lWF35R0="},"flags/4x3/ge-3054d4e61ec2de31e08ce51c8e1bff64fe2d4cc39f3bc6b3988a5e3aab32379c.svg":{"logical_path":"flags/4x3/ge.svg","mtime":"2020-04-06T16:47:40+02:00","size":1397,"digest":"3054d4e61ec2de31e08ce51c8e1bff64fe2d4cc39f3bc6b3988a5e3aab32379c","integrity":"sha256-MFTU5h7C3jHgjOUcjhv/ZP4tTMOfO8azmIpeOqsyN5w="},"flags/1x1/ge-3f7e3b7075838308212d191c4ff1ff3915a4a0c3e1b140420bc1095be16aee0a.svg":{"logical_path":"flags/1x1/ge.svg","mtime":"2020-04-06T16:47:40+02:00","size":1541,"digest":"3f7e3b7075838308212d191c4ff1ff3915a4a0c3e1b140420bc1095be16aee0a","integrity":"sha256-P347cHWDgwghLRkcT/H/ORWkoMPhsUBCC8EJW+Fq7go="},"flags/4x3/gf-8b1d049abec1dc1e6e28247d4f649f5146e8c29a4b928f94c97741da16bcc422.svg":{"logical_path":"flags/4x3/gf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"8b1d049abec1dc1e6e28247d4f649f5146e8c29a4b928f94c97741da16bcc422","integrity":"sha256-ix0Emr7B3B5uKCR9T2SfUUbowppLko+UyXdB2ha8xCI="},"flags/1x1/gf-7e25c5fdc494625ccc8390d3fb1cc6d9a423372c7f30a6c402b138b11840e59f.svg":{"logical_path":"flags/1x1/gf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"7e25c5fdc494625ccc8390d3fb1cc6d9a423372c7f30a6c402b138b11840e59f","integrity":"sha256-fiXF/cSUYlzMg5DT+xzG2aQjNyx/MKbEArE4sRhA5Z8="},"flags/4x3/gg-7a521b07e2a60e914abf16a2553dd7b8f18d3ff21ece58b2c41ba5264c3117e3.svg":{"logical_path":"flags/4x3/gg.svg","mtime":"2020-04-06T16:47:40+02:00","size":595,"digest":"7a521b07e2a60e914abf16a2553dd7b8f18d3ff21ece58b2c41ba5264c3117e3","integrity":"sha256-elIbB+KmDpFKvxaiVT3XuPGNP/IezliyxBulJkwxF+M="},"flags/1x1/gg-e01d6706db308999fde70ce031a660160c3234d9d6e7ba4547f10975e5a1ffcf.svg":{"logical_path":"flags/1x1/gg.svg","mtime":"2020-04-06T16:47:40+02:00","size":625,"digest":"e01d6706db308999fde70ce031a660160c3234d9d6e7ba4547f10975e5a1ffcf","integrity":"sha256-4B1nBtswiZn95wzgMaZgFgwyNNnW57pFR/EJdeWh/88="},"flags/4x3/gh-120554a519bce5c340f98f8cb7bcf98ea18572d3ad137804b4b0c5d806a54016.svg":{"logical_path":"flags/4x3/gh.svg","mtime":"2020-04-06T16:47:40+02:00","size":281,"digest":"120554a519bce5c340f98f8cb7bcf98ea18572d3ad137804b4b0c5d806a54016","integrity":"sha256-EgVUpRm85cNA+Y+Mt7z5jqGFctOtE3gEtLDF2AalQBY="},"flags/1x1/gh-b979935b065bbef93c1a62caedf03ae3833c055f617bdc32824fd15c59d4bf6e.svg":{"logical_path":"flags/1x1/gh.svg","mtime":"2020-04-06T16:47:40+02:00","size":296,"digest":"b979935b065bbef93c1a62caedf03ae3833c055f617bdc32824fd15c59d4bf6e","integrity":"sha256-uXmTWwZbvvk8GmLK7fA644M8BV9he9wygk/RXFnUv24="},"flags/4x3/gi-c84fb25bb5c8d9b9cc2d70f630a927f4ea4f4cbeb2674eb97b4b9dc2d2256c14.svg":{"logical_path":"flags/4x3/gi.svg","mtime":"2020-04-06T16:47:40+02:00","size":2938,"digest":"c84fb25bb5c8d9b9cc2d70f630a927f4ea4f4cbeb2674eb97b4b9dc2d2256c14","integrity":"sha256-yE+yW7XI2bnMLXD2MKkn9OpPTL6yZ065e0udwtIlbBQ="},"flags/1x1/gi-7283b9d6ac27b497fafd867b580d0f12fea7551a4211150087d95816c2143e21.svg":{"logical_path":"flags/1x1/gi.svg","mtime":"2020-04-06T16:47:40+02:00","size":2930,"digest":"7283b9d6ac27b497fafd867b580d0f12fea7551a4211150087d95816c2143e21","integrity":"sha256-coO51qwntJf6/YZ7WA0PEv6nVRpCERUAh9lYFsIUPiE="},"flags/4x3/gl-1149b6b3a90dd6f4f6ac8dd4af0ddfcb33e801858e4835c5f8c6c7346dee3288.svg":{"logical_path":"flags/4x3/gl.svg","mtime":"2020-04-06T16:47:40+02:00","size":223,"digest":"1149b6b3a90dd6f4f6ac8dd4af0ddfcb33e801858e4835c5f8c6c7346dee3288","integrity":"sha256-EUm2s6kN1vT2rI3Urw3fyzPoAYWOSDXF+MbHNG3uMog="},"flags/1x1/gl-5e6efacd630a7f36a1574444a9893613e5c6d03d5d569e140b592f8e7542feb8.svg":{"logical_path":"flags/1x1/gl.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"5e6efacd630a7f36a1574444a9893613e5c6d03d5d569e140b592f8e7542feb8","integrity":"sha256-Xm76zWMKfzahV0REqYk2E+XG0D1dVp4UC1kvjnVC/rg="},"flags/4x3/gm-6d6da6987a4243bb9fff8138ad9e0b301098c6f963cacedf997850fb679ec28c.svg":{"logical_path":"flags/4x3/gm.svg","mtime":"2020-04-06T16:47:40+02:00","size":546,"digest":"6d6da6987a4243bb9fff8138ad9e0b301098c6f963cacedf997850fb679ec28c","integrity":"sha256-bW2mmHpCQ7uf/4E4rZ4LMBCYxvljys7fmXhQ+2eewow="},"flags/1x1/gm-5f8874f8ab093f84c3465b3110ed400cd8eb457110f9b61e684edc867ef99b2f.svg":{"logical_path":"flags/1x1/gm.svg","mtime":"2020-04-06T16:47:40+02:00","size":382,"digest":"5f8874f8ab093f84c3465b3110ed400cd8eb457110f9b61e684edc867ef99b2f","integrity":"sha256-X4h0+KsJP4TDRlsxEO1ADNjrRXEQ+bYeaE7chn75my8="},"flags/4x3/gn-735109ba23330ad9e8602b6e27e658bd12e36f2616b7ead65bd908d553b2acda.svg":{"logical_path":"flags/4x3/gn.svg","mtime":"2020-04-06T16:47:40+02:00","size":295,"digest":"735109ba23330ad9e8602b6e27e658bd12e36f2616b7ead65bd908d553b2acda","integrity":"sha256-c1EJuiMzCtnoYCtuJ+ZYvRLjbyYWt+rWW9kI1VOyrNo="},"flags/1x1/gn-255e2c2930544e25827f220ebc26c6f533d291079f34f2ad6644533d3dfbd726.svg":{"logical_path":"flags/1x1/gn.svg","mtime":"2020-04-06T16:47:40+02:00","size":295,"digest":"255e2c2930544e25827f220ebc26c6f533d291079f34f2ad6644533d3dfbd726","integrity":"sha256-JV4sKTBUTiWCfyIOvCbG9TPSkQefNPKtZkRTPT371yY="},"flags/4x3/gp-b9c509941ec97521fd81904dc81a2845faa44349cc068344f4f738dad7a558b2.svg":{"logical_path":"flags/4x3/gp.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"b9c509941ec97521fd81904dc81a2845faa44349cc068344f4f738dad7a558b2","integrity":"sha256-ucUJlB7JdSH9gZBNyBooRfqkQ0nMBoNE9Pc42telWLI="},"flags/1x1/gp-8bf5d31fdbb388b5bee19d19f7a7cf1e0c0378d5759c5a4254549b2542727a2c.svg":{"logical_path":"flags/1x1/gp.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"8bf5d31fdbb388b5bee19d19f7a7cf1e0c0378d5759c5a4254549b2542727a2c","integrity":"sha256-i/XTH9uziLW+4Z0Z96fPHgwDeNV1nFpCVFSbJUJyeiw="},"flags/4x3/gq-52b8daea18383c355f1f6db428bcd4ebdf777734148da4403f1e93797b4dc9da.svg":{"logical_path":"flags/4x3/gq.svg","mtime":"2020-04-06T16:47:40+02:00","size":5182,"digest":"52b8daea18383c355f1f6db428bcd4ebdf777734148da4403f1e93797b4dc9da","integrity":"sha256-Urja6hg4PDVfH220KLzU6993dzQUjaRAPx6TeXtNydo="},"flags/1x1/gq-f4a44fd2e337cfa52f199707b606891ab0bd3b68bfaeca033e70c274739a6131.svg":{"logical_path":"flags/1x1/gq.svg","mtime":"2020-04-06T16:47:40+02:00","size":5273,"digest":"f4a44fd2e337cfa52f199707b606891ab0bd3b68bfaeca033e70c274739a6131","integrity":"sha256-9KRP0uM3z6UvGZcHtgaJGrC9O2i/rsoDPnDCdHOaYTE="},"flags/4x3/gr-d22330d2af43ce22eab7d8ec9efdbe27ccd9ac1255f3bd289aa671db07fd0205.svg":{"logical_path":"flags/4x3/gr.svg","mtime":"2020-04-06T16:47:40+02:00","size":1096,"digest":"d22330d2af43ce22eab7d8ec9efdbe27ccd9ac1255f3bd289aa671db07fd0205","integrity":"sha256-0iMw0q9DziLqt9jsnv2+J8zZrBJV870omqZx2wf9AgU="},"flags/1x1/gr-565e017faa966d20d9a4051a1853c366bbd59ebaaced77fed32f850b8a9c5099.svg":{"logical_path":"flags/1x1/gr.svg","mtime":"2020-04-06T16:47:40+02:00","size":1085,"digest":"565e017faa966d20d9a4051a1853c366bbd59ebaaced77fed32f850b8a9c5099","integrity":"sha256-Vl4Bf6qWbSDZpAUaGFPDZrvVnrqs7Xf+0y+FC4qcUJk="},"flags/4x3/gs-ad593ae4b9e8c7a4c109a15385a221464240cf3f77e607af2adba53d7b7d2a69.svg":{"logical_path":"flags/4x3/gs.svg","mtime":"2020-04-06T16:47:40+02:00","size":34568,"digest":"ad593ae4b9e8c7a4c109a15385a221464240cf3f77e607af2adba53d7b7d2a69","integrity":"sha256-rVk65Lnox6TBCaFThaIhRkJAzz935gevKtulPXt9Kmk="},"flags/1x1/gs-718e0e89dee0f138fe8e45e84c64f72259b41d0f36224b9b2507bce77be21186.svg":{"logical_path":"flags/1x1/gs.svg","mtime":"2020-04-06T16:47:40+02:00","size":35061,"digest":"718e0e89dee0f138fe8e45e84c64f72259b41d0f36224b9b2507bce77be21186","integrity":"sha256-cY4Oid7g8Tj+jkXoTGT3Ilm0HQ82IkubJQe853viEYY="},"flags/4x3/gt-aa19f58abef6e0b68f7bee73452e26679a640c0fed12f9fc2cb6cde32fc04da5.svg":{"logical_path":"flags/4x3/gt.svg","mtime":"2020-04-06T16:47:40+02:00","size":37255,"digest":"aa19f58abef6e0b68f7bee73452e26679a640c0fed12f9fc2cb6cde32fc04da5","integrity":"sha256-qhn1ir724LaPe+5zRS4mZ5pkDA/tEvn8LLbN4y/ATaU="},"flags/1x1/gt-66d29cdd8660d4380902884c08d9be64f3d8a02536873814f2909778b6e234e0.svg":{"logical_path":"flags/1x1/gt.svg","mtime":"2020-04-06T16:47:40+02:00","size":37255,"digest":"66d29cdd8660d4380902884c08d9be64f3d8a02536873814f2909778b6e234e0","integrity":"sha256-ZtKc3YZg1DgJAohMCNm+ZPPYoCU2hzgU8pCXeLbiNOA="},"flags/4x3/gu-6d39ec648f0366b77918f779bef9619d06561d223bcb98b56813dc32e8403d2d.svg":{"logical_path":"flags/4x3/gu.svg","mtime":"2020-04-06T16:47:40+02:00","size":4840,"digest":"6d39ec648f0366b77918f779bef9619d06561d223bcb98b56813dc32e8403d2d","integrity":"sha256-bTnsZI8DZrd5GPd5vvlhnQZWHSI7y5i1aBPcMuhAPS0="},"flags/1x1/gu-390cbafa22e9b9131e3bf37109317115684519abf87088acfa0f355c608b4729.svg":{"logical_path":"flags/1x1/gu.svg","mtime":"2020-04-06T16:47:40+02:00","size":4614,"digest":"390cbafa22e9b9131e3bf37109317115684519abf87088acfa0f355c608b4729","integrity":"sha256-OQy6+iLpuRMeO/NxCTFxFWhFGav4cIis+g81XGCLRyk="},"flags/4x3/gw-ef2b9b0a28a50cc12689fb576cf4dc5b507b01fbb15a498298921d7a57f0fd77.svg":{"logical_path":"flags/4x3/gw.svg","mtime":"2020-04-06T16:47:40+02:00","size":813,"digest":"ef2b9b0a28a50cc12689fb576cf4dc5b507b01fbb15a498298921d7a57f0fd77","integrity":"sha256-7yubCiilDMEmiftXbPTcW1B7AfuxWkmCmJIdelfw/Xc="},"flags/1x1/gw-14078000daf10cc29b7167c3f9b1b239ab3708b3bad35e8ef185cb92643f88de.svg":{"logical_path":"flags/1x1/gw.svg","mtime":"2020-04-06T16:47:40+02:00","size":889,"digest":"14078000daf10cc29b7167c3f9b1b239ab3708b3bad35e8ef185cb92643f88de","integrity":"sha256-FAeAANrxDMKbcWfD+bGyOas3CLO6016O8YXLkmQ/iN4="},"flags/4x3/gy-0b13a1778887768d5e7767f5e4a484444f4cf3be655142fd6d5d5acb945e7919.svg":{"logical_path":"flags/4x3/gy.svg","mtime":"2020-04-06T16:47:40+02:00","size":488,"digest":"0b13a1778887768d5e7767f5e4a484444f4cf3be655142fd6d5d5acb945e7919","integrity":"sha256-CxOhd4iHdo1ed2f15KSERE9M875lUUL9bV1ay5ReeRk="},"flags/1x1/gy-7562ed6db701af0658a763a1d4701c12467cd962cfd0bfd262cac16d4fc80c88.svg":{"logical_path":"flags/1x1/gy.svg","mtime":"2020-04-06T16:47:40+02:00","size":481,"digest":"7562ed6db701af0658a763a1d4701c12467cd962cfd0bfd262cac16d4fc80c88","integrity":"sha256-dWLtbbcBrwZYp2Oh1HAcEkZ82WLP0L/SYsrBbU/IDIg="},"flags/4x3/hk-17c1c66141f1aa0339fefc5863866d67eabcb1732bda7d5d757b2cb937c93da1.svg":{"logical_path":"flags/4x3/hk.svg","mtime":"2020-04-06T16:47:40+02:00","size":3494,"digest":"17c1c66141f1aa0339fefc5863866d67eabcb1732bda7d5d757b2cb937c93da1","integrity":"sha256-F8HGYUHxqgM5/vxYY4ZtZ+q8sXMr2n1ddXssuTfJPaE="},"flags/1x1/hk-9f59b3d68a943ed25c5e00cb3d1b97d522951d85db0f66fed087418358f88927.svg":{"logical_path":"flags/1x1/hk.svg","mtime":"2020-04-06T16:47:40+02:00","size":3529,"digest":"9f59b3d68a943ed25c5e00cb3d1b97d522951d85db0f66fed087418358f88927","integrity":"sha256-n1mz1oqUPtJcXgDLPRuX1SKVHYXbD2b+0IdBg1j4iSc="},"flags/4x3/hm-d0e56b8208a450dc19b6e1eafaa826c439a318b33314c503ebab05d7a9d14ba3.svg":{"logical_path":"flags/4x3/hm.svg","mtime":"2020-04-06T16:47:40+02:00","size":1324,"digest":"d0e56b8208a450dc19b6e1eafaa826c439a318b33314c503ebab05d7a9d14ba3","integrity":"sha256-0OVrggikUNwZtuHq+qgmxDmjGLMzFMUD66sF16nRS6M="},"flags/1x1/hm-78ed36c627b9370e2c8737226f62105718c18b2f04c62618168e43adcccc1ca6.svg":{"logical_path":"flags/1x1/hm.svg","mtime":"2020-04-06T16:47:40+02:00","size":1308,"digest":"78ed36c627b9370e2c8737226f62105718c18b2f04c62618168e43adcccc1ca6","integrity":"sha256-eO02xie5Nw4shzcib2IQVxjBiy8ExiYYFo5DrczMHKY="},"flags/4x3/hn-38a5028605f6645a95c607f24db6d27d5b915580be561a365cfb9d238736b594.svg":{"logical_path":"flags/4x3/hn.svg","mtime":"2020-04-06T16:47:40+02:00","size":1112,"digest":"38a5028605f6645a95c607f24db6d27d5b915580be561a365cfb9d238736b594","integrity":"sha256-OKUChgX2ZFqVxgfyTbbSfVuRVYC+Vho2XPudI4c2tZQ="},"flags/1x1/hn-79cc97901f534c2998d1ec6cd506a81b59eabc0a040dc66ee46ef8a7405e6641.svg":{"logical_path":"flags/1x1/hn.svg","mtime":"2020-04-06T16:47:40+02:00","size":1116,"digest":"79cc97901f534c2998d1ec6cd506a81b59eabc0a040dc66ee46ef8a7405e6641","integrity":"sha256-ecyXkB9TTCmY0exs1QaoG1nqvAoEDcZu5G74p0BeZkE="},"flags/4x3/hr-b0b1d075c651e2ceb10f558b33a13c9dd89310edfbe67df0f46a7b5d8d550de6.svg":{"logical_path":"flags/4x3/hr.svg","mtime":"2020-04-06T16:47:40+02:00","size":40615,"digest":"b0b1d075c651e2ceb10f558b33a13c9dd89310edfbe67df0f46a7b5d8d550de6","integrity":"sha256-sLHQdcZR4s6xD1WLM6E8ndiTEO375n3w9Gp7XY1VDeY="},"flags/1x1/hr-1041347a78192d0e7688af7adec3cd93d85fd0dd7ab792dc80fd82629708a7bf.svg":{"logical_path":"flags/1x1/hr.svg","mtime":"2020-04-06T16:47:40+02:00","size":40852,"digest":"1041347a78192d0e7688af7adec3cd93d85fd0dd7ab792dc80fd82629708a7bf","integrity":"sha256-EEE0engZLQ52iK963sPNk9hf0N16t5LcgP2CYpcIp78="},"flags/4x3/ht-ba77c23de904dea8ddf2390f9e363fa96679253b425be7d4dbf0021c4a0c9911.svg":{"logical_path":"flags/4x3/ht.svg","mtime":"2020-04-06T16:47:40+02:00","size":15005,"digest":"ba77c23de904dea8ddf2390f9e363fa96679253b425be7d4dbf0021c4a0c9911","integrity":"sha256-unfCPekE3qjd8jkPnjY/qWZ5JTtCW+fU2/ACHEoMmRE="},"flags/1x1/ht-092fc65d74cf70aa35a8dd3a5581f5bb668aba72ddf788c4ffc22278be4ee70b.svg":{"logical_path":"flags/1x1/ht.svg","mtime":"2020-04-06T16:47:40+02:00","size":15094,"digest":"092fc65d74cf70aa35a8dd3a5581f5bb668aba72ddf788c4ffc22278be4ee70b","integrity":"sha256-CS/GXXTPcKo1qN06VYH1u2aKunLd94jE/8IieL5O5ws="},"flags/4x3/hu-470431d1ed0dc2099f20313f78f906848acaf9efce57c543d83b3b62f8b7a448.svg":{"logical_path":"flags/4x3/hu.svg","mtime":"2020-04-06T16:47:40+02:00","size":274,"digest":"470431d1ed0dc2099f20313f78f906848acaf9efce57c543d83b3b62f8b7a448","integrity":"sha256-RwQx0e0NwgmfIDE/ePkGhIrK+e/OV8VD2Ds7Yvi3pEg="},"flags/1x1/hu-ac2bf4284d73c0c0d607f5ec46855b982f56d2ee430306fca04da3a5cda8515b.svg":{"logical_path":"flags/1x1/hu.svg","mtime":"2020-04-06T16:47:40+02:00","size":276,"digest":"ac2bf4284d73c0c0d607f5ec46855b982f56d2ee430306fca04da3a5cda8515b","integrity":"sha256-rCv0KE1zwMDWB/XsRoVbmC9W0u5DAwb8oE2jpc2oUVs="},"flags/4x3/id-c9871d91b6b58310831a0d78b904e44eb92a64630ac219ac43165d0ca8f0dacd.svg":{"logical_path":"flags/4x3/id.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"c9871d91b6b58310831a0d78b904e44eb92a64630ac219ac43165d0ca8f0dacd","integrity":"sha256-yYcdkba1gxCDGg14uQTkTrkqZGMKwhmsQxZdDKjw2s0="},"flags/1x1/id-b4e3434244c27c95f6933e19a65fc273348f2edc6b695dd5dfe810d12f5459aa.svg":{"logical_path":"flags/1x1/id.svg","mtime":"2020-04-06T16:47:40+02:00","size":239,"digest":"b4e3434244c27c95f6933e19a65fc273348f2edc6b695dd5dfe810d12f5459aa","integrity":"sha256-tONDQkTCfJX2kz4Zpl/CczSPLtxraV3V3+gQ0S9UWao="},"flags/4x3/ie-4d73eedf98a4c487c352db58751ff766f05f6aa3bfac1ecc0f9384e50d019191.svg":{"logical_path":"flags/4x3/ie.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"4d73eedf98a4c487c352db58751ff766f05f6aa3bfac1ecc0f9384e50d019191","integrity":"sha256-TXPu35ikxIfDUttYdR/3ZvBfaqO/rB7MD5OE5Q0BkZE="},"flags/1x1/ie-e8a2121f51aa8eccbaab9fdc1e986418f75b6e3adf81329b1251db3a6678851d.svg":{"logical_path":"flags/1x1/ie.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"e8a2121f51aa8eccbaab9fdc1e986418f75b6e3adf81329b1251db3a6678851d","integrity":"sha256-6KISH1Gqjsy6q5/cHphkGPdbbjrfgTKbElHbOmZ4hR0="},"flags/4x3/il-1dcc3e315cf8b00b8a9914d9ce696b05612aec294bf85e784b25c672b259c58a.svg":{"logical_path":"flags/4x3/il.svg","mtime":"2020-04-06T16:47:40+02:00","size":901,"digest":"1dcc3e315cf8b00b8a9914d9ce696b05612aec294bf85e784b25c672b259c58a","integrity":"sha256-Hcw+MVz4sAuKmRTZzmlrBWEq7ClL+F54SyXGcrJZxYo="},"flags/1x1/il-343c040339a72ace51208700f40fe69bfb90e3b4f5ad62b1ed69ac404470722a.svg":{"logical_path":"flags/1x1/il.svg","mtime":"2020-04-06T16:47:40+02:00","size":848,"digest":"343c040339a72ace51208700f40fe69bfb90e3b4f5ad62b1ed69ac404470722a","integrity":"sha256-NDwEAzmnKs5RIIcA9A/mm/uQ47T1rWKx7WmsQERwcio="},"flags/4x3/im-5b256ebd75ab1fc4d1e7af4f4306b4c6b54ae64a67eb1d968a84065a007b7cd7.svg":{"logical_path":"flags/4x3/im.svg","mtime":"2020-04-06T16:47:40+02:00","size":9870,"digest":"5b256ebd75ab1fc4d1e7af4f4306b4c6b54ae64a67eb1d968a84065a007b7cd7","integrity":"sha256-WyVuvXWrH8TR569PQwa0xrVK5kpn6x2WioQGWgB7fNc="},"flags/1x1/im-6dd9078e0d7934b575a00aa2b81effafa5b8aed1fa6c3f6824d56187ca7a63ba.svg":{"logical_path":"flags/1x1/im.svg","mtime":"2020-04-06T16:47:40+02:00","size":10197,"digest":"6dd9078e0d7934b575a00aa2b81effafa5b8aed1fa6c3f6824d56187ca7a63ba","integrity":"sha256-bdkHjg15NLV1oAqiuB7/r6W4rtH6bD9oJNVhh8p6Y7o="},"flags/4x3/in-cbc15f5fb40df22adf2b3792eb6c1d359e1a7affb44318a5a779943fc7299d45.svg":{"logical_path":"flags/4x3/in.svg","mtime":"2020-04-06T16:47:40+02:00","size":1074,"digest":"cbc15f5fb40df22adf2b3792eb6c1d359e1a7affb44318a5a779943fc7299d45","integrity":"sha256-y8FfX7QN8irfKzeS62wdNZ4aev+0Qxilp3mUP8cpnUU="},"flags/1x1/in-dd68b8ac425f8b0e1a479337e4fb6e8c647241f5042e63ba4cd9853e5e3b661b.svg":{"logical_path":"flags/1x1/in.svg","mtime":"2020-04-06T16:47:40+02:00","size":1088,"digest":"dd68b8ac425f8b0e1a479337e4fb6e8c647241f5042e63ba4cd9853e5e3b661b","integrity":"sha256-3Wi4rEJfiw4aR5M35PtujGRyQfUELmO6TNmFPl47Zhs="},"flags/4x3/io-b942bddf710a42e617b2fcabb8bdfbe210b85d2ac9a60b5063d513ecc6648eec.svg":{"logical_path":"flags/4x3/io.svg","mtime":"2020-04-06T16:47:40+02:00","size":27341,"digest":"b942bddf710a42e617b2fcabb8bdfbe210b85d2ac9a60b5063d513ecc6648eec","integrity":"sha256-uUK933EKQuYXsvyruL374hC4XSrJpgtQY9UT7MZkjuw="},"flags/1x1/io-5b124813bf16fe4c96b606443527a5f17f6cdde9f0abf94d6884f5f81118198e.svg":{"logical_path":"flags/1x1/io.svg","mtime":"2020-04-06T16:47:40+02:00","size":27357,"digest":"5b124813bf16fe4c96b606443527a5f17f6cdde9f0abf94d6884f5f81118198e","integrity":"sha256-WxJIE78W/kyWtgZENSel8X9s3enwq/lNaIT1+BEYGY4="},"flags/4x3/iq-4b13b01690d870625d61a87bbaf4328a714626698d056dc3f56a9a37c133d77a.svg":{"logical_path":"flags/4x3/iq.svg","mtime":"2020-04-06T16:47:40+02:00","size":1470,"digest":"4b13b01690d870625d61a87bbaf4328a714626698d056dc3f56a9a37c133d77a","integrity":"sha256-SxOwFpDYcGJdYah7uvQyinFGJmmNBW3D9WqaN8Ez13o="},"flags/1x1/iq-4a529e765a46ab3cea5be74d6754d6646b175cc5da0a725114e1fcd1f877734c.svg":{"logical_path":"flags/1x1/iq.svg","mtime":"2020-04-06T16:47:40+02:00","size":1475,"digest":"4a529e765a46ab3cea5be74d6754d6646b175cc5da0a725114e1fcd1f877734c","integrity":"sha256-SlKedlpGqzzqW+dNZ1TWZGsXXMXaCnJRFOH80fh3c0w="},"flags/4x3/ir-2047b977f2d7e8835035e30551fe8333403452134c3164105ed30b2e6fd14a23.svg":{"logical_path":"flags/4x3/ir.svg","mtime":"2020-04-06T16:47:40+02:00","size":15451,"digest":"2047b977f2d7e8835035e30551fe8333403452134c3164105ed30b2e6fd14a23","integrity":"sha256-IEe5d/LX6INQNeMFUf6DM0A0UhNMMWQQXtMLLm/RSiM="},"flags/1x1/ir-18b8f0da914e052490e627f2dbe57a24a1448e84cfedead2d2ffa9795135afc6.svg":{"logical_path":"flags/1x1/ir.svg","mtime":"2020-04-06T16:47:40+02:00","size":15356,"digest":"18b8f0da914e052490e627f2dbe57a24a1448e84cfedead2d2ffa9795135afc6","integrity":"sha256-GLjw2pFOBSSQ5ify2+V6JKFEjoTP7erS0v+peVE1r8Y="},"flags/4x3/is-89b266e3c5824fabc91b8d04a830a3f32c62484b49543bc3921e14c57ba6cb7e.svg":{"logical_path":"flags/4x3/is.svg","mtime":"2020-04-06T16:47:40+02:00","size":524,"digest":"89b266e3c5824fabc91b8d04a830a3f32c62484b49543bc3921e14c57ba6cb7e","integrity":"sha256-ibJm48WCT6vJG40EqDCj8yxiSEtJVDvDkh4UxXumy34="},"flags/1x1/is-74bbf9d0f1714110da6ba438163ff7de135dd91d32b2172757a943ac7bc355a3.svg":{"logical_path":"flags/1x1/is.svg","mtime":"2020-04-06T16:47:40+02:00","size":526,"digest":"74bbf9d0f1714110da6ba438163ff7de135dd91d32b2172757a943ac7bc355a3","integrity":"sha256-dLv50PFxQRDaa6Q4Fj/33hNd2R0yshcnV6lDrHvDVaM="},"flags/4x3/it-2d46fd7fde3f19c3f278fe9028e6fab6fa997fbdda3e18116fb70e57cfc78598.svg":{"logical_path":"flags/4x3/it.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"2d46fd7fde3f19c3f278fe9028e6fab6fa997fbdda3e18116fb70e57cfc78598","integrity":"sha256-LUb9f94/GcPyeP6QKOb6tvqZf73aPhgRb7cOV8/HhZg="},"flags/1x1/it-28a4339b1dc59c4e776f6bf07f51117de9fade0a8a749492e478764b8bd8c2f2.svg":{"logical_path":"flags/1x1/it.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"28a4339b1dc59c4e776f6bf07f51117de9fade0a8a749492e478764b8bd8c2f2","integrity":"sha256-KKQzmx3FnE53b2vwf1ERfen63gqKdJSS5Hh2S4vYwvI="},"flags/4x3/je-365f0f9dea4804f7f9a9ca052beb1b39bc0811cd5d47d013094418d5b6c53d1a.svg":{"logical_path":"flags/4x3/je.svg","mtime":"2020-04-06T16:47:40+02:00","size":4700,"digest":"365f0f9dea4804f7f9a9ca052beb1b39bc0811cd5d47d013094418d5b6c53d1a","integrity":"sha256-Nl8PnepIBPf5qcoFK+sbObwIEc1dR9ATCUQY1bbFPRo="},"flags/1x1/je-0cdc51ec29101669d333d4b91b61d87f3d302473cc81bd17ff80ccbed6c7e0f6.svg":{"logical_path":"flags/1x1/je.svg","mtime":"2020-04-06T16:47:40+02:00","size":4675,"digest":"0cdc51ec29101669d333d4b91b61d87f3d302473cc81bd17ff80ccbed6c7e0f6","integrity":"sha256-DNxR7CkQFmnTM9S5G2HYfz0wJHPMgb0X/4DMvtbH4PY="},"flags/4x3/jm-fc7c5d90b44fa5ba160c644f6c7f8918f5460a5842a517e3fd99ea94ba963594.svg":{"logical_path":"flags/4x3/jm.svg","mtime":"2020-04-06T16:47:40+02:00","size":389,"digest":"fc7c5d90b44fa5ba160c644f6c7f8918f5460a5842a517e3fd99ea94ba963594","integrity":"sha256-/HxdkLRPpboWDGRPbH+JGPVGClhCpRfj/ZnqlLqWNZQ="},"flags/1x1/jm-1b80b0d1f940a94945335aa2683e0195890c35f5bae24a3321c7752c5cdf8416.svg":{"logical_path":"flags/1x1/jm.svg","mtime":"2020-04-06T16:47:40+02:00","size":389,"digest":"1b80b0d1f940a94945335aa2683e0195890c35f5bae24a3321c7752c5cdf8416","integrity":"sha256-G4Cw0flAqUlFM1qiaD4BlYkMNfW64kozIcd1LFzfhBY="},"flags/4x3/jo-c3109f9f849f581918a4567768bd334506cb517bf8a3ed3afc8e670ae434af27.svg":{"logical_path":"flags/4x3/jo.svg","mtime":"2020-04-06T16:47:40+02:00","size":720,"digest":"c3109f9f849f581918a4567768bd334506cb517bf8a3ed3afc8e670ae434af27","integrity":"sha256-wxCfn4SfWBkYpFZ3aL0zRQbLUXv4o+06/I5nCuQ0ryc="},"flags/1x1/jo-e183a9aa500d7bbef58df474d4b1a0554e4c68e187c9803a68272cbbecd45118.svg":{"logical_path":"flags/1x1/jo.svg","mtime":"2020-04-06T16:47:40+02:00","size":691,"digest":"e183a9aa500d7bbef58df474d4b1a0554e4c68e187c9803a68272cbbecd45118","integrity":"sha256-4YOpqlANe771jfR01LGgVU5MaOGHyYA6aCcsu+zUURg="},"flags/4x3/jp-e759dccba5bc383814ab190daba0d12ef591ad9f161502a47222c2eacf770606.svg":{"logical_path":"flags/4x3/jp.svg","mtime":"2020-04-06T16:47:40+02:00","size":474,"digest":"e759dccba5bc383814ab190daba0d12ef591ad9f161502a47222c2eacf770606","integrity":"sha256-51ncy6W8ODgUqxkNq6DRLvWRrZ8WFQKkciLC6s93BgY="},"flags/1x1/jp-0573d020325a0795ebf2b83b6d604ecce164efc5c6e16c6fb4a48f124d2902d5.svg":{"logical_path":"flags/1x1/jp.svg","mtime":"2020-04-06T16:47:40+02:00","size":484,"digest":"0573d020325a0795ebf2b83b6d604ecce164efc5c6e16c6fb4a48f124d2902d5","integrity":"sha256-BXPQIDJaB5Xr8rg7bWBOzOFk78XG4WxvtKSPEk0pAtU="},"flags/4x3/ke-c6390bd1dead222763be7c93e10ce8d48ce550d2083d00b907504d01f3be8da8.svg":{"logical_path":"flags/4x3/ke.svg","mtime":"2020-04-06T16:47:40+02:00","size":1379,"digest":"c6390bd1dead222763be7c93e10ce8d48ce550d2083d00b907504d01f3be8da8","integrity":"sha256-xjkL0d6tIidjvnyT4Qzo1IzlUNIIPQC5B1BNAfO+jag="},"flags/1x1/ke-3cc6fb778db9f415d50e5651069719c7becdcb7cca53868586a287e024e26d8f.svg":{"logical_path":"flags/1x1/ke.svg","mtime":"2020-04-06T16:47:40+02:00","size":1485,"digest":"3cc6fb778db9f415d50e5651069719c7becdcb7cca53868586a287e024e26d8f","integrity":"sha256-PMb7d4259BXVDlZRBpcZx77Ny3zKU4aFhqKH4CTibY8="},"flags/4x3/kg-618432f0701371ef7260a11fde248179e49360f1acd1a0fd07c4efcd153f4721.svg":{"logical_path":"flags/4x3/kg.svg","mtime":"2020-04-06T16:47:40+02:00","size":3374,"digest":"618432f0701371ef7260a11fde248179e49360f1acd1a0fd07c4efcd153f4721","integrity":"sha256-YYQy8HATce9yYKEf3iSBeeSTYPGs0aD9B8TvzRU/RyE="},"flags/1x1/kg-059ee9448b06e00eee47ca8a059e608618ddcd7e2fbb949149ee0bd46836dd35.svg":{"logical_path":"flags/1x1/kg.svg","mtime":"2020-04-06T16:47:40+02:00","size":3316,"digest":"059ee9448b06e00eee47ca8a059e608618ddcd7e2fbb949149ee0bd46836dd35","integrity":"sha256-BZ7pRIsG4A7uR8qKBZ5ghhjdzX4vu5SRSe4L1Gg23TU="},"flags/4x3/kh-ec1e0984d167e8c6bfa026cfddd6048c64e9b3634a99c9a20db194f28f10b1a6.svg":{"logical_path":"flags/4x3/kh.svg","mtime":"2020-04-06T16:47:40+02:00","size":7261,"digest":"ec1e0984d167e8c6bfa026cfddd6048c64e9b3634a99c9a20db194f28f10b1a6","integrity":"sha256-7B4JhNFn6Ma/oCbP3dYEjGTps2NKmcmiDbGU8o8QsaY="},"flags/1x1/kh-16c097cc28b308b92d65e4ad3c025160256a36838bae538c0b1357f044788da3.svg":{"logical_path":"flags/1x1/kh.svg","mtime":"2020-04-06T16:47:40+02:00","size":7262,"digest":"16c097cc28b308b92d65e4ad3c025160256a36838bae538c0b1357f044788da3","integrity":"sha256-FsCXzCizCLktZeStPAJRYCVqNoOLrlOMCxNX8ER4jaM="},"flags/4x3/ki-591a87de7bbeb711663f6dcaad93e269108ca6ab9ccbcb653e84c9779e9d3e2d.svg":{"logical_path":"flags/4x3/ki.svg","mtime":"2020-04-06T16:47:40+02:00","size":5813,"digest":"591a87de7bbeb711663f6dcaad93e269108ca6ab9ccbcb653e84c9779e9d3e2d","integrity":"sha256-WRqH3nu+txFmP23KrZPiaRCMpqucy8tlPoTJd56dPi0="},"flags/1x1/ki-210537cc2766114f72f9f838c5dc138a18c3f49e78575f7b1d699873061b0315.svg":{"logical_path":"flags/1x1/ki.svg","mtime":"2020-04-06T16:47:40+02:00","size":5941,"digest":"210537cc2766114f72f9f838c5dc138a18c3f49e78575f7b1d699873061b0315","integrity":"sha256-IQU3zCdmEU9y+fg4xdwTihjD9J54V197HWmYcwYbAxU="},"flags/4x3/km-f6cd3ead925661739946379d122420dfd0287b6332e25ecefc5e8a97adefdb0f.svg":{"logical_path":"flags/4x3/km.svg","mtime":"2020-04-06T16:47:40+02:00","size":1064,"digest":"f6cd3ead925661739946379d122420dfd0287b6332e25ecefc5e8a97adefdb0f","integrity":"sha256-9s0+rZJWYXOZRjedEiQg39Aoe2My4l7O/F6Kl63v2w8="},"flags/1x1/km-a6a467329036e9963b7aca186e74b5affd615663ad9802807a64c04aa79a5f19.svg":{"logical_path":"flags/1x1/km.svg","mtime":"2020-04-06T16:47:40+02:00","size":1037,"digest":"a6a467329036e9963b7aca186e74b5affd615663ad9802807a64c04aa79a5f19","integrity":"sha256-pqRnMpA26ZY7esoYbnS1r/1hVmOtmAKAemTASqeaXxk="},"flags/4x3/kn-d0f010da3fc35e1b9b520e8c063eaf9a650c16a0dd6507928cbf013a04508924.svg":{"logical_path":"flags/4x3/kn.svg","mtime":"2020-04-06T16:47:40+02:00","size":819,"digest":"d0f010da3fc35e1b9b520e8c063eaf9a650c16a0dd6507928cbf013a04508924","integrity":"sha256-0PAQ2j/DXhubUg6MBj6vmmUMFqDdZQeSjL8BOgRQiSQ="},"flags/1x1/kn-ae4abba1402d60d25f380c8aa7dd081e7efc1349733b36ffbc7e61b951b54363.svg":{"logical_path":"flags/1x1/kn.svg","mtime":"2020-04-06T16:47:40+02:00","size":817,"digest":"ae4abba1402d60d25f380c8aa7dd081e7efc1349733b36ffbc7e61b951b54363","integrity":"sha256-rkq7oUAtYNJfOAyKp90IHn78E0lzOzb/vH5huVG1Q2M="},"flags/4x3/kp-8d34a3fd7d34c53ce01854e2b1e69c71fd6b0c65dda1b8aa90f2935a551b8f79.svg":{"logical_path":"flags/4x3/kp.svg","mtime":"2020-04-06T16:47:40+02:00","size":795,"digest":"8d34a3fd7d34c53ce01854e2b1e69c71fd6b0c65dda1b8aa90f2935a551b8f79","integrity":"sha256-jTSj/X00xTzgGFTiseaccf1rDGXdobiqkPKTWlUbj3k="},"flags/1x1/kp-d0cb440831181be36d7ea60f5adff5bb1dae7d8ab06738a920ab994ad42652cc.svg":{"logical_path":"flags/1x1/kp.svg","mtime":"2020-04-06T16:47:40+02:00","size":852,"digest":"d0cb440831181be36d7ea60f5adff5bb1dae7d8ab06738a920ab994ad42652cc","integrity":"sha256-0MtECDEYG+NtfqYPWt/1ux2ufYqwZzipIKuZStQmUsw="},"flags/4x3/kr-3162c67e01704d06fd77d78fefeb5937fee5f4ee326d369da13a5b25b75db16a.svg":{"logical_path":"flags/4x3/kr.svg","mtime":"2020-04-06T16:47:40+02:00","size":1822,"digest":"3162c67e01704d06fd77d78fefeb5937fee5f4ee326d369da13a5b25b75db16a","integrity":"sha256-MWLGfgFwTQb9d9eP7+tZN/7l9O4ybTadoTpbJbddsWo="},"flags/1x1/kr-3f72f5b1c788ac2bc2d7e3680f25f55692dff661e0dc3819bb78cd711f152d76.svg":{"logical_path":"flags/1x1/kr.svg","mtime":"2020-04-06T16:47:40+02:00","size":1719,"digest":"3f72f5b1c788ac2bc2d7e3680f25f55692dff661e0dc3819bb78cd711f152d76","integrity":"sha256-P3L1sceIrCvC1+NoDyX1VpLf9mHg3DgZu3jNcR8VLXY="},"flags/4x3/kw-ac538e6cbafc0a94611bb9c653df3056cfa3303faff143308aa5680178e34f71.svg":{"logical_path":"flags/4x3/kw.svg","mtime":"2020-04-06T16:47:40+02:00","size":509,"digest":"ac538e6cbafc0a94611bb9c653df3056cfa3303faff143308aa5680178e34f71","integrity":"sha256-rFOObLr8CpRhG7nGU98wVs+jMD+v8UMwiqVoAXjjT3E="},"flags/1x1/kw-c874c334dca89cb394b3534eb2eb5ed408293d32052e9179fc75832191b5759e.svg":{"logical_path":"flags/1x1/kw.svg","mtime":"2020-04-06T16:47:40+02:00","size":507,"digest":"c874c334dca89cb394b3534eb2eb5ed408293d32052e9179fc75832191b5759e","integrity":"sha256-yHTDNNyonLOUs1NOsute1AgpPTIFLpF5/HWDIZG1dZ4="},"flags/4x3/ky-fcecffb01a890f01464e6067e5593099b9919746443d16c69c7e223e13be50ef.svg":{"logical_path":"flags/4x3/ky.svg","mtime":"2020-04-06T16:47:40+02:00","size":21724,"digest":"fcecffb01a890f01464e6067e5593099b9919746443d16c69c7e223e13be50ef","integrity":"sha256-/Oz/sBqJDwFGTmBn5VkwmbmRl0ZEPRbGnH4iPhO+UO8="},"flags/1x1/ky-707d019e77714b8dee2074bbd17aaac157d2de0991a8d4c8472a038403c5471f.svg":{"logical_path":"flags/1x1/ky.svg","mtime":"2020-04-06T16:47:40+02:00","size":22357,"digest":"707d019e77714b8dee2074bbd17aaac157d2de0991a8d4c8472a038403c5471f","integrity":"sha256-cH0BnndxS43uIHS70XqqwVfS3gmRqNTIRyoDhAPFRx8="},"flags/4x3/kz-8214283b99e5781396996fdfd84c551ea7ac15a248465ccbb9358b13373d802a.svg":{"logical_path":"flags/4x3/kz.svg","mtime":"2020-04-06T16:47:40+02:00","size":11327,"digest":"8214283b99e5781396996fdfd84c551ea7ac15a248465ccbb9358b13373d802a","integrity":"sha256-ghQoO5nleBOWmW/f2ExVHqesFaJIRlzLuTWLEzc9gCo="},"flags/1x1/kz-af4496d258a36c41ce92d7713c7206e2e92ac6037c6dcdac687ba815e74a4f49.svg":{"logical_path":"flags/1x1/kz.svg","mtime":"2020-04-06T16:47:40+02:00","size":11415,"digest":"af4496d258a36c41ce92d7713c7206e2e92ac6037c6dcdac687ba815e74a4f49","integrity":"sha256-r0SW0lijbEHOktdxPHIG4ukqxgN8bc2saHuoFedKT0k="},"flags/4x3/la-1f70bf3805542fff3addba9e2148d541cb30b125c692a8c7e0868cf4c7dea409.svg":{"logical_path":"flags/4x3/la.svg","mtime":"2020-04-06T16:47:40+02:00","size":457,"digest":"1f70bf3805542fff3addba9e2148d541cb30b125c692a8c7e0868cf4c7dea409","integrity":"sha256-H3C/OAVUL/863bqeIUjVQcswsSXGkqjH4IaM9MfepAk="},"flags/1x1/la-dafd3a0212ab43c02323bd5bb6fb1b4378a96e05cd352c354f6f4863a3f43f6d.svg":{"logical_path":"flags/1x1/la.svg","mtime":"2020-04-06T16:47:40+02:00","size":501,"digest":"dafd3a0212ab43c02323bd5bb6fb1b4378a96e05cd352c354f6f4863a3f43f6d","integrity":"sha256-2v06AhKrQ8AjI71btvsbQ3ipbgXNNSw1T29IY6P0P20="},"flags/4x3/lb-80a2aaa6b4ad4e44ad197ccdb7defba58af6ff0ab0692817804de12ff594bc8e.svg":{"logical_path":"flags/4x3/lb.svg","mtime":"2020-04-06T16:47:40+02:00","size":2816,"digest":"80a2aaa6b4ad4e44ad197ccdb7defba58af6ff0ab0692817804de12ff594bc8e","integrity":"sha256-gKKqprStTkStGXzNt977pYr2/wqwaSgXgE3hL/WUvI4="},"flags/1x1/lb-5da3263f37d0e740a94283824f5f0ad6c3ceed6f12dbe108fce0ddd760418373.svg":{"logical_path":"flags/1x1/lb.svg","mtime":"2020-04-06T16:47:40+02:00","size":2747,"digest":"5da3263f37d0e740a94283824f5f0ad6c3ceed6f12dbe108fce0ddd760418373","integrity":"sha256-XaMmPzfQ50CpQoOCT18K1sPO7W8S2+EI/ODd12BBg3M="},"flags/4x3/lc-6f18658956e6da5c5bf468181b465a33c33045134dfb327d35a9b6ea6c56d23e.svg":{"logical_path":"flags/4x3/lc.svg","mtime":"2020-04-06T16:47:40+02:00","size":370,"digest":"6f18658956e6da5c5bf468181b465a33c33045134dfb327d35a9b6ea6c56d23e","integrity":"sha256-bxhliVbm2lxb9GgYG0ZaM8MwRRNN+zJ9Nam26mxW0j4="},"flags/1x1/lc-c4afe17342a7894f5dc7eed56716e9149378561a12c2bbd88d4c0bf740087c38.svg":{"logical_path":"flags/1x1/lc.svg","mtime":"2020-04-06T16:47:40+02:00","size":370,"digest":"c4afe17342a7894f5dc7eed56716e9149378561a12c2bbd88d4c0bf740087c38","integrity":"sha256-xK/hc0KniU9dx+7VZxbpFJN4VhoSwrvYjUwL90AIfDg="},"flags/4x3/li-c97f90de5ee09d5594f9d3154e7eae0158a8f922e394c3ad24502a9274dd68fb.svg":{"logical_path":"flags/4x3/li.svg","mtime":"2020-04-06T16:47:40+02:00","size":8268,"digest":"c97f90de5ee09d5594f9d3154e7eae0158a8f922e394c3ad24502a9274dd68fb","integrity":"sha256-yX+Q3l7gnVWU+dMVTn6uAVio+SLjlMOtJFAqknTdaPs="},"flags/1x1/li-956ad50772021978069fde52a08f25b6fe310b0019ccabe8acd274099fb21ad5.svg":{"logical_path":"flags/1x1/li.svg","mtime":"2020-04-06T16:47:40+02:00","size":8291,"digest":"956ad50772021978069fde52a08f25b6fe310b0019ccabe8acd274099fb21ad5","integrity":"sha256-lWrVB3ICGXgGn95SoI8ltv4xCwAZzKvorNJ0CZ+yGtU="},"flags/4x3/lk-599de52b1450460f083ac0654eb4e833c06b809903c7ce11cbe202005e3f080e.svg":{"logical_path":"flags/4x3/lk.svg","mtime":"2020-04-06T16:47:40+02:00","size":11242,"digest":"599de52b1450460f083ac0654eb4e833c06b809903c7ce11cbe202005e3f080e","integrity":"sha256-WZ3lKxRQRg8IOsBlTrToM8BrgJkDx84Ry+ICAF4/CA4="},"flags/1x1/lk-379d62d2296d30d484a1c0469582d3a95736284bcdbc58e9d6bcb4f648836d1d.svg":{"logical_path":"flags/1x1/lk.svg","mtime":"2020-04-06T16:47:40+02:00","size":11254,"digest":"379d62d2296d30d484a1c0469582d3a95736284bcdbc58e9d6bcb4f648836d1d","integrity":"sha256-N51i0iltMNSEocBGlYLTqVc2KEvNvFjp1ry09kiDbR0="},"flags/4x3/lr-66c008c2d58e2b50772ad95a30801a9b62566d5f3ac8ec1ea1ad41aaadc0f4c7.svg":{"logical_path":"flags/4x3/lr.svg","mtime":"2020-04-06T16:47:40+02:00","size":727,"digest":"66c008c2d58e2b50772ad95a30801a9b62566d5f3ac8ec1ea1ad41aaadc0f4c7","integrity":"sha256-ZsAIwtWOK1B3KtlaMIAam2JWbV86yOweoa1Bqq3A9Mc="},"flags/1x1/lr-371f542a58fe7e4a3c67dc92f92009757337ba428a368af4e077a4cccac652e6.svg":{"logical_path":"flags/1x1/lr.svg","mtime":"2020-04-06T16:47:40+02:00","size":694,"digest":"371f542a58fe7e4a3c67dc92f92009757337ba428a368af4e077a4cccac652e6","integrity":"sha256-Nx9UKlj+fko8Z9yS+SAJdXM3ukKKNor04HekzMrGUuY="},"flags/4x3/ls-285534456c1acd523d23e09220799faf851218c1b2d8015b0bb557910ca1b9e4.svg":{"logical_path":"flags/4x3/ls.svg","mtime":"2020-04-06T16:47:40+02:00","size":1219,"digest":"285534456c1acd523d23e09220799faf851218c1b2d8015b0bb557910ca1b9e4","integrity":"sha256-KFU0RWwazVI9I+CSIHmfr4USGMGy2AFbC7VXkQyhueQ="},"flags/1x1/ls-80ad805e34b571d758604e2b1b735fe2c0f38dc1593c11c7d9a987e89f8fc6aa.svg":{"logical_path":"flags/1x1/ls.svg","mtime":"2020-04-06T16:47:40+02:00","size":1242,"digest":"80ad805e34b571d758604e2b1b735fe2c0f38dc1593c11c7d9a987e89f8fc6aa","integrity":"sha256-gK2AXjS1cddYYE4rG3Nf4sDzjcFZPBHH2amH6J+Pxqo="},"flags/4x3/lt-9012691cb1689944fd0813b33b7a58fb97921944ec8988f23590fed21a1ff07c.svg":{"logical_path":"flags/4x3/lt.svg","mtime":"2020-04-06T16:47:40+02:00","size":442,"digest":"9012691cb1689944fd0813b33b7a58fb97921944ec8988f23590fed21a1ff07c","integrity":"sha256-kBJpHLFomUT9CBOzO3pY+5eSGUTsiYjyNZD+0hof8Hw="},"flags/1x1/lt-74f423c6210d7dc76867b1f620d0d15644db5c39b9e4197805ad20504d271f08.svg":{"logical_path":"flags/1x1/lt.svg","mtime":"2020-04-06T16:47:40+02:00","size":442,"digest":"74f423c6210d7dc76867b1f620d0d15644db5c39b9e4197805ad20504d271f08","integrity":"sha256-dPQjxiENfcdoZ7H2INDRVkTbXDm55Bl4Ba0gUE0nHwg="},"flags/4x3/lu-4622624d698a9577a3fb92bd4fa5f98f305d704bc51306b86d109c6c865d069a.svg":{"logical_path":"flags/4x3/lu.svg","mtime":"2020-04-06T16:47:40+02:00","size":228,"digest":"4622624d698a9577a3fb92bd4fa5f98f305d704bc51306b86d109c6c865d069a","integrity":"sha256-RiJiTWmKlXej+5K9T6X5jzBdcEvFEwa4bRCcbIZdBpo="},"flags/1x1/lu-67ceb25fba1fc6a2c3836cef4033fad77752db08bcbc88fa7622b22a5f6ada2e.svg":{"logical_path":"flags/1x1/lu.svg","mtime":"2020-04-06T16:47:40+02:00","size":232,"digest":"67ceb25fba1fc6a2c3836cef4033fad77752db08bcbc88fa7622b22a5f6ada2e","integrity":"sha256-Z86yX7ofxqLDg2zvQDP613dS2wi8vIj6diKyKl9q2i4="},"flags/4x3/lv-dc67526a1833d2cd7c50d87f0da252e1fa2b361d7d418715535d3aa63e5a76b7.svg":{"logical_path":"flags/4x3/lv.svg","mtime":"2020-04-06T16:47:40+02:00","size":233,"digest":"dc67526a1833d2cd7c50d87f0da252e1fa2b361d7d418715535d3aa63e5a76b7","integrity":"sha256-3GdSahgz0s18UNh/DaJS4forNh19QYcVU106pj5adrc="},"flags/1x1/lv-23e2589c8a374ecf955772e01a4b6a7302133346737279eac1e8214b68bb0308.svg":{"logical_path":"flags/1x1/lv.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"23e2589c8a374ecf955772e01a4b6a7302133346737279eac1e8214b68bb0308","integrity":"sha256-I+JYnIo3Ts+VV3LgGktqcwITM0ZzcnnqweghS2i7Awg="},"flags/4x3/ly-3ad0387cfe11942e1f55114d49e6083185afde3528d2b05885160bdd043ff470.svg":{"logical_path":"flags/4x3/ly.svg","mtime":"2020-04-06T16:47:40+02:00","size":533,"digest":"3ad0387cfe11942e1f55114d49e6083185afde3528d2b05885160bdd043ff470","integrity":"sha256-OtA4fP4RlC4fVRFNSeYIMYWv3jUo0rBYhRYL3QQ/9HA="},"flags/1x1/ly-5139e7519b7c833dfca645e2e7424517489927cb9facc6f0dff3d80b72d1e59d.svg":{"logical_path":"flags/1x1/ly.svg","mtime":"2020-04-06T16:47:40+02:00","size":526,"digest":"5139e7519b7c833dfca645e2e7424517489927cb9facc6f0dff3d80b72d1e59d","integrity":"sha256-UTnnUZt8gz38pkXi50JFF0iZJ8ufrMbw3/PYC3LR5Z0="},"flags/4x3/ma-f40a79d79c88c1bb927ec0e40c5d044f838f0a2c48d820b3e8449e92a71d02d6.svg":{"logical_path":"flags/4x3/ma.svg","mtime":"2020-04-06T16:47:40+02:00","size":250,"digest":"f40a79d79c88c1bb927ec0e40c5d044f838f0a2c48d820b3e8449e92a71d02d6","integrity":"sha256-9Ap515yIwbuSfsDkDF0ET4OPCixI2CCz6ESekqcdAtY="},"flags/1x1/ma-3190fa17944b136ba27880e354cf385a1d7f6af076859fd8e3a25b30eaded302.svg":{"logical_path":"flags/1x1/ma.svg","mtime":"2020-04-06T16:47:40+02:00","size":250,"digest":"3190fa17944b136ba27880e354cf385a1d7f6af076859fd8e3a25b30eaded302","integrity":"sha256-MZD6F5RLE2uieIDjVM84Wh1/avB2hZ/Y46JbMOre0wI="},"flags/4x3/mc-65c30fed3b3ade292a366ca3cea6155962e94a13944fd62e73706a7f872253ec.svg":{"logical_path":"flags/4x3/mc.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"65c30fed3b3ade292a366ca3cea6155962e94a13944fd62e73706a7f872253ec","integrity":"sha256-ZcMP7Ts63ikqNmyjzqYVWWLpShOUT9Yuc3Bqf4ciU+w="},"flags/1x1/mc-83f9d4ff92513bfe22f55c5df31e600c77893660b9b3c000efad29ea4f6c32ad.svg":{"logical_path":"flags/1x1/mc.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"83f9d4ff92513bfe22f55c5df31e600c77893660b9b3c000efad29ea4f6c32ad","integrity":"sha256-g/nU/5JRO/4i9Vxd8x5gDHeJNmC5s8AA760p6k9sMq0="},"flags/4x3/md-92475a7045515ebb11c2127a896010934a569a7d16adc4a702d41adf4565d440.svg":{"logical_path":"flags/4x3/md.svg","mtime":"2020-04-06T16:47:40+02:00","size":11237,"digest":"92475a7045515ebb11c2127a896010934a569a7d16adc4a702d41adf4565d440","integrity":"sha256-kkdacEVRXrsRwhJ6iWAQk0pWmn0WrcSnAtQa30Vl1EA="},"flags/1x1/md-af363b1645da518014f81a5670419b70adc6fc09b1c32def53145c26d5fc256f.svg":{"logical_path":"flags/1x1/md.svg","mtime":"2020-04-06T16:47:40+02:00","size":11337,"digest":"af363b1645da518014f81a5670419b70adc6fc09b1c32def53145c26d5fc256f","integrity":"sha256-rzY7FkXaUYAU+BpWcEGbcK3G/Amxwy3vUxRcJtX8JW8="},"flags/4x3/me-29052367756da76b9ddcc3a71a17dc15cc39a7d387cb381fc5daad5880cd1895.svg":{"logical_path":"flags/4x3/me.svg","mtime":"2020-04-06T16:47:40+02:00","size":62373,"digest":"29052367756da76b9ddcc3a71a17dc15cc39a7d387cb381fc5daad5880cd1895","integrity":"sha256-KQUjZ3Vtp2ud3MOnGhfcFcw5p9OHyzgfxdqtWIDNGJU="},"flags/1x1/me-551e531eae9f601ce16f204217b0dea54396c8e689dd2792667e1c4fdd239367.svg":{"logical_path":"flags/1x1/me.svg","mtime":"2020-04-06T16:47:40+02:00","size":63354,"digest":"551e531eae9f601ce16f204217b0dea54396c8e689dd2792667e1c4fdd239367","integrity":"sha256-VR5THq6fYBzhbyBCF7DepUOWyOaJ3SeSZn4cT90jk2c="},"flags/4x3/mf-a07c29d68d55c8c614265e1bfc1ec179073e983f9d30a1a361310d68d2e30fa5.svg":{"logical_path":"flags/4x3/mf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"a07c29d68d55c8c614265e1bfc1ec179073e983f9d30a1a361310d68d2e30fa5","integrity":"sha256-oHwp1o1VyMYUJl4b/B7BeQc+mD+dMKGjYTENaNLjD6U="},"flags/1x1/mf-bf59a29b95c033e21fc58c30f4369db5d0312954389ab46c0e3d14b17dbd8b4e.svg":{"logical_path":"flags/1x1/mf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"bf59a29b95c033e21fc58c30f4369db5d0312954389ab46c0e3d14b17dbd8b4e","integrity":"sha256-v1mim5XAM+IfxYww9DadtdAxKVQ4mrRsDj0UsX29i04="},"flags/4x3/mg-9e1ecee816ab8ef6441e6bb5a6d14c4238f074fcbc278a4ffa6168809669e586.svg":{"logical_path":"flags/4x3/mg.svg","mtime":"2020-04-06T16:47:40+02:00","size":302,"digest":"9e1ecee816ab8ef6441e6bb5a6d14c4238f074fcbc278a4ffa6168809669e586","integrity":"sha256-nh7O6BarjvZEHmu1ptFMQjjwdPy8J4pP+mFogJZp5YY="},"flags/1x1/mg-e87135a47b177787871c8e7a341fe3b4f89843d33025affd16c2cf89bcfaac56.svg":{"logical_path":"flags/1x1/mg.svg","mtime":"2020-04-06T16:47:40+02:00","size":302,"digest":"e87135a47b177787871c8e7a341fe3b4f89843d33025affd16c2cf89bcfaac56","integrity":"sha256-6HE1pHsXd4eHHI56NB/jtPiYQ9MwJa/9FsLPibz6rFY="},"flags/4x3/mh-4785fd6418f936a2702773e3e131f282067da3d8d406c4c31d0d1bcbfc638af7.svg":{"logical_path":"flags/4x3/mh.svg","mtime":"2020-04-06T16:47:40+02:00","size":741,"digest":"4785fd6418f936a2702773e3e131f282067da3d8d406c4c31d0d1bcbfc638af7","integrity":"sha256-R4X9ZBj5NqJwJ3Pj4THyggZ9o9jUBsTDHQ0by/xjivc="},"flags/1x1/mh-ab6f55130abfca1e85a6818f74ea0f262e9327fb99f75868aae2bd2b83aef6aa.svg":{"logical_path":"flags/1x1/mh.svg","mtime":"2020-04-06T16:47:40+02:00","size":763,"digest":"ab6f55130abfca1e85a6818f74ea0f262e9327fb99f75868aae2bd2b83aef6aa","integrity":"sha256-q29VEwq/yh6FpoGPdOoPJi6TJ/uZ91hoquK9K4Ou9qo="},"flags/4x3/mk-3c7035086a33b244188bfc3ad050eb100aab771dfe39dd82c619ae6cd103af4c.svg":{"logical_path":"flags/4x3/mk.svg","mtime":"2020-04-06T16:47:40+02:00","size":382,"digest":"3c7035086a33b244188bfc3ad050eb100aab771dfe39dd82c619ae6cd103af4c","integrity":"sha256-PHA1CGozskQYi/w60FDrEAqrdx3+Od2CxhmubNEDr0w="},"flags/1x1/mk-ebcd71d69e1fad32c0acbd1c9887945069b1f75ea52ef857e2e26e8927a7d98d.svg":{"logical_path":"flags/1x1/mk.svg","mtime":"2020-04-06T16:47:40+02:00","size":410,"digest":"ebcd71d69e1fad32c0acbd1c9887945069b1f75ea52ef857e2e26e8927a7d98d","integrity":"sha256-681x1p4frTLArL0cmIeUUGmx916lLvhX4uJuiSen2Y0="},"flags/4x3/ml-e8326589ad95d63b2856367db0b6343479eb591d116bc7e7a2c15e7d422e8dca.svg":{"logical_path":"flags/4x3/ml.svg","mtime":"2020-04-06T16:47:40+02:00","size":276,"digest":"e8326589ad95d63b2856367db0b6343479eb591d116bc7e7a2c15e7d422e8dca","integrity":"sha256-6DJlia2V1jsoVjZ9sLY0NHnrWR0Ra8fnosFefUIujco="},"flags/1x1/ml-0f990fac6a324676dad90acd1f8e5cf8e660bd62f978ee44acedefaccc226b7a.svg":{"logical_path":"flags/1x1/ml.svg","mtime":"2020-04-06T16:47:40+02:00","size":279,"digest":"0f990fac6a324676dad90acd1f8e5cf8e660bd62f978ee44acedefaccc226b7a","integrity":"sha256-D5kPrGoyRnba2QrNH45c+OZgvWL5eO5ErO3vrMwia3o="},"flags/4x3/mm-f7ef4a34cf98d96f557d0a7020f178154b730129be4c2b5f8425b825665875c1.svg":{"logical_path":"flags/4x3/mm.svg","mtime":"2020-04-06T16:47:40+02:00","size":848,"digest":"f7ef4a34cf98d96f557d0a7020f178154b730129be4c2b5f8425b825665875c1","integrity":"sha256-9+9KNM+Y2W9VfQpwIPF4FUtzASm+TCtfhCW4JWZYdcE="},"flags/1x1/mm-f4df9e4b3a4df8d9ee464504a1f88cdc0ea08d9923c8c7b3099ec8eabbf4258b.svg":{"logical_path":"flags/1x1/mm.svg","mtime":"2020-04-06T16:47:40+02:00","size":865,"digest":"f4df9e4b3a4df8d9ee464504a1f88cdc0ea08d9923c8c7b3099ec8eabbf4258b","integrity":"sha256-9N+eSzpN+NnuRkUEofiM3A6gjZkjyMezCZ7I6rv0JYs="},"flags/4x3/mn-00649cb56bad07f8d34472e881fbe370a46879416fcba8dfc655f6eeed0056a3.svg":{"logical_path":"flags/4x3/mn.svg","mtime":"2020-04-06T16:47:40+02:00","size":1245,"digest":"00649cb56bad07f8d34472e881fbe370a46879416fcba8dfc655f6eeed0056a3","integrity":"sha256-AGSctWutB/jTRHLogfvjcKRoeUFvy6jfxlX27u0AVqM="},"flags/1x1/mn-ff5ea681d66e1a88ff8584dfc7fb20e8ed282b218bf9cc06518b1df90f3f99c7.svg":{"logical_path":"flags/1x1/mn.svg","mtime":"2020-04-06T16:47:40+02:00","size":1251,"digest":"ff5ea681d66e1a88ff8584dfc7fb20e8ed282b218bf9cc06518b1df90f3f99c7","integrity":"sha256-/16mgdZuGoj/hYTfx/sg6O0oKyGL+cwGUYsd+Q8/mcc="},"flags/4x3/mo-62610131201312d4268197556e2952932ee4cde22ce876668722cc332b83989e.svg":{"logical_path":"flags/4x3/mo.svg","mtime":"2020-04-06T16:47:40+02:00","size":1461,"digest":"62610131201312d4268197556e2952932ee4cde22ce876668722cc332b83989e","integrity":"sha256-YmEBMSATEtQmgZdVbilSky7kzeIs6HZmhyLMMyuDmJ4="},"flags/1x1/mo-8eaad37d10c6db6035b0d4a74c33015539f2c78cd655e0ce4e1aa4b04f3ce36a.svg":{"logical_path":"flags/1x1/mo.svg","mtime":"2020-04-06T16:47:40+02:00","size":1495,"digest":"8eaad37d10c6db6035b0d4a74c33015539f2c78cd655e0ce4e1aa4b04f3ce36a","integrity":"sha256-jqrTfRDG22A1sNSnTDMBVTnyx4zWVeDOThqksE8842o="},"flags/4x3/mp-2e4af783bec6f474fc03275a7dc048a146d28ad3da615d65e6eb6d930c0054ef.svg":{"logical_path":"flags/4x3/mp.svg","mtime":"2020-04-06T16:47:40+02:00","size":23398,"digest":"2e4af783bec6f474fc03275a7dc048a146d28ad3da615d65e6eb6d930c0054ef","integrity":"sha256-Lkr3g77G9HT8AydafcBIoUbSitPaYV1l5uttkwwAVO8="},"flags/1x1/mp-9b89316de0a803f61b8a4e842483db37436cc9e53911d6e2f59b53dfa422d563.svg":{"logical_path":"flags/1x1/mp.svg","mtime":"2020-04-06T16:47:40+02:00","size":23628,"digest":"9b89316de0a803f61b8a4e842483db37436cc9e53911d6e2f59b53dfa422d563","integrity":"sha256-m4kxbeCoA/Ybik6EJIPbN0NsyeU5Edbi9ZtT36Qi1WM="},"flags/4x3/mq-297d268a5e967f7d34c91aa4513f86ec67b2efcef6df294a7846a554d73f22d9.svg":{"logical_path":"flags/4x3/mq.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"297d268a5e967f7d34c91aa4513f86ec67b2efcef6df294a7846a554d73f22d9","integrity":"sha256-KX0mil6Wf300yRqkUT+G7Gey78723ylKeEalVNc/Itk="},"flags/1x1/mq-0e466f6d604a1134afaa8fcced93845bd17be04debfd302d70964a806532f093.svg":{"logical_path":"flags/1x1/mq.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"0e466f6d604a1134afaa8fcced93845bd17be04debfd302d70964a806532f093","integrity":"sha256-DkZvbWBKETSvqo/M7ZOEW9F74E3r/TAtcJZKgGUy8JM="},"flags/4x3/mr-e41908b9de58fe9479e9a2e2a5bc0074ca1013cc247f2b1410568e8babe4ebfe.svg":{"logical_path":"flags/4x3/mr.svg","mtime":"2020-04-06T16:47:40+02:00","size":442,"digest":"e41908b9de58fe9479e9a2e2a5bc0074ca1013cc247f2b1410568e8babe4ebfe","integrity":"sha256-5BkIud5Y/pR56aLipbwAdMoQE8wkfysUEFaOi6vk6/4="},"flags/1x1/mr-fa0266040f7fa99236c10e36bd23ad92a558fdd79d250a23076733ae2aade799.svg":{"logical_path":"flags/1x1/mr.svg","mtime":"2020-04-06T16:47:40+02:00","size":431,"digest":"fa0266040f7fa99236c10e36bd23ad92a558fdd79d250a23076733ae2aade799","integrity":"sha256-+gJmBA9/qZI2wQ42vSOtkqVY/dedJQojB2czriqt55k="},"flags/4x3/ms-c2c0dfeea4a1f46dfb510afc8a97e99cc5a91d89851e97e4edd48f10d10eb262.svg":{"logical_path":"flags/4x3/ms.svg","mtime":"2020-04-06T16:47:40+02:00","size":9279,"digest":"c2c0dfeea4a1f46dfb510afc8a97e99cc5a91d89851e97e4edd48f10d10eb262","integrity":"sha256-wsDf7qSh9G37UQr8ipfpnMWpHYmFHpfk7dSPENEOsmI="},"flags/1x1/ms-c1ba27711118135b0d694151a37e397e71ae19470cd2fb7bb21ccb8178f4be43.svg":{"logical_path":"flags/1x1/ms.svg","mtime":"2020-04-06T16:47:40+02:00","size":12140,"digest":"c1ba27711118135b0d694151a37e397e71ae19470cd2fb7bb21ccb8178f4be43","integrity":"sha256-wboncREYE1sNaUFRo345fnGuGUcM0vt7shzLgXj0vkM="},"flags/4x3/mt-fd6a6cbf958e7d3b88070ded68716b2b85bc130acf68e3b0bbab05361dbab47d.svg":{"logical_path":"flags/4x3/mt.svg","mtime":"2020-04-06T16:47:40+02:00","size":8733,"digest":"fd6a6cbf958e7d3b88070ded68716b2b85bc130acf68e3b0bbab05361dbab47d","integrity":"sha256-/Wpsv5WOfTuIBw3taHFrK4W8EwrPaOOwu6sFNh26tH0="},"flags/1x1/mt-b841b8cd3c568b0638ab7fd12e8dcf24f09f1b6bbf7942a28c52212ac465d100.svg":{"logical_path":"flags/1x1/mt.svg","mtime":"2020-04-06T16:47:40+02:00","size":10422,"digest":"b841b8cd3c568b0638ab7fd12e8dcf24f09f1b6bbf7942a28c52212ac465d100","integrity":"sha256-uEG4zTxWiwY4q3/RLo3PJPCfG2u/eUKijFIhKsRl0QA="},"flags/4x3/mu-e3ce67e697fb6b33a39726379574752eef57b121d6f60d160e6bc7d7ed8f5ae6.svg":{"logical_path":"flags/4x3/mu.svg","mtime":"2020-04-06T16:47:40+02:00","size":319,"digest":"e3ce67e697fb6b33a39726379574752eef57b121d6f60d160e6bc7d7ed8f5ae6","integrity":"sha256-485n5pf7azOjlyY3lXR1Lu9XsSHW9g0WDmvH1+2PWuY="},"flags/1x1/mu-9e4e19a678ac8b84eb14740be948a7dea035b5c0623639ba6e06e242359aa1bb.svg":{"logical_path":"flags/1x1/mu.svg","mtime":"2020-04-06T16:47:40+02:00","size":319,"digest":"9e4e19a678ac8b84eb14740be948a7dea035b5c0623639ba6e06e242359aa1bb","integrity":"sha256-nk4Zpnisi4TrFHQL6Uin3qA1tcBiNjm6bgbiQjWaobs="},"flags/4x3/mv-0f9b86efb7f8d66d28223ff592232812cfd2d2567db83ef96bf783ea3154eb8d.svg":{"logical_path":"flags/4x3/mv.svg","mtime":"2020-04-06T16:47:40+02:00","size":289,"digest":"0f9b86efb7f8d66d28223ff592232812cfd2d2567db83ef96bf783ea3154eb8d","integrity":"sha256-D5uG77f41m0oIj/1kiMoEs/S0lZ9uD75a/eD6jFU640="},"flags/1x1/mv-57323390cdd79b28e658b6089304469012536c57101787020701ed91518848da.svg":{"logical_path":"flags/1x1/mv.svg","mtime":"2020-04-06T16:47:40+02:00","size":307,"digest":"57323390cdd79b28e658b6089304469012536c57101787020701ed91518848da","integrity":"sha256-VzIzkM3XmyjmWLYIkwRGkBJTbFcQF4cCBwHtkVGISNo="},"flags/4x3/mw-c2c93e168527ec8bda2799854370dfacafcb491f39d6083900d903244c00cc4b.svg":{"logical_path":"flags/4x3/mw.svg","mtime":"2020-04-06T16:47:40+02:00","size":3652,"digest":"c2c93e168527ec8bda2799854370dfacafcb491f39d6083900d903244c00cc4b","integrity":"sha256-wsk+FoUn7IvaJ5mFQ3DfrK/LSR851gg5ANkDJEwAzEs="},"flags/1x1/mw-5baad15595dcd8c0822e2bb9581efd027ac23ce10efa4202f3b5f566819080a0.svg":{"logical_path":"flags/1x1/mw.svg","mtime":"2020-04-06T16:47:40+02:00","size":3797,"digest":"5baad15595dcd8c0822e2bb9581efd027ac23ce10efa4202f3b5f566819080a0","integrity":"sha256-W6rRVZXc2MCCLiu5WB79AnrCPOEO+kIC87X1ZoGQgKA="},"flags/4x3/mx-8258503043a0a3b6fc68ef1af0025ef0de85fa482fb77e8ba220c3cd6a7a86a7.svg":{"logical_path":"flags/4x3/mx.svg","mtime":"2020-04-06T16:47:40+02:00","size":94979,"digest":"8258503043a0a3b6fc68ef1af0025ef0de85fa482fb77e8ba220c3cd6a7a86a7","integrity":"sha256-glhQMEOgo7b8aO8a8AJe8N6F+kgvt36LoiDDzWp6hqc="},"flags/1x1/mx-b67b689c0045cb4e8a4d5a439adbbf4c471cc090cbeb7ba7b2aed0eeabdbef3e.svg":{"logical_path":"flags/1x1/mx.svg","mtime":"2020-04-06T16:47:40+02:00","size":90505,"digest":"b67b689c0045cb4e8a4d5a439adbbf4c471cc090cbeb7ba7b2aed0eeabdbef3e","integrity":"sha256-tntonABFy06KTVpDmtu/TEccwJDL63unsq7Q7qvb7z4="},"flags/4x3/my-c992340a8c8284fca33fbcbcb287ace68c355a0603c471d9b09a207ab4f7390c.svg":{"logical_path":"flags/4x3/my.svg","mtime":"2020-04-06T16:47:40+02:00","size":1270,"digest":"c992340a8c8284fca33fbcbcb287ace68c355a0603c471d9b09a207ab4f7390c","integrity":"sha256-yZI0CoyChPyjP7y8soes5ow1WgYDxHHZsJogerT3OQw="},"flags/1x1/my-cb10a92508324c9de2641b74ca7a0c4872548dc874fbcbe9f75d6aa46ecd28bd.svg":{"logical_path":"flags/1x1/my.svg","mtime":"2020-04-06T16:47:40+02:00","size":1262,"digest":"cb10a92508324c9de2641b74ca7a0c4872548dc874fbcbe9f75d6aa46ecd28bd","integrity":"sha256-yxCpJQgyTJ3iZBt0ynoMSHJUjch0+8vp911qpG7NKL0="},"flags/4x3/mz-db6310ed68179491d7d9ad03d133cd8ace0fd75dd0624f3f9f1c856eb799fdb1.svg":{"logical_path":"flags/4x3/mz.svg","mtime":"2020-04-06T16:47:40+02:00","size":2622,"digest":"db6310ed68179491d7d9ad03d133cd8ace0fd75dd0624f3f9f1c856eb799fdb1","integrity":"sha256-22MQ7WgXlJHX2a0D0TPNis4P113QYk8/nxyFbreZ/bE="},"flags/1x1/mz-cbc5741e7cb4a2212dc311772b55688c4e9e2d2f11d1e2c3c42dd4f2a1464473.svg":{"logical_path":"flags/1x1/mz.svg","mtime":"2020-04-06T16:47:40+02:00","size":2597,"digest":"cbc5741e7cb4a2212dc311772b55688c4e9e2d2f11d1e2c3c42dd4f2a1464473","integrity":"sha256-y8V0Hny0oiEtwxF3K1VojE6eLS8R0eLDxC3U8qFGRHM="},"flags/4x3/na-7c73485829c6aee5fb2e678707883ae99de6ddc50f4393025fdadedd78944213.svg":{"logical_path":"flags/4x3/na.svg","mtime":"2020-04-06T16:47:40+02:00","size":1005,"digest":"7c73485829c6aee5fb2e678707883ae99de6ddc50f4393025fdadedd78944213","integrity":"sha256-fHNIWCnGruX7LmeHB4g66Z3m3cUPQ5MCX9re3XiUQhM="},"flags/1x1/na-37d8c89f1f7e5e2dd7a7e2211afd542a9565533995500e5686c791a6e9f51d20.svg":{"logical_path":"flags/1x1/na.svg","mtime":"2020-04-06T16:47:40+02:00","size":977,"digest":"37d8c89f1f7e5e2dd7a7e2211afd542a9565533995500e5686c791a6e9f51d20","integrity":"sha256-N9jInx9+Xi3Xp+IhGv1UKpVlUzmVUA5WhseRpun1HSA="},"flags/4x3/nc-b0c095d359e58de45a984c4d3aa73c5442e76c2b8837ae491f53284de1a15475.svg":{"logical_path":"flags/4x3/nc.svg","mtime":"2020-04-06T16:47:40+02:00","size":1380,"digest":"b0c095d359e58de45a984c4d3aa73c5442e76c2b8837ae491f53284de1a15475","integrity":"sha256-sMCV01nljeRamExNOqc8VELnbCuIN65JH1MoTeGhVHU="},"flags/1x1/nc-d7a07223b8b040a88ea6a11662b947add62e438a993721494df88951aa9df656.svg":{"logical_path":"flags/1x1/nc.svg","mtime":"2020-04-06T16:47:40+02:00","size":1387,"digest":"d7a07223b8b040a88ea6a11662b947add62e438a993721494df88951aa9df656","integrity":"sha256-16ByI7iwQKiOpqEWYrlHrdYuQ4qZNyFJTfiJUaqd9lY="},"flags/4x3/ne-54d7076def267766d8e49d822d6b9b774e82bfe0a91269b0951148f5a19e4900.svg":{"logical_path":"flags/4x3/ne.svg","mtime":"2020-04-06T16:47:40+02:00","size":276,"digest":"54d7076def267766d8e49d822d6b9b774e82bfe0a91269b0951148f5a19e4900","integrity":"sha256-VNcHbe8md2bY5J2CLWubd06Cv+CpEmmwlRFI9aGeSQA="},"flags/1x1/ne-bee088c42b4ce13a5dc346424f354a53a78db7db8eaa064bf534b711532f19c3.svg":{"logical_path":"flags/1x1/ne.svg","mtime":"2020-04-06T16:47:40+02:00","size":282,"digest":"bee088c42b4ce13a5dc346424f354a53a78db7db8eaa064bf534b711532f19c3","integrity":"sha256-vuCIxCtM4Tpdw0ZCTzVKU6eNt9uOqgZL9TS3EVMvGcM="},"flags/4x3/nf-f0e0b96f2586ad66b367fe6490b48df8aeea0c100bf5178cd1ffbc03571fe95c.svg":{"logical_path":"flags/4x3/nf.svg","mtime":"2020-04-06T16:47:40+02:00","size":5837,"digest":"f0e0b96f2586ad66b367fe6490b48df8aeea0c100bf5178cd1ffbc03571fe95c","integrity":"sha256-8OC5byWGrWazZ/5kkLSN+K7qDBAL9ReM0f+8A1cf6Vw="},"flags/1x1/nf-4880d7db266b4219bf4878fa435f9021c02d86c7309d6571c5cc6a0eba81777d.svg":{"logical_path":"flags/1x1/nf.svg","mtime":"2020-04-06T16:47:40+02:00","size":5591,"digest":"4880d7db266b4219bf4878fa435f9021c02d86c7309d6571c5cc6a0eba81777d","integrity":"sha256-SIDX2yZrQhm/SHj6Q1+QIcAthscwnWVxxcxqDrqBd30="},"flags/4x3/ng-f1ca02b4d2034f53a5b768674883dab4b21852dc2ae39b2d02bc281384d95e33.svg":{"logical_path":"flags/4x3/ng.svg","mtime":"2020-04-06T16:47:40+02:00","size":260,"digest":"f1ca02b4d2034f53a5b768674883dab4b21852dc2ae39b2d02bc281384d95e33","integrity":"sha256-8coCtNIDT1Olt2hnSIPatLIYUtwq45stArwoE4TZXjM="},"flags/1x1/ng-8b34a12b4b7116eb6ecc79744e0b0244cacdea5ea200940522042fa12953097a.svg":{"logical_path":"flags/1x1/ng.svg","mtime":"2020-04-06T16:47:40+02:00","size":260,"digest":"8b34a12b4b7116eb6ecc79744e0b0244cacdea5ea200940522042fa12953097a","integrity":"sha256-izShK0txFutuzHl0TgsCRMrN6l6iAJQFIgQvoSlTCXo="},"flags/4x3/ni-a6c8d7f7a74b93a4c42589c951ce37ea3e073daf82f2418efa6a5ff1ec2d23fb.svg":{"logical_path":"flags/4x3/ni.svg","mtime":"2020-04-06T16:47:40+02:00","size":18408,"digest":"a6c8d7f7a74b93a4c42589c951ce37ea3e073daf82f2418efa6a5ff1ec2d23fb","integrity":"sha256-psjX96dLk6TEJYnJUc436j4HPa+C8kGO+mpf8ewtI/s="},"flags/1x1/ni-a9ead4b075e183ce139f9c26256dd2a8d083d4d126d85f3848d8e9ac884ab504.svg":{"logical_path":"flags/1x1/ni.svg","mtime":"2020-04-06T16:47:40+02:00","size":18463,"digest":"a9ead4b075e183ce139f9c26256dd2a8d083d4d126d85f3848d8e9ac884ab504","integrity":"sha256-qerUsHXhg84Tn5wmJW3SqNCD1NEm2F84SNjprIhKtQQ="},"flags/4x3/nl-a91174a3cccd5ec66da2cc68e0cbf86a3ea73d2976dc303c72109198b2504b51.svg":{"logical_path":"flags/4x3/nl.svg","mtime":"2020-04-06T16:47:40+02:00","size":224,"digest":"a91174a3cccd5ec66da2cc68e0cbf86a3ea73d2976dc303c72109198b2504b51","integrity":"sha256-qRF0o8zNXsZtosxo4Mv4aj6nPSl23DA8chCRmLJQS1E="},"flags/1x1/nl-426beba2bc0a7ae4079c8586509f6902dc9a6082f4a0ec7c71520572ac3f86c2.svg":{"logical_path":"flags/1x1/nl.svg","mtime":"2020-04-06T16:47:40+02:00","size":228,"digest":"426beba2bc0a7ae4079c8586509f6902dc9a6082f4a0ec7c71520572ac3f86c2","integrity":"sha256-QmvrorwKeuQHnIWGUJ9pAtyaYIL0oOx8cVIFcqw/hsI="},"flags/4x3/no-c59f156ddd70507f05267dc35e2e4f3e44467b9ef414995abb91589dc486dd6a.svg":{"logical_path":"flags/4x3/no.svg","mtime":"2020-04-06T16:47:40+02:00","size":321,"digest":"c59f156ddd70507f05267dc35e2e4f3e44467b9ef414995abb91589dc486dd6a","integrity":"sha256-xZ8Vbd1wUH8FJn3DXi5PPkRGe570FJlau5FYncSG3Wo="},"flags/1x1/no-567df11f5e12f95a4c707234127ad878db61c286cfdd034dbcab8c4222c4af25.svg":{"logical_path":"flags/1x1/no.svg","mtime":"2020-04-06T16:47:40+02:00","size":321,"digest":"567df11f5e12f95a4c707234127ad878db61c286cfdd034dbcab8c4222c4af25","integrity":"sha256-Vn3xH14S+VpMcHI0EnrYeNthwobP3QNNvKuMQiLEryU="},"flags/4x3/np-ddc042ba58c0842e4a1dd8ac56701dd8e22659cb04e3905d3866810d6333aaf0.svg":{"logical_path":"flags/4x3/np.svg","mtime":"2020-04-06T16:47:40+02:00","size":1061,"digest":"ddc042ba58c0842e4a1dd8ac56701dd8e22659cb04e3905d3866810d6333aaf0","integrity":"sha256-3cBCuljAhC5KHdisVnAd2OImWcsE45BdOGaBDWMzqvA="},"flags/1x1/np-d81adac491e4e7cef7e94ab6e94f00564b319f9a383b85e0dd753aebc1cfeea2.svg":{"logical_path":"flags/1x1/np.svg","mtime":"2020-04-06T16:47:40+02:00","size":1193,"digest":"d81adac491e4e7cef7e94ab6e94f00564b319f9a383b85e0dd753aebc1cfeea2","integrity":"sha256-2BraxJHk58736Uq26U8AVksxn5o4O4Xg3XU668HP7qI="},"flags/4x3/nr-2f19fb532598a59536ccf4bb6f4446c08eb1b9ed5ebe0ff1f00bc6fc8c36e792.svg":{"logical_path":"flags/4x3/nr.svg","mtime":"2020-04-06T16:47:40+02:00","size":651,"digest":"2f19fb532598a59536ccf4bb6f4446c08eb1b9ed5ebe0ff1f00bc6fc8c36e792","integrity":"sha256-Lxn7UyWYpZU2zPS7b0RGwI6xue1evg/x8AvG/Iw255I="},"flags/1x1/nr-6e66f80525a6b92920b1acd01c9bcc214b1a2f05393d65af6428567e7de0cc6c.svg":{"logical_path":"flags/1x1/nr.svg","mtime":"2020-04-06T16:47:40+02:00","size":668,"digest":"6e66f80525a6b92920b1acd01c9bcc214b1a2f05393d65af6428567e7de0cc6c","integrity":"sha256-bmb4BSWmuSkgsazQHJvMIUsaLwU5PWWvZChWfn3gzGw="},"flags/4x3/nu-55390cc014e85eb56b9d08004470900d13d95ed83ddb5006bf4e0e1cf519028c.svg":{"logical_path":"flags/4x3/nu.svg","mtime":"2020-04-06T16:47:40+02:00","size":1745,"digest":"55390cc014e85eb56b9d08004470900d13d95ed83ddb5006bf4e0e1cf519028c","integrity":"sha256-VTkMwBToXrVrnQgARHCQDRPZXtg921AGv04OHPUZAow="},"flags/1x1/nu-1bfa55a93eca4ffd981f98935d6c2cab58a29be4f0d2f15a50148d695ab50f3f.svg":{"logical_path":"flags/1x1/nu.svg","mtime":"2020-04-06T16:47:40+02:00","size":1727,"digest":"1bfa55a93eca4ffd981f98935d6c2cab58a29be4f0d2f15a50148d695ab50f3f","integrity":"sha256-G/pVqT7KT/2YH5iTXWwsq1iim+Tw0vFaUBSNaVq1Dz8="},"flags/4x3/nz-b7f4f0961f007b0cc355df85903b0af0cfd6b655e23aa56aa547dc5ed693ae7f.svg":{"logical_path":"flags/4x3/nz.svg","mtime":"2020-04-06T16:47:40+02:00","size":2989,"digest":"b7f4f0961f007b0cc355df85903b0af0cfd6b655e23aa56aa547dc5ed693ae7f","integrity":"sha256-t/Twlh8AewzDVd+FkDsK8M/WtlXiOqVqpUfcXtaTrn8="},"flags/1x1/nz-b93a77fe262ed1d5fbd196f2224c0fa2b3dd6d1e84c0027c5a122643fdad8d23.svg":{"logical_path":"flags/1x1/nz.svg","mtime":"2020-04-06T16:47:40+02:00","size":2999,"digest":"b93a77fe262ed1d5fbd196f2224c0fa2b3dd6d1e84c0027c5a122643fdad8d23","integrity":"sha256-uTp3/iYu0dX70ZbyIkwPorPdbR6EwAJ8WhImQ/2tjSM="},"flags/4x3/om-d66047c0f554b25250566bdbdf7d4ac03c0f708f03cd4c4159c57f16fa056967.svg":{"logical_path":"flags/4x3/om.svg","mtime":"2020-04-06T16:47:40+02:00","size":22636,"digest":"d66047c0f554b25250566bdbdf7d4ac03c0f708f03cd4c4159c57f16fa056967","integrity":"sha256-1mBHwPVUslJQVmvb331KwDwPcI8DzUxBWcV/FvoFaWc="},"flags/1x1/om-20669c3a4f181d035b5acd82a12d7354b3c5decb53383ea6b7a53d02b7138fe9.svg":{"logical_path":"flags/1x1/om.svg","mtime":"2020-04-06T16:47:40+02:00","size":22614,"digest":"20669c3a4f181d035b5acd82a12d7354b3c5decb53383ea6b7a53d02b7138fe9","integrity":"sha256-IGacOk8YHQNbWs2CoS1zVLPF3stTOD6mt6U9ArcTj+k="},"flags/4x3/pa-0bd4b6709d9ca822851f2d7c57ef9fb3c098ceeea5d239bbf8f3196b062d1d11.svg":{"logical_path":"flags/4x3/pa.svg","mtime":"2020-04-06T16:47:40+02:00","size":749,"digest":"0bd4b6709d9ca822851f2d7c57ef9fb3c098ceeea5d239bbf8f3196b062d1d11","integrity":"sha256-C9S2cJ2cqCKFHy18V++fs8CYzu6l0jm7+PMZawYtHRE="},"flags/1x1/pa-6e0e27190b3c3806b6cae82d0e3708c05e02bc82479e252f4486a0eee43a58d7.svg":{"logical_path":"flags/1x1/pa.svg","mtime":"2020-04-06T16:47:40+02:00","size":659,"digest":"6e0e27190b3c3806b6cae82d0e3708c05e02bc82479e252f4486a0eee43a58d7","integrity":"sha256-bg4nGQs8OAa2yugtDjcIwF4CvIJHniUvRIag7uQ6WNc="},"flags/4x3/pe-3fddfd9a5405daa75ae35d717219be04940fbd956b583fa9a75d0c54ec5d6da5.svg":{"logical_path":"flags/4x3/pe.svg","mtime":"2020-04-06T16:47:40+02:00","size":73609,"digest":"3fddfd9a5405daa75ae35d717219be04940fbd956b583fa9a75d0c54ec5d6da5","integrity":"sha256-P939mlQF2qda411xchm+BJQPvZVrWD+pp10MVOxdbaU="},"flags/1x1/pe-e0468f05eddaea5fb78d8d86440a580cd9cf5f27baa3e2ac4f229b4423abd7f9.svg":{"logical_path":"flags/1x1/pe.svg","mtime":"2020-04-06T16:47:40+02:00","size":72907,"digest":"e0468f05eddaea5fb78d8d86440a580cd9cf5f27baa3e2ac4f229b4423abd7f9","integrity":"sha256-4EaPBe3a6l+3jY2GRApYDNnPXye6o+KsTyKbRCOr1/k="},"flags/4x3/pf-de72e06f1af9d5d3f44995e41ec69b3669da1d59a40b4d99b03164617ab326b1.svg":{"logical_path":"flags/4x3/pf.svg","mtime":"2020-04-06T16:47:40+02:00","size":4290,"digest":"de72e06f1af9d5d3f44995e41ec69b3669da1d59a40b4d99b03164617ab326b1","integrity":"sha256-3nLgbxr51dP0SZXkHsabNmnaHVmkC02ZsDFkYXqzJrE="},"flags/1x1/pf-d68e024f9a826b0790679bf50cf2f004f5063aacbf99948a0aeb792c97e20c88.svg":{"logical_path":"flags/1x1/pf.svg","mtime":"2020-04-06T16:47:40+02:00","size":4229,"digest":"d68e024f9a826b0790679bf50cf2f004f5063aacbf99948a0aeb792c97e20c88","integrity":"sha256-1o4CT5qCaweQZ5v1DPLwBPUGOqy/mZSKCut5LJfiDIg="},"flags/4x3/pg-10ae837d9c7828178cc70a3489b719ab88a3c3dfbd58bfcf7c0ce26908efc809.svg":{"logical_path":"flags/4x3/pg.svg","mtime":"2020-04-06T16:47:40+02:00","size":1661,"digest":"10ae837d9c7828178cc70a3489b719ab88a3c3dfbd58bfcf7c0ce26908efc809","integrity":"sha256-EK6DfZx4KBeMxwo0ibcZq4ijw9+9WL/PfAziaQjvyAk="},"flags/1x1/pg-40cd64620f6af0b94340fa7c71de0e2ef541e6072d886e666ddf6acd2f5aecdb.svg":{"logical_path":"flags/1x1/pg.svg","mtime":"2020-04-06T16:47:40+02:00","size":2095,"digest":"40cd64620f6af0b94340fa7c71de0e2ef541e6072d886e666ddf6acd2f5aecdb","integrity":"sha256-QM1kYg9q8LlDQPp8cd4OLvVB5gctiG5mbd9qzS9a7Ns="},"flags/4x3/ph-fd167a43304972aa43f76a0ec3f03dc89dde4f96adc654a7e0e2e1257aa9a7e5.svg":{"logical_path":"flags/4x3/ph.svg","mtime":"2020-04-06T16:47:40+02:00","size":1565,"digest":"fd167a43304972aa43f76a0ec3f03dc89dde4f96adc654a7e0e2e1257aa9a7e5","integrity":"sha256-/RZ6QzBJcqpD92oOw/A9yJ3eT5atxlSn4OLhJXqpp+U="},"flags/1x1/ph-2f9dd37f9762ce80f198b8cb9b4acab9e19c482d7cbb927f7866b1920133af3c.svg":{"logical_path":"flags/1x1/ph.svg","mtime":"2020-04-06T16:47:40+02:00","size":1510,"digest":"2f9dd37f9762ce80f198b8cb9b4acab9e19c482d7cbb927f7866b1920133af3c","integrity":"sha256-L53Tf5dizoDxmLjLm0rKueGcSC18u5J/eGaxkgEzrzw="},"flags/4x3/pk-0c5ada4d149d7ff18ea90733cf9bfa8754981730138c20ec97b864d97fe34ef9.svg":{"logical_path":"flags/4x3/pk.svg","mtime":"2020-04-06T16:47:40+02:00","size":739,"digest":"0c5ada4d149d7ff18ea90733cf9bfa8754981730138c20ec97b864d97fe34ef9","integrity":"sha256-DFraTRSdf/GOqQczz5v6h1SYFzATjCDsl7hk2X/jTvk="},"flags/1x1/pk-637994c86e94944be181dba8727a3b136191f72ebe53f043f0b7297fcced5903.svg":{"logical_path":"flags/1x1/pk.svg","mtime":"2020-04-06T16:47:40+02:00","size":684,"digest":"637994c86e94944be181dba8727a3b136191f72ebe53f043f0b7297fcced5903","integrity":"sha256-Y3mUyG6UlEvhgduocno7E2GR9y6+U/BD8Lcpf8ztWQM="},"flags/4x3/pl-bd8c588ce4c71594e5f3789b700c935e3c97e5c06e62ddb595752c805e90d851.svg":{"logical_path":"flags/4x3/pl.svg","mtime":"2020-04-06T16:47:40+02:00","size":222,"digest":"bd8c588ce4c71594e5f3789b700c935e3c97e5c06e62ddb595752c805e90d851","integrity":"sha256-vYxYjOTHFZTl83ibcAyTXjyX5cBuYt21lXUsgF6Q2FE="},"flags/1x1/pl-d7c4aadb69ef13492016a7b2995020f9d754d128f9354dd742c32d420c3340ad.svg":{"logical_path":"flags/1x1/pl.svg","mtime":"2020-04-06T16:47:40+02:00","size":222,"digest":"d7c4aadb69ef13492016a7b2995020f9d754d128f9354dd742c32d420c3340ad","integrity":"sha256-18Sq22nvE0kgFqeymVAg+ddU0Sj5NU3XQsMtQgwzQK0="},"flags/4x3/pm-e1e1de44f61b53fb70041acec8426e6505526c9a29317a4fc1dbc206f0f261e6.svg":{"logical_path":"flags/4x3/pm.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"e1e1de44f61b53fb70041acec8426e6505526c9a29317a4fc1dbc206f0f261e6","integrity":"sha256-4eHeRPYbU/twBBrOyEJuZQVSbJopMXpPwdvCBvDyYeY="},"flags/1x1/pm-4e3a65b4577055027d41ebf6441200b8e1f360a1677e2032f262b58805689641.svg":{"logical_path":"flags/1x1/pm.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"4e3a65b4577055027d41ebf6441200b8e1f360a1677e2032f262b58805689641","integrity":"sha256-TjpltFdwVQJ9Qev2RBIAuOHzYKFnfiAy8mK1iAVolkE="},"flags/4x3/pn-d05afc2826bdaa9121a17e9ff42d35ec4a72668a4efe0b65acd6e6de23f8268c.svg":{"logical_path":"flags/4x3/pn.svg","mtime":"2020-04-06T16:47:40+02:00","size":10878,"digest":"d05afc2826bdaa9121a17e9ff42d35ec4a72668a4efe0b65acd6e6de23f8268c","integrity":"sha256-0Fr8KCa9qpEhoX6f9C017EpyZopO/gtlrNbm3iP4Jow="},"flags/1x1/pn-c2f3565f6e8282d44babe06fd25605c002f5abb3edafa843762a9ed6de06464b.svg":{"logical_path":"flags/1x1/pn.svg","mtime":"2020-04-06T16:47:40+02:00","size":8517,"digest":"c2f3565f6e8282d44babe06fd25605c002f5abb3edafa843762a9ed6de06464b","integrity":"sha256-wvNWX26CgtRLq+Bv0lYFwAL1q7Ptr6hDdiqe1t4GRks="},"flags/4x3/pr-f87e928ea7a84ebc9c7d6e8ee6e43e9f93014adebc4604f01fe36db29e635ed8.svg":{"logical_path":"flags/4x3/pr.svg","mtime":"2020-04-06T16:47:40+02:00","size":637,"digest":"f87e928ea7a84ebc9c7d6e8ee6e43e9f93014adebc4604f01fe36db29e635ed8","integrity":"sha256-+H6SjqeoTrycfW6O5uQ+n5MBSt68RgTwH+Ntsp5jXtg="},"flags/1x1/pr-7a94e53dbfc93808d194a05e79f780aef0d2b231e830e4fb4b931cdde7d6da26.svg":{"logical_path":"flags/1x1/pr.svg","mtime":"2020-04-06T16:47:40+02:00","size":619,"digest":"7a94e53dbfc93808d194a05e79f780aef0d2b231e830e4fb4b931cdde7d6da26","integrity":"sha256-epTlPb/JOAjRlKBeefeArvDSsjHoMOT7S5Mc3efW2iY="},"flags/4x3/ps-84421fd66f9058e424da190fc8b3f6a0d35e7bb918aa6fffacd00a1a2c1b2d71.svg":{"logical_path":"flags/4x3/ps.svg","mtime":"2020-04-06T16:47:40+02:00","size":561,"digest":"84421fd66f9058e424da190fc8b3f6a0d35e7bb918aa6fffacd00a1a2c1b2d71","integrity":"sha256-hEIf1m+QWOQk2hkPyLP2oNNee7kYqm//rNAKGiwbLXE="},"flags/1x1/ps-31a06ee8dc4500f9665b4e3654489abc6a77851c7a43c245809bc874ac6f77e9.svg":{"logical_path":"flags/1x1/ps.svg","mtime":"2020-04-06T16:47:40+02:00","size":541,"digest":"31a06ee8dc4500f9665b4e3654489abc6a77851c7a43c245809bc874ac6f77e9","integrity":"sha256-MaBu6NxFAPlmW042VEiavGp3hRx6Q8JFgJvIdKxvd+k="},"flags/4x3/pt-62137f64b8b37b24510095926415b3120029f0d57e97817209e895f9c50b26dd.svg":{"logical_path":"flags/4x3/pt.svg","mtime":"2020-04-06T16:47:40+02:00","size":8280,"digest":"62137f64b8b37b24510095926415b3120029f0d57e97817209e895f9c50b26dd","integrity":"sha256-YhN/ZLizeyRRAJWSZBWzEgAp8NV+l4FyCeiV+cULJt0="},"flags/1x1/pt-2fc8fb378410d636377385d6d007f20a41d6493fdae51a35cab5eaa5da3328fa.svg":{"logical_path":"flags/1x1/pt.svg","mtime":"2020-04-06T16:47:40+02:00","size":8661,"digest":"2fc8fb378410d636377385d6d007f20a41d6493fdae51a35cab5eaa5da3328fa","integrity":"sha256-L8j7N4QQ1jY3c4XW0AfyCkHWST/a5Ro1yrXqpdozKPo="},"flags/4x3/pw-c59cfacb984b59244f48132977b96327c880f391431a2610ec4617d1f73ee3a7.svg":{"logical_path":"flags/4x3/pw.svg","mtime":"2020-04-06T16:47:40+02:00","size":467,"digest":"c59cfacb984b59244f48132977b96327c880f391431a2610ec4617d1f73ee3a7","integrity":"sha256-xZz6y5hLWSRPSBMpd7ljJ8iA85FDGiYQ7EYX0fc+46c="},"flags/1x1/pw-21a677b7fa3f33a6304926ac4b0d516f2710d9d576cefb46674e3f9c2a444956.svg":{"logical_path":"flags/1x1/pw.svg","mtime":"2020-04-06T16:47:40+02:00","size":507,"digest":"21a677b7fa3f33a6304926ac4b0d516f2710d9d576cefb46674e3f9c2a444956","integrity":"sha256-IaZ3t/o/M6YwSSasSw1RbycQ2dV2zvtGZ04/nCpESVY="},"flags/4x3/py-22570d444732336f9af31307c5b4c5809d8c028319b81c24966d0b48e441f08c.svg":{"logical_path":"flags/4x3/py.svg","mtime":"2020-04-06T16:47:40+02:00","size":17097,"digest":"22570d444732336f9af31307c5b4c5809d8c028319b81c24966d0b48e441f08c","integrity":"sha256-IlcNREcyM2+a8xMHxbTFgJ2MAoMZuBwklm0LSORB8Iw="},"flags/1x1/py-da5901ec6f8fa93f84e42140bd923592b84084a648569d76b476e7512e3620da.svg":{"logical_path":"flags/1x1/py.svg","mtime":"2020-04-06T16:47:40+02:00","size":17246,"digest":"da5901ec6f8fa93f84e42140bd923592b84084a648569d76b476e7512e3620da","integrity":"sha256-2lkB7G+PqT+E5CFAvZI1krhAhKZIVp12tHbnUS42INo="},"flags/4x3/qa-a5e58fc790b76e90b945a68bb4f15223254201bf006040d953092dee5ca8da31.svg":{"logical_path":"flags/4x3/qa.svg","mtime":"2020-04-06T16:47:40+02:00","size":359,"digest":"a5e58fc790b76e90b945a68bb4f15223254201bf006040d953092dee5ca8da31","integrity":"sha256-peWPx5C3bpC5RaaLtPFSIyVCAb8AYEDZUwkt7lyo2jE="},"flags/1x1/qa-ffa8cd4edd7ac169127363f8f0476ffe11279367334f1fa910320541a1a94505.svg":{"logical_path":"flags/1x1/qa.svg","mtime":"2020-04-06T16:47:40+02:00","size":356,"digest":"ffa8cd4edd7ac169127363f8f0476ffe11279367334f1fa910320541a1a94505","integrity":"sha256-/6jNTt16wWkSc2P48Edv/hEnk2czTx+pEDIFQaGpRQU="},"flags/4x3/re-5183af67c4fa08369e9251a2a102a4ed578c24bb59092dd92f3a572d90223434.svg":{"logical_path":"flags/4x3/re.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"5183af67c4fa08369e9251a2a102a4ed578c24bb59092dd92f3a572d90223434","integrity":"sha256-UYOvZ8T6CDaeklGioQKk7VeMJLtZCS3ZLzpXLZAiNDQ="},"flags/1x1/re-37be9dc3645dac4c1463068f9001cff31288ef527c2fca0d6432022858070084.svg":{"logical_path":"flags/1x1/re.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"37be9dc3645dac4c1463068f9001cff31288ef527c2fca0d6432022858070084","integrity":"sha256-N76dw2RdrEwUYwaPkAHP8xKI71J8L8oNZDICKFgHAIQ="},"flags/4x3/ro-854593a65b29383274aabe385c4ff58794a2b5d4b89c5414a0ff11f96d016f1e.svg":{"logical_path":"flags/4x3/ro.svg","mtime":"2020-04-06T16:47:40+02:00","size":305,"digest":"854593a65b29383274aabe385c4ff58794a2b5d4b89c5414a0ff11f96d016f1e","integrity":"sha256-hUWTplspODJ0qr44XE/1h5SitdS4nFQUoP8R+W0Bbx4="},"flags/1x1/ro-da9e0ce1ebd0f466ff68500173fe067212d304b8f4594f54bd61bd3e5409c7a9.svg":{"logical_path":"flags/1x1/ro.svg","mtime":"2020-04-06T16:47:40+02:00","size":305,"digest":"da9e0ce1ebd0f466ff68500173fe067212d304b8f4594f54bd61bd3e5409c7a9","integrity":"sha256-2p4M4evQ9Gb/aFABc/4GchLTBLj0WU9UvWG9PlQJx6k="},"flags/4x3/rs-cbb54d608b15e2bd4d422b8d83f061115c2087d070969b2e9f6112647569ce3a.svg":{"logical_path":"flags/4x3/rs.svg","mtime":"2020-04-06T16:47:40+02:00","size":187134,"digest":"cbb54d608b15e2bd4d422b8d83f061115c2087d070969b2e9f6112647569ce3a","integrity":"sha256-y7VNYIsV4r1NQiuNg/BhEVwgh9Bwlpsun2ESZHVpzjo="},"flags/1x1/rs-04c759a5129437dcc03dffb362199c84fc773a185726dc2ed09f9cfd41370fdb.svg":{"logical_path":"flags/1x1/rs.svg","mtime":"2020-04-06T16:47:40+02:00","size":186989,"digest":"04c759a5129437dcc03dffb362199c84fc773a185726dc2ed09f9cfd41370fdb","integrity":"sha256-BMdZpRKUN9zAPf+zYhmchPx3OhhXJtwu0J+c/UE3D9s="},"flags/4x3/ru-5b51b57f63cf58e451abddeaee39a8c7b133cb3d58c6ef1a903883bda7c346b0.svg":{"logical_path":"flags/4x3/ru.svg","mtime":"2020-04-06T16:47:40+02:00","size":286,"digest":"5b51b57f63cf58e451abddeaee39a8c7b133cb3d58c6ef1a903883bda7c346b0","integrity":"sha256-W1G1f2PPWORRq93q7jmox7Ezyz1Yxu8akDiDvafDRrA="},"flags/1x1/ru-bb2782a916b1a28eb081895afa90f4ed5dca5df320b9cc95f867bc2a26e29064.svg":{"logical_path":"flags/1x1/ru.svg","mtime":"2020-04-06T16:47:40+02:00","size":290,"digest":"bb2782a916b1a28eb081895afa90f4ed5dca5df320b9cc95f867bc2a26e29064","integrity":"sha256-uyeCqRaxoo6wgYla+pD07V3KXfMgucyV+Ge8KibikGQ="},"flags/4x3/rw-aeb9bc73cd3fe25e7c1a1a7bdddc11eb3d71a3273919dd2f4247873db78fbe75.svg":{"logical_path":"flags/4x3/rw.svg","mtime":"2020-04-06T16:47:40+02:00","size":747,"digest":"aeb9bc73cd3fe25e7c1a1a7bdddc11eb3d71a3273919dd2f4247873db78fbe75","integrity":"sha256-rrm8c80/4l58Ghp73dwR6z1xoyc5Gd0vQkeHPbePvnU="},"flags/1x1/rw-8c27cde746de68484394ef6dc519583cf67e380ca5e8d48cf37fa4d99fef57ed.svg":{"logical_path":"flags/1x1/rw.svg","mtime":"2020-04-06T16:47:40+02:00","size":748,"digest":"8c27cde746de68484394ef6dc519583cf67e380ca5e8d48cf37fa4d99fef57ed","integrity":"sha256-jCfN50beaEhDlO9txRlYPPZ+OAyl6NSM83+k2Z/vV+0="},"flags/4x3/sa-d54e76d7ad9da5242aa26d5dbec120b8a4530c097ae45d0b22e539f2d9c6ad8b.svg":{"logical_path":"flags/4x3/sa.svg","mtime":"2020-04-06T16:47:40+02:00","size":10238,"digest":"d54e76d7ad9da5242aa26d5dbec120b8a4530c097ae45d0b22e539f2d9c6ad8b","integrity":"sha256-1U52162dpSQqom1dvsEguKRTDAl65F0LIuU58tnGrYs="},"flags/1x1/sa-639ee1c158b0b61e8789bde27ae64edb246afe63cb8999e3468ca88c344927be.svg":{"logical_path":"flags/1x1/sa.svg","mtime":"2020-04-06T16:47:40+02:00","size":10179,"digest":"639ee1c158b0b61e8789bde27ae64edb246afe63cb8999e3468ca88c344927be","integrity":"sha256-Y57hwViwth6Hib3ieuZO2yRq/mPLiZnjRoyojDRJJ74="},"flags/4x3/sb-651213df067f16dbdba2288928434afdd54f192b50bf15d06206ade966d54bac.svg":{"logical_path":"flags/4x3/sb.svg","mtime":"2020-04-06T16:47:40+02:00","size":953,"digest":"651213df067f16dbdba2288928434afdd54f192b50bf15d06206ade966d54bac","integrity":"sha256-ZRIT3wZ/FtvboiiJKENK/dVPGStQvxXQYgat6WbVS6w="},"flags/1x1/sb-19048c26004da6fe2a1dd5f3f695066b24f3096d1527edbdaac03c2817046fe3.svg":{"logical_path":"flags/1x1/sb.svg","mtime":"2020-04-06T16:47:40+02:00","size":952,"digest":"19048c26004da6fe2a1dd5f3f695066b24f3096d1527edbdaac03c2817046fe3","integrity":"sha256-GQSMJgBNpv4qHdXz9pUGayTzCW0VJ+29qsA8KBcEb+M="},"flags/4x3/sc-2ed9272d5fd2fa92d29289f49f58f5f64f66977165fa1a80f9eb6aa57335517e.svg":{"logical_path":"flags/4x3/sc.svg","mtime":"2020-04-06T16:47:40+02:00","size":571,"digest":"2ed9272d5fd2fa92d29289f49f58f5f64f66977165fa1a80f9eb6aa57335517e","integrity":"sha256-LtknLV/S+pLSkon0n1j19k9ml3Fl+hqA+etqpXM1UX4="},"flags/1x1/sc-90424aafda9a2aa7d98030c0aa7bc604c77c1b0f7c5e6a094dffd2b803a88c71.svg":{"logical_path":"flags/1x1/sc.svg","mtime":"2020-04-06T16:47:40+02:00","size":570,"digest":"90424aafda9a2aa7d98030c0aa7bc604c77c1b0f7c5e6a094dffd2b803a88c71","integrity":"sha256-kEJKr9qaKqfZgDDAqnvGBMd8Gw98XmoJTf/SuAOojHE="},"flags/4x3/sd-b8b9d97103e668a2b043311b6453c2df25d5c3adcf62481e4c79a627c6784f4d.svg":{"logical_path":"flags/4x3/sd.svg","mtime":"2020-04-06T16:47:40+02:00","size":497,"digest":"b8b9d97103e668a2b043311b6453c2df25d5c3adcf62481e4c79a627c6784f4d","integrity":"sha256-uLnZcQPmaKKwQzEbZFPC3yXVw63PYkgeTHmmJ8Z4T00="},"flags/1x1/sd-da52cd7a173ecc0bc7e9a7c7ed4a20558a7f4cb5b6cd308790b7552a70421abc.svg":{"logical_path":"flags/1x1/sd.svg","mtime":"2020-04-06T16:47:40+02:00","size":493,"digest":"da52cd7a173ecc0bc7e9a7c7ed4a20558a7f4cb5b6cd308790b7552a70421abc","integrity":"sha256-2lLNehc+zAvH6afH7UogVYp/TLW2zTCHkLdVKnBCGrw="},"flags/4x3/se-7b5be8932db6e5153d1f11ddba2d36cb4a33ddd7100e5c59cef3a2502215b062.svg":{"logical_path":"flags/4x3/se.svg","mtime":"2020-04-06T16:47:40+02:00","size":691,"digest":"7b5be8932db6e5153d1f11ddba2d36cb4a33ddd7100e5c59cef3a2502215b062","integrity":"sha256-e1voky225RU9HxHdui02y0oz3dcQDlxZzvOiUCIVsGI="},"flags/1x1/se-9b0845f8163d147e4fce6e814709d5813e53f00f8f5ccb40cfa4cb9e37388837.svg":{"logical_path":"flags/1x1/se.svg","mtime":"2020-04-06T16:47:40+02:00","size":698,"digest":"9b0845f8163d147e4fce6e814709d5813e53f00f8f5ccb40cfa4cb9e37388837","integrity":"sha256-mwhF+BY9FH5Pzm6BRwnVgT5T8A+PXMtAz6TLnjc4iDc="},"flags/4x3/sg-fa164984f038fa81540d519c5d08123ed55f31bb8aa73798af7698c69dca2226.svg":{"logical_path":"flags/4x3/sg.svg","mtime":"2020-04-06T16:47:40+02:00","size":887,"digest":"fa164984f038fa81540d519c5d08123ed55f31bb8aa73798af7698c69dca2226","integrity":"sha256-+hZJhPA4+oFUDVGcXQgSPtVfMbuKpzeYr3aYxp3KIiY="},"flags/1x1/sg-f6f8ecdd6f0099c072886716d98098d08de334f6f307398e9922f4df40ef7b2a.svg":{"logical_path":"flags/1x1/sg.svg","mtime":"2020-04-06T16:47:40+02:00","size":948,"digest":"f6f8ecdd6f0099c072886716d98098d08de334f6f307398e9922f4df40ef7b2a","integrity":"sha256-9vjs3W8AmcByiGcW2YCY0I3jNPbzBzmOmSL030Dveyo="},"flags/4x3/sh-e7b5e4dc5360fd9ec2e0dd50074e82a53566a61ab88a36b6b5cc80451a2d9279.svg":{"logical_path":"flags/4x3/sh.svg","mtime":"2020-04-06T16:47:40+02:00","size":29501,"digest":"e7b5e4dc5360fd9ec2e0dd50074e82a53566a61ab88a36b6b5cc80451a2d9279","integrity":"sha256-57Xk3FNg/Z7C4N1QB06CpTVmphq4ija2tcyARRotknk="},"flags/1x1/sh-c3a061079dd7f5ea785a4b4a4903ec4cefc4a26cd73371c0bfa3a0b231593947.svg":{"logical_path":"flags/1x1/sh.svg","mtime":"2020-04-06T16:47:40+02:00","size":30113,"digest":"c3a061079dd7f5ea785a4b4a4903ec4cefc4a26cd73371c0bfa3a0b231593947","integrity":"sha256-w6BhB53X9ep4WktKSQPsTO/EomzXM3HAv6OgsjFZOUc="},"flags/4x3/si-25487f7aa91f115d558f031ffaf0d399924b032100d24d467c3bd1cb026d9001.svg":{"logical_path":"flags/4x3/si.svg","mtime":"2020-04-06T16:47:40+02:00","size":2053,"digest":"25487f7aa91f115d558f031ffaf0d399924b032100d24d467c3bd1cb026d9001","integrity":"sha256-JUh/eqkfEV1VjwMf+vDTmZJLAyEA0k1GfDvRywJtkAE="},"flags/1x1/si-53973e8d5c2086570023dbffbdef1a8a181cd49b33da4fde01de7a57b8346c57.svg":{"logical_path":"flags/1x1/si.svg","mtime":"2020-04-06T16:47:40+02:00","size":2065,"digest":"53973e8d5c2086570023dbffbdef1a8a181cd49b33da4fde01de7a57b8346c57","integrity":"sha256-U5c+jVwghlcAI9v/ve8aihgc1Jsz2k/eAd56V7g0bFc="},"flags/4x3/sj-e64bad4f257ee1219640dce3608270b8a4c7ebfc37f91ac9e4fa5957ea0814f5.svg":{"logical_path":"flags/4x3/sj.svg","mtime":"2020-04-06T16:47:40+02:00","size":321,"digest":"e64bad4f257ee1219640dce3608270b8a4c7ebfc37f91ac9e4fa5957ea0814f5","integrity":"sha256-5kutTyV+4SGWQNzjYIJwuKTH6/w3+RrJ5PpZV+oIFPU="},"flags/1x1/sj-d764d5de8ca4a67ea323376c7c4dc48a3ec51bb043556ee07dca9e4989ba147f.svg":{"logical_path":"flags/1x1/sj.svg","mtime":"2020-04-06T16:47:40+02:00","size":321,"digest":"d764d5de8ca4a67ea323376c7c4dc48a3ec51bb043556ee07dca9e4989ba147f","integrity":"sha256-12TV3oykpn6jIzdsfE3Eij7FG7BDVW7gfcqeSYm6FH8="},"flags/4x3/sk-4ca76c921fae3345c47f1f540cdaf3716a7807ffcba532caea50090c8bbecac2.svg":{"logical_path":"flags/4x3/sk.svg","mtime":"2020-04-06T16:47:40+02:00","size":1202,"digest":"4ca76c921fae3345c47f1f540cdaf3716a7807ffcba532caea50090c8bbecac2","integrity":"sha256-TKdskh+uM0XEfx9UDNrzcWp4B//LpTLK6lAJDIu+ysI="},"flags/1x1/sk-48d976a953d0778fced47cc5d25890f3dd7befc28a85d9bddfae6b50fa98c84b.svg":{"logical_path":"flags/1x1/sk.svg","mtime":"2020-04-06T16:47:40+02:00","size":1173,"digest":"48d976a953d0778fced47cc5d25890f3dd7befc28a85d9bddfae6b50fa98c84b","integrity":"sha256-SNl2qVPQd4/O1HzF0liQ891778KKhdm9365rUPqYyEs="},"flags/4x3/sl-d8106777ab26efc28f786a1345bd411a4a0a10da738b691e3f4deea96d3c3c3a.svg":{"logical_path":"flags/4x3/sl.svg","mtime":"2020-04-06T16:47:40+02:00","size":275,"digest":"d8106777ab26efc28f786a1345bd411a4a0a10da738b691e3f4deea96d3c3c3a","integrity":"sha256-2BBnd6sm78KPeGoTRb1BGkoKENpzi2keP03uqW08PDo="},"flags/1x1/sl-9b4b8d18e4921e812d1fc34279d9871d7b6d5a72feb8e451b4b4aed33890bee6.svg":{"logical_path":"flags/1x1/sl.svg","mtime":"2020-04-06T16:47:40+02:00","size":438,"digest":"9b4b8d18e4921e812d1fc34279d9871d7b6d5a72feb8e451b4b4aed33890bee6","integrity":"sha256-m0uNGOSSHoEtH8NCedmHHXttWnL+uORRtLSu0ziQvuY="},"flags/4x3/sm-d8ebb10444ef5bef482c0b886a617d832a62629887061d916f6e3af7ee49c01c.svg":{"logical_path":"flags/4x3/sm.svg","mtime":"2020-04-06T16:47:40+02:00","size":15801,"digest":"d8ebb10444ef5bef482c0b886a617d832a62629887061d916f6e3af7ee49c01c","integrity":"sha256-2OuxBETvW+9ILAuIamF9gypiYpiHBh2Rb2469+5JwBw="},"flags/1x1/sm-2cc3fc6d4667654a4842dba27cbd3fd6cb9e8f23ad1dc1fe78cbd9621b5e7d8d.svg":{"logical_path":"flags/1x1/sm.svg","mtime":"2020-04-06T16:47:40+02:00","size":15729,"digest":"2cc3fc6d4667654a4842dba27cbd3fd6cb9e8f23ad1dc1fe78cbd9621b5e7d8d","integrity":"sha256-LMP8bUZnZUpIQtuifL0/1suejyOtHcH+eMvZYhtefY0="},"flags/4x3/sn-e8f288fc52101ac915f7321dffce4c0af0a830244791f63efea069cbbc311ffa.svg":{"logical_path":"flags/4x3/sn.svg","mtime":"2020-04-06T16:47:40+02:00","size":424,"digest":"e8f288fc52101ac915f7321dffce4c0af0a830244791f63efea069cbbc311ffa","integrity":"sha256-6PKI/FIQGskV9zId/85MCvCoMCRHkfY+/qBpy7wxH/o="},"flags/1x1/sn-1e2477f3991b0329067f700db10898bc0761c241ecdbe5cf3c0a79998ee86748.svg":{"logical_path":"flags/1x1/sn.svg","mtime":"2020-04-06T16:47:40+02:00","size":414,"digest":"1e2477f3991b0329067f700db10898bc0761c241ecdbe5cf3c0a79998ee86748","integrity":"sha256-HiR385kbAykGf3ANsQiYvAdhwkHs2+XPPAp5mY7oZ0g="},"flags/4x3/so-50c5153e92331af5eb0bcda9b17ed8ded87f69f94803d50315514c8d95f241dd.svg":{"logical_path":"flags/4x3/so.svg","mtime":"2020-04-06T16:47:40+02:00","size":497,"digest":"50c5153e92331af5eb0bcda9b17ed8ded87f69f94803d50315514c8d95f241dd","integrity":"sha256-UMUVPpIzGvXrC82psX7Y3th/aflIA9UDFVFMjZXyQd0="},"flags/1x1/so-74f68a5972d287abb010860d78e9ea8158499c1187e9f30a533f14f62395aff3.svg":{"logical_path":"flags/1x1/so.svg","mtime":"2020-04-06T16:47:40+02:00","size":498,"digest":"74f68a5972d287abb010860d78e9ea8158499c1187e9f30a533f14f62395aff3","integrity":"sha256-dPaKWXLSh6uwEIYNeOnqgVhJnBGH6fMKUz8U9iOVr/M="},"flags/4x3/sr-04f64ba6540237ec9188f9f776ea8e300ab8da9e69b0987c7f84d57e485d03fa.svg":{"logical_path":"flags/4x3/sr.svg","mtime":"2020-04-06T16:47:40+02:00","size":315,"digest":"04f64ba6540237ec9188f9f776ea8e300ab8da9e69b0987c7f84d57e485d03fa","integrity":"sha256-BPZLplQCN+yRiPn3duqOMAq42p5psJh8f4TVfkhdA/o="},"flags/1x1/sr-e146a0ccedd75c58f6bbc1684b42662e295617bbad9fa96086b3ef3e6afe2278.svg":{"logical_path":"flags/1x1/sr.svg","mtime":"2020-04-06T16:47:40+02:00","size":320,"digest":"e146a0ccedd75c58f6bbc1684b42662e295617bbad9fa96086b3ef3e6afe2278","integrity":"sha256-4UagzO3XXFj2u8FoS0JmLilWF7utn6lghrPvPmr+Ing="},"flags/4x3/ss-d0545941635094a4083da0238fec28147c845f146e122c745d0977bd0c9433d6.svg":{"logical_path":"flags/4x3/ss.svg","mtime":"2020-04-06T16:47:40+02:00","size":386,"digest":"d0545941635094a4083da0238fec28147c845f146e122c745d0977bd0c9433d6","integrity":"sha256-0FRZQWNQlKQIPaAjj+woFHyEXxRuEix0XQl3vQyUM9Y="},"flags/1x1/ss-15466776e5a57ff54c2fba7cb590cd7f27298d38cbf2c1ddcde63a81d8e9c102.svg":{"logical_path":"flags/1x1/ss.svg","mtime":"2020-04-06T16:47:40+02:00","size":397,"digest":"15466776e5a57ff54c2fba7cb590cd7f27298d38cbf2c1ddcde63a81d8e9c102","integrity":"sha256-FUZnduWlf/VML7p8tZDNfycpjTjL8sHdzeY6gdjpwQI="},"flags/4x3/st-ebb813a81f4959663ce7a00f33acb9513cb0aeaacc6e6b42becf3964114b97a1.svg":{"logical_path":"flags/4x3/st.svg","mtime":"2020-04-06T16:47:40+02:00","size":916,"digest":"ebb813a81f4959663ce7a00f33acb9513cb0aeaacc6e6b42becf3964114b97a1","integrity":"sha256-67gTqB9JWWY856APM6y5UTywrqrMbmtCvs85ZBFLl6E="},"flags/1x1/st-a866043ab37ce805b64abec78b95b6c083271c13e8e1ec7ca96449410578e89d.svg":{"logical_path":"flags/1x1/st.svg","mtime":"2020-04-06T16:47:40+02:00","size":920,"digest":"a866043ab37ce805b64abec78b95b6c083271c13e8e1ec7ca96449410578e89d","integrity":"sha256-qGYEOrN86AW2Sr7Hi5W2wIMnHBPo4ex8qWRJQQV46J0="},"flags/4x3/sv-4a2c02ae1c8fa104bdf722d8040868f47d1159fc774e32082e7fd1516c0c8e6d.svg":{"logical_path":"flags/4x3/sv.svg","mtime":"2020-04-06T16:47:40+02:00","size":82697,"digest":"4a2c02ae1c8fa104bdf722d8040868f47d1159fc774e32082e7fd1516c0c8e6d","integrity":"sha256-SiwCrhyPoQS99yLYBAho9H0RWfx3TjIILn/RUWwMjm0="},"flags/1x1/sv-ece5f580bf1a30a24794f29e85b851709f2ff7adc3b8d5a88634b5df5a73533e.svg":{"logical_path":"flags/1x1/sv.svg","mtime":"2020-04-06T16:47:40+02:00","size":83238,"digest":"ece5f580bf1a30a24794f29e85b851709f2ff7adc3b8d5a88634b5df5a73533e","integrity":"sha256-7OX1gL8aMKJHlPKehbhRcJ8v963DuNWohjS131pzUz4="},"flags/4x3/sx-aa8a47e9aa8b9ba218c6875d2435df72740ab4c0b924869286b4cadb1365d49c.svg":{"logical_path":"flags/4x3/sx.svg","mtime":"2020-04-06T16:47:40+02:00","size":13209,"digest":"aa8a47e9aa8b9ba218c6875d2435df72740ab4c0b924869286b4cadb1365d49c","integrity":"sha256-qopH6aqLm6IYxoddJDXfcnQKtMC5JIaShrTK2xNl1Jw="},"flags/1x1/sx-ac716ddb83c8e34353666b6102c03688503eb97ae55ca9aeeb86c4e954ae8b06.svg":{"logical_path":"flags/1x1/sx.svg","mtime":"2020-04-06T16:47:40+02:00","size":12992,"digest":"ac716ddb83c8e34353666b6102c03688503eb97ae55ca9aeeb86c4e954ae8b06","integrity":"sha256-rHFt24PI40NTZmthAsA2iFA+uXrlXKmu64bE6VSuiwY="},"flags/4x3/sy-3b78773e392f046fb9b3f83bc34ce38515f72320c575d93c41c95d90ffb5d039.svg":{"logical_path":"flags/4x3/sy.svg","mtime":"2020-04-06T16:47:40+02:00","size":565,"digest":"3b78773e392f046fb9b3f83bc34ce38515f72320c575d93c41c95d90ffb5d039","integrity":"sha256-O3h3PjkvBG+5s/g7w0zjhRX3IyDFddk8QcldkP+10Dk="},"flags/1x1/sy-fdec8ea00a33abe5dfade7864c28d9ad713c3cda3e7d828ff699647da3e74446.svg":{"logical_path":"flags/1x1/sy.svg","mtime":"2020-04-06T16:47:40+02:00","size":579,"digest":"fdec8ea00a33abe5dfade7864c28d9ad713c3cda3e7d828ff699647da3e74446","integrity":"sha256-/eyOoAozq+XfreeGTCjZrXE8PNo+fYKP9plkfaPnREY="},"flags/4x3/sz-57cefe0c71e90edba3c03594a69a3a9a33f779c0c2405efaedb8d64290e28d1f.svg":{"logical_path":"flags/4x3/sz.svg","mtime":"2020-04-06T16:47:40+02:00","size":6742,"digest":"57cefe0c71e90edba3c03594a69a3a9a33f779c0c2405efaedb8d64290e28d1f","integrity":"sha256-V87+DHHpDtujwDWUppo6mjP3ecDCQF767bjWQpDijR8="},"flags/1x1/sz-ad977a6b06f85ee23b3ea5ec49f83363720525a3fd37475ef79cb59591c32951.svg":{"logical_path":"flags/1x1/sz.svg","mtime":"2020-04-06T16:47:40+02:00","size":6689,"digest":"ad977a6b06f85ee23b3ea5ec49f83363720525a3fd37475ef79cb59591c32951","integrity":"sha256-rZd6awb4XuI7PqXsSfgzY3IFJaP9N0de95y1lZHDKVE="},"flags/4x3/tc-c3e7a86e64d439e6b25dc833f685cd5461e9c5ce33d0f004f3570adfba65c9bc.svg":{"logical_path":"flags/4x3/tc.svg","mtime":"2020-04-06T16:47:40+02:00","size":14497,"digest":"c3e7a86e64d439e6b25dc833f685cd5461e9c5ce33d0f004f3570adfba65c9bc","integrity":"sha256-w+eobmTUOeayXcgz9oXNVGHpxc4z0PAE81cK37plybw="},"flags/1x1/tc-d91ac6bce029f8aa5b760be2a62884b67e03180eb9a9c67ae6066df67c85154c.svg":{"logical_path":"flags/1x1/tc.svg","mtime":"2020-04-06T16:47:40+02:00","size":14756,"digest":"d91ac6bce029f8aa5b760be2a62884b67e03180eb9a9c67ae6066df67c85154c","integrity":"sha256-2RrGvOAp+KpbdgvipiiEtn4DGA65qcZ65gZt9nyFFUw="},"flags/4x3/td-b6ce40aff60feef4e8fe1417f075b57688b5cc4c32d09296d02776a797e0b0d3.svg":{"logical_path":"flags/4x3/td.svg","mtime":"2020-04-06T16:47:40+02:00","size":267,"digest":"b6ce40aff60feef4e8fe1417f075b57688b5cc4c32d09296d02776a797e0b0d3","integrity":"sha256-ts5Ar/YP7vTo/hQX8HW1doi1zEwy0JKW0Cd2p5fgsNM="},"flags/1x1/td-ef115b3942ae5cb74b046b0a5faad35fbd6126d8c6fda489881b16494c8c632c.svg":{"logical_path":"flags/1x1/td.svg","mtime":"2020-04-06T16:47:40+02:00","size":279,"digest":"ef115b3942ae5cb74b046b0a5faad35fbd6126d8c6fda489881b16494c8c632c","integrity":"sha256-7xFbOUKuXLdLBGsKX6rTX71hJtjG/aSJiBsWSUyMYyw="},"flags/4x3/tf-0681ec54dffc4f628efd8b4726fc3f00c628aab4fb0c797c332c80a25d559820.svg":{"logical_path":"flags/4x3/tf.svg","mtime":"2020-04-06T16:47:40+02:00","size":1088,"digest":"0681ec54dffc4f628efd8b4726fc3f00c628aab4fb0c797c332c80a25d559820","integrity":"sha256-BoHsVN/8T2KO/YtHJvw/AMYoqrT7DHl8MyyAol1VmCA="},"flags/1x1/tf-90ad184cfd769cdda3da9c43b4fb5a494962f3095f38f4175ce37c371e0180d6.svg":{"logical_path":"flags/1x1/tf.svg","mtime":"2020-04-06T16:47:40+02:00","size":1196,"digest":"90ad184cfd769cdda3da9c43b4fb5a494962f3095f38f4175ce37c371e0180d6","integrity":"sha256-kK0YTP12nN2j2pxDtPtaSUli8wlfOPQXXON8Nx4BgNY="},"flags/4x3/tg-486dca2420c797d9a37b03d11767c9418b5e26d07c7c694d897b7d85092ea499.svg":{"logical_path":"flags/4x3/tg.svg","mtime":"2020-04-06T16:47:40+02:00","size":728,"digest":"486dca2420c797d9a37b03d11767c9418b5e26d07c7c694d897b7d85092ea499","integrity":"sha256-SG3KJCDHl9mjewPRF2fJQYteJtB8fGlNiXt9hQkupJk="},"flags/1x1/tg-830f49a57206bf654bc37aaa1668ee8840a23595b2ed440c968f81d961e820ad.svg":{"logical_path":"flags/1x1/tg.svg","mtime":"2020-04-06T16:47:40+02:00","size":733,"digest":"830f49a57206bf654bc37aaa1668ee8840a23595b2ed440c968f81d961e820ad","integrity":"sha256-gw9JpXIGv2VLw3qqFmjuiECiNZWy7UQMlo+B2WHoIK0="},"flags/4x3/th-4e206b563d27b5a7a3f7cabf944d6d278e6e8640018a72ce7b7ff989f1396df9.svg":{"logical_path":"flags/4x3/th.svg","mtime":"2020-04-06T16:47:40+02:00","size":287,"digest":"4e206b563d27b5a7a3f7cabf944d6d278e6e8640018a72ce7b7ff989f1396df9","integrity":"sha256-TiBrVj0ntaej98q/lE1tJ45uhkABinLOe3/5ifE5bfk="},"flags/1x1/th-cb480908e2c394e816623b7fcd5b63b484f25578fd89905d6aa1453bcd041887.svg":{"logical_path":"flags/1x1/th.svg","mtime":"2020-04-06T16:47:40+02:00","size":288,"digest":"cb480908e2c394e816623b7fcd5b63b484f25578fd89905d6aa1453bcd041887","integrity":"sha256-y0gJCOLDlOgWYjt/zVtjtITyVXj9iZBdaqFFO80EGIc="},"flags/4x3/tj-1a8979f03a820cec54ff4a900e843afee074f3b4004e1aeeb706caaea0379ffe.svg":{"logical_path":"flags/4x3/tj.svg","mtime":"2020-04-06T16:47:40+02:00","size":1812,"digest":"1a8979f03a820cec54ff4a900e843afee074f3b4004e1aeeb706caaea0379ffe","integrity":"sha256-Gol58DqCDOxU/0qQDoQ6/uB087QAThrutwbKrqA3n/4="},"flags/1x1/tj-a133d52c99a285aa2dd0b86739163bd5bb7a2c0eaa5a1fd522a11ec4b5b3bece.svg":{"logical_path":"flags/1x1/tj.svg","mtime":"2020-04-06T16:47:40+02:00","size":1767,"digest":"a133d52c99a285aa2dd0b86739163bd5bb7a2c0eaa5a1fd522a11ec4b5b3bece","integrity":"sha256-oTPVLJmihaot0LhnORY71bt6LA6qWh/VIqEexLWzvs4="},"flags/4x3/tk-3e49a632d5d87de3ef67aca8faa159c1b69bc16669f6c8c117748dc9625d1c58.svg":{"logical_path":"flags/4x3/tk.svg","mtime":"2020-04-06T16:47:40+02:00","size":788,"digest":"3e49a632d5d87de3ef67aca8faa159c1b69bc16669f6c8c117748dc9625d1c58","integrity":"sha256-PkmmMtXYfePvZ6yo+qFZwbabwWZp9sjBF3SNyWJdHFg="},"flags/1x1/tk-137c7ebb28233cdc2f417bc1e29bfad502ef7dd404c35ac36188e7dd98aecb6d.svg":{"logical_path":"flags/1x1/tk.svg","mtime":"2020-04-06T16:47:40+02:00","size":778,"digest":"137c7ebb28233cdc2f417bc1e29bfad502ef7dd404c35ac36188e7dd98aecb6d","integrity":"sha256-E3x+uygjPNwvQXvB4pv61QLvfdQEw1rDYYjn3Ziuy20="},"flags/4x3/tl-8662a8d01007fcbe0f41a694a5cd927265409d59b783b50e0bf4561302a77e40.svg":{"logical_path":"flags/4x3/tl.svg","mtime":"2020-04-06T16:47:40+02:00","size":603,"digest":"8662a8d01007fcbe0f41a694a5cd927265409d59b783b50e0bf4561302a77e40","integrity":"sha256-hmKo0BAH/L4PQaaUpc2ScmVAnVm3g7UOC/RWEwKnfkA="},"flags/1x1/tl-d26071ddf754d77ea56779d817e8c62f37a38fa64102e0c864901ff3941cffbf.svg":{"logical_path":"flags/1x1/tl.svg","mtime":"2020-04-06T16:47:40+02:00","size":577,"digest":"d26071ddf754d77ea56779d817e8c62f37a38fa64102e0c864901ff3941cffbf","integrity":"sha256-0mBx3fdU136lZ3nYF+jGLzejj6ZBAuDIZJAf85Qc/78="},"flags/4x3/tm-22b811ff90642de341a3e28a1775d1992d1f32088e922abddafca79157e3c2ec.svg":{"logical_path":"flags/4x3/tm.svg","mtime":"2020-04-06T16:47:40+02:00","size":32287,"digest":"22b811ff90642de341a3e28a1775d1992d1f32088e922abddafca79157e3c2ec","integrity":"sha256-IrgR/5BkLeNBo+KKF3XRmS0fMgiOkiq92vynkVfjwuw="},"flags/1x1/tm-42c8536f18d9a9878a90872649f0ec85b27ba59e1942ca5ac619f2f2f993aa38.svg":{"logical_path":"flags/1x1/tm.svg","mtime":"2020-04-06T16:47:40+02:00","size":31566,"digest":"42c8536f18d9a9878a90872649f0ec85b27ba59e1942ca5ac619f2f2f993aa38","integrity":"sha256-QshTbxjZqYeKkIcmSfDshbJ7pZ4ZQspaxhny8vmTqjg="},"flags/4x3/tn-5d05bcd60eb3118eae45baf24be63aab68e236ec6d19124eed90548f1ec42bd5.svg":{"logical_path":"flags/4x3/tn.svg","mtime":"2020-04-06T16:47:40+02:00","size":751,"digest":"5d05bcd60eb3118eae45baf24be63aab68e236ec6d19124eed90548f1ec42bd5","integrity":"sha256-XQW81g6zEY6uRbryS+Y6q2jiNuxtGRJO7ZBUjx7EK9U="},"flags/1x1/tn-84116fb50ddb30d2f08991ae4e3762d7191fe4387e1cf05d55a4e3f2e95c3c57.svg":{"logical_path":"flags/1x1/tn.svg","mtime":"2020-04-06T16:47:40+02:00","size":733,"digest":"84116fb50ddb30d2f08991ae4e3762d7191fe4387e1cf05d55a4e3f2e95c3c57","integrity":"sha256-hBFvtQ3bMNLwiZGuTjdi1xkf5Dh+HPBdVaTj8ulcPFc="},"flags/4x3/to-a2007667f47550dd1a6db5e83911fcc0acdf00909db626d592a9390c4e8aa1fa.svg":{"logical_path":"flags/4x3/to.svg","mtime":"2020-04-06T16:47:40+02:00","size":355,"digest":"a2007667f47550dd1a6db5e83911fcc0acdf00909db626d592a9390c4e8aa1fa","integrity":"sha256-ogB2Z/R1UN0abbXoORH8wKzfAJCdtibVkqk5DE6Kofo="},"flags/1x1/to-5e87ab54fa5f3124d1fc521d29259865fdd1f528e968dad12a33aff22ff788f2.svg":{"logical_path":"flags/1x1/to.svg","mtime":"2020-04-06T16:47:40+02:00","size":361,"digest":"5e87ab54fa5f3124d1fc521d29259865fdd1f528e968dad12a33aff22ff788f2","integrity":"sha256-XoerVPpfMSTR/FIdKSWYZf3R9SjpaNrRKjOv8i/3iPI="},"flags/4x3/tr-033a416ecc30a516c54c6a0fac2d212a38fb051e5976cda49eb9d22264814a66.svg":{"logical_path":"flags/4x3/tr.svg","mtime":"2020-04-06T16:47:40+02:00","size":554,"digest":"033a416ecc30a516c54c6a0fac2d212a38fb051e5976cda49eb9d22264814a66","integrity":"sha256-AzpBbswwpRbFTGoPrC0hKjj7BR5Zds2knrnSImSBSmY="},"flags/1x1/tr-74e60d09369c164cc245d49d109c78ea322a117e0fe58945c380b65a71c691ae.svg":{"logical_path":"flags/1x1/tr.svg","mtime":"2020-04-06T16:47:40+02:00","size":575,"digest":"74e60d09369c164cc245d49d109c78ea322a117e0fe58945c380b65a71c691ae","integrity":"sha256-dOYNCTacFkzCRdSdEJx46jIqEX4P5YlFw4C2WnHGka4="},"flags/4x3/tt-f6ac88577c57d12df95251c21a7adb68ced1720731d754a462d2958879b56e00.svg":{"logical_path":"flags/4x3/tt.svg","mtime":"2020-04-06T16:47:40+02:00","size":315,"digest":"f6ac88577c57d12df95251c21a7adb68ced1720731d754a462d2958879b56e00","integrity":"sha256-9qyIV3xX0S35UlHCGnrbaM7Rcgcx11SkYtKViHm1bgA="},"flags/1x1/tt-3d65dcbca5b7d40a1730e1c190d0c7e2874d1b3b44e0a0941ec033056044f3de.svg":{"logical_path":"flags/1x1/tt.svg","mtime":"2020-04-06T16:47:40+02:00","size":320,"digest":"3d65dcbca5b7d40a1730e1c190d0c7e2874d1b3b44e0a0941ec033056044f3de","integrity":"sha256-PWXcvKW31AoXMOHBkNDH4odNGztE4KCUHsAzBWBE894="},"flags/4x3/tv-6017cefb02fcc099faa8f072149bbce7f8c155ad6ffa620a6d6258409b786ce4.svg":{"logical_path":"flags/4x3/tv.svg","mtime":"2020-04-06T16:47:40+02:00","size":1783,"digest":"6017cefb02fcc099faa8f072149bbce7f8c155ad6ffa620a6d6258409b786ce4","integrity":"sha256-YBfO+wL8wJn6qPByFJu85/jBVa1v+mIKbWJYQJt4bOQ="},"flags/1x1/tv-add42a023b56a92f42007afb933e28e1d08d734e55ccecbfc3f9fae70701a240.svg":{"logical_path":"flags/1x1/tv.svg","mtime":"2020-04-06T16:47:40+02:00","size":1716,"digest":"add42a023b56a92f42007afb933e28e1d08d734e55ccecbfc3f9fae70701a240","integrity":"sha256-rdQqAjtWqS9CAHr7kz4o4dCNc05VzOy/w/n65wcBokA="},"flags/4x3/tw-44b7d1f3acc75aa8ff817b55d499dcb24770a3423b624bff829cb26729de7c16.svg":{"logical_path":"flags/4x3/tw.svg","mtime":"2020-04-06T16:47:40+02:00","size":945,"digest":"44b7d1f3acc75aa8ff817b55d499dcb24770a3423b624bff829cb26729de7c16","integrity":"sha256-RLfR86zHWqj/gXtV1Jncskdwo0I7Ykv/gpyyZynefBY="},"flags/1x1/tw-06af22c30adfccca9975a99fd05310568de59f039a14fd8dbabab7c17a33cb19.svg":{"logical_path":"flags/1x1/tw.svg","mtime":"2020-04-06T16:47:40+02:00","size":954,"digest":"06af22c30adfccca9975a99fd05310568de59f039a14fd8dbabab7c17a33cb19","integrity":"sha256-Bq8iwwrfzMqZdamf0FMQVo3lnwOaFP2Nurq3wXozyxk="},"flags/4x3/tz-1d5e7fb7a12497358a19b92671184b14664125a143d909abbee5615b57f7e988.svg":{"logical_path":"flags/4x3/tz.svg","mtime":"2020-04-06T16:47:40+02:00","size":549,"digest":"1d5e7fb7a12497358a19b92671184b14664125a143d909abbee5615b57f7e988","integrity":"sha256-HV5/t6EklzWKGbkmcRhLFGZBJaFD2QmrvuVhW1f36Yg="},"flags/1x1/tz-ad4c35de9f6aec57aac272de390d5730a75aa7e1a4431166a5dcea3bcbdc62f2.svg":{"logical_path":"flags/1x1/tz.svg","mtime":"2020-04-06T16:47:40+02:00","size":602,"digest":"ad4c35de9f6aec57aac272de390d5730a75aa7e1a4431166a5dcea3bcbdc62f2","integrity":"sha256-rUw13p9q7FeqwnLeOQ1XMKdap+GkQxFmpdzqO8vcYvI="},"flags/4x3/ua-fbbf0f0e9a6d6187561f38af9b3f28e3125e406c3deea268bcb64dac7a03a6aa.svg":{"logical_path":"flags/4x3/ua.svg","mtime":"2020-04-06T16:47:40+02:00","size":238,"digest":"fbbf0f0e9a6d6187561f38af9b3f28e3125e406c3deea268bcb64dac7a03a6aa","integrity":"sha256-+78PDpptYYdWHzivmz8o4xJeQGw97qJovLZNrHoDpqo="},"flags/1x1/ua-79092de6d22db0454898a7d17f26961709256110620e67933043799fa86b2296.svg":{"logical_path":"flags/1x1/ua.svg","mtime":"2020-04-06T16:47:40+02:00","size":238,"digest":"79092de6d22db0454898a7d17f26961709256110620e67933043799fa86b2296","integrity":"sha256-eQkt5tItsEVImKfRfyaWFwklYRBiDmeTMEN5n6hrIpY="},"flags/4x3/ug-001fa554127aafd736752727490db9f8893164c0369d0ba5cb6d742c44370975.svg":{"logical_path":"flags/4x3/ug.svg","mtime":"2020-04-06T16:47:40+02:00","size":3951,"digest":"001fa554127aafd736752727490db9f8893164c0369d0ba5cb6d742c44370975","integrity":"sha256-AB+lVBJ6r9c2dScnSQ25+IkxZMA2nQuly210LEQ3CXU="},"flags/1x1/ug-59bc76deefd22802e7d4ab2bd5e34f59c6bc112135c8052284410a0787954af9.svg":{"logical_path":"flags/1x1/ug.svg","mtime":"2020-04-06T16:47:40+02:00","size":4024,"digest":"59bc76deefd22802e7d4ab2bd5e34f59c6bc112135c8052284410a0787954af9","integrity":"sha256-Wbx23u/SKALn1Ksr1eNPWca8ESE1yAUihEEKB4eVSvk="},"flags/4x3/um-d2e8ac2079a27fb6f120ab4bc4d29597450bd01a9fedf9b7f5a09ad65e8dd164.svg":{"logical_path":"flags/4x3/um.svg","mtime":"2020-04-06T16:47:40+02:00","size":4523,"digest":"d2e8ac2079a27fb6f120ab4bc4d29597450bd01a9fedf9b7f5a09ad65e8dd164","integrity":"sha256-0uisIHmif7bxIKtLxNKVl0UL0Bqf7fm39aCa1l6N0WQ="},"flags/1x1/um-9674c82888b92fbbba22f3588e7d83e8c0ce887d9ccdf3abac317f9725530ab5.svg":{"logical_path":"flags/1x1/um.svg","mtime":"2020-04-06T16:47:40+02:00","size":3972,"digest":"9674c82888b92fbbba22f3588e7d83e8c0ce887d9ccdf3abac317f9725530ab5","integrity":"sha256-lnTIKIi5L7u6IvNYjn2D6MDOiH2czfOrrDF/lyVTCrU="},"flags/4x3/us-c70ba1cb67cc649da2b1f5dc4a26891437d8bba2cc098c88461e6bfc23949d9e.svg":{"logical_path":"flags/4x3/us.svg","mtime":"2020-04-06T16:47:40+02:00","size":4461,"digest":"c70ba1cb67cc649da2b1f5dc4a26891437d8bba2cc098c88461e6bfc23949d9e","integrity":"sha256-xwuhy2fMZJ2isfXcSiaJFDfYu6LMCYyIRh5r/COUnZ4="},"flags/1x1/us-c4ffd0455cf50bc1683646dc77e7263d81cffad51f36d3c39b85a9848fb5a196.svg":{"logical_path":"flags/1x1/us.svg","mtime":"2020-04-06T16:47:40+02:00","size":3921,"digest":"c4ffd0455cf50bc1683646dc77e7263d81cffad51f36d3c39b85a9848fb5a196","integrity":"sha256-xP/QRVz1C8FoNkbcd+cmPYHP+tUfNtPDm4WphI+1oZY="},"flags/4x3/uy-25c640333545843d345dbda694ca41c404dcaa69d3e32fbebc89d5620b5b881a.svg":{"logical_path":"flags/4x3/uy.svg","mtime":"2020-04-06T16:47:40+02:00","size":1718,"digest":"25c640333545843d345dbda694ca41c404dcaa69d3e32fbebc89d5620b5b881a","integrity":"sha256-JcZAMzVFhD00Xb2mlMpBxATcqmnT4y++vInVYgtbiBo="},"flags/1x1/uy-4466c6f09de93905872fe47bfc03c6e5a143cbf77cdfc93fcd450663572f3d60.svg":{"logical_path":"flags/1x1/uy.svg","mtime":"2020-04-06T16:47:40+02:00","size":1715,"digest":"4466c6f09de93905872fe47bfc03c6e5a143cbf77cdfc93fcd450663572f3d60","integrity":"sha256-RGbG8J3pOQWHL+R7/APG5aFDy/d838k/zUUGY1cvPWA="},"flags/4x3/uz-76a3658f5f45def0750a70247d604356ff4eba996b30aa23a657ac07044caed4.svg":{"logical_path":"flags/4x3/uz.svg","mtime":"2020-04-06T16:47:40+02:00","size":1454,"digest":"76a3658f5f45def0750a70247d604356ff4eba996b30aa23a657ac07044caed4","integrity":"sha256-dqNlj19F3vB1CnAkfWBDVv9OuplrMKojplesBwRMrtQ="},"flags/1x1/uz-96eba693faa2439ebee48d27072a67086b7be80001ec8c5e3f0743b37f2a42a1.svg":{"logical_path":"flags/1x1/uz.svg","mtime":"2020-04-06T16:47:40+02:00","size":1454,"digest":"96eba693faa2439ebee48d27072a67086b7be80001ec8c5e3f0743b37f2a42a1","integrity":"sha256-luumk/qiQ56+5I0nBypnCGt76AAB7IxePwdDs38qQqE="},"flags/4x3/va-89b12d71ce8ea74250d99da84ad4417c53eab133e4be8db99e6b8e0b26f71278.svg":{"logical_path":"flags/4x3/va.svg","mtime":"2020-04-06T16:47:40+02:00","size":91076,"digest":"89b12d71ce8ea74250d99da84ad4417c53eab133e4be8db99e6b8e0b26f71278","integrity":"sha256-ibEtcc6Op0JQ2Z2oStRBfFPqsTPkvo25nmuOCyb3Eng="},"flags/1x1/va-bcc69d5aaddda710e0c480c64f1ad9730ba45edd4692684fcca1c4f8083c5d19.svg":{"logical_path":"flags/1x1/va.svg","mtime":"2020-04-06T16:47:40+02:00","size":90711,"digest":"bcc69d5aaddda710e0c480c64f1ad9730ba45edd4692684fcca1c4f8083c5d19","integrity":"sha256-vMadWq3dpxDgxIDGTxrZcwukXt1GkmhPzKHE+Ag8XRk="},"flags/4x3/vc-55b7f903c7e603de7eec36bca0760a51930ae7ba90c2e758fcf3aa4d7e959ee5.svg":{"logical_path":"flags/4x3/vc.svg","mtime":"2020-04-06T16:47:40+02:00","size":451,"digest":"55b7f903c7e603de7eec36bca0760a51930ae7ba90c2e758fcf3aa4d7e959ee5","integrity":"sha256-Vbf5A8fmA95+7Da8oHYKUZMK57qQwudY/POqTX6VnuU="},"flags/1x1/vc-3be977d9f161a5800728de845aa7632df3263927fea4b03544400755d27e7c19.svg":{"logical_path":"flags/1x1/vc.svg","mtime":"2020-04-06T16:47:40+02:00","size":498,"digest":"3be977d9f161a5800728de845aa7632df3263927fea4b03544400755d27e7c19","integrity":"sha256-O+l32fFhpYAHKN6EWqdjLfMmOSf+pLA1REAHVdJ+fBk="},"flags/4x3/ve-3079fd19521114a5585b23e37a3d443676b52fd593b68bae5026c29de0bf5561.svg":{"logical_path":"flags/4x3/ve.svg","mtime":"2020-04-06T16:47:40+02:00","size":1168,"digest":"3079fd19521114a5585b23e37a3d443676b52fd593b68bae5026c29de0bf5561","integrity":"sha256-MHn9GVIRFKVYWyPjej1ENna1L9WTtouuUCbCneC/VWE="},"flags/1x1/ve-2fe0f692a6986f2b21ebd6260b6750b29a0487b9486e70fcf789e113ad0e1192.svg":{"logical_path":"flags/1x1/ve.svg","mtime":"2020-04-06T16:47:40+02:00","size":1188,"digest":"2fe0f692a6986f2b21ebd6260b6750b29a0487b9486e70fcf789e113ad0e1192","integrity":"sha256-L+D2kqaYbysh69YmC2dQspoEh7lIbnD894nhE60OEZI="},"flags/4x3/vg-509967cefab0422e7e4162aa75d3cede7620a4a17d9b2015adfa74e84051f364.svg":{"logical_path":"flags/4x3/vg.svg","mtime":"2020-04-06T16:47:40+02:00","size":24640,"digest":"509967cefab0422e7e4162aa75d3cede7620a4a17d9b2015adfa74e84051f364","integrity":"sha256-UJlnzvqwQi5+QWKqddPO3nYgpKF9myAVrfp06EBR82Q="},"flags/1x1/vg-caec07f09c87f0ebd2843dedf7e8fd5ebe3ed795b2649c648788775c65f48b31.svg":{"logical_path":"flags/1x1/vg.svg","mtime":"2020-04-06T16:47:40+02:00","size":24814,"digest":"caec07f09c87f0ebd2843dedf7e8fd5ebe3ed795b2649c648788775c65f48b31","integrity":"sha256-yuwH8JyH8OvShD3t9+j9Xr4+15WyZJxkh4h3XGX0izE="},"flags/4x3/vi-0c1811861e17033d8d2ee291edb8b710dc877fbec06ab4e4d250218724966032.svg":{"logical_path":"flags/4x3/vi.svg","mtime":"2020-04-06T16:47:40+02:00","size":8742,"digest":"0c1811861e17033d8d2ee291edb8b710dc877fbec06ab4e4d250218724966032","integrity":"sha256-DBgRhh4XAz2NLuKR7bi3ENyHf77AarTk0lAhhySWYDI="},"flags/1x1/vi-8112962dc3d3194f3bbf70018fcb5accc21d2cbd033957579427241fbd931e62.svg":{"logical_path":"flags/1x1/vi.svg","mtime":"2020-04-06T16:47:40+02:00","size":8697,"digest":"8112962dc3d3194f3bbf70018fcb5accc21d2cbd033957579427241fbd931e62","integrity":"sha256-gRKWLcPTGU87v3ABj8tazMIdLL0DOVdXlCckH72THmI="},"flags/4x3/vn-1768f5ce4bad46f4907f598e6097e6e1340500f4d7d75a76266f3e6ab9463d5e.svg":{"logical_path":"flags/4x3/vn.svg","mtime":"2020-04-06T16:47:40+02:00","size":494,"digest":"1768f5ce4bad46f4907f598e6097e6e1340500f4d7d75a76266f3e6ab9463d5e","integrity":"sha256-F2j1zkutRvSQf1mOYJfm4TQFAPTX11p2Jm8+arlGPV4="},"flags/1x1/vn-42db427a67708ab79be29119530cedf2108f7a4bcebfdf754a1d8faeedfadb77.svg":{"logical_path":"flags/1x1/vn.svg","mtime":"2020-04-06T16:47:40+02:00","size":498,"digest":"42db427a67708ab79be29119530cedf2108f7a4bcebfdf754a1d8faeedfadb77","integrity":"sha256-QttCemdwireb4pEZUwzt8hCPekvOv991Sh2Pru3623c="},"flags/4x3/vu-03a36a9550f9eba48a2cbe65dc4be5e00b79447fa6d0863378046cc5836a4014.svg":{"logical_path":"flags/4x3/vu.svg","mtime":"2020-04-06T16:47:40+02:00","size":3772,"digest":"03a36a9550f9eba48a2cbe65dc4be5e00b79447fa6d0863378046cc5836a4014","integrity":"sha256-A6NqlVD566SKLL5l3Evl4At5RH+m0IYzeARsxYNqQBQ="},"flags/1x1/vu-016c68fdb5c59b9342aa68a196d73fdf6b7a867694fc406d1338b507a4d05c56.svg":{"logical_path":"flags/1x1/vu.svg","mtime":"2020-04-06T16:47:40+02:00","size":3732,"digest":"016c68fdb5c59b9342aa68a196d73fdf6b7a867694fc406d1338b507a4d05c56","integrity":"sha256-AWxo/bXFm5NCqmihltc/32t6hnaU/EBtEzi1B6TQXFY="},"flags/4x3/wf-e8360ce364de6826f01716b7d320eef87621b70101c129df459682a790267f89.svg":{"logical_path":"flags/4x3/wf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"e8360ce364de6826f01716b7d320eef87621b70101c129df459682a790267f89","integrity":"sha256-6DYM42TeaCbwFxa30yDu+HYhtwEBwSnfRZaCp5Amf4k="},"flags/1x1/wf-5878874353a81033882d683151d7a94765656f867015f75985388e3817a37f8d.svg":{"logical_path":"flags/1x1/wf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"5878874353a81033882d683151d7a94765656f867015f75985388e3817a37f8d","integrity":"sha256-WHiHQ1OoEDOILWgxUdepR2Vlb4ZwFfdZhTiOOBejf40="},"flags/4x3/ws-e77b5573407b1162d26d40dee59e28684aee6ebbff9961ac32242943c9e96e26.svg":{"logical_path":"flags/4x3/ws.svg","mtime":"2020-04-06T16:47:40+02:00","size":693,"digest":"e77b5573407b1162d26d40dee59e28684aee6ebbff9961ac32242943c9e96e26","integrity":"sha256-53tVc0B7EWLSbUDe5Z4oaErubrv/mWGsMiQpQ8npbiY="},"flags/1x1/ws-7cdc90f71e92b252dc69902df2f7ea33a7033a776a00199730239aa4e8fa8b18.svg":{"logical_path":"flags/1x1/ws.svg","mtime":"2020-04-06T16:47:40+02:00","size":706,"digest":"7cdc90f71e92b252dc69902df2f7ea33a7033a776a00199730239aa4e8fa8b18","integrity":"sha256-fNyQ9x6SslLcaZAt8vfqM6cDOndqABmXMCOapOj6ixg="},"flags/4x3/ye-ccc0af8c1220d0583d1432c0c340c21aad14e987d7d73d2601cc35451a37cf9c.svg":{"logical_path":"flags/4x3/ye.svg","mtime":"2020-04-06T16:47:40+02:00","size":275,"digest":"ccc0af8c1220d0583d1432c0c340c21aad14e987d7d73d2601cc35451a37cf9c","integrity":"sha256-zMCvjBIg0Fg9FDLAw0DCGq0U6YfX1z0mAcw1RRo3z5w="},"flags/1x1/ye-d7527d589cebe8037b89e642afcca050b9da0cb4e63ed52bbf116f8461f6c60e.svg":{"logical_path":"flags/1x1/ye.svg","mtime":"2020-04-06T16:47:40+02:00","size":275,"digest":"d7527d589cebe8037b89e642afcca050b9da0cb4e63ed52bbf116f8461f6c60e","integrity":"sha256-11J9WJzr6AN7ieZCr8ygULnaDLTmPtUrvxFvhGH2xg4="},"flags/4x3/yt-b1e78ed98f7111d6a115d73d2c604f5c1ef65ba9b01713ca47d914de0d22b351.svg":{"logical_path":"flags/4x3/yt.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"b1e78ed98f7111d6a115d73d2c604f5c1ef65ba9b01713ca47d914de0d22b351","integrity":"sha256-seeO2Y9xEdahFdc9LGBPXB72W6mwFxPKR9kU3g0is1E="},"flags/1x1/yt-794597839bd5ac5c9bdc0885fe713d3d0a69e38711f9a74654a1599d7c7a7927.svg":{"logical_path":"flags/1x1/yt.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"794597839bd5ac5c9bdc0885fe713d3d0a69e38711f9a74654a1599d7c7a7927","integrity":"sha256-eUWXg5vVrFyb3AiF/nE9PQpp44cR+adGVKFZnXx6eSc="},"flags/4x3/za-d2d473f4e2e4707604a7caac42f9cb6415bf5e8ce35b5e72bc78775d8aae03e5.svg":{"logical_path":"flags/4x3/za.svg","mtime":"2020-04-06T16:47:40+02:00","size":859,"digest":"d2d473f4e2e4707604a7caac42f9cb6415bf5e8ce35b5e72bc78775d8aae03e5","integrity":"sha256-0tRz9OLkcHYEp8qsQvnLZBW/XozjW15yvHh3XYquA+U="},"flags/1x1/za-3985889b8382293dbb3ae27353e864661415afa0ef66d291591b447df8bf8693.svg":{"logical_path":"flags/1x1/za.svg","mtime":"2020-04-06T16:47:40+02:00","size":872,"digest":"3985889b8382293dbb3ae27353e864661415afa0ef66d291591b447df8bf8693","integrity":"sha256-OYWIm4OCKT27OuJzU+hkZhQVr6DvZtKRWRtEffi/hpM="},"flags/4x3/zm-107a1d20ce64bbc59bdf3ef022215742bf5fd79d94636e7d4376586d2e0bb0b4.svg":{"logical_path":"flags/4x3/zm.svg","mtime":"2020-04-06T16:47:40+02:00","size":5497,"digest":"107a1d20ce64bbc59bdf3ef022215742bf5fd79d94636e7d4376586d2e0bb0b4","integrity":"sha256-EHodIM5ku8Wb3z7wIiFXQr9f152UY259Q3ZYbS4LsLQ="},"flags/1x1/zm-4b557cfd170ed4332809862db59879e1da2797deb4b24a288c525d0d72c0bb84.svg":{"logical_path":"flags/1x1/zm.svg","mtime":"2020-04-06T16:47:40+02:00","size":5401,"digest":"4b557cfd170ed4332809862db59879e1da2797deb4b24a288c525d0d72c0bb84","integrity":"sha256-S1V8/RcO1DMoCYYttZh54donl960skoojFJdDXLAu4Q="},"flags/4x3/zw-a357182ee43243cf7989366b10afb15296f814cba5d9a035e3d66ff401aaa115.svg":{"logical_path":"flags/4x3/zw.svg","mtime":"2020-04-06T16:47:40+02:00","size":6641,"digest":"a357182ee43243cf7989366b10afb15296f814cba5d9a035e3d66ff401aaa115","integrity":"sha256-o1cYLuQyQ895iTZrEK+xUpb4FMul2aA149Zv9AGqoRU="},"flags/1x1/zw-c763d38c87df2000c01e5faa5ef51823a9e076b7b9e8e52244ff35270a099401.svg":{"logical_path":"flags/1x1/zw.svg","mtime":"2020-04-06T16:47:40+02:00","size":6614,"digest":"c763d38c87df2000c01e5faa5ef51823a9e076b7b9e8e52244ff35270a099401","integrity":"sha256-x2PTjIffIADAHl+qXvUYI6ngdre56OUiRP81JwoJlAE="},"flags/4x3/es-ca-e6d65a5eae996b410a099eadfc691c380ad0f734578ce2ac14f2d5bf31eb63db.svg":{"logical_path":"flags/4x3/es-ca.svg","mtime":"2020-04-06T16:47:40+02:00","size":258,"digest":"e6d65a5eae996b410a099eadfc691c380ad0f734578ce2ac14f2d5bf31eb63db","integrity":"sha256-5tZaXq6Za0EKCZ6t/GkcOArQ9zRXjOKsFPLVvzHrY9s="},"flags/1x1/es-ca-620053dffeefac1c5eb2f455e2cada12044e5366ffa6516a3bd611ffbbe15dcd.svg":{"logical_path":"flags/1x1/es-ca.svg","mtime":"2020-04-06T16:47:40+02:00","size":257,"digest":"620053dffeefac1c5eb2f455e2cada12044e5366ffa6516a3bd611ffbbe15dcd","integrity":"sha256-YgBT3/7vrBxesvRV4sraEgROU2b/plFqO9YR/7vhXc0="},"flags/4x3/eu-8c749adacf82b6b5d58ce51dbcfa748c6bc6a9a205e5efcb6e96f126f8953f6e.svg":{"logical_path":"flags/4x3/eu.svg","mtime":"2020-04-06T16:47:40+02:00","size":1249,"digest":"8c749adacf82b6b5d58ce51dbcfa748c6bc6a9a205e5efcb6e96f126f8953f6e","integrity":"sha256-jHSa2s+CtrXVjOUdvPp0jGvGqaIF5e/LbpbxJviVP24="},"flags/1x1/eu-7085aed716bfce96bbfc2811fe55bc9855236a4216dd7c925fcb7c142578a3f9.svg":{"logical_path":"flags/1x1/eu.svg","mtime":"2020-04-06T16:47:40+02:00","size":1250,"digest":"7085aed716bfce96bbfc2811fe55bc9855236a4216dd7c925fcb7c142578a3f9","integrity":"sha256-cIWu1xa/zpa7/CgR/lW8mFUjakIW3XySX8t8FCV4o/k="},"flags/4x3/gb-eng-d2de597c10f3c833fd8c7bfbe818189e6209db19882a27398b8e180884697eca.svg":{"logical_path":"flags/4x3/gb-eng.svg","mtime":"2020-04-06T16:47:40+02:00","size":242,"digest":"d2de597c10f3c833fd8c7bfbe818189e6209db19882a27398b8e180884697eca","integrity":"sha256-0t5ZfBDzyDP9jHv76BgYnmIJ2xmIKic5i44YCIRpfso="},"flags/1x1/gb-eng-83388730d99f674d825da4c089650366b965abd338cf15f10f5aadfe0d8276ba.svg":{"logical_path":"flags/1x1/gb-eng.svg","mtime":"2020-04-06T16:47:40+02:00","size":232,"digest":"83388730d99f674d825da4c089650366b965abd338cf15f10f5aadfe0d8276ba","integrity":"sha256-gziHMNmfZ02CXaTAiWUDZrllq9M4zxXxD1qt/g2Cdro="},"flags/4x3/gb-nir-5130c70b20a02f9f6dfff69c9e55b3aa0054906318e4afc12c692dcfb7f55216.svg":{"logical_path":"flags/4x3/gb-nir.svg","mtime":"2020-04-06T16:47:40+02:00","size":25061,"digest":"5130c70b20a02f9f6dfff69c9e55b3aa0054906318e4afc12c692dcfb7f55216","integrity":"sha256-UTDHCyCgL59t//acnlWzqgBUkGMY5K/BLGktz7f1UhY="},"flags/1x1/gb-nir-f5c0a725da9e3e0d7321ae75c61ff5df64d065f1bdece6e2625201735177e558.svg":{"logical_path":"flags/1x1/gb-nir.svg","mtime":"2020-04-06T16:47:40+02:00","size":26487,"digest":"f5c0a725da9e3e0d7321ae75c61ff5df64d065f1bdece6e2625201735177e558","integrity":"sha256-9cCnJdqePg1zIa51xh/132TQZfG97ObiYlIBc1F35Vg="},"flags/4x3/gb-sct-bc44f4448f55c576b4f8e1aa1d61a8b28751dfae10cf3d26d0408befa6d0bde0.svg":{"logical_path":"flags/4x3/gb-sct.svg","mtime":"2020-04-06T16:47:40+02:00","size":231,"digest":"bc44f4448f55c576b4f8e1aa1d61a8b28751dfae10cf3d26d0408befa6d0bde0","integrity":"sha256-vET0RI9VxXa0+OGqHWGosodR364Qzz0m0ECL76bQveA="},"flags/1x1/gb-sct-21234ce6c027716f5ea7f9b5ad128aea007534f32ee77557f7e968c82e7627a1.svg":{"logical_path":"flags/1x1/gb-sct.svg","mtime":"2020-04-06T16:47:40+02:00","size":239,"digest":"21234ce6c027716f5ea7f9b5ad128aea007534f32ee77557f7e968c82e7627a1","integrity":"sha256-ISNM5sAncW9ep/m1rRKK6gB1NPMu53VX9+loyC52J6E="},"flags/4x3/gb-wls-2e24673349bd8ee843980d052d79c354f993efb345d1ef5ee0fe29807e8d19d4.svg":{"logical_path":"flags/4x3/gb-wls.svg","mtime":"2020-04-06T16:47:40+02:00","size":9161,"digest":"2e24673349bd8ee843980d052d79c354f993efb345d1ef5ee0fe29807e8d19d4","integrity":"sha256-LiRnM0m9juhDmA0FLXnDVPmT77NF0e9e4P4pgH6NGdQ="},"flags/1x1/gb-wls-23a0c563a49267894d20b55a5bf6089a582d1ac227a7144c975a191b8f751843.svg":{"logical_path":"flags/1x1/gb-wls.svg","mtime":"2020-04-06T16:47:40+02:00","size":9055,"digest":"23a0c563a49267894d20b55a5bf6089a582d1ac227a7144c975a191b8f751843","integrity":"sha256-I6DFY6SSZ4lNILVaW/YImlgtGsInpxRMl1oZG491GEM="},"flags/4x3/un-6685994fae5d4918c5b6aa20ed98c3bc736bb1bd88ad2d86b40261682766791d.svg":{"logical_path":"flags/4x3/un.svg","mtime":"2020-04-06T16:47:40+02:00","size":19935,"digest":"6685994fae5d4918c5b6aa20ed98c3bc736bb1bd88ad2d86b40261682766791d","integrity":"sha256-ZoWZT65dSRjFtqog7ZjDvHNrsb2IrS2GtAJhaCdmeR0="},"flags/1x1/un-774bae01cbe6a00e4daa93396d860d2ce3d53bb6a5a1f1470e11174fd9315d79.svg":{"logical_path":"flags/1x1/un.svg","mtime":"2020-04-06T16:47:40+02:00","size":20185,"digest":"774bae01cbe6a00e4daa93396d860d2ce3d53bb6a5a1f1470e11174fd9315d79","integrity":"sha256-d0uuAcvmoA5NqpM5bYYNLOPVO7alofFHDhEXT9kxXXk="},"flags/4x3/xk-201401507976e570a410ef6fea6a56db0e05749575bf61ba04a86c7724c6b5c1.svg":{"logical_path":"flags/4x3/xk.svg","mtime":"2020-04-06T16:47:40+02:00","size":9643,"digest":"201401507976e570a410ef6fea6a56db0e05749575bf61ba04a86c7724c6b5c1","integrity":"sha256-IBQBUHl25XCkEO9v6mpW2w4FdJV1v2G6BKhsdyTGtcE="},"flags/1x1/xk-a63525c9f71527db7258c39de2e41edb404955ffb3e5d2b9dd1a7f3173e3b028.svg":{"logical_path":"flags/1x1/xk.svg","mtime":"2020-04-06T16:47:40+02:00","size":8963,"digest":"a63525c9f71527db7258c39de2e41edb404955ffb3e5d2b9dd1a7f3173e3b028","integrity":"sha256-pjUlyfcVJ9tyWMOd4uQe20BJVf+z5dK53Rp/MXPjsCg="},"tags-0d512d7592918932ae6c9633e02d81053dac1efbdb34156d9ea903344f79f76c.css":{"logical_path":"tags.css","mtime":"2020-04-06T16:47:40+02:00","size":1377,"digest":"0d512d7592918932ae6c9633e02d81053dac1efbdb34156d9ea903344f79f76c","integrity":"sha256-DVEtdZKRiTKubJYz4C2BBT2sHvvbNBVtnqkDNE9592w="},"pages-9095e3d3785d23f61fcfb57e1cb9f4c10cf262409efe6d656b9710c721249e6c.js":{"logical_path":"pages.js","mtime":"2020-04-06T16:47:40+02:00","size":999,"digest":"9095e3d3785d23f61fcfb57e1cb9f4c10cf262409efe6d656b9710c721249e6c","integrity":"sha256-kJXj03hdI/Yfz7V+HLn0wQzyYkCe/m1la5cQxyEknmw="},"active_admin/print-f6ce3ffc349ca6c010940202a36b916e852d26179018d2cdc1513350bea7dcba.css":{"logical_path":"active_admin/print.css","mtime":"2022-04-04T22:49:05+02:00","size":7086,"digest":"cf99cbf27fb92065a9eacd28e6fad48fa72cadaf6e0918790e8d35b11d8f99f6","integrity":"sha256-z5nL8n+5IGWp6s0o5vrUj6csra9uCRh5Do01sR2PmfY="},"modernizr-79e0181ec91aff04bb01d87cba546535ede843f75d19f5c60f66b8dd6546971f.js":{"logical_path":"modernizr.js","mtime":"2022-05-22T18:31:04+02:00","size":51364,"digest":"ee94dda0af1fc5c5045741b39e54136015365eedca34095f1d3c666998bb442d","integrity":"sha256-7pTdoK8fxcUEV0GznlQTYBU2Xu3KNAlfHTxmaZi7RC0="},"font-awesome/fa-brands-400-5e54feb2d8cde6b938fa70c95c8e928eff34859e8aaa965b47320872a87ce547.eot":{"logical_path":"font-awesome/fa-brands-400.eot","mtime":"2020-08-25T22:06:58+02:00","size":131930,"digest":"e9fdf947c39f06f1b5e63c58eea2f2f74850421b4e32047dacb9c7b75dd42a16","integrity":"sha256-6f35R8OfBvG15jxY7qLy90hQQhtOMgR9rLnHt13UKhY="},"font-awesome/fa-regular-400-7cf61689b348595522e00a5634d9b35e7eb7a25d7ba7e9cce5f02484e1684377.eot":{"logical_path":"font-awesome/fa-regular-400.eot","mtime":"2020-08-25T22:06:58+02:00","size":34390,"digest":"c1465a6b8743622f759b08a6d5336e57eb6eabdba1b6393fba6d30d45382f3d2","integrity":"sha256-wUZaa4dDYi91mwim1TNuV+tuq9uhtjk/um0w1FOC89I="},"font-awesome/fa-solid-900-934a94434bf9d70c1240a78d5fe78757ff91d1264ae00a1741450e0eef8e9493.eot":{"logical_path":"font-awesome/fa-solid-900.eot","mtime":"2020-08-25T22:06:58+02:00","size":194066,"digest":"f29eef66eb3ad0e3574d8edb4b9e72a04692a0b2b92d99eb7c4b977611ddd4fe","integrity":"sha256-8p7vZus60ONXTY7bS55yoEaSoLK5LZnrfEuXdhHd1P4="},"font-awesome/fa-brands-400-e938fcdde52485595e32c17bcf19a8ff23390e2081b52352d8a345f5170dce7f.svg":{"logical_path":"font-awesome/fa-brands-400.svg","mtime":"2020-08-25T22:06:58+02:00","size":708706,"digest":"36b51fbe6b87587541b9173cd79c16c6b359ad22a172b922204f9aa87411acd9","integrity":"sha256-NrUfvmuHWHVBuRc815wWxrNZrSKhcrkiIE+aqHQRrNk="},"font-awesome/fa-regular-400-d20f2c71ef1e9a5b46e2aacfad2f759e8abdb20fce27fd6bc7d401af8fa7c93a.svg":{"logical_path":"font-awesome/fa-regular-400.svg","mtime":"2020-08-25T22:06:58+02:00","size":144322,"digest":"7ab8a39f4c48b743bd6acbbf5ea4c7547efcb62ad966e9bef3e41996afc44fd4","integrity":"sha256-erijn0xIt0O9asu/XqTHVH78tirZZum+8+QZlq/ET9Q="},"font-awesome/fa-solid-900-46cf582bfe3502172a3a4d54cfd380444289c03c9480a107f00c190db3722950.svg":{"logical_path":"font-awesome/fa-solid-900.svg","mtime":"2020-08-25T22:06:58+02:00","size":849145,"digest":"eaf0f3d0cadad17eed1045cf68c30db7abffb4c8ef4ee9cb5f4026fdefc99a59","integrity":"sha256-6vDz0Mra0X7tEEXPaMMNt6v/tMjvTunLX0Am/e/Jmlk="},"font-awesome/fa-brands-400-e9fa99e59489b4d9270af15949c0df98b805649278b41063f4221819b3d8772e.woff":{"logical_path":"font-awesome/fa-brands-400.woff","mtime":"2020-08-25T22:06:58+02:00","size":89100,"digest":"1af816db9a686faa76bfbda779df959e6213de714a94b87aa7374a151f6f4900","integrity":"sha256-GvgW25pob6p2v72ned+VnmIT3nFKlLh6pzdKFR9vSQA="},"font-awesome/fa-regular-400-ecc54652d705cda26767bc7dd7516893e0d2838b79be2427cb9188f9e4a64eff.woff":{"logical_path":"font-awesome/fa-regular-400.woff","mtime":"2020-08-25T22:06:58+02:00","size":16800,"digest":"864c8f702a5e63198bb76ef0240b599cc065d4904c2afc5da6c8a29bbf0d6c64","integrity":"sha256-hkyPcCpeYxmLt27wJAtZnMBl1JBMKvxdpsiim78NbGQ="},"font-awesome/fa-solid-900-fda129aceafe7c9c766010fbc4461fa2eb86563d80bbc15f0442dc7c674d9e39.woff":{"logical_path":"font-awesome/fa-solid-900.woff","mtime":"2020-08-25T22:06:58+02:00","size":98996,"digest":"3b60c77e0c81c1c9cdc9adb96ade6dbac7ef2b9402a316185855de7122e517db","integrity":"sha256-O2DHfgyBwcnNya25at5tusfvK5QCoxYYWFXecSLlF9s="},"tinymce-rails.manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js":{"logical_path":"tinymce-rails.manifest.js","mtime":"2022-04-11T11:07:13+02:00","size":3,"digest":"6a3cf5192354f71615ac51034b3e97c20eda99643fcaf5bbe6d41ad59bd12167","integrity":"sha256-ajz1GSNU9xYVrFEDSz6Xwg7amWQ/yvW75tQa1ZvRIWc="},"tinymce/jquery.tinymce-a7a666d7b38ac6b8c40928406cb4a074d651e544849694ed61fdb2285e81b477.js":{"logical_path":"tinymce/jquery.tinymce.js","mtime":"2020-08-25T22:06:57+02:00","size":6636,"digest":"11390388288c7c1a1a7e9caaad0fddefe117d60658325f210cd37072999ccbad","integrity":"sha256-ETkDiCiMfBoafpyqrQ/d7+EX1gZYMl8hDNNwcpmcy60="},"tinymce/plugins/emoticons/js/emojis-43f86383feec36f4242fda3a86055a3d063fba82a661647167c0725e69c38638.js":{"logical_path":"tinymce/plugins/emoticons/js/emojis.js","mtime":"2021-02-12T23:07:40+01:00","size":193223,"digest":"c617813820d61e9c41ebf47f1b97509e9c0b385153cda2ed07c33b13fb00feff","integrity":"sha256-xheBOCDWHpxB6/R/G5dQnpwLOFFTzaLtB8M7E/sA/v8="},"tinymce/skins/content/dark/content-8a230e2373a74566412e7941e7f1776e51fb58fc92da0a09dbf8add304ad2a10.css":{"logical_path":"tinymce/skins/content/dark/content.css","mtime":"2020-08-25T22:06:57+02:00","size":832,"digest":"6be8ae40ea68fbf4d9b33024e15b9f841050a13f1e91ab25e657b87da541ec04","integrity":"sha256-a+iuQOpo+/TZszAk4VufhBBQoT8ekasl5le4faVB7AQ="},"tinymce/skins/content/dark/content.min-8a230e2373a74566412e7941e7f1776e51fb58fc92da0a09dbf8add304ad2a10.css":{"logical_path":"tinymce/skins/content/dark/content.min.css","mtime":"2020-08-25T22:06:57+02:00","size":832,"digest":"6be8ae40ea68fbf4d9b33024e15b9f841050a13f1e91ab25e657b87da541ec04","integrity":"sha256-a+iuQOpo+/TZszAk4VufhBBQoT8ekasl5le4faVB7AQ="},"tinymce/skins/content/default/content-0b5678fc5add1150ea9fb103b8617b8f70168ae18e939c07a488b1f3f7fa028e.css":{"logical_path":"tinymce/skins/content/default/content.css","mtime":"2020-08-25T22:06:57+02:00","size":707,"digest":"d3c1ff087c66f0b11014c2851292a295ac5559daa2c9f96499808b8b6cf4401a","integrity":"sha256-08H/CHxm8LEQFMKFEpKilaxVWdqiyflkmYCLi2z0QBo="},"tinymce/skins/content/default/content.min-0b5678fc5add1150ea9fb103b8617b8f70168ae18e939c07a488b1f3f7fa028e.css":{"logical_path":"tinymce/skins/content/default/content.min.css","mtime":"2020-08-25T22:06:57+02:00","size":707,"digest":"d3c1ff087c66f0b11014c2851292a295ac5559daa2c9f96499808b8b6cf4401a","integrity":"sha256-08H/CHxm8LEQFMKFEpKilaxVWdqiyflkmYCLi2z0QBo="},"tinymce/skins/content/document/content-7d70f3c98198a157d0d99a9b75ffe5f071231f678ab2dce6409a449a19197a34.css":{"logical_path":"tinymce/skins/content/document/content.css","mtime":"2020-08-25T22:06:57+02:00","size":791,"digest":"402e66b491fb67e0ed3ad875fed913fbd265e9906fb4610f1d3701e94b80fcc0","integrity":"sha256-QC5mtJH7Z+DtOth1/tkT+9Jl6ZBvtGEPHTcB6UuA/MA="},"tinymce/skins/content/document/content.min-7d70f3c98198a157d0d99a9b75ffe5f071231f678ab2dce6409a449a19197a34.css":{"logical_path":"tinymce/skins/content/document/content.min.css","mtime":"2020-08-25T22:06:57+02:00","size":791,"digest":"402e66b491fb67e0ed3ad875fed913fbd265e9906fb4610f1d3701e94b80fcc0","integrity":"sha256-QC5mtJH7Z+DtOth1/tkT+9Jl6ZBvtGEPHTcB6UuA/MA="},"tinymce/skins/content/writer/content-d09946d43e172fe0cf69f0590d9ce2932a3212ddca1271922ac39f8d26c7781e.css":{"logical_path":"tinymce/skins/content/writer/content.css","mtime":"2020-08-25T22:06:57+02:00","size":728,"digest":"c1e6a9061ac3b75106e78cf28cf17c2f78f1c6fc8982917a21df32d563196129","integrity":"sha256-weapBhrDt1EG54zyjPF8L3jxxvyJgpF6Id8y1WMZYSk="},"tinymce/skins/content/writer/content.min-d09946d43e172fe0cf69f0590d9ce2932a3212ddca1271922ac39f8d26c7781e.css":{"logical_path":"tinymce/skins/content/writer/content.min.css","mtime":"2020-08-25T22:06:57+02:00","size":728,"digest":"c1e6a9061ac3b75106e78cf28cf17c2f78f1c6fc8982917a21df32d563196129","integrity":"sha256-weapBhrDt1EG54zyjPF8L3jxxvyJgpF6Id8y1WMZYSk="},"tinymce/skins/ui/oxide-dark/skin.mobile-f88bd33c7437e51a2e3fc58ae6e1760fa6f6ddb8604d5448dda4a2a206c95bac.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.css","mtime":"2022-04-04T22:49:05+02:00","size":20783,"digest":"b0a97925b320970c4b5846cf2c6f3a7222b1268563eeb89c11f20533f469346e","integrity":"sha256-sKl5JbMglwxLWEbPLG86ciKxJoVj7ricEfIFM/RpNG4="},"tinymce/skins/ui/oxide-dark/skin.mobile.min-f88bd33c7437e51a2e3fc58ae6e1760fa6f6ddb8604d5448dda4a2a206c95bac.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.min.css","mtime":"2022-04-04T22:49:05+02:00","size":20783,"digest":"b0a97925b320970c4b5846cf2c6f3a7222b1268563eeb89c11f20533f469346e","integrity":"sha256-sKl5JbMglwxLWEbPLG86ciKxJoVj7ricEfIFM/RpNG4="},"tinymce/skins/ui/oxide/skin.mobile-f88bd33c7437e51a2e3fc58ae6e1760fa6f6ddb8604d5448dda4a2a206c95bac.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.css","mtime":"2022-04-04T22:49:05+02:00","size":20783,"digest":"b0a97925b320970c4b5846cf2c6f3a7222b1268563eeb89c11f20533f469346e","integrity":"sha256-sKl5JbMglwxLWEbPLG86ciKxJoVj7ricEfIFM/RpNG4="},"tinymce/skins/ui/oxide/skin.mobile.min-f88bd33c7437e51a2e3fc58ae6e1760fa6f6ddb8604d5448dda4a2a206c95bac.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.min.css","mtime":"2022-04-04T22:49:05+02:00","size":20783,"digest":"b0a97925b320970c4b5846cf2c6f3a7222b1268563eeb89c11f20533f469346e","integrity":"sha256-sKl5JbMglwxLWEbPLG86ciKxJoVj7ricEfIFM/RpNG4="},"manifest-90aab26ade71e747f745b1227b433fd7d580a54f279ee2be6e1a67bb326bf03a.js":{"logical_path":"manifest.js","mtime":"2022-04-11T11:07:12+02:00","size":6,"digest":"d088784b7ecb87f1ea17e6f982fa968ffefcc07b79de6ecc548fc00242868da6","integrity":"sha256-0Ih4S37Lh/HqF+b5gvqWj/78wHt53m7MVI/AAkKGjaY="},"agendadescommuns-04172a222503a300e6ccc24863ac39c7e17aab83d4fddd47fa233b2ba10150ce.png":{"logical_path":"agendadescommuns.png","mtime":"2022-05-22T18:31:04+02:00","size":2760,"digest":"0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33","integrity":"sha256-ABe+9T9iYcs7+VLUt4DGQwc2lxSy4eLU659p39mGqzM="},"alert-4401130d700faadafe42bf322264e2689dae9ded22c1186c38ad2699d28b9715.png":{"logical_path":"alert.png","mtime":"2022-05-22T18:31:04+02:00","size":47876,"digest":"762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906","integrity":"sha256-dirOlHkygkOkQGE0a2TE1rmX6WPGjfxr3dnk0kEZKQY="},"baby_gnu_adl-16fb75eef2962c69ecbbe7c41bd49c38f9c59318aacbf18c8b8fefd41cc7be12.png":{"logical_path":"baby_gnu_adl.png","mtime":"2022-05-22T18:31:04+02:00","size":7411,"digest":"463a81820aa2d4ffd8e7210dbce1a19ffcac67ef362aa7b092280c6f95c903fc","integrity":"sha256-RjqBggqi1P/Y5yENvOGhn/ysZ+82KqewkigMb5XJA/w="},"baby_gnu_adl-70951d780455e377aa0564b263a36704960870d645900005d18eb907ac4627cb.svg":{"logical_path":"baby_gnu_adl.svg","mtime":"2022-05-22T18:31:04+02:00","size":109635,"digest":"97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e","integrity":"sha256-lyUQBdMiXPHVi4xJfWt5BdvJVgzIrNUBGPzOYNCiZ54="},"communs-04172a222503a300e6ccc24863ac39c7e17aab83d4fddd47fa233b2ba10150ce.png":{"logical_path":"communs.png","mtime":"2022-05-22T18:31:04+02:00","size":2760,"digest":"0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33","integrity":"sha256-ABe+9T9iYcs7+VLUt4DGQwc2lxSy4eLU659p39mGqzM="},"lef-small-5d6eb3183e342c1918feba6dcbefd7efbf9f8eb6058599a7a1d2252beb0369d0.png":{"logical_path":"lef-small.png","mtime":"2022-05-22T18:31:04+02:00","size":1059,"digest":"93285d531af463f877951d63fe844a6e9600b782c2c81f78723b730072fa942e","integrity":"sha256-kyhdUxr0Y/h3lR1j/oRKbpYAt4LCyB94cjtzAHL6lC4="},"lef-1422d96f5f5e792673b1ac60adc86797775bcf2630faf955ff0d0a35953837ba.png":{"logical_path":"lef.png","mtime":"2020-10-11T20:13:15+02:00","size":24674,"digest":"6508797f5a020d87aa0db27dcddd904ba3cc9e438adb1c90f5163af8377acaee","integrity":"sha256-ZQh5f1oCDYeqDbJ9zd2QS6PMnkOK2xyQ9RY6+Dd6yu4="},"linux-presentation-day-30da5011055ef1b832234bf8fa8777b60bda3fed09a3cf7ae36a507e1fb8f272.png":{"logical_path":"linux-presentation-day.png","mtime":"2022-05-22T18:31:04+02:00","size":9358,"digest":"863b30562924505dd21841220861f83643d310e0b943a0e6a905462ddfac86f1","integrity":"sha256-hjswVikkUF3SGEEiCGH4NkPTEOC5Q6DmqQVGLd+shvE="},"osm_logo-d4979005d8a03d67bbf051b4e7e6ef1b26c6a34a5cd1b65908e2947c360ca391.svg":{"logical_path":"osm_logo.svg","mtime":"2022-05-22T18:31:04+02:00","size":89730,"digest":"0e91a8acd0a92c1bf14204322322e57c65c2a7e318fec6907252fed929b7d6d3","integrity":"sha256-DpGorNCpLBvxQgQyIyLlfGXCp+MY/saQclL+2Sm31tM="},"priorite-logiciel-libre-je-soutiens-april_2_m-61a1cf930cdc5b1bd39dea68ef26aad7ea086d7baaf04f96b72ffaa5a7a68bdc.png":{"logical_path":"priorite-logiciel-libre-je-soutiens-april_2_m.png","mtime":"2022-05-22T18:31:04+02:00","size":16952,"digest":"6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc","integrity":"sha256-ZELkVOlu1FzB68QGc6bFC9KGucKOpqi1hXLpT31kWfw="},"regions/CA-QC-8d0df3da21ac158626b9aba2827b07d708e9fd1e6277414ab0d01f9a31ee5099.png":{"logical_path":"regions/CA-QC.png","mtime":"2022-05-22T18:31:04+02:00","size":469,"digest":"70699e6a6e25c69040a3f1548b0afd829c4903ccca2760b6c10f49cc87d5d174","integrity":"sha256-cGmeam4lxpBAo/FUiwr9gpxJA8zKJ2C2wQ9JzIfV0XQ="},"team-810a9268a50ca2d493299c8738aa15885a4fed1dd22101844b488b0071b6c44a.png":{"logical_path":"team.png","mtime":"2022-05-22T18:31:04+02:00","size":3586,"digest":"65c86021cf8a1154493664094aeafcbe3e5aa13dc675bb8ef34b220481db98fa","integrity":"sha256-ZchgIc+KEVRJNmQJSur8vj5aoT3GdbuO80siBIHbmPo="},"flags/4x3/ad-04b4b65e6a104b102172258b3894a9a4e29890aa63e8edc4812033dd7387b77e.svg":{"logical_path":"flags/4x3/ad.svg","mtime":"2022-05-22T18:31:04+02:00","size":33473,"digest":"af21bc50f12e6076f79dbddb6049ea32bf747e4a9dbf628781eaf29e81c6232c","integrity":"sha256-ryG8UPEuYHb3nb3bYEnqMr90fkqdv2KHgerynoHGIyw="},"flags/1x1/ad-847534ad5665b0bb24f766110a56922d9115cbd4c35746597e1fc5edb381b41a.svg":{"logical_path":"flags/1x1/ad.svg","mtime":"2022-05-22T18:31:04+02:00","size":32253,"digest":"5f301eee62631c50459507a29617ac02cc8106359da22b9705d3b73e50dcb839","integrity":"sha256-XzAe7mJjHFBFlQeilhesAsyBBjWdoiuXBdO3PlDcuDk="},"flags/4x3/ae-f6dd88c6cb3940f07ad1ee2635ec0f081d53885efea97c2f363f61c4f06129e8.svg":{"logical_path":"flags/4x3/ae.svg","mtime":"2022-05-22T18:31:04+02:00","size":254,"digest":"660f600189f77fbacd2099f5b898864e08a67d0cfe3905c390dcf6b86489dbe4","integrity":"sha256-Zg9gAYn3f7rNIJn1uJiGTgimfQz+OQXDkNz2uGSJ2+Q="},"flags/1x1/ae-c5992978bbf00ada1971a746b819936eb2f73aefac7f10518995545c2ccf2c10.svg":{"logical_path":"flags/1x1/ae.svg","mtime":"2022-05-22T18:31:04+02:00","size":262,"digest":"09943e355944d6870f74093d858503de204f02ca78f70122a5a7d74897134b6d","integrity":"sha256-CZQ+NVlE1ocPdAk9hYUD3iBPAsp49wEipafXSJcTS20="},"flags/4x3/af-745ad7e8ea956edf06641d01bf5a0374cfae6902846e62a30ed56ad80f889906.svg":{"logical_path":"flags/4x3/af.svg","mtime":"2022-05-22T18:31:04+02:00","size":21066,"digest":"c7bfd83db1aefc08972a093aca88285194feb05ab87fb5ede44acb107a2f84e0","integrity":"sha256-x7/YPbGu/AiXKgk6yogoUZT+sFq4f7Xt5ErLEHovhOA="},"flags/1x1/af-50e587ac98a5af98e21994909aa1f9898add6842954e2ad6a709d857b39a8b55.svg":{"logical_path":"flags/1x1/af.svg","mtime":"2022-05-22T18:31:04+02:00","size":20928,"digest":"f0fe67d6b190381b4b7a039173c8d74a2dc8f7773ca6ac79de25b0b14c8b80f0","integrity":"sha256-8P5n1rGQOBtLegORc8jXSi3I93c8pqx53iWwsUyLgPA="},"flags/4x3/ag-ec678db01740bd72757a7883a1dbea0c163e2b0a7a692cc8a0749c6f50428abb.svg":{"logical_path":"flags/4x3/ag.svg","mtime":"2022-05-22T18:31:04+02:00","size":749,"digest":"a986cf9b57900ccf9ac75cf39b5f519385e80dc6319fbf584c33e08e5b913d50","integrity":"sha256-qYbPm1eQDM+ax1zzm19Rk4XoDcYxn79YTDPgjluRPVA="},"flags/1x1/ag-35c11ca3ad0581842f9c1eddc462690e6166f94a8dbb15e248398df93a276004.svg":{"logical_path":"flags/1x1/ag.svg","mtime":"2022-05-22T18:31:04+02:00","size":761,"digest":"b0ee8dc5572db906f3765696c41fbaef3df72651fe0eaa306acfaa310ab80d06","integrity":"sha256-sO6NxVctuQbzdlaWxB+67z33JlH+Dqowas+qMQq4DQY="},"flags/4x3/ai-d688814fa60d2294b79b6ffe3d2a64e55a0bc013718cbf028b5d5720e3041794.svg":{"logical_path":"flags/4x3/ai.svg","mtime":"2022-05-22T18:31:04+02:00","size":48259,"digest":"efd0c274edd8ce7fc9b665c783f1fc297218b699965677ea0762fe46c0cceff6","integrity":"sha256-79DCdO3Yzn/JtmXHg/H8KXIYtpmWVnfqB2L+RsDM7/Y="},"flags/1x1/ai-850f5995f9b55ac8f30b35157cb1881d149e8257c168f39dbc8e51cae25c222d.svg":{"logical_path":"flags/1x1/ai.svg","mtime":"2022-05-22T18:31:04+02:00","size":48199,"digest":"b6ba8568e879a3c78e19c6aa712b47617c9ec91ab03de656f43a41bbbc1cf02f","integrity":"sha256-trqFaOh5o8eOGcaqcStHYXyeyRqwPeZW9DpBu7wc8C8="},"flags/4x3/al-5631be891ba0ccdb1f2a9b3a934031ed681aaeb139acc9e3b414e2561a608495.svg":{"logical_path":"flags/4x3/al.svg","mtime":"2022-05-22T18:31:04+02:00","size":3206,"digest":"87476e4c4b339983bcda71637a718eed1670bed1e39d7419db41b8f9db3a9485","integrity":"sha256-h0duTEszmYO82nFjenGO7RZwvtHjnXQZ20G4+ds6lIU="},"flags/1x1/al-96787887d75cd3bd02e8eff8a75ba0856873167743205a5cbfc5439197e3070d.svg":{"logical_path":"flags/1x1/al.svg","mtime":"2022-05-22T18:31:04+02:00","size":3205,"digest":"b8c66c9d8f77fe6292e524164c8072fdaf2728daae036fe52cf541dc8dcea217","integrity":"sha256-uMZsnY93/mKS5SQWTIBy/a8nKNquA2/lLPVB3I3Oohc="},"flags/4x3/am-fd6eb7b12b2bbd15d4e5db6949b57255849f5fecc62d9a48d848bab767f1123e.svg":{"logical_path":"flags/4x3/am.svg","mtime":"2022-05-22T18:31:04+02:00","size":223,"digest":"8244966df26ff96a23e4d1ec5411c7f8fdd2b935c48189dfb2e258bda95e986e","integrity":"sha256-gkSWbfJv+Woj5NHsVBHH+P3SuTXEgYnfsuJYvalemG4="},"flags/1x1/am-85e618fb93d8a64fc145ce0ebfb0397e5468816476df4c43ff0419dfea72d53b.svg":{"logical_path":"flags/1x1/am.svg","mtime":"2022-05-22T18:31:04+02:00","size":231,"digest":"48d3c9b60f3f9f482d83cd54459703e760b1a9524a290a491290588eb656387b","integrity":"sha256-SNPJtg8/n0gtg81URZcD52CxqVJKKQpJEpBYjrZWOHs="},"flags/4x3/ao-09b6b18d13202b859e9e94b9a88e59701b7b2d00d88d8a749f7f0d3bb71c745c.svg":{"logical_path":"flags/4x3/ao.svg","mtime":"2022-05-22T18:31:04+02:00","size":1588,"digest":"7ac46e1cd0c7d36c3229911376e38f7a9f578f627bd889f23ab5d5c9597cbc36","integrity":"sha256-esRuHNDH02wyKZETduOPep9Xj2J72InyOrXVyVl8vDY="},"flags/1x1/ao-dd2f7930f4f4214707f7a311f16cae422471094601319a5b69abeb48d384855c.svg":{"logical_path":"flags/1x1/ao.svg","mtime":"2022-05-22T18:31:04+02:00","size":1588,"digest":"b4bdbc4113ca80e45c6f96cf620a4638a4fea2dbd143780cc086531bb968ee63","integrity":"sha256-tL28QRPKgORcb5bPYgpGOKT+otvRQ3gMwIZTG7lo7mM="},"flags/4x3/aq-2adcc4b28a1da2ac271675b5377a39f226fe06b135d287215c153957b2176da2.svg":{"logical_path":"flags/4x3/aq.svg","mtime":"2022-05-22T18:31:04+02:00","size":6143,"digest":"62ee1988140dee84b7c8dd5ffa27db67b3242505b9ac16a91981cd05599c49b4","integrity":"sha256-Yu4ZiBQN7oS3yN1f+ifbZ7MkJQW5rBapGYHNBVmcSbQ="},"flags/1x1/aq-8809bb8b30a063b921c866da0a83236d7dd8a17148ef4c0db3c53ccd0dc15e6f.svg":{"logical_path":"flags/1x1/aq.svg","mtime":"2022-05-22T18:31:04+02:00","size":5958,"digest":"2fd9279bb4fe7bd6cb53aeab191764e3602ca9e5324e306dd178e9b229ab6d93","integrity":"sha256-L9knm7T+e9bLU66rGRdk42AsqeUyTjBt0XjpsimrbZM="},"flags/4x3/ar-8208e0546b8e666d806ee3fc3061504a62bf6cdea5fa4385d54c3ba131e3135c.svg":{"logical_path":"flags/4x3/ar.svg","mtime":"2022-05-22T18:31:04+02:00","size":3402,"digest":"036d9c340499588b37c3ff853da7ea105eb35fae876d7cfe034ebe3cc3764cd8","integrity":"sha256-A22cNASZWIs3w/+FPafqEF6zX66HbXz+A06+PMN2TNg="},"flags/1x1/ar-2d821fddef311e29c74ce2b19bbc651a2d613aebbd88f59ad8fc6c3a81544d1b.svg":{"logical_path":"flags/1x1/ar.svg","mtime":"2022-05-22T18:31:04+02:00","size":3473,"digest":"3c7a866d916efd9ab117bebd9651daceee196ee95e420f6fd6be8c8839c067d4","integrity":"sha256-PHqGbZFu/ZqxF769llHazu4ZbuleQg9v1r6MiDnAZ9Q="},"flags/4x3/as-a7ce0712972b05287e9ddf7da0e19630d4b440f0ce59b3a50397bc29d162192e.svg":{"logical_path":"flags/4x3/as.svg","mtime":"2022-05-22T18:31:04+02:00","size":8068,"digest":"3193ab22284dbfe3b88049d07de78b43be8bd841ff00e71e84e3c957cbdaee6a","integrity":"sha256-MZOrIihNv+O4gEnQfeeLQ76L2EH/AOcehOPJV8va7mo="},"flags/1x1/as-06505370c9bcfcad7b057757c3e892d12930db56565c0fd0bc86f4af5af5686f.svg":{"logical_path":"flags/1x1/as.svg","mtime":"2022-05-22T18:31:04+02:00","size":7828,"digest":"e8ce581d75d4d6262dcd1abdd577273cbb06d2b15e13df17427c8881775d5c81","integrity":"sha256-6M5YHXXU1iYtzRq91XcnPLsG0rFeE98XQnyIgXddXIE="},"flags/4x3/at-644b0cc2d91fe69f18d9992488a748efa0df7eb6ddc83ac79351ba9226956d25.svg":{"logical_path":"flags/4x3/at.svg","mtime":"2022-05-22T18:31:04+02:00","size":240,"digest":"1e513e59cf959d38287ad72edc6f07cda754b7621efb04ed74c333df73ff4176","integrity":"sha256-HlE+Wc+VnTgoetcu3G8HzadUt2Ie+wTtdMMz33P/QXY="},"flags/1x1/at-b36d3570a5102400e028dfa0b5204e9c2cd8d72b398e94bab5c51edd0954ce40.svg":{"logical_path":"flags/1x1/at.svg","mtime":"2022-05-22T18:31:04+02:00","size":242,"digest":"73ae6b3c0378e6855da2f6f164668218485117334175d68e44f88a3846a1e179","integrity":"sha256-c65rPAN45oVdovbxZGaCGEhRFzNBddaORPiKOEah4Xk="},"flags/4x3/au-887bb0cc0e77e15153e4c9006e785d5f68c77ca0ab9eb7f538e371a0e4f218af.svg":{"logical_path":"flags/4x3/au.svg","mtime":"2022-05-22T18:31:04+02:00","size":1546,"digest":"213bcc5e8c0c7defccd96f191f39e53f873da8129e55d230faafdd683d4168f9","integrity":"sha256-ITvMXowMfe/M2W8ZHznlP4c9qBKeVdIw+q/daD1BaPk="},"flags/1x1/au-ba82260247c564d9f4735fa2eeca092ac9b5d4e32c6a6a8db1d4177b746516a5.svg":{"logical_path":"flags/1x1/au.svg","mtime":"2022-05-22T18:31:04+02:00","size":1483,"digest":"dfc984d3a89cfdcaf4417482af869ee04c6d0399aa2905c7d3b5d09d5af4aa5a","integrity":"sha256-38mE06ic/cr0QXSCr4ae4ExtA5mqKQXH07XQnVr0qlo="},"flags/4x3/aw-ea7eeaeec20598c43c59a2536b150a7fb5e7f6443a5bfb7e1bd72aa7186be8e1.svg":{"logical_path":"flags/4x3/aw.svg","mtime":"2022-05-22T18:31:04+02:00","size":9951,"digest":"424db29f64f3c72757bc5542144a2347d30102d17aeb30ae977559fd68e6f637","integrity":"sha256-Qk2yn2TzxydXvFVCFEojR9MBAtF66zCul3VZ/Wjm9jc="},"flags/1x1/aw-c39c9c3d5de9ece42a7e717ac3670886532dd75d50a34e1b3ae10e39487679fb.svg":{"logical_path":"flags/1x1/aw.svg","mtime":"2022-05-22T18:31:04+02:00","size":12084,"digest":"b5162dba277197f89aa8ea36a1b50ec057d38b2e8d7229eadbe55fcc7fae20ac","integrity":"sha256-tRYtuidxl/iaqOo2obUOwFfTiy6Ncinq2+VfzH+uIKw="},"flags/4x3/ax-4825f85b2d4669c70f360bd63f1e36215d16bace4700dffc61992911de53198a.svg":{"logical_path":"flags/4x3/ax.svg","mtime":"2022-05-22T18:31:04+02:00","size":559,"digest":"e0b7f6dd55f2611d2a69e9f111dc39c5342069c32855f72933ff53e6f7488811","integrity":"sha256-4Lf23VXyYR0qaenxEdw5xTQgacMoVfcpM/9T5vdIiBE="},"flags/1x1/ax-ce68def4e721fcb48feb3b2aee81ad4ba7e75642ace96f24c059ee82b906c35b.svg":{"logical_path":"flags/1x1/ax.svg","mtime":"2022-05-22T18:31:04+02:00","size":541,"digest":"952771b31fc59cffe5c33677e6d701bcb782262e86a01e7a591eab5a11e47eb3","integrity":"sha256-lSdxsx/FnP/lwzZ35tcBvLeCJi6GoB56WR6rWhHkfrM="},"flags/4x3/az-9e3354b743219dbaf19cc54a63e1a8ed41d1f41485455330775b3b5c6dd6c9fe.svg":{"logical_path":"flags/4x3/az.svg","mtime":"2022-05-22T18:31:04+02:00","size":512,"digest":"3a16ff227d8a0295cf07c9f3fcab7e4004f0c4b6f18c5858dc1633cf6b16fe78","integrity":"sha256-Ohb/In2KApXPB8nz/Kt+QATwxLbxjFhY3BYzz2sW/ng="},"flags/1x1/az-4e93f9eef0ef96515e8c152c87d4a278d725ecb20108257105c9ccd48a156ddb.svg":{"logical_path":"flags/1x1/az.svg","mtime":"2022-05-22T18:31:04+02:00","size":498,"digest":"ce76ab744019e9980d0b9dda74b664e933461cf96eeb305a858a39b9a38b9b17","integrity":"sha256-znardEAZ6ZgNC53adLZk6TNGHPlu6zBahYo5uaOLmxc="},"flags/4x3/ba-7e420cae1feb7be337a34f25fb8fd6421295cde2e03273efa7e880d7d5d9281e.svg":{"logical_path":"flags/4x3/ba.svg","mtime":"2022-05-22T18:31:04+02:00","size":1310,"digest":"0145a56b0f2d7e25856b2c62fcef5a8e2d62257ec67c0806fa0e92933082503e","integrity":"sha256-AUWlaw8tfiWFayxi/O9aji1iJX7GfAgG+g6SkzCCUD4="},"flags/1x1/ba-2e20ab2d7c91e67460cc9a910016a7706b0d7e5865895cce6b835b4f557cc861.svg":{"logical_path":"flags/1x1/ba.svg","mtime":"2022-05-22T18:31:04+02:00","size":1242,"digest":"b4466a08b71725f8b5057ef0946b19d77a4d23eed0b81fd1abe4380dd6dde3c1","integrity":"sha256-tEZqCLcXJfi1BX7wlGsZ13pNI+7QuB/Rq+Q4Ddbd48E="},"flags/4x3/bb-35373b19bd542d0382d79bbd162be7583932adbb180c8b6223614a52c31fb1a0.svg":{"logical_path":"flags/4x3/bb.svg","mtime":"2022-05-22T18:31:04+02:00","size":609,"digest":"667b79ca265802e179cfdc8ab06295e9e23301659f610ea11005b7415ae98673","integrity":"sha256-Znt5yiZYAuF5z9yKsGKV6eIzAWWfYQ6hEAW3QVrphnM="},"flags/1x1/bb-f5d71a0072d6dbc25a4264c4ab0d997b785550f8e6581230c22bb30fec7c9841.svg":{"logical_path":"flags/1x1/bb.svg","mtime":"2022-05-22T18:31:04+02:00","size":609,"digest":"2ce0c4f55ba85069897fa15337b07e10470c9846698257bea85971d4307b417c","integrity":"sha256-LODE9VuoUGmJf6FTN7B+EEcMmEZpgle+qFlx1DB7QXw="},"flags/4x3/bd-0531b5c730836d8ecfb4b9b79aad2e560dfc53a30e65f2a4030d2f275827f5ae.svg":{"logical_path":"flags/4x3/bd.svg","mtime":"2022-05-22T18:31:04+02:00","size":190,"digest":"d5ee762ba69448db5fadd6a18f5213ca922c0f04fe7d47bca6983afbb301fe2e","integrity":"sha256-1e52K6aUSNtfrdahj1ITypIsDwT+fUe8ppg6+7MB/i4="},"flags/1x1/bd-c35883811cce9a21ef91202da7fc4648cc62b9ffee53a5ad0a88b179494e95fc.svg":{"logical_path":"flags/1x1/bd.svg","mtime":"2022-05-22T18:31:04+02:00","size":192,"digest":"749b63aa937201843f63cedfd7d0db3019ddf95b931b4be80693716fd2b84cce","integrity":"sha256-dJtjqpNyAYQ/Y87f19DbMBnd+VuTG0voBpNxb9K4TM4="},"flags/4x3/be-ac7f9445060d07698cf4c4b5126b13397e12949102326caa3179eb98d4a90974.svg":{"logical_path":"flags/4x3/be.svg","mtime":"2022-05-22T18:31:04+02:00","size":290,"digest":"b3df2b94815bb9f38846ee9bf98e13f70cee99f9b08d80b95f96117255bb14ae","integrity":"sha256-s98rlIFbufOIRu6b+Y4T9wzumfmwjYC5X5YRclW7FK4="},"flags/1x1/be-61e1bb398ed6bf0253a21f9e32feb26395cf5aec5dc05640235d4accf43c2ee1.svg":{"logical_path":"flags/1x1/be.svg","mtime":"2022-05-22T18:31:04+02:00","size":290,"digest":"b998bdfa696aaa291b5c97eb783c3b525082462dc1fa69d32ded3a3df758eacc","integrity":"sha256-uZi9+mlqqikbXJfreDw7UlCCRi3B+mnTLe06PfdY6sw="},"flags/4x3/bf-4f19b8dfd521393da6d1f2ca95cc79d22d558c34c3d74b2718417d9df29726f3.svg":{"logical_path":"flags/4x3/bf.svg","mtime":"2022-05-22T18:31:04+02:00","size":357,"digest":"bb500b0772dba72a64a3cede92898c2803bb9fbd72743826590cce2a8f4dd066","integrity":"sha256-u1ALB3Lbpypko87ekomMKAO7n71ydDgmWQzOKo9N0GY="},"flags/1x1/bf-7b037b76d1915df2f978852ebc0b88e6fa9abf8d579ed85e360d081b8f95e09c.svg":{"logical_path":"flags/1x1/bf.svg","mtime":"2022-05-22T18:31:04+02:00","size":383,"digest":"8f795ecc74ce0431b735094709b535fe2f6ffc49efc32976106ba332741c2244","integrity":"sha256-j3lezHTOBDG3NQlHCbU1/i9v/Envwyl2EGujMnQcIkQ="},"flags/4x3/bg-1433c1cd05916af99e2db72a9e2c6d7532013a619770b66b51595fcd349cbaa6.svg":{"logical_path":"flags/4x3/bg.svg","mtime":"2022-05-22T18:31:04+02:00","size":286,"digest":"c67e049a9f003f098e554808e74e3359970e4df9adcfb69b33dcb7bfd5b7a8c5","integrity":"sha256-xn4Emp8APwmOVUgI504zWZcOTfmtz7abM9y3v9W3qMU="},"flags/1x1/bg-d631585f0e0981298746582b913765429bbcdd2349cc6062b8e9e790be5f31f0.svg":{"logical_path":"flags/1x1/bg.svg","mtime":"2022-05-22T18:31:04+02:00","size":294,"digest":"9ddbc7b674ff21cbf2c0d82ae5e701f89902c4ce8841585e25d8e5ce36902205","integrity":"sha256-ndvHtnT/IcvywNgq5ecB+JkCxM6IQVheJdjlzjaQIgU="},"flags/4x3/bh-d677a52979c37517212e9b9b6697541a366b0104e09808d396a6d02411a983f5.svg":{"logical_path":"flags/4x3/bh.svg","mtime":"2022-05-22T18:31:04+02:00","size":517,"digest":"b89b1dd1f40b59b119a3788653182317859e93b7e506ba08516de97b8590803e","integrity":"sha256-uJsd0fQLWbEZo3iGUxgjF4Wek7flBroIUW3pe4WQgD4="},"flags/1x1/bh-d408321e7282b8ee67413917d3063536197d8ceeb23abc05677d748ebb8a6378.svg":{"logical_path":"flags/1x1/bh.svg","mtime":"2022-05-22T18:31:04+02:00","size":538,"digest":"9a6f53af3af276804af165a6df525364ab0775485e209f3f84a351a9c8537df8","integrity":"sha256-mm9TrzrydoBK8WWm31JTZKsHdUheIJ8/hKNRqchTffg="},"flags/4x3/bi-6323bc95384cf7a6ea6c91332c3054e55152b391e8f823828df3d05a3e40854a.svg":{"logical_path":"flags/4x3/bi.svg","mtime":"2022-05-22T18:31:04+02:00","size":1074,"digest":"d9cc0b58ddd6c7a1147999f96ff25d4fd80e00a71636f2e0dba952f0c5771532","integrity":"sha256-2cwLWN3Wx6EUeZn5b/JdT9gOAKcWNvLg26lS8MV3FTI="},"flags/1x1/bi-e79238de5c139c78aeb157e1b7d5646a79dc5e154f35ad49aeae21321c0a8d78.svg":{"logical_path":"flags/1x1/bi.svg","mtime":"2022-05-22T18:31:04+02:00","size":1042,"digest":"78476c6682fd0fdc9d621974a6e8daab640383db2f95603a9acdbfbc1d8ebfc3","integrity":"sha256-eEdsZoL9D9ydYhl0pujaq2QDg9svlWA6ms2/vB2Ov8M="},"flags/4x3/bj-951d79103aea5585768fa178923f6127f918fc01d02556174dff9f8506cf90ea.svg":{"logical_path":"flags/4x3/bj.svg","mtime":"2022-05-22T18:31:04+02:00","size":502,"digest":"9085e2dc8e991e0dc1e0192979ca19db8dd9e22cd8ec7228f6289e2b8231a9c2","integrity":"sha256-kIXi3I6ZHg3B4BkpecoZ243Z4izY7HIo9iieK4IxqcI="},"flags/1x1/bj-7f5cc7510ece68a729788fcfbebd91dd941e0014ba3187b66bcd3da245c78460.svg":{"logical_path":"flags/1x1/bj.svg","mtime":"2022-05-22T18:31:04+02:00","size":499,"digest":"126f6103d81a930d8d8e185e1064c6502e99d1709e622e371b551f6b0f460ccb","integrity":"sha256-Em9hA9gakw2NjhheEGTGUC6Z0XCeYi43G1Ufaw9GDMs="},"flags/4x3/bl-cc250a31e29ac0fe10c9e79a35920b280f6ec2731b9d5f701b2313bee631e114.svg":{"logical_path":"flags/4x3/bl.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"1c0fc0dc03abc76091b6e9b874ab94975b4fb6898ff39dd8fc4705f81b1c94f2","integrity":"sha256-HA/A3AOrx2CRtum4dKuUl1tPtomP853Y/EcF+BsclPI="},"flags/1x1/bl-cfb5dd954f586d0662e09cdcbd338da8e225d481896414688262e2bd14c38c8a.svg":{"logical_path":"flags/1x1/bl.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"b41eb06ebe9a9ad8176b247be6884b2d2562261aac85b148bb4fc953477701b3","integrity":"sha256-tB6wbr6amtgXayR75ohLLSViJhqshbFIu0/JU0d3AbM="},"flags/4x3/bm-1e95c5f49d3f1f4a7049a82cdcd6ae326e4c37effd2249df9f7df423942b7396.svg":{"logical_path":"flags/4x3/bm.svg","mtime":"2022-05-22T18:31:04+02:00","size":22569,"digest":"13cb511dd4f639bcb07b08499c6a596ef4a300745a740f5158e70bef9823913a","integrity":"sha256-E8tRHdT2ObywewhJnGpZbvSjAHRadA9RWOcL75gjkTo="},"flags/1x1/bm-e0b05c8af03f5fe3728e191b24bedb2ac2429b86abfba4fa14b7d48960883d9c.svg":{"logical_path":"flags/1x1/bm.svg","mtime":"2022-05-22T18:31:04+02:00","size":22270,"digest":"1af07e53e38af85994614d0e3a1edfae8f5c74091a82c63a051ac1ae889e5125","integrity":"sha256-GvB+U+OK+FmUYU0OOh7fro9cdAkagsY6BRrBroieUSU="},"flags/4x3/bn-2e92465bcaef939fcf20029aedac6af2262eb4ee25e36d64bcf98d03976bbbe9.svg":{"logical_path":"flags/4x3/bn.svg","mtime":"2022-05-22T18:31:04+02:00","size":14213,"digest":"7c5eafd90f22b14301a5784167e70326557e8732de95e702d9780afb9ba351f6","integrity":"sha256-fF6v2Q8isUMBpXhBZ+cDJlV+hzLelecC2XgK+5ujUfY="},"flags/1x1/bn-6a56361917ec344da75ebb87a3713a2eaaf4605d84b1f1e3db1a8df6685bfb3f.svg":{"logical_path":"flags/1x1/bn.svg","mtime":"2022-05-22T18:31:04+02:00","size":14359,"digest":"58930c2508f1ade40240bc93e4fad7de229e1f7b6ca3e5f8bdb97fecda54f24e","integrity":"sha256-WJMMJQjxreQCQLyT5PrX3iKeH3tso+X4vbl/7NpU8k4="},"flags/4x3/bo-4c581c015880880d328153d007fc2517a7e0b53126c1a3a676e4abbb19e4c7fb.svg":{"logical_path":"flags/4x3/bo.svg","mtime":"2022-05-22T18:31:04+02:00","size":117062,"digest":"4ab35795d73ec5cc7ce784bedbd1c72c7ab5402f3665998d998c1b6e244bf4bc","integrity":"sha256-SrNXldc+xcx854S+29HHLHq1QC82ZZmNmYwbbiRL9Lw="},"flags/1x1/bo-ec135db8db19ecafc614799d5e9e459cc5d8e9d91308f7d4511f3b95f8ee1054.svg":{"logical_path":"flags/1x1/bo.svg","mtime":"2022-05-22T18:31:04+02:00","size":118659,"digest":"2a091af9404186fae5b2a5044b061ace8ffa53a874187caf007842ca70bb4294","integrity":"sha256-Kgka+UBBhvrlsqUESwYazo/6U6h0GHyvAHhCynC7QpQ="},"flags/4x3/bq-973b8d977bde843039e96a9229d803fcbb1c29ba92272b8bc3223b28b8ccc803.svg":{"logical_path":"flags/4x3/bq.svg","mtime":"2022-05-22T18:31:04+02:00","size":224,"digest":"4f69e04ac3651b9112d1411a085bd6d632544c593fad9d20c27616d809746f07","integrity":"sha256-T2ngSsNlG5ES0UEaCFvW1jJUTFk/rZ0gwnYW2Al0bwc="},"flags/1x1/bq-78c259288833d36f4d2209a4a95ca18cd3c18820f79f49b278bf7960cf5b34e7.svg":{"logical_path":"flags/1x1/bq.svg","mtime":"2022-05-22T18:31:04+02:00","size":228,"digest":"21e4c616d5cd5c0486640b66400d9c8559cab08650e7601e291c4f5b1643a6ab","integrity":"sha256-IeTGFtXNXASGZAtmQA2chVnKsIZQ52AeKRxPWxZDpqs="},"flags/4x3/br-68ee8e029f99c31821e646aec1c8e9e8f8b1aaf26d72909ac75ff38c1f8e9201.svg":{"logical_path":"flags/4x3/br.svg","mtime":"2022-05-22T18:31:04+02:00","size":8097,"digest":"5626545274de6de8e4e2c0f800b7b664bc3521f0ee9bc98547f3cbec3effe2d8","integrity":"sha256-ViZUUnTebejk4sD4ALe2ZLw1IfDum8mFR/PL7D7/4tg="},"flags/1x1/br-746af5283e4e792a1a7f94d934cac1e45c94470c4ffd37df5d1ab10bec2fd4db.svg":{"logical_path":"flags/1x1/br.svg","mtime":"2022-05-22T18:31:04+02:00","size":7686,"digest":"38e5114c9912eb4f5f1944b4e43eeb96791ef552d855a2f16e177ce7ce145d5e","integrity":"sha256-OOURTJkS609fGUS05D7rlnke9VLYVaLxbhd8584UXV4="},"flags/4x3/bs-7b507794ee3f8d7e6b0c5739552e37cd2ab0596fab63a03f20fde4249cbf18d2.svg":{"logical_path":"flags/4x3/bs.svg","mtime":"2022-05-22T18:31:04+02:00","size":552,"digest":"d45540c1f333ad6b70ae998b317d6c545b2f608b896dc384da069459dd6f0838","integrity":"sha256-1FVAwfMzrWtwrpmLMX1sVFsvYIuJbcOE2gaUWd1vCDg="},"flags/1x1/bs-277f44ad225c320c1a44610721f5b3a457d7e3d649593b598d59e2ce5164f727.svg":{"logical_path":"flags/1x1/bs.svg","mtime":"2022-05-22T18:31:04+02:00","size":568,"digest":"f10d64856c57efee0f27b3e7960de782f38e026aa55402e801f10bd5ab505dcf","integrity":"sha256-8Q1khWxX7+4PJ7Pnlg3ngvOOAmqlVALoAfEL1atQXc8="},"flags/4x3/bt-2f99024e1cec950a6bce184bc2d8a27629efdab8178a28bad798881ac3167710.svg":{"logical_path":"flags/4x3/bt.svg","mtime":"2022-05-22T18:31:04+02:00","size":25227,"digest":"6f109e6e0465742b9a132f29d356bab77e47f8429263056d4dd77f1f6cdae063","integrity":"sha256-bxCebgRldCuaEy8p01a6t35H+EKSYwVtTdd/H2za4GM="},"flags/1x1/bt-77d4f8b9a2c3dadacce904304c524b507e2a0d4109cf6506aa8cc1c131c359ad.svg":{"logical_path":"flags/1x1/bt.svg","mtime":"2022-05-22T18:31:04+02:00","size":25045,"digest":"569e13412ede4f000d327ac29c21c49b051d6043719fdad19eabec3a04d44f36","integrity":"sha256-Vp4TQS7eTwANMnrCnCHEmwUdYENxn9rRnqvsOgTUTzY="},"flags/4x3/bv-de8bb212ed5afdf6d557928d784ed98d2e2baa7aaaf2ced7abc5cf13fa540423.svg":{"logical_path":"flags/4x3/bv.svg","mtime":"2022-05-22T18:31:04+02:00","size":585,"digest":"f251755196f171e5d7ab2684a09ce6dfef2037cc273bb14460934e1a2c1c538e","integrity":"sha256-8lF1UZbxceXXqyaEoJzm3+8gN8wnO7FEYJNOGiwcU44="},"flags/1x1/bv-4e4ae03e0878a6e689a0a2ebfe2b1b10fe58329a86acd73ee41f1a9c569f2cb3.svg":{"logical_path":"flags/1x1/bv.svg","mtime":"2022-05-22T18:31:04+02:00","size":582,"digest":"6be2ac5c2b7b353de7dd361efd3a55c228ba00ca60ade0b664d177e3182bbe8f","integrity":"sha256-a+KsXCt7NT3n3TYe/TpVwii6AMpgreC2ZNF34xgrvo8="},"flags/4x3/bw-76559252bbe0a305e9228103c5c34c39271a9d0b69f8f2b0dfbea5e18d7b37de.svg":{"logical_path":"flags/4x3/bw.svg","mtime":"2022-05-22T18:31:04+02:00","size":252,"digest":"115b2165fe0c1f881a45409a24bc3bcfd42de9a1cdad5686ed36b06c0d646262","integrity":"sha256-EVshZf4MH4gaRUCaJLw7z9Qt6aHNrVaG7TawbA1kYmI="},"flags/1x1/bw-3797276ece0055f7c569dc013b59174f613e956c714b5674c90e911615f61318.svg":{"logical_path":"flags/1x1/bw.svg","mtime":"2022-05-22T18:31:04+02:00","size":254,"digest":"df92e4d60f9cd10c1607dd60b8b10d63b10c9dbe30e0a026ad04670dc06a0e86","integrity":"sha256-35Lk1g+c0QwWB91guLENY7EMnb4w4KAmrQRnDcBqDoY="},"flags/4x3/by-7865b19bb46d15f8004699022907d7c8d07193121dac101a3724b7ca578ee3ba.svg":{"logical_path":"flags/4x3/by.svg","mtime":"2022-05-22T18:31:04+02:00","size":5962,"digest":"91b26dd7a972c1eba9a387e521bb4db94c891635bb0dd2b55238e4552ca39047","integrity":"sha256-kbJt16lyweupo4flIbtNuUyJFjW7DdK1UjjkVSyjkEc="},"flags/1x1/by-7bd37ee878e4225470de8cc284d66cf70785a0329da88b43e5f93e25c047b738.svg":{"logical_path":"flags/1x1/by.svg","mtime":"2022-05-22T18:31:04+02:00","size":6086,"digest":"b7ada8d1fb46487c83b827c16b69f51274e42c655fa537a7ffffa4b20468cafc","integrity":"sha256-t62o0ftGSHyDuCfBa2n1EnTkLGVfpTen//+ksgRoyvw="},"flags/4x3/bz-c8dfd550816ef86ff0fb82f9b31ca2467fcf50a7ba53e6163fe2bb01cccab0d5.svg":{"logical_path":"flags/4x3/bz.svg","mtime":"2022-05-22T18:31:04+02:00","size":46427,"digest":"173ecf7b1acfb23e569b7f305630bfe1a39943ebf504ad66ac3f5d613e121c9a","integrity":"sha256-Fz7PexrPsj5Wm38wVjC/4aOZQ+v1BK1mrD9dYT4SHJo="},"flags/1x1/bz-07baa0c080ae0dec236c42810db344f5b6e4209fe16bc9644cf998108b56b85c.svg":{"logical_path":"flags/1x1/bz.svg","mtime":"2022-05-22T18:31:04+02:00","size":46678,"digest":"1d05349d5a497be367155310b692e7aec42e80797378d748178b70d379da1249","integrity":"sha256-HQU0nVpJe+NnFVMQtpLnrsQugHlzeNdIF4tw03naEkk="},"flags/4x3/ca-f9229a913dece446e34e6de7245dfd3adbea059934b5beaed45654cef2f1cb1d.svg":{"logical_path":"flags/4x3/ca.svg","mtime":"2022-05-22T18:31:04+02:00","size":728,"digest":"5bda905693ffed32df95f79a8eeac1fbf062630de05f48875e109c35681e2331","integrity":"sha256-W9qQVpP/7TLflfeajurB+/BiYw3gX0iHXhCcNWgeIzE="},"flags/1x1/ca-47f58efb8689efb510291bb7b7a354c3e434e983914f0cc382e763ecccfa7a6e.svg":{"logical_path":"flags/1x1/ca.svg","mtime":"2022-05-22T18:31:04+02:00","size":708,"digest":"85ee89fa698c2efcad4817723fac44311ca520da3be63f52a10e21c3f65e8fad","integrity":"sha256-he6J+mmMLvytSBdyP6xEMRylINo75j9SoQ4hw/Zej60="},"flags/4x3/cc-acf43807923322e2e43deef84443007b75d0d21ebb8a85d0d4e2837e998798c8.svg":{"logical_path":"flags/4x3/cc.svg","mtime":"2022-05-22T18:31:04+02:00","size":3123,"digest":"d49eb3730b2cbe3eaa7028d5bd5f425caafd83154cf47523c27279c10257d3f6","integrity":"sha256-1J6zcwssvj6qcCjVvV9CXKr9gxVM9HUjwnJ5wQJX0/Y="},"flags/1x1/cc-827355b0b5c0a98cd0b479c7914c62d1de7712c643978941a97741c13ee69891.svg":{"logical_path":"flags/1x1/cc.svg","mtime":"2022-05-22T18:31:04+02:00","size":3083,"digest":"7c46b5f38449f3320ae45f9511a36e1b1c22894f84977c235208ebfb8dea9970","integrity":"sha256-fEa184RJ8zIK5F+VEaNuGxwiiU+El3wjUgjr+43qmXA="},"flags/4x3/cd-594addda580762e53242cc9e5a3885cc200d6b92c9453b65242c0038e4e22959.svg":{"logical_path":"flags/4x3/cd.svg","mtime":"2022-05-22T18:31:04+02:00","size":349,"digest":"3e5799ffef91d8cb30dc6b847867e209e82cbffe277445202c5f291d36ef0248","integrity":"sha256-PleZ/++R2Msw3GuEeGfiCegsv/4ndEUgLF8pHTbvAkg="},"flags/1x1/cd-6f390c3dac0d0d278ea6593bb615e3e23a94f7e84cc40b917e47bdce520a3a2b.svg":{"logical_path":"flags/1x1/cd.svg","mtime":"2022-05-22T18:31:04+02:00","size":507,"digest":"600e736963214a9f6701463345f91b569dab9e68f7668317df2f40def88e2d6e","integrity":"sha256-YA5zaWMhSp9nAUYzRfkbVp2rnmj3ZoMX3y9A3viOLW4="},"flags/4x3/cf-31a4f1c7e55d90551235336b339544920b01a8a4fb27efd5b18d0a68ea908f0e.svg":{"logical_path":"flags/4x3/cf.svg","mtime":"2022-05-22T18:31:04+02:00","size":691,"digest":"44e68fe825719854c92a8285944e619288d5f651fd17f874153081449c100d1f","integrity":"sha256-ROaP6CVxmFTJKoKFlE5hkojV9lH9F/h0FTCBRJwQDR8="},"flags/1x1/cf-820b63e306c3eec593028576d9ea830f24526b8e4c8a51cec04f4a1851f1f781.svg":{"logical_path":"flags/1x1/cf.svg","mtime":"2022-05-22T18:31:04+02:00","size":632,"digest":"b3a61e22f7d8bdc611d532720cf8ed292eab336063c5699036755dc160154175","integrity":"sha256-s6YeIvfYvcYR1TJyDPjtKS6rM2BjxWmQNnVdwWAVQXU="},"flags/4x3/cg-cb3b4a7be309eae587becb687690e332624b75d8a40481abd13a4d8a3c685a87.svg":{"logical_path":"flags/4x3/cg.svg","mtime":"2022-05-22T18:31:04+02:00","size":487,"digest":"7e4f9efc379203b9cc9677042de4c07bd411308c80074919035c08fe131dbca2","integrity":"sha256-fk+e/DeSA7nMlncELeTAe9QRMIyAB0kZA1wI/hMdvKI="},"flags/1x1/cg-3b7d163f2951bc21e895dbead028c79b8f97dc4a95f9d9ca76d78b398025a20b.svg":{"logical_path":"flags/1x1/cg.svg","mtime":"2022-05-22T18:31:04+02:00","size":469,"digest":"20a742a21789fc04344e90463c05b35ee2fe86a624d3b6432b4edd6bd3fe651d","integrity":"sha256-IKdCoheJ/AQ0TpBGPAWzXuL+hqYk07ZDK07da9P+ZR0="},"flags/4x3/ch-d32cf51d10ea8174a3e8725e620c5bd13511a6a6c676d3c807e6ad82017f6178.svg":{"logical_path":"flags/4x3/ch.svg","mtime":"2022-05-22T18:31:04+02:00","size":297,"digest":"4e94e5c3a524345e7c24f3807ab2ca812225ea6ccdb59ec67125b0ea3ed02cd5","integrity":"sha256-TpTlw6UkNF58JPOAerLKgSIl6mzNtZ7GcSWw6j7QLNU="},"flags/1x1/ch-ff30c29ed89a29db4cae89e8f4915e573c75dd7ad377e5ac7987c956fb68a141.svg":{"logical_path":"flags/1x1/ch.svg","mtime":"2022-05-22T18:31:04+02:00","size":295,"digest":"a0660f7371c42a1e8be299a9ff0d762ed12b578ea438df33890aae8eba431106","integrity":"sha256-oGYPc3HEKh6L4pmp/w12LtErV46kON8ziQqujrpDEQY="},"flags/4x3/ci-70e248e97c577c3ab3a85a8a76e5f20ef0bfd2c2a3c190746e625fa37edbbec9.svg":{"logical_path":"flags/4x3/ci.svg","mtime":"2022-05-22T18:31:04+02:00","size":280,"digest":"d7fd4124cb8f4d9cc2d70bd2c87543fd279750bd7082d51e5916fea65847e992","integrity":"sha256-1/1BJMuPTZzC1wvSyHVD/SeXUL1wgtUeWRb+plhH6ZI="},"flags/1x1/ci-fb50e5c5558e915f5cd4060bd75d63e43ed4a2af1cf77caf1d184d8e5b3c888b.svg":{"logical_path":"flags/1x1/ci.svg","mtime":"2022-05-22T18:31:04+02:00","size":283,"digest":"ba7f763547ca1b9243fcf644d83f3100546f7fe557f22fb380b5fcddef7e02bc","integrity":"sha256-un92NUfKG5JD/PZE2D8xAFRvf+VX8i+zgLX83e9+Arw="},"flags/4x3/ck-a86d1e54e265e2de5155595e838ec7c3db3ca23f563336885d7c5d17888c4709.svg":{"logical_path":"flags/4x3/ck.svg","mtime":"2022-05-22T18:31:04+02:00","size":2097,"digest":"95e850b027e198e275840a2c96fde8be006f7c4b50d274c2da10dcfad50d3cf8","integrity":"sha256-lehQsCfhmOJ1hAoslv3ovgBvfEtQ0nTC2hDc+tUNPPg="},"flags/1x1/ck-a0d6f5ca82965ef1838549666bef9735b619c40bcf791850f092486b1fa3831d.svg":{"logical_path":"flags/1x1/ck.svg","mtime":"2022-05-22T18:31:04+02:00","size":2020,"digest":"a60ec48dfd291bcf6e032345fdcf72edc995efaeb749534a38d192d81891b754","integrity":"sha256-pg7Ejf0pG89uAyNF/c9y7cmV7663SVNKONGS2BiRt1Q="},"flags/4x3/cl-0bec6c3cc4d36bbf245a3be22c10b8ff9c25996bb372a916e365e3274e62ccfb.svg":{"logical_path":"flags/4x3/cl.svg","mtime":"2022-05-22T18:31:04+02:00","size":563,"digest":"b0c3f433217a039247b2c7f3f8694d05237ba684726b604a33c102d10f279fde","integrity":"sha256-sMP0MyF6A5JHssfz+GlNBSN7poRya2BKM8EC0Q8nn94="},"flags/1x1/cl-8dc4289cd2cba6ac3f07519957f3cbd582f59e1153d655871a507bc0559fc93f.svg":{"logical_path":"flags/1x1/cl.svg","mtime":"2022-05-22T18:31:04+02:00","size":574,"digest":"250f409f558fe17f01f32614ebf6275c2fcce776ce50ec959642babbc67036e0","integrity":"sha256-JQ9An1WP4X8B8yYU6/YnXC/M53bOUOyVlkK6u8ZwNuA="},"flags/4x3/cm-8832f17145686399c412437f6762b4de6afb48fcc409590b7b09e593fe3b08d5.svg":{"logical_path":"flags/4x3/cm.svg","mtime":"2022-05-22T18:31:04+02:00","size":824,"digest":"1b2e52b5962f38e58da1973b23796ccefae0e82321856c61bda68bd3f277ea6f","integrity":"sha256-Gy5StZYvOOWNoZc7I3lszvrg6CMhhWxhvaaL0/J36m8="},"flags/1x1/cm-4ba39a0a5fe36564e132e7a4d0f881ca10e95b0824157253a9180b2fe0089553.svg":{"logical_path":"flags/1x1/cm.svg","mtime":"2022-05-22T18:31:04+02:00","size":824,"digest":"809ea5ab516c4e59ee5f90c4b0515365c3d41d77544ff10abb1dea88c9f377e4","integrity":"sha256-gJ6lq1FsTlnuX5DEsFFTZcPUHXdUT/EKux3qiMnzd+Q="},"flags/4x3/cn-865ae68cc9042422bae55dba123af75dfab352069aa15121385a739c57caf1aa.svg":{"logical_path":"flags/4x3/cn.svg","mtime":"2022-05-22T18:31:04+02:00","size":801,"digest":"e80d714480a795617992d733d0678e5ad5025f8852b35d20a402a78fce4ccaf8","integrity":"sha256-6A1xRICnlWF5ktcz0GeOWtUCX4hSs10gpAKnj85Myvg="},"flags/1x1/cn-cdf756a16521136b99d38c241ee5df601912f290c6bafd45f7a5f73f916ed8ed.svg":{"logical_path":"flags/1x1/cn.svg","mtime":"2022-05-22T18:31:04+02:00","size":743,"digest":"ab9a2dc6b1aaeaa7017b96904b7a760517ac9e57ee589ee6dd1238c7754bd8f6","integrity":"sha256-q5otxrGq6qcBe5aQS3p2BResnlfuWJ7m3RI4x3VL2PY="},"flags/4x3/co-48603194a139754c8c7908f4d0c8181ca6729a221de897e8e5d26c9a3f211b1d.svg":{"logical_path":"flags/4x3/co.svg","mtime":"2022-05-22T18:31:04+02:00","size":289,"digest":"bc15eabb8dc37b36d7be228c68a2f7a62957a3ba9e4d8c35db50b919c9d150da","integrity":"sha256-vBXqu43DezbXviKMaKL3pilXo7qeTYw121C5GcnRUNo="},"flags/1x1/co-0be1e3cef708f4f0f979a3c36bdcb4046a45693846dc9b9e5be2ea5f1c536667.svg":{"logical_path":"flags/1x1/co.svg","mtime":"2022-05-22T18:31:04+02:00","size":289,"digest":"cb36ae4084e1e678bed8e0a64397e0109f9afc95c241a04c8e3da36a577cfaf2","integrity":"sha256-yzauQITh5ni+2OCmQ5fgEJ+a/JXCQaBMjj2jald8+vI="},"flags/4x3/cr-127b7f2e0f6ebe8c62885fd78f6a3dc167624e8e7b5fac79d4b8f3054b798a92.svg":{"logical_path":"flags/4x3/cr.svg","mtime":"2022-05-22T18:31:04+02:00","size":293,"digest":"12fe80c814de382b53955ab5223514278f7b4985f51c32fd1f60356280e1e5cd","integrity":"sha256-Ev6AyBTeOCtTlVq1IjUUJ497SYX1HDL9H2A1YoDh5c0="},"flags/1x1/cr-80711b24354b0eedd247bbd77352db3bc9ad586c31d0a8727a4400368e56b2c4.svg":{"logical_path":"flags/1x1/cr.svg","mtime":"2022-05-22T18:31:04+02:00","size":293,"digest":"c7830f0e5b8025c1f9205b2d89ce1b7ac81ec64f6a9e9093da9a2d9e05206b49","integrity":"sha256-x4MPDluAJcH5IFstic4besgexk9qnpCT2potngUga0k="},"flags/4x3/cu-c72751747322de6b51b1dd462d04d0b533fa1e1c68f51b3c90d19ec683c2af3a.svg":{"logical_path":"flags/4x3/cu.svg","mtime":"2022-05-22T18:31:04+02:00","size":622,"digest":"0a09bdca54a5347ba1238476ea90ea7d7d99fec7163df43e762313ddbce9b145","integrity":"sha256-Cgm9ylSlNHuhI4R26pDqfX2Z/scWPfQ+diMT3bzpsUU="},"flags/1x1/cu-ec5f9adfe3639f609ebf60d933d6500a0a9a5d77f9c8d5ec6a2f0d0ec2efd5a4.svg":{"logical_path":"flags/1x1/cu.svg","mtime":"2022-05-22T18:31:04+02:00","size":573,"digest":"f5f7e6c58d9ee8046fb142f0d35f23df7e49763b35305b7fcc719db23554b404","integrity":"sha256-9ffmxY2e6ARvsULw018j335Jdjs1MFt/zHGdsjVUtAQ="},"flags/4x3/cv-029b4bd4d5c58ee3479b9a5fd3700923efa4881282225ac47690a3955472b7f1.svg":{"logical_path":"flags/4x3/cv.svg","mtime":"2022-05-22T18:31:04+02:00","size":1415,"digest":"3ab6aaaf11d9a3a6f2fba17248ea85d36967163214e98b0bb30123d0b3def532","integrity":"sha256-OraqrxHZo6by+6FySOqF02lnFjIU6YsLswEj0LPe9TI="},"flags/1x1/cv-750969622373a36a416fc64118f1cb5407764d508f99b7db720f2ab474b93ebf.svg":{"logical_path":"flags/1x1/cv.svg","mtime":"2022-05-22T18:31:04+02:00","size":1357,"digest":"698aea344d6bb9f87de513ff525d16fdb2590ad1cd7b2d1200878c1e7cd2ce64","integrity":"sha256-aYrqNE1rufh95RP/Ul0W/bJZCtHNey0SAIeMHnzSzmQ="},"flags/4x3/cw-f3c7dc011a64c13ebab21e47baaea3e0fea8d83f83fd8cc1845630a5f78ce087.svg":{"logical_path":"flags/4x3/cw.svg","mtime":"2022-05-22T18:31:04+02:00","size":681,"digest":"186b6d2347845c903689468db9a51cec41d7458461725fcdcecab27eebc3c376","integrity":"sha256-GGttI0eEXJA2iUaNuaUc7EHXRYRhcl/NzsqyfuvDw3Y="},"flags/1x1/cw-48a78eb5e8abd98b90ae7b373746bbd58851c76eb305ca0e7d8081df9180f248.svg":{"logical_path":"flags/1x1/cw.svg","mtime":"2022-05-22T18:31:04+02:00","size":682,"digest":"e1c281f45124597730be155051b4628bf25974ff4dac5f990262c5f074ab7484","integrity":"sha256-4cKB9FEkWXcwvhVQUbRii/JZdP9NrF+ZAmLF8HSrdIQ="},"flags/4x3/cx-9033ee142f06aac6b700968943103e6dba8ce3171b17f7f7d54f26c35387c022.svg":{"logical_path":"flags/4x3/cx.svg","mtime":"2022-05-22T18:31:04+02:00","size":2455,"digest":"aaf17168e49e9efc24b259929e40b7b135f78f4ee327577ab57e9a14fe8dfe9d","integrity":"sha256-qvFxaOSenvwkslmSnkC3sTX3j07jJ1d6tX6aFP6N/p0="},"flags/1x1/cx-f8356811ad67ac25c4a8c22bba7468615f8a0bcb09e4d8da09ad3806febc7d1b.svg":{"logical_path":"flags/1x1/cx.svg","mtime":"2022-05-22T18:31:04+02:00","size":2496,"digest":"8af706f9e34d7867578f025a073e033c901b05012519a65bac5d319b961f1a99","integrity":"sha256-ivcG+eNNeGdXjwJaBz4DPJAbBQElGaZbrF0xm5YfGpk="},"flags/4x3/cy-86c9999efa3399db043be615d16558ec0e40feafe9325fe1b6422ff0e089a60c.svg":{"logical_path":"flags/4x3/cy.svg","mtime":"2022-05-22T18:31:04+02:00","size":5866,"digest":"88d041c0eec06dab21e4d9c777ead616f2ab97eedef8b619f78f95dd51e74ab7","integrity":"sha256-iNBBwO7Abash5NnHd+rWFvKrl+7e+LYZ94+V3VHnSrc="},"flags/1x1/cy-67835af18d83749f0ac63e160db340d7a83b2e189e5e5b715b49c4b922fbb4ff.svg":{"logical_path":"flags/1x1/cy.svg","mtime":"2022-05-22T18:31:04+02:00","size":5955,"digest":"0e1f361ed98ca9f027657583276d0f0e404fcedc95cb314fd5122793e4cec9ba","integrity":"sha256-Dh82HtmMqfAnZXWDJ20PDkBPztyVyzFP1RInk+TOybo="},"flags/4x3/cz-e8f891c91f0889f53815958ed9c0d0472c03ecf58c5b8d3d87a864ede0e57ce0.svg":{"logical_path":"flags/4x3/cz.svg","mtime":"2022-05-22T18:31:04+02:00","size":484,"digest":"a094f93ce465415ead374aa60fb7ea55921b956683f2809d6a08b1af81ffd609","integrity":"sha256-oJT5PORlQV6tN0qmD7fqVZIblWaD8oCdagixr4H/1gk="},"flags/1x1/cz-de11cacecaee1ed952a170fa43d318b01507ae9c8b0ab16b96f53848676326c7.svg":{"logical_path":"flags/1x1/cz.svg","mtime":"2022-05-22T18:31:04+02:00","size":480,"digest":"fca144bdc4bc563cc612a0bc931738ab096a362323982a4ac1e2f74d66792c77","integrity":"sha256-/KFEvcS8VjzGEqC8kxc4qwlqNiMjmCpKweL3TWZ5LHc="},"flags/4x3/de-dcf5931120e541ce9e83e97c37cf95eeac9a152cd5e5ed9e0bf58116943d7250.svg":{"logical_path":"flags/4x3/de.svg","mtime":"2022-05-22T18:31:04+02:00","size":213,"digest":"226631a8fa9deee07022680ce0461b7a09b416b616c56ebcaf21f50e2b34ea8f","integrity":"sha256-ImYxqPqd7uBwImgM4EYbegm0FrYWxW68ryH1Dis06o8="},"flags/1x1/de-3479e75f866450220db28ef3ebb1ba0c345c059ed67de62c4176a09572da8f32.svg":{"logical_path":"flags/1x1/de.svg","mtime":"2022-05-22T18:31:04+02:00","size":221,"digest":"d7cc619b1c880981e17adba3bd44cb8addfff1d63e7cb2b4d59a88abe5ff31e0","integrity":"sha256-18xhmxyICYHhetujvUTLit3/8dY+fLK01ZqIq+X/MeA="},"flags/4x3/dj-e69892f8499ec8d780cdd20b051f936d5471eb92efd519b93be9d10f31382c77.svg":{"logical_path":"flags/4x3/dj.svg","mtime":"2022-05-22T18:31:04+02:00","size":591,"digest":"55b23581525743a29fb3602ae988dc91e8f6f5ea07d66337ea8051bf92e7c3ae","integrity":"sha256-VbI1gVJXQ6Kfs2Aq6Yjckej29eoH1mM36oBRv5Lnw64="},"flags/1x1/dj-49721ea1deeb6e17f32ee2b3617d27961ad256505849243843f0fd5697332b18.svg":{"logical_path":"flags/1x1/dj.svg","mtime":"2022-05-22T18:31:04+02:00","size":585,"digest":"ffd9ebcba08793bb8ed7e508cd1187d9e867e43ca0c9c669c6eca2a7c0e61896","integrity":"sha256-/9nry6CHk7uO1+UIzRGH2ehn5DygycZpxuyip8DmGJY="},"flags/4x3/dk-d50cdf2f88be249eb116da08c38cf119d44246ab4f5d62a94feefd37da149019.svg":{"logical_path":"flags/4x3/dk.svg","mtime":"2022-05-22T18:31:04+02:00","size":239,"digest":"c29517b4eb6b056475330a26a3f929c0523ef80268a8457ca5d44a7def3cdf44","integrity":"sha256-wpUXtOtrBWR1Mwomo/kpwFI++AJoqEV8pdRKfe8830Q="},"flags/1x1/dk-24ccaa605d1f01e33802197d416654b64fac3f3d28ba90b5f6094c17dfe95344.svg":{"logical_path":"flags/1x1/dk.svg","mtime":"2022-05-22T18:31:04+02:00","size":235,"digest":"feeb27682ce93b2e5fe14a32a67aa7141f505725daf8b6018864b0bbec103469","integrity":"sha256-/usnaCzpOy5f4UoypnqnFB9QVyXa+LYBiGSwu+wQNGk="},"flags/4x3/dm-24faadaf18d5651beccc45688ef3421d2d083b5f2e92cab50c414e487a899095.svg":{"logical_path":"flags/4x3/dm.svg","mtime":"2022-05-22T18:31:04+02:00","size":15975,"digest":"80221b928ecc38c82c3d290b36be1c6c9388a51e9533c31c197016b00e63b070","integrity":"sha256-gCIbko7MOMgsPSkLNr4cbJOIpR6VM8McGXAWsA5jsHA="},"flags/1x1/dm-4f6888ba822d1592b9751c198ae6aafd1c14630be57d7e3b4372e3df8eb4f201.svg":{"logical_path":"flags/1x1/dm.svg","mtime":"2022-05-22T18:31:04+02:00","size":16457,"digest":"e5d72576962d7a5ecd56631c5a2541c1359f15f086a3d384c563983c40fc2711","integrity":"sha256-5dcldpYtel7NVmMcWiVBwTWfFfCGo9OExWOYPED8JxE="},"flags/4x3/do-43538ca280e65a4eb8b38992290cda974a7f631ae18f3e6864dc6f61397ab514.svg":{"logical_path":"flags/4x3/do.svg","mtime":"2022-05-22T18:31:04+02:00","size":393849,"digest":"d399ea939e23c000ce12ba4f7c4d4abccdd28f783248b819ebb20b90546f619f","integrity":"sha256-05nqk54jwADOErpPfE1KvM3Sj3gySLgZ67ILkFRvYZ8="},"flags/1x1/do-1164fc19d2a5f2299e84d59627b780ff9dcba335acaa19a4acacd4781d916b78.svg":{"logical_path":"flags/1x1/do.svg","mtime":"2022-05-22T18:31:04+02:00","size":391369,"digest":"2af33aacc98dde2ca5cc2f3499370e9715b5f76b5ca7446de00490083346754c","integrity":"sha256-KvM6rMmN3iylzC80mTcOlxW192tcp0Rt4ASQCDNGdUw="},"flags/4x3/dz-1b56086fc67c067d339838fc63e8f98faea641560b14839260546c895bdf4768.svg":{"logical_path":"flags/4x3/dz.svg","mtime":"2022-05-22T18:31:04+02:00","size":294,"digest":"6a1e2abb0d8a33b0209a37123e44710b4b27b50723a5d2ab7fb8746c88447cf6","integrity":"sha256-ah4quw2KM7AgmjcSPkRxC0sntQcjpdKrf7h0bIhEfPY="},"flags/1x1/dz-b9527d30bdb9d67fba87351df4d4340fcc1c0dce368f0371359e5fcf7d445f3b.svg":{"logical_path":"flags/1x1/dz.svg","mtime":"2022-05-22T18:31:04+02:00","size":305,"digest":"75568129d430536c4a994d05f114e0b1b91e10af7350d635f2da721f73d4871c","integrity":"sha256-dVaBKdQwU2xKmU0F8RTgsbkeEK9zUNY18tpyH3PUhxw="},"flags/4x3/ec-d6df0532653f0a2a3ccdee80854ad75c4a4fe4a360fc5d5c73865253ebfc6b7f.svg":{"logical_path":"flags/4x3/ec.svg","mtime":"2022-05-22T18:31:04+02:00","size":29320,"digest":"63bf6e3ac63634199c0929715a715109f8ad229c526c08bfbe7f6a7a9f30fcde","integrity":"sha256-Y79uOsY2NBmcCSlxWnFRCfitIpxSbAi/vn9qep8w/N4="},"flags/1x1/ec-a1a0b637c3d12b488cd180746ea10e42e659907c99c0b3d9eec65415494b5321.svg":{"logical_path":"flags/1x1/ec.svg","mtime":"2022-05-22T18:31:04+02:00","size":29875,"digest":"672567f45dcd0d543af21e7518c41bf8fe74fa090141736b414697b682971f84","integrity":"sha256-ZyVn9F3NDVQ68h51GMQb+P50+gkBQXNrQUaXtoKXH4Q="},"flags/4x3/ee-2e52e01e34f175e856e120e57184ce61eccb5bff94633d3f2effcfed765f610b.svg":{"logical_path":"flags/4x3/ee.svg","mtime":"2022-05-22T18:31:04+02:00","size":321,"digest":"b4c2ebcd79e821fb8ee37e39d688560a79dee100a981402224a4f2bd9762e41e","integrity":"sha256-tMLrzXnoIfuO43451ohWCnne4QCpgUAiJKTyvZdi5B4="},"flags/1x1/ee-1058c4a95d48696c8c99608a104e756d4ac5c431a7a1f60e179769416c443420.svg":{"logical_path":"flags/1x1/ee.svg","mtime":"2022-05-22T18:31:04+02:00","size":352,"digest":"53df0c62e5835adce98e59520ae55ddb9f2a35882c5aba2ccb4021d6b0ee88fd","integrity":"sha256-U98MYuWDWtzpjllSCuVd258qNYgsWrosy0Ah1rDuiP0="},"flags/4x3/eg-2b5a88cf9ab7a59447e6a3e3cc12d350c573719d2a90810d50ed7695a1591d30.svg":{"logical_path":"flags/4x3/eg.svg","mtime":"2022-05-22T18:31:04+02:00","size":9899,"digest":"83f4a01c0e76210691d46b0cff7ec97b6ed93290c32a1e94fab96efd3d9b7d42","integrity":"sha256-g/SgHA52IQaR1GsM/37Je27ZMpDDKh6U+rlu/T2bfUI="},"flags/1x1/eg-ded55c3561ee2003ede5cc35af88959adb2398badc3c63dcc40e320d5bdb6c97.svg":{"logical_path":"flags/1x1/eg.svg","mtime":"2022-05-22T18:31:04+02:00","size":9913,"digest":"6234c7747c535705d9b6725f4a6a09158774f288cb14d7e99295822c4e561c22","integrity":"sha256-YjTHdHxTVwXZtnJfSmoJFYd08ojLFNfpkpWCLE5WHCI="},"flags/4x3/eh-250c6f7e1db483fb08f682d4917c06741614edb0a093aa80c0fe57f9bff03eba.svg":{"logical_path":"flags/4x3/eh.svg","mtime":"2022-05-22T18:31:04+02:00","size":873,"digest":"62f153a1a4ea6e8ed2f79f26ed10eccbbb295bed16ecb46f4e77a6f5f49df639","integrity":"sha256-YvFToaTqbo7S958m7RDsy7spW+0W7LRvTnem9fSd9jk="},"flags/1x1/eh-ae52d9c4377873ea1db474ef820d87e956753992097bbce93118c836f27c5598.svg":{"logical_path":"flags/1x1/eh.svg","mtime":"2022-05-22T18:31:04+02:00","size":817,"digest":"15abbba286e48ba50c4aec3b765d8c05f9b4c53ae385a7c8a38d3cebd688b03c","integrity":"sha256-Fau7oobki6UMSuw7dl2MBfm0xTrjhafIo40869aIsDw="},"flags/4x3/er-13b1d5072a285b78863f33088676ff459fc9049e403c4427d0bf149ab8a65eac.svg":{"logical_path":"flags/4x3/er.svg","mtime":"2022-05-22T18:31:04+02:00","size":3187,"digest":"4c57685960d0cd27bc4ee6cc8356f2ed8d0a5cc54a22b5b503529091705a2b04","integrity":"sha256-TFdoWWDQzSe8TubMg1by7Y0KXMVKIrW1A1KQkXBaKwQ="},"flags/1x1/er-516d763b5c3ddf087968e8e2ce10eb9f6a162e98b1c586ae90f7ebc2a9e877e6.svg":{"logical_path":"flags/1x1/er.svg","mtime":"2022-05-22T18:31:04+02:00","size":3371,"digest":"29ca0e1f31a14f5ee5674a3fcec9aec0ec652b458b66cffd60ac0839fc364729","integrity":"sha256-KcoOHzGhT17lZ0o/zsmuwOxlK0WLZs/9YKwIOfw2Ryk="},"flags/4x3/es-85290c103c538de1b8629c7a609319f01fc5a63a24655946e6003740d30f1534.svg":{"logical_path":"flags/4x3/es.svg","mtime":"2022-05-22T18:31:04+02:00","size":90819,"digest":"ab3d438837b7f1c4ebce6980cc9274cd2e6adcc8af9be6f5cfc47ef2c4c464e3","integrity":"sha256-qz1DiDe38cTrzmmAzJJ0zS5q3Mivm+b1z8R+8sTEZOM="},"flags/1x1/es-582d90241cc77269d8eeaa709ee9345c4e3935b7c20f9d3f04d707800c554896.svg":{"logical_path":"flags/1x1/es.svg","mtime":"2022-05-22T18:31:04+02:00","size":92546,"digest":"bfe2d95adf69f339badcf901e33d12c0b6146d7d16a1100b12c3abc13dc3521c","integrity":"sha256-v+LZWt9p8zm63PkB4z0SwLYUbX0WoRALEsOrwT3DUhw="},"flags/4x3/et-818e867ed44592f1c476d5abd8d9e5b60bb1e485f01076a633f5304fee7990d4.svg":{"logical_path":"flags/4x3/et.svg","mtime":"2022-05-22T18:31:04+02:00","size":1233,"digest":"e28f1f69ecf1b26e002d8c8dad55ec8af5e822b3cca7f111c399e72b4e0f9c79","integrity":"sha256-4o8faezxsm4ALYyNrVXsivXoIrPMp/ERw5nnK04PnHk="},"flags/1x1/et-7e2476975a4837f67af86aa6556d382dfd6769922a47ee9a49ef81a540c0f3b7.svg":{"logical_path":"flags/1x1/et.svg","mtime":"2022-05-22T18:31:04+02:00","size":1226,"digest":"59795d6d33015e4ec1042861541df6c2034e8e1880869d695a1fea5a951e2e71","integrity":"sha256-WXldbTMBXk7BBChhVB32wgNOjhiAhp1pWh/qWpUeLnE="},"flags/4x3/fi-262396615a680200f7709a9a998a1f346db6de48844bb0a76d8c41d0d8dfb466.svg":{"logical_path":"flags/4x3/fi.svg","mtime":"2022-05-22T18:31:04+02:00","size":237,"digest":"83783a7dc69702dfbb59833d81c309748ffb04574aab8ed1cb7589189c0f80d2","integrity":"sha256-g3g6fcaXAt+7WYM9gcMJdI/7BFdKq47Ry3WJGJwPgNI="},"flags/1x1/fi-cdfc9cc3908d4f0d534fb34853fda8db5981195204ab6219bad3aa3cf90ecfa6.svg":{"logical_path":"flags/1x1/fi.svg","mtime":"2022-05-22T18:31:04+02:00","size":240,"digest":"6c32372acfba871cdcd22614f0ebbf58ea2b88de648ee4e843a2bbda5c0a3336","integrity":"sha256-bDI3Ks+6hxzc0iYU8Ou/WOoriN5kjuToQ6K72lwKMzY="},"flags/4x3/fj-fd0cc7fe3c27f0c999ce61d40b0143ca536d9d39875c524bb20afe5ccd55e40c.svg":{"logical_path":"flags/4x3/fj.svg","mtime":"2022-05-22T18:31:04+02:00","size":27237,"digest":"4972d31a0e0d2516c08a305844e5310bf8963d7cca69cc86ed4ed2e121f41be9","integrity":"sha256-SXLTGg4NJRbAijBYROUxC/iWPXzKacyG7U7S4SH0G+k="},"flags/1x1/fj-930160f9247a73774021c9d019dfedc21ed09934db523690ca76f0a7e1a2d9d1.svg":{"logical_path":"flags/1x1/fj.svg","mtime":"2022-05-22T18:31:04+02:00","size":27518,"digest":"36ff3e628fc0bee99878cc9740e54a7b95e9599c263595b5db0c8be2c6ab8978","integrity":"sha256-Nv8+Yo/AvumYeMyXQOVKe5XpWZwmNZW12wyL4sariXg="},"flags/4x3/fk-5d5fdf224c1455f03c84d85f587463d8c511ff86dd5592f216a7470989175e42.svg":{"logical_path":"flags/4x3/fk.svg","mtime":"2022-05-22T18:31:04+02:00","size":31973,"digest":"6d11c1ecbf413d27f4068e211b7f5f46e83b9067c9fd73ea9c3f5d48c7bbb457","integrity":"sha256-bRHB7L9BPSf0Bo4hG39fRug7kGfJ/XPqnD9dSMe7tFc="},"flags/1x1/fk-b614bdecd7ba844a5885a5acfb6b658bf649dd72d095844abdd4cf14860685c4.svg":{"logical_path":"flags/1x1/fk.svg","mtime":"2022-05-22T18:31:04+02:00","size":31798,"digest":"2705e5d996f753fdd666b1d3a7c6f4085adc070be85957ba71fa1f07f17eca79","integrity":"sha256-JwXl2Zb3U/3WZrHTp8b0CFrcBwvoWVe6cfofB/F+ynk="},"flags/4x3/fm-6e665d3e05ae726fee0ced73ae84ce1d0596e80cb3dafce78d0c56dbc3018584.svg":{"logical_path":"flags/4x3/fm.svg","mtime":"2022-05-22T18:31:04+02:00","size":776,"digest":"881458469239020624b90d2601d347330d21dd7b512c011cba2bcb0c4dc4ea75","integrity":"sha256-iBRYRpI5AgYkuQ0mAdNHMw0h3XtRLAEcuivLDE3E6nU="},"flags/1x1/fm-c59efd1b95788946440a90610eac4f3222be5fbfb5748c076eabd0d4b6b8613e.svg":{"logical_path":"flags/1x1/fm.svg","mtime":"2022-05-22T18:31:04+02:00","size":759,"digest":"0b0d81c2932c2a3a114f5095a9e89e6ac274c54d0cd9e794136a339ad4df8cb4","integrity":"sha256-Cw2BwpMsKjoRT1CVqeieasJ0xU0M2eeUE2ozmtTfjLQ="},"flags/4x3/fo-e2bcddb90777676679c7d680f18bcace56143f3a6bb0618ce59e4bf863b9e58e.svg":{"logical_path":"flags/4x3/fo.svg","mtime":"2022-05-22T18:31:04+02:00","size":570,"digest":"c0b32df51365a3947ddcda18c15575c5c617b75b29330d78e606e684f3304334","integrity":"sha256-wLMt9RNlo5R93NoYwVV1xcYXt1spMw145gbmhPMwQzQ="},"flags/1x1/fo-c9e403639ac04f28b0c86fc370ac5a106213f2ecf2ffc291cb9cd0ec2c000d8b.svg":{"logical_path":"flags/1x1/fo.svg","mtime":"2022-05-22T18:31:04+02:00","size":534,"digest":"5910fc8006f125ce3c7ec5b93b86ccbe0a79e5fbc2e60a9a9b481c882d1bac7c","integrity":"sha256-WRD8gAbxJc48fsW5O4bMvgp55fvC5gqam0gciC0brHw="},"flags/4x3/fr-14bbb212b68a54751cbf4354dc9ca16bf4fd671fba4bfd0e77fb855fc55ce884.svg":{"logical_path":"flags/4x3/fr.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"63667b36ddd95d29a9f163e3ab4b9f7000dcd310350c565c19b975a0a2418117","integrity":"sha256-Y2Z7Nt3ZXSmp8WPjq0ufcADc0xA1DFZcGbl1oKJBgRc="},"flags/1x1/fr-8b9d16b144204ecd34289bf1f0e06e57ad03a889a3813463de8e1a25005da5ec.svg":{"logical_path":"flags/1x1/fr.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"5d247ee39647a05667b52e04510b76ae465c009da242ff8d98637d138ea410ff","integrity":"sha256-XSR+45ZHoFZntS4EUQt2rkZcAJ2iQv+NmGN9E46kEP8="},"flags/4x3/ga-ae7daae3629bfa925e336323a198a018ae2007a1ea2ab9ba32d4b110e0abc7d4.svg":{"logical_path":"flags/4x3/ga.svg","mtime":"2022-05-22T18:31:04+02:00","size":274,"digest":"6cf1908ef7a47d61ead3f969bb5dfb96e4b691b66291e2cd7dc71c513d1a5659","integrity":"sha256-bPGQjvekfWHq0/lpu137luS2kbZikeLNfcccUT0aVlk="},"flags/1x1/ga-1a903d6903087e08d16b56a27741cd1ea2c0685fbd325e9c4cef45d7fb00ccc3.svg":{"logical_path":"flags/1x1/ga.svg","mtime":"2022-05-22T18:31:04+02:00","size":278,"digest":"2b2ea5084b741bf0b1dd1ebc87ee72e4e9fad78046275d37becb41831d259686","integrity":"sha256-Ky6lCEt0G/Cx3R68h+5y5On614BGJ103vstBgx0lloY="},"flags/4x3/gb-14e43b4df91315b33ed5f8ad46d9e84f43f84be11c65148bca043808832cab95.svg":{"logical_path":"flags/4x3/gb.svg","mtime":"2022-05-22T18:31:04+02:00","size":538,"digest":"825310f9bcc8892559317bfc87fc28d5d7bad06c02d562b5740aafcf4b040803","integrity":"sha256-glMQ+bzIiSVZMXv8h/wo1de60GwC1WK1dAqvz0sECAM="},"flags/1x1/gb-81ec47f82b87b9398d17f1db841ea31695a24fa3e05c60fa4d59b21ae4d5bed2.svg":{"logical_path":"flags/1x1/gb.svg","mtime":"2022-05-22T18:31:04+02:00","size":541,"digest":"6ce6ebb0c16f1f4aa74a78a5db382783545d1ca28f2b6133b6228b4dff0340f0","integrity":"sha256-bObrsMFvH0qnSnil2zgng1RdHKKPK2EztiKLTf8DQPA="},"flags/4x3/gd-9a09ce17c1792c8860223020288f72ed168afebcafdc9fa8c46a7b7b1513c28a.svg":{"logical_path":"flags/4x3/gd.svg","mtime":"2022-05-22T18:31:04+02:00","size":1681,"digest":"eb435c57c240fd302400f1ecb887ec63c672b524032bd0e7c6261ae6a2f1e249","integrity":"sha256-60NcV8JA/TAkAPHsuIfsY8ZytSQDK9DnxiYa5qLx4kk="},"flags/1x1/gd-1678beac8104635c4360593bbba3e3e4b84467d8997ed538137b5a68740ba1b9.svg":{"logical_path":"flags/1x1/gd.svg","mtime":"2022-05-22T18:31:04+02:00","size":1828,"digest":"407dac34390ab8b1ed80fafa4f7ef1fe3225d1d92c5403a80264b4956177e51d","integrity":"sha256-QH2sNDkKuLHtgPr6T37x/jIl0dksVAOoAmS0lWF35R0="},"flags/4x3/ge-0ed0a003c1e169ed60bdd889c8c841b0a7931aa3e809ca4d8e5da522385f35c9.svg":{"logical_path":"flags/4x3/ge.svg","mtime":"2022-05-22T18:31:04+02:00","size":1397,"digest":"3054d4e61ec2de31e08ce51c8e1bff64fe2d4cc39f3bc6b3988a5e3aab32379c","integrity":"sha256-MFTU5h7C3jHgjOUcjhv/ZP4tTMOfO8azmIpeOqsyN5w="},"flags/1x1/ge-d90251ffc959309587136e12331f57a2db6b284a892ba1fee03927383208a760.svg":{"logical_path":"flags/1x1/ge.svg","mtime":"2022-05-22T18:31:04+02:00","size":1541,"digest":"3f7e3b7075838308212d191c4ff1ff3915a4a0c3e1b140420bc1095be16aee0a","integrity":"sha256-P347cHWDgwghLRkcT/H/ORWkoMPhsUBCC8EJW+Fq7go="},"flags/4x3/gf-d4b632e9a932eff7d4e32338d13724f58332eeb445cfa9351a052b77cd688d3d.svg":{"logical_path":"flags/4x3/gf.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"8b1d049abec1dc1e6e28247d4f649f5146e8c29a4b928f94c97741da16bcc422","integrity":"sha256-ix0Emr7B3B5uKCR9T2SfUUbowppLko+UyXdB2ha8xCI="},"flags/1x1/gf-be726fca00f77b50eec1525f3889ebf6de7f8f46e28cb63f0cbbe026cdaf564b.svg":{"logical_path":"flags/1x1/gf.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"7e25c5fdc494625ccc8390d3fb1cc6d9a423372c7f30a6c402b138b11840e59f","integrity":"sha256-fiXF/cSUYlzMg5DT+xzG2aQjNyx/MKbEArE4sRhA5Z8="},"flags/4x3/gg-ea89231f0fa42d543d008b4f2fe8a94fc253a1808b8b8f6ab49f4bd9553c498e.svg":{"logical_path":"flags/4x3/gg.svg","mtime":"2022-05-22T18:31:04+02:00","size":595,"digest":"7a521b07e2a60e914abf16a2553dd7b8f18d3ff21ece58b2c41ba5264c3117e3","integrity":"sha256-elIbB+KmDpFKvxaiVT3XuPGNP/IezliyxBulJkwxF+M="},"flags/1x1/gg-ebfebaf3102bbdfecee844b24f59ef79c78d3b573203d8058e363847b33531a0.svg":{"logical_path":"flags/1x1/gg.svg","mtime":"2022-05-22T18:31:04+02:00","size":625,"digest":"e01d6706db308999fde70ce031a660160c3234d9d6e7ba4547f10975e5a1ffcf","integrity":"sha256-4B1nBtswiZn95wzgMaZgFgwyNNnW57pFR/EJdeWh/88="},"flags/4x3/gh-90efce1b22e18fbd77cb6f13e9f72ecea1338e3fd090b3817171eb3e24ba2516.svg":{"logical_path":"flags/4x3/gh.svg","mtime":"2022-05-22T18:31:04+02:00","size":281,"digest":"120554a519bce5c340f98f8cb7bcf98ea18572d3ad137804b4b0c5d806a54016","integrity":"sha256-EgVUpRm85cNA+Y+Mt7z5jqGFctOtE3gEtLDF2AalQBY="},"flags/1x1/gh-e9286720b91098135c65f7ad83d9a796efed89e27a052aac78af57e82d003859.svg":{"logical_path":"flags/1x1/gh.svg","mtime":"2022-05-22T18:31:04+02:00","size":296,"digest":"b979935b065bbef93c1a62caedf03ae3833c055f617bdc32824fd15c59d4bf6e","integrity":"sha256-uXmTWwZbvvk8GmLK7fA644M8BV9he9wygk/RXFnUv24="},"flags/4x3/gi-03f50f9d9b262fdf822d325c5325b374661821d6fae41e20de42bc761e56df52.svg":{"logical_path":"flags/4x3/gi.svg","mtime":"2022-05-22T18:31:04+02:00","size":2938,"digest":"c84fb25bb5c8d9b9cc2d70f630a927f4ea4f4cbeb2674eb97b4b9dc2d2256c14","integrity":"sha256-yE+yW7XI2bnMLXD2MKkn9OpPTL6yZ065e0udwtIlbBQ="},"flags/1x1/gi-94700c7efeae285ce37ad883ca906c4ee65a99ede614b40eacb88d64873abb96.svg":{"logical_path":"flags/1x1/gi.svg","mtime":"2022-05-22T18:31:04+02:00","size":2930,"digest":"7283b9d6ac27b497fafd867b580d0f12fea7551a4211150087d95816c2143e21","integrity":"sha256-coO51qwntJf6/YZ7WA0PEv6nVRpCERUAh9lYFsIUPiE="},"flags/4x3/gl-3b1f2b9c26c35f87fcb4b417fff6ad3d2aada484d734382440c338d4c7dcbd00.svg":{"logical_path":"flags/4x3/gl.svg","mtime":"2022-05-22T18:31:04+02:00","size":223,"digest":"1149b6b3a90dd6f4f6ac8dd4af0ddfcb33e801858e4835c5f8c6c7346dee3288","integrity":"sha256-EUm2s6kN1vT2rI3Urw3fyzPoAYWOSDXF+MbHNG3uMog="},"flags/1x1/gl-e468d30f57d5159f92aa487c8d16f9395671e64e4dcd74ec71b40bfa96259df4.svg":{"logical_path":"flags/1x1/gl.svg","mtime":"2022-05-22T18:31:04+02:00","size":237,"digest":"5e6efacd630a7f36a1574444a9893613e5c6d03d5d569e140b592f8e7542feb8","integrity":"sha256-Xm76zWMKfzahV0REqYk2E+XG0D1dVp4UC1kvjnVC/rg="},"flags/4x3/gm-8a5011e0a99457e6dfeb53b55a90875f2d9a802fe8fec13f570de6f2a27b8639.svg":{"logical_path":"flags/4x3/gm.svg","mtime":"2022-05-22T18:31:04+02:00","size":546,"digest":"6d6da6987a4243bb9fff8138ad9e0b301098c6f963cacedf997850fb679ec28c","integrity":"sha256-bW2mmHpCQ7uf/4E4rZ4LMBCYxvljys7fmXhQ+2eewow="},"flags/1x1/gm-4200b76a4dbfbd9de052de9de778ae19d659a1d75d669757885580ef286497ec.svg":{"logical_path":"flags/1x1/gm.svg","mtime":"2022-05-22T18:31:04+02:00","size":382,"digest":"5f8874f8ab093f84c3465b3110ed400cd8eb457110f9b61e684edc867ef99b2f","integrity":"sha256-X4h0+KsJP4TDRlsxEO1ADNjrRXEQ+bYeaE7chn75my8="},"flags/4x3/gn-e990df30eba87d7036bbf6a47b64d0a6360d82fba6b5bba812e148648e56ea47.svg":{"logical_path":"flags/4x3/gn.svg","mtime":"2022-05-22T18:31:04+02:00","size":295,"digest":"735109ba23330ad9e8602b6e27e658bd12e36f2616b7ead65bd908d553b2acda","integrity":"sha256-c1EJuiMzCtnoYCtuJ+ZYvRLjbyYWt+rWW9kI1VOyrNo="},"flags/1x1/gn-4f9823b9e177c0604f8cbc1b2412ac9c39b4ffc3eda66311e787a6d9a640ebf7.svg":{"logical_path":"flags/1x1/gn.svg","mtime":"2022-05-22T18:31:04+02:00","size":295,"digest":"255e2c2930544e25827f220ebc26c6f533d291079f34f2ad6644533d3dfbd726","integrity":"sha256-JV4sKTBUTiWCfyIOvCbG9TPSkQefNPKtZkRTPT371yY="},"flags/4x3/gp-024ddd0e63a5e22c9d9f73a84b8306f2176083081825a065d99646ee123dc242.svg":{"logical_path":"flags/4x3/gp.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"b9c509941ec97521fd81904dc81a2845faa44349cc068344f4f738dad7a558b2","integrity":"sha256-ucUJlB7JdSH9gZBNyBooRfqkQ0nMBoNE9Pc42telWLI="},"flags/1x1/gp-00fab4fc916f5f267afd8e100a52098ba4aa6761cba1ecde56d506e85bd12025.svg":{"logical_path":"flags/1x1/gp.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"8bf5d31fdbb388b5bee19d19f7a7cf1e0c0378d5759c5a4254549b2542727a2c","integrity":"sha256-i/XTH9uziLW+4Z0Z96fPHgwDeNV1nFpCVFSbJUJyeiw="},"flags/4x3/gq-4e5c5e90e99f9dd14a43b597b6d370c8691ee73e8c75a8184e4a8390ff3e2bb0.svg":{"logical_path":"flags/4x3/gq.svg","mtime":"2022-05-22T18:31:04+02:00","size":5182,"digest":"52b8daea18383c355f1f6db428bcd4ebdf777734148da4403f1e93797b4dc9da","integrity":"sha256-Urja6hg4PDVfH220KLzU6993dzQUjaRAPx6TeXtNydo="},"flags/1x1/gq-0e6d55dbcfe1e727dbe9c00ac2988407c196e5c0a20a0f71f752788649ec83c0.svg":{"logical_path":"flags/1x1/gq.svg","mtime":"2022-05-22T18:31:04+02:00","size":5273,"digest":"f4a44fd2e337cfa52f199707b606891ab0bd3b68bfaeca033e70c274739a6131","integrity":"sha256-9KRP0uM3z6UvGZcHtgaJGrC9O2i/rsoDPnDCdHOaYTE="},"flags/4x3/gr-db2138fa7bb0c95282ec0ecae3b5bd6ff2b3a06e2f27c1434b5b2285d422a6e0.svg":{"logical_path":"flags/4x3/gr.svg","mtime":"2022-05-22T18:31:04+02:00","size":1096,"digest":"d22330d2af43ce22eab7d8ec9efdbe27ccd9ac1255f3bd289aa671db07fd0205","integrity":"sha256-0iMw0q9DziLqt9jsnv2+J8zZrBJV870omqZx2wf9AgU="},"flags/1x1/gr-40c78a60595b2a3f485040d93505c0128de81b60f44e18e35ce0ca9d5a95f184.svg":{"logical_path":"flags/1x1/gr.svg","mtime":"2022-05-22T18:31:04+02:00","size":1085,"digest":"565e017faa966d20d9a4051a1853c366bbd59ebaaced77fed32f850b8a9c5099","integrity":"sha256-Vl4Bf6qWbSDZpAUaGFPDZrvVnrqs7Xf+0y+FC4qcUJk="},"flags/4x3/gs-bf3e078414a68dcd77d82694f5411f67c1eb5a1503f427c8dbcace16238e359a.svg":{"logical_path":"flags/4x3/gs.svg","mtime":"2022-05-22T18:31:04+02:00","size":34568,"digest":"ad593ae4b9e8c7a4c109a15385a221464240cf3f77e607af2adba53d7b7d2a69","integrity":"sha256-rVk65Lnox6TBCaFThaIhRkJAzz935gevKtulPXt9Kmk="},"flags/1x1/gs-0130b60737c3873dd1868c70f7c3018fc276d152a398c2ce727edddb46f32513.svg":{"logical_path":"flags/1x1/gs.svg","mtime":"2022-05-22T18:31:04+02:00","size":35061,"digest":"718e0e89dee0f138fe8e45e84c64f72259b41d0f36224b9b2507bce77be21186","integrity":"sha256-cY4Oid7g8Tj+jkXoTGT3Ilm0HQ82IkubJQe853viEYY="},"flags/4x3/gt-1b63340464e9dd3363a631f74db87defe40bfc520ba41002bf094f154b579934.svg":{"logical_path":"flags/4x3/gt.svg","mtime":"2022-05-22T18:31:04+02:00","size":37255,"digest":"aa19f58abef6e0b68f7bee73452e26679a640c0fed12f9fc2cb6cde32fc04da5","integrity":"sha256-qhn1ir724LaPe+5zRS4mZ5pkDA/tEvn8LLbN4y/ATaU="},"flags/1x1/gt-7cd5c99c47d16d4fc914979ffd7b95d87247d4c6652e07562a71a323f7145d58.svg":{"logical_path":"flags/1x1/gt.svg","mtime":"2022-05-22T18:31:04+02:00","size":37255,"digest":"66d29cdd8660d4380902884c08d9be64f3d8a02536873814f2909778b6e234e0","integrity":"sha256-ZtKc3YZg1DgJAohMCNm+ZPPYoCU2hzgU8pCXeLbiNOA="},"flags/4x3/gu-4018f5c92a9dd473d226f09136e956de2570729e80d704e8cc4e8f3ca2bdc871.svg":{"logical_path":"flags/4x3/gu.svg","mtime":"2022-05-22T18:31:04+02:00","size":4840,"digest":"6d39ec648f0366b77918f779bef9619d06561d223bcb98b56813dc32e8403d2d","integrity":"sha256-bTnsZI8DZrd5GPd5vvlhnQZWHSI7y5i1aBPcMuhAPS0="},"flags/1x1/gu-bb95d4d48c1e20be2b15258d9b895f38e9df1c54b65d4ed4aab1b323576f3899.svg":{"logical_path":"flags/1x1/gu.svg","mtime":"2022-05-22T18:31:04+02:00","size":4614,"digest":"390cbafa22e9b9131e3bf37109317115684519abf87088acfa0f355c608b4729","integrity":"sha256-OQy6+iLpuRMeO/NxCTFxFWhFGav4cIis+g81XGCLRyk="},"flags/4x3/gw-0ea266c02a02d578e96bb5335244c83c2815f28ebd34ff7ab8408b16416dd88e.svg":{"logical_path":"flags/4x3/gw.svg","mtime":"2022-05-22T18:31:04+02:00","size":813,"digest":"ef2b9b0a28a50cc12689fb576cf4dc5b507b01fbb15a498298921d7a57f0fd77","integrity":"sha256-7yubCiilDMEmiftXbPTcW1B7AfuxWkmCmJIdelfw/Xc="},"flags/1x1/gw-bd83c376f118c350751de000e2a48f97772438555dc1a70a7beb15cc4caee5c7.svg":{"logical_path":"flags/1x1/gw.svg","mtime":"2022-05-22T18:31:04+02:00","size":889,"digest":"14078000daf10cc29b7167c3f9b1b239ab3708b3bad35e8ef185cb92643f88de","integrity":"sha256-FAeAANrxDMKbcWfD+bGyOas3CLO6016O8YXLkmQ/iN4="},"flags/4x3/gy-441a978efab1565daf964e822a75b8658f5879af41371b0b52e468e00eb6b095.svg":{"logical_path":"flags/4x3/gy.svg","mtime":"2022-05-22T18:31:04+02:00","size":488,"digest":"0b13a1778887768d5e7767f5e4a484444f4cf3be655142fd6d5d5acb945e7919","integrity":"sha256-CxOhd4iHdo1ed2f15KSERE9M875lUUL9bV1ay5ReeRk="},"flags/1x1/gy-d84ae82776b7142e4d9d51b1bdce601560275833b8d249e8e3d74bd3752b5aaa.svg":{"logical_path":"flags/1x1/gy.svg","mtime":"2022-05-22T18:31:04+02:00","size":481,"digest":"7562ed6db701af0658a763a1d4701c12467cd962cfd0bfd262cac16d4fc80c88","integrity":"sha256-dWLtbbcBrwZYp2Oh1HAcEkZ82WLP0L/SYsrBbU/IDIg="},"flags/4x3/hk-e5350bb4c4d63e98d802b3190247b2ce459d2695756ec62d64a995c43c4edd1e.svg":{"logical_path":"flags/4x3/hk.svg","mtime":"2022-05-22T18:31:04+02:00","size":3494,"digest":"17c1c66141f1aa0339fefc5863866d67eabcb1732bda7d5d757b2cb937c93da1","integrity":"sha256-F8HGYUHxqgM5/vxYY4ZtZ+q8sXMr2n1ddXssuTfJPaE="},"flags/1x1/hk-082835aaf3d1d61e1dd0e3b2b86231ef11b20150f98898af2e352b87c910f7da.svg":{"logical_path":"flags/1x1/hk.svg","mtime":"2022-05-22T18:31:04+02:00","size":3529,"digest":"9f59b3d68a943ed25c5e00cb3d1b97d522951d85db0f66fed087418358f88927","integrity":"sha256-n1mz1oqUPtJcXgDLPRuX1SKVHYXbD2b+0IdBg1j4iSc="},"flags/4x3/hm-1048d79fd546482c290e1a0e4c2f9ce053aa3821f17bf12487a4f3e0ac7477d4.svg":{"logical_path":"flags/4x3/hm.svg","mtime":"2022-05-22T18:31:04+02:00","size":1324,"digest":"d0e56b8208a450dc19b6e1eafaa826c439a318b33314c503ebab05d7a9d14ba3","integrity":"sha256-0OVrggikUNwZtuHq+qgmxDmjGLMzFMUD66sF16nRS6M="},"flags/1x1/hm-af2df9fe67b48ead95d7ebe32d0a28a16c0d2fb03af909ca99e3b7d3cbe1a4a3.svg":{"logical_path":"flags/1x1/hm.svg","mtime":"2022-05-22T18:31:04+02:00","size":1308,"digest":"78ed36c627b9370e2c8737226f62105718c18b2f04c62618168e43adcccc1ca6","integrity":"sha256-eO02xie5Nw4shzcib2IQVxjBiy8ExiYYFo5DrczMHKY="},"flags/4x3/hn-d0e2cededb00e5dc79c75ab95e8f93d1851844c0924e49b59a8b78f6b35a7cfb.svg":{"logical_path":"flags/4x3/hn.svg","mtime":"2022-05-22T18:31:04+02:00","size":1112,"digest":"38a5028605f6645a95c607f24db6d27d5b915580be561a365cfb9d238736b594","integrity":"sha256-OKUChgX2ZFqVxgfyTbbSfVuRVYC+Vho2XPudI4c2tZQ="},"flags/1x1/hn-45eebaaac195fd50e374926f9876eb5456a8cbcc2fb30e6a19229c409c51520b.svg":{"logical_path":"flags/1x1/hn.svg","mtime":"2022-05-22T18:31:04+02:00","size":1116,"digest":"79cc97901f534c2998d1ec6cd506a81b59eabc0a040dc66ee46ef8a7405e6641","integrity":"sha256-ecyXkB9TTCmY0exs1QaoG1nqvAoEDcZu5G74p0BeZkE="},"flags/4x3/hr-e10c8456ac0fc1946d1cb1f15e73484d03e4442368d78b230b050cadb7730b04.svg":{"logical_path":"flags/4x3/hr.svg","mtime":"2022-05-22T18:31:04+02:00","size":40615,"digest":"b0b1d075c651e2ceb10f558b33a13c9dd89310edfbe67df0f46a7b5d8d550de6","integrity":"sha256-sLHQdcZR4s6xD1WLM6E8ndiTEO375n3w9Gp7XY1VDeY="},"flags/1x1/hr-8a4ca8ec8de4fc911306e198e66086fbbbf33891c8fa3e860af482f8ac2ddb44.svg":{"logical_path":"flags/1x1/hr.svg","mtime":"2022-05-22T18:31:04+02:00","size":40852,"digest":"1041347a78192d0e7688af7adec3cd93d85fd0dd7ab792dc80fd82629708a7bf","integrity":"sha256-EEE0engZLQ52iK963sPNk9hf0N16t5LcgP2CYpcIp78="},"flags/4x3/ht-f862a9bb3b96630fc26a6fd2200b77c985b90a87ff9c52c42c3d7f42a0198b04.svg":{"logical_path":"flags/4x3/ht.svg","mtime":"2022-05-22T18:31:04+02:00","size":15005,"digest":"ba77c23de904dea8ddf2390f9e363fa96679253b425be7d4dbf0021c4a0c9911","integrity":"sha256-unfCPekE3qjd8jkPnjY/qWZ5JTtCW+fU2/ACHEoMmRE="},"flags/1x1/ht-1a12f16c45567e7b4fc2737b630345f7c7d0ac79ff31c41bc23920d0effd9adb.svg":{"logical_path":"flags/1x1/ht.svg","mtime":"2022-05-22T18:31:04+02:00","size":15094,"digest":"092fc65d74cf70aa35a8dd3a5581f5bb668aba72ddf788c4ffc22278be4ee70b","integrity":"sha256-CS/GXXTPcKo1qN06VYH1u2aKunLd94jE/8IieL5O5ws="},"flags/4x3/hu-a555e216b05645110da533dd2a5225021f70d7438e456877e77dc4522c261e41.svg":{"logical_path":"flags/4x3/hu.svg","mtime":"2022-05-22T18:31:04+02:00","size":274,"digest":"470431d1ed0dc2099f20313f78f906848acaf9efce57c543d83b3b62f8b7a448","integrity":"sha256-RwQx0e0NwgmfIDE/ePkGhIrK+e/OV8VD2Ds7Yvi3pEg="},"flags/1x1/hu-70b6438afdbc91f98b5ebfd0cafa40b6d5b0266f8d0df56cf3bcc7f777bd54c4.svg":{"logical_path":"flags/1x1/hu.svg","mtime":"2022-05-22T18:31:04+02:00","size":276,"digest":"ac2bf4284d73c0c0d607f5ec46855b982f56d2ee430306fca04da3a5cda8515b","integrity":"sha256-rCv0KE1zwMDWB/XsRoVbmC9W0u5DAwb8oE2jpc2oUVs="},"flags/4x3/id-3b48b1012b8beab850a28e27d785e92afee830444749c814a32419b8fce5dec1.svg":{"logical_path":"flags/4x3/id.svg","mtime":"2022-05-22T18:31:04+02:00","size":237,"digest":"c9871d91b6b58310831a0d78b904e44eb92a64630ac219ac43165d0ca8f0dacd","integrity":"sha256-yYcdkba1gxCDGg14uQTkTrkqZGMKwhmsQxZdDKjw2s0="},"flags/1x1/id-7d8348730949413fc7ff2587be342ff90c9ee1734d2ccdbca637a55839a894af.svg":{"logical_path":"flags/1x1/id.svg","mtime":"2022-05-22T18:31:04+02:00","size":239,"digest":"b4e3434244c27c95f6933e19a65fc273348f2edc6b695dd5dfe810d12f5459aa","integrity":"sha256-tONDQkTCfJX2kz4Zpl/CczSPLtxraV3V3+gQ0S9UWao="},"flags/4x3/ie-8758528ee7852e7ded3f03fb7bc96ef9c502b1321c3011e9aade28702c68e235.svg":{"logical_path":"flags/4x3/ie.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"4d73eedf98a4c487c352db58751ff766f05f6aa3bfac1ecc0f9384e50d019191","integrity":"sha256-TXPu35ikxIfDUttYdR/3ZvBfaqO/rB7MD5OE5Q0BkZE="},"flags/1x1/ie-1cf70c38a49b5ec8c5ec6aace1dd0f1e1ac1663b8a5339ca3a98dc7bc4978702.svg":{"logical_path":"flags/1x1/ie.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"e8a2121f51aa8eccbaab9fdc1e986418f75b6e3adf81329b1251db3a6678851d","integrity":"sha256-6KISH1Gqjsy6q5/cHphkGPdbbjrfgTKbElHbOmZ4hR0="},"flags/4x3/il-028f767bebb716e7a2e7198bfd03e698a7f19cad00385b30014a27680c101710.svg":{"logical_path":"flags/4x3/il.svg","mtime":"2022-05-22T18:31:04+02:00","size":901,"digest":"1dcc3e315cf8b00b8a9914d9ce696b05612aec294bf85e784b25c672b259c58a","integrity":"sha256-Hcw+MVz4sAuKmRTZzmlrBWEq7ClL+F54SyXGcrJZxYo="},"flags/1x1/il-395ee62ffbff4ab2ae456281a90f441e1148c0143a237f8a0e540e31d55518d5.svg":{"logical_path":"flags/1x1/il.svg","mtime":"2022-05-22T18:31:04+02:00","size":848,"digest":"343c040339a72ace51208700f40fe69bfb90e3b4f5ad62b1ed69ac404470722a","integrity":"sha256-NDwEAzmnKs5RIIcA9A/mm/uQ47T1rWKx7WmsQERwcio="},"flags/4x3/im-7dbb2dd66eda428c32edbbf2275f709df06cb1270dd69c65e214874966c30d69.svg":{"logical_path":"flags/4x3/im.svg","mtime":"2022-05-22T18:31:04+02:00","size":9870,"digest":"5b256ebd75ab1fc4d1e7af4f4306b4c6b54ae64a67eb1d968a84065a007b7cd7","integrity":"sha256-WyVuvXWrH8TR569PQwa0xrVK5kpn6x2WioQGWgB7fNc="},"flags/1x1/im-ed578fcc5e398ffdbc7a62d31b568a76b91e14ffa0afb794f3587aee8d248d67.svg":{"logical_path":"flags/1x1/im.svg","mtime":"2022-05-22T18:31:04+02:00","size":10197,"digest":"6dd9078e0d7934b575a00aa2b81effafa5b8aed1fa6c3f6824d56187ca7a63ba","integrity":"sha256-bdkHjg15NLV1oAqiuB7/r6W4rtH6bD9oJNVhh8p6Y7o="},"flags/4x3/in-63b359940156312c6ed31c2b61f005c2bc386823401773aac9aaa328d994f7bc.svg":{"logical_path":"flags/4x3/in.svg","mtime":"2022-05-22T18:31:04+02:00","size":1074,"digest":"cbc15f5fb40df22adf2b3792eb6c1d359e1a7affb44318a5a779943fc7299d45","integrity":"sha256-y8FfX7QN8irfKzeS62wdNZ4aev+0Qxilp3mUP8cpnUU="},"flags/1x1/in-3fd1bedfc697bfe677a9774d7a6f51d04115cce400b4d7a892ecf1f69526790f.svg":{"logical_path":"flags/1x1/in.svg","mtime":"2022-05-22T18:31:04+02:00","size":1088,"digest":"dd68b8ac425f8b0e1a479337e4fb6e8c647241f5042e63ba4cd9853e5e3b661b","integrity":"sha256-3Wi4rEJfiw4aR5M35PtujGRyQfUELmO6TNmFPl47Zhs="},"flags/4x3/io-67be58cb5bf7afe6099ec339235ec7ba0da153a50c651e28d4c32b2e6aa64cbc.svg":{"logical_path":"flags/4x3/io.svg","mtime":"2022-05-22T18:31:04+02:00","size":27341,"digest":"b942bddf710a42e617b2fcabb8bdfbe210b85d2ac9a60b5063d513ecc6648eec","integrity":"sha256-uUK933EKQuYXsvyruL374hC4XSrJpgtQY9UT7MZkjuw="},"flags/1x1/io-aa0702e0280d98693b3fb6350b45a7903ca25782082d3f1cee75f33f1a4d739d.svg":{"logical_path":"flags/1x1/io.svg","mtime":"2022-05-22T18:31:04+02:00","size":27357,"digest":"5b124813bf16fe4c96b606443527a5f17f6cdde9f0abf94d6884f5f81118198e","integrity":"sha256-WxJIE78W/kyWtgZENSel8X9s3enwq/lNaIT1+BEYGY4="},"flags/4x3/iq-51acd0adc48bf1cb7256aba82069573f84db0baaf49b968f7f06afe140555f7a.svg":{"logical_path":"flags/4x3/iq.svg","mtime":"2022-05-22T18:31:04+02:00","size":1470,"digest":"4b13b01690d870625d61a87bbaf4328a714626698d056dc3f56a9a37c133d77a","integrity":"sha256-SxOwFpDYcGJdYah7uvQyinFGJmmNBW3D9WqaN8Ez13o="},"flags/1x1/iq-0ec8238d4e53fd7ec06ceda47e1378ee68042666f1f7f1a91753595a2167366e.svg":{"logical_path":"flags/1x1/iq.svg","mtime":"2022-05-22T18:31:04+02:00","size":1475,"digest":"4a529e765a46ab3cea5be74d6754d6646b175cc5da0a725114e1fcd1f877734c","integrity":"sha256-SlKedlpGqzzqW+dNZ1TWZGsXXMXaCnJRFOH80fh3c0w="},"flags/4x3/ir-0d6f2bd5403ac2c3f7dfd49e3c5124817575c00b5167ef4c03cbfb63cfc10a26.svg":{"logical_path":"flags/4x3/ir.svg","mtime":"2022-05-22T18:31:04+02:00","size":15451,"digest":"2047b977f2d7e8835035e30551fe8333403452134c3164105ed30b2e6fd14a23","integrity":"sha256-IEe5d/LX6INQNeMFUf6DM0A0UhNMMWQQXtMLLm/RSiM="},"flags/1x1/ir-123d34118d6933f90a6b1191e2605c8344850c39f72644b9d91e15bfa640b623.svg":{"logical_path":"flags/1x1/ir.svg","mtime":"2022-05-22T18:31:04+02:00","size":15356,"digest":"18b8f0da914e052490e627f2dbe57a24a1448e84cfedead2d2ffa9795135afc6","integrity":"sha256-GLjw2pFOBSSQ5ify2+V6JKFEjoTP7erS0v+peVE1r8Y="},"flags/4x3/is-21543ffd547f651c7628bfe97d3c3626ea5e6999848de64efddee4656c27177b.svg":{"logical_path":"flags/4x3/is.svg","mtime":"2022-05-22T18:31:04+02:00","size":524,"digest":"89b266e3c5824fabc91b8d04a830a3f32c62484b49543bc3921e14c57ba6cb7e","integrity":"sha256-ibJm48WCT6vJG40EqDCj8yxiSEtJVDvDkh4UxXumy34="},"flags/1x1/is-d73fc857d6844a1cdab62f81ba30a1ea895557d8d8fa4eecf7fa4b9127bc0123.svg":{"logical_path":"flags/1x1/is.svg","mtime":"2022-05-22T18:31:04+02:00","size":526,"digest":"74bbf9d0f1714110da6ba438163ff7de135dd91d32b2172757a943ac7bc355a3","integrity":"sha256-dLv50PFxQRDaa6Q4Fj/33hNd2R0yshcnV6lDrHvDVaM="},"flags/4x3/it-8b46e4a9676eb92cd507acef1d7c62115e6acc4b85e58a0806a0721ac34735f6.svg":{"logical_path":"flags/4x3/it.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"2d46fd7fde3f19c3f278fe9028e6fab6fa997fbdda3e18116fb70e57cfc78598","integrity":"sha256-LUb9f94/GcPyeP6QKOb6tvqZf73aPhgRb7cOV8/HhZg="},"flags/1x1/it-2767e5c7250ec17539972ef710a8cebde73971bf0b9b3186d5baffb02f66974e.svg":{"logical_path":"flags/1x1/it.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"28a4339b1dc59c4e776f6bf07f51117de9fade0a8a749492e478764b8bd8c2f2","integrity":"sha256-KKQzmx3FnE53b2vwf1ERfen63gqKdJSS5Hh2S4vYwvI="},"flags/4x3/je-35111082a6e24dccbd512743a37ebec13094ffbed5fef2b0793037433821a7ce.svg":{"logical_path":"flags/4x3/je.svg","mtime":"2022-05-22T18:31:04+02:00","size":4700,"digest":"365f0f9dea4804f7f9a9ca052beb1b39bc0811cd5d47d013094418d5b6c53d1a","integrity":"sha256-Nl8PnepIBPf5qcoFK+sbObwIEc1dR9ATCUQY1bbFPRo="},"flags/1x1/je-87c6120456d517be72bdf28fd125176a743006be1cbe47ff5f59d54d1bf1253e.svg":{"logical_path":"flags/1x1/je.svg","mtime":"2022-05-22T18:31:04+02:00","size":4675,"digest":"0cdc51ec29101669d333d4b91b61d87f3d302473cc81bd17ff80ccbed6c7e0f6","integrity":"sha256-DNxR7CkQFmnTM9S5G2HYfz0wJHPMgb0X/4DMvtbH4PY="},"flags/4x3/jm-eb05254eb1abb6d7fcd764284581224857c980d7bad9d7e9afff3dfff49d1e73.svg":{"logical_path":"flags/4x3/jm.svg","mtime":"2022-05-22T18:31:04+02:00","size":389,"digest":"fc7c5d90b44fa5ba160c644f6c7f8918f5460a5842a517e3fd99ea94ba963594","integrity":"sha256-/HxdkLRPpboWDGRPbH+JGPVGClhCpRfj/ZnqlLqWNZQ="},"flags/1x1/jm-0af380d25aef6a7de4c545a85ea3f76d3b08e56c000980c08a681ada232ba49d.svg":{"logical_path":"flags/1x1/jm.svg","mtime":"2022-05-22T18:31:04+02:00","size":389,"digest":"1b80b0d1f940a94945335aa2683e0195890c35f5bae24a3321c7752c5cdf8416","integrity":"sha256-G4Cw0flAqUlFM1qiaD4BlYkMNfW64kozIcd1LFzfhBY="},"flags/4x3/jo-193203037e596abc063a9c30d0dd3aaa9c908557a1b57bcbcb94e1a1e8bb2402.svg":{"logical_path":"flags/4x3/jo.svg","mtime":"2022-05-22T18:31:04+02:00","size":720,"digest":"c3109f9f849f581918a4567768bd334506cb517bf8a3ed3afc8e670ae434af27","integrity":"sha256-wxCfn4SfWBkYpFZ3aL0zRQbLUXv4o+06/I5nCuQ0ryc="},"flags/1x1/jo-2b9c3f54d7e98c848cc0bd764bcd5ac2320d4f13aee8a84a207e7d0490c03516.svg":{"logical_path":"flags/1x1/jo.svg","mtime":"2022-05-22T18:31:04+02:00","size":691,"digest":"e183a9aa500d7bbef58df474d4b1a0554e4c68e187c9803a68272cbbecd45118","integrity":"sha256-4YOpqlANe771jfR01LGgVU5MaOGHyYA6aCcsu+zUURg="},"flags/4x3/jp-169d02f898d54cacbecd7b0197d32045a46c4424c10a67e78bbf488f7b44541e.svg":{"logical_path":"flags/4x3/jp.svg","mtime":"2022-05-22T18:31:04+02:00","size":474,"digest":"e759dccba5bc383814ab190daba0d12ef591ad9f161502a47222c2eacf770606","integrity":"sha256-51ncy6W8ODgUqxkNq6DRLvWRrZ8WFQKkciLC6s93BgY="},"flags/1x1/jp-20835e83e8d43872df1ef8a2b3a26379b5f6bcff854dab3c7a24dcad4a42e02d.svg":{"logical_path":"flags/1x1/jp.svg","mtime":"2022-05-22T18:31:04+02:00","size":484,"digest":"0573d020325a0795ebf2b83b6d604ecce164efc5c6e16c6fb4a48f124d2902d5","integrity":"sha256-BXPQIDJaB5Xr8rg7bWBOzOFk78XG4WxvtKSPEk0pAtU="},"flags/4x3/ke-58146180a02774a36ff2e4caf23b75c441a92dc69ffe3b9d4e9ded31e16748b5.svg":{"logical_path":"flags/4x3/ke.svg","mtime":"2022-05-22T18:31:04+02:00","size":1379,"digest":"c6390bd1dead222763be7c93e10ce8d48ce550d2083d00b907504d01f3be8da8","integrity":"sha256-xjkL0d6tIidjvnyT4Qzo1IzlUNIIPQC5B1BNAfO+jag="},"flags/1x1/ke-b3b9722930c4ecc82ed67d7c47eb751eefba3a59b24b68927c45d43a06b450a8.svg":{"logical_path":"flags/1x1/ke.svg","mtime":"2022-05-22T18:31:04+02:00","size":1485,"digest":"3cc6fb778db9f415d50e5651069719c7becdcb7cca53868586a287e024e26d8f","integrity":"sha256-PMb7d4259BXVDlZRBpcZx77Ny3zKU4aFhqKH4CTibY8="},"flags/4x3/kg-7c23eb9471af5dc5ee4391e4ec08fec7889c2d83f2712ce59310a0eb81d663f0.svg":{"logical_path":"flags/4x3/kg.svg","mtime":"2022-05-22T18:31:04+02:00","size":3374,"digest":"618432f0701371ef7260a11fde248179e49360f1acd1a0fd07c4efcd153f4721","integrity":"sha256-YYQy8HATce9yYKEf3iSBeeSTYPGs0aD9B8TvzRU/RyE="},"flags/1x1/kg-83e2a04c6199e69a1604a12610591fda15c8cf60e9fe7f682916815c5f1840bf.svg":{"logical_path":"flags/1x1/kg.svg","mtime":"2022-05-22T18:31:04+02:00","size":3316,"digest":"059ee9448b06e00eee47ca8a059e608618ddcd7e2fbb949149ee0bd46836dd35","integrity":"sha256-BZ7pRIsG4A7uR8qKBZ5ghhjdzX4vu5SRSe4L1Gg23TU="},"flags/4x3/kh-4f121b97388966312c5691244a72214a3306f87ec517c658adcaf39a131a1d8c.svg":{"logical_path":"flags/4x3/kh.svg","mtime":"2022-05-22T18:31:04+02:00","size":7261,"digest":"ec1e0984d167e8c6bfa026cfddd6048c64e9b3634a99c9a20db194f28f10b1a6","integrity":"sha256-7B4JhNFn6Ma/oCbP3dYEjGTps2NKmcmiDbGU8o8QsaY="},"flags/1x1/kh-9b9ebdb74308e4975fef2e9737cad7fe44538bf97f5c1b7b6239fc2f065d4cea.svg":{"logical_path":"flags/1x1/kh.svg","mtime":"2022-05-22T18:31:04+02:00","size":7262,"digest":"16c097cc28b308b92d65e4ad3c025160256a36838bae538c0b1357f044788da3","integrity":"sha256-FsCXzCizCLktZeStPAJRYCVqNoOLrlOMCxNX8ER4jaM="},"flags/4x3/ki-0e1a57754e3271771a154b525dfb57e20d584083b47b1ac2708b843abf11948a.svg":{"logical_path":"flags/4x3/ki.svg","mtime":"2022-05-22T18:31:04+02:00","size":5813,"digest":"591a87de7bbeb711663f6dcaad93e269108ca6ab9ccbcb653e84c9779e9d3e2d","integrity":"sha256-WRqH3nu+txFmP23KrZPiaRCMpqucy8tlPoTJd56dPi0="},"flags/1x1/ki-64df628a3c2bacf16209af95403dd7ae5402f705b2776da20ea741646e047b12.svg":{"logical_path":"flags/1x1/ki.svg","mtime":"2022-05-22T18:31:04+02:00","size":5941,"digest":"210537cc2766114f72f9f838c5dc138a18c3f49e78575f7b1d699873061b0315","integrity":"sha256-IQU3zCdmEU9y+fg4xdwTihjD9J54V197HWmYcwYbAxU="},"flags/4x3/km-2301fd16e41810016f9a58d75b8a361ffe9885ecfc89a0b3e9108bda7f5501d9.svg":{"logical_path":"flags/4x3/km.svg","mtime":"2022-05-22T18:31:04+02:00","size":1064,"digest":"f6cd3ead925661739946379d122420dfd0287b6332e25ecefc5e8a97adefdb0f","integrity":"sha256-9s0+rZJWYXOZRjedEiQg39Aoe2My4l7O/F6Kl63v2w8="},"flags/1x1/km-6f9716ac74c8ef80557e682ae6d951a6ca6993eabd049f8de81a742f77a84452.svg":{"logical_path":"flags/1x1/km.svg","mtime":"2022-05-22T18:31:04+02:00","size":1037,"digest":"a6a467329036e9963b7aca186e74b5affd615663ad9802807a64c04aa79a5f19","integrity":"sha256-pqRnMpA26ZY7esoYbnS1r/1hVmOtmAKAemTASqeaXxk="},"flags/4x3/kn-8e866a33f9952f8b29e45e8576133345446925907a2c4bcd429a34ae377bc74e.svg":{"logical_path":"flags/4x3/kn.svg","mtime":"2022-05-22T18:31:04+02:00","size":819,"digest":"d0f010da3fc35e1b9b520e8c063eaf9a650c16a0dd6507928cbf013a04508924","integrity":"sha256-0PAQ2j/DXhubUg6MBj6vmmUMFqDdZQeSjL8BOgRQiSQ="},"flags/1x1/kn-46b0fcf2a59d3f923fc5ae6c914d9ee2d886fb4ee6f9c1108133244f4093d481.svg":{"logical_path":"flags/1x1/kn.svg","mtime":"2022-05-22T18:31:04+02:00","size":817,"digest":"ae4abba1402d60d25f380c8aa7dd081e7efc1349733b36ffbc7e61b951b54363","integrity":"sha256-rkq7oUAtYNJfOAyKp90IHn78E0lzOzb/vH5huVG1Q2M="},"flags/4x3/kp-ab0a3c4310474b324bbb39f77579ac3b421c531397d31e8f38de35a681d79bc9.svg":{"logical_path":"flags/4x3/kp.svg","mtime":"2022-05-22T18:31:04+02:00","size":795,"digest":"8d34a3fd7d34c53ce01854e2b1e69c71fd6b0c65dda1b8aa90f2935a551b8f79","integrity":"sha256-jTSj/X00xTzgGFTiseaccf1rDGXdobiqkPKTWlUbj3k="},"flags/1x1/kp-3a2ce32e4b76931fd6383f9833a4764528cc89c92f23672cc8eaff26c7a31ee1.svg":{"logical_path":"flags/1x1/kp.svg","mtime":"2022-05-22T18:31:04+02:00","size":852,"digest":"d0cb440831181be36d7ea60f5adff5bb1dae7d8ab06738a920ab994ad42652cc","integrity":"sha256-0MtECDEYG+NtfqYPWt/1ux2ufYqwZzipIKuZStQmUsw="},"flags/4x3/kr-854d1521a9cb2b22c90f96d5d62277a9e1382818eefdc294d481c397c92f97c0.svg":{"logical_path":"flags/4x3/kr.svg","mtime":"2022-05-22T18:31:04+02:00","size":1822,"digest":"3162c67e01704d06fd77d78fefeb5937fee5f4ee326d369da13a5b25b75db16a","integrity":"sha256-MWLGfgFwTQb9d9eP7+tZN/7l9O4ybTadoTpbJbddsWo="},"flags/1x1/kr-343a5d08f9d0ff8c4268c77111cff9d2296c3f875b8d776c95dea1ae246d9bda.svg":{"logical_path":"flags/1x1/kr.svg","mtime":"2022-05-22T18:31:04+02:00","size":1719,"digest":"3f72f5b1c788ac2bc2d7e3680f25f55692dff661e0dc3819bb78cd711f152d76","integrity":"sha256-P3L1sceIrCvC1+NoDyX1VpLf9mHg3DgZu3jNcR8VLXY="},"flags/4x3/kw-75be6f04a24e7ddaaec57c95420ece390603961fa238245b776386890ab5627b.svg":{"logical_path":"flags/4x3/kw.svg","mtime":"2022-05-22T18:31:04+02:00","size":509,"digest":"ac538e6cbafc0a94611bb9c653df3056cfa3303faff143308aa5680178e34f71","integrity":"sha256-rFOObLr8CpRhG7nGU98wVs+jMD+v8UMwiqVoAXjjT3E="},"flags/1x1/kw-cdbf39e8dc62ffc15b7bc3c373151070377db56c0508dadf80bdd3c971d8a094.svg":{"logical_path":"flags/1x1/kw.svg","mtime":"2022-05-22T18:31:04+02:00","size":507,"digest":"c874c334dca89cb394b3534eb2eb5ed408293d32052e9179fc75832191b5759e","integrity":"sha256-yHTDNNyonLOUs1NOsute1AgpPTIFLpF5/HWDIZG1dZ4="},"flags/4x3/ky-f75f33396887f6234e7ee4fd483e57c8e35ac52d504a4a6e12fad25d855bf061.svg":{"logical_path":"flags/4x3/ky.svg","mtime":"2022-05-22T18:31:04+02:00","size":21724,"digest":"fcecffb01a890f01464e6067e5593099b9919746443d16c69c7e223e13be50ef","integrity":"sha256-/Oz/sBqJDwFGTmBn5VkwmbmRl0ZEPRbGnH4iPhO+UO8="},"flags/1x1/ky-8ed8729ad8553aa468c0d9ea196f38048770b15a1bb632fb7c3bd56fbfd5b643.svg":{"logical_path":"flags/1x1/ky.svg","mtime":"2022-05-22T18:31:04+02:00","size":22357,"digest":"707d019e77714b8dee2074bbd17aaac157d2de0991a8d4c8472a038403c5471f","integrity":"sha256-cH0BnndxS43uIHS70XqqwVfS3gmRqNTIRyoDhAPFRx8="},"flags/4x3/kz-51f42e580c605b6580aa4288d88d9c88bc6fd86af2388b0e4313bce969628743.svg":{"logical_path":"flags/4x3/kz.svg","mtime":"2022-05-22T18:31:04+02:00","size":11327,"digest":"8214283b99e5781396996fdfd84c551ea7ac15a248465ccbb9358b13373d802a","integrity":"sha256-ghQoO5nleBOWmW/f2ExVHqesFaJIRlzLuTWLEzc9gCo="},"flags/1x1/kz-38ef143eed3d03cebe2e4924d520a0d90d5e59e97a39b13cb3085415267af6f3.svg":{"logical_path":"flags/1x1/kz.svg","mtime":"2022-05-22T18:31:04+02:00","size":11415,"digest":"af4496d258a36c41ce92d7713c7206e2e92ac6037c6dcdac687ba815e74a4f49","integrity":"sha256-r0SW0lijbEHOktdxPHIG4ukqxgN8bc2saHuoFedKT0k="},"flags/4x3/la-0a762fcc7ef73f1fedb4765b718e2e96c819d4b26d5375acfa48d245fb97fcec.svg":{"logical_path":"flags/4x3/la.svg","mtime":"2022-05-22T18:31:04+02:00","size":457,"digest":"1f70bf3805542fff3addba9e2148d541cb30b125c692a8c7e0868cf4c7dea409","integrity":"sha256-H3C/OAVUL/863bqeIUjVQcswsSXGkqjH4IaM9MfepAk="},"flags/1x1/la-59d7d7dd1443e9bc557631254afa4333d1b83db314c9eb8bc170ce26f34f5dd8.svg":{"logical_path":"flags/1x1/la.svg","mtime":"2022-05-22T18:31:04+02:00","size":501,"digest":"dafd3a0212ab43c02323bd5bb6fb1b4378a96e05cd352c354f6f4863a3f43f6d","integrity":"sha256-2v06AhKrQ8AjI71btvsbQ3ipbgXNNSw1T29IY6P0P20="},"flags/4x3/lb-26ea2add2ac68a8040b027b510f29080d8407b961243c77b33b46c8957768b66.svg":{"logical_path":"flags/4x3/lb.svg","mtime":"2022-05-22T18:31:04+02:00","size":2816,"digest":"80a2aaa6b4ad4e44ad197ccdb7defba58af6ff0ab0692817804de12ff594bc8e","integrity":"sha256-gKKqprStTkStGXzNt977pYr2/wqwaSgXgE3hL/WUvI4="},"flags/1x1/lb-eb8049cb746a3913ac814f4d6e0e850d0e4b9a60b78dec5e9acd95b299bf95e4.svg":{"logical_path":"flags/1x1/lb.svg","mtime":"2022-05-22T18:31:04+02:00","size":2747,"digest":"5da3263f37d0e740a94283824f5f0ad6c3ceed6f12dbe108fce0ddd760418373","integrity":"sha256-XaMmPzfQ50CpQoOCT18K1sPO7W8S2+EI/ODd12BBg3M="},"flags/4x3/lc-444f9f77d0b09bd84fe2a5fd7194eae81341d8b7b4823070fc3e74cab481a122.svg":{"logical_path":"flags/4x3/lc.svg","mtime":"2022-05-22T18:31:04+02:00","size":370,"digest":"6f18658956e6da5c5bf468181b465a33c33045134dfb327d35a9b6ea6c56d23e","integrity":"sha256-bxhliVbm2lxb9GgYG0ZaM8MwRRNN+zJ9Nam26mxW0j4="},"flags/1x1/lc-13a572e5fcbada8bf66eb77413f04f862b0cf95d4b85c5292b3d6348ec4d8c99.svg":{"logical_path":"flags/1x1/lc.svg","mtime":"2022-05-22T18:31:04+02:00","size":370,"digest":"c4afe17342a7894f5dc7eed56716e9149378561a12c2bbd88d4c0bf740087c38","integrity":"sha256-xK/hc0KniU9dx+7VZxbpFJN4VhoSwrvYjUwL90AIfDg="},"flags/4x3/li-b2d0ccbceb7e6129a6529c98721d92fcee379ed6c225a18e1eff3c6fa092eec7.svg":{"logical_path":"flags/4x3/li.svg","mtime":"2022-05-22T18:31:04+02:00","size":8268,"digest":"c97f90de5ee09d5594f9d3154e7eae0158a8f922e394c3ad24502a9274dd68fb","integrity":"sha256-yX+Q3l7gnVWU+dMVTn6uAVio+SLjlMOtJFAqknTdaPs="},"flags/1x1/li-97814472256460b19df380ad90e5380202001a8a7ad6b4140cd2a0b92db909ac.svg":{"logical_path":"flags/1x1/li.svg","mtime":"2022-05-22T18:31:04+02:00","size":8291,"digest":"956ad50772021978069fde52a08f25b6fe310b0019ccabe8acd274099fb21ad5","integrity":"sha256-lWrVB3ICGXgGn95SoI8ltv4xCwAZzKvorNJ0CZ+yGtU="},"flags/4x3/lk-d910bd0d9ddb013c5668824d6600a842496c0a17c74f772a801f833b9eb044f8.svg":{"logical_path":"flags/4x3/lk.svg","mtime":"2022-05-22T18:31:04+02:00","size":11242,"digest":"599de52b1450460f083ac0654eb4e833c06b809903c7ce11cbe202005e3f080e","integrity":"sha256-WZ3lKxRQRg8IOsBlTrToM8BrgJkDx84Ry+ICAF4/CA4="},"flags/1x1/lk-c7fb3c2b64782519d94f0a9fd21c057e5e32b856c428b68abb11667191235270.svg":{"logical_path":"flags/1x1/lk.svg","mtime":"2022-05-22T18:31:04+02:00","size":11254,"digest":"379d62d2296d30d484a1c0469582d3a95736284bcdbc58e9d6bcb4f648836d1d","integrity":"sha256-N51i0iltMNSEocBGlYLTqVc2KEvNvFjp1ry09kiDbR0="},"flags/4x3/lr-42e8d3bdacafc05835fcd52026cb3e1717573965ce9d4f49635dbb390021a4b4.svg":{"logical_path":"flags/4x3/lr.svg","mtime":"2022-05-22T18:31:04+02:00","size":727,"digest":"66c008c2d58e2b50772ad95a30801a9b62566d5f3ac8ec1ea1ad41aaadc0f4c7","integrity":"sha256-ZsAIwtWOK1B3KtlaMIAam2JWbV86yOweoa1Bqq3A9Mc="},"flags/1x1/lr-169945e579afdf35dd158694a1679380886f8541278cbd225c7e750add25e60e.svg":{"logical_path":"flags/1x1/lr.svg","mtime":"2022-05-22T18:31:04+02:00","size":694,"digest":"371f542a58fe7e4a3c67dc92f92009757337ba428a368af4e077a4cccac652e6","integrity":"sha256-Nx9UKlj+fko8Z9yS+SAJdXM3ukKKNor04HekzMrGUuY="},"flags/4x3/ls-a4db42569c4760bffd695cbdb030c90bc203f40f75fb357cbdbef961d29cf5dd.svg":{"logical_path":"flags/4x3/ls.svg","mtime":"2022-05-22T18:31:04+02:00","size":1219,"digest":"285534456c1acd523d23e09220799faf851218c1b2d8015b0bb557910ca1b9e4","integrity":"sha256-KFU0RWwazVI9I+CSIHmfr4USGMGy2AFbC7VXkQyhueQ="},"flags/1x1/ls-1dd02208fc24c668e18430bb0500fa14c995f64cab8cde080b4256bd1b42b23f.svg":{"logical_path":"flags/1x1/ls.svg","mtime":"2022-05-22T18:31:04+02:00","size":1242,"digest":"80ad805e34b571d758604e2b1b735fe2c0f38dc1593c11c7d9a987e89f8fc6aa","integrity":"sha256-gK2AXjS1cddYYE4rG3Nf4sDzjcFZPBHH2amH6J+Pxqo="},"flags/4x3/lt-a57e003a5cbe538a4bfc2d29fd3523a87948bc8e29f731096dff9095096178c9.svg":{"logical_path":"flags/4x3/lt.svg","mtime":"2022-05-22T18:31:04+02:00","size":442,"digest":"9012691cb1689944fd0813b33b7a58fb97921944ec8988f23590fed21a1ff07c","integrity":"sha256-kBJpHLFomUT9CBOzO3pY+5eSGUTsiYjyNZD+0hof8Hw="},"flags/1x1/lt-e386ebe0482bdf999b151c3ae8c5e5e40a58037eab35b29f37682aa849edd3f0.svg":{"logical_path":"flags/1x1/lt.svg","mtime":"2022-05-22T18:31:04+02:00","size":442,"digest":"74f423c6210d7dc76867b1f620d0d15644db5c39b9e4197805ad20504d271f08","integrity":"sha256-dPQjxiENfcdoZ7H2INDRVkTbXDm55Bl4Ba0gUE0nHwg="},"flags/4x3/lu-2746295f8b0a1540d43e0c2548d4ec1341fafcffe48b919fb135a6c82535b657.svg":{"logical_path":"flags/4x3/lu.svg","mtime":"2022-05-22T18:31:04+02:00","size":228,"digest":"4622624d698a9577a3fb92bd4fa5f98f305d704bc51306b86d109c6c865d069a","integrity":"sha256-RiJiTWmKlXej+5K9T6X5jzBdcEvFEwa4bRCcbIZdBpo="},"flags/1x1/lu-9695b187733f52bae07c65e78aae8956e25360ad773c1f4703855997571a764d.svg":{"logical_path":"flags/1x1/lu.svg","mtime":"2022-05-22T18:31:04+02:00","size":232,"digest":"67ceb25fba1fc6a2c3836cef4033fad77752db08bcbc88fa7622b22a5f6ada2e","integrity":"sha256-Z86yX7ofxqLDg2zvQDP613dS2wi8vIj6diKyKl9q2i4="},"flags/4x3/lv-b51d475acf37be9accc82ddf5f60773861cf58b0e9b599460852589da88501ef.svg":{"logical_path":"flags/4x3/lv.svg","mtime":"2022-05-22T18:31:04+02:00","size":233,"digest":"dc67526a1833d2cd7c50d87f0da252e1fa2b361d7d418715535d3aa63e5a76b7","integrity":"sha256-3GdSahgz0s18UNh/DaJS4forNh19QYcVU106pj5adrc="},"flags/1x1/lv-dbf5d3fb294b518bc6373c4fc22b028fc462647fbd5032cf57513556896577bc.svg":{"logical_path":"flags/1x1/lv.svg","mtime":"2022-05-22T18:31:04+02:00","size":237,"digest":"23e2589c8a374ecf955772e01a4b6a7302133346737279eac1e8214b68bb0308","integrity":"sha256-I+JYnIo3Ts+VV3LgGktqcwITM0ZzcnnqweghS2i7Awg="},"flags/4x3/ly-7409a315d2f9aab4676558d7e97f4316ea87fc7afd93a493def4adf0b5773ca6.svg":{"logical_path":"flags/4x3/ly.svg","mtime":"2022-05-22T18:31:04+02:00","size":533,"digest":"3ad0387cfe11942e1f55114d49e6083185afde3528d2b05885160bdd043ff470","integrity":"sha256-OtA4fP4RlC4fVRFNSeYIMYWv3jUo0rBYhRYL3QQ/9HA="},"flags/1x1/ly-6457e38177d82f6c52e3f3c38328f1ac66bb5a5c7a9026229d4e3aafe3b592af.svg":{"logical_path":"flags/1x1/ly.svg","mtime":"2022-05-22T18:31:04+02:00","size":526,"digest":"5139e7519b7c833dfca645e2e7424517489927cb9facc6f0dff3d80b72d1e59d","integrity":"sha256-UTnnUZt8gz38pkXi50JFF0iZJ8ufrMbw3/PYC3LR5Z0="},"flags/4x3/ma-0628f236b2067d66c841c1190a3e8e3e9c37fbf2f3521fdb5ecba3eda75e805e.svg":{"logical_path":"flags/4x3/ma.svg","mtime":"2022-05-22T18:31:04+02:00","size":250,"digest":"f40a79d79c88c1bb927ec0e40c5d044f838f0a2c48d820b3e8449e92a71d02d6","integrity":"sha256-9Ap515yIwbuSfsDkDF0ET4OPCixI2CCz6ESekqcdAtY="},"flags/1x1/ma-5c96636ed7496b25e989cb74f202e377ec4c59b056b9d0c425ded77199b0d659.svg":{"logical_path":"flags/1x1/ma.svg","mtime":"2022-05-22T18:31:04+02:00","size":250,"digest":"3190fa17944b136ba27880e354cf385a1d7f6af076859fd8e3a25b30eaded302","integrity":"sha256-MZD6F5RLE2uieIDjVM84Wh1/avB2hZ/Y46JbMOre0wI="},"flags/4x3/mc-10a533ce437c40973f8684439f7e24da1ea624c5e5535fa4738d62ede0650242.svg":{"logical_path":"flags/4x3/mc.svg","mtime":"2022-05-22T18:31:04+02:00","size":237,"digest":"65c30fed3b3ade292a366ca3cea6155962e94a13944fd62e73706a7f872253ec","integrity":"sha256-ZcMP7Ts63ikqNmyjzqYVWWLpShOUT9Yuc3Bqf4ciU+w="},"flags/1x1/mc-6a9a8fe216f75ecdb8bddf6e6c816c1c9771ebffe3c09e83975a434ec1fb4950.svg":{"logical_path":"flags/1x1/mc.svg","mtime":"2022-05-22T18:31:04+02:00","size":237,"digest":"83f9d4ff92513bfe22f55c5df31e600c77893660b9b3c000efad29ea4f6c32ad","integrity":"sha256-g/nU/5JRO/4i9Vxd8x5gDHeJNmC5s8AA760p6k9sMq0="},"flags/4x3/md-6641e05826ea580544c1890fe3698eb2e8e3af463518fc37eea7c41eb8cbb6c0.svg":{"logical_path":"flags/4x3/md.svg","mtime":"2022-05-22T18:31:04+02:00","size":11237,"digest":"92475a7045515ebb11c2127a896010934a569a7d16adc4a702d41adf4565d440","integrity":"sha256-kkdacEVRXrsRwhJ6iWAQk0pWmn0WrcSnAtQa30Vl1EA="},"flags/1x1/md-e51dd640155b523a207eb1dc9dc909c38d9e88de04729e250e0cccd1e9d1b0b7.svg":{"logical_path":"flags/1x1/md.svg","mtime":"2022-05-22T18:31:04+02:00","size":11337,"digest":"af363b1645da518014f81a5670419b70adc6fc09b1c32def53145c26d5fc256f","integrity":"sha256-rzY7FkXaUYAU+BpWcEGbcK3G/Amxwy3vUxRcJtX8JW8="},"flags/4x3/me-c841acf1209c546dd77c18b718141ce4e21dba95a120cc3092988edaaf08f432.svg":{"logical_path":"flags/4x3/me.svg","mtime":"2022-05-22T18:31:04+02:00","size":62373,"digest":"29052367756da76b9ddcc3a71a17dc15cc39a7d387cb381fc5daad5880cd1895","integrity":"sha256-KQUjZ3Vtp2ud3MOnGhfcFcw5p9OHyzgfxdqtWIDNGJU="},"flags/1x1/me-c290031be15a14ebd1fd278774142e29f7dfe3d0fb3aba79c0d6932cb0feeb4b.svg":{"logical_path":"flags/1x1/me.svg","mtime":"2022-05-22T18:31:04+02:00","size":63354,"digest":"551e531eae9f601ce16f204217b0dea54396c8e689dd2792667e1c4fdd239367","integrity":"sha256-VR5THq6fYBzhbyBCF7DepUOWyOaJ3SeSZn4cT90jk2c="},"flags/4x3/mf-41a6043e2495b346fd700b17352150a8e43ca342a515fcb5159c39f809663ec6.svg":{"logical_path":"flags/4x3/mf.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"a07c29d68d55c8c614265e1bfc1ec179073e983f9d30a1a361310d68d2e30fa5","integrity":"sha256-oHwp1o1VyMYUJl4b/B7BeQc+mD+dMKGjYTENaNLjD6U="},"flags/1x1/mf-a3f24457b393082243eb00ea514057c09b1cf4985f6fa17d7902500fbb716317.svg":{"logical_path":"flags/1x1/mf.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"bf59a29b95c033e21fc58c30f4369db5d0312954389ab46c0e3d14b17dbd8b4e","integrity":"sha256-v1mim5XAM+IfxYww9DadtdAxKVQ4mrRsDj0UsX29i04="},"flags/4x3/mg-1baa2b12c3e79d592538d5d8e4d5a2c0e1373d3871c9d829f57b212daaf42129.svg":{"logical_path":"flags/4x3/mg.svg","mtime":"2022-05-22T18:31:04+02:00","size":302,"digest":"9e1ecee816ab8ef6441e6bb5a6d14c4238f074fcbc278a4ffa6168809669e586","integrity":"sha256-nh7O6BarjvZEHmu1ptFMQjjwdPy8J4pP+mFogJZp5YY="},"flags/1x1/mg-7e78efcc81f02f0616a11aec87bfd8dfaed1a328496301902f53375eee8f72ee.svg":{"logical_path":"flags/1x1/mg.svg","mtime":"2022-05-22T18:31:04+02:00","size":302,"digest":"e87135a47b177787871c8e7a341fe3b4f89843d33025affd16c2cf89bcfaac56","integrity":"sha256-6HE1pHsXd4eHHI56NB/jtPiYQ9MwJa/9FsLPibz6rFY="},"flags/4x3/mh-1236a730a9819f0b58ac8cd642d17482b3945a894c63663b4accf10ac8ce5ecc.svg":{"logical_path":"flags/4x3/mh.svg","mtime":"2022-05-22T18:31:04+02:00","size":741,"digest":"4785fd6418f936a2702773e3e131f282067da3d8d406c4c31d0d1bcbfc638af7","integrity":"sha256-R4X9ZBj5NqJwJ3Pj4THyggZ9o9jUBsTDHQ0by/xjivc="},"flags/1x1/mh-3ecae469e3987c59cc4b19833eb8ccfe49a9477f70aa2aa2be5e9a4a131a48d0.svg":{"logical_path":"flags/1x1/mh.svg","mtime":"2022-05-22T18:31:04+02:00","size":763,"digest":"ab6f55130abfca1e85a6818f74ea0f262e9327fb99f75868aae2bd2b83aef6aa","integrity":"sha256-q29VEwq/yh6FpoGPdOoPJi6TJ/uZ91hoquK9K4Ou9qo="},"flags/4x3/mk-2a7bfeeba74701ceba752795d02eac7a97a6139471e5bdd529f2a858f4fd1d0e.svg":{"logical_path":"flags/4x3/mk.svg","mtime":"2022-05-22T18:31:04+02:00","size":382,"digest":"3c7035086a33b244188bfc3ad050eb100aab771dfe39dd82c619ae6cd103af4c","integrity":"sha256-PHA1CGozskQYi/w60FDrEAqrdx3+Od2CxhmubNEDr0w="},"flags/1x1/mk-fe5c84d0e9bd4b7ceeed81f9564a970d7b5b39659e42f819c50950e191443720.svg":{"logical_path":"flags/1x1/mk.svg","mtime":"2022-05-22T18:31:04+02:00","size":410,"digest":"ebcd71d69e1fad32c0acbd1c9887945069b1f75ea52ef857e2e26e8927a7d98d","integrity":"sha256-681x1p4frTLArL0cmIeUUGmx916lLvhX4uJuiSen2Y0="},"flags/4x3/ml-086660fe4272a22e220c94854fe4f80dd61afadd5c0c81cc075aea91bbcaa691.svg":{"logical_path":"flags/4x3/ml.svg","mtime":"2022-05-22T18:31:04+02:00","size":276,"digest":"e8326589ad95d63b2856367db0b6343479eb591d116bc7e7a2c15e7d422e8dca","integrity":"sha256-6DJlia2V1jsoVjZ9sLY0NHnrWR0Ra8fnosFefUIujco="},"flags/1x1/ml-9ef37a44932a3af38990145042c85352b1c5c4e791221d1fd91b5a9f7a412efb.svg":{"logical_path":"flags/1x1/ml.svg","mtime":"2022-05-22T18:31:04+02:00","size":279,"digest":"0f990fac6a324676dad90acd1f8e5cf8e660bd62f978ee44acedefaccc226b7a","integrity":"sha256-D5kPrGoyRnba2QrNH45c+OZgvWL5eO5ErO3vrMwia3o="},"flags/4x3/mm-60ae7680502d9af8796fe3b3d57bbf6105a406e2e66840e9aa1f6e2470466058.svg":{"logical_path":"flags/4x3/mm.svg","mtime":"2022-05-22T18:31:04+02:00","size":848,"digest":"f7ef4a34cf98d96f557d0a7020f178154b730129be4c2b5f8425b825665875c1","integrity":"sha256-9+9KNM+Y2W9VfQpwIPF4FUtzASm+TCtfhCW4JWZYdcE="},"flags/1x1/mm-ea5bef04548342d984d8c8707333a31203a5abf015db093553f26c3a9febb251.svg":{"logical_path":"flags/1x1/mm.svg","mtime":"2022-05-22T18:31:04+02:00","size":865,"digest":"f4df9e4b3a4df8d9ee464504a1f88cdc0ea08d9923c8c7b3099ec8eabbf4258b","integrity":"sha256-9N+eSzpN+NnuRkUEofiM3A6gjZkjyMezCZ7I6rv0JYs="},"flags/4x3/mn-1309f63a0b6bfc594a1721a8af76381a1389fda64d840b256d353eb1341cb794.svg":{"logical_path":"flags/4x3/mn.svg","mtime":"2022-05-22T18:31:04+02:00","size":1245,"digest":"00649cb56bad07f8d34472e881fbe370a46879416fcba8dfc655f6eeed0056a3","integrity":"sha256-AGSctWutB/jTRHLogfvjcKRoeUFvy6jfxlX27u0AVqM="},"flags/1x1/mn-86ecb7d9fcefe13783f165d44a93c9c2b1add55481bc69a70f9bd3652c27ae74.svg":{"logical_path":"flags/1x1/mn.svg","mtime":"2022-05-22T18:31:04+02:00","size":1251,"digest":"ff5ea681d66e1a88ff8584dfc7fb20e8ed282b218bf9cc06518b1df90f3f99c7","integrity":"sha256-/16mgdZuGoj/hYTfx/sg6O0oKyGL+cwGUYsd+Q8/mcc="},"flags/4x3/mo-6c69662b2581d90527965dd2c444784ab366f0080c93f2014ca37f2f7541b898.svg":{"logical_path":"flags/4x3/mo.svg","mtime":"2022-05-22T18:31:04+02:00","size":1461,"digest":"62610131201312d4268197556e2952932ee4cde22ce876668722cc332b83989e","integrity":"sha256-YmEBMSATEtQmgZdVbilSky7kzeIs6HZmhyLMMyuDmJ4="},"flags/1x1/mo-ef906f7a8fdaccb7532359de1e5ce664ec0342975052b55a2e389f1b6338cba8.svg":{"logical_path":"flags/1x1/mo.svg","mtime":"2022-05-22T18:31:04+02:00","size":1495,"digest":"8eaad37d10c6db6035b0d4a74c33015539f2c78cd655e0ce4e1aa4b04f3ce36a","integrity":"sha256-jqrTfRDG22A1sNSnTDMBVTnyx4zWVeDOThqksE8842o="},"flags/4x3/mp-dd2fa1cf9846007f88c88143047430f3f666099875407cf36648b271b6e1400a.svg":{"logical_path":"flags/4x3/mp.svg","mtime":"2022-05-22T18:31:04+02:00","size":23398,"digest":"2e4af783bec6f474fc03275a7dc048a146d28ad3da615d65e6eb6d930c0054ef","integrity":"sha256-Lkr3g77G9HT8AydafcBIoUbSitPaYV1l5uttkwwAVO8="},"flags/1x1/mp-cd1d342862684bdb7caacb093e37d7e3b094cf49cfa5aa579d6b8201ffb4dd93.svg":{"logical_path":"flags/1x1/mp.svg","mtime":"2022-05-22T18:31:04+02:00","size":23628,"digest":"9b89316de0a803f61b8a4e842483db37436cc9e53911d6e2f59b53dfa422d563","integrity":"sha256-m4kxbeCoA/Ybik6EJIPbN0NsyeU5Edbi9ZtT36Qi1WM="},"flags/4x3/mq-be00a7c77b6aec1f86cd16bcafc7fe27b7b8c967b03632f8230cd83794833ba8.svg":{"logical_path":"flags/4x3/mq.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"297d268a5e967f7d34c91aa4513f86ec67b2efcef6df294a7846a554d73f22d9","integrity":"sha256-KX0mil6Wf300yRqkUT+G7Gey78723ylKeEalVNc/Itk="},"flags/1x1/mq-bfaccc4a61b2d7067b44d54a75ce5bb5757292bdabff5e104b547aa2435a2e5d.svg":{"logical_path":"flags/1x1/mq.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"0e466f6d604a1134afaa8fcced93845bd17be04debfd302d70964a806532f093","integrity":"sha256-DkZvbWBKETSvqo/M7ZOEW9F74E3r/TAtcJZKgGUy8JM="},"flags/4x3/mr-2293d4180eff3670e1c484d52a206efb562e8d96b9cb8c5a43aa65e1e2b1289c.svg":{"logical_path":"flags/4x3/mr.svg","mtime":"2022-05-22T18:31:04+02:00","size":442,"digest":"e41908b9de58fe9479e9a2e2a5bc0074ca1013cc247f2b1410568e8babe4ebfe","integrity":"sha256-5BkIud5Y/pR56aLipbwAdMoQE8wkfysUEFaOi6vk6/4="},"flags/1x1/mr-a3eb1a496e2c5dc86245856e18a91d71046b44d74d88274014e2d4fab41c3453.svg":{"logical_path":"flags/1x1/mr.svg","mtime":"2022-05-22T18:31:04+02:00","size":431,"digest":"fa0266040f7fa99236c10e36bd23ad92a558fdd79d250a23076733ae2aade799","integrity":"sha256-+gJmBA9/qZI2wQ42vSOtkqVY/dedJQojB2czriqt55k="},"flags/4x3/ms-913b24dbffa69bc3a57e997a806cdca5026cc5f87f83eefeef36a1aa8f5c2789.svg":{"logical_path":"flags/4x3/ms.svg","mtime":"2022-05-22T18:31:04+02:00","size":9279,"digest":"c2c0dfeea4a1f46dfb510afc8a97e99cc5a91d89851e97e4edd48f10d10eb262","integrity":"sha256-wsDf7qSh9G37UQr8ipfpnMWpHYmFHpfk7dSPENEOsmI="},"flags/1x1/ms-8be40421854193032b83670c6a91aa1f5c818578eafb85ee90dce959eb54c6db.svg":{"logical_path":"flags/1x1/ms.svg","mtime":"2022-05-22T18:31:04+02:00","size":12140,"digest":"c1ba27711118135b0d694151a37e397e71ae19470cd2fb7bb21ccb8178f4be43","integrity":"sha256-wboncREYE1sNaUFRo345fnGuGUcM0vt7shzLgXj0vkM="},"flags/4x3/mt-517b4f67a94fff5be6346cae3731f5a17290b4c56732129967c15f482199365e.svg":{"logical_path":"flags/4x3/mt.svg","mtime":"2022-05-22T18:31:04+02:00","size":8733,"digest":"fd6a6cbf958e7d3b88070ded68716b2b85bc130acf68e3b0bbab05361dbab47d","integrity":"sha256-/Wpsv5WOfTuIBw3taHFrK4W8EwrPaOOwu6sFNh26tH0="},"flags/1x1/mt-371c5673e14380308182c7ae324f54792652bf4d0cf64de30b1d1fefea8c9b5d.svg":{"logical_path":"flags/1x1/mt.svg","mtime":"2022-05-22T18:31:04+02:00","size":10422,"digest":"b841b8cd3c568b0638ab7fd12e8dcf24f09f1b6bbf7942a28c52212ac465d100","integrity":"sha256-uEG4zTxWiwY4q3/RLo3PJPCfG2u/eUKijFIhKsRl0QA="},"flags/4x3/mu-0a0d71ecace32a2948ac3eacc94927fb0ba7306236bf2a18ab5ae85bb2351664.svg":{"logical_path":"flags/4x3/mu.svg","mtime":"2022-05-22T18:31:04+02:00","size":319,"digest":"e3ce67e697fb6b33a39726379574752eef57b121d6f60d160e6bc7d7ed8f5ae6","integrity":"sha256-485n5pf7azOjlyY3lXR1Lu9XsSHW9g0WDmvH1+2PWuY="},"flags/1x1/mu-e0d4ee6c8f915eb54307ff51f57734c0bffa843060d953b9bd27f365b4a11b36.svg":{"logical_path":"flags/1x1/mu.svg","mtime":"2022-05-22T18:31:04+02:00","size":319,"digest":"9e4e19a678ac8b84eb14740be948a7dea035b5c0623639ba6e06e242359aa1bb","integrity":"sha256-nk4Zpnisi4TrFHQL6Uin3qA1tcBiNjm6bgbiQjWaobs="},"flags/4x3/mv-421f31e8be8d80695f9f4811435214e8a8ac8729e145f9d491b888d91d0ca999.svg":{"logical_path":"flags/4x3/mv.svg","mtime":"2022-05-22T18:31:04+02:00","size":289,"digest":"0f9b86efb7f8d66d28223ff592232812cfd2d2567db83ef96bf783ea3154eb8d","integrity":"sha256-D5uG77f41m0oIj/1kiMoEs/S0lZ9uD75a/eD6jFU640="},"flags/1x1/mv-c0056befcc1b506b4b498bf37dfa30642839a1beb6373f682e1214850b51cf6d.svg":{"logical_path":"flags/1x1/mv.svg","mtime":"2022-05-22T18:31:04+02:00","size":307,"digest":"57323390cdd79b28e658b6089304469012536c57101787020701ed91518848da","integrity":"sha256-VzIzkM3XmyjmWLYIkwRGkBJTbFcQF4cCBwHtkVGISNo="},"flags/4x3/mw-644750e23780e66258d7b56777be8ef47ce3ca2d9d5735eac5abbb22fae33056.svg":{"logical_path":"flags/4x3/mw.svg","mtime":"2022-05-22T18:31:04+02:00","size":3652,"digest":"c2c93e168527ec8bda2799854370dfacafcb491f39d6083900d903244c00cc4b","integrity":"sha256-wsk+FoUn7IvaJ5mFQ3DfrK/LSR851gg5ANkDJEwAzEs="},"flags/1x1/mw-70a282f17250f7fb49f8fbeb357dc492b742dd2a9c58e13281f0e900a8c63e94.svg":{"logical_path":"flags/1x1/mw.svg","mtime":"2022-05-22T18:31:04+02:00","size":3797,"digest":"5baad15595dcd8c0822e2bb9581efd027ac23ce10efa4202f3b5f566819080a0","integrity":"sha256-W6rRVZXc2MCCLiu5WB79AnrCPOEO+kIC87X1ZoGQgKA="},"flags/4x3/mx-246482013102c12a6f83dcdfe0fa40c350560ae64505f9b4d3113ea5356e2f71.svg":{"logical_path":"flags/4x3/mx.svg","mtime":"2022-05-22T18:31:04+02:00","size":94979,"digest":"8258503043a0a3b6fc68ef1af0025ef0de85fa482fb77e8ba220c3cd6a7a86a7","integrity":"sha256-glhQMEOgo7b8aO8a8AJe8N6F+kgvt36LoiDDzWp6hqc="},"flags/1x1/mx-27887b671ab9de501b6693ab60380e809962ac12222ddb580c9426e79e1360e3.svg":{"logical_path":"flags/1x1/mx.svg","mtime":"2022-05-22T18:31:04+02:00","size":90505,"digest":"b67b689c0045cb4e8a4d5a439adbbf4c471cc090cbeb7ba7b2aed0eeabdbef3e","integrity":"sha256-tntonABFy06KTVpDmtu/TEccwJDL63unsq7Q7qvb7z4="},"flags/4x3/my-00a98291486af1c01c11fe46a203dd07bee31d6b5ffb5f60d04ad337a3499775.svg":{"logical_path":"flags/4x3/my.svg","mtime":"2022-05-22T18:31:04+02:00","size":1270,"digest":"c992340a8c8284fca33fbcbcb287ace68c355a0603c471d9b09a207ab4f7390c","integrity":"sha256-yZI0CoyChPyjP7y8soes5ow1WgYDxHHZsJogerT3OQw="},"flags/1x1/my-a60a1ae968ed1ebbb60626370bd0494112b562a358c1381e6bb162268a110d8f.svg":{"logical_path":"flags/1x1/my.svg","mtime":"2022-05-22T18:31:04+02:00","size":1262,"digest":"cb10a92508324c9de2641b74ca7a0c4872548dc874fbcbe9f75d6aa46ecd28bd","integrity":"sha256-yxCpJQgyTJ3iZBt0ynoMSHJUjch0+8vp911qpG7NKL0="},"flags/4x3/mz-8281fb68c18d27bf1588de7684e67f14aeabbf8e66117eb4e640faac9762dbb4.svg":{"logical_path":"flags/4x3/mz.svg","mtime":"2022-05-22T18:31:04+02:00","size":2622,"digest":"db6310ed68179491d7d9ad03d133cd8ace0fd75dd0624f3f9f1c856eb799fdb1","integrity":"sha256-22MQ7WgXlJHX2a0D0TPNis4P113QYk8/nxyFbreZ/bE="},"flags/1x1/mz-dc805944726edfe3a8900cecd82ef15037381b81b6fab0d96d2cf93ba0d7a3ec.svg":{"logical_path":"flags/1x1/mz.svg","mtime":"2022-05-22T18:31:04+02:00","size":2597,"digest":"cbc5741e7cb4a2212dc311772b55688c4e9e2d2f11d1e2c3c42dd4f2a1464473","integrity":"sha256-y8V0Hny0oiEtwxF3K1VojE6eLS8R0eLDxC3U8qFGRHM="},"flags/4x3/na-d798d2db5bccea439f545e5e6dfa5aad6a166966cb5e223f7f2aa4d4dc73abd7.svg":{"logical_path":"flags/4x3/na.svg","mtime":"2022-05-22T18:31:04+02:00","size":1005,"digest":"7c73485829c6aee5fb2e678707883ae99de6ddc50f4393025fdadedd78944213","integrity":"sha256-fHNIWCnGruX7LmeHB4g66Z3m3cUPQ5MCX9re3XiUQhM="},"flags/1x1/na-0fceb3e900c021df14c00cab058c84cd834cb2f494a1db2fa58728a7f9445762.svg":{"logical_path":"flags/1x1/na.svg","mtime":"2022-05-22T18:31:04+02:00","size":977,"digest":"37d8c89f1f7e5e2dd7a7e2211afd542a9565533995500e5686c791a6e9f51d20","integrity":"sha256-N9jInx9+Xi3Xp+IhGv1UKpVlUzmVUA5WhseRpun1HSA="},"flags/4x3/nc-2861e50f3a0a1b1c368d913df4f4092c65bb3faa2d01e4d084fa33ed041e537a.svg":{"logical_path":"flags/4x3/nc.svg","mtime":"2022-05-22T18:31:04+02:00","size":1380,"digest":"b0c095d359e58de45a984c4d3aa73c5442e76c2b8837ae491f53284de1a15475","integrity":"sha256-sMCV01nljeRamExNOqc8VELnbCuIN65JH1MoTeGhVHU="},"flags/1x1/nc-1d65d86f9caaec75cc886c8abca3cc39b8de23c48e67b55936be3649ae67d716.svg":{"logical_path":"flags/1x1/nc.svg","mtime":"2022-05-22T18:31:04+02:00","size":1387,"digest":"d7a07223b8b040a88ea6a11662b947add62e438a993721494df88951aa9df656","integrity":"sha256-16ByI7iwQKiOpqEWYrlHrdYuQ4qZNyFJTfiJUaqd9lY="},"flags/4x3/ne-90b12ff4abee66e42d27b6c55dd602af3cc249f3492c8a449ec84a35a74ee6ed.svg":{"logical_path":"flags/4x3/ne.svg","mtime":"2022-05-22T18:31:04+02:00","size":276,"digest":"54d7076def267766d8e49d822d6b9b774e82bfe0a91269b0951148f5a19e4900","integrity":"sha256-VNcHbe8md2bY5J2CLWubd06Cv+CpEmmwlRFI9aGeSQA="},"flags/1x1/ne-ecd9bd0f027c05147c336ef396ffce7c16cf011f051860ae082ea99be34554e0.svg":{"logical_path":"flags/1x1/ne.svg","mtime":"2022-05-22T18:31:04+02:00","size":282,"digest":"bee088c42b4ce13a5dc346424f354a53a78db7db8eaa064bf534b711532f19c3","integrity":"sha256-vuCIxCtM4Tpdw0ZCTzVKU6eNt9uOqgZL9TS3EVMvGcM="},"flags/4x3/nf-3323e2cb59cb8f9282e45155b6830e4c06876bc0c24ee28e5dd4dcff28d2dc70.svg":{"logical_path":"flags/4x3/nf.svg","mtime":"2022-05-22T18:31:04+02:00","size":5837,"digest":"f0e0b96f2586ad66b367fe6490b48df8aeea0c100bf5178cd1ffbc03571fe95c","integrity":"sha256-8OC5byWGrWazZ/5kkLSN+K7qDBAL9ReM0f+8A1cf6Vw="},"flags/1x1/nf-3da2a0db99d85998154510ac50674728e4768079a57443529b18b1ed87e5c077.svg":{"logical_path":"flags/1x1/nf.svg","mtime":"2022-05-22T18:31:04+02:00","size":5591,"digest":"4880d7db266b4219bf4878fa435f9021c02d86c7309d6571c5cc6a0eba81777d","integrity":"sha256-SIDX2yZrQhm/SHj6Q1+QIcAthscwnWVxxcxqDrqBd30="},"flags/4x3/ng-387e036e728aa4c36d93fad3c90e76e3beab727783ec11da7fbce30ff52c805e.svg":{"logical_path":"flags/4x3/ng.svg","mtime":"2022-05-22T18:31:04+02:00","size":260,"digest":"f1ca02b4d2034f53a5b768674883dab4b21852dc2ae39b2d02bc281384d95e33","integrity":"sha256-8coCtNIDT1Olt2hnSIPatLIYUtwq45stArwoE4TZXjM="},"flags/1x1/ng-c4c24f43d15d5690390ea6d5a4b41911aa7cf0807167d69e95748c4439211dcb.svg":{"logical_path":"flags/1x1/ng.svg","mtime":"2022-05-22T18:31:04+02:00","size":260,"digest":"8b34a12b4b7116eb6ecc79744e0b0244cacdea5ea200940522042fa12953097a","integrity":"sha256-izShK0txFutuzHl0TgsCRMrN6l6iAJQFIgQvoSlTCXo="},"flags/4x3/ni-b83cccf0a65d0abf0398b905936ca6b6d5b1b64db8a34223225e3e4eb4f0311d.svg":{"logical_path":"flags/4x3/ni.svg","mtime":"2022-05-22T18:31:04+02:00","size":18408,"digest":"a6c8d7f7a74b93a4c42589c951ce37ea3e073daf82f2418efa6a5ff1ec2d23fb","integrity":"sha256-psjX96dLk6TEJYnJUc436j4HPa+C8kGO+mpf8ewtI/s="},"flags/1x1/ni-35731438cffa30b56cc403c5e9a59e85e661566a0d72c5310865aaf282731e0f.svg":{"logical_path":"flags/1x1/ni.svg","mtime":"2022-05-22T18:31:04+02:00","size":18463,"digest":"a9ead4b075e183ce139f9c26256dd2a8d083d4d126d85f3848d8e9ac884ab504","integrity":"sha256-qerUsHXhg84Tn5wmJW3SqNCD1NEm2F84SNjprIhKtQQ="},"flags/4x3/nl-a71cd17ec0d083d39373108c1f5e994e71491e1f7ac34119e60c859142a2d34d.svg":{"logical_path":"flags/4x3/nl.svg","mtime":"2022-05-22T18:31:04+02:00","size":224,"digest":"a91174a3cccd5ec66da2cc68e0cbf86a3ea73d2976dc303c72109198b2504b51","integrity":"sha256-qRF0o8zNXsZtosxo4Mv4aj6nPSl23DA8chCRmLJQS1E="},"flags/1x1/nl-6bfba1aa0f31f33e126e51832eddba06a92106d569f3e01dc4989a3425f45eac.svg":{"logical_path":"flags/1x1/nl.svg","mtime":"2022-05-22T18:31:04+02:00","size":228,"digest":"426beba2bc0a7ae4079c8586509f6902dc9a6082f4a0ec7c71520572ac3f86c2","integrity":"sha256-QmvrorwKeuQHnIWGUJ9pAtyaYIL0oOx8cVIFcqw/hsI="},"flags/4x3/no-d4ae9765d2dd03faef1007008bf1ccde064e36c765faef79a270e7e8fa97c23a.svg":{"logical_path":"flags/4x3/no.svg","mtime":"2022-05-22T18:31:04+02:00","size":321,"digest":"c59f156ddd70507f05267dc35e2e4f3e44467b9ef414995abb91589dc486dd6a","integrity":"sha256-xZ8Vbd1wUH8FJn3DXi5PPkRGe570FJlau5FYncSG3Wo="},"flags/1x1/no-7b3a522b5101f7bcc5c9ac05adbfbfa3dacde4fc4420d2997b1ab38af7e50dbc.svg":{"logical_path":"flags/1x1/no.svg","mtime":"2022-05-22T18:31:04+02:00","size":321,"digest":"567df11f5e12f95a4c707234127ad878db61c286cfdd034dbcab8c4222c4af25","integrity":"sha256-Vn3xH14S+VpMcHI0EnrYeNthwobP3QNNvKuMQiLEryU="},"flags/4x3/np-043dff0f7f1cd254f2c2d82367557e5f4a15579af81242e2979523700adaeaf1.svg":{"logical_path":"flags/4x3/np.svg","mtime":"2022-05-22T18:31:04+02:00","size":1061,"digest":"ddc042ba58c0842e4a1dd8ac56701dd8e22659cb04e3905d3866810d6333aaf0","integrity":"sha256-3cBCuljAhC5KHdisVnAd2OImWcsE45BdOGaBDWMzqvA="},"flags/1x1/np-976aa23f62798e1c0974a78649ff295334fc0d39f63eb19e990d2a13efe9fbe2.svg":{"logical_path":"flags/1x1/np.svg","mtime":"2022-05-22T18:31:04+02:00","size":1193,"digest":"d81adac491e4e7cef7e94ab6e94f00564b319f9a383b85e0dd753aebc1cfeea2","integrity":"sha256-2BraxJHk58736Uq26U8AVksxn5o4O4Xg3XU668HP7qI="},"flags/4x3/nr-f977239dc4f2dbb4185bcb741dc0aae4b46dd2d647444150f317e8dfb3062fd3.svg":{"logical_path":"flags/4x3/nr.svg","mtime":"2022-05-22T18:31:04+02:00","size":651,"digest":"2f19fb532598a59536ccf4bb6f4446c08eb1b9ed5ebe0ff1f00bc6fc8c36e792","integrity":"sha256-Lxn7UyWYpZU2zPS7b0RGwI6xue1evg/x8AvG/Iw255I="},"flags/1x1/nr-1899ab289aa424dfa1bb1a787a5dae3d9081b212433441fe9a7c95c1c377fc01.svg":{"logical_path":"flags/1x1/nr.svg","mtime":"2022-05-22T18:31:04+02:00","size":668,"digest":"6e66f80525a6b92920b1acd01c9bcc214b1a2f05393d65af6428567e7de0cc6c","integrity":"sha256-bmb4BSWmuSkgsazQHJvMIUsaLwU5PWWvZChWfn3gzGw="},"flags/4x3/nu-84b56f2711a6b958b9072dff3912f225c034d246341cc29c4eba6c34c70fe6f0.svg":{"logical_path":"flags/4x3/nu.svg","mtime":"2022-05-22T18:31:04+02:00","size":1745,"digest":"55390cc014e85eb56b9d08004470900d13d95ed83ddb5006bf4e0e1cf519028c","integrity":"sha256-VTkMwBToXrVrnQgARHCQDRPZXtg921AGv04OHPUZAow="},"flags/1x1/nu-60cdb57b27737dddc21980f6630e7476471ce8c1bc34b3a2632819bef23a26a5.svg":{"logical_path":"flags/1x1/nu.svg","mtime":"2022-05-22T18:31:04+02:00","size":1727,"digest":"1bfa55a93eca4ffd981f98935d6c2cab58a29be4f0d2f15a50148d695ab50f3f","integrity":"sha256-G/pVqT7KT/2YH5iTXWwsq1iim+Tw0vFaUBSNaVq1Dz8="},"flags/4x3/nz-9cca5c871f70cdd784a33836d5a07ada7f6eaa720811c70dc2306a2a5056648d.svg":{"logical_path":"flags/4x3/nz.svg","mtime":"2022-05-22T18:31:04+02:00","size":2989,"digest":"b7f4f0961f007b0cc355df85903b0af0cfd6b655e23aa56aa547dc5ed693ae7f","integrity":"sha256-t/Twlh8AewzDVd+FkDsK8M/WtlXiOqVqpUfcXtaTrn8="},"flags/1x1/nz-e5c8b6660d172e25e80f1d9530fb3e8b05fba1c4c02b95679fbcd5a0c50169f9.svg":{"logical_path":"flags/1x1/nz.svg","mtime":"2022-05-22T18:31:04+02:00","size":2999,"digest":"b93a77fe262ed1d5fbd196f2224c0fa2b3dd6d1e84c0027c5a122643fdad8d23","integrity":"sha256-uTp3/iYu0dX70ZbyIkwPorPdbR6EwAJ8WhImQ/2tjSM="},"flags/4x3/om-fbef9222761223ced04e2946ec71432c761618ad58b8a3a5af5627a1d75b48e9.svg":{"logical_path":"flags/4x3/om.svg","mtime":"2022-05-22T18:31:04+02:00","size":22636,"digest":"d66047c0f554b25250566bdbdf7d4ac03c0f708f03cd4c4159c57f16fa056967","integrity":"sha256-1mBHwPVUslJQVmvb331KwDwPcI8DzUxBWcV/FvoFaWc="},"flags/1x1/om-07148a6924f8ce843e33be4f3d9d5dd40040da366e667925985e7b247073d08e.svg":{"logical_path":"flags/1x1/om.svg","mtime":"2022-05-22T18:31:04+02:00","size":22614,"digest":"20669c3a4f181d035b5acd82a12d7354b3c5decb53383ea6b7a53d02b7138fe9","integrity":"sha256-IGacOk8YHQNbWs2CoS1zVLPF3stTOD6mt6U9ArcTj+k="},"flags/4x3/pa-50535df4995256b70ce0a7971ba95922046d445c06a567fd951d7f5a79cbe547.svg":{"logical_path":"flags/4x3/pa.svg","mtime":"2022-05-22T18:31:04+02:00","size":749,"digest":"0bd4b6709d9ca822851f2d7c57ef9fb3c098ceeea5d239bbf8f3196b062d1d11","integrity":"sha256-C9S2cJ2cqCKFHy18V++fs8CYzu6l0jm7+PMZawYtHRE="},"flags/1x1/pa-e4d955c65827104b4f898beb392af5ffed5f62a09035f42801512b5b3d7767d1.svg":{"logical_path":"flags/1x1/pa.svg","mtime":"2022-05-22T18:31:04+02:00","size":659,"digest":"6e0e27190b3c3806b6cae82d0e3708c05e02bc82479e252f4486a0eee43a58d7","integrity":"sha256-bg4nGQs8OAa2yugtDjcIwF4CvIJHniUvRIag7uQ6WNc="},"flags/4x3/pe-b518a86545125ff3c3fde029c2992233df876b663d8ec723bd4d67f90f72cb62.svg":{"logical_path":"flags/4x3/pe.svg","mtime":"2022-05-22T18:31:04+02:00","size":73609,"digest":"3fddfd9a5405daa75ae35d717219be04940fbd956b583fa9a75d0c54ec5d6da5","integrity":"sha256-P939mlQF2qda411xchm+BJQPvZVrWD+pp10MVOxdbaU="},"flags/1x1/pe-8e395c37a87d3ea212ceaf0768869f2ae38ad507761ef6b10b2077f01274d6b0.svg":{"logical_path":"flags/1x1/pe.svg","mtime":"2022-05-22T18:31:04+02:00","size":72907,"digest":"e0468f05eddaea5fb78d8d86440a580cd9cf5f27baa3e2ac4f229b4423abd7f9","integrity":"sha256-4EaPBe3a6l+3jY2GRApYDNnPXye6o+KsTyKbRCOr1/k="},"flags/4x3/pf-d1537625ade03a7fae7a5bdcfc5fe9f6449977613a38ddd258c8572f3630185b.svg":{"logical_path":"flags/4x3/pf.svg","mtime":"2022-05-22T18:31:04+02:00","size":4290,"digest":"de72e06f1af9d5d3f44995e41ec69b3669da1d59a40b4d99b03164617ab326b1","integrity":"sha256-3nLgbxr51dP0SZXkHsabNmnaHVmkC02ZsDFkYXqzJrE="},"flags/1x1/pf-c78c72a0ad139c9da31592af7c443cfef4e1e1baf208e44088ca667298324c9e.svg":{"logical_path":"flags/1x1/pf.svg","mtime":"2022-05-22T18:31:04+02:00","size":4229,"digest":"d68e024f9a826b0790679bf50cf2f004f5063aacbf99948a0aeb792c97e20c88","integrity":"sha256-1o4CT5qCaweQZ5v1DPLwBPUGOqy/mZSKCut5LJfiDIg="},"flags/4x3/pg-3190ab67d73878026d59e98e14b0cf98812c5c086d35956383c9986f7e0433a3.svg":{"logical_path":"flags/4x3/pg.svg","mtime":"2022-05-22T18:31:04+02:00","size":1661,"digest":"10ae837d9c7828178cc70a3489b719ab88a3c3dfbd58bfcf7c0ce26908efc809","integrity":"sha256-EK6DfZx4KBeMxwo0ibcZq4ijw9+9WL/PfAziaQjvyAk="},"flags/1x1/pg-fe2bbe3c6599a4bf895b9f748d5a15650a7d29c854252e3b074c780a77cd51b9.svg":{"logical_path":"flags/1x1/pg.svg","mtime":"2022-05-22T18:31:04+02:00","size":2095,"digest":"40cd64620f6af0b94340fa7c71de0e2ef541e6072d886e666ddf6acd2f5aecdb","integrity":"sha256-QM1kYg9q8LlDQPp8cd4OLvVB5gctiG5mbd9qzS9a7Ns="},"flags/4x3/ph-ec483bd752a5a0d1f063397a2c206bdd9b23451d2c262eceba6411b2769ed3b1.svg":{"logical_path":"flags/4x3/ph.svg","mtime":"2022-05-22T18:31:04+02:00","size":1565,"digest":"fd167a43304972aa43f76a0ec3f03dc89dde4f96adc654a7e0e2e1257aa9a7e5","integrity":"sha256-/RZ6QzBJcqpD92oOw/A9yJ3eT5atxlSn4OLhJXqpp+U="},"flags/1x1/ph-0d61f012185140030d9879f180b8279ab7798a9d7d062e141937ba83b51ab20e.svg":{"logical_path":"flags/1x1/ph.svg","mtime":"2022-05-22T18:31:04+02:00","size":1510,"digest":"2f9dd37f9762ce80f198b8cb9b4acab9e19c482d7cbb927f7866b1920133af3c","integrity":"sha256-L53Tf5dizoDxmLjLm0rKueGcSC18u5J/eGaxkgEzrzw="},"flags/4x3/pk-776714f751e4347341656ce5e88c6fa13316e2e36205cd8d09c73779794c2a56.svg":{"logical_path":"flags/4x3/pk.svg","mtime":"2022-05-22T18:31:04+02:00","size":739,"digest":"0c5ada4d149d7ff18ea90733cf9bfa8754981730138c20ec97b864d97fe34ef9","integrity":"sha256-DFraTRSdf/GOqQczz5v6h1SYFzATjCDsl7hk2X/jTvk="},"flags/1x1/pk-50284d5da424696f41ac4861f8eff6e5bc23a6e1812df7b444967c6e58ec6f81.svg":{"logical_path":"flags/1x1/pk.svg","mtime":"2022-05-22T18:31:04+02:00","size":684,"digest":"637994c86e94944be181dba8727a3b136191f72ebe53f043f0b7297fcced5903","integrity":"sha256-Y3mUyG6UlEvhgduocno7E2GR9y6+U/BD8Lcpf8ztWQM="},"flags/4x3/pl-9bb56d1ec91d8c843ec53b018dc861772e466bad1582a9ba42148524347adf6d.svg":{"logical_path":"flags/4x3/pl.svg","mtime":"2022-05-22T18:31:04+02:00","size":222,"digest":"bd8c588ce4c71594e5f3789b700c935e3c97e5c06e62ddb595752c805e90d851","integrity":"sha256-vYxYjOTHFZTl83ibcAyTXjyX5cBuYt21lXUsgF6Q2FE="},"flags/1x1/pl-acc73e013a67a13fde68d812b22889be9150cce57d029deab6ba5b0ba4e7b69a.svg":{"logical_path":"flags/1x1/pl.svg","mtime":"2022-05-22T18:31:04+02:00","size":222,"digest":"d7c4aadb69ef13492016a7b2995020f9d754d128f9354dd742c32d420c3340ad","integrity":"sha256-18Sq22nvE0kgFqeymVAg+ddU0Sj5NU3XQsMtQgwzQK0="},"flags/4x3/pm-5d990f5bc74366f734851ceb35046baaae3555ccff57e6cf95c7143f9b245532.svg":{"logical_path":"flags/4x3/pm.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"e1e1de44f61b53fb70041acec8426e6505526c9a29317a4fc1dbc206f0f261e6","integrity":"sha256-4eHeRPYbU/twBBrOyEJuZQVSbJopMXpPwdvCBvDyYeY="},"flags/1x1/pm-781f551a82a88b0a5e238b078310bc843950c844092d8ce1e52587feca285606.svg":{"logical_path":"flags/1x1/pm.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"4e3a65b4577055027d41ebf6441200b8e1f360a1677e2032f262b58805689641","integrity":"sha256-TjpltFdwVQJ9Qev2RBIAuOHzYKFnfiAy8mK1iAVolkE="},"flags/4x3/pn-1e347803c27d86312324a6a6712dee0bf5590971f027fffe082681dccce6c4c1.svg":{"logical_path":"flags/4x3/pn.svg","mtime":"2022-05-22T18:31:04+02:00","size":10878,"digest":"d05afc2826bdaa9121a17e9ff42d35ec4a72668a4efe0b65acd6e6de23f8268c","integrity":"sha256-0Fr8KCa9qpEhoX6f9C017EpyZopO/gtlrNbm3iP4Jow="},"flags/1x1/pn-b9762ab4fd752edc4506fd05f2810094e8de8b3cf6fffd00bafb89b6ed95359c.svg":{"logical_path":"flags/1x1/pn.svg","mtime":"2022-05-22T18:31:04+02:00","size":8517,"digest":"c2f3565f6e8282d44babe06fd25605c002f5abb3edafa843762a9ed6de06464b","integrity":"sha256-wvNWX26CgtRLq+Bv0lYFwAL1q7Ptr6hDdiqe1t4GRks="},"flags/4x3/pr-4c0359aa4277d04c3c3af8ff89d0bbea462b480334cd6974beb6c5739c42903a.svg":{"logical_path":"flags/4x3/pr.svg","mtime":"2022-05-22T18:31:04+02:00","size":637,"digest":"f87e928ea7a84ebc9c7d6e8ee6e43e9f93014adebc4604f01fe36db29e635ed8","integrity":"sha256-+H6SjqeoTrycfW6O5uQ+n5MBSt68RgTwH+Ntsp5jXtg="},"flags/1x1/pr-dc838368c71fe79aea88491ec3e419ff01c26a5af460b05a79cb6cc6fa02b6b2.svg":{"logical_path":"flags/1x1/pr.svg","mtime":"2022-05-22T18:31:04+02:00","size":619,"digest":"7a94e53dbfc93808d194a05e79f780aef0d2b231e830e4fb4b931cdde7d6da26","integrity":"sha256-epTlPb/JOAjRlKBeefeArvDSsjHoMOT7S5Mc3efW2iY="},"flags/4x3/ps-39b00800524af9e8d270c479274be2dd5459c13d67a6f308139a69adbae4997f.svg":{"logical_path":"flags/4x3/ps.svg","mtime":"2022-05-22T18:31:04+02:00","size":561,"digest":"84421fd66f9058e424da190fc8b3f6a0d35e7bb918aa6fffacd00a1a2c1b2d71","integrity":"sha256-hEIf1m+QWOQk2hkPyLP2oNNee7kYqm//rNAKGiwbLXE="},"flags/1x1/ps-9102a922196261028bd07e60d1b2ef435e123aae8bba6d49a5918123f8be18f6.svg":{"logical_path":"flags/1x1/ps.svg","mtime":"2022-05-22T18:31:04+02:00","size":541,"digest":"31a06ee8dc4500f9665b4e3654489abc6a77851c7a43c245809bc874ac6f77e9","integrity":"sha256-MaBu6NxFAPlmW042VEiavGp3hRx6Q8JFgJvIdKxvd+k="},"flags/4x3/pt-f76294ca6203778375158111051358fb535eaebb06d50951eb5326f9ede31536.svg":{"logical_path":"flags/4x3/pt.svg","mtime":"2022-05-22T18:31:04+02:00","size":8280,"digest":"62137f64b8b37b24510095926415b3120029f0d57e97817209e895f9c50b26dd","integrity":"sha256-YhN/ZLizeyRRAJWSZBWzEgAp8NV+l4FyCeiV+cULJt0="},"flags/1x1/pt-09b4548e5764d2a6c56bf9c33e8652911f91b16ab6bfa3041630506480281047.svg":{"logical_path":"flags/1x1/pt.svg","mtime":"2022-05-22T18:31:04+02:00","size":8661,"digest":"2fc8fb378410d636377385d6d007f20a41d6493fdae51a35cab5eaa5da3328fa","integrity":"sha256-L8j7N4QQ1jY3c4XW0AfyCkHWST/a5Ro1yrXqpdozKPo="},"flags/4x3/pw-029fb7bb87eec12c79cbe662fe3614698c7638186958fb6032e59a17705777cb.svg":{"logical_path":"flags/4x3/pw.svg","mtime":"2022-05-22T18:31:04+02:00","size":467,"digest":"c59cfacb984b59244f48132977b96327c880f391431a2610ec4617d1f73ee3a7","integrity":"sha256-xZz6y5hLWSRPSBMpd7ljJ8iA85FDGiYQ7EYX0fc+46c="},"flags/1x1/pw-39f82e7a0e390333a2d0f4a1396a8f710af7ec3002c5542d7d6c76d634a67e82.svg":{"logical_path":"flags/1x1/pw.svg","mtime":"2022-05-22T18:31:04+02:00","size":507,"digest":"21a677b7fa3f33a6304926ac4b0d516f2710d9d576cefb46674e3f9c2a444956","integrity":"sha256-IaZ3t/o/M6YwSSasSw1RbycQ2dV2zvtGZ04/nCpESVY="},"flags/4x3/py-6f18a4e716e9fbe7d0caf99651fee56e44ffd2a13ce77f50a8374a7fe6b0879d.svg":{"logical_path":"flags/4x3/py.svg","mtime":"2022-05-22T18:31:04+02:00","size":17097,"digest":"22570d444732336f9af31307c5b4c5809d8c028319b81c24966d0b48e441f08c","integrity":"sha256-IlcNREcyM2+a8xMHxbTFgJ2MAoMZuBwklm0LSORB8Iw="},"flags/1x1/py-0325fb333b5ea2adb996345bf2bf5df0c460c87ca97cb3c8f6e65a7f33aa1722.svg":{"logical_path":"flags/1x1/py.svg","mtime":"2022-05-22T18:31:04+02:00","size":17246,"digest":"da5901ec6f8fa93f84e42140bd923592b84084a648569d76b476e7512e3620da","integrity":"sha256-2lkB7G+PqT+E5CFAvZI1krhAhKZIVp12tHbnUS42INo="},"flags/4x3/qa-55eb7d6716998d68fe6e3345807dc410e5c5e8511bb2c78f0d08d51da707a131.svg":{"logical_path":"flags/4x3/qa.svg","mtime":"2022-05-22T18:31:04+02:00","size":359,"digest":"a5e58fc790b76e90b945a68bb4f15223254201bf006040d953092dee5ca8da31","integrity":"sha256-peWPx5C3bpC5RaaLtPFSIyVCAb8AYEDZUwkt7lyo2jE="},"flags/1x1/qa-cfff93f4c31946f7646a855521a7db667c78cb89a7c2ac339c64c14f06be0f7a.svg":{"logical_path":"flags/1x1/qa.svg","mtime":"2022-05-22T18:31:04+02:00","size":356,"digest":"ffa8cd4edd7ac169127363f8f0476ffe11279367334f1fa910320541a1a94505","integrity":"sha256-/6jNTt16wWkSc2P48Edv/hEnk2czTx+pEDIFQaGpRQU="},"flags/4x3/re-8b3124b78a7752ee288a401ae16c3cf5dafc1296e443ba941de8b338b16c2723.svg":{"logical_path":"flags/4x3/re.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"5183af67c4fa08369e9251a2a102a4ed578c24bb59092dd92f3a572d90223434","integrity":"sha256-UYOvZ8T6CDaeklGioQKk7VeMJLtZCS3ZLzpXLZAiNDQ="},"flags/1x1/re-c7173d64ef4a62237f83c7af8cb144fba8c38bd7ac8e7125eda78320931215ca.svg":{"logical_path":"flags/1x1/re.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"37be9dc3645dac4c1463068f9001cff31288ef527c2fca0d6432022858070084","integrity":"sha256-N76dw2RdrEwUYwaPkAHP8xKI71J8L8oNZDICKFgHAIQ="},"flags/4x3/ro-a10768f5227b028969ceb2bce6e3fc2ecbea0c5e40d1946c47d913d2745a8b21.svg":{"logical_path":"flags/4x3/ro.svg","mtime":"2022-05-22T18:31:04+02:00","size":305,"digest":"854593a65b29383274aabe385c4ff58794a2b5d4b89c5414a0ff11f96d016f1e","integrity":"sha256-hUWTplspODJ0qr44XE/1h5SitdS4nFQUoP8R+W0Bbx4="},"flags/1x1/ro-a4cfc4bce72dc7b034f2b84e932ba3d47f7a9404b94b1450af48263c576b62c8.svg":{"logical_path":"flags/1x1/ro.svg","mtime":"2022-05-22T18:31:04+02:00","size":305,"digest":"da9e0ce1ebd0f466ff68500173fe067212d304b8f4594f54bd61bd3e5409c7a9","integrity":"sha256-2p4M4evQ9Gb/aFABc/4GchLTBLj0WU9UvWG9PlQJx6k="},"flags/4x3/rs-9792f9ae9694c0dfa1a213ec6ceb29d7b41819a508bedc4bf89dc4c285e48712.svg":{"logical_path":"flags/4x3/rs.svg","mtime":"2022-05-22T18:31:04+02:00","size":187134,"digest":"cbb54d608b15e2bd4d422b8d83f061115c2087d070969b2e9f6112647569ce3a","integrity":"sha256-y7VNYIsV4r1NQiuNg/BhEVwgh9Bwlpsun2ESZHVpzjo="},"flags/1x1/rs-cd44c0b89c5e2c2d0afe1902a263d60648dd18e97636256eb1ffc3148e336cd7.svg":{"logical_path":"flags/1x1/rs.svg","mtime":"2022-05-22T18:31:04+02:00","size":186989,"digest":"04c759a5129437dcc03dffb362199c84fc773a185726dc2ed09f9cfd41370fdb","integrity":"sha256-BMdZpRKUN9zAPf+zYhmchPx3OhhXJtwu0J+c/UE3D9s="},"flags/4x3/ru-ce34e72a9d955c6c6860a5e552cd3902d236bbff5a714a49a1b8f8dbbce3c410.svg":{"logical_path":"flags/4x3/ru.svg","mtime":"2022-05-22T18:31:04+02:00","size":286,"digest":"5b51b57f63cf58e451abddeaee39a8c7b133cb3d58c6ef1a903883bda7c346b0","integrity":"sha256-W1G1f2PPWORRq93q7jmox7Ezyz1Yxu8akDiDvafDRrA="},"flags/1x1/ru-aa0d5e4855f92f211efad3979493956dfe01ad4a0b552814cad05fa67694de03.svg":{"logical_path":"flags/1x1/ru.svg","mtime":"2022-05-22T18:31:04+02:00","size":290,"digest":"bb2782a916b1a28eb081895afa90f4ed5dca5df320b9cc95f867bc2a26e29064","integrity":"sha256-uyeCqRaxoo6wgYla+pD07V3KXfMgucyV+Ge8KibikGQ="},"flags/4x3/rw-0f08a5e527db8287642f1aafeb397fd49ac3add8e86dbb0d9a8be7d2c43b0153.svg":{"logical_path":"flags/4x3/rw.svg","mtime":"2022-05-22T18:31:04+02:00","size":747,"digest":"aeb9bc73cd3fe25e7c1a1a7bdddc11eb3d71a3273919dd2f4247873db78fbe75","integrity":"sha256-rrm8c80/4l58Ghp73dwR6z1xoyc5Gd0vQkeHPbePvnU="},"flags/1x1/rw-297915f2fa836eba2dc1d795a4f5b1c51f8d9abdc6704b13e63cd81c81476f09.svg":{"logical_path":"flags/1x1/rw.svg","mtime":"2022-05-22T18:31:04+02:00","size":748,"digest":"8c27cde746de68484394ef6dc519583cf67e380ca5e8d48cf37fa4d99fef57ed","integrity":"sha256-jCfN50beaEhDlO9txRlYPPZ+OAyl6NSM83+k2Z/vV+0="},"flags/4x3/sa-70281c72fb6008faf5d36c401593c7c8f0c8870332e23fa3b1b53cd0f88e9ad5.svg":{"logical_path":"flags/4x3/sa.svg","mtime":"2022-05-22T18:31:04+02:00","size":10238,"digest":"d54e76d7ad9da5242aa26d5dbec120b8a4530c097ae45d0b22e539f2d9c6ad8b","integrity":"sha256-1U52162dpSQqom1dvsEguKRTDAl65F0LIuU58tnGrYs="},"flags/1x1/sa-463ab66153968c569b854793714e414ea77185758a8236364019d4e7e40582fc.svg":{"logical_path":"flags/1x1/sa.svg","mtime":"2022-05-22T18:31:04+02:00","size":10179,"digest":"639ee1c158b0b61e8789bde27ae64edb246afe63cb8999e3468ca88c344927be","integrity":"sha256-Y57hwViwth6Hib3ieuZO2yRq/mPLiZnjRoyojDRJJ74="},"flags/4x3/sb-5de262c7e2fda747ea4ac98c2ca9ce045f07de995330b1fc3bbbf39e25ae42f6.svg":{"logical_path":"flags/4x3/sb.svg","mtime":"2022-05-22T18:31:04+02:00","size":953,"digest":"651213df067f16dbdba2288928434afdd54f192b50bf15d06206ade966d54bac","integrity":"sha256-ZRIT3wZ/FtvboiiJKENK/dVPGStQvxXQYgat6WbVS6w="},"flags/1x1/sb-638ead7b9c9a42fe2318daf753a8f0ce9cea4792114d8d7475d5a5abcf697cb6.svg":{"logical_path":"flags/1x1/sb.svg","mtime":"2022-05-22T18:31:04+02:00","size":952,"digest":"19048c26004da6fe2a1dd5f3f695066b24f3096d1527edbdaac03c2817046fe3","integrity":"sha256-GQSMJgBNpv4qHdXz9pUGayTzCW0VJ+29qsA8KBcEb+M="},"flags/4x3/sc-46736983ebac2719d3e3aca36e3dbb896f612db71b72e9e5d6f3da36ae59c0ac.svg":{"logical_path":"flags/4x3/sc.svg","mtime":"2022-05-22T18:31:04+02:00","size":571,"digest":"2ed9272d5fd2fa92d29289f49f58f5f64f66977165fa1a80f9eb6aa57335517e","integrity":"sha256-LtknLV/S+pLSkon0n1j19k9ml3Fl+hqA+etqpXM1UX4="},"flags/1x1/sc-1dc9321cdeeecad7c6485b2bc3aef87a1a1ca116c18908286b5f79bdb5ee8313.svg":{"logical_path":"flags/1x1/sc.svg","mtime":"2022-05-22T18:31:04+02:00","size":570,"digest":"90424aafda9a2aa7d98030c0aa7bc604c77c1b0f7c5e6a094dffd2b803a88c71","integrity":"sha256-kEJKr9qaKqfZgDDAqnvGBMd8Gw98XmoJTf/SuAOojHE="},"flags/4x3/sd-3b49e891fcda945b02ee18ce8cee078f251d8e822201ba0f8953eb3efb0b2860.svg":{"logical_path":"flags/4x3/sd.svg","mtime":"2022-05-22T18:31:04+02:00","size":497,"digest":"b8b9d97103e668a2b043311b6453c2df25d5c3adcf62481e4c79a627c6784f4d","integrity":"sha256-uLnZcQPmaKKwQzEbZFPC3yXVw63PYkgeTHmmJ8Z4T00="},"flags/1x1/sd-993e4821f73f36e6dd12332ed727047a97c7d31b1c8f0b3312e924c5f437eb34.svg":{"logical_path":"flags/1x1/sd.svg","mtime":"2022-05-22T18:31:04+02:00","size":493,"digest":"da52cd7a173ecc0bc7e9a7c7ed4a20558a7f4cb5b6cd308790b7552a70421abc","integrity":"sha256-2lLNehc+zAvH6afH7UogVYp/TLW2zTCHkLdVKnBCGrw="},"flags/4x3/se-8e13876ab89aedc66156f36f55fefe66068c43657a803ba6b98843c171fb06c7.svg":{"logical_path":"flags/4x3/se.svg","mtime":"2022-05-22T18:31:04+02:00","size":691,"digest":"7b5be8932db6e5153d1f11ddba2d36cb4a33ddd7100e5c59cef3a2502215b062","integrity":"sha256-e1voky225RU9HxHdui02y0oz3dcQDlxZzvOiUCIVsGI="},"flags/1x1/se-8af88180b9c1ca0b24dbf5e04039a523c6f0ce975094c7fb6b38a4901b2e5c5d.svg":{"logical_path":"flags/1x1/se.svg","mtime":"2022-05-22T18:31:04+02:00","size":698,"digest":"9b0845f8163d147e4fce6e814709d5813e53f00f8f5ccb40cfa4cb9e37388837","integrity":"sha256-mwhF+BY9FH5Pzm6BRwnVgT5T8A+PXMtAz6TLnjc4iDc="},"flags/4x3/sg-da88143d134efe0c37b67471ceb24a9ced62ae9ade25530232c92435e6f46b65.svg":{"logical_path":"flags/4x3/sg.svg","mtime":"2022-05-22T18:31:04+02:00","size":887,"digest":"fa164984f038fa81540d519c5d08123ed55f31bb8aa73798af7698c69dca2226","integrity":"sha256-+hZJhPA4+oFUDVGcXQgSPtVfMbuKpzeYr3aYxp3KIiY="},"flags/1x1/sg-80e8f95951096bba14b6d6ebea036b0717617668d96f32b5a8172a06be1feb22.svg":{"logical_path":"flags/1x1/sg.svg","mtime":"2022-05-22T18:31:04+02:00","size":948,"digest":"f6f8ecdd6f0099c072886716d98098d08de334f6f307398e9922f4df40ef7b2a","integrity":"sha256-9vjs3W8AmcByiGcW2YCY0I3jNPbzBzmOmSL030Dveyo="},"flags/4x3/sh-3b36e972618f594e95974a9c551d3ba9ead3e9b175d8dac0bc30fd1910f82561.svg":{"logical_path":"flags/4x3/sh.svg","mtime":"2022-05-22T18:31:04+02:00","size":29501,"digest":"e7b5e4dc5360fd9ec2e0dd50074e82a53566a61ab88a36b6b5cc80451a2d9279","integrity":"sha256-57Xk3FNg/Z7C4N1QB06CpTVmphq4ija2tcyARRotknk="},"flags/1x1/sh-f25afcdb45a6c2d58e3984d40188a03342271f2f6312b868236b2a1c02a2e60e.svg":{"logical_path":"flags/1x1/sh.svg","mtime":"2022-05-22T18:31:04+02:00","size":30113,"digest":"c3a061079dd7f5ea785a4b4a4903ec4cefc4a26cd73371c0bfa3a0b231593947","integrity":"sha256-w6BhB53X9ep4WktKSQPsTO/EomzXM3HAv6OgsjFZOUc="},"flags/4x3/si-a9715a0c1db87762010c25b6d3bb90f73de3c893aa3bbc7412d57dfa14f28dd5.svg":{"logical_path":"flags/4x3/si.svg","mtime":"2022-05-22T18:31:04+02:00","size":2053,"digest":"25487f7aa91f115d558f031ffaf0d399924b032100d24d467c3bd1cb026d9001","integrity":"sha256-JUh/eqkfEV1VjwMf+vDTmZJLAyEA0k1GfDvRywJtkAE="},"flags/1x1/si-daa3e030c059585d235a78f228c89a32bc50df223da8efa32f85a13978524365.svg":{"logical_path":"flags/1x1/si.svg","mtime":"2022-05-22T18:31:04+02:00","size":2065,"digest":"53973e8d5c2086570023dbffbdef1a8a181cd49b33da4fde01de7a57b8346c57","integrity":"sha256-U5c+jVwghlcAI9v/ve8aihgc1Jsz2k/eAd56V7g0bFc="},"flags/4x3/sj-a2fa34115702482c2af9c7632eaeec77a26a1de129ce825bc38e27b6523e19ba.svg":{"logical_path":"flags/4x3/sj.svg","mtime":"2022-05-22T18:31:04+02:00","size":321,"digest":"e64bad4f257ee1219640dce3608270b8a4c7ebfc37f91ac9e4fa5957ea0814f5","integrity":"sha256-5kutTyV+4SGWQNzjYIJwuKTH6/w3+RrJ5PpZV+oIFPU="},"flags/1x1/sj-55f27b8e6aa75b9db244543edd19b891f3c07d59106cf08ff5c47781c480d272.svg":{"logical_path":"flags/1x1/sj.svg","mtime":"2022-05-22T18:31:04+02:00","size":321,"digest":"d764d5de8ca4a67ea323376c7c4dc48a3ec51bb043556ee07dca9e4989ba147f","integrity":"sha256-12TV3oykpn6jIzdsfE3Eij7FG7BDVW7gfcqeSYm6FH8="},"flags/4x3/sk-b285dd82884088b14db516eac76a39b29752279ac9f0f3e7c84b624edea66aa8.svg":{"logical_path":"flags/4x3/sk.svg","mtime":"2022-05-22T18:31:04+02:00","size":1202,"digest":"4ca76c921fae3345c47f1f540cdaf3716a7807ffcba532caea50090c8bbecac2","integrity":"sha256-TKdskh+uM0XEfx9UDNrzcWp4B//LpTLK6lAJDIu+ysI="},"flags/1x1/sk-cf28c14c8d736a45cbb0a31c0743373b6414974d561729d322cb7204e6a2f25b.svg":{"logical_path":"flags/1x1/sk.svg","mtime":"2022-05-22T18:31:04+02:00","size":1173,"digest":"48d976a953d0778fced47cc5d25890f3dd7befc28a85d9bddfae6b50fa98c84b","integrity":"sha256-SNl2qVPQd4/O1HzF0liQ891778KKhdm9365rUPqYyEs="},"flags/4x3/sl-571df59f51a68477e49c8bbbe397e505d30d27ed1611b37485c94198b6401a9a.svg":{"logical_path":"flags/4x3/sl.svg","mtime":"2022-05-22T18:31:04+02:00","size":275,"digest":"d8106777ab26efc28f786a1345bd411a4a0a10da738b691e3f4deea96d3c3c3a","integrity":"sha256-2BBnd6sm78KPeGoTRb1BGkoKENpzi2keP03uqW08PDo="},"flags/1x1/sl-038ea846f3362ef266345b5a7f9f0c7e94334edf697c24c5faeda27bc0396927.svg":{"logical_path":"flags/1x1/sl.svg","mtime":"2022-05-22T18:31:04+02:00","size":438,"digest":"9b4b8d18e4921e812d1fc34279d9871d7b6d5a72feb8e451b4b4aed33890bee6","integrity":"sha256-m0uNGOSSHoEtH8NCedmHHXttWnL+uORRtLSu0ziQvuY="},"flags/4x3/sm-a15cef2d34582deb77e611ac2df3580749a7faafa1bc7c5c661c906ccbdad64d.svg":{"logical_path":"flags/4x3/sm.svg","mtime":"2022-05-22T18:31:04+02:00","size":15801,"digest":"d8ebb10444ef5bef482c0b886a617d832a62629887061d916f6e3af7ee49c01c","integrity":"sha256-2OuxBETvW+9ILAuIamF9gypiYpiHBh2Rb2469+5JwBw="},"flags/1x1/sm-b9bb79651c85755c984570a106213c32d87c7fbe5737b9b6a6e5512a05d98429.svg":{"logical_path":"flags/1x1/sm.svg","mtime":"2022-05-22T18:31:04+02:00","size":15729,"digest":"2cc3fc6d4667654a4842dba27cbd3fd6cb9e8f23ad1dc1fe78cbd9621b5e7d8d","integrity":"sha256-LMP8bUZnZUpIQtuifL0/1suejyOtHcH+eMvZYhtefY0="},"flags/4x3/sn-d8a7143973e5ea3d4b58e707ac2b791b45b5c7a7e65cea521fa82e9e5920926d.svg":{"logical_path":"flags/4x3/sn.svg","mtime":"2022-05-22T18:31:04+02:00","size":424,"digest":"e8f288fc52101ac915f7321dffce4c0af0a830244791f63efea069cbbc311ffa","integrity":"sha256-6PKI/FIQGskV9zId/85MCvCoMCRHkfY+/qBpy7wxH/o="},"flags/1x1/sn-2432d592221bbdd387548cfa5069c62f75245597749ffa6e2dc8d029b76e88ae.svg":{"logical_path":"flags/1x1/sn.svg","mtime":"2022-05-22T18:31:04+02:00","size":414,"digest":"1e2477f3991b0329067f700db10898bc0761c241ecdbe5cf3c0a79998ee86748","integrity":"sha256-HiR385kbAykGf3ANsQiYvAdhwkHs2+XPPAp5mY7oZ0g="},"flags/4x3/so-c82eddc49e0c223a307286bed233a03794954ad83efd12d8e2499a728bb78f22.svg":{"logical_path":"flags/4x3/so.svg","mtime":"2022-05-22T18:31:04+02:00","size":497,"digest":"50c5153e92331af5eb0bcda9b17ed8ded87f69f94803d50315514c8d95f241dd","integrity":"sha256-UMUVPpIzGvXrC82psX7Y3th/aflIA9UDFVFMjZXyQd0="},"flags/1x1/so-52cb6599bb12bafd9e49b2661297961fe585068009eb1b1c1153023514a342a7.svg":{"logical_path":"flags/1x1/so.svg","mtime":"2022-05-22T18:31:04+02:00","size":498,"digest":"74f68a5972d287abb010860d78e9ea8158499c1187e9f30a533f14f62395aff3","integrity":"sha256-dPaKWXLSh6uwEIYNeOnqgVhJnBGH6fMKUz8U9iOVr/M="},"flags/4x3/sr-cda17a0b4748b11b3e116d4f034adf47def0faaae1e71a5bb5d5c61645be9795.svg":{"logical_path":"flags/4x3/sr.svg","mtime":"2022-05-22T18:31:04+02:00","size":315,"digest":"04f64ba6540237ec9188f9f776ea8e300ab8da9e69b0987c7f84d57e485d03fa","integrity":"sha256-BPZLplQCN+yRiPn3duqOMAq42p5psJh8f4TVfkhdA/o="},"flags/1x1/sr-fb0ff6fc7108d1b993a838bb0e9db479af4e2af4cda72c80e7456c0777cdea28.svg":{"logical_path":"flags/1x1/sr.svg","mtime":"2022-05-22T18:31:04+02:00","size":320,"digest":"e146a0ccedd75c58f6bbc1684b42662e295617bbad9fa96086b3ef3e6afe2278","integrity":"sha256-4UagzO3XXFj2u8FoS0JmLilWF7utn6lghrPvPmr+Ing="},"flags/4x3/ss-744839019f2833ed8059e53d0d6e1cde2471c6a61d51f9e09814bda42bdc1f12.svg":{"logical_path":"flags/4x3/ss.svg","mtime":"2022-05-22T18:31:04+02:00","size":386,"digest":"d0545941635094a4083da0238fec28147c845f146e122c745d0977bd0c9433d6","integrity":"sha256-0FRZQWNQlKQIPaAjj+woFHyEXxRuEix0XQl3vQyUM9Y="},"flags/1x1/ss-d77200a3fe67f1533ea642a6013667ce15bb0c8068b09db151c960593b37549a.svg":{"logical_path":"flags/1x1/ss.svg","mtime":"2022-05-22T18:31:04+02:00","size":397,"digest":"15466776e5a57ff54c2fba7cb590cd7f27298d38cbf2c1ddcde63a81d8e9c102","integrity":"sha256-FUZnduWlf/VML7p8tZDNfycpjTjL8sHdzeY6gdjpwQI="},"flags/4x3/st-b0a9259277e38c0c8e0efec1d10b40d3e9c80a9eef21c174246aad28511e976d.svg":{"logical_path":"flags/4x3/st.svg","mtime":"2022-05-22T18:31:04+02:00","size":916,"digest":"ebb813a81f4959663ce7a00f33acb9513cb0aeaacc6e6b42becf3964114b97a1","integrity":"sha256-67gTqB9JWWY856APM6y5UTywrqrMbmtCvs85ZBFLl6E="},"flags/1x1/st-02eb52348f8547d028ba692f909483c32474105aae7940731d9264027493e479.svg":{"logical_path":"flags/1x1/st.svg","mtime":"2022-05-22T18:31:04+02:00","size":920,"digest":"a866043ab37ce805b64abec78b95b6c083271c13e8e1ec7ca96449410578e89d","integrity":"sha256-qGYEOrN86AW2Sr7Hi5W2wIMnHBPo4ex8qWRJQQV46J0="},"flags/4x3/sv-b524450c407002e1cf8e85444bb4225849cae409f54f5dc87d14d65faeeb833a.svg":{"logical_path":"flags/4x3/sv.svg","mtime":"2022-05-22T18:31:04+02:00","size":82697,"digest":"4a2c02ae1c8fa104bdf722d8040868f47d1159fc774e32082e7fd1516c0c8e6d","integrity":"sha256-SiwCrhyPoQS99yLYBAho9H0RWfx3TjIILn/RUWwMjm0="},"flags/1x1/sv-e16fe96bd7f32dadd74091ee73b723c2b8dd92e791f337c54ee5bb18693ef1d2.svg":{"logical_path":"flags/1x1/sv.svg","mtime":"2022-05-22T18:31:04+02:00","size":83238,"digest":"ece5f580bf1a30a24794f29e85b851709f2ff7adc3b8d5a88634b5df5a73533e","integrity":"sha256-7OX1gL8aMKJHlPKehbhRcJ8v963DuNWohjS131pzUz4="},"flags/4x3/sx-076f4363898d1374f985352dddbfe2a618bf4e7fedd80e43956be6614ca27ec0.svg":{"logical_path":"flags/4x3/sx.svg","mtime":"2022-05-22T18:31:04+02:00","size":13209,"digest":"aa8a47e9aa8b9ba218c6875d2435df72740ab4c0b924869286b4cadb1365d49c","integrity":"sha256-qopH6aqLm6IYxoddJDXfcnQKtMC5JIaShrTK2xNl1Jw="},"flags/1x1/sx-689aabb209fec5e8fc325bbaff80aa0bf11a2d6c819fa821b82069a2e5f12911.svg":{"logical_path":"flags/1x1/sx.svg","mtime":"2022-05-22T18:31:04+02:00","size":12992,"digest":"ac716ddb83c8e34353666b6102c03688503eb97ae55ca9aeeb86c4e954ae8b06","integrity":"sha256-rHFt24PI40NTZmthAsA2iFA+uXrlXKmu64bE6VSuiwY="},"flags/4x3/sy-d99ddced9cf98e95f7086a70703cd234cc8e21e744c37a6f90820c37ebc755d2.svg":{"logical_path":"flags/4x3/sy.svg","mtime":"2022-05-22T18:31:04+02:00","size":565,"digest":"3b78773e392f046fb9b3f83bc34ce38515f72320c575d93c41c95d90ffb5d039","integrity":"sha256-O3h3PjkvBG+5s/g7w0zjhRX3IyDFddk8QcldkP+10Dk="},"flags/1x1/sy-c7f1e1422a9d941be9abd5e0f51b4c4ebdd08efd31c4ba3e378c155911cbe844.svg":{"logical_path":"flags/1x1/sy.svg","mtime":"2022-05-22T18:31:04+02:00","size":579,"digest":"fdec8ea00a33abe5dfade7864c28d9ad713c3cda3e7d828ff699647da3e74446","integrity":"sha256-/eyOoAozq+XfreeGTCjZrXE8PNo+fYKP9plkfaPnREY="},"flags/4x3/sz-b8760e27e50f7f31f0b38c2cdbcfa0121317bad064561cbcfeb8413ee8764e6d.svg":{"logical_path":"flags/4x3/sz.svg","mtime":"2022-05-22T18:31:04+02:00","size":6742,"digest":"57cefe0c71e90edba3c03594a69a3a9a33f779c0c2405efaedb8d64290e28d1f","integrity":"sha256-V87+DHHpDtujwDWUppo6mjP3ecDCQF767bjWQpDijR8="},"flags/1x1/sz-6c0e7ae75aa0fa71821d7b6230dff63e34b65221c0dc08f50226299d37716652.svg":{"logical_path":"flags/1x1/sz.svg","mtime":"2022-05-22T18:31:04+02:00","size":6689,"digest":"ad977a6b06f85ee23b3ea5ec49f83363720525a3fd37475ef79cb59591c32951","integrity":"sha256-rZd6awb4XuI7PqXsSfgzY3IFJaP9N0de95y1lZHDKVE="},"flags/4x3/tc-abf0740c371bb155066651fca91c9e27e12b3cc9c05c14494e53dac851cc78bb.svg":{"logical_path":"flags/4x3/tc.svg","mtime":"2022-05-22T18:31:04+02:00","size":14497,"digest":"c3e7a86e64d439e6b25dc833f685cd5461e9c5ce33d0f004f3570adfba65c9bc","integrity":"sha256-w+eobmTUOeayXcgz9oXNVGHpxc4z0PAE81cK37plybw="},"flags/1x1/tc-13c94ed220ff9c70284c379e33fc85891de95dce60ec053787549485bca40a36.svg":{"logical_path":"flags/1x1/tc.svg","mtime":"2022-05-22T18:31:04+02:00","size":14756,"digest":"d91ac6bce029f8aa5b760be2a62884b67e03180eb9a9c67ae6066df67c85154c","integrity":"sha256-2RrGvOAp+KpbdgvipiiEtn4DGA65qcZ65gZt9nyFFUw="},"flags/4x3/td-354d8d74597706ece28b45f28030c948596f91c04392d07307b800cb0fc6e4cd.svg":{"logical_path":"flags/4x3/td.svg","mtime":"2022-05-22T18:31:04+02:00","size":267,"digest":"b6ce40aff60feef4e8fe1417f075b57688b5cc4c32d09296d02776a797e0b0d3","integrity":"sha256-ts5Ar/YP7vTo/hQX8HW1doi1zEwy0JKW0Cd2p5fgsNM="},"flags/1x1/td-fb3c31a792ab9fffe28bfe959cacdac54daebe9f795c30515830d93773805c3e.svg":{"logical_path":"flags/1x1/td.svg","mtime":"2022-05-22T18:31:04+02:00","size":279,"digest":"ef115b3942ae5cb74b046b0a5faad35fbd6126d8c6fda489881b16494c8c632c","integrity":"sha256-7xFbOUKuXLdLBGsKX6rTX71hJtjG/aSJiBsWSUyMYyw="},"flags/4x3/tf-f4edacabdba5b4d4d898a4edd7f07976f6a01ceee97c03fdf3561f2ba369b4f3.svg":{"logical_path":"flags/4x3/tf.svg","mtime":"2022-05-22T18:31:04+02:00","size":1088,"digest":"0681ec54dffc4f628efd8b4726fc3f00c628aab4fb0c797c332c80a25d559820","integrity":"sha256-BoHsVN/8T2KO/YtHJvw/AMYoqrT7DHl8MyyAol1VmCA="},"flags/1x1/tf-fa00833e3ac96967c55c7f495a580ad5beb1fd912d32d0c9751b93c3c89be893.svg":{"logical_path":"flags/1x1/tf.svg","mtime":"2022-05-22T18:31:04+02:00","size":1196,"digest":"90ad184cfd769cdda3da9c43b4fb5a494962f3095f38f4175ce37c371e0180d6","integrity":"sha256-kK0YTP12nN2j2pxDtPtaSUli8wlfOPQXXON8Nx4BgNY="},"flags/4x3/tg-32688daf8870e048421dcbfa2777d9b5f146e588f5f604433d17143fe702dac7.svg":{"logical_path":"flags/4x3/tg.svg","mtime":"2022-05-22T18:31:04+02:00","size":728,"digest":"486dca2420c797d9a37b03d11767c9418b5e26d07c7c694d897b7d85092ea499","integrity":"sha256-SG3KJCDHl9mjewPRF2fJQYteJtB8fGlNiXt9hQkupJk="},"flags/1x1/tg-0e62ff3b4c2106e7c5fe27a6f32fb3c10f69f9cfd5dad9aeb7a8b54af7cab786.svg":{"logical_path":"flags/1x1/tg.svg","mtime":"2022-05-22T18:31:04+02:00","size":733,"digest":"830f49a57206bf654bc37aaa1668ee8840a23595b2ed440c968f81d961e820ad","integrity":"sha256-gw9JpXIGv2VLw3qqFmjuiECiNZWy7UQMlo+B2WHoIK0="},"flags/4x3/th-da4f1fda6eda5971dd52bad365bfc4aae176f0eedebf5c8bd9af25789c03993d.svg":{"logical_path":"flags/4x3/th.svg","mtime":"2022-05-22T18:31:04+02:00","size":287,"digest":"4e206b563d27b5a7a3f7cabf944d6d278e6e8640018a72ce7b7ff989f1396df9","integrity":"sha256-TiBrVj0ntaej98q/lE1tJ45uhkABinLOe3/5ifE5bfk="},"flags/1x1/th-95ac5f4463da0b9164f2fbed65ca12046370fcb1e250c6170975b77d1509b3e5.svg":{"logical_path":"flags/1x1/th.svg","mtime":"2022-05-22T18:31:04+02:00","size":288,"digest":"cb480908e2c394e816623b7fcd5b63b484f25578fd89905d6aa1453bcd041887","integrity":"sha256-y0gJCOLDlOgWYjt/zVtjtITyVXj9iZBdaqFFO80EGIc="},"flags/4x3/tj-d072d6cd4136ae97533d32ac74d20350ac794f8a79eaecd1c55142e76b93b3d9.svg":{"logical_path":"flags/4x3/tj.svg","mtime":"2022-05-22T18:31:04+02:00","size":1812,"digest":"1a8979f03a820cec54ff4a900e843afee074f3b4004e1aeeb706caaea0379ffe","integrity":"sha256-Gol58DqCDOxU/0qQDoQ6/uB087QAThrutwbKrqA3n/4="},"flags/1x1/tj-2cefbad6aee66d30fd757ea564fdbbde86aebde70720e9c961799caa6bdc8b84.svg":{"logical_path":"flags/1x1/tj.svg","mtime":"2022-05-22T18:31:04+02:00","size":1767,"digest":"a133d52c99a285aa2dd0b86739163bd5bb7a2c0eaa5a1fd522a11ec4b5b3bece","integrity":"sha256-oTPVLJmihaot0LhnORY71bt6LA6qWh/VIqEexLWzvs4="},"flags/4x3/tk-da715012efe8731020fe54063a76bffb256ea6696da290ccbb599ab36990edfe.svg":{"logical_path":"flags/4x3/tk.svg","mtime":"2022-05-22T18:31:04+02:00","size":788,"digest":"3e49a632d5d87de3ef67aca8faa159c1b69bc16669f6c8c117748dc9625d1c58","integrity":"sha256-PkmmMtXYfePvZ6yo+qFZwbabwWZp9sjBF3SNyWJdHFg="},"flags/1x1/tk-4055f5153398c294b2344880102e23847e952df1d04ad8734218fb0f6b43bf42.svg":{"logical_path":"flags/1x1/tk.svg","mtime":"2022-05-22T18:31:04+02:00","size":778,"digest":"137c7ebb28233cdc2f417bc1e29bfad502ef7dd404c35ac36188e7dd98aecb6d","integrity":"sha256-E3x+uygjPNwvQXvB4pv61QLvfdQEw1rDYYjn3Ziuy20="},"flags/4x3/tl-388fac3c65fbbc18779b88f7fcdea523ba440860923a7e1602ca1138bcd5c40b.svg":{"logical_path":"flags/4x3/tl.svg","mtime":"2022-05-22T18:31:04+02:00","size":603,"digest":"8662a8d01007fcbe0f41a694a5cd927265409d59b783b50e0bf4561302a77e40","integrity":"sha256-hmKo0BAH/L4PQaaUpc2ScmVAnVm3g7UOC/RWEwKnfkA="},"flags/1x1/tl-9fea1b22d992cd15cafd1e5824d65f1f0f84b7c89a0f5a460b82429e2f9a8e95.svg":{"logical_path":"flags/1x1/tl.svg","mtime":"2022-05-22T18:31:04+02:00","size":577,"digest":"d26071ddf754d77ea56779d817e8c62f37a38fa64102e0c864901ff3941cffbf","integrity":"sha256-0mBx3fdU136lZ3nYF+jGLzejj6ZBAuDIZJAf85Qc/78="},"flags/4x3/tm-f5d7cce194b88ed026465717ee593c35c03f76f3483d77bee2a3e05827628679.svg":{"logical_path":"flags/4x3/tm.svg","mtime":"2022-05-22T18:31:04+02:00","size":32287,"digest":"22b811ff90642de341a3e28a1775d1992d1f32088e922abddafca79157e3c2ec","integrity":"sha256-IrgR/5BkLeNBo+KKF3XRmS0fMgiOkiq92vynkVfjwuw="},"flags/1x1/tm-a3f255f0a6874a326140c9a4cad876cd386c30ac7b9e974905699ada62811042.svg":{"logical_path":"flags/1x1/tm.svg","mtime":"2022-05-22T18:31:04+02:00","size":31566,"digest":"42c8536f18d9a9878a90872649f0ec85b27ba59e1942ca5ac619f2f2f993aa38","integrity":"sha256-QshTbxjZqYeKkIcmSfDshbJ7pZ4ZQspaxhny8vmTqjg="},"flags/4x3/tn-ba48fb29a4c8511d1145b87abc10cb75e8dc9ac4e704dc9efc113cf920d4b640.svg":{"logical_path":"flags/4x3/tn.svg","mtime":"2022-05-22T18:31:04+02:00","size":751,"digest":"5d05bcd60eb3118eae45baf24be63aab68e236ec6d19124eed90548f1ec42bd5","integrity":"sha256-XQW81g6zEY6uRbryS+Y6q2jiNuxtGRJO7ZBUjx7EK9U="},"flags/1x1/tn-d9b89cb7ab0b22d5a4709eb4681d77b8f6877d572a1d2f6424f6ce2fbed2dede.svg":{"logical_path":"flags/1x1/tn.svg","mtime":"2022-05-22T18:31:04+02:00","size":733,"digest":"84116fb50ddb30d2f08991ae4e3762d7191fe4387e1cf05d55a4e3f2e95c3c57","integrity":"sha256-hBFvtQ3bMNLwiZGuTjdi1xkf5Dh+HPBdVaTj8ulcPFc="},"flags/4x3/to-9f1079a109d27abe53f17281320474ecfa6edc571502831f167471edd470773e.svg":{"logical_path":"flags/4x3/to.svg","mtime":"2022-05-22T18:31:04+02:00","size":355,"digest":"a2007667f47550dd1a6db5e83911fcc0acdf00909db626d592a9390c4e8aa1fa","integrity":"sha256-ogB2Z/R1UN0abbXoORH8wKzfAJCdtibVkqk5DE6Kofo="},"flags/1x1/to-a543262eaac18a114c5c70153895192a3e58981d4a00084473cd479bbca5783b.svg":{"logical_path":"flags/1x1/to.svg","mtime":"2022-05-22T18:31:04+02:00","size":361,"digest":"5e87ab54fa5f3124d1fc521d29259865fdd1f528e968dad12a33aff22ff788f2","integrity":"sha256-XoerVPpfMSTR/FIdKSWYZf3R9SjpaNrRKjOv8i/3iPI="},"flags/4x3/tr-04941a0f055d2ee2466b8e19532f58a2a0c4e3a83d986a601220fda2b6a3b090.svg":{"logical_path":"flags/4x3/tr.svg","mtime":"2022-05-22T18:31:04+02:00","size":554,"digest":"033a416ecc30a516c54c6a0fac2d212a38fb051e5976cda49eb9d22264814a66","integrity":"sha256-AzpBbswwpRbFTGoPrC0hKjj7BR5Zds2knrnSImSBSmY="},"flags/1x1/tr-0df7b630a61ad40f32017487e6fef02258e8b2c8709c6fc8c1d3de1e9b36b09c.svg":{"logical_path":"flags/1x1/tr.svg","mtime":"2022-05-22T18:31:04+02:00","size":575,"digest":"74e60d09369c164cc245d49d109c78ea322a117e0fe58945c380b65a71c691ae","integrity":"sha256-dOYNCTacFkzCRdSdEJx46jIqEX4P5YlFw4C2WnHGka4="},"flags/4x3/tt-9ca06051696b194f98d36ab4adb6aa7eb75275333cc0b48c9c9e1c34601013aa.svg":{"logical_path":"flags/4x3/tt.svg","mtime":"2022-05-22T18:31:04+02:00","size":315,"digest":"f6ac88577c57d12df95251c21a7adb68ced1720731d754a462d2958879b56e00","integrity":"sha256-9qyIV3xX0S35UlHCGnrbaM7Rcgcx11SkYtKViHm1bgA="},"flags/1x1/tt-b05ee6c590e5c757190226182ac72648604086a272479f91d73dc24d90162eef.svg":{"logical_path":"flags/1x1/tt.svg","mtime":"2022-05-22T18:31:04+02:00","size":320,"digest":"3d65dcbca5b7d40a1730e1c190d0c7e2874d1b3b44e0a0941ec033056044f3de","integrity":"sha256-PWXcvKW31AoXMOHBkNDH4odNGztE4KCUHsAzBWBE894="},"flags/4x3/tv-5875f68681a06f613b3f84cd6959eb9dba70524bf14b0c8aa4a823a833dd6a98.svg":{"logical_path":"flags/4x3/tv.svg","mtime":"2022-05-22T18:31:04+02:00","size":1783,"digest":"6017cefb02fcc099faa8f072149bbce7f8c155ad6ffa620a6d6258409b786ce4","integrity":"sha256-YBfO+wL8wJn6qPByFJu85/jBVa1v+mIKbWJYQJt4bOQ="},"flags/1x1/tv-d8be186cccd6335a8f85c89085ef08b19c247df4081ed61698604972fdb8fa43.svg":{"logical_path":"flags/1x1/tv.svg","mtime":"2022-05-22T18:31:04+02:00","size":1716,"digest":"add42a023b56a92f42007afb933e28e1d08d734e55ccecbfc3f9fae70701a240","integrity":"sha256-rdQqAjtWqS9CAHr7kz4o4dCNc05VzOy/w/n65wcBokA="},"flags/4x3/tw-29e639da18e668c62eb04ed3f3a02e11b0809890a2a0c82b529e50d53076e4e2.svg":{"logical_path":"flags/4x3/tw.svg","mtime":"2022-05-22T18:31:04+02:00","size":945,"digest":"44b7d1f3acc75aa8ff817b55d499dcb24770a3423b624bff829cb26729de7c16","integrity":"sha256-RLfR86zHWqj/gXtV1Jncskdwo0I7Ykv/gpyyZynefBY="},"flags/1x1/tw-2a2531772efdfcc74f70cc88f6fc15df7dc42dc344d9ed94b08e1847557976c4.svg":{"logical_path":"flags/1x1/tw.svg","mtime":"2022-05-22T18:31:04+02:00","size":954,"digest":"06af22c30adfccca9975a99fd05310568de59f039a14fd8dbabab7c17a33cb19","integrity":"sha256-Bq8iwwrfzMqZdamf0FMQVo3lnwOaFP2Nurq3wXozyxk="},"flags/4x3/tz-69ae0bf011f019428148ba9c3d793b4104be88621741beb216dfc9f43d125d6c.svg":{"logical_path":"flags/4x3/tz.svg","mtime":"2022-05-22T18:31:04+02:00","size":549,"digest":"1d5e7fb7a12497358a19b92671184b14664125a143d909abbee5615b57f7e988","integrity":"sha256-HV5/t6EklzWKGbkmcRhLFGZBJaFD2QmrvuVhW1f36Yg="},"flags/1x1/tz-581f05e20eeb5d8d77f807f2d6edaf786da8226284726841f33d9288ee84d6b7.svg":{"logical_path":"flags/1x1/tz.svg","mtime":"2022-05-22T18:31:04+02:00","size":602,"digest":"ad4c35de9f6aec57aac272de390d5730a75aa7e1a4431166a5dcea3bcbdc62f2","integrity":"sha256-rUw13p9q7FeqwnLeOQ1XMKdap+GkQxFmpdzqO8vcYvI="},"flags/4x3/ua-ddfa2a9985ed8342421c8df6fe852ec92e15d584c2565c525347bcd5f524c9da.svg":{"logical_path":"flags/4x3/ua.svg","mtime":"2022-05-22T18:31:04+02:00","size":238,"digest":"fbbf0f0e9a6d6187561f38af9b3f28e3125e406c3deea268bcb64dac7a03a6aa","integrity":"sha256-+78PDpptYYdWHzivmz8o4xJeQGw97qJovLZNrHoDpqo="},"flags/1x1/ua-86260ecf3aa1da110f92b58861d7918e3e574a79cfb4334f9c82b1a750a8a875.svg":{"logical_path":"flags/1x1/ua.svg","mtime":"2022-05-22T18:31:04+02:00","size":238,"digest":"79092de6d22db0454898a7d17f26961709256110620e67933043799fa86b2296","integrity":"sha256-eQkt5tItsEVImKfRfyaWFwklYRBiDmeTMEN5n6hrIpY="},"flags/4x3/ug-b748460c255e064ba8a2d89bb78c48fd29bdf496a7ca3c3af0ed0d83e49995cb.svg":{"logical_path":"flags/4x3/ug.svg","mtime":"2022-05-22T18:31:04+02:00","size":3951,"digest":"001fa554127aafd736752727490db9f8893164c0369d0ba5cb6d742c44370975","integrity":"sha256-AB+lVBJ6r9c2dScnSQ25+IkxZMA2nQuly210LEQ3CXU="},"flags/1x1/ug-8a8552bd983c6e2136f9eba9b4917d0e158415a24d9945f663ed56239299b44b.svg":{"logical_path":"flags/1x1/ug.svg","mtime":"2022-05-22T18:31:04+02:00","size":4024,"digest":"59bc76deefd22802e7d4ab2bd5e34f59c6bc112135c8052284410a0787954af9","integrity":"sha256-Wbx23u/SKALn1Ksr1eNPWca8ESE1yAUihEEKB4eVSvk="},"flags/4x3/um-d3a2b6a726a36d08db81fe4a5f0decd0afe5aa4ad8515304db4c3ace8f27e415.svg":{"logical_path":"flags/4x3/um.svg","mtime":"2022-05-22T18:31:04+02:00","size":4523,"digest":"d2e8ac2079a27fb6f120ab4bc4d29597450bd01a9fedf9b7f5a09ad65e8dd164","integrity":"sha256-0uisIHmif7bxIKtLxNKVl0UL0Bqf7fm39aCa1l6N0WQ="},"flags/1x1/um-0bcb31652ebcfa8c6727911e3df341b30425c3c699e6c4bf9f47c739ab9f442d.svg":{"logical_path":"flags/1x1/um.svg","mtime":"2022-05-22T18:31:04+02:00","size":3972,"digest":"9674c82888b92fbbba22f3588e7d83e8c0ce887d9ccdf3abac317f9725530ab5","integrity":"sha256-lnTIKIi5L7u6IvNYjn2D6MDOiH2czfOrrDF/lyVTCrU="},"flags/4x3/us-c10177f8d2a93643101b39e419273bdd2f43a58ff9beff88a90431b0a4aa6a00.svg":{"logical_path":"flags/4x3/us.svg","mtime":"2022-05-22T18:31:04+02:00","size":4461,"digest":"c70ba1cb67cc649da2b1f5dc4a26891437d8bba2cc098c88461e6bfc23949d9e","integrity":"sha256-xwuhy2fMZJ2isfXcSiaJFDfYu6LMCYyIRh5r/COUnZ4="},"flags/1x1/us-a46068d8032a1e3364325da9675a41ba85a40c5401981c403fb7297aea254906.svg":{"logical_path":"flags/1x1/us.svg","mtime":"2022-05-22T18:31:04+02:00","size":3921,"digest":"c4ffd0455cf50bc1683646dc77e7263d81cffad51f36d3c39b85a9848fb5a196","integrity":"sha256-xP/QRVz1C8FoNkbcd+cmPYHP+tUfNtPDm4WphI+1oZY="},"flags/4x3/uy-ab18ad511d2822414e3b4f32e3309dca27b5b559cabd89cba2b4b4072387f440.svg":{"logical_path":"flags/4x3/uy.svg","mtime":"2022-05-22T18:31:04+02:00","size":1718,"digest":"25c640333545843d345dbda694ca41c404dcaa69d3e32fbebc89d5620b5b881a","integrity":"sha256-JcZAMzVFhD00Xb2mlMpBxATcqmnT4y++vInVYgtbiBo="},"flags/1x1/uy-d94f5244cbd79f9348a048b7ec8861d37a237806dc1a6427fc9e743b86f43097.svg":{"logical_path":"flags/1x1/uy.svg","mtime":"2022-05-22T18:31:04+02:00","size":1715,"digest":"4466c6f09de93905872fe47bfc03c6e5a143cbf77cdfc93fcd450663572f3d60","integrity":"sha256-RGbG8J3pOQWHL+R7/APG5aFDy/d838k/zUUGY1cvPWA="},"flags/4x3/uz-78ae3b6ad90b0bb256102b6db50b8f9a7700fb6275e80d0c5b755e0defdcf8e5.svg":{"logical_path":"flags/4x3/uz.svg","mtime":"2022-05-22T18:31:04+02:00","size":1454,"digest":"76a3658f5f45def0750a70247d604356ff4eba996b30aa23a657ac07044caed4","integrity":"sha256-dqNlj19F3vB1CnAkfWBDVv9OuplrMKojplesBwRMrtQ="},"flags/1x1/uz-eff129a2e58e047e1daa2883f9ab0ef410bc11c42d652b9c4635bce5ab045b4f.svg":{"logical_path":"flags/1x1/uz.svg","mtime":"2022-05-22T18:31:04+02:00","size":1454,"digest":"96eba693faa2439ebee48d27072a67086b7be80001ec8c5e3f0743b37f2a42a1","integrity":"sha256-luumk/qiQ56+5I0nBypnCGt76AAB7IxePwdDs38qQqE="},"flags/4x3/va-20117c2869d005de2cc54801f2d264b2823c214276f5559de1e48108f572fc79.svg":{"logical_path":"flags/4x3/va.svg","mtime":"2022-05-22T18:31:04+02:00","size":91076,"digest":"89b12d71ce8ea74250d99da84ad4417c53eab133e4be8db99e6b8e0b26f71278","integrity":"sha256-ibEtcc6Op0JQ2Z2oStRBfFPqsTPkvo25nmuOCyb3Eng="},"flags/1x1/va-3206ffbb26fff2b3cd06959ba7f9d713efa9d133932d94ea1f1f6e3dd42687a3.svg":{"logical_path":"flags/1x1/va.svg","mtime":"2022-05-22T18:31:04+02:00","size":90711,"digest":"bcc69d5aaddda710e0c480c64f1ad9730ba45edd4692684fcca1c4f8083c5d19","integrity":"sha256-vMadWq3dpxDgxIDGTxrZcwukXt1GkmhPzKHE+Ag8XRk="},"flags/4x3/vc-dccc1c2e4dc2d36ff71f8b04ebda868a7c4ce753b9fe5ccf0bed00edd7d41abb.svg":{"logical_path":"flags/4x3/vc.svg","mtime":"2022-05-22T18:31:04+02:00","size":451,"digest":"55b7f903c7e603de7eec36bca0760a51930ae7ba90c2e758fcf3aa4d7e959ee5","integrity":"sha256-Vbf5A8fmA95+7Da8oHYKUZMK57qQwudY/POqTX6VnuU="},"flags/1x1/vc-08a544ff242da12cc3fbad36579499a0b125c4b7ee7aa0af4eff0a261ea27a13.svg":{"logical_path":"flags/1x1/vc.svg","mtime":"2022-05-22T18:31:04+02:00","size":498,"digest":"3be977d9f161a5800728de845aa7632df3263927fea4b03544400755d27e7c19","integrity":"sha256-O+l32fFhpYAHKN6EWqdjLfMmOSf+pLA1REAHVdJ+fBk="},"flags/4x3/ve-d62ba31ca157e54409e09617a264e0dd18a2c597b1ad611c34da7fe7962e05dc.svg":{"logical_path":"flags/4x3/ve.svg","mtime":"2022-05-22T18:31:04+02:00","size":1168,"digest":"3079fd19521114a5585b23e37a3d443676b52fd593b68bae5026c29de0bf5561","integrity":"sha256-MHn9GVIRFKVYWyPjej1ENna1L9WTtouuUCbCneC/VWE="},"flags/1x1/ve-f465be9b82185e94a0f84a3d8b2f536e026b8893fecfc324997ca711b9fe0097.svg":{"logical_path":"flags/1x1/ve.svg","mtime":"2022-05-22T18:31:04+02:00","size":1188,"digest":"2fe0f692a6986f2b21ebd6260b6750b29a0487b9486e70fcf789e113ad0e1192","integrity":"sha256-L+D2kqaYbysh69YmC2dQspoEh7lIbnD894nhE60OEZI="},"flags/4x3/vg-d6c3f0ef53e605acc97f33a4e0a61711b6a8207c6a2cff55b9427870053da583.svg":{"logical_path":"flags/4x3/vg.svg","mtime":"2022-05-22T18:31:04+02:00","size":24640,"digest":"509967cefab0422e7e4162aa75d3cede7620a4a17d9b2015adfa74e84051f364","integrity":"sha256-UJlnzvqwQi5+QWKqddPO3nYgpKF9myAVrfp06EBR82Q="},"flags/1x1/vg-8a2a8af88748ff501bc90aceb327488cce5f323948d59f62c960ccfb58ca7510.svg":{"logical_path":"flags/1x1/vg.svg","mtime":"2022-05-22T18:31:04+02:00","size":24814,"digest":"caec07f09c87f0ebd2843dedf7e8fd5ebe3ed795b2649c648788775c65f48b31","integrity":"sha256-yuwH8JyH8OvShD3t9+j9Xr4+15WyZJxkh4h3XGX0izE="},"flags/4x3/vi-882e3005bf905201f3ccb79736ff058aad41d99046ef58fefb2e5f7df30d4ef4.svg":{"logical_path":"flags/4x3/vi.svg","mtime":"2022-05-22T18:31:04+02:00","size":8742,"digest":"0c1811861e17033d8d2ee291edb8b710dc877fbec06ab4e4d250218724966032","integrity":"sha256-DBgRhh4XAz2NLuKR7bi3ENyHf77AarTk0lAhhySWYDI="},"flags/1x1/vi-8f89c34e92ffdc8d17724234254fadad1bbb4b2828cb5e041b4d6a21ec5c3caa.svg":{"logical_path":"flags/1x1/vi.svg","mtime":"2022-05-22T18:31:04+02:00","size":8697,"digest":"8112962dc3d3194f3bbf70018fcb5accc21d2cbd033957579427241fbd931e62","integrity":"sha256-gRKWLcPTGU87v3ABj8tazMIdLL0DOVdXlCckH72THmI="},"flags/4x3/vn-53c52e450c6e603d8b08c0170dd3bd15aaa0d4e9d250657bea188945c1252138.svg":{"logical_path":"flags/4x3/vn.svg","mtime":"2022-05-22T18:31:04+02:00","size":494,"digest":"1768f5ce4bad46f4907f598e6097e6e1340500f4d7d75a76266f3e6ab9463d5e","integrity":"sha256-F2j1zkutRvSQf1mOYJfm4TQFAPTX11p2Jm8+arlGPV4="},"flags/1x1/vn-7267ad3b33fb6d304ff414c998a2c69c6b46abc2528c2e955ff4367959cae8e1.svg":{"logical_path":"flags/1x1/vn.svg","mtime":"2022-05-22T18:31:04+02:00","size":498,"digest":"42db427a67708ab79be29119530cedf2108f7a4bcebfdf754a1d8faeedfadb77","integrity":"sha256-QttCemdwireb4pEZUwzt8hCPekvOv991Sh2Pru3623c="},"flags/4x3/vu-2dd468b3a9c89ef0bcbb155422cb38bb19e6255d2871ec2b7012055d31d13e2a.svg":{"logical_path":"flags/4x3/vu.svg","mtime":"2022-05-22T18:31:04+02:00","size":3772,"digest":"03a36a9550f9eba48a2cbe65dc4be5e00b79447fa6d0863378046cc5836a4014","integrity":"sha256-A6NqlVD566SKLL5l3Evl4At5RH+m0IYzeARsxYNqQBQ="},"flags/1x1/vu-477e1ac8d2d514517a8a6b84f917f9c43d0145d52f4b89e7205277ee3bbea422.svg":{"logical_path":"flags/1x1/vu.svg","mtime":"2022-05-22T18:31:04+02:00","size":3732,"digest":"016c68fdb5c59b9342aa68a196d73fdf6b7a867694fc406d1338b507a4d05c56","integrity":"sha256-AWxo/bXFm5NCqmihltc/32t6hnaU/EBtEzi1B6TQXFY="},"flags/4x3/wf-d2b9db8f6fa2a78507a5b4751f95e92c334673ecddd68eb33844ea91fc62d771.svg":{"logical_path":"flags/4x3/wf.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"e8360ce364de6826f01716b7d320eef87621b70101c129df459682a790267f89","integrity":"sha256-6DYM42TeaCbwFxa30yDu+HYhtwEBwSnfRZaCp5Amf4k="},"flags/1x1/wf-095484363036fafbb44da7fbbdb6bb371c92c002163fb610c29912c6027a3cb7.svg":{"logical_path":"flags/1x1/wf.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"5878874353a81033882d683151d7a94765656f867015f75985388e3817a37f8d","integrity":"sha256-WHiHQ1OoEDOILWgxUdepR2Vlb4ZwFfdZhTiOOBejf40="},"flags/4x3/ws-6a3fef801ba087404d3718c0b5b8741261d790cb2bf8b7581fea317e9689bcc7.svg":{"logical_path":"flags/4x3/ws.svg","mtime":"2022-05-22T18:31:04+02:00","size":693,"digest":"e77b5573407b1162d26d40dee59e28684aee6ebbff9961ac32242943c9e96e26","integrity":"sha256-53tVc0B7EWLSbUDe5Z4oaErubrv/mWGsMiQpQ8npbiY="},"flags/1x1/ws-a312f6f7ddd2d5694c70b935f000ccc7716aae0b207e98ca4ad6ee252d272f49.svg":{"logical_path":"flags/1x1/ws.svg","mtime":"2022-05-22T18:31:04+02:00","size":706,"digest":"7cdc90f71e92b252dc69902df2f7ea33a7033a776a00199730239aa4e8fa8b18","integrity":"sha256-fNyQ9x6SslLcaZAt8vfqM6cDOndqABmXMCOapOj6ixg="},"flags/4x3/ye-38ca92e79aeba152eee33f0d5dac55430af032a31b39d56d49c4287b0639fe72.svg":{"logical_path":"flags/4x3/ye.svg","mtime":"2022-05-22T18:31:04+02:00","size":275,"digest":"ccc0af8c1220d0583d1432c0c340c21aad14e987d7d73d2601cc35451a37cf9c","integrity":"sha256-zMCvjBIg0Fg9FDLAw0DCGq0U6YfX1z0mAcw1RRo3z5w="},"flags/1x1/ye-2d43095605cb09aeebaa7d9ec1147717dfffb26cd6a7ab66adfbf550a3bc8962.svg":{"logical_path":"flags/1x1/ye.svg","mtime":"2022-05-22T18:31:04+02:00","size":275,"digest":"d7527d589cebe8037b89e642afcca050b9da0cb4e63ed52bbf116f8461f6c60e","integrity":"sha256-11J9WJzr6AN7ieZCr8ygULnaDLTmPtUrvxFvhGH2xg4="},"flags/4x3/yt-2b54852c423d68df342c5bec300477510632be3f1046a2d9d9715a9617bc90ae.svg":{"logical_path":"flags/4x3/yt.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"b1e78ed98f7111d6a115d73d2c604f5c1ef65ba9b01713ca47d914de0d22b351","integrity":"sha256-seeO2Y9xEdahFdc9LGBPXB72W6mwFxPKR9kU3g0is1E="},"flags/1x1/yt-3ea3c372eb1f7e269abafc08882bdb99d94c18ea363b905f8422f2733a550db8.svg":{"logical_path":"flags/1x1/yt.svg","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"794597839bd5ac5c9bdc0885fe713d3d0a69e38711f9a74654a1599d7c7a7927","integrity":"sha256-eUWXg5vVrFyb3AiF/nE9PQpp44cR+adGVKFZnXx6eSc="},"flags/4x3/za-c57ff71cb91d156461c64ada7fb86779c009a9c0a53df0b6de2e87044eeefb74.svg":{"logical_path":"flags/4x3/za.svg","mtime":"2022-05-22T18:31:04+02:00","size":859,"digest":"d2d473f4e2e4707604a7caac42f9cb6415bf5e8ce35b5e72bc78775d8aae03e5","integrity":"sha256-0tRz9OLkcHYEp8qsQvnLZBW/XozjW15yvHh3XYquA+U="},"flags/1x1/za-571b8b7da7f17cd9a4ce08e5696468e86efce9be83bb776c7586184fa75e99a9.svg":{"logical_path":"flags/1x1/za.svg","mtime":"2022-05-22T18:31:04+02:00","size":872,"digest":"3985889b8382293dbb3ae27353e864661415afa0ef66d291591b447df8bf8693","integrity":"sha256-OYWIm4OCKT27OuJzU+hkZhQVr6DvZtKRWRtEffi/hpM="},"flags/4x3/zm-8a6d8f87b53dd7256d461f64cf66e2cd90df833aca8833849fbfe7445caeeae2.svg":{"logical_path":"flags/4x3/zm.svg","mtime":"2022-05-22T18:31:04+02:00","size":5497,"digest":"107a1d20ce64bbc59bdf3ef022215742bf5fd79d94636e7d4376586d2e0bb0b4","integrity":"sha256-EHodIM5ku8Wb3z7wIiFXQr9f152UY259Q3ZYbS4LsLQ="},"flags/1x1/zm-d68871c839973048d37ad325312abfc1b22b525e3f48faefedcebea29e3e9175.svg":{"logical_path":"flags/1x1/zm.svg","mtime":"2022-05-22T18:31:04+02:00","size":5401,"digest":"4b557cfd170ed4332809862db59879e1da2797deb4b24a288c525d0d72c0bb84","integrity":"sha256-S1V8/RcO1DMoCYYttZh54donl960skoojFJdDXLAu4Q="},"flags/4x3/zw-506cb345575e94583b442c3a23ded41e36cf454e797b3b2e03b4445a37395666.svg":{"logical_path":"flags/4x3/zw.svg","mtime":"2022-05-22T18:31:04+02:00","size":6641,"digest":"a357182ee43243cf7989366b10afb15296f814cba5d9a035e3d66ff401aaa115","integrity":"sha256-o1cYLuQyQ895iTZrEK+xUpb4FMul2aA149Zv9AGqoRU="},"flags/1x1/zw-f7716b45f4f267a661f85af47e95447adc282a4b9fc18bc88316cd970f8d947d.svg":{"logical_path":"flags/1x1/zw.svg","mtime":"2022-05-22T18:31:04+02:00","size":6614,"digest":"c763d38c87df2000c01e5faa5ef51823a9e076b7b9e8e52244ff35270a099401","integrity":"sha256-x2PTjIffIADAHl+qXvUYI6ngdre56OUiRP81JwoJlAE="},"flags/4x3/es-ca-884e8f11877dc43b5c29bbc00c6980cc57ee8e671b710b9f9d59e29927cd25d4.svg":{"logical_path":"flags/4x3/es-ca.svg","mtime":"2022-05-22T18:31:04+02:00","size":258,"digest":"e6d65a5eae996b410a099eadfc691c380ad0f734578ce2ac14f2d5bf31eb63db","integrity":"sha256-5tZaXq6Za0EKCZ6t/GkcOArQ9zRXjOKsFPLVvzHrY9s="},"flags/1x1/es-ca-2f61e283eeea7f76c15207644f2a8538e05a4eae39dbc8186509209773701cd9.svg":{"logical_path":"flags/1x1/es-ca.svg","mtime":"2022-05-22T18:31:04+02:00","size":257,"digest":"620053dffeefac1c5eb2f455e2cada12044e5366ffa6516a3bd611ffbbe15dcd","integrity":"sha256-YgBT3/7vrBxesvRV4sraEgROU2b/plFqO9YR/7vhXc0="},"flags/4x3/eu-dfa7f5c90f5fe9eb16c8c865e73cf7e3e8fea328bf6cfc1b07f6bc28eefd43f5.svg":{"logical_path":"flags/4x3/eu.svg","mtime":"2022-05-22T18:31:04+02:00","size":1249,"digest":"8c749adacf82b6b5d58ce51dbcfa748c6bc6a9a205e5efcb6e96f126f8953f6e","integrity":"sha256-jHSa2s+CtrXVjOUdvPp0jGvGqaIF5e/LbpbxJviVP24="},"flags/1x1/eu-c3a400ee8dc3ee4dcc2d0f2868698ce781d403a9ea249d972115c8455cfcaa9b.svg":{"logical_path":"flags/1x1/eu.svg","mtime":"2022-05-22T18:31:04+02:00","size":1250,"digest":"7085aed716bfce96bbfc2811fe55bc9855236a4216dd7c925fcb7c142578a3f9","integrity":"sha256-cIWu1xa/zpa7/CgR/lW8mFUjakIW3XySX8t8FCV4o/k="},"flags/4x3/gb-eng-65a380032580f7144bddfd4ab353bb478d523232c4303edb0095e34e98c7dcb9.svg":{"logical_path":"flags/4x3/gb-eng.svg","mtime":"2022-05-22T18:31:04+02:00","size":242,"digest":"d2de597c10f3c833fd8c7bfbe818189e6209db19882a27398b8e180884697eca","integrity":"sha256-0t5ZfBDzyDP9jHv76BgYnmIJ2xmIKic5i44YCIRpfso="},"flags/1x1/gb-eng-6fe299a85ef920693f193828362f306fbd23020d2bfc61dcf9143d85a6a5001b.svg":{"logical_path":"flags/1x1/gb-eng.svg","mtime":"2022-05-22T18:31:04+02:00","size":232,"digest":"83388730d99f674d825da4c089650366b965abd338cf15f10f5aadfe0d8276ba","integrity":"sha256-gziHMNmfZ02CXaTAiWUDZrllq9M4zxXxD1qt/g2Cdro="},"flags/4x3/gb-nir-7cdb174057442ee76cc8a3fef9df4650460b3a3a9c0634c2417c42e7383efe3f.svg":{"logical_path":"flags/4x3/gb-nir.svg","mtime":"2022-05-22T18:31:04+02:00","size":25061,"digest":"5130c70b20a02f9f6dfff69c9e55b3aa0054906318e4afc12c692dcfb7f55216","integrity":"sha256-UTDHCyCgL59t//acnlWzqgBUkGMY5K/BLGktz7f1UhY="},"flags/1x1/gb-nir-ea58e209ad11b7e21e357799a5a0d4c7cfd13b2f7407cb09933a2dc485da41ff.svg":{"logical_path":"flags/1x1/gb-nir.svg","mtime":"2022-05-22T18:31:04+02:00","size":26487,"digest":"f5c0a725da9e3e0d7321ae75c61ff5df64d065f1bdece6e2625201735177e558","integrity":"sha256-9cCnJdqePg1zIa51xh/132TQZfG97ObiYlIBc1F35Vg="},"flags/4x3/gb-sct-f7b13851e9b9de7532ef86afefb7fe2efe6149fee8ea50505771b4f7d112cf7b.svg":{"logical_path":"flags/4x3/gb-sct.svg","mtime":"2022-05-22T18:31:04+02:00","size":231,"digest":"bc44f4448f55c576b4f8e1aa1d61a8b28751dfae10cf3d26d0408befa6d0bde0","integrity":"sha256-vET0RI9VxXa0+OGqHWGosodR364Qzz0m0ECL76bQveA="},"flags/1x1/gb-sct-76e5e39a38915cf5f6020d6f58d0385f1fc0d502dbecddabf00a18cd50c88995.svg":{"logical_path":"flags/1x1/gb-sct.svg","mtime":"2022-05-22T18:31:04+02:00","size":239,"digest":"21234ce6c027716f5ea7f9b5ad128aea007534f32ee77557f7e968c82e7627a1","integrity":"sha256-ISNM5sAncW9ep/m1rRKK6gB1NPMu53VX9+loyC52J6E="},"flags/4x3/gb-wls-c6e549d37113c25f679d5ea75020ea514971a1038b3c92d6a71c316a56b542da.svg":{"logical_path":"flags/4x3/gb-wls.svg","mtime":"2022-05-22T18:31:04+02:00","size":9161,"digest":"2e24673349bd8ee843980d052d79c354f993efb345d1ef5ee0fe29807e8d19d4","integrity":"sha256-LiRnM0m9juhDmA0FLXnDVPmT77NF0e9e4P4pgH6NGdQ="},"flags/1x1/gb-wls-99a7a03c4ef2a0789d35aa1ab8b746ec72c1c8de58426afc7fa096d5a00802a7.svg":{"logical_path":"flags/1x1/gb-wls.svg","mtime":"2022-05-22T18:31:04+02:00","size":9055,"digest":"23a0c563a49267894d20b55a5bf6089a582d1ac227a7144c975a191b8f751843","integrity":"sha256-I6DFY6SSZ4lNILVaW/YImlgtGsInpxRMl1oZG491GEM="},"flags/4x3/un-3760dc125288de6c2143060b283497dfed4de7430943f5be86a67d7668ede7a3.svg":{"logical_path":"flags/4x3/un.svg","mtime":"2022-05-22T18:31:04+02:00","size":19935,"digest":"6685994fae5d4918c5b6aa20ed98c3bc736bb1bd88ad2d86b40261682766791d","integrity":"sha256-ZoWZT65dSRjFtqog7ZjDvHNrsb2IrS2GtAJhaCdmeR0="},"flags/1x1/un-aac693764e62f5d0bccf80bc53f68bb6cde75b18c3b3829a89b79555df538c71.svg":{"logical_path":"flags/1x1/un.svg","mtime":"2022-05-22T18:31:04+02:00","size":20185,"digest":"774bae01cbe6a00e4daa93396d860d2ce3d53bb6a5a1f1470e11174fd9315d79","integrity":"sha256-d0uuAcvmoA5NqpM5bYYNLOPVO7alofFHDhEXT9kxXXk="},"flags/4x3/xk-c40be9a1d1844391b275542b4a4ef7a9eecac72a93b08e7f4f2f4ebb17c7538c.svg":{"logical_path":"flags/4x3/xk.svg","mtime":"2022-05-22T18:31:04+02:00","size":9643,"digest":"201401507976e570a410ef6fea6a56db0e05749575bf61ba04a86c7724c6b5c1","integrity":"sha256-IBQBUHl25XCkEO9v6mpW2w4FdJV1v2G6BKhsdyTGtcE="},"flags/1x1/xk-c5498f241b2608496ac30b7c8570d9dcd8f88432ea739ac0ca1abd7fd8beae99.svg":{"logical_path":"flags/1x1/xk.svg","mtime":"2022-05-22T18:31:04+02:00","size":8963,"digest":"a63525c9f71527db7258c39de2e41edb404955ffb3e5d2b9dd1a7f3173e3b028","integrity":"sha256-pjUlyfcVJ9tyWMOd4uQe20BJVf+z5dK53Rp/MXPjsCg="},"leaflet/dist/images/layers-0e356f4d554162eb71f127f50460dbc55d405027189ebe90b20729ef18d13d36.png":{"logical_path":"leaflet/dist/images/layers.png","mtime":"2022-05-22T18:31:04+02:00","size":696,"digest":"1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6","integrity":"sha256-Hbvp0CjikvNvy6j4s6KNXokydU/CIVuaxp5M3s9RB8Y="},"leaflet/dist/images/layers-2x-ba8fa601e413b14db27db07285ade3951721e02244c31523284ab2d1ed53c3dc.png":{"logical_path":"leaflet/dist/images/layers-2x.png","mtime":"2022-05-22T18:31:04+02:00","size":1259,"digest":"066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf","integrity":"sha256-Bm2sqFDY/77wB68AsG6sABVyje4nnFHzy2xxbffELt8="},"leaflet/dist/images/marker-icon-3d253116ec4ba0e1f22a01cdf1ff7f120fa4d89a6cd0933d68f12951d19809b4.png":{"logical_path":"leaflet/dist/images/marker-icon.png","mtime":"2022-05-22T18:31:04+02:00","size":1466,"digest":"574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437","integrity":"sha256-V0w6XMqF9BFAhbaEFZbWLwDXyJLHsD8oy/owHesdxDc="},"markers-soft-6743c1321400ff5ed1fb4c3b0a68a7f8857956084f426b6bb8bff03cab2b724e.png":{"logical_path":"markers-soft.png","mtime":"2022-05-22T18:31:04+02:00","size":41226,"digest":"e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739","integrity":"sha256-54eE5O1wqv/d1zwxX6tZAjPMTntyOI191HoUeW/Hxzk="},"markers-shadow-883ead799be0d0437c65d6172342237e860d121f35a2d215ce4170a8da302338.png":{"logical_path":"markers-shadow.png","mtime":"2022-05-22T18:31:04+02:00","size":535,"digest":"8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20","integrity":"sha256-hwOiJicQ9ePSnmXSrN+Q1lEuFZ4RnSe4I0cx2KYgiiA="},"markers-soft@2x-dd562751740663b74ed9a16c1484444d40fb95b79b8b1b13e5e12a2f8331c5e2.png":{"logical_path":"markers-soft@2x.png","mtime":"2022-05-22T18:31:04+02:00","size":66408,"digest":"c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf","integrity":"sha256-wedyU6i/vjDOwkiF1wRvRDt267ZvTJYfdwg7A/Sly68="},"markers-shadow@2x-64fe7e2740a7d015109cd31a498357dada39f7552caac379a8d1f0c18dc3d77c.png":{"logical_path":"markers-shadow@2x.png","mtime":"2022-05-22T18:31:04+02:00","size":1469,"digest":"b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a","integrity":"sha256-shpTa+JzE/tQT2n1iZ/wsSRbJ2VxdprAjWwyw1Z25Ho="},"events-a7f5ae2e6ebc11b14f50fa3c30086a81ee334fce202abf2164a59c7506157f27.js":{"logical_path":"events.js","mtime":"2022-04-11T11:07:12+02:00","size":1220,"digest":"c283ccc78ece3a385abad9d46d63074dd20a60f1f659497508e411d2885db042","integrity":"sha256-woPMx47OOjhautnUbWMHTdIKYPH2WUl1COQR0ohdsEI="},"filter-aec6405be3a059d4c6182c2b78a7d862e5879d378af79f10c70dd70115d76c69.js":{"logical_path":"filter.js","mtime":"2022-05-22T18:31:04+02:00","size":292,"digest":"24f50dadf4acd091d2c8cfba9367a9b855f35fd9f0639da5e415849d0ed973fe","integrity":"sha256-JPUNrfSs0JHSyM+6k2epuFXzX9nwY52l5BWEnQ7Zc/4="},"flash-757c43f7bcfec72eb8c147d7e40eea4373bbc31269904db4c67a187a13fc856e.js":{"logical_path":"flash.js","mtime":"2022-04-11T11:07:12+02:00","size":82,"digest":"5f872ba614f68bb8d9a9fbfa7d9924512f3b14dc2fb1aff1d758cc3ed4b89e86","integrity":"sha256-X4crphT2i7jZqfv6fZkkUS87FNwvsa/x11jMPtS4noY="},"frTypo-e14689364c33d905e570ab98d54aa6effd3d6a32bff772ff61f4d444a677b507.js":{"logical_path":"frTypo.js","mtime":"2022-05-22T18:31:04+02:00","size":1962,"digest":"762e24c77d91a3e790f17ab5c0765fbdc59e1ad22805ca195d08cd21098ea6c0","integrity":"sha256-di4kx32Ro+eQ8Xq1wHZfvcWeGtIoBcoZXQjNIQmOpsA="},"list-4bca572230746ba29b71588069332bc93e191c4d354e70ce7f4d79d6de930b2b.js":{"logical_path":"list.js","mtime":"2022-05-22T18:31:04+02:00","size":1272,"digest":"9086a09c3f0553d0a59267d93c88cde435231384cccf335faf61b54a2f6cf1fd","integrity":"sha256-kIagnD8FU9ClkmfZPIjN5DUjE4TMzzNfr2G1Si9s8f0="},"maps-e1374da0139727945cef18b9825aac8ff8385c42bd52e4392dfb6d5b42b9d0ee.js":{"logical_path":"maps.js","mtime":"2022-05-22T18:31:04+02:00","size":3760,"digest":"c738f275fdd8c7a76e6e798139b330d1226108b0b726ec890aa6bc6f54fa4b55","integrity":"sha256-xzjydf3Yx6dubnmBObMw0SJhCLC3JuyJCqa8b1T6S1U="},"moderations-1083e9b51d8fdacde5ae79ae6e653e83ea2f97cf547b76137bc7dc870b1cca1e.js":{"logical_path":"moderations.js","mtime":"2022-05-22T18:31:04+02:00","size":377,"digest":"156e7c9ecb717059ec7307f43821293e49fe9dbff00e7975e44e00cfb5b85f00","integrity":"sha256-FW58nstxcFnscwf0OCEpPkn+nb/wDnl15E4Az7W4XwA="},"notes-27cfb9694c5e92d25d972c2b4a2d2e222ad088aef866823f772241c1db423402.js":{"logical_path":"notes.js","mtime":"2022-04-11T11:07:12+02:00","size":31,"digest":"877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05","integrity":"sha256-h3rvMK4bBAq4o6uk4+MJoR1/JhL0Td5FC1wVeqX5XAU="},"orgas-27cfb9694c5e92d25d972c2b4a2d2e222ad088aef866823f772241c1db423402.js":{"logical_path":"orgas.js","mtime":"2022-04-11T11:07:12+02:00","size":31,"digest":"877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05","integrity":"sha256-h3rvMK4bBAq4o6uk4+MJoR1/JhL0Td5FC1wVeqX5XAU="},"pages-ebefad825b6310fe638f3e10bb941230b69ee16fc9de859ce670c3e282c2ba61.js":{"logical_path":"pages.js","mtime":"2022-05-22T18:31:04+02:00","size":999,"digest":"939136186053041a66f6a49df234e428ef919bf5e38ca32b598c49936e49a331","integrity":"sha256-k5E2GGBTBBpm9qSd8jTkKO+Rm/XjjKMrWYxJk25JozE="},"stats-57831421e685bf087e5d17e18193ec7b883975e14affaefeff0b1f2ad9cf1287.js":{"logical_path":"stats.js","mtime":"2022-05-22T18:31:04+02:00","size":908,"digest":"2fad1d4e90bf37b1003fae88e99dd37699a502faf0719ad26ef82fca226bedbc","integrity":"sha256-L60dTpC/N7EAP66I6Z3TdpmlAvrwcZrSbvgvyiJr7bw="},"_variables-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css":{"logical_path":"_variables.css","mtime":"2022-05-22T18:31:04+02:00","size":0,"digest":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","integrity":"sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="},"agendadescommuns-ab1dd655c34ee2e0df5088f7736a3fbef8628a0d45a392803f090d93b0fc3df8.css":{"logical_path":"agendadescommuns.css","mtime":"2022-04-04T22:49:05+02:00","size":939,"digest":"466535f97e0e0acefc4cdf77c9e639f129c5ffafaa0e9c10d35cf352bbf0b7e1","integrity":"sha256-RmU1+X4OCs78TN93yeY58SnF/6+qDpwQ01zzUrvwt+E="},"all-961f78ee92432ef39fd4ccd99a0f2f752e1a8edfb766706ceb1a339b255958d8.css":{"logical_path":"all.css","mtime":"2022-05-22T18:31:04+02:00","size":2745,"digest":"476b12285811ba1e901faf0d586c7204587e4f6146dcbd5c18880343213148ba","integrity":"sha256-R2sSKFgRuh6QH68NWGxyBFh+T2FG3L1cGIgDQyExSLo="},"digest-104627419d74f190311b5b3cdf13e9d62090ec931cdcba30c9b4cf162f340e60.css":{"logical_path":"digest.css","mtime":"2022-05-22T18:31:04+02:00","size":304,"digest":"06bf2110a5b93d28bca1a32734b89c3c4dd3caa8e10120f38a20692bc71aa332","integrity":"sha256-Br8hEKW5PSi8oaMnNLicPE3TyqjhASDziiBpK8caozI="},"events-d9e1b532f35eb6989074796a0875e059dec3f25def65cebf9844c6a88a74a212.css":{"logical_path":"events.css","mtime":"2020-08-25T22:06:58+02:00","size":3105,"digest":"c344fcdfed8866528231502e01ee11c5d8991c0e563ef66e4e96ad6076d1ad82","integrity":"sha256-w0T83+2IZlKCMVAuAe4RxdiZHA5WPvZuTpatYHbRrYI="},"frTypo-3ac4d503c4f2ecb1b79218c06eae720b3be67dc97f345d88742d0169534c73ee.css":{"logical_path":"frTypo.css","mtime":"2022-05-22T18:31:04+02:00","size":76,"digest":"dd9a26629b927d9092b736a713f5385aa2ab7131d169b966af590efc98efc28e","integrity":"sha256-3ZomYpuSfZCStzanE/U4WqKrcTHRablmr1kO/Jjvwo4="},"list-9d2f947b86b004dad844b0af880ab8a0e69489d370d0bd1a2592d8bfcb817114.css":{"logical_path":"list.css","mtime":"2022-05-22T13:48:05+02:00","size":940,"digest":"855c0cac2596c2fa96db629780341897a59b844f736ee1d0911094f0232bb144","integrity":"sha256-hVwMrCWWwvqW22KXgDQYl6WbhE9zbuHQkRCU8CMrsUQ="},"maps-725c7d4efc62c8c339fee78c80a21b5282c666f0a86f10799ca2a9f44dea33cd.css":{"logical_path":"maps.css","mtime":"2022-05-22T18:31:04+02:00","size":524,"digest":"895f1cec08a618420ef7bde0e505b4a6b0f22afc8773292772b839454c9b7cef","integrity":"sha256-iV8c7AimGEIO973g5QW0prDyKvyHcykncrg5RUybfO8="},"mobile-f85c37d44d2b40fbcdf2ca4a3e992b55a271deb6d69e48cf302fd68c24e47e75.css":{"logical_path":"mobile.css","mtime":"2022-05-22T18:31:04+02:00","size":2414,"digest":"c133d9210649332e4a2a9ef18d1a875d5e45f4c4ed33bd87b3e397f380295b13","integrity":"sha256-wTPZIQZJMy5KKp7xjRqHXV5F9MTtM72Hs+OX84ApWxM="},"moderations-0096ff2dbaaf4cb827c0ea9595246185e8f6eb1201a95ad47383204f767cfbb7.css":{"logical_path":"moderations.css","mtime":"2022-05-22T18:31:04+02:00","size":979,"digest":"0b13066128bc39777aa2b7d5b0cad43ea41ff4b61be65391af2428f73e305713","integrity":"sha256-CxMGYSi8OXd6orfVsMrUPqQf9LYb5lORryQo9z4wVxM="},"notes-dfb4401eda9f1493c47d21bfde74b3bea884e032b8475dc754f9f1fb3689796d.css":{"logical_path":"notes.css","mtime":"2022-05-22T18:31:04+02:00","size":37,"digest":"de9e03f3da58d90b03f29332c00aac287d76eed775a23e6b567584942a7ae59b","integrity":"sha256-3p4D89pY2QsD8pMywAqsKH127td1oj5rVnWElCp65Zs="},"orgas-bf3c0aa4f00bc446c1ccfdb4cd77994db2fa465436c6420c22bebab5738409a7.css":{"logical_path":"orgas.css","mtime":"2022-05-22T18:31:04+02:00","size":672,"digest":"3531ea042e606b9fa72c1537c10e81cb2162db3ec0c666542a071d16755e3587","integrity":"sha256-NTHqBC5ga5+nLBU3wQ6ByyFi2z7AxmZUKgcdFnVeNYc="},"pages-b29917202190ced028521961bd8de890197e6987a2e5c8e871dbfaf2ea51fa9e.css":{"logical_path":"pages.css","mtime":"2022-05-22T18:31:04+02:00","size":75,"digest":"c16cf97ac164b6d264da18f962575cc3b816bd0d580b6066eb18a288c15eb262","integrity":"sha256-wWz5esFkttJk2hj5Yldcw7gWvQ1YC2Bm6xiiiMFesmI="},"region-da39e2fee3e61e44603f5248317352e5901effd4339eccb6cb8c14df81319115.css":{"logical_path":"region.css","mtime":"2022-05-22T18:31:04+02:00","size":1871,"digest":"29b0491c3dffc664d733abe92626c536ea73b776a64cc388a462734d5a622b25","integrity":"sha256-KbBJHD3/xmTXM6vpJibFNupzt3amTMOIpGJzTVpiKyU="},"scaffolds-f62d5fc6ab54601c38d8281da2a240b651784b27a628a5d6c328df499c3dbeac.css":{"logical_path":"scaffolds.css","mtime":"2022-05-22T18:31:04+02:00","size":430,"digest":"36de46ca38d276fda0d4e32b27fe03c5f01f64dfe7e5e304603e2cf8dfb8c026","integrity":"sha256-Nt5GyjjSdv2g1OMrJ/4DxfAfZN/n5eMEYD4s+N+4wCY="},"sessions-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css":{"logical_path":"sessions.css","mtime":"2022-05-22T18:31:04+02:00","size":0,"digest":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","integrity":"sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="},"stats-f9fe4057e217c7e56a4bd9cc12618d1ff98805bb494f368a6dcce15d9b9ef0c3.css":{"logical_path":"stats.css","mtime":"2022-05-22T18:31:04+02:00","size":505,"digest":"d64a7e3bf89c64a6b497f3fe7406d2dca6754bd58211919e5695a0fedb2f82ca","integrity":"sha256-1kp+O/icZKa0l/P+dAbS3KZ1S9WCEZGeVpWg/tsvgso="},"tags-fd1c7a90a96d15f57a9d27860a1192f4daf34dc715ca12e9db90efb3dac04955.css":{"logical_path":"tags.css","mtime":"2022-05-22T18:31:04+02:00","size":1377,"digest":"c12d6dffd42d48506a8b26350abb85d9a7bc55f503425ca1b385eab3f5a1b623","integrity":"sha256-wS1t/9QtSFBqiyY1CruF2ae8VfUDQlyhs4Xqs/WhtiM="},"versions-51d9b0340f6b1229364dc45dd44b1b81253212ccac013d642313f59ac833138e.css":{"logical_path":"versions.css","mtime":"2022-05-22T18:31:04+02:00","size":47,"digest":"afa71ba5e90cef6382083024b224b8e7a0a3874b916d1ada8a39e7ce104d9349","integrity":"sha256-r6cbpekM72OCCDAksiS456Cjh0uRbRraijnnzhBNk0k="},"active_admin-fa324a48fc3623783207dec8f6f2e0655c23b9fdf25b5a389fae2e2dbc8714b5.js":{"logical_path":"active_admin.js","mtime":"2022-04-04T22:49:05+02:00","size":970388,"digest":"215c32cb7b56c2d9e58917199da608688b4e7d26dd1882df4a38c51dd3b0670f","integrity":"sha256-IVwyy3tWwtnliRcZnaYIaItOfSbdGILfSjjFHdOwZw8="},"font-awesome/fa-brands-400-c7bb2b5eb0a3d70f8cae2e7c911c998f25c44edf802c42d07280f12535928d93.eot":{"logical_path":"font-awesome/fa-brands-400.eot","mtime":"2020-10-11T20:13:15+02:00","size":133034,"digest":"811e1577184066108ceca86d5a624a9012303df5206c5cb0b27d5e3fedcba5a3","integrity":"sha256-gR4VdxhAZhCM7KhtWmJKkBIwPfUgbFywsn1eP+3LpaM="},"font-awesome/fa-regular-400-044ec7e8c278316fb4733fd045a24750b1efb2840bfeeb04339cbb8880a2bd29.eot":{"logical_path":"font-awesome/fa-regular-400.eot","mtime":"2020-10-11T20:13:15+02:00","size":34390,"digest":"01f4416f5db59e2dd6b6fbd9dc32336d99db18f7eb623a49f584d04afd279473","integrity":"sha256-AfRBb121ni3WtvvZ3DIzbZnbGPfrYjpJ9YTQSv0nlHM="},"font-awesome/fa-solid-900-70f7add4456e350cd00006faed301edc96d849a348d60e2b8b2b17f154a03699.eot":{"logical_path":"font-awesome/fa-solid-900.eot","mtime":"2020-10-11T20:13:15+02:00","size":202902,"digest":"32501727bb23fc77615b1ec76b5f298ec22198c0f3d6a3e7d6fe4ac3cf315db9","integrity":"sha256-MlAXJ7sj/HdhWx7Ha18pjsIhmMDz1qPn1v5Kw88xXbk="},"font-awesome/fa-brands-400-5c6bfccd45ecb5926eb5a767f2cb7843b7df9c0dc9f1d6f4c706a0b452a9c9aa.svg":{"logical_path":"font-awesome/fa-brands-400.svg","mtime":"2020-10-11T20:13:15+02:00","size":715890,"digest":"02340ba1789d09bcc507563c89c4a847ba537bb8132082777a50519cf74bcb5b","integrity":"sha256-AjQLoXidCbzFB1Y8icSoR7pTe7gTIIJ3elBRnPdLy1s="},"font-awesome/fa-regular-400-80980990a4a1c9f37d1c8049f1124dae455adf1952a1febeaa9e75dea67f6f2c.svg":{"logical_path":"font-awesome/fa-regular-400.svg","mtime":"2020-10-11T20:13:15+02:00","size":144322,"digest":"865fd23de13b1920280e182359579e09eff7a09eb24676eceec7552838559f55","integrity":"sha256-hl/SPeE7GSAoDhgjWVeeCe/3oJ6yRnbs7sdVKDhVn1U="},"font-awesome/fa-solid-900-1a8cd60f1e07ec25f1d89d37fbee0504b3403451cac293266abbc5edcdc22f84.svg":{"logical_path":"font-awesome/fa-solid-900.svg","mtime":"2020-10-11T20:13:15+02:00","size":897426,"digest":"e768539808757f7eec20f09c9ee9b36b0e6c5636e90c9ee697995cbbc6ee0555","integrity":"sha256-52hTmAh1f37sIPCcnumzaw5sVjbpDJ7ml5lcu8buBVU="},"font-awesome/fa-brands-400-83a7ed1e0101c6ad43b92b11a7d40b8ee3340b9067bd6dda6f4945e4a222e525.ttf":{"logical_path":"font-awesome/fa-brands-400.ttf","mtime":"2020-10-11T20:13:15+02:00","size":132728,"digest":"a0c145382acfe59767d1487d6505f349665b685c2885cd91b621d141a292b0f8","integrity":"sha256-oMFFOCrP5Zdn0Uh9ZQXzSWZbaFwohc2RtiHRQaKSsPg="},"font-awesome/fa-regular-400-0d79d110605b201387bc02ab87f8c4a90214e7c8c051a36fc07841b101d89b8b.ttf":{"logical_path":"font-awesome/fa-regular-400.ttf","mtime":"2020-10-11T20:13:15+02:00","size":34092,"digest":"f32b94a29060dfec0c797a1dfe111357eb1d682f1aca4ac4b95cf0f4c3e2bfa9","integrity":"sha256-8yuUopBg3+wMeXod/hETV+sdaC8aykrEuVzw9MPiv6k="},"font-awesome/fa-brands-400-7128310d2a1108f27977e17afb15f98ca801e1a1b6dbdeff9e54e98c8174680f.woff":{"logical_path":"font-awesome/fa-brands-400.woff","mtime":"2020-10-11T20:13:15+02:00","size":89824,"digest":"e836c5d5dfc13e18170c5bddefb4fdac7c65ac0ad43a4b431acdc4a98865a260","integrity":"sha256-6DbF1d/BPhgXDFvd77T9rHxlrArUOktDGs3EqYhlomA="},"font-awesome/fa-solid-900-f18f81ea97211566a85df22d1a5ead1629af06a7dae24295ae9397305dc5ac1e.ttf":{"logical_path":"font-awesome/fa-solid-900.ttf","mtime":"2020-10-11T20:13:15+02:00","size":202616,"digest":"231d68cefbc6846fb78cafca8467401a4f371e226418662e8900e3d52adc00ab","integrity":"sha256-Ix1ozvvGhG+3jK/KhGdAGk83HiJkGGYuiQDj1SrcAKs="},"font-awesome/fa-regular-400-24780b83ab131e05f767ca0758d9dee738a2c10f3cd17329a3f5bafd59dde1ba.woff":{"logical_path":"font-awesome/fa-regular-400.woff","mtime":"2020-10-11T20:13:15+02:00","size":16800,"digest":"8e2d96198711b63752e5f2f5987b8ffc536df6156a065bdbe28cb7231cad793d","integrity":"sha256-ji2WGYcRtjdS5fL1mHuP/FNt9hVqBlvb4oy3IxyteT0="},"font-awesome/fa-solid-900-fcaef3c02b9c52f7008cea5aaebf2c55a9b4a3740ef894986a66dcd4684984da.woff":{"logical_path":"font-awesome/fa-solid-900.woff","mtime":"2020-10-11T20:13:15+02:00","size":103300,"digest":"352f8ead280419dd953d2bc7843386bb9430e8152c2dbd2c2d2494f6b9567ee7","integrity":"sha256-NS+OrSgEGd2VPSvHhDOGu5Qw6BUsLb0sLSSU9rlWfuc="},"font-awesome/fa-brands-400-72bee120684b8ed53b9010f36ee025e0342b95149c15ca8f5f58b94e2519d20e.woff2":{"logical_path":"font-awesome/fa-brands-400.woff2","mtime":"2020-10-11T20:13:15+02:00","size":76612,"digest":"5d9190292acdd48ba0fc35080f7e7448f3cdf0d79199a4d23f0f49b5341fdf29","integrity":"sha256-XZGQKSrN1Iug/DUID350SPPN8NeRmaTSPw9JtTQf3yk="},"font-awesome/fa-regular-400-95d99bc7759d6a77d81373510604b63c0ad9295fdbb1f6c9da0c923f4e221178.woff2":{"logical_path":"font-awesome/fa-regular-400.woff2","mtime":"2020-10-11T20:13:15+02:00","size":13584,"digest":"6a8c8e9e1e7f692c21af1956de163f3d026778e6449fe93a09a671847ca1ae65","integrity":"sha256-aoyOnh5/aSwhrxlW3hY/PQJneOZEn+k6CaZxhHyhrmU="},"font-awesome/fa-solid-900-eb9871633db8a4d7b8d66ceb6ef158e2f970bf4d2df6e2ee3122db7c19b285bc.woff2":{"logical_path":"font-awesome/fa-solid-900.woff2","mtime":"2020-10-11T20:13:15+02:00","size":79444,"digest":"7f4d3fd0a705dbf8403298aad91d5de6972e6b5d536068eba8b24954a5a0a8c7","integrity":"sha256-f00/0KcF2/hAMpiq2R1d5pcua11TYGjrqLJJVKWgqMc="},"tinymce/icons/default/icons-a0721895c1cc12748bd1564f906fa27587b5c76ba1598ef53ffc24ecb6b134ab.js":{"logical_path":"tinymce/icons/default/icons.js","mtime":"2022-04-04T22:49:05+02:00","size":59777,"digest":"ddd17f2284b062bccfd1e7c328a83dcba711c4e5a6d983186d57f8b3f562d1e5","integrity":"sha256-3dF/IoSwYrzP0efDKKg9y6cRxOWm2YMYbVf4s/Vi0eU="},"tinymce/jquery.tinymce-3816ed398fa3cae7cfa3778396c3080cc77f7a98cf6f76c09d5fd87ac5717060.js":{"logical_path":"tinymce/jquery.tinymce.js","mtime":"2022-04-04T22:49:05+02:00","size":6672,"digest":"53f3d77f3bb11c570f09d619c464576ff15d53fa4b873d6b3be64cf4c7d833a3","integrity":"sha256-U/PXfzuxHFcPCdYZxGRXb/FdU/pLhz1rO+ZM9MfYM6M="},"tinymce/skins/ui/oxide-dark/content-82b23fc208c58885dd3a684961bc4c4e50e700d500067ba7cdbb655ffd8a92c2.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.css","mtime":"2021-02-12T23:07:40+01:00","size":21145,"digest":"bdea9b449c26b0ab6e354272afdeef7c2132365a15e30a10b96c9af34bb34658","integrity":"sha256-veqbRJwmsKtuNUJyr97vfCEyNloV4woQuWya80uzRlg="},"tinymce/skins/ui/oxide-dark/content.inline-8ec549ee74d93d7dcbc40d60b714c30c5036ad91a0f5078a528a5c45bc95bfc3.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.css","mtime":"2021-02-12T23:07:40+01:00","size":21473,"digest":"ee41633c307dcc6ef61edc46e1700041ed97a0e00e3ea8d1f4647d577552e388","integrity":"sha256-7kFjPDB9zG72HtxG4XAAQe2XoOAOPqjR9GR9V3VS44g="},"tinymce/skins/ui/oxide-dark/content.inline.min-8ec549ee74d93d7dcbc40d60b714c30c5036ad91a0f5078a528a5c45bc95bfc3.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.min.css","mtime":"2021-02-12T23:07:40+01:00","size":21473,"digest":"ee41633c307dcc6ef61edc46e1700041ed97a0e00e3ea8d1f4647d577552e388","integrity":"sha256-7kFjPDB9zG72HtxG4XAAQe2XoOAOPqjR9GR9V3VS44g="},"tinymce/skins/ui/oxide-dark/content.min-82b23fc208c58885dd3a684961bc4c4e50e700d500067ba7cdbb655ffd8a92c2.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.min.css","mtime":"2021-02-12T23:07:40+01:00","size":21145,"digest":"bdea9b449c26b0ab6e354272afdeef7c2132365a15e30a10b96c9af34bb34658","integrity":"sha256-veqbRJwmsKtuNUJyr97vfCEyNloV4woQuWya80uzRlg="},"tinymce/skins/ui/oxide-dark/skin-d6cff5f3694e1247623976b2a5f47f5729b728074ffb7d28a4df0be06e1c2bdd.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.css","mtime":"2021-02-12T23:07:40+01:00","size":59083,"digest":"0d4ac6b5f3f3257f3f1370c3ef27a5e6851cbf540ac2f367b9802f53fd3678cd","integrity":"sha256-DUrGtfPzJX8/E3DD7yel5oUcv1QKwvNnuYAvU/02eM0="},"tinymce/skins/ui/oxide-dark/skin.min-d6cff5f3694e1247623976b2a5f47f5729b728074ffb7d28a4df0be06e1c2bdd.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.min.css","mtime":"2021-02-12T23:07:40+01:00","size":59083,"digest":"0d4ac6b5f3f3257f3f1370c3ef27a5e6851cbf540ac2f367b9802f53fd3678cd","integrity":"sha256-DUrGtfPzJX8/E3DD7yel5oUcv1QKwvNnuYAvU/02eM0="},"tinymce/skins/ui/oxide/content-1d31a6efe041f504ca2859311365c447ea1ecc576f9b55c39398a1174f9aa665.css":{"logical_path":"tinymce/skins/ui/oxide/content.css","mtime":"2021-02-12T23:07:40+01:00","size":21532,"digest":"20b832b6f829c58bd50cfc48897ba96434ebdaa89fc5ea5de81fb0195ab7ca3b","integrity":"sha256-ILgytvgpxYvVDPxIiXupZDTr2qifxepd6B+wGVq3yjs="},"tinymce/skins/ui/oxide/content.inline-8ec549ee74d93d7dcbc40d60b714c30c5036ad91a0f5078a528a5c45bc95bfc3.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.css","mtime":"2021-02-12T23:07:40+01:00","size":21473,"digest":"ee41633c307dcc6ef61edc46e1700041ed97a0e00e3ea8d1f4647d577552e388","integrity":"sha256-7kFjPDB9zG72HtxG4XAAQe2XoOAOPqjR9GR9V3VS44g="},"tinymce/skins/ui/oxide/content.inline.min-8ec549ee74d93d7dcbc40d60b714c30c5036ad91a0f5078a528a5c45bc95bfc3.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.min.css","mtime":"2021-02-12T23:07:40+01:00","size":21473,"digest":"ee41633c307dcc6ef61edc46e1700041ed97a0e00e3ea8d1f4647d577552e388","integrity":"sha256-7kFjPDB9zG72HtxG4XAAQe2XoOAOPqjR9GR9V3VS44g="},"tinymce/skins/ui/oxide/content.min-1d31a6efe041f504ca2859311365c447ea1ecc576f9b55c39398a1174f9aa665.css":{"logical_path":"tinymce/skins/ui/oxide/content.min.css","mtime":"2021-02-12T23:07:40+01:00","size":21532,"digest":"20b832b6f829c58bd50cfc48897ba96434ebdaa89fc5ea5de81fb0195ab7ca3b","integrity":"sha256-ILgytvgpxYvVDPxIiXupZDTr2qifxepd6B+wGVq3yjs="},"tinymce/skins/ui/oxide/skin-558a25b7a5da587053e6de82f63e47bd5eb343c80d4b1dfd2b6ec587b62d29ec.css":{"logical_path":"tinymce/skins/ui/oxide/skin.css","mtime":"2021-02-12T23:07:40+01:00","size":59206,"digest":"491e79784e3bce03a78d1054d67b7960c71b56588a97c537d514511b2a613ad1","integrity":"sha256-SR55eE47zgOnjRBU1nt5YMcbVliKl8U31RRRGyphOtE="},"tinymce/skins/ui/oxide/skin.min-558a25b7a5da587053e6de82f63e47bd5eb343c80d4b1dfd2b6ec587b62d29ec.css":{"logical_path":"tinymce/skins/ui/oxide/skin.min.css","mtime":"2021-02-12T23:07:40+01:00","size":59206,"digest":"491e79784e3bce03a78d1054d67b7960c71b56588a97c537d514511b2a613ad1","integrity":"sha256-SR55eE47zgOnjRBU1nt5YMcbVliKl8U31RRRGyphOtE="},"events-f6adf5fd5d2bef673919b4d5db87b539121c6c3cf5a70c1a0e0fec222c194dd3.css":{"logical_path":"events.css","mtime":"2022-05-22T18:31:04+02:00","size":3091,"digest":"d2a3722ae64a61c49d138ba3a893a394ee2eeb5a2187abf0779d0fc81853992b","integrity":"sha256-0qNyKuZKYcSdE4ujqJOjlO4u61ohh6vwd50PyBhTmSs="},"font-awesome/fa-regular-400-00c96447c535a41055597d80db75302fc04fd1c909239eada694daa76cd77a20.svg":{"logical_path":"font-awesome/fa-regular-400.svg","mtime":"2022-04-04T22:49:05+02:00","size":144714,"digest":"d42a64dc349a98075e8be12587943f2bd52065a8bb18960d7dc7390b535117e0","integrity":"sha256-1Cpk3DSamAdei+Elh5Q/K9UgZai7GJYNfcc5C1NRF+A="},"font-awesome/fa-regular-400-180eef6acca110a022bb81621c04937b3d2edf09fb7644daba7f95368e73b0bd.woff":{"logical_path":"font-awesome/fa-regular-400.woff","mtime":"2022-04-04T22:49:05+02:00","size":16772,"digest":"6799c999e422710f40f70a60a6138fc38106226c44d7bd1b1023f5bb65befef9","integrity":"sha256-Z5nJmeQicQ9A9wpgphOPw4EGImxE170bECP1u2W+/vk="},"font-awesome/fa-brands-400-8b2dc7ace7b22f70f42c11f1606d1ee82ad46445c2f05587928e239e567ff68e.woff":{"logical_path":"font-awesome/fa-brands-400.woff","mtime":"2022-04-04T22:49:05+02:00","size":92136,"digest":"a0375c054a0041bd58e2a0bf7fa3df7c3904bfc4f790fd24e32ff3ee70fd0eef","integrity":"sha256-oDdcBUoAQb1Y4qC/f6PffDkEv8T3kP0k4y/z7nD9Du8="},"font-awesome/fa-solid-900-195989f30d333ecf41e0021dbb92c690f367d2672c43199079d9be4b81dc90da.woff":{"logical_path":"font-awesome/fa-solid-900.woff","mtime":"2022-04-04T22:49:05+02:00","size":104280,"digest":"aab971ade1633ab836222074ceae0aad8a082d900908f27491b221d6e83998ca","integrity":"sha256-qrlxreFjOrg2IiB0zq4KrYoILZAJCPJ0kbIh1ug5mMo="},"font-awesome/fa-solid-900-74883516ac6bb785f2d12d162d769fa7a8fabc7794ef44fc28ffc375b2d7c27c.eot":{"logical_path":"font-awesome/fa-solid-900.eot","mtime":"2022-04-04T22:49:05+02:00","size":204814,"digest":"e0e3c4af28348d721f8af603595c15d273a56f2b03392f9a413255fe5635f536","integrity":"sha256-4OPEryg0jXIfivYDWVwV0nOlbysDOS+aQTJV/lY19TY="},"font-awesome/fa-brands-400-c40f9aba3abc6fd5b0b28b1b125daa3b7bc43063955d456ae4d529705a6c975c.woff2":{"logical_path":"font-awesome/fa-brands-400.woff2","mtime":"2022-04-04T22:49:05+02:00","size":78460,"digest":"71b3ce72680f4183d28db86b184542051fd533bb1146933233e4f6a20cf98cba","integrity":"sha256-cbPOcmgPQYPSjbhrGEVCBR/VM7sRRpMyM+T2ogz5jLo="},"font-awesome/fa-solid-900-e546fb3c56953992a5d20c52edb9e6d1b1141184b88ae19ba20a566d2ad98dbc.woff2":{"logical_path":"font-awesome/fa-solid-900.woff2","mtime":"2022-04-04T22:49:05+02:00","size":80300,"digest":"6b555920e358f8a25a422988b448615c33bcccb4f932e8331cebfc8e2a737fc7","integrity":"sha256-a1VZIONY+KJaQimItEhhXDO8zLT5MugzHOv8jipzf8c="},"font-awesome/fa-regular-400-1efbec653801e7e6a8ea0cd94afd854c3d48225b52857008fe8a1d961cdfcc51.woff2":{"logical_path":"font-awesome/fa-regular-400.woff2","mtime":"2022-04-04T22:49:05+02:00","size":13548,"digest":"ce20ed8a323117c8a718ff1ddc6dabb997373b575a8e896f2bf02b846c082c9d","integrity":"sha256-ziDtijIxF8inGP8d3G2ruZc3O1dajolvK/ArhGwILJ0="},"font-awesome/fa-brands-400-b077551ebb83f7299deaa16b45877ddd3eda20c4988ac79b6def416e7d2b6b3a.svg":{"logical_path":"font-awesome/fa-brands-400.svg","mtime":"2022-04-04T22:49:05+02:00","size":747545,"digest":"e2749cb24a77208abdd9fda35f0d14f091948c44d21f977c8048a3b13e4beccb","integrity":"sha256-4nScskp3IIq92f2jXw0U8JGUjETSH5d8gEijsT5L7Ms="},"font-awesome/fa-solid-900-aa4b725084f0ad0d2d28df4191084467663b409d7272ba2f1cb6ece2d03553ec.ttf":{"logical_path":"font-awesome/fa-solid-900.ttf","mtime":"2022-04-04T22:49:05+02:00","size":204528,"digest":"2caded242c04139761742fe0cda7f6592df1b6686857532c8a7c2e2536b976e4","integrity":"sha256-LK3tJCwEE5dhdC/gzaf2WS3xtmhoV1MsinwuJTa5duQ="},"font-awesome/fa-regular-400-aa1ea349a5a1557fdd700fa5b27df5a01e3b49761201c4d5a95c442e4f7b72c7.eot":{"logical_path":"font-awesome/fa-regular-400.eot","mtime":"2022-04-04T22:49:05+02:00","size":34350,"digest":"f9853ad337d523c0b35fe7ac306268a7035ce0ff7624710ed8b39c2b88b20a33","integrity":"sha256-+YU60zfVI8CzX+esMGJopwNc4P92JHEO2LOcK4iyCjM="},"font-awesome/fa-regular-400-6fdc7b823f89434983845ce3435fa374af7e08912068b8955bdd6c697f1d2797.ttf":{"logical_path":"font-awesome/fa-regular-400.ttf","mtime":"2022-04-04T22:49:05+02:00","size":34052,"digest":"5e811f0b32d488b9a183b77cfc7ac1ef44b3ea7aaed014e83975dfe597d221f6","integrity":"sha256-XoEfCzLUiLmhg7d8/HrB70Sz6nqu0BToOXXf5ZfSIfY="},"font-awesome/fa-brands-400-361037e19d0b6000027564e9edcad98c8a179be70c6c4e0a6ab54cd6d41685bd.eot":{"logical_path":"font-awesome/fa-brands-400.eot","mtime":"2022-04-04T22:49:05+02:00","size":136822,"digest":"6128dd44fed3a046ff8d835d677e0a837c70c64dc1c944b7edfde04eb8d8b879","integrity":"sha256-YSjdRP7ToEb/jYNdZ34Kg3xwxk3ByUS37f3gTrjYuHk="},"font-awesome/fa-solid-900-387bea778f72246fad5ea5b69f68cd059a942e3ab181eb2390ad089bc9cc5e06.svg":{"logical_path":"font-awesome/fa-solid-900.svg","mtime":"2022-04-04T22:49:05+02:00","size":917575,"digest":"1a46e780ce5beb6507d62af8b20a92b33c8f042e87c612f4bbf8330bfc353419","integrity":"sha256-GkbngM5b62UH1ir4sgqSszyPBC6HxhL0u/gzC/w1NBk="},"font-awesome/fa-brands-400-070fe2507cabb066093e6912b85147f7289f5dbb5b582d5c6aea80f9c406dcc5.ttf":{"logical_path":"font-awesome/fa-brands-400.ttf","mtime":"2022-04-04T22:49:05+02:00","size":136516,"digest":"404d6083193e569bc5c28c7b1bc0e13ece80c6e0f5a50ad8e9633f48f3c09155","integrity":"sha256-QE1ggxk+VpvFwox7G8DhPs6AxuD1pQrY6WM/SPPAkVU="},"active_admin-e0f6649ee407880d5fc6aafbd4a271a0e428557143e7bb63f7e2278f85f503cb.css":{"logical_path":"active_admin.css","mtime":"2022-04-04T22:49:05+02:00","size":110644,"digest":"a9992ff353a623ad961590bfb95cfb190b5c1459dff4c3903371383e8c6a4e65","integrity":"sha256-qZkv81OmI62WFZC/uVz7GQtcFFnf9MOQM3E4PoxqTmU="},"lef-38da607e793696b80e684feb25a45fe9afcab6d8d105a6f6a098d5ccfc17cb41.png":{"logical_path":"lef.png","mtime":"2022-05-22T18:31:04+02:00","size":15813,"digest":"ca7ff4a8b3832079dff4da7cdf4e5931718986c5350e5e9092f167f58d51e096","integrity":"sha256-yn/0qLODIHnf9Np8305ZMXGJhsU1Dl6QkvFn9Y1R4JY="},"tinymce-6dc92f373ffb41a60c165e1e1115d0660312460024ba3313132a24a8392cfb6b.js":{"logical_path":"tinymce.js","mtime":"2022-04-04T22:49:05+02:00","size":1072457,"digest":"7957c8d3a63f3daf3ba4a2d7baa9de4131c7701c1c99e84444c24cebd6070916","integrity":"sha256-eVfI06Y/Pa87pKLXuqneQTHHcBwcmehERMJM69YHCRY="},"tinymce/plugins/advlist/plugin-0830d7523521ce3db26326e0306b44ffeacc51a4600b708613d980630f6bcf67.js":{"logical_path":"tinymce/plugins/advlist/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":3834,"digest":"6eb14e5dfe896b0ff7624b523e1ac00e58043a1412e9a6aa1b62d36dd9562f46","integrity":"sha256-brFOXf6Jaw/3YktSPhrADlgEOhQS6aaqG2LTbdlWL0Y="},"tinymce/plugins/anchor/plugin-5759a6ef5b0eae09fb63b4e990b7cd3152e66da3bea15fa73a6026efef19db0b.js":{"logical_path":"tinymce/plugins/anchor/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":2785,"digest":"cad4097e1617ea555b548e7040d270f67b214bdffc29220e79fb20cc12e56bca","integrity":"sha256-ytQJfhYX6lVbVI5wQNJw9nshS9/8KSIOefsgzBLla8o="},"tinymce/plugins/autolink/plugin-62aa356eb273683f0318da0d90dd0956a7ef3c4d3550eff42a6dd8903093b69d.js":{"logical_path":"tinymce/plugins/autolink/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":2432,"digest":"54cff7f5e1f0ba619bc0953309693db256cf41566a21b8144e05980a09f3da8c","integrity":"sha256-VM/39eHwumGbwJUzCWk9slbPQVZqIbgUTgWYCgnz2ow="},"tinymce/plugins/autoresize/plugin-4b1fea682644da19d56a5531948325a242eb44ba261bcd0fe691a5d343fc9c5c.js":{"logical_path":"tinymce/plugins/autoresize/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":2207,"digest":"a029136f93be0ed73aa93572dc5de086b8d136fc141045e47573933a7e56c80a","integrity":"sha256-oCkTb5O+Dtc6qTVy3F3ghrjRNvwUEEXkdXOTOn5WyAo="},"tinymce/plugins/autosave/plugin-c809421e9832e7dc7e468c94ee43fe6d6d58f8744ddd8d9db143717328c535d6.js":{"logical_path":"tinymce/plugins/autosave/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":3000,"digest":"30edb1720706f72d548be33efb3bbb96e204bbc77efde0dcd90c2a79fb4d449d","integrity":"sha256-MO2xcgcG9y1Ui+M++zu7luIEu8d+/eDc2QwqeftNRJ0="},"tinymce/plugins/bbcode/plugin-e309740f6d264b6799abdd06120d9a84b66455e80f37062e68b5a90b15c9ec52.js":{"logical_path":"tinymce/plugins/bbcode/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":3106,"digest":"1bd9313ae3beb667ab4a8775913e5315e971f30589955384517ad1af98f46b5f","integrity":"sha256-G9kxOuO+tmerSod1kT5TFelx8wWJlVOEUXrRr5j0a18="},"tinymce/plugins/charmap/plugin-5b4d6604bea0d9f0f2524830cc53e3e83a30fba669cd02625364b98bba364819.js":{"logical_path":"tinymce/plugins/charmap/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":11995,"digest":"a56e321002c8f1eaa6f96544ad2c8dab5ca09db1d31dc89b65dfb68c19e9de44","integrity":"sha256-pW4yEALI8eqm+WVErSyNq1ygnbHTHcibZd+2jBnp3kQ="},"tinymce/plugins/code/plugin-44b740fc595ca3972eeca89621a6cab8b661afb718be3a2cd89df11a001f8d58.js":{"logical_path":"tinymce/plugins/code/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1149,"digest":"1ebe5592efa18eb728d6e03251d4bab98c9495288aca7c385b0589e93fd7b862","integrity":"sha256-Hr5Vku+hjrco1uAyUdS6uYyUlSiKynw4WwWJ6T/XuGI="},"tinymce/plugins/codesample/plugin-75290cb947814de3c8f1cb2df0c339077b7e26775cbdf7c14881f6f4e65ae433.js":{"logical_path":"tinymce/plugins/codesample/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":44694,"digest":"2e6d10bbb0bacf89f563e4db20e2c9c36b248cf7147e0b3d36ec56fe6214d348","integrity":"sha256-Lm0Qu7C6z4n1Y+TbIOLJw2skjPcUfgs9NuxW/mIU00g="},"tinymce/plugins/colorpicker/plugin-7966e073c54085e60d16e469b806b437a273a062313f5115556c8e650eaf28ef.js":{"logical_path":"tinymce/plugins/colorpicker/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":516,"digest":"922a06ef9acb5648c229ec500eb1e2a4b7a23179eb94c228eb38f8fab778866e","integrity":"sha256-kioG75rLVkjCKexQDrHipLeiMXnrlMIo6zj4+rd4hm4="},"tinymce/plugins/contextmenu/plugin-db9f636edf9d29e26b85961045d9b777f70e1ade79b1482a8beac2e47ffb584d.js":{"logical_path":"tinymce/plugins/contextmenu/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":516,"digest":"e4d00ec37016d98315cb5279ebef620ebdcb2fba96c52f2bb69353df696770df","integrity":"sha256-5NAOw3AW2YMVy1J56+9iDr3LL7qWxS8rtpNT32lncN8="},"tinymce/plugins/directionality/plugin-0b425780160e300f0cffbd7a2b76928b23279fa3116573dfc7c77246a03b74b7.js":{"logical_path":"tinymce/plugins/directionality/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":4086,"digest":"cb130ac0fa98034cb7650d7c320160cd127f065a1c936722706b38e2d6481a67","integrity":"sha256-yxMKwPqYA0y3ZQ18MgFgzRJ/Block2cicGs44tZIGmc="},"tinymce/plugins/emoticons/js/emojiimages-8d59e6cafd8ee4961cd4f31515f08ad07db747166ce3af67fa8108289e88564d.js":{"logical_path":"tinymce/plugins/emoticons/js/emojiimages.js","mtime":"2022-04-04T22:49:05+02:00","size":424469,"digest":"5ce0fe8a1253e4cc1dec73b7b0514976f230c737fa3cbbc84369bda0d29b9f63","integrity":"sha256-XOD+ihJT5Mwd7HO3sFFJdvIwxzf6PLvIQ2m9oNKbn2M="},"tinymce/plugins/emoticons/js/emojis-3006b2aae9b4d0b2df2068968cc5523af58362fbd5759350b5f217f3f20c7236.js":{"logical_path":"tinymce/plugins/emoticons/js/emojis.js","mtime":"2022-04-04T22:49:05+02:00","size":201230,"digest":"0945a609768fbab9ead69866d69cfaded544ebdeb92f0c2b478c8e6ab5c9101f","integrity":"sha256-CUWmCXaPurnq1phm1pz63tVE6965LwwrR4yOarXJEB8="},"tinymce/plugins/emoticons/plugin-129e25052d415a8f2e4ce381ad08926a4d45ceb402765824524949194a9a2b42.js":{"logical_path":"tinymce/plugins/emoticons/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":7065,"digest":"5c1b92cc5c55a255b666d449b9bffc51d99a8e0a8672dc8a816886ceec829de3","integrity":"sha256-XBuSzFxVolW2ZtRJub/8UdmajgqGctyKgWiGzuyCneM="},"tinymce/plugins/fullpage/plugin-fab5b27b87a82c8cc2075d424aae6af3db312c40709aed6b9deb40df372299c4.js":{"logical_path":"tinymce/plugins/fullpage/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":7851,"digest":"6e02a56931d6508876148e8361d17423f9d2310b53ec036136a9221976442888","integrity":"sha256-bgKlaTHWUIh2FI6DYdF0I/nSMQtT7ANhNqkiGXZEKIg="},"tinymce/plugins/fullscreen/plugin-b0e3527a37f820f4e281b38a8954b3d959938528a4faa7d56d7e75ada9a6319c.js":{"logical_path":"tinymce/plugins/fullscreen/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":12737,"digest":"effff3463446243f9b47340ee5414e3df8933f81d25f13e984608a7ddf234f39","integrity":"sha256-7//zRjRGJD+bRzQO5UFOPfiTP4HSXxPphGCKfd8jTzk="},"tinymce/plugins/help/plugin-74b305ee40489a4509af56b6ca9e0d19065a6cf483a62a41c5e0e5e2bc5f99ad.js":{"logical_path":"tinymce/plugins/help/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":13632,"digest":"75ad1b2acec0995fd3b2ec5fca60aaf07d925ca2273029a8a25484ab0af2ae64","integrity":"sha256-da0bKs7AmV/TsuxfymCq8H2SXKInMCmoolSEqwryrmQ="},"tinymce/plugins/hr/plugin-21284fe74756e333d7869fe5875100f951ce6f602980784b672ff50dbdcaae26.js":{"logical_path":"tinymce/plugins/hr/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":800,"digest":"332b19f25d2f702a5a0ee393f742558e734df9883095d680912a755f70588b5d","integrity":"sha256-MysZ8l0vcCpaDuOT90JVjnNN+YgwldaAkSp1X3BYi10="},"tinymce/plugins/image/plugin-25d75078ff2f0bdd5c319f3b1a4f0533f50aed33efc88535b35bad501fd6bf06.js":{"logical_path":"tinymce/plugins/image/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":21204,"digest":"ffe42aa42707f04ad76f0c83bd8516032e9638487c0ebd51056c6fe5a3cfa0dc","integrity":"sha256-/+QqpCcH8ErXbwyDvYUWAy6WOEh8Dr1RBWxv5aPPoNw="},"tinymce/plugins/imagetools/plugin-3a63dc0b36de408663aff44fe27234c9eeed178567bfa295908d87146d1a6fec.js":{"logical_path":"tinymce/plugins/imagetools/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":17405,"digest":"9b55834f1b43f3a39209f04fe93e68da7117ef9277ae71d6dd81757b00771756","integrity":"sha256-m1WDTxtD86OSCfBP6T5o2nEX75J3rnHW3YF1ewB3F1Y="},"tinymce/plugins/importcss/plugin-e85d346d15b6335d12e1f3c29996b3521f4334894e9f973884a1795aff156dac.js":{"logical_path":"tinymce/plugins/importcss/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":4055,"digest":"8608b23ae307894b32b086d229c09141e0bbdaee4ba1c7ae5745efcbe6cc125d","integrity":"sha256-hgiyOuMHiUsysIbSKcCRQeC72u5LoceuV0Xvy+bMEl0="},"tinymce/plugins/insertdatetime/plugin-da260c6661ccf21b41fbe0f9497685435c690381ef56b644e28324d855c9f837.js":{"logical_path":"tinymce/plugins/insertdatetime/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":2986,"digest":"eabd3f4048d9d6fae9dd090d930d15bf80730748ba3399d012e91e50f5e55b2a","integrity":"sha256-6r0/QEjZ1vrp3QkNkw0Vv4BzB0i6M5nQEukeUPXlWyo="},"tinymce/plugins/legacyoutput/plugin-009893bc6e9e3951e4bf1bd27932a255545d31fbc1399e710097a0d0e27e4bf6.js":{"logical_path":"tinymce/plugins/legacyoutput/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":3058,"digest":"b3eca131e6b577a3b4beb3f6b014dc1f0980bf619165c5d2efcb941c29f8d844","integrity":"sha256-s+yhMea1d6O0vrP2sBTcHwmAv2GRZcXS78uUHCn42EQ="},"tinymce/plugins/link/plugin-a174f0de992aa2d46a2b1bc54529adc1aae9c81abb20a75016e84c3bb47f3ca7.js":{"logical_path":"tinymce/plugins/link/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":16245,"digest":"4a0f6f4b193e01faa04f3fa51ec5cd6a6d4f94f117f8653881a504150e5abffa","integrity":"sha256-Sg9vSxk+AfqgTz+lHsXNam1PlPEX+GU4gaUEFQ5av/o="},"tinymce/plugins/lists/plugin-a409864002dceaa350a89029a4364d4604012a24e31c59ea0a7eb8f4395ee439.js":{"logical_path":"tinymce/plugins/lists/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":27392,"digest":"5fb771eb5a9a10e2289777134c0c8a932586c5468d01dca371d700bf5a2e73e9","integrity":"sha256-X7dx61qaEOIol3cTTAyKkyWGxUaNAdyjcdcAv1ouc+k="},"tinymce/plugins/media/plugin-da3484d6d06ca620685572cfadd123ab1dee104de6a315dd156d5641eccc0439.js":{"logical_path":"tinymce/plugins/media/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":18006,"digest":"211edccf3e128caa9907267630fca70fb180502674d14e5fb5f17d9d8069f7cf","integrity":"sha256-IR7czz4SjKqZByZ2MPynD7GAUCZ00U5ftfF9nYBp988="},"tinymce/plugins/nonbreaking/plugin-0a5cc039b5f41f98926d65f2cecd3bee70919347182157daa2a999de02103119.js":{"logical_path":"tinymce/plugins/nonbreaking/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1455,"digest":"763f0b46572662cfd9050caf6fe82a92c3d382ab39855feb1e250c26e520157d","integrity":"sha256-dj8LRlcmYs/ZBQyvb+gqksPTgqs5hV/rHiUMJuUgFX0="},"tinymce/plugins/noneditable/plugin-fefeec77b2ee157d5d3f03a43bd84fd29908de54f6c61442544a776629933ce8.js":{"logical_path":"tinymce/plugins/noneditable/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1759,"digest":"e2c634243ea5ee4cb7f78efe79496edd1d9d8f7aab4853026de6f4ffea75e390","integrity":"sha256-4sY0JD6l7ky3947+eUlu3R2dj3qrSFMCbeb0/+p145A="},"tinymce/plugins/pagebreak/plugin-b7824c4e0024e289f6e17f1cc1d811feafdcf319d60f437406a1b5023b8927d5.js":{"logical_path":"tinymce/plugins/pagebreak/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1706,"digest":"bd408733d7698f343399fba84590c0c4d3a57dea019558fc45da03301b7dadb2","integrity":"sha256-vUCHM9dpjzQzmfuoRZDAxNOlfeoBlVj8RdoDMBt9rbI="},"tinymce/plugins/paste/plugin-1496e7e162a97e039efe79d48e22d9927d77285f119c82244f2f4027ab56c82f.js":{"logical_path":"tinymce/plugins/paste/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":22723,"digest":"abf8bbac2da267b8d588a93881c969d3efbeea43daecf940b4e9363780e7c8f3","integrity":"sha256-q/i7rC2iZ7jViKk4gclp0+++6kPa7PlAtOk2N4DnyPM="},"tinymce/plugins/preview/plugin-5451eb22bfefe89af01a8761ac3ef92781edc1152f7417e62dcbfd57e2a94cae.js":{"logical_path":"tinymce/plugins/preview/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":2152,"digest":"1aa4151e7e85afa103d35e24943f74d8adab783ebb671e3c56708d9cff01a1b4","integrity":"sha256-GqQVHn6Fr6ED014klD902K2reD67Zx48VnCNnP8BobQ="},"tinymce/plugins/print/plugin-36da9c0617304cb0d26fcd56e03b8e6fdc60824f39d7186b68635d0c63310832.js":{"logical_path":"tinymce/plugins/print/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":848,"digest":"9b7833455faea12dbd97bc9680299c98ef25388ff1f955d2e8701630702859fa","integrity":"sha256-m3gzRV+uoS29l7yWgCmcmO8lOI/x+VXS6HAWMHAoWfo="},"tinymce/plugins/quickbars/plugin-d634db5c70899e9ac3eef171482a056de87edbcfa37a584adeef865a2d8b2f16.js":{"logical_path":"tinymce/plugins/quickbars/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":6405,"digest":"7a9d86aacad404387bb7a61ee9c04a9e6be9b0b6b93b48115cf6756ac8dabb48","integrity":"sha256-ep2GqsrUBDh7t6Ye6cBKnmvpsLa5O0gRXPZ1asjau0g="},"tinymce/plugins/save/plugin-ac8ac07ffac52b36c122175dcdb6f4a1b00932dd0497a8af2805b8e11cb8e1a2.js":{"logical_path":"tinymce/plugins/save/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1725,"digest":"50924bae8863d8f33adbd56858913151da0d7e813953fdf34c8b4c4b38ec4d3e","integrity":"sha256-UJJLrohj2PM629VoWJExUdoNfoE5U/3zTItMSzjsTT4="},"tinymce/plugins/searchreplace/plugin-61ef24ee28cea07aa2c0b170e301f65fbb0ed1582404bdf56e3c90f3e12209bc.js":{"logical_path":"tinymce/plugins/searchreplace/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":14954,"digest":"bad2065f308423d3cb33d0b04a07ac86b0af19e2df42f28072e6682223fb1036","integrity":"sha256-utIGXzCEI9PLM9CwSgeshrCvGeLfQvKAcuZoIiP7EDY="},"tinymce/plugins/spellchecker/plugin-d6db90b537c1261209e63b89f3cf8148f0570793d451ddcba73d1a921856466b.js":{"logical_path":"tinymce/plugins/spellchecker/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":9882,"digest":"2ff1f80521eb10c3cdcbc38b7c32af11b9a88185e240b0663b2e241c02f71569","integrity":"sha256-L/H4BSHrEMPNy8OLfDKvEbmogYXiQLBmOy4kHAL3FWk="},"tinymce/plugins/tabfocus/plugin-1cf227228c25bdf4208b5d545615906b468b0d9e8140c664d2a7e1bb3efcb2bd.js":{"logical_path":"tinymce/plugins/tabfocus/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1879,"digest":"7a9f48380b992f18d93d47dbc646d8c04fe0a1276a1524585687dc61cbc7620c","integrity":"sha256-ep9IOAuZLxjZPUfbxkbYwE/goSdqFSRYVofcYcvHYgw="},"tinymce/plugins/table/plugin-bc37111c23f01fc04c35672ab0d38fadaad161c4255a0cc7e1d5ee6eca60ed43.js":{"logical_path":"tinymce/plugins/table/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":137315,"digest":"60546afb72ee85ecd5979f25acf0800ad98f0fba2f5e38f460d6a578f4c62869","integrity":"sha256-YFRq+3LuhezVl58lrPCACtmPD7ovXjj0YNalePTGKGk="},"tinymce/plugins/template/plugin-2fe6dd2f648d55256fe3fabc1c73a8a7b1b8d772bcb4472c172c63eb4bb52b0d.js":{"logical_path":"tinymce/plugins/template/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":8292,"digest":"5762646191fae85ccf3196d3eee85ef1cc9a51ba8896fba90708b828da062edb","integrity":"sha256-V2JkYZH66FzPMZbT7uhe8cyaUbqIlvupBwi4KNoGLts="},"tinymce/plugins/textcolor/plugin-ba03707b036e0ecae2827e99fd96ce468c540606f89fd6c95ab9d701fae914d2.js":{"logical_path":"tinymce/plugins/textcolor/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":512,"digest":"c6c0e1b2ffb6ee3e4f610107f2e8b6be6177b6a4c5687f8ba84a36a65105ca75","integrity":"sha256-xsDhsv+27j5PYQEH8ui2vmF3tqTFaH+LqEo2plEFynU="},"tinymce/plugins/textpattern/plugin-2fb5a7c511f3e1a5aa15c19b267f88fcee0fccbda56253351fea5d653937edbb.js":{"logical_path":"tinymce/plugins/textpattern/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":18261,"digest":"c7ddbcf8b16c120cc0de3774944638285d9625fbbd1247f8640b193d9ad6e6bb","integrity":"sha256-x928+LFsEgzA3jd0lEY4KF2WJfu9Ekf4ZAsZPZrW5rs="},"tinymce/plugins/toc/plugin-6edd73d5ecedb62f2d628ef3cf207b22a3a58795c47c872dbbc86f5b6fe37a83.js":{"logical_path":"tinymce/plugins/toc/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":3367,"digest":"235ed8c6f208a36103940d7b1f5d772954abc0fa9921f3a88061e753bd9035d7","integrity":"sha256-I17YxvIIo2EDlA17H113KVSrwPqZIfOogGHnU72QNdc="},"tinymce/plugins/visualblocks/plugin-5f5bdf7d56602673edccb5d5a5e34a547eb342f1cc4bc5efcc2ba2e6a5658bb6.js":{"logical_path":"tinymce/plugins/visualblocks/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1444,"digest":"1197952d3d3fb9de2a6baf806d70a048057ff1809d76049fb4362012971204be","integrity":"sha256-EZeVLT0/ud4qa6+AbXCgSAV/8YCddgSftDYgEpcSBL4="},"tinymce/plugins/visualchars/plugin-5c73e8f376f54c40577bafee3eb5110230e5be82af05b3ee3481bcf67330fd07.js":{"logical_path":"tinymce/plugins/visualchars/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":6214,"digest":"65198f3d6212f54ffa63f7ac913db344186568a95d8b14f49d7fcdca136b8b3d","integrity":"sha256-ZRmPPWIS9U/6Y/eskT2zRBhlaKldixT0nX/NyhNriz0="},"tinymce/plugins/wordcount/plugin-f0e5014b91a446bfcc318f06fd4de83b9080daa79e2692744240f561795da8b9.js":{"logical_path":"tinymce/plugins/wordcount/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":12268,"digest":"8545d85b0e2c74308d36a8e063270ae065a32e5b76adda47fcdb1cec600edb8c","integrity":"sha256-hUXYWw4sdDCNNqjgYycK4GWjLlt2rdpH/Nsc7GAO24w="},"tinymce/themes/mobile/theme-99507462d078fc9f849c2508b9a7afbc997eb15b02bd622bffc841e81ec85e38.js":{"logical_path":"tinymce/themes/mobile/theme.js","mtime":"2022-04-04T22:49:05+02:00","size":170866,"digest":"9e72493ce95381c2c1b4c7ac052e6206991945951784df29a08633f3c71975ac","integrity":"sha256-nnJJPOlTgcLBtMesBS5iBpkZRZUXhN8poIYz88cZdaw="},"tinymce/themes/silver/theme-4036a717c1dfba952efa2535ef36d86038de7d86a60e9538ace74eea90179f6b.js":{"logical_path":"tinymce/themes/silver/theme.js","mtime":"2022-04-04T22:49:05+02:00","size":411583,"digest":"4f830fca5046f85f3a08e761c0ecebefd1b1de0b0ebe579322586963e62c4921","integrity":"sha256-T4MPylBG+F86COdhwOzr79Gx3gsOvleTIlhpY+YsSSE="},"tinymce/tinymce-91c750bb545201450222b4e4e9691d6d98d523a343ffe9271cc5fb628a76871c.js":{"logical_path":"tinymce/tinymce.js","mtime":"2022-04-04T22:49:05+02:00","size":396678,"digest":"a9118a5615350ffef03c99b12e2fe6c8589cf44058ec7aaf6e2f5d6bed362616","integrity":"sha256-qRGKVhU1D/7wPJmxLi/myFic9EBY7Hqvbi9da+02JhY="},"tinymce/skins/ui/oxide-dark/content-05858f414d87e95ced058681161df9acb0fb5e52a3ea9d3ea5efdc22436e2131.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.css","mtime":"2022-04-04T22:49:05+02:00","size":21211,"digest":"6545b88356649713a2e9fbdc9239d5ae92073ca9d82aaad28efeb291322ae335","integrity":"sha256-ZUW4g1ZklxOi6fvckjnVrpIHPKnYKqrSjv6ykTIq4zU="},"tinymce/skins/ui/oxide-dark/content.inline-965c0ab25123fa4dc5c987969c2a6e90568c903dac8841b59c6af9664a716ca6.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.css","mtime":"2022-04-04T22:49:05+02:00","size":21538,"digest":"1442b2530b205a84c5dc12b589860a5448d55ad4e2ccabb168ddc27fa70c865b","integrity":"sha256-FEKyUwsgWoTF3BK1iYYKVEjVWtTizKuxaN3Cf6cMhls="},"tinymce/skins/ui/oxide-dark/content.inline.min-965c0ab25123fa4dc5c987969c2a6e90568c903dac8841b59c6af9664a716ca6.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.min.css","mtime":"2022-04-04T22:49:05+02:00","size":21538,"digest":"1442b2530b205a84c5dc12b589860a5448d55ad4e2ccabb168ddc27fa70c865b","integrity":"sha256-FEKyUwsgWoTF3BK1iYYKVEjVWtTizKuxaN3Cf6cMhls="},"tinymce/skins/ui/oxide-dark/content.min-05858f414d87e95ced058681161df9acb0fb5e52a3ea9d3ea5efdc22436e2131.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.min.css","mtime":"2022-04-04T22:49:05+02:00","size":21211,"digest":"6545b88356649713a2e9fbdc9239d5ae92073ca9d82aaad28efeb291322ae335","integrity":"sha256-ZUW4g1ZklxOi6fvckjnVrpIHPKnYKqrSjv6ykTIq4zU="},"tinymce/skins/ui/oxide-dark/skin-cc615cac1f1e506e5dc5a7ef61fcbf9f4d7e39f016d16aa364fff0cb9285b59b.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.css","mtime":"2022-04-04T22:49:05+02:00","size":60731,"digest":"c379ee6e27014869bd814f365ce0e2c29737dab81692336e92877e150357fb2d","integrity":"sha256-w3nubicBSGm9gU82XODiwpc32rgWkjNukod+FQNX+y0="},"tinymce/skins/ui/oxide-dark/skin.min-cc615cac1f1e506e5dc5a7ef61fcbf9f4d7e39f016d16aa364fff0cb9285b59b.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.min.css","mtime":"2022-04-04T22:49:05+02:00","size":60731,"digest":"c379ee6e27014869bd814f365ce0e2c29737dab81692336e92877e150357fb2d","integrity":"sha256-w3nubicBSGm9gU82XODiwpc32rgWkjNukod+FQNX+y0="},"tinymce/skins/ui/oxide-dark/skin.shadowdom-7607e1810029c2191d32d46dc71b443e8e5317010b2e92a9bc133da9431fa80b.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.shadowdom.css","mtime":"2022-04-04T22:49:05+02:00","size":514,"digest":"74e2442108dbc9e9e66c4ca8cc39f121aaa65d16a8c5a47b4a4455094399c7e3","integrity":"sha256-dOJEIQjbyenmbEyozDnxIaqmXRaoxaR7SkRVCUOZx+M="},"tinymce/skins/ui/oxide-dark/skin.shadowdom.min-7607e1810029c2191d32d46dc71b443e8e5317010b2e92a9bc133da9431fa80b.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css","mtime":"2022-04-04T22:49:05+02:00","size":514,"digest":"74e2442108dbc9e9e66c4ca8cc39f121aaa65d16a8c5a47b4a4455094399c7e3","integrity":"sha256-dOJEIQjbyenmbEyozDnxIaqmXRaoxaR7SkRVCUOZx+M="},"tinymce/skins/ui/oxide/content-63f8955ff68e1122175e8f46d0b760b966148873e452c1b6085f367ef3d63400.css":{"logical_path":"tinymce/skins/ui/oxide/content.css","mtime":"2022-04-04T22:49:05+02:00","size":21597,"digest":"f0b842397eead8ce94c74303a4846beb3a0aa60d34e67bed05991c5d4f04c50f","integrity":"sha256-8LhCOX7q2M6Ux0MDpIRr6zoKpg005nvtBZkcXU8ExQ8="},"tinymce/skins/ui/oxide/content.inline-965c0ab25123fa4dc5c987969c2a6e90568c903dac8841b59c6af9664a716ca6.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.css","mtime":"2022-04-04T22:49:05+02:00","size":21538,"digest":"1442b2530b205a84c5dc12b589860a5448d55ad4e2ccabb168ddc27fa70c865b","integrity":"sha256-FEKyUwsgWoTF3BK1iYYKVEjVWtTizKuxaN3Cf6cMhls="},"tinymce/skins/ui/oxide/content.inline.min-965c0ab25123fa4dc5c987969c2a6e90568c903dac8841b59c6af9664a716ca6.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.min.css","mtime":"2022-04-04T22:49:05+02:00","size":21538,"digest":"1442b2530b205a84c5dc12b589860a5448d55ad4e2ccabb168ddc27fa70c865b","integrity":"sha256-FEKyUwsgWoTF3BK1iYYKVEjVWtTizKuxaN3Cf6cMhls="},"tinymce/skins/ui/oxide/content.min-63f8955ff68e1122175e8f46d0b760b966148873e452c1b6085f367ef3d63400.css":{"logical_path":"tinymce/skins/ui/oxide/content.min.css","mtime":"2022-04-04T22:49:05+02:00","size":21597,"digest":"f0b842397eead8ce94c74303a4846beb3a0aa60d34e67bed05991c5d4f04c50f","integrity":"sha256-8LhCOX7q2M6Ux0MDpIRr6zoKpg005nvtBZkcXU8ExQ8="},"tinymce/skins/ui/oxide/skin-93571772a14fadb77679e9a87e8d69f0733d3690dfc996d6466b6b0cc5a9f473.css":{"logical_path":"tinymce/skins/ui/oxide/skin.css","mtime":"2022-04-04T22:49:05+02:00","size":60854,"digest":"517b70828058cd7f04a825a99f82194362a7542f7a04911e3eacf48e2e0d8e2c","integrity":"sha256-UXtwgoBYzX8EqCWpn4IZQ2KnVC96BJEePqz0ji4Njiw="},"tinymce/skins/ui/oxide/skin.min-93571772a14fadb77679e9a87e8d69f0733d3690dfc996d6466b6b0cc5a9f473.css":{"logical_path":"tinymce/skins/ui/oxide/skin.min.css","mtime":"2022-04-04T22:49:05+02:00","size":60854,"digest":"517b70828058cd7f04a825a99f82194362a7542f7a04911e3eacf48e2e0d8e2c","integrity":"sha256-UXtwgoBYzX8EqCWpn4IZQ2KnVC96BJEePqz0ji4Njiw="},"tinymce/skins/ui/oxide/skin.shadowdom-7607e1810029c2191d32d46dc71b443e8e5317010b2e92a9bc133da9431fa80b.css":{"logical_path":"tinymce/skins/ui/oxide/skin.shadowdom.css","mtime":"2022-04-04T22:49:05+02:00","size":514,"digest":"74e2442108dbc9e9e66c4ca8cc39f121aaa65d16a8c5a47b4a4455094399c7e3","integrity":"sha256-dOJEIQjbyenmbEyozDnxIaqmXRaoxaR7SkRVCUOZx+M="},"tinymce/skins/ui/oxide/skin.shadowdom.min-7607e1810029c2191d32d46dc71b443e8e5317010b2e92a9bc133da9431fa80b.css":{"logical_path":"tinymce/skins/ui/oxide/skin.shadowdom.min.css","mtime":"2022-04-04T22:49:05+02:00","size":514,"digest":"74e2442108dbc9e9e66c4ca8cc39f121aaa65d16a8c5a47b4a4455094399c7e3","integrity":"sha256-dOJEIQjbyenmbEyozDnxIaqmXRaoxaR7SkRVCUOZx+M="},"active_admin-524694b5b04b9864da3bc5c98c14cf8b3756af77b1fc6bb2a34daedfe1695d02.js":{"logical_path":"active_admin.js","mtime":"2021-12-16T21:38:53+01:00","size":978604,"digest":"7dde4d03f5239db18863409466552bf82e5ffdf5f551f69e5b7465ef3f025fac","integrity":"sha256-fd5NA/UjnbGIY0CUZlUr+C5f/fX1UfaeW3Rl7z8CX6w="},"tinymce/plugins/advlist/plugin-a4bb87de14ddac83e473c24958f3986aaef3e482a28285e52927a8ebfca7c898.js":{"logical_path":"tinymce/plugins/advlist/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3467,"digest":"1c905d0b712d584648bd2c510472d9a576bb648850a108e8af0aa39eff68415c","integrity":"sha256-HJBdC3EtWEZIvSxRBHLZpXa7ZIhQoQjorwqjnv9oQVw="},"tinymce/plugins/anchor/plugin-9d3a3ae4e579fb656192ac31344b8fae41b2232e3ce174e9e89fc50dee581256.js":{"logical_path":"tinymce/plugins/anchor/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":2713,"digest":"51c9a2fa6c3f3609b608b859dd5ff2108ec138da783562065395992398a36c4e","integrity":"sha256-Ucmi+mw/Ngm2CLhZ3V/yEI7BONp4NWIGU5WZI5ijbE4="},"tinymce/plugins/autolink/plugin-988c2d3be209401a075db4adb78f40b300036458a69c744c2184cc590f29958b.js":{"logical_path":"tinymce/plugins/autolink/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":2732,"digest":"7d0dd383aa1256e4bf564220155688f3200a15f67933a5d96973ab6ec1d84993","integrity":"sha256-fQ3Tg6oSVuS/VkIgFVaI8yAKFfZ5M6XZaXOrbsHYSZM="},"tinymce/plugins/autoresize/plugin-9455fc49cd87483f8c0ae22ea5141cdc65b5ce1793fb1dfa5d093e169995ae68.js":{"logical_path":"tinymce/plugins/autoresize/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":2297,"digest":"098b13cbe4c53423125f32f0234274ac8498281d9d99f76940c5aa441a9a5bf8","integrity":"sha256-CYsTy+TFNCMSXzLwI0J0rISYKB2dmfdpQMWqRBqaW/g="},"tinymce/plugins/autosave/plugin-4f8253b53fce6cfb161afbd312f445f8c05f461fa9e717c347f08af0fcf98d88.js":{"logical_path":"tinymce/plugins/autosave/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":2960,"digest":"dd14893780983a089a6a44f10e2ce88e9bf61994f6530295e0f0696a85834f3f","integrity":"sha256-3RSJN4CYOgiaakTxDizojpv2GZT2UwKV4PBpaoWDTz8="},"tinymce/plugins/bbcode/plugin-cbea101dafa8965d9e17ae21eb0d3a34361afbbf3eb2c820246dadcc1707468f.js":{"logical_path":"tinymce/plugins/bbcode/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3085,"digest":"1a5ab30bfcf7e6f2b37ad89049812887b28e4f6fd66975b3d670fe33c36a4f7c","integrity":"sha256-GlqzC/z35vKzetiQSYEoh7KOT2/WaXWz1nD+M8NqT3w="},"tinymce/plugins/charmap/plugin-19431517384979fa1b9c72eeb3e1b7181faa5667774960cbeccbebef0ebfb573.js":{"logical_path":"tinymce/plugins/charmap/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":11667,"digest":"d3dd0373caa6a2b461db80632863b7da9925acc8cd0d005010c85fc6c38885ff","integrity":"sha256-090Dc8qmorRh24BjKGO32pklrMjNDQBQEMhfxsOIhf8="},"tinymce/plugins/code/plugin-7924410803ece6df1784b5c22e0bc0ee4ec94a40af8b870cfb429b888b47ee89.js":{"logical_path":"tinymce/plugins/code/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1133,"digest":"9626629985f39906421d6f979a08fb496eb98bc246cdfaa9a7aab08cae042d42","integrity":"sha256-liZimYXzmQZCHW+Xmgj7SW65i8JGzfqpp6qwjK4ELUI="},"tinymce/plugins/codesample/plugin-f849b0b50282471b042890c2ed9a041b2376a4d3e2e83df65849695f88fb3411.js":{"logical_path":"tinymce/plugins/codesample/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":45706,"digest":"f086a828c88cb8ed9a32174e8199f553cd9ca9c5438950f8838cbafc3c6a30df","integrity":"sha256-8IaoKMiMuO2aMhdOgZn1U82cqcVDiVD4g4y6/DxqMN8="},"tinymce/plugins/colorpicker/plugin-325fc0e42593a9f0b8783101c64dd48c68a1f7975ca98eb236ee1b296af98d67.js":{"logical_path":"tinymce/plugins/colorpicker/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":398,"digest":"0004d9aec2514dabd68cc8c1dd8eea1cde20da23e867630b8f5a2e8ccb6e74d6","integrity":"sha256-AATZrsJRTavWjMjB3Y7qHN4g2iPoZ2MLj1oujMtudNY="},"tinymce/plugins/contextmenu/plugin-4f179b5a8e5f7085a248923c4a2f8894ec4c4e83ed8de24de167df6615a44cd0.js":{"logical_path":"tinymce/plugins/contextmenu/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":398,"digest":"d0eeeb1a0f7594e36cd11ae942791d612a5dd9a175b1029105b6ba183dc91e55","integrity":"sha256-0O7rGg91lONs0RrpQnkdYSpd2aF1sQKRBba6GD3JHlU="},"tinymce/plugins/directionality/plugin-56625711cdc40e44ac72fa3ffef2029eec6a4a548318f4c6ee132a7a09f74e2b.js":{"logical_path":"tinymce/plugins/directionality/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":5337,"digest":"ff8a9c457b04d2df38c5692ecb435312e227e2b38d8117009aabab9fd65650d3","integrity":"sha256-/4qcRXsE0t84xWkuy0NTEuIn4rONgRcAmqurn9ZWUNM="},"tinymce/plugins/emoticons/plugin-7ec6ec8779a198c5a67714d5b10ed64d8a4b5638b0e8c3b4429f7c31d38566b1.js":{"logical_path":"tinymce/plugins/emoticons/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":6885,"digest":"f01824197c5025e90e740a778bdff31713c0e220ce4e19b473cd8fb5ce3e4030","integrity":"sha256-8BgkGXxQJekOdAp3i9/zFxPA4iDOThm0c82Ptc4+QDA="},"tinymce/plugins/fullpage/plugin-bcde45f623fe7fc0b9e0b745180b513ae0468be51a70d4598137f729fce8528a.js":{"logical_path":"tinymce/plugins/fullpage/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":7821,"digest":"5aa789ea3efad79e063a02098b08d979f357dd33fd58f3a528d03cfe7741d8ae","integrity":"sha256-WqeJ6j76154GOgIJiwjZefNX3TP9WPOlKNA8/ndB2K4="},"tinymce/plugins/fullscreen/plugin-c24dd8914a29ff4cffb95a9120681ae7b50ea5a7f85089841de018f35ac7445c.js":{"logical_path":"tinymce/plugins/fullscreen/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":16477,"digest":"9704cd9ce62ad6a7e6f13cf84679900eae0bc2e7459b7143c1c018d64d5db181","integrity":"sha256-lwTNnOYq1qfm8Tz4RnmQDq4LwudFm3FDwcAY1k1dsYE="},"tinymce/plugins/help/plugin-4ad10afd264aa345b89c6bef8afb6d814ea1c973408155aba5b79fc3babcaf53.js":{"logical_path":"tinymce/plugins/help/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":13390,"digest":"a99eb9cc52282b4e1108a60ba8ddb95861448ce1a901d523f6584cb5cba7b7fe","integrity":"sha256-qZ65zFIoK04RCKYLqN25WGFEjOGpAdUj9lhMtcunt/4="},"tinymce/plugins/hr/plugin-931866c9993a5c88988692c7b249a96b92521d575c224824ab3e9cbc36c94844.js":{"logical_path":"tinymce/plugins/hr/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":741,"digest":"828eaede8bd2049d8872e6ebc0899e97e775730bb21d9c419917d9050c4e09e6","integrity":"sha256-go6u3ovSBJ2IcubrwImel+d1cwuyHZxBmRfZBQxOCeY="},"tinymce/plugins/image/plugin-664b7a8f375ab6c9a9f56abe0559c66f596bc0de02d04c0df17fd30d4ff343b0.js":{"logical_path":"tinymce/plugins/image/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":20153,"digest":"57310ced61b7674fd2ab3dd67bd49ce8f67b2c71ea9bcaeaefbbd187ec0b6663","integrity":"sha256-VzEM7WG3Z0/Sqz3We9Sc6PZ7LHHqm8rq77vRh+wLZmM="},"tinymce/plugins/imagetools/plugin-35bb3598b41c70e3e8d46cac2b65835fec624c8f6be8fd562463b12a53521307.js":{"logical_path":"tinymce/plugins/imagetools/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":19462,"digest":"486400fe415abf3706f02c28d261f6459fb9e51a9f4792b4f64ac64f08f33f7e","integrity":"sha256-SGQA/kFavzcG8Cwo0mH2RZ+55RqfR5K09krGTwjzP34="},"tinymce/plugins/importcss/plugin-859b0f1e66d97aa1d0eeb29e1ebcd5778fb9014424d2d0811314b4ef0b01bba7.js":{"logical_path":"tinymce/plugins/importcss/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3989,"digest":"82c720310f401779ed8f67cdb313c409a452d2bdf88e65279563841506789ccd","integrity":"sha256-gscgMQ9AF3ntj2fNsxPECaRS0r34jmUnlWOEFQZ4nM0="},"tinymce/plugins/insertdatetime/plugin-715d878fe04a44fac0aea493df5ccacd628f0b601d81b2c7e9b0fc5abfeb6611.js":{"logical_path":"tinymce/plugins/insertdatetime/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3009,"digest":"395e45c5d17eb450641bb4c2f19cbef5365afc52f4b4b727bcd207c36eccb1d5","integrity":"sha256-OV5FxdF+tFBkG7TC8Zy+9TZa/FL0tLcnvNIHw27MsdU="},"tinymce/plugins/legacyoutput/plugin-145984ce15ed80b01b4113fef30fff5365e5ab50b32017190f5d118b53d7b45e.js":{"logical_path":"tinymce/plugins/legacyoutput/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3005,"digest":"e7eb182259f6f7e99a253008b96eec8f6642a317a34ab0d38fe13e0ae97008a1","integrity":"sha256-5+sYIln29+maJTAIuW7sj2ZCoxejSrDTj+E+CulwCKE="},"tinymce/plugins/link/plugin-d2ee9669187a05a45784d9c5432a74de00871fe73d47fd70e933d6f77e4d6b7e.js":{"logical_path":"tinymce/plugins/link/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":15730,"digest":"8825f308fd84644e18b3257d117de927f8989292cd86469014f1a74cd595493a","integrity":"sha256-iCXzCP2EZE4YsyV9EX3pJ/iYkpLNhkaQFPGnTNWVSTo="},"tinymce/plugins/lists/plugin-e57b133590067d7ccd4b6a0675abc101240104431fd1e7c00181726353f68337.js":{"logical_path":"tinymce/plugins/lists/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":27942,"digest":"546635f6fab512c83ccc4d2a7e8c8a6e82c77fe2d146e430188f0a1964c4ba61","integrity":"sha256-VGY19vq1Esg8zE0qfoyKboLHf+LRRuQwGI8KGWTEumE="},"tinymce/plugins/media/plugin-c37617281c9b5553da10ebc3f23df0d78732d5aa7760af3bc7594d9fbbf2cdd9.js":{"logical_path":"tinymce/plugins/media/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":17549,"digest":"379f821c9ab0a1885515c770a2350d00b1d253033a355366d39ccea8ea358fcc","integrity":"sha256-N5+CHJqwoYhVFcdwojUNALHSUwM6NVNm05zOqOo1j8w="},"tinymce/plugins/nonbreaking/plugin-e0a559965408fd12f28207f7a452043192e3ec936c3b3f139b7cbf8b11dfbc95.js":{"logical_path":"tinymce/plugins/nonbreaking/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1390,"digest":"771a4620a4fc0785b6a389b366744a3fdc3cf15cb2a956b72a33efe13af8a849","integrity":"sha256-dxpGIKT8B4W2o4mzZnRKP9w88VyyqVa3KjPv4Tr4qEk="},"tinymce/plugins/noneditable/plugin-ad701c85ddb14ca90e5b75f989a2791a45734e94b92c6ca635810801d972fffc.js":{"logical_path":"tinymce/plugins/noneditable/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1755,"digest":"7a2701f0faa7e9253f2a83ec1a0d3af2de8b992108ff3ee9803fab962b262fec","integrity":"sha256-eicB8Pqn6SU/KoPsGg068t6LmSEI/z7pgD+rlismL+w="},"tinymce/plugins/pagebreak/plugin-5c33d8634f96e25e17437c8021f9bd011d06c36de0ca6aade8f2c2b90a6841da.js":{"logical_path":"tinymce/plugins/pagebreak/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1631,"digest":"e32b7402df76bf94d64ffe56c5fc0aac07d9bbcabda9594293e8c48c8131cfea","integrity":"sha256-4yt0At92v5TWT/5WxfwKrAfZu8q9qVlCk+jEjIExz+o="},"tinymce/plugins/paste/plugin-376e5dfa239e9fd69115b88f276a0b240aa80530d1bdb59a831a9130543fb1cf.js":{"logical_path":"tinymce/plugins/paste/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":22567,"digest":"c08f9c7465a68793a4b4486d28dd16e39297bf71338766ba0abfa12ca003e43b","integrity":"sha256-wI+cdGWmh5OktEhtKN0W45KXv3Ezh2a6Cr+hLKAD5Ds="},"tinymce/plugins/preview/plugin-3a574253c48e148c1084f850afc96bc622bafbfbcb9fe11087836080c0e9d446.js":{"logical_path":"tinymce/plugins/preview/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":2097,"digest":"3ad8da4973abb8909dffd223c0a5b6fddca0c9331e1688804cc5847d311741cc","integrity":"sha256-OtjaSXOruJCd/9IjwKW2/dygyTMeFoiATMWEfTEXQcw="},"tinymce/plugins/print/plugin-6b2cd4ff593de9e1de62356788c6cb55a19805fc69169df34718bba66e87b3c1.js":{"logical_path":"tinymce/plugins/print/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":809,"digest":"caa08a4f899cbf6cc01ad52aa9eed865f503863a29f2dffa84100ecd1f882699","integrity":"sha256-yqCKT4mcv2zAGtUqqe7YZfUDhjop8t/6hBAOzR+IJpk="},"tinymce/plugins/quickbars/plugin-170fafc6f3e8a470d0c914d13ef2ff03e70589508fbc61e4f78cf0ea6f438156.js":{"logical_path":"tinymce/plugins/quickbars/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":6059,"digest":"9960b115e15ed75bd9da804a1961ea58b23832ad62a0c23a12e89401c9489534","integrity":"sha256-mWCxFeFe11vZ2oBKGWHqWLI4Mq1ioMI6EuiUAclIlTQ="},"tinymce/plugins/save/plugin-14ed227d03749c9c195a01bb91679fad98a2004f49e7d7a8692f70bcc12f66eb.js":{"logical_path":"tinymce/plugins/save/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1717,"digest":"3416beb05f7167fb35e9c204e7c3a5bd944a5dd1c851ea587fabfe2d25ec679e","integrity":"sha256-NBa+sF9xZ/s16cIE58OlvZRKXdHIUepYf6v+LSXsZ54="},"tinymce/plugins/searchreplace/plugin-d378dd2578e974600cd4f118a9e55d717c4c5c17b6fff84687f914e252e3e4b7.js":{"logical_path":"tinymce/plugins/searchreplace/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":14606,"digest":"77b02790ed1f558be7434685323afae17300e94b5f17eb3c7d8af27c6d4787c0","integrity":"sha256-d7AnkO0fVYvnQ0aFMjr64XMA6UtfF+s8fYryfG1Hh8A="},"tinymce/plugins/spellchecker/plugin-c7b5ea71427935f6401c925fe8dc24998b693743625df8117183acbf17bd6e40.js":{"logical_path":"tinymce/plugins/spellchecker/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":9787,"digest":"d68885dfd15cca8ecd364365f0b3a6c5551164a57caac82e865f54d32b5e2cb9","integrity":"sha256-1oiF39Fcyo7NNkNl8LOmxVURZKV8qsguhl9U0yteLLk="},"tinymce/plugins/tabfocus/plugin-e9d1a8e8fdc352cd3c192c3003418b82a84b0e70b4d1d4edbebfc74036603282.js":{"logical_path":"tinymce/plugins/tabfocus/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1859,"digest":"64458f3c48e45f4af232b66c02551ef946f1f5a315505dd39992abd948e03247","integrity":"sha256-ZEWPPEjkX0ryMrZsAlUe+Ubx9aMVUF3TmZKr2UjgMkc="},"tinymce/plugins/table/plugin-6af7688e5a0b33a6654e741732b367e923c1129f3e133c2a28d6871a1de7486c.js":{"logical_path":"tinymce/plugins/table/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":143479,"digest":"458210bd02bbe59450615236f28444399b9c4bfdc37c12fe7e6fccd3935a3002","integrity":"sha256-RYIQvQK75ZRQYVI28oREOZucS/3DfBL+fm/M05NaMAI="},"tinymce/plugins/template/plugin-c3f7169fedb812ac2bdda6c2a5dbb80372e7c82cb35c9f80e55f61dc655915a9.js":{"logical_path":"tinymce/plugins/template/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":8250,"digest":"9724bc1f185bd4f216cdb157e811f2a80474461c01e71710664f97fbb399ceb5","integrity":"sha256-lyS8Hxhb1PIWzbFX6BHyqAR0RhwB5xcQZk+X+7OZzrU="},"tinymce/plugins/textcolor/plugin-3d43be08b7cd7c92164e03bc37aee70e414280032a595fc2a534b2553f5ecf09.js":{"logical_path":"tinymce/plugins/textcolor/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":396,"digest":"2637816d2d4d4aa384ee75b864398a37ad0b13b4ab2b4a758ff97ffa50386672","integrity":"sha256-JjeBbS1NSqOE7nW4ZDmKN60LE7SrK0p1j/l/+lA4ZnI="},"tinymce/plugins/textpattern/plugin-552cb3b358b6fcb6954dae76d8476245146eccb387308cd8a74c640ff23a78ee.js":{"logical_path":"tinymce/plugins/textpattern/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":17614,"digest":"91c744b0f9c0fe5b4ed583aeb7b332d6f9bbef265408075d6774b4969ab69ecb","integrity":"sha256-kcdEsPnA/ltO1YOut7My1vm77yZUCAddZ3S0lpq2nss="},"tinymce/plugins/toc/plugin-239fada39fed395fa2333c0fc2194fff22e81dfbe07b24e41b825664ccf36bcf.js":{"logical_path":"tinymce/plugins/toc/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3283,"digest":"cb88a3ad2aa622dff508949626c2bf39560b3054a2b9dfd0849882d587e3e298","integrity":"sha256-y4ijrSqmIt/1CJSWJsK/OVYLMFSiud/QhJiC1Yfj4pg="},"tinymce/plugins/visualblocks/plugin-1a4122637221a00d282d3c63aabe244f405570c5e701d804c876d942b3e997ae.js":{"logical_path":"tinymce/plugins/visualblocks/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1381,"digest":"403684d6646d569eb8906bec0463c73575cd47a0b2f1b12ce891362f59fd0707","integrity":"sha256-QDaE1mRtVp64kGvsBGPHNXXNR6Cy8bEs6JE2L1n9Bwc="},"tinymce/plugins/visualchars/plugin-f759e8508b9fa10e4fa244b2ecba35349548a679c76f169e9bfdc898d6b73f3d.js":{"logical_path":"tinymce/plugins/visualchars/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":5777,"digest":"a5d1ba54c2884cb6863aeb902bbff283a58e0717f8d3daa6799ca9e8acc7e991","integrity":"sha256-pdG6VMKITLaGOuuQK7/yg6WOBxf409qmeZyp6KzH6ZE="},"tinymce/plugins/wordcount/plugin-c06ada5753cfd157a354710efdd540b98104450645d6fc7e64380c0fd42915a2.js":{"logical_path":"tinymce/plugins/wordcount/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":12106,"digest":"1321f8f2014d69c9f649c913b9de252dffb08c1ac7c9ae7bb58a8d2765f3d6ce","integrity":"sha256-EyH48gFNacn2SckTud4lLf+wjBrHya57tYqNJ2Xz1s4="},"tinymce/themes/mobile/theme-5888ad3256408af5d58b69ecc8323a1cd2eb2d5232ddee631261f760dd933985.js":{"logical_path":"tinymce/themes/mobile/theme.js","mtime":"2021-12-16T21:38:53+01:00","size":159749,"digest":"f93e4080dbc008af13d75387cf0c58851a4d0766341d9a92ffd98ae8c087c79d","integrity":"sha256-+T5AgNvACK8T11OHzwxYhRpNB2Y0HZqS/9mK6MCHx50="},"tinymce/themes/silver/theme-4c7b6d39877cdf63e1dfb6418b9981f144a22af6d144cbaff6ee43f62a78d5b8.js":{"logical_path":"tinymce/themes/silver/theme.js","mtime":"2021-12-16T21:38:53+01:00","size":403179,"digest":"5d81969b354c095f652313f1b910aa24f53462a307823b6553ae24d2f322abe6","integrity":"sha256-XYGWmzVMCV9lIxPxuRCqJPU0YqMHgjtlU64k0vMiq+Y="},"tinymce/tinymce-ebd68dac70289162af9dc4eb5d8a225103bb5faf38e50c703100568b45a92166.js":{"logical_path":"tinymce/tinymce.js","mtime":"2021-12-16T21:38:53+01:00","size":391864,"digest":"261bac16489964a1251a887de4693808902f595cfc6c6fdaa89b3f0dcb4f6d53","integrity":"sha256-JhusFkiZZKElGoh95Gk4CJAvWVz8bG/aqJs/DctPbVM="},"appel-web-180x60-libre-en-fete-2022-02d051e0a863d530e6fc940a19720325cd3283c8067773f6c2802fafe81f5f79.png":{"logical_path":"appel-web-180x60-libre-en-fete-2022.png","mtime":"2022-05-22T18:31:04+02:00","size":8208,"digest":"06984911cfee3f3073015fffdf5a57d5dd20aca7419a7e4a2bfb59ea32ae4643","integrity":"sha256-BphJEc/uPzBzAV//31pX1d0grKdBmn5KK/tZ6jKuRkM="},"appel-web-486x80-libre-en-fete-2022-90f1d12c05449cbb3bae6d682438d4c5664771e267da331c1ac58e5a51bbc486.png":{"logical_path":"appel-web-486x80-libre-en-fete-2022.png","mtime":"2022-05-22T18:31:04+02:00","size":28885,"digest":"31f95f4682b2275d8a8167d2bca123d576dec03b20f16e3ee7e4daa9d034d81b","integrity":"sha256-MflfRoKyJ12KgWfSvKEj1XbewDsg8W4+5+TaqdA02Bs="},"agendadescommuns-18a01cd096b29d12a928627259ca8820b2f291b55421b3e99d8d36a557cb81f5.css":{"logical_path":"agendadescommuns.css","mtime":"2022-05-22T18:31:04+02:00","size":1012,"digest":"40930f0949da0b701fe2009bfc32cfa9cc7c1b19cfc640e2a16a0fb0fc3a43bb","integrity":"sha256-QJMPCUnaC3Af4gCb/DLPqcx8GxnPxkDioWoPsPw6Q7s="},"appel-web-1429x352-libre-en-fete-2022-merci-10eb65847b1807928109cc9c46bb764e2d91c13a0b81a5d1a8db741176d4d76b.png":{"logical_path":"appel-web-1429x352-libre-en-fete-2022-merci.png","mtime":"2022-05-22T18:31:04+02:00","size":96106,"digest":"bf8992d762980491de58bd2e3f98b2be2b2c16528c276edf34cad31ff9447d26","integrity":"sha256-v4mS12KYBJHeWL0uP5iyvissFlKMJ27fNMrTH/lEfSY="},"application-66d8f43bfb851116bc1aa6e63f2d9f8b38bf2b99eecb88b7a89a5c751f9fa523.css":{"logical_path":"application.css","mtime":"2022-04-10T23:03:15+02:00","size":324462,"digest":"1b754623d25f7ede014a358bb6828ef6227c6f50b484ef9bd9f97991fe765d8a","integrity":"sha256-G3VGI9Jfft4BSjWLtoKO9iJ8b1C0hO+b2fl5kf52XYo="},"font-awesome/fa-solid-900-addc97d14257b43232b89194f73bd3b862007d5eedcb4569362b8f26356d8db3.woff2":{"logical_path":"font-awesome/fa-solid-900.woff2","mtime":"2022-05-22T18:31:04+02:00","size":154228,"digest":"d76fb4e841748a3f6bc63efa23156e02631c283bf41f84efcbdaf339ea3e1b73","integrity":"sha256-12+06EF0ij9rxj76IxVuAmMcKDv0H4Tvy9rzOeo+G3M="},"font-awesome/fa-solid-900-a0cc38b88839387e4451bb1ebdd9ecd821b2df0f7fcd5b26df75630f4171ee32.ttf":{"logical_path":"font-awesome/fa-solid-900.ttf","mtime":"2022-05-22T18:31:04+02:00","size":388460,"digest":"03f2986c0824c68bdaf1e16947352f5fe417d03741806097fa9ea7131fe3a019","integrity":"sha256-A/KYbAgkxova8eFpRzUvX+QX0DdBgGCX+p6nEx/joBk="},"font-awesome/fa-regular-400-6919b47939790fc2ab662fd09b22907c53f32d9a817eed0782e2fb3e7af24b5b.woff2":{"logical_path":"font-awesome/fa-regular-400.woff2","mtime":"2022-05-22T18:31:04+02:00","size":23940,"digest":"6a274e7629c0d71dcf8cab1e7733687ebfe32e2c53b4ca9fad050b4f1d5471f3","integrity":"sha256-aidOdinA1x3PjKsedzNofr/jLixTtMqfrQULTx1UcfM="},"font-awesome/fa-regular-400-79a39b18a5524be800ab200fbedebf7f737a316f01b874fe42b005fda10a6f11.ttf":{"logical_path":"font-awesome/fa-regular-400.ttf","mtime":"2022-05-22T18:31:04+02:00","size":60520,"digest":"4e96a7e098e36fd493194c64e973ba5237da65760c7b746217e63c830326a9ac","integrity":"sha256-Tpan4Jjjb9STGUxk6XO6UjfaZXYMe3RiF+Y8gwMmqaw="},"font-awesome/fa-brands-400-e624f952dec1ac1e2673205a87513cab83c4a0d187b08528a5ff0c36d9b1e090.woff2":{"logical_path":"font-awesome/fa-brands-400.woff2","mtime":"2022-05-22T18:31:04+02:00","size":105536,"digest":"404c746c8f7e3f9b7611a8f23d908c1a32a5c972236b9d89bb68b05d9bf4b905","integrity":"sha256-QEx0bI9+P5t2EajyPZCMGjKlyXIja52Ju2iwXZv0uQU="},"font-awesome/fa-brands-400-d6e9a2e4cad853a5a88711678db47de7456f36b30923f8350f55c41434809ba8.ttf":{"logical_path":"font-awesome/fa-brands-400.ttf","mtime":"2022-05-22T18:31:04+02:00","size":181852,"digest":"e523f49c12b13a176014af1a46ae5a0545b136bf56d496426aa881026d0c318a","integrity":"sha256-5SP0nBKxOhdgFK8aRq5aBUWxNr9W1JZCaqiBAm0MMYo="},"form-9f90a38d35bb26c36651a72cc781dae16f0fb3db91f4667a4bcc6343be27c31e.css":{"logical_path":"form.css","mtime":"2022-04-10T23:03:15+02:00","size":112557,"digest":"82ebdbf8e7579a209a4e8c0f07d27169f45dbef285fa005e6dd727ac7acc5893","integrity":"sha256-guvb+OdXmiCaTowPB9JxafRdvvKF+gBebdcnrHrMWJM="},"actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js":{"logical_path":"actiontext.js","mtime":"2022-05-22T18:31:04+02:00","size":30457,"digest":"bcc99d511868dd8b36e6a36485cfcb08299e8d5ed60749987b16486bc7d9fec4","integrity":"sha256-vMmdURho3Ys25qNkhc/LCCmejV7WB0mYexZIa8fZ/sQ="},"trix-1563ff9c10f74e143b3ded40a8458497eaf2f87a648a5cbbfebdb7dec3447a5e.js":{"logical_path":"trix.js","mtime":"2022-05-22T18:31:04+02:00","size":331822,"digest":"f9d8ba8330bd834665c7b3190ae739b21bae1cc9131d132b9839788d648e3d61","integrity":"sha256-+di6gzC9g0Zlx7MZCuc5shuuHMkTHRMrmDl4jWSOPWE="},"trix-6fd35bb8fae1d6a795115763ca265369b9750f73a1c6283a0b0ef4b6c2d550c8.css":{"logical_path":"trix.css","mtime":"2022-05-22T18:31:04+02:00","size":14054,"digest":"e2950144e21f62655820d93219c1f76d4dff7a39565c7d847d59b6d0de3cf381","integrity":"sha256-4pUBROIfYmVYINkyGcH3bU3/ejlWXH2EfVm20N4884E="},"active_admin-ae7525b879029a3d2fee45967491fda6ffacc68c434ff7f10183bbe5249c86d7.css":{"logical_path":"active_admin.css","mtime":"2022-05-22T13:48:05+02:00","size":162473,"digest":"d891f09b0c5fc2cbf110ed1f344211d64c23fad076e9c2b33f2a4467b6a604e9","integrity":"sha256-2JHwmwxfwsvxEO0fNEIR1kwj+tB26cKzPypEZ7amBOk="},"active_admin-f992ca5d9243601d31dad73c57a4aa5a2b9170b75890935419af02778b86c258.js":{"logical_path":"active_admin.js","mtime":"2022-05-22T18:31:04+02:00","size":978871,"digest":"ef21a6edc93359ccd73b7ccfda7cd6263b24a069755ffffac0900b2a6dd2d8c5","integrity":"sha256-7yGm7ckzWczXO3zP2nzWJjskoGl1X//6wJALKm3S2MU="},"tinymce-039e939395dd032c76e34c5742fe134e3efbed2712715bd90a2d86e35769d0e8.js":{"logical_path":"tinymce.js","mtime":"2022-04-11T11:07:13+02:00","size":1082889,"digest":"ac690ebc399de6cc2213f5f4c9a408dddb3b22a1ac5e4e470588c854f899f758","integrity":"sha256-rGkOvDmd5swiE/X0yaQI3ds7IqGsXk5HBYjIVPiZ91g="},"activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js":{"logical_path":"activestorage.js","mtime":"2022-05-22T18:31:04+02:00","size":29045,"digest":"718a3b7737430511519d7175a20269953d97a1252acb0c17e9f7ffe5cac4f4a7","integrity":"sha256-cYo7dzdDBRFRnXF1ogJplT2XoSUqywwX6ff/5crE9Kc="},"activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js":{"logical_path":"activestorage.esm.js","mtime":"2022-05-22T18:31:04+02:00","size":26992,"digest":"a10bcef9e766c86260e93966fa6f2fe5efb8b03c744634d8bf0b835eca5414ca","integrity":"sha256-oQvO+edmyGJg6Tlm+m8v5e+4sDx0RjTYvwuDXspUFMo="},"actioncable-da745289dc396d1588ddfd149d68bb8e519d9e7059903aa2bb98cfc57be6d66e.js":{"logical_path":"actioncable.js","mtime":"2022-04-11T11:07:13+02:00","size":15701,"digest":"b64d2d1ee957609a8ad7a68c11fb94b76d40ec4adb4a6bdaed9f8928f3907c55","integrity":"sha256-tk0tHulXYJqK16aMEfuUt21A7ErbSmva7Z+JKPOQfFU="},"actioncable.esm-3d92de0486af7257cac807acf379cea45baf450c201e71e3e84884c0e1b5ee15.js":{"logical_path":"actioncable.esm.js","mtime":"2022-04-11T11:07:13+02:00","size":14082,"digest":"608d0f80b12a3adba120876ea0b2721e75b649556cae97fcb98fb83cc37dfa1b","integrity":"sha256-YI0PgLEqOtuhIIduoLJyHnW2SVVsrpf8uY+4PMN9+hs="},"form-eec7b128a5ad80130478cbec515e36bd4a3fbd9c5e110dc493af761efd901728.css":{"logical_path":"form.css","mtime":"2022-04-10T22:40:10+02:00","size":112841,"digest":"d8e9cfeb6fea6a007615d6ba521be3a94357e11f36dfe9434e217d0a3e3b191c","integrity":"sha256-2OnP62/qagB2Fda6UhvjqUNX4R823+lDTiF9Cj47GRw="},"application-a9c5badf4217cb52b79885bbc9de63ce27c7506889b4b652f4c960f22f2321fd.js":{"logical_path":"application.js","mtime":"2022-04-11T11:07:12+02:00","size":2021032,"digest":"d278990bfefe5775ea3a2af6430fb42d3319b176a2382666cfbc863b05822bf0","integrity":"sha256-0niZC/7+V3XqOir2Qw+0LTMZsXaiOCZmz7yGOwWCK/A="},"application-0c390af53f43f7fd5dbf6e72b1c655b940aeb0daec81afe56cdb5798d058bec4.css":{"logical_path":"application.css","mtime":"2022-05-22T13:48:05+02:00","size":324456,"digest":"6fc11420e92a93c82336d31a9fda4f646185957dfc9c25be311319eb61fedf92","integrity":"sha256-b8EUIOkqk8gjNtMan9pPZGGFlX38nCW+MRMZ62H+35I="},"setup_tinymce-bf1768a15a0295d3422afc5a0b7a6d68198ae3decad69afba6eecbcea51fc01a.js":{"logical_path":"setup_tinymce.js","mtime":"2022-04-11T11:07:12+02:00","size":1091,"digest":"5c2767c3a12edba7db5d7b64138a7ddff0965aa876723d736d6030983c22a09e","integrity":"sha256-XCdnw6Eu26fbXXtkE4p93/CWWqh2cj1zbWAwmDwioJ4="},"form-f538ad878340c212194ccc353a0413127beb91a909abf7c713cf0d59e8bdab0c.css":{"logical_path":"form.css","mtime":"2022-05-22T18:31:04+02:00","size":112551,"digest":"d0ebb1d502862fa1e3798add71d4506f2a3247a0f406eefd49f439cc5d8deb8c","integrity":"sha256-0Oux1QKGL6HjeYrdcdRQbyoyR6D0Bu79SfQ5zF2N64w="},"manifest-597b5199768f5efff6ec880a4180aec95099b04608cc46e56dfe4e0940ee4665.js":{"logical_path":"manifest.js","mtime":"2022-05-22T18:31:04+02:00","size":8,"digest":"79488488398f5f5aed236dd6e9f914599370d04dfe70fda61b8c83bf739b1088","integrity":"sha256-eUiEiDmPX1rtI23W6fkUWZNw0E3+cP2mG4yDv3ObEIg="},"application-bc8be1ca9329364a332d65400703da287de4e0022ead70f15b2284ecc00f8ba7.js":{"logical_path":"application.js","mtime":"2022-05-22T13:48:05+02:00","size":2000019,"digest":"4e437d8a115904d1919901117d29bab0ee4270adb1cac225b1610854fd2b0b41","integrity":"sha256-TkN9ihFZBNGRmQERfSm6sO5CcK2xysIlsWEIVP0rC0E="},"events-3e83b10967184ff7800176a5aae37f0d45162e4dbc6a8d101e79636eb2274842.js":{"logical_path":"events.js","mtime":"2022-05-22T18:31:04+02:00","size":2139,"digest":"df6cefd99e99c4107486c54fbad634ec43daf47bb81fdf8422264610b9726be1","integrity":"sha256-32zv2Z6ZxBB0hsVPutY07EPa9Hu4H9+EIiZGELlya+E="},"setup_tinymce-60b664f97cee4cc8468740edb342c358b980bba2fcf5704bb659052f4ab2f44f.js":{"logical_path":"setup_tinymce.js","mtime":"2022-05-22T13:48:05+02:00","size":1110,"digest":"251e4b88be43fe6cb86136013a35a29f91c12372075531cd78256c75d09ab9c0","integrity":"sha256-JR5LiL5D/my4YTYBOjWin5HBI3IHVTHNeCVsddCaucA="},"es-module-shims-98e5c1733b56bbd38eb81a6b95c76993d1549a149630db86b70b52ef7bf09f38.js":{"logical_path":"es-module-shims.js","mtime":"2022-05-22T18:31:04+02:00","size":48019,"digest":"ce8ba83112b97a45d46c45480f5e99298063aa74b861ad15be4f27e20c7b5af5","integrity":"sha256-zouoMRK5ekXUbEVID16ZKYBjqnS4Ya0Vvk8n4gx7WvU="},"es-module-shims.min-8b21b40925fc92896e87358f40a2a8aaea6bf306b34ee4a215ec09c59c6cb3ba.js":{"logical_path":"es-module-shims.min.js","mtime":"2022-05-22T18:31:04+02:00","size":32552,"digest":"6003d601047f980c11079ec149fbd98f2f4ea2d258cf1e789b7170f968100f9e","integrity":"sha256-YAPWAQR/mAwRB57BSfvZjy9OotJYzx54m3Fw+WgQD54="},"es-module-shims.js-b3dc1eaec0edc72cb130edacd5193386c67b6be171383614226d986a6b991ad4.map":{"logical_path":"es-module-shims.js.map","mtime":"2022-05-22T18:31:04+02:00","size":101725,"digest":"cd843fdbe8862e749c2a5cbb10718f5f1ae2a63ee84cb3d181dc0dfb6857919c","integrity":"sha256-zYQ/2+iGLnScKly7EHGPXxripj7oTLPRgdwN+2hXkZw="},"tinymce-0a65cd0b35e87db0a198eb30e4daa2085929a73d1ccba4d8c7531a2245443311.js":{"logical_path":"tinymce.js","mtime":"2022-05-22T18:31:04+02:00","size":1067681,"digest":"04b1c31c00e5dee834440f6c9b241c0b5896c45fa2d3f413bd8b6b8a4e51b470","integrity":"sha256-BLHDHADl3ug0RA9smyQcC1iWxF+i0/QTvYtrik5RtHA="},"actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js":{"logical_path":"actioncable.js","mtime":"2022-05-22T18:31:04+02:00","size":15699,"digest":"6b2fe44d9e4546fcc6b92f0a37b61d6b555020041ede1dd603c007b1c0904ec1","integrity":"sha256-ay/kTZ5FRvzGuS8KN7Yda1VQIAQe3h3WA8AHscCQTsE="},"actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js":{"logical_path":"actioncable.esm.js","mtime":"2022-05-22T18:31:04+02:00","size":14080,"digest":"a9e53dfa810276aa0aee8791a910c4878d48b75093398f3d6d822db41b428b7b","integrity":"sha256-qeU9+oECdqoK7oeRqRDEh41It1CTOY89bYIttBtCi3s="},"application-14e1e96bfbd100fc952a731001b2d2e04189f0702d8a6ae050503030259dd668.js":{"logical_path":"application.js","mtime":"2022-05-22T18:31:04+02:00","size":2000019,"digest":"2cd3220b1494f3a19582ffa006586cb580473625714609c01f3c3ed599fdc328","integrity":"sha256-LNMiCxSU86GVgv+gBlhstYBHNiVxRgnAHzw+1Zn9wyg="},"application-0ec4812f14f3da4405d5bea5a5aa18db9b4518953d17a2bf1198215db5a54b2b.css":{"logical_path":"application.css","mtime":"2022-05-22T18:31:04+02:00","size":324691,"digest":"cb7989173b2ed312d483ad4816af8f1864af1888c05c386df2925fb8b7a6356f","integrity":"sha256-y3mJFzsu0xLUg61IFq+PGGSvGIjAXDht8pJfuLemNW8="},"setup_tinymce-25067ac5d8f690f8eee54a28349199fcb5831ea846457867835bcf47d57952f6.js":{"logical_path":"setup_tinymce.js","mtime":"2022-05-22T18:31:04+02:00","size":1110,"digest":"e9b2843e2d4e1633044a045ada31cdcd3cbdc02dfaae336d8d109fd11a317792","integrity":"sha256-6bKEPi1OFjMESgRa2jHNzTy9wC36rjNtjRCf0Roxd5I="},"list-561b0a756f4d38ca2e80f68e71f3cf9209d36ae15c5986d05e3989860c0f30ec.css":{"logical_path":"list.css","mtime":"2022-05-22T18:31:04+02:00","size":1175,"digest":"416637826665e906c086041ec3bf0428fa185ee5634ed2782cd326b35fe785c3","integrity":"sha256-QWY3gmZl6QbAhgQew78EKPoYXuVjTtJ4LNMms1/nhcM="},"active_admin-a10a0eb4af00bea304176f8955d734e073ab869cb08fae8f15db407996577f2c.css":{"logical_path":"active_admin.css","mtime":"2022-05-22T18:31:04+02:00","size":162708,"digest":"443b345c34471f8463b184c81f41bb80f29fba1c0195f895faa7eebb0ef5728f","integrity":"sha256-RDs0XDRHH4RjsYTIH0G7gPKfuhwBlfiV+qfuuw71co8="},"tinymce/jquery.tinymce.js":{"logical_path":"tinymce/jquery.tinymce.js","mtime":"2022-04-11T11:07:13+02:00","size":6597,"digest":null,"integrity":"sha256-8g5ZQwwujnwJQ+zcQtWcBoal43dzb7WJnePsH57+hLw="},"tinymce/langs/readme.md":{"logical_path":"tinymce/langs/readme.md","mtime":"2019-12-21T20:51:18+01:00","size":151,"digest":null},"tinymce/license.txt":{"logical_path":"tinymce/license.txt","mtime":"2022-05-21T10:06:29+02:00","size":1102,"digest":null},"tinymce/plugins/advlist/plugin.js":{"logical_path":"tinymce/plugins/advlist/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":3376,"digest":null},"tinymce/plugins/anchor/plugin.js":{"logical_path":"tinymce/plugins/anchor/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":2537,"digest":null},"tinymce/plugins/autolink/plugin.js":{"logical_path":"tinymce/plugins/autolink/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":2826,"digest":null},"tinymce/plugins/autoresize/plugin.js":{"logical_path":"tinymce/plugins/autoresize/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":2074,"digest":null},"tinymce/plugins/autosave/plugin.js":{"logical_path":"tinymce/plugins/autosave/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":3257,"digest":null},"tinymce/plugins/bbcode/plugin.js":{"logical_path":"tinymce/plugins/bbcode/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":3085,"digest":null,"integrity":"sha256-23mUUjcmlbg6UrkYrZPjoTuDxCEUL7SEAxo40gAND5g="},"tinymce/plugins/charmap/plugin.js":{"logical_path":"tinymce/plugins/charmap/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":10981,"digest":null},"tinymce/plugins/code/plugin.js":{"logical_path":"tinymce/plugins/code/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":877,"digest":null},"tinymce/plugins/codesample/plugin.js":{"logical_path":"tinymce/plugins/codesample/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":46812,"digest":null},"tinymce/plugins/colorpicker/plugin.js":{"logical_path":"tinymce/plugins/colorpicker/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":398,"digest":null,"integrity":"sha256-rMnuhnYmYpWklzpHVM2CIDPhkj5iRqt0KZNyyyEQRaI="},"tinymce/plugins/contextmenu/plugin.js":{"logical_path":"tinymce/plugins/contextmenu/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":398,"digest":null,"integrity":"sha256-y86qGZ5bA/P0QNpvUB9u3lgNqldj2CuSfJ/6y6VbPAc="},"tinymce/plugins/directionality/plugin.js":{"logical_path":"tinymce/plugins/directionality/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":4360,"digest":null},"tinymce/plugins/emoticons/js/emojis.js":{"logical_path":"tinymce/plugins/emoticons/js/emojis.js","mtime":"2022-05-21T10:06:29+02:00","size":192856,"digest":null},"tinymce/plugins/emoticons/plugin.js":{"logical_path":"tinymce/plugins/emoticons/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":6325,"digest":null},"tinymce/plugins/fullpage/plugin.js":{"logical_path":"tinymce/plugins/fullpage/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":7821,"digest":null,"integrity":"sha256-77eMqpWsC4eonCzuo7OqJvgNvFj5xvqFRoIkKo0U6vk="},"tinymce/plugins/fullscreen/plugin.js":{"logical_path":"tinymce/plugins/fullscreen/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":14603,"digest":null},"tinymce/plugins/help/plugin.js":{"logical_path":"tinymce/plugins/help/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":13050,"digest":null},"tinymce/plugins/hr/plugin.js":{"logical_path":"tinymce/plugins/hr/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":741,"digest":null,"integrity":"sha256-MN1uFiHblL2k6eIC1gQBNuOEnsncEuHs/UxOSuMXnbo="},"tinymce/plugins/image/plugin.js":{"logical_path":"tinymce/plugins/image/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":19054,"digest":null},"tinymce/plugins/imagetools/plugin.js":{"logical_path":"tinymce/plugins/imagetools/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":19462,"digest":null,"integrity":"sha256-SRYgF0XPui0y7qXIEkE/ei9bppva3P2TtHzMMef1imY="},"tinymce/plugins/importcss/plugin.js":{"logical_path":"tinymce/plugins/importcss/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":4036,"digest":null},"tinymce/plugins/insertdatetime/plugin.js":{"logical_path":"tinymce/plugins/insertdatetime/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":2911,"digest":null},"tinymce/plugins/legacyoutput/plugin.js":{"logical_path":"tinymce/plugins/legacyoutput/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":3005,"digest":null,"integrity":"sha256-TXPybhgtrcIsJa1FIBZqluFbmIQnHP/6AM2Cbxvkkbw="},"tinymce/plugins/link/plugin.js":{"logical_path":"tinymce/plugins/link/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":14982,"digest":null},"tinymce/plugins/lists/plugin.js":{"logical_path":"tinymce/plugins/lists/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":21934,"digest":null},"tinymce/plugins/media/plugin.js":{"logical_path":"tinymce/plugins/media/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":16187,"digest":null},"tinymce/plugins/nonbreaking/plugin.js":{"logical_path":"tinymce/plugins/nonbreaking/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":1416,"digest":null},"tinymce/plugins/noneditable/plugin.js":{"logical_path":"tinymce/plugins/noneditable/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":1755,"digest":null,"integrity":"sha256-WfptbDe7nrAKZmqQAxTgccwqToqwcuY1Hh4GM5xN4Uk="},"tinymce/plugins/pagebreak/plugin.js":{"logical_path":"tinymce/plugins/pagebreak/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":1503,"digest":null},"tinymce/plugins/paste/plugin.js":{"logical_path":"tinymce/plugins/paste/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":22567,"digest":null,"integrity":"sha256-b0md3eoMg32NuUqFKYdyUpWfcji5FgudvWxCMYylmb4="},"tinymce/plugins/preview/plugin.js":{"logical_path":"tinymce/plugins/preview/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":1703,"digest":null},"tinymce/plugins/print/plugin.js":{"logical_path":"tinymce/plugins/print/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":809,"digest":null,"integrity":"sha256-Y43vqtp5QlHhpAx6WiGD/tZWzKQLPRhdivtL+G5UZ70="},"tinymce/plugins/quickbars/plugin.js":{"logical_path":"tinymce/plugins/quickbars/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":4908,"digest":null},"tinymce/plugins/save/plugin.js":{"logical_path":"tinymce/plugins/save/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":1592,"digest":null},"tinymce/plugins/searchreplace/plugin.js":{"logical_path":"tinymce/plugins/searchreplace/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":13265,"digest":null},"tinymce/plugins/spellchecker/plugin.js":{"logical_path":"tinymce/plugins/spellchecker/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":9787,"digest":null,"integrity":"sha256-vOzEs48MOt/kr4oHPdM6FfTpw8IL/kxJpGMRa+lwNBg="},"tinymce/plugins/tabfocus/plugin.js":{"logical_path":"tinymce/plugins/tabfocus/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":1859,"digest":null,"integrity":"sha256-vWcwoMf0XTa8srkLhWo6//2EIFhj6Hy7wUEeLf9acQQ="},"tinymce/plugins/table/plugin.js":{"logical_path":"tinymce/plugins/table/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":46758,"digest":null},"tinymce/plugins/template/plugin.js":{"logical_path":"tinymce/plugins/template/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":8063,"digest":null},"tinymce/plugins/textcolor/plugin.js":{"logical_path":"tinymce/plugins/textcolor/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":396,"digest":null,"integrity":"sha256-8DPtQxOFuybVpsU2iJsmNQHmddi29qSp1c6drk4pRgs="},"tinymce/plugins/textpattern/plugin.js":{"logical_path":"tinymce/plugins/textpattern/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":17614,"digest":null,"integrity":"sha256-f8gbbCTlliDKwWuy6b7KCfrFt1I3ZINcyHUJNzSrjho="},"tinymce/plugins/toc/plugin.js":{"logical_path":"tinymce/plugins/toc/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":3283,"digest":null,"integrity":"sha256-RJivU5OanQhkzMSyk7YTRVO/hTqD4bMgIo/DqsBL5SI="},"tinymce/plugins/visualblocks/plugin.js":{"logical_path":"tinymce/plugins/visualblocks/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":1230,"digest":null},"tinymce/plugins/visualchars/plugin.js":{"logical_path":"tinymce/plugins/visualchars/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":5172,"digest":null},"tinymce/plugins/wordcount/plugin.js":{"logical_path":"tinymce/plugins/wordcount/plugin.js","mtime":"2022-05-21T10:06:29+02:00","size":11913,"digest":null},"tinymce/skins/content/dark/content.css":{"logical_path":"tinymce/skins/content/dark/content.css","mtime":"2022-05-21T10:06:29+02:00","size":1216,"digest":null},"tinymce/skins/content/dark/content.min.css":{"logical_path":"tinymce/skins/content/dark/content.min.css","mtime":"2022-05-21T10:06:29+02:00","size":1216,"digest":null},"tinymce/skins/content/default/content.css":{"logical_path":"tinymce/skins/content/default/content.css","mtime":"2022-05-21T10:06:29+02:00","size":1149,"digest":null},"tinymce/skins/content/default/content.min.css":{"logical_path":"tinymce/skins/content/default/content.min.css","mtime":"2022-05-21T10:06:29+02:00","size":1149,"digest":null},"tinymce/skins/content/document/content.css":{"logical_path":"tinymce/skins/content/document/content.css","mtime":"2022-05-21T10:06:29+02:00","size":1248,"digest":null},"tinymce/skins/content/document/content.min.css":{"logical_path":"tinymce/skins/content/document/content.min.css","mtime":"2022-05-21T10:06:29+02:00","size":1248,"digest":null},"tinymce/skins/content/writer/content.css":{"logical_path":"tinymce/skins/content/writer/content.css","mtime":"2022-05-21T10:06:29+02:00","size":1170,"digest":null},"tinymce/skins/content/writer/content.min.css":{"logical_path":"tinymce/skins/content/writer/content.min.css","mtime":"2022-05-21T10:06:29+02:00","size":1170,"digest":null},"tinymce/skins/ui/oxide-dark/content.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.css","mtime":"2022-05-21T10:06:29+02:00","size":21341,"digest":null},"tinymce/skins/ui/oxide-dark/content.inline.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.css","mtime":"2022-05-21T10:06:29+02:00","size":21671,"digest":null},"tinymce/skins/ui/oxide-dark/content.inline.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.min.css","mtime":"2022-05-21T10:06:29+02:00","size":21671,"digest":null},"tinymce/skins/ui/oxide-dark/content.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.min.css","mtime":"2022-05-21T10:06:29+02:00","size":21341,"digest":null},"tinymce/skins/ui/oxide-dark/skin.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.css","mtime":"2022-05-21T10:06:29+02:00","size":61737,"digest":null},"tinymce/skins/ui/oxide-dark/skin.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.min.css","mtime":"2022-05-21T10:06:29+02:00","size":61737,"digest":null},"tinymce/skins/ui/oxide-dark/skin.mobile.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.css","mtime":"2022-04-11T11:07:13+02:00","size":20784,"digest":null,"integrity":"sha256-+bvlWAAYT8UCK7hH78X2kL4bwAJ/acL7D4PNnOrZKro="},"tinymce/skins/ui/oxide-dark/skin.mobile.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.min.css","mtime":"2022-04-11T11:07:13+02:00","size":20784,"digest":null,"integrity":"sha256-+bvlWAAYT8UCK7hH78X2kL4bwAJ/acL7D4PNnOrZKro="},"tinymce/skins/ui/oxide/content.css":{"logical_path":"tinymce/skins/ui/oxide/content.css","mtime":"2022-05-21T10:06:29+02:00","size":21730,"digest":null},"tinymce/skins/ui/oxide/content.inline.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.css","mtime":"2022-05-21T10:06:29+02:00","size":21671,"digest":null},"tinymce/skins/ui/oxide/content.inline.min.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.min.css","mtime":"2022-05-21T10:06:29+02:00","size":21671,"digest":null},"tinymce/skins/ui/oxide/content.min.css":{"logical_path":"tinymce/skins/ui/oxide/content.min.css","mtime":"2022-05-21T10:06:29+02:00","size":21730,"digest":null},"tinymce/skins/ui/oxide/skin.css":{"logical_path":"tinymce/skins/ui/oxide/skin.css","mtime":"2022-05-21T10:06:29+02:00","size":61662,"digest":null},"tinymce/skins/ui/oxide/skin.min.css":{"logical_path":"tinymce/skins/ui/oxide/skin.min.css","mtime":"2022-05-21T10:06:29+02:00","size":61662,"digest":null},"tinymce/skins/ui/oxide/skin.mobile.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.css","mtime":"2022-04-11T11:07:13+02:00","size":20784,"digest":null,"integrity":"sha256-+bvlWAAYT8UCK7hH78X2kL4bwAJ/acL7D4PNnOrZKro="},"tinymce/skins/ui/oxide/skin.mobile.min.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.min.css","mtime":"2022-04-11T11:07:13+02:00","size":20784,"digest":null,"integrity":"sha256-+bvlWAAYT8UCK7hH78X2kL4bwAJ/acL7D4PNnOrZKro="},"tinymce/themes/mobile/theme.js":{"logical_path":"tinymce/themes/mobile/theme.js","mtime":"2022-04-11T11:07:13+02:00","size":159749,"digest":null,"integrity":"sha256-Si0fOE/XrsoXRFoa0MlY9uxZSwoLwkd/B//KIMpBq+Q="},"tinymce/themes/silver/theme.js":{"logical_path":"tinymce/themes/silver/theme.js","mtime":"2022-05-21T10:06:29+02:00","size":344437,"digest":null},"tinymce/tinymce.js":{"logical_path":"tinymce/tinymce.js","mtime":"2022-05-21T10:06:29+02:00","size":390631,"digest":null},"tinymce/icons/default/icons.js":{"logical_path":"tinymce/icons/default/icons.js","mtime":"2022-05-21T10:06:29+02:00","size":63894,"digest":null},"tinymce/plugins/emoticons/js/emojiimages.js":{"logical_path":"tinymce/plugins/emoticons/js/emojiimages.js","mtime":"2022-05-21T10:06:29+02:00","size":416095,"digest":null},"tinymce/skins/ui/oxide-dark/skin.shadowdom.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.shadowdom.css","mtime":"2022-05-21T10:06:29+02:00","size":508,"digest":null},"tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css","mtime":"2022-05-21T10:06:29+02:00","size":508,"digest":null},"tinymce/skins/ui/oxide/skin.shadowdom.css":{"logical_path":"tinymce/skins/ui/oxide/skin.shadowdom.css","mtime":"2022-05-21T10:06:29+02:00","size":508,"digest":null},"tinymce/skins/ui/oxide/skin.shadowdom.min.css":{"logical_path":"tinymce/skins/ui/oxide/skin.shadowdom.min.css","mtime":"2022-05-21T10:06:29+02:00","size":508,"digest":null},"tinymce/langs/README.md":{"logical_path":"tinymce/langs/README.md","mtime":"2022-05-21T10:06:29+02:00","size":151,"digest":null},"tinymce/models/dom/model.js":{"logical_path":"tinymce/models/dom/model.js","mtime":"2022-05-21T10:06:29+02:00","size":95440,"digest":null},"tinymce/skins/content/tinymce-5/content.css":{"logical_path":"tinymce/skins/content/tinymce-5/content.css","mtime":"2022-05-21T10:06:29+02:00","size":1149,"digest":null},"tinymce/skins/content/tinymce-5/content.min.css":{"logical_path":"tinymce/skins/content/tinymce-5/content.min.css","mtime":"2022-05-21T10:06:29+02:00","size":1149,"digest":null},"tinymce/skins/content/tinymce-5-dark/content.css":{"logical_path":"tinymce/skins/content/tinymce-5-dark/content.css","mtime":"2022-05-21T10:06:29+02:00","size":1219,"digest":null},"tinymce/skins/content/tinymce-5-dark/content.min.css":{"logical_path":"tinymce/skins/content/tinymce-5-dark/content.min.css","mtime":"2022-05-21T10:06:29+02:00","size":1219,"digest":null},"tinymce/skins/ui/tinymce-5/content.css":{"logical_path":"tinymce/skins/ui/tinymce-5/content.css","mtime":"2022-05-21T10:06:29+02:00","size":21730,"digest":null},"tinymce/skins/ui/tinymce-5/content.inline.css":{"logical_path":"tinymce/skins/ui/tinymce-5/content.inline.css","mtime":"2022-05-21T10:06:29+02:00","size":21671,"digest":null},"tinymce/skins/ui/tinymce-5/content.inline.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5/content.inline.min.css","mtime":"2022-05-21T10:06:29+02:00","size":21671,"digest":null},"tinymce/skins/ui/tinymce-5/content.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5/content.min.css","mtime":"2022-05-21T10:06:29+02:00","size":21730,"digest":null},"tinymce/skins/ui/tinymce-5/skin.css":{"logical_path":"tinymce/skins/ui/tinymce-5/skin.css","mtime":"2022-05-21T10:06:29+02:00","size":63833,"digest":null},"tinymce/skins/ui/tinymce-5/skin.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5/skin.min.css","mtime":"2022-05-21T10:06:29+02:00","size":63833,"digest":null},"tinymce/skins/ui/tinymce-5/skin.shadowdom.css":{"logical_path":"tinymce/skins/ui/tinymce-5/skin.shadowdom.css","mtime":"2022-05-21T10:06:29+02:00","size":508,"digest":null},"tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css","mtime":"2022-05-21T10:06:29+02:00","size":508,"digest":null},"tinymce/skins/ui/tinymce-5-dark/content.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/content.css","mtime":"2022-05-21T10:06:29+02:00","size":21341,"digest":null},"tinymce/skins/ui/tinymce-5-dark/content.inline.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/content.inline.css","mtime":"2022-05-21T10:06:29+02:00","size":21671,"digest":null},"tinymce/skins/ui/tinymce-5-dark/content.inline.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/content.inline.min.css","mtime":"2022-05-21T10:06:29+02:00","size":21671,"digest":null},"tinymce/skins/ui/tinymce-5-dark/content.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/content.min.css","mtime":"2022-05-21T10:06:29+02:00","size":21341,"digest":null},"tinymce/skins/ui/tinymce-5-dark/skin.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/skin.css","mtime":"2022-05-21T10:06:29+02:00","size":63732,"digest":null},"tinymce/skins/ui/tinymce-5-dark/skin.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/skin.min.css","mtime":"2022-05-21T10:06:29+02:00","size":63732,"digest":null},"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css","mtime":"2022-05-21T10:06:29+02:00","size":508,"digest":null},"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css","mtime":"2022-05-21T10:06:29+02:00","size":508,"digest":null},"tinymce/tinymce.d.ts":{"logical_path":"tinymce/tinymce.d.ts","mtime":"2022-05-21T10:06:29+02:00","size":111412,"digest":null}},"assets":{"active_admin.js":"active_admin-f992ca5d9243601d31dad73c57a4aa5a2b9170b75890935419af02778b86c258.js","tinymce.js":"tinymce-0a65cd0b35e87db0a198eb30e4daa2085929a73d1ccba4d8c7531a2245443311.js","modernizr.js":"modernizr-79e0181ec91aff04bb01d87cba546535ede843f75d19f5c60f66b8dd6546971f.js","font-awesome/fa-brands-400.eot":"font-awesome/fa-brands-400-361037e19d0b6000027564e9edcad98c8a179be70c6c4e0a6ab54cd6d41685bd.eot","font-awesome/fa-regular-400.eot":"font-awesome/fa-regular-400-aa1ea349a5a1557fdd700fa5b27df5a01e3b49761201c4d5a95c442e4f7b72c7.eot","font-awesome/fa-solid-900.eot":"font-awesome/fa-solid-900-74883516ac6bb785f2d12d162d769fa7a8fabc7794ef44fc28ffc375b2d7c27c.eot","font-awesome/fa-brands-400.svg":"font-awesome/fa-brands-400-b077551ebb83f7299deaa16b45877ddd3eda20c4988ac79b6def416e7d2b6b3a.svg","font-awesome/fa-regular-400.svg":"font-awesome/fa-regular-400-00c96447c535a41055597d80db75302fc04fd1c909239eada694daa76cd77a20.svg","font-awesome/fa-solid-900.svg":"font-awesome/fa-solid-900-387bea778f72246fad5ea5b69f68cd059a942e3ab181eb2390ad089bc9cc5e06.svg","font-awesome/fa-brands-400.ttf":"font-awesome/fa-brands-400-d6e9a2e4cad853a5a88711678db47de7456f36b30923f8350f55c41434809ba8.ttf","font-awesome/fa-regular-400.ttf":"font-awesome/fa-regular-400-79a39b18a5524be800ab200fbedebf7f737a316f01b874fe42b005fda10a6f11.ttf","font-awesome/fa-solid-900.ttf":"font-awesome/fa-solid-900-a0cc38b88839387e4451bb1ebdd9ecd821b2df0f7fcd5b26df75630f4171ee32.ttf","font-awesome/fa-brands-400.woff":"font-awesome/fa-brands-400-8b2dc7ace7b22f70f42c11f1606d1ee82ad46445c2f05587928e239e567ff68e.woff","font-awesome/fa-regular-400.woff":"font-awesome/fa-regular-400-180eef6acca110a022bb81621c04937b3d2edf09fb7644daba7f95368e73b0bd.woff","font-awesome/fa-solid-900.woff":"font-awesome/fa-solid-900-195989f30d333ecf41e0021dbb92c690f367d2672c43199079d9be4b81dc90da.woff","font-awesome/fa-brands-400.woff2":"font-awesome/fa-brands-400-e624f952dec1ac1e2673205a87513cab83c4a0d187b08528a5ff0c36d9b1e090.woff2","font-awesome/fa-regular-400.woff2":"font-awesome/fa-regular-400-6919b47939790fc2ab662fd09b22907c53f32d9a817eed0782e2fb3e7af24b5b.woff2","font-awesome/fa-solid-900.woff2":"font-awesome/fa-solid-900-addc97d14257b43232b89194f73bd3b862007d5eedcb4569362b8f26356d8db3.woff2","active_admin/print.css":"active_admin/print-f6ce3ffc349ca6c010940202a36b916e852d26179018d2cdc1513350bea7dcba.css","active_admin.css":"active_admin-a10a0eb4af00bea304176f8955d734e073ab869cb08fae8f15db407996577f2c.css","manifest.js":"manifest-597b5199768f5efff6ec880a4180aec95099b04608cc46e56dfe4e0940ee4665.js","agendadescommuns.png":"agendadescommuns-04172a222503a300e6ccc24863ac39c7e17aab83d4fddd47fa233b2ba10150ce.png","alert.png":"alert-4401130d700faadafe42bf322264e2689dae9ded22c1186c38ad2699d28b9715.png","baby_gnu_adl.png":"baby_gnu_adl-16fb75eef2962c69ecbbe7c41bd49c38f9c59318aacbf18c8b8fefd41cc7be12.png","baby_gnu_adl.svg":"baby_gnu_adl-70951d780455e377aa0564b263a36704960870d645900005d18eb907ac4627cb.svg","communs.png":"communs-04172a222503a300e6ccc24863ac39c7e17aab83d4fddd47fa233b2ba10150ce.png","lef-small.png":"lef-small-5d6eb3183e342c1918feba6dcbefd7efbf9f8eb6058599a7a1d2252beb0369d0.png","lef.png":"lef-38da607e793696b80e684feb25a45fe9afcab6d8d105a6f6a098d5ccfc17cb41.png","linux-presentation-day.png":"linux-presentation-day-30da5011055ef1b832234bf8fa8777b60bda3fed09a3cf7ae36a507e1fb8f272.png","osm_logo.svg":"osm_logo-d4979005d8a03d67bbf051b4e7e6ef1b26c6a34a5cd1b65908e2947c360ca391.svg","priorite-logiciel-libre-je-soutiens-april_2_m.png":"priorite-logiciel-libre-je-soutiens-april_2_m-61a1cf930cdc5b1bd39dea68ef26aad7ea086d7baaf04f96b72ffaa5a7a68bdc.png","regions/CA-QC.png":"regions/CA-QC-8d0df3da21ac158626b9aba2827b07d708e9fd1e6277414ab0d01f9a31ee5099.png","team.png":"team-810a9268a50ca2d493299c8738aa15885a4fed1dd22101844b488b0071b6c44a.png","application.js":"application-14e1e96bfbd100fc952a731001b2d2e04189f0702d8a6ae050503030259dd668.js","application.css":"application-0ec4812f14f3da4405d5bea5a5aa18db9b4518953d17a2bf1198215db5a54b2b.css","flags/4x3/ad.svg":"flags/4x3/ad-04b4b65e6a104b102172258b3894a9a4e29890aa63e8edc4812033dd7387b77e.svg","flags/1x1/ad.svg":"flags/1x1/ad-847534ad5665b0bb24f766110a56922d9115cbd4c35746597e1fc5edb381b41a.svg","flags/4x3/ae.svg":"flags/4x3/ae-f6dd88c6cb3940f07ad1ee2635ec0f081d53885efea97c2f363f61c4f06129e8.svg","flags/1x1/ae.svg":"flags/1x1/ae-c5992978bbf00ada1971a746b819936eb2f73aefac7f10518995545c2ccf2c10.svg","flags/4x3/af.svg":"flags/4x3/af-745ad7e8ea956edf06641d01bf5a0374cfae6902846e62a30ed56ad80f889906.svg","flags/1x1/af.svg":"flags/1x1/af-50e587ac98a5af98e21994909aa1f9898add6842954e2ad6a709d857b39a8b55.svg","flags/4x3/ag.svg":"flags/4x3/ag-ec678db01740bd72757a7883a1dbea0c163e2b0a7a692cc8a0749c6f50428abb.svg","flags/1x1/ag.svg":"flags/1x1/ag-35c11ca3ad0581842f9c1eddc462690e6166f94a8dbb15e248398df93a276004.svg","flags/4x3/ai.svg":"flags/4x3/ai-d688814fa60d2294b79b6ffe3d2a64e55a0bc013718cbf028b5d5720e3041794.svg","flags/1x1/ai.svg":"flags/1x1/ai-850f5995f9b55ac8f30b35157cb1881d149e8257c168f39dbc8e51cae25c222d.svg","flags/4x3/al.svg":"flags/4x3/al-5631be891ba0ccdb1f2a9b3a934031ed681aaeb139acc9e3b414e2561a608495.svg","flags/1x1/al.svg":"flags/1x1/al-96787887d75cd3bd02e8eff8a75ba0856873167743205a5cbfc5439197e3070d.svg","flags/4x3/am.svg":"flags/4x3/am-fd6eb7b12b2bbd15d4e5db6949b57255849f5fecc62d9a48d848bab767f1123e.svg","flags/1x1/am.svg":"flags/1x1/am-85e618fb93d8a64fc145ce0ebfb0397e5468816476df4c43ff0419dfea72d53b.svg","flags/4x3/ao.svg":"flags/4x3/ao-09b6b18d13202b859e9e94b9a88e59701b7b2d00d88d8a749f7f0d3bb71c745c.svg","flags/1x1/ao.svg":"flags/1x1/ao-dd2f7930f4f4214707f7a311f16cae422471094601319a5b69abeb48d384855c.svg","flags/4x3/aq.svg":"flags/4x3/aq-2adcc4b28a1da2ac271675b5377a39f226fe06b135d287215c153957b2176da2.svg","flags/1x1/aq.svg":"flags/1x1/aq-8809bb8b30a063b921c866da0a83236d7dd8a17148ef4c0db3c53ccd0dc15e6f.svg","flags/4x3/ar.svg":"flags/4x3/ar-8208e0546b8e666d806ee3fc3061504a62bf6cdea5fa4385d54c3ba131e3135c.svg","flags/1x1/ar.svg":"flags/1x1/ar-2d821fddef311e29c74ce2b19bbc651a2d613aebbd88f59ad8fc6c3a81544d1b.svg","flags/4x3/as.svg":"flags/4x3/as-a7ce0712972b05287e9ddf7da0e19630d4b440f0ce59b3a50397bc29d162192e.svg","flags/1x1/as.svg":"flags/1x1/as-06505370c9bcfcad7b057757c3e892d12930db56565c0fd0bc86f4af5af5686f.svg","flags/4x3/at.svg":"flags/4x3/at-644b0cc2d91fe69f18d9992488a748efa0df7eb6ddc83ac79351ba9226956d25.svg","flags/1x1/at.svg":"flags/1x1/at-b36d3570a5102400e028dfa0b5204e9c2cd8d72b398e94bab5c51edd0954ce40.svg","flags/4x3/au.svg":"flags/4x3/au-887bb0cc0e77e15153e4c9006e785d5f68c77ca0ab9eb7f538e371a0e4f218af.svg","flags/1x1/au.svg":"flags/1x1/au-ba82260247c564d9f4735fa2eeca092ac9b5d4e32c6a6a8db1d4177b746516a5.svg","flags/4x3/aw.svg":"flags/4x3/aw-ea7eeaeec20598c43c59a2536b150a7fb5e7f6443a5bfb7e1bd72aa7186be8e1.svg","flags/1x1/aw.svg":"flags/1x1/aw-c39c9c3d5de9ece42a7e717ac3670886532dd75d50a34e1b3ae10e39487679fb.svg","flags/4x3/ax.svg":"flags/4x3/ax-4825f85b2d4669c70f360bd63f1e36215d16bace4700dffc61992911de53198a.svg","flags/1x1/ax.svg":"flags/1x1/ax-ce68def4e721fcb48feb3b2aee81ad4ba7e75642ace96f24c059ee82b906c35b.svg","flags/4x3/az.svg":"flags/4x3/az-9e3354b743219dbaf19cc54a63e1a8ed41d1f41485455330775b3b5c6dd6c9fe.svg","flags/1x1/az.svg":"flags/1x1/az-4e93f9eef0ef96515e8c152c87d4a278d725ecb20108257105c9ccd48a156ddb.svg","flags/4x3/ba.svg":"flags/4x3/ba-7e420cae1feb7be337a34f25fb8fd6421295cde2e03273efa7e880d7d5d9281e.svg","flags/1x1/ba.svg":"flags/1x1/ba-2e20ab2d7c91e67460cc9a910016a7706b0d7e5865895cce6b835b4f557cc861.svg","flags/4x3/bb.svg":"flags/4x3/bb-35373b19bd542d0382d79bbd162be7583932adbb180c8b6223614a52c31fb1a0.svg","flags/1x1/bb.svg":"flags/1x1/bb-f5d71a0072d6dbc25a4264c4ab0d997b785550f8e6581230c22bb30fec7c9841.svg","flags/4x3/bd.svg":"flags/4x3/bd-0531b5c730836d8ecfb4b9b79aad2e560dfc53a30e65f2a4030d2f275827f5ae.svg","flags/1x1/bd.svg":"flags/1x1/bd-c35883811cce9a21ef91202da7fc4648cc62b9ffee53a5ad0a88b179494e95fc.svg","flags/4x3/be.svg":"flags/4x3/be-ac7f9445060d07698cf4c4b5126b13397e12949102326caa3179eb98d4a90974.svg","flags/1x1/be.svg":"flags/1x1/be-61e1bb398ed6bf0253a21f9e32feb26395cf5aec5dc05640235d4accf43c2ee1.svg","flags/4x3/bf.svg":"flags/4x3/bf-4f19b8dfd521393da6d1f2ca95cc79d22d558c34c3d74b2718417d9df29726f3.svg","flags/1x1/bf.svg":"flags/1x1/bf-7b037b76d1915df2f978852ebc0b88e6fa9abf8d579ed85e360d081b8f95e09c.svg","flags/4x3/bg.svg":"flags/4x3/bg-1433c1cd05916af99e2db72a9e2c6d7532013a619770b66b51595fcd349cbaa6.svg","flags/1x1/bg.svg":"flags/1x1/bg-d631585f0e0981298746582b913765429bbcdd2349cc6062b8e9e790be5f31f0.svg","flags/4x3/bh.svg":"flags/4x3/bh-d677a52979c37517212e9b9b6697541a366b0104e09808d396a6d02411a983f5.svg","flags/1x1/bh.svg":"flags/1x1/bh-d408321e7282b8ee67413917d3063536197d8ceeb23abc05677d748ebb8a6378.svg","flags/4x3/bi.svg":"flags/4x3/bi-6323bc95384cf7a6ea6c91332c3054e55152b391e8f823828df3d05a3e40854a.svg","flags/1x1/bi.svg":"flags/1x1/bi-e79238de5c139c78aeb157e1b7d5646a79dc5e154f35ad49aeae21321c0a8d78.svg","flags/4x3/bj.svg":"flags/4x3/bj-951d79103aea5585768fa178923f6127f918fc01d02556174dff9f8506cf90ea.svg","flags/1x1/bj.svg":"flags/1x1/bj-7f5cc7510ece68a729788fcfbebd91dd941e0014ba3187b66bcd3da245c78460.svg","flags/4x3/bl.svg":"flags/4x3/bl-cc250a31e29ac0fe10c9e79a35920b280f6ec2731b9d5f701b2313bee631e114.svg","flags/1x1/bl.svg":"flags/1x1/bl-cfb5dd954f586d0662e09cdcbd338da8e225d481896414688262e2bd14c38c8a.svg","flags/4x3/bm.svg":"flags/4x3/bm-1e95c5f49d3f1f4a7049a82cdcd6ae326e4c37effd2249df9f7df423942b7396.svg","flags/1x1/bm.svg":"flags/1x1/bm-e0b05c8af03f5fe3728e191b24bedb2ac2429b86abfba4fa14b7d48960883d9c.svg","flags/4x3/bn.svg":"flags/4x3/bn-2e92465bcaef939fcf20029aedac6af2262eb4ee25e36d64bcf98d03976bbbe9.svg","flags/1x1/bn.svg":"flags/1x1/bn-6a56361917ec344da75ebb87a3713a2eaaf4605d84b1f1e3db1a8df6685bfb3f.svg","flags/4x3/bo.svg":"flags/4x3/bo-4c581c015880880d328153d007fc2517a7e0b53126c1a3a676e4abbb19e4c7fb.svg","flags/1x1/bo.svg":"flags/1x1/bo-ec135db8db19ecafc614799d5e9e459cc5d8e9d91308f7d4511f3b95f8ee1054.svg","flags/4x3/bq.svg":"flags/4x3/bq-973b8d977bde843039e96a9229d803fcbb1c29ba92272b8bc3223b28b8ccc803.svg","flags/1x1/bq.svg":"flags/1x1/bq-78c259288833d36f4d2209a4a95ca18cd3c18820f79f49b278bf7960cf5b34e7.svg","flags/4x3/br.svg":"flags/4x3/br-68ee8e029f99c31821e646aec1c8e9e8f8b1aaf26d72909ac75ff38c1f8e9201.svg","flags/1x1/br.svg":"flags/1x1/br-746af5283e4e792a1a7f94d934cac1e45c94470c4ffd37df5d1ab10bec2fd4db.svg","flags/4x3/bs.svg":"flags/4x3/bs-7b507794ee3f8d7e6b0c5739552e37cd2ab0596fab63a03f20fde4249cbf18d2.svg","flags/1x1/bs.svg":"flags/1x1/bs-277f44ad225c320c1a44610721f5b3a457d7e3d649593b598d59e2ce5164f727.svg","flags/4x3/bt.svg":"flags/4x3/bt-2f99024e1cec950a6bce184bc2d8a27629efdab8178a28bad798881ac3167710.svg","flags/1x1/bt.svg":"flags/1x1/bt-77d4f8b9a2c3dadacce904304c524b507e2a0d4109cf6506aa8cc1c131c359ad.svg","flags/4x3/bv.svg":"flags/4x3/bv-de8bb212ed5afdf6d557928d784ed98d2e2baa7aaaf2ced7abc5cf13fa540423.svg","flags/1x1/bv.svg":"flags/1x1/bv-4e4ae03e0878a6e689a0a2ebfe2b1b10fe58329a86acd73ee41f1a9c569f2cb3.svg","flags/4x3/bw.svg":"flags/4x3/bw-76559252bbe0a305e9228103c5c34c39271a9d0b69f8f2b0dfbea5e18d7b37de.svg","flags/1x1/bw.svg":"flags/1x1/bw-3797276ece0055f7c569dc013b59174f613e956c714b5674c90e911615f61318.svg","flags/4x3/by.svg":"flags/4x3/by-7865b19bb46d15f8004699022907d7c8d07193121dac101a3724b7ca578ee3ba.svg","flags/1x1/by.svg":"flags/1x1/by-7bd37ee878e4225470de8cc284d66cf70785a0329da88b43e5f93e25c047b738.svg","flags/4x3/bz.svg":"flags/4x3/bz-c8dfd550816ef86ff0fb82f9b31ca2467fcf50a7ba53e6163fe2bb01cccab0d5.svg","flags/1x1/bz.svg":"flags/1x1/bz-07baa0c080ae0dec236c42810db344f5b6e4209fe16bc9644cf998108b56b85c.svg","flags/4x3/ca.svg":"flags/4x3/ca-f9229a913dece446e34e6de7245dfd3adbea059934b5beaed45654cef2f1cb1d.svg","flags/1x1/ca.svg":"flags/1x1/ca-47f58efb8689efb510291bb7b7a354c3e434e983914f0cc382e763ecccfa7a6e.svg","flags/4x3/cc.svg":"flags/4x3/cc-acf43807923322e2e43deef84443007b75d0d21ebb8a85d0d4e2837e998798c8.svg","flags/1x1/cc.svg":"flags/1x1/cc-827355b0b5c0a98cd0b479c7914c62d1de7712c643978941a97741c13ee69891.svg","flags/4x3/cd.svg":"flags/4x3/cd-594addda580762e53242cc9e5a3885cc200d6b92c9453b65242c0038e4e22959.svg","flags/1x1/cd.svg":"flags/1x1/cd-6f390c3dac0d0d278ea6593bb615e3e23a94f7e84cc40b917e47bdce520a3a2b.svg","flags/4x3/cf.svg":"flags/4x3/cf-31a4f1c7e55d90551235336b339544920b01a8a4fb27efd5b18d0a68ea908f0e.svg","flags/1x1/cf.svg":"flags/1x1/cf-820b63e306c3eec593028576d9ea830f24526b8e4c8a51cec04f4a1851f1f781.svg","flags/4x3/cg.svg":"flags/4x3/cg-cb3b4a7be309eae587becb687690e332624b75d8a40481abd13a4d8a3c685a87.svg","flags/1x1/cg.svg":"flags/1x1/cg-3b7d163f2951bc21e895dbead028c79b8f97dc4a95f9d9ca76d78b398025a20b.svg","flags/4x3/ch.svg":"flags/4x3/ch-d32cf51d10ea8174a3e8725e620c5bd13511a6a6c676d3c807e6ad82017f6178.svg","flags/1x1/ch.svg":"flags/1x1/ch-ff30c29ed89a29db4cae89e8f4915e573c75dd7ad377e5ac7987c956fb68a141.svg","flags/4x3/ci.svg":"flags/4x3/ci-70e248e97c577c3ab3a85a8a76e5f20ef0bfd2c2a3c190746e625fa37edbbec9.svg","flags/1x1/ci.svg":"flags/1x1/ci-fb50e5c5558e915f5cd4060bd75d63e43ed4a2af1cf77caf1d184d8e5b3c888b.svg","flags/4x3/ck.svg":"flags/4x3/ck-a86d1e54e265e2de5155595e838ec7c3db3ca23f563336885d7c5d17888c4709.svg","flags/1x1/ck.svg":"flags/1x1/ck-a0d6f5ca82965ef1838549666bef9735b619c40bcf791850f092486b1fa3831d.svg","flags/4x3/cl.svg":"flags/4x3/cl-0bec6c3cc4d36bbf245a3be22c10b8ff9c25996bb372a916e365e3274e62ccfb.svg","flags/1x1/cl.svg":"flags/1x1/cl-8dc4289cd2cba6ac3f07519957f3cbd582f59e1153d655871a507bc0559fc93f.svg","flags/4x3/cm.svg":"flags/4x3/cm-8832f17145686399c412437f6762b4de6afb48fcc409590b7b09e593fe3b08d5.svg","flags/1x1/cm.svg":"flags/1x1/cm-4ba39a0a5fe36564e132e7a4d0f881ca10e95b0824157253a9180b2fe0089553.svg","flags/4x3/cn.svg":"flags/4x3/cn-865ae68cc9042422bae55dba123af75dfab352069aa15121385a739c57caf1aa.svg","flags/1x1/cn.svg":"flags/1x1/cn-cdf756a16521136b99d38c241ee5df601912f290c6bafd45f7a5f73f916ed8ed.svg","flags/4x3/co.svg":"flags/4x3/co-48603194a139754c8c7908f4d0c8181ca6729a221de897e8e5d26c9a3f211b1d.svg","flags/1x1/co.svg":"flags/1x1/co-0be1e3cef708f4f0f979a3c36bdcb4046a45693846dc9b9e5be2ea5f1c536667.svg","flags/4x3/cr.svg":"flags/4x3/cr-127b7f2e0f6ebe8c62885fd78f6a3dc167624e8e7b5fac79d4b8f3054b798a92.svg","flags/1x1/cr.svg":"flags/1x1/cr-80711b24354b0eedd247bbd77352db3bc9ad586c31d0a8727a4400368e56b2c4.svg","flags/4x3/cu.svg":"flags/4x3/cu-c72751747322de6b51b1dd462d04d0b533fa1e1c68f51b3c90d19ec683c2af3a.svg","flags/1x1/cu.svg":"flags/1x1/cu-ec5f9adfe3639f609ebf60d933d6500a0a9a5d77f9c8d5ec6a2f0d0ec2efd5a4.svg","flags/4x3/cv.svg":"flags/4x3/cv-029b4bd4d5c58ee3479b9a5fd3700923efa4881282225ac47690a3955472b7f1.svg","flags/1x1/cv.svg":"flags/1x1/cv-750969622373a36a416fc64118f1cb5407764d508f99b7db720f2ab474b93ebf.svg","flags/4x3/cw.svg":"flags/4x3/cw-f3c7dc011a64c13ebab21e47baaea3e0fea8d83f83fd8cc1845630a5f78ce087.svg","flags/1x1/cw.svg":"flags/1x1/cw-48a78eb5e8abd98b90ae7b373746bbd58851c76eb305ca0e7d8081df9180f248.svg","flags/4x3/cx.svg":"flags/4x3/cx-9033ee142f06aac6b700968943103e6dba8ce3171b17f7f7d54f26c35387c022.svg","flags/1x1/cx.svg":"flags/1x1/cx-f8356811ad67ac25c4a8c22bba7468615f8a0bcb09e4d8da09ad3806febc7d1b.svg","flags/4x3/cy.svg":"flags/4x3/cy-86c9999efa3399db043be615d16558ec0e40feafe9325fe1b6422ff0e089a60c.svg","flags/1x1/cy.svg":"flags/1x1/cy-67835af18d83749f0ac63e160db340d7a83b2e189e5e5b715b49c4b922fbb4ff.svg","flags/4x3/cz.svg":"flags/4x3/cz-e8f891c91f0889f53815958ed9c0d0472c03ecf58c5b8d3d87a864ede0e57ce0.svg","flags/1x1/cz.svg":"flags/1x1/cz-de11cacecaee1ed952a170fa43d318b01507ae9c8b0ab16b96f53848676326c7.svg","flags/4x3/de.svg":"flags/4x3/de-dcf5931120e541ce9e83e97c37cf95eeac9a152cd5e5ed9e0bf58116943d7250.svg","flags/1x1/de.svg":"flags/1x1/de-3479e75f866450220db28ef3ebb1ba0c345c059ed67de62c4176a09572da8f32.svg","flags/4x3/dj.svg":"flags/4x3/dj-e69892f8499ec8d780cdd20b051f936d5471eb92efd519b93be9d10f31382c77.svg","flags/1x1/dj.svg":"flags/1x1/dj-49721ea1deeb6e17f32ee2b3617d27961ad256505849243843f0fd5697332b18.svg","flags/4x3/dk.svg":"flags/4x3/dk-d50cdf2f88be249eb116da08c38cf119d44246ab4f5d62a94feefd37da149019.svg","flags/1x1/dk.svg":"flags/1x1/dk-24ccaa605d1f01e33802197d416654b64fac3f3d28ba90b5f6094c17dfe95344.svg","flags/4x3/dm.svg":"flags/4x3/dm-24faadaf18d5651beccc45688ef3421d2d083b5f2e92cab50c414e487a899095.svg","flags/1x1/dm.svg":"flags/1x1/dm-4f6888ba822d1592b9751c198ae6aafd1c14630be57d7e3b4372e3df8eb4f201.svg","flags/4x3/do.svg":"flags/4x3/do-43538ca280e65a4eb8b38992290cda974a7f631ae18f3e6864dc6f61397ab514.svg","flags/1x1/do.svg":"flags/1x1/do-1164fc19d2a5f2299e84d59627b780ff9dcba335acaa19a4acacd4781d916b78.svg","flags/4x3/dz.svg":"flags/4x3/dz-1b56086fc67c067d339838fc63e8f98faea641560b14839260546c895bdf4768.svg","flags/1x1/dz.svg":"flags/1x1/dz-b9527d30bdb9d67fba87351df4d4340fcc1c0dce368f0371359e5fcf7d445f3b.svg","flags/4x3/ec.svg":"flags/4x3/ec-d6df0532653f0a2a3ccdee80854ad75c4a4fe4a360fc5d5c73865253ebfc6b7f.svg","flags/1x1/ec.svg":"flags/1x1/ec-a1a0b637c3d12b488cd180746ea10e42e659907c99c0b3d9eec65415494b5321.svg","flags/4x3/ee.svg":"flags/4x3/ee-2e52e01e34f175e856e120e57184ce61eccb5bff94633d3f2effcfed765f610b.svg","flags/1x1/ee.svg":"flags/1x1/ee-1058c4a95d48696c8c99608a104e756d4ac5c431a7a1f60e179769416c443420.svg","flags/4x3/eg.svg":"flags/4x3/eg-2b5a88cf9ab7a59447e6a3e3cc12d350c573719d2a90810d50ed7695a1591d30.svg","flags/1x1/eg.svg":"flags/1x1/eg-ded55c3561ee2003ede5cc35af88959adb2398badc3c63dcc40e320d5bdb6c97.svg","flags/4x3/eh.svg":"flags/4x3/eh-250c6f7e1db483fb08f682d4917c06741614edb0a093aa80c0fe57f9bff03eba.svg","flags/1x1/eh.svg":"flags/1x1/eh-ae52d9c4377873ea1db474ef820d87e956753992097bbce93118c836f27c5598.svg","flags/4x3/er.svg":"flags/4x3/er-13b1d5072a285b78863f33088676ff459fc9049e403c4427d0bf149ab8a65eac.svg","flags/1x1/er.svg":"flags/1x1/er-516d763b5c3ddf087968e8e2ce10eb9f6a162e98b1c586ae90f7ebc2a9e877e6.svg","flags/4x3/es.svg":"flags/4x3/es-85290c103c538de1b8629c7a609319f01fc5a63a24655946e6003740d30f1534.svg","flags/1x1/es.svg":"flags/1x1/es-582d90241cc77269d8eeaa709ee9345c4e3935b7c20f9d3f04d707800c554896.svg","flags/4x3/et.svg":"flags/4x3/et-818e867ed44592f1c476d5abd8d9e5b60bb1e485f01076a633f5304fee7990d4.svg","flags/1x1/et.svg":"flags/1x1/et-7e2476975a4837f67af86aa6556d382dfd6769922a47ee9a49ef81a540c0f3b7.svg","flags/4x3/fi.svg":"flags/4x3/fi-262396615a680200f7709a9a998a1f346db6de48844bb0a76d8c41d0d8dfb466.svg","flags/1x1/fi.svg":"flags/1x1/fi-cdfc9cc3908d4f0d534fb34853fda8db5981195204ab6219bad3aa3cf90ecfa6.svg","flags/4x3/fj.svg":"flags/4x3/fj-fd0cc7fe3c27f0c999ce61d40b0143ca536d9d39875c524bb20afe5ccd55e40c.svg","flags/1x1/fj.svg":"flags/1x1/fj-930160f9247a73774021c9d019dfedc21ed09934db523690ca76f0a7e1a2d9d1.svg","flags/4x3/fk.svg":"flags/4x3/fk-5d5fdf224c1455f03c84d85f587463d8c511ff86dd5592f216a7470989175e42.svg","flags/1x1/fk.svg":"flags/1x1/fk-b614bdecd7ba844a5885a5acfb6b658bf649dd72d095844abdd4cf14860685c4.svg","flags/4x3/fm.svg":"flags/4x3/fm-6e665d3e05ae726fee0ced73ae84ce1d0596e80cb3dafce78d0c56dbc3018584.svg","flags/1x1/fm.svg":"flags/1x1/fm-c59efd1b95788946440a90610eac4f3222be5fbfb5748c076eabd0d4b6b8613e.svg","flags/4x3/fo.svg":"flags/4x3/fo-e2bcddb90777676679c7d680f18bcace56143f3a6bb0618ce59e4bf863b9e58e.svg","flags/1x1/fo.svg":"flags/1x1/fo-c9e403639ac04f28b0c86fc370ac5a106213f2ecf2ffc291cb9cd0ec2c000d8b.svg","flags/4x3/fr.svg":"flags/4x3/fr-14bbb212b68a54751cbf4354dc9ca16bf4fd671fba4bfd0e77fb855fc55ce884.svg","flags/1x1/fr.svg":"flags/1x1/fr-8b9d16b144204ecd34289bf1f0e06e57ad03a889a3813463de8e1a25005da5ec.svg","flags/4x3/ga.svg":"flags/4x3/ga-ae7daae3629bfa925e336323a198a018ae2007a1ea2ab9ba32d4b110e0abc7d4.svg","flags/1x1/ga.svg":"flags/1x1/ga-1a903d6903087e08d16b56a27741cd1ea2c0685fbd325e9c4cef45d7fb00ccc3.svg","flags/4x3/gb.svg":"flags/4x3/gb-14e43b4df91315b33ed5f8ad46d9e84f43f84be11c65148bca043808832cab95.svg","flags/1x1/gb.svg":"flags/1x1/gb-81ec47f82b87b9398d17f1db841ea31695a24fa3e05c60fa4d59b21ae4d5bed2.svg","flags/4x3/gd.svg":"flags/4x3/gd-9a09ce17c1792c8860223020288f72ed168afebcafdc9fa8c46a7b7b1513c28a.svg","flags/1x1/gd.svg":"flags/1x1/gd-1678beac8104635c4360593bbba3e3e4b84467d8997ed538137b5a68740ba1b9.svg","flags/4x3/ge.svg":"flags/4x3/ge-0ed0a003c1e169ed60bdd889c8c841b0a7931aa3e809ca4d8e5da522385f35c9.svg","flags/1x1/ge.svg":"flags/1x1/ge-d90251ffc959309587136e12331f57a2db6b284a892ba1fee03927383208a760.svg","flags/4x3/gf.svg":"flags/4x3/gf-d4b632e9a932eff7d4e32338d13724f58332eeb445cfa9351a052b77cd688d3d.svg","flags/1x1/gf.svg":"flags/1x1/gf-be726fca00f77b50eec1525f3889ebf6de7f8f46e28cb63f0cbbe026cdaf564b.svg","flags/4x3/gg.svg":"flags/4x3/gg-ea89231f0fa42d543d008b4f2fe8a94fc253a1808b8b8f6ab49f4bd9553c498e.svg","flags/1x1/gg.svg":"flags/1x1/gg-ebfebaf3102bbdfecee844b24f59ef79c78d3b573203d8058e363847b33531a0.svg","flags/4x3/gh.svg":"flags/4x3/gh-90efce1b22e18fbd77cb6f13e9f72ecea1338e3fd090b3817171eb3e24ba2516.svg","flags/1x1/gh.svg":"flags/1x1/gh-e9286720b91098135c65f7ad83d9a796efed89e27a052aac78af57e82d003859.svg","flags/4x3/gi.svg":"flags/4x3/gi-03f50f9d9b262fdf822d325c5325b374661821d6fae41e20de42bc761e56df52.svg","flags/1x1/gi.svg":"flags/1x1/gi-94700c7efeae285ce37ad883ca906c4ee65a99ede614b40eacb88d64873abb96.svg","flags/4x3/gl.svg":"flags/4x3/gl-3b1f2b9c26c35f87fcb4b417fff6ad3d2aada484d734382440c338d4c7dcbd00.svg","flags/1x1/gl.svg":"flags/1x1/gl-e468d30f57d5159f92aa487c8d16f9395671e64e4dcd74ec71b40bfa96259df4.svg","flags/4x3/gm.svg":"flags/4x3/gm-8a5011e0a99457e6dfeb53b55a90875f2d9a802fe8fec13f570de6f2a27b8639.svg","flags/1x1/gm.svg":"flags/1x1/gm-4200b76a4dbfbd9de052de9de778ae19d659a1d75d669757885580ef286497ec.svg","flags/4x3/gn.svg":"flags/4x3/gn-e990df30eba87d7036bbf6a47b64d0a6360d82fba6b5bba812e148648e56ea47.svg","flags/1x1/gn.svg":"flags/1x1/gn-4f9823b9e177c0604f8cbc1b2412ac9c39b4ffc3eda66311e787a6d9a640ebf7.svg","flags/4x3/gp.svg":"flags/4x3/gp-024ddd0e63a5e22c9d9f73a84b8306f2176083081825a065d99646ee123dc242.svg","flags/1x1/gp.svg":"flags/1x1/gp-00fab4fc916f5f267afd8e100a52098ba4aa6761cba1ecde56d506e85bd12025.svg","flags/4x3/gq.svg":"flags/4x3/gq-4e5c5e90e99f9dd14a43b597b6d370c8691ee73e8c75a8184e4a8390ff3e2bb0.svg","flags/1x1/gq.svg":"flags/1x1/gq-0e6d55dbcfe1e727dbe9c00ac2988407c196e5c0a20a0f71f752788649ec83c0.svg","flags/4x3/gr.svg":"flags/4x3/gr-db2138fa7bb0c95282ec0ecae3b5bd6ff2b3a06e2f27c1434b5b2285d422a6e0.svg","flags/1x1/gr.svg":"flags/1x1/gr-40c78a60595b2a3f485040d93505c0128de81b60f44e18e35ce0ca9d5a95f184.svg","flags/4x3/gs.svg":"flags/4x3/gs-bf3e078414a68dcd77d82694f5411f67c1eb5a1503f427c8dbcace16238e359a.svg","flags/1x1/gs.svg":"flags/1x1/gs-0130b60737c3873dd1868c70f7c3018fc276d152a398c2ce727edddb46f32513.svg","flags/4x3/gt.svg":"flags/4x3/gt-1b63340464e9dd3363a631f74db87defe40bfc520ba41002bf094f154b579934.svg","flags/1x1/gt.svg":"flags/1x1/gt-7cd5c99c47d16d4fc914979ffd7b95d87247d4c6652e07562a71a323f7145d58.svg","flags/4x3/gu.svg":"flags/4x3/gu-4018f5c92a9dd473d226f09136e956de2570729e80d704e8cc4e8f3ca2bdc871.svg","flags/1x1/gu.svg":"flags/1x1/gu-bb95d4d48c1e20be2b15258d9b895f38e9df1c54b65d4ed4aab1b323576f3899.svg","flags/4x3/gw.svg":"flags/4x3/gw-0ea266c02a02d578e96bb5335244c83c2815f28ebd34ff7ab8408b16416dd88e.svg","flags/1x1/gw.svg":"flags/1x1/gw-bd83c376f118c350751de000e2a48f97772438555dc1a70a7beb15cc4caee5c7.svg","flags/4x3/gy.svg":"flags/4x3/gy-441a978efab1565daf964e822a75b8658f5879af41371b0b52e468e00eb6b095.svg","flags/1x1/gy.svg":"flags/1x1/gy-d84ae82776b7142e4d9d51b1bdce601560275833b8d249e8e3d74bd3752b5aaa.svg","flags/4x3/hk.svg":"flags/4x3/hk-e5350bb4c4d63e98d802b3190247b2ce459d2695756ec62d64a995c43c4edd1e.svg","flags/1x1/hk.svg":"flags/1x1/hk-082835aaf3d1d61e1dd0e3b2b86231ef11b20150f98898af2e352b87c910f7da.svg","flags/4x3/hm.svg":"flags/4x3/hm-1048d79fd546482c290e1a0e4c2f9ce053aa3821f17bf12487a4f3e0ac7477d4.svg","flags/1x1/hm.svg":"flags/1x1/hm-af2df9fe67b48ead95d7ebe32d0a28a16c0d2fb03af909ca99e3b7d3cbe1a4a3.svg","flags/4x3/hn.svg":"flags/4x3/hn-d0e2cededb00e5dc79c75ab95e8f93d1851844c0924e49b59a8b78f6b35a7cfb.svg","flags/1x1/hn.svg":"flags/1x1/hn-45eebaaac195fd50e374926f9876eb5456a8cbcc2fb30e6a19229c409c51520b.svg","flags/4x3/hr.svg":"flags/4x3/hr-e10c8456ac0fc1946d1cb1f15e73484d03e4442368d78b230b050cadb7730b04.svg","flags/1x1/hr.svg":"flags/1x1/hr-8a4ca8ec8de4fc911306e198e66086fbbbf33891c8fa3e860af482f8ac2ddb44.svg","flags/4x3/ht.svg":"flags/4x3/ht-f862a9bb3b96630fc26a6fd2200b77c985b90a87ff9c52c42c3d7f42a0198b04.svg","flags/1x1/ht.svg":"flags/1x1/ht-1a12f16c45567e7b4fc2737b630345f7c7d0ac79ff31c41bc23920d0effd9adb.svg","flags/4x3/hu.svg":"flags/4x3/hu-a555e216b05645110da533dd2a5225021f70d7438e456877e77dc4522c261e41.svg","flags/1x1/hu.svg":"flags/1x1/hu-70b6438afdbc91f98b5ebfd0cafa40b6d5b0266f8d0df56cf3bcc7f777bd54c4.svg","flags/4x3/id.svg":"flags/4x3/id-3b48b1012b8beab850a28e27d785e92afee830444749c814a32419b8fce5dec1.svg","flags/1x1/id.svg":"flags/1x1/id-7d8348730949413fc7ff2587be342ff90c9ee1734d2ccdbca637a55839a894af.svg","flags/4x3/ie.svg":"flags/4x3/ie-8758528ee7852e7ded3f03fb7bc96ef9c502b1321c3011e9aade28702c68e235.svg","flags/1x1/ie.svg":"flags/1x1/ie-1cf70c38a49b5ec8c5ec6aace1dd0f1e1ac1663b8a5339ca3a98dc7bc4978702.svg","flags/4x3/il.svg":"flags/4x3/il-028f767bebb716e7a2e7198bfd03e698a7f19cad00385b30014a27680c101710.svg","flags/1x1/il.svg":"flags/1x1/il-395ee62ffbff4ab2ae456281a90f441e1148c0143a237f8a0e540e31d55518d5.svg","flags/4x3/im.svg":"flags/4x3/im-7dbb2dd66eda428c32edbbf2275f709df06cb1270dd69c65e214874966c30d69.svg","flags/1x1/im.svg":"flags/1x1/im-ed578fcc5e398ffdbc7a62d31b568a76b91e14ffa0afb794f3587aee8d248d67.svg","flags/4x3/in.svg":"flags/4x3/in-63b359940156312c6ed31c2b61f005c2bc386823401773aac9aaa328d994f7bc.svg","flags/1x1/in.svg":"flags/1x1/in-3fd1bedfc697bfe677a9774d7a6f51d04115cce400b4d7a892ecf1f69526790f.svg","flags/4x3/io.svg":"flags/4x3/io-67be58cb5bf7afe6099ec339235ec7ba0da153a50c651e28d4c32b2e6aa64cbc.svg","flags/1x1/io.svg":"flags/1x1/io-aa0702e0280d98693b3fb6350b45a7903ca25782082d3f1cee75f33f1a4d739d.svg","flags/4x3/iq.svg":"flags/4x3/iq-51acd0adc48bf1cb7256aba82069573f84db0baaf49b968f7f06afe140555f7a.svg","flags/1x1/iq.svg":"flags/1x1/iq-0ec8238d4e53fd7ec06ceda47e1378ee68042666f1f7f1a91753595a2167366e.svg","flags/4x3/ir.svg":"flags/4x3/ir-0d6f2bd5403ac2c3f7dfd49e3c5124817575c00b5167ef4c03cbfb63cfc10a26.svg","flags/1x1/ir.svg":"flags/1x1/ir-123d34118d6933f90a6b1191e2605c8344850c39f72644b9d91e15bfa640b623.svg","flags/4x3/is.svg":"flags/4x3/is-21543ffd547f651c7628bfe97d3c3626ea5e6999848de64efddee4656c27177b.svg","flags/1x1/is.svg":"flags/1x1/is-d73fc857d6844a1cdab62f81ba30a1ea895557d8d8fa4eecf7fa4b9127bc0123.svg","flags/4x3/it.svg":"flags/4x3/it-8b46e4a9676eb92cd507acef1d7c62115e6acc4b85e58a0806a0721ac34735f6.svg","flags/1x1/it.svg":"flags/1x1/it-2767e5c7250ec17539972ef710a8cebde73971bf0b9b3186d5baffb02f66974e.svg","flags/4x3/je.svg":"flags/4x3/je-35111082a6e24dccbd512743a37ebec13094ffbed5fef2b0793037433821a7ce.svg","flags/1x1/je.svg":"flags/1x1/je-87c6120456d517be72bdf28fd125176a743006be1cbe47ff5f59d54d1bf1253e.svg","flags/4x3/jm.svg":"flags/4x3/jm-eb05254eb1abb6d7fcd764284581224857c980d7bad9d7e9afff3dfff49d1e73.svg","flags/1x1/jm.svg":"flags/1x1/jm-0af380d25aef6a7de4c545a85ea3f76d3b08e56c000980c08a681ada232ba49d.svg","flags/4x3/jo.svg":"flags/4x3/jo-193203037e596abc063a9c30d0dd3aaa9c908557a1b57bcbcb94e1a1e8bb2402.svg","flags/1x1/jo.svg":"flags/1x1/jo-2b9c3f54d7e98c848cc0bd764bcd5ac2320d4f13aee8a84a207e7d0490c03516.svg","flags/4x3/jp.svg":"flags/4x3/jp-169d02f898d54cacbecd7b0197d32045a46c4424c10a67e78bbf488f7b44541e.svg","flags/1x1/jp.svg":"flags/1x1/jp-20835e83e8d43872df1ef8a2b3a26379b5f6bcff854dab3c7a24dcad4a42e02d.svg","flags/4x3/ke.svg":"flags/4x3/ke-58146180a02774a36ff2e4caf23b75c441a92dc69ffe3b9d4e9ded31e16748b5.svg","flags/1x1/ke.svg":"flags/1x1/ke-b3b9722930c4ecc82ed67d7c47eb751eefba3a59b24b68927c45d43a06b450a8.svg","flags/4x3/kg.svg":"flags/4x3/kg-7c23eb9471af5dc5ee4391e4ec08fec7889c2d83f2712ce59310a0eb81d663f0.svg","flags/1x1/kg.svg":"flags/1x1/kg-83e2a04c6199e69a1604a12610591fda15c8cf60e9fe7f682916815c5f1840bf.svg","flags/4x3/kh.svg":"flags/4x3/kh-4f121b97388966312c5691244a72214a3306f87ec517c658adcaf39a131a1d8c.svg","flags/1x1/kh.svg":"flags/1x1/kh-9b9ebdb74308e4975fef2e9737cad7fe44538bf97f5c1b7b6239fc2f065d4cea.svg","flags/4x3/ki.svg":"flags/4x3/ki-0e1a57754e3271771a154b525dfb57e20d584083b47b1ac2708b843abf11948a.svg","flags/1x1/ki.svg":"flags/1x1/ki-64df628a3c2bacf16209af95403dd7ae5402f705b2776da20ea741646e047b12.svg","flags/4x3/km.svg":"flags/4x3/km-2301fd16e41810016f9a58d75b8a361ffe9885ecfc89a0b3e9108bda7f5501d9.svg","flags/1x1/km.svg":"flags/1x1/km-6f9716ac74c8ef80557e682ae6d951a6ca6993eabd049f8de81a742f77a84452.svg","flags/4x3/kn.svg":"flags/4x3/kn-8e866a33f9952f8b29e45e8576133345446925907a2c4bcd429a34ae377bc74e.svg","flags/1x1/kn.svg":"flags/1x1/kn-46b0fcf2a59d3f923fc5ae6c914d9ee2d886fb4ee6f9c1108133244f4093d481.svg","flags/4x3/kp.svg":"flags/4x3/kp-ab0a3c4310474b324bbb39f77579ac3b421c531397d31e8f38de35a681d79bc9.svg","flags/1x1/kp.svg":"flags/1x1/kp-3a2ce32e4b76931fd6383f9833a4764528cc89c92f23672cc8eaff26c7a31ee1.svg","flags/4x3/kr.svg":"flags/4x3/kr-854d1521a9cb2b22c90f96d5d62277a9e1382818eefdc294d481c397c92f97c0.svg","flags/1x1/kr.svg":"flags/1x1/kr-343a5d08f9d0ff8c4268c77111cff9d2296c3f875b8d776c95dea1ae246d9bda.svg","flags/4x3/kw.svg":"flags/4x3/kw-75be6f04a24e7ddaaec57c95420ece390603961fa238245b776386890ab5627b.svg","flags/1x1/kw.svg":"flags/1x1/kw-cdbf39e8dc62ffc15b7bc3c373151070377db56c0508dadf80bdd3c971d8a094.svg","flags/4x3/ky.svg":"flags/4x3/ky-f75f33396887f6234e7ee4fd483e57c8e35ac52d504a4a6e12fad25d855bf061.svg","flags/1x1/ky.svg":"flags/1x1/ky-8ed8729ad8553aa468c0d9ea196f38048770b15a1bb632fb7c3bd56fbfd5b643.svg","flags/4x3/kz.svg":"flags/4x3/kz-51f42e580c605b6580aa4288d88d9c88bc6fd86af2388b0e4313bce969628743.svg","flags/1x1/kz.svg":"flags/1x1/kz-38ef143eed3d03cebe2e4924d520a0d90d5e59e97a39b13cb3085415267af6f3.svg","flags/4x3/la.svg":"flags/4x3/la-0a762fcc7ef73f1fedb4765b718e2e96c819d4b26d5375acfa48d245fb97fcec.svg","flags/1x1/la.svg":"flags/1x1/la-59d7d7dd1443e9bc557631254afa4333d1b83db314c9eb8bc170ce26f34f5dd8.svg","flags/4x3/lb.svg":"flags/4x3/lb-26ea2add2ac68a8040b027b510f29080d8407b961243c77b33b46c8957768b66.svg","flags/1x1/lb.svg":"flags/1x1/lb-eb8049cb746a3913ac814f4d6e0e850d0e4b9a60b78dec5e9acd95b299bf95e4.svg","flags/4x3/lc.svg":"flags/4x3/lc-444f9f77d0b09bd84fe2a5fd7194eae81341d8b7b4823070fc3e74cab481a122.svg","flags/1x1/lc.svg":"flags/1x1/lc-13a572e5fcbada8bf66eb77413f04f862b0cf95d4b85c5292b3d6348ec4d8c99.svg","flags/4x3/li.svg":"flags/4x3/li-b2d0ccbceb7e6129a6529c98721d92fcee379ed6c225a18e1eff3c6fa092eec7.svg","flags/1x1/li.svg":"flags/1x1/li-97814472256460b19df380ad90e5380202001a8a7ad6b4140cd2a0b92db909ac.svg","flags/4x3/lk.svg":"flags/4x3/lk-d910bd0d9ddb013c5668824d6600a842496c0a17c74f772a801f833b9eb044f8.svg","flags/1x1/lk.svg":"flags/1x1/lk-c7fb3c2b64782519d94f0a9fd21c057e5e32b856c428b68abb11667191235270.svg","flags/4x3/lr.svg":"flags/4x3/lr-42e8d3bdacafc05835fcd52026cb3e1717573965ce9d4f49635dbb390021a4b4.svg","flags/1x1/lr.svg":"flags/1x1/lr-169945e579afdf35dd158694a1679380886f8541278cbd225c7e750add25e60e.svg","flags/4x3/ls.svg":"flags/4x3/ls-a4db42569c4760bffd695cbdb030c90bc203f40f75fb357cbdbef961d29cf5dd.svg","flags/1x1/ls.svg":"flags/1x1/ls-1dd02208fc24c668e18430bb0500fa14c995f64cab8cde080b4256bd1b42b23f.svg","flags/4x3/lt.svg":"flags/4x3/lt-a57e003a5cbe538a4bfc2d29fd3523a87948bc8e29f731096dff9095096178c9.svg","flags/1x1/lt.svg":"flags/1x1/lt-e386ebe0482bdf999b151c3ae8c5e5e40a58037eab35b29f37682aa849edd3f0.svg","flags/4x3/lu.svg":"flags/4x3/lu-2746295f8b0a1540d43e0c2548d4ec1341fafcffe48b919fb135a6c82535b657.svg","flags/1x1/lu.svg":"flags/1x1/lu-9695b187733f52bae07c65e78aae8956e25360ad773c1f4703855997571a764d.svg","flags/4x3/lv.svg":"flags/4x3/lv-b51d475acf37be9accc82ddf5f60773861cf58b0e9b599460852589da88501ef.svg","flags/1x1/lv.svg":"flags/1x1/lv-dbf5d3fb294b518bc6373c4fc22b028fc462647fbd5032cf57513556896577bc.svg","flags/4x3/ly.svg":"flags/4x3/ly-7409a315d2f9aab4676558d7e97f4316ea87fc7afd93a493def4adf0b5773ca6.svg","flags/1x1/ly.svg":"flags/1x1/ly-6457e38177d82f6c52e3f3c38328f1ac66bb5a5c7a9026229d4e3aafe3b592af.svg","flags/4x3/ma.svg":"flags/4x3/ma-0628f236b2067d66c841c1190a3e8e3e9c37fbf2f3521fdb5ecba3eda75e805e.svg","flags/1x1/ma.svg":"flags/1x1/ma-5c96636ed7496b25e989cb74f202e377ec4c59b056b9d0c425ded77199b0d659.svg","flags/4x3/mc.svg":"flags/4x3/mc-10a533ce437c40973f8684439f7e24da1ea624c5e5535fa4738d62ede0650242.svg","flags/1x1/mc.svg":"flags/1x1/mc-6a9a8fe216f75ecdb8bddf6e6c816c1c9771ebffe3c09e83975a434ec1fb4950.svg","flags/4x3/md.svg":"flags/4x3/md-6641e05826ea580544c1890fe3698eb2e8e3af463518fc37eea7c41eb8cbb6c0.svg","flags/1x1/md.svg":"flags/1x1/md-e51dd640155b523a207eb1dc9dc909c38d9e88de04729e250e0cccd1e9d1b0b7.svg","flags/4x3/me.svg":"flags/4x3/me-c841acf1209c546dd77c18b718141ce4e21dba95a120cc3092988edaaf08f432.svg","flags/1x1/me.svg":"flags/1x1/me-c290031be15a14ebd1fd278774142e29f7dfe3d0fb3aba79c0d6932cb0feeb4b.svg","flags/4x3/mf.svg":"flags/4x3/mf-41a6043e2495b346fd700b17352150a8e43ca342a515fcb5159c39f809663ec6.svg","flags/1x1/mf.svg":"flags/1x1/mf-a3f24457b393082243eb00ea514057c09b1cf4985f6fa17d7902500fbb716317.svg","flags/4x3/mg.svg":"flags/4x3/mg-1baa2b12c3e79d592538d5d8e4d5a2c0e1373d3871c9d829f57b212daaf42129.svg","flags/1x1/mg.svg":"flags/1x1/mg-7e78efcc81f02f0616a11aec87bfd8dfaed1a328496301902f53375eee8f72ee.svg","flags/4x3/mh.svg":"flags/4x3/mh-1236a730a9819f0b58ac8cd642d17482b3945a894c63663b4accf10ac8ce5ecc.svg","flags/1x1/mh.svg":"flags/1x1/mh-3ecae469e3987c59cc4b19833eb8ccfe49a9477f70aa2aa2be5e9a4a131a48d0.svg","flags/4x3/mk.svg":"flags/4x3/mk-2a7bfeeba74701ceba752795d02eac7a97a6139471e5bdd529f2a858f4fd1d0e.svg","flags/1x1/mk.svg":"flags/1x1/mk-fe5c84d0e9bd4b7ceeed81f9564a970d7b5b39659e42f819c50950e191443720.svg","flags/4x3/ml.svg":"flags/4x3/ml-086660fe4272a22e220c94854fe4f80dd61afadd5c0c81cc075aea91bbcaa691.svg","flags/1x1/ml.svg":"flags/1x1/ml-9ef37a44932a3af38990145042c85352b1c5c4e791221d1fd91b5a9f7a412efb.svg","flags/4x3/mm.svg":"flags/4x3/mm-60ae7680502d9af8796fe3b3d57bbf6105a406e2e66840e9aa1f6e2470466058.svg","flags/1x1/mm.svg":"flags/1x1/mm-ea5bef04548342d984d8c8707333a31203a5abf015db093553f26c3a9febb251.svg","flags/4x3/mn.svg":"flags/4x3/mn-1309f63a0b6bfc594a1721a8af76381a1389fda64d840b256d353eb1341cb794.svg","flags/1x1/mn.svg":"flags/1x1/mn-86ecb7d9fcefe13783f165d44a93c9c2b1add55481bc69a70f9bd3652c27ae74.svg","flags/4x3/mo.svg":"flags/4x3/mo-6c69662b2581d90527965dd2c444784ab366f0080c93f2014ca37f2f7541b898.svg","flags/1x1/mo.svg":"flags/1x1/mo-ef906f7a8fdaccb7532359de1e5ce664ec0342975052b55a2e389f1b6338cba8.svg","flags/4x3/mp.svg":"flags/4x3/mp-dd2fa1cf9846007f88c88143047430f3f666099875407cf36648b271b6e1400a.svg","flags/1x1/mp.svg":"flags/1x1/mp-cd1d342862684bdb7caacb093e37d7e3b094cf49cfa5aa579d6b8201ffb4dd93.svg","flags/4x3/mq.svg":"flags/4x3/mq-be00a7c77b6aec1f86cd16bcafc7fe27b7b8c967b03632f8230cd83794833ba8.svg","flags/1x1/mq.svg":"flags/1x1/mq-bfaccc4a61b2d7067b44d54a75ce5bb5757292bdabff5e104b547aa2435a2e5d.svg","flags/4x3/mr.svg":"flags/4x3/mr-2293d4180eff3670e1c484d52a206efb562e8d96b9cb8c5a43aa65e1e2b1289c.svg","flags/1x1/mr.svg":"flags/1x1/mr-a3eb1a496e2c5dc86245856e18a91d71046b44d74d88274014e2d4fab41c3453.svg","flags/4x3/ms.svg":"flags/4x3/ms-913b24dbffa69bc3a57e997a806cdca5026cc5f87f83eefeef36a1aa8f5c2789.svg","flags/1x1/ms.svg":"flags/1x1/ms-8be40421854193032b83670c6a91aa1f5c818578eafb85ee90dce959eb54c6db.svg","flags/4x3/mt.svg":"flags/4x3/mt-517b4f67a94fff5be6346cae3731f5a17290b4c56732129967c15f482199365e.svg","flags/1x1/mt.svg":"flags/1x1/mt-371c5673e14380308182c7ae324f54792652bf4d0cf64de30b1d1fefea8c9b5d.svg","flags/4x3/mu.svg":"flags/4x3/mu-0a0d71ecace32a2948ac3eacc94927fb0ba7306236bf2a18ab5ae85bb2351664.svg","flags/1x1/mu.svg":"flags/1x1/mu-e0d4ee6c8f915eb54307ff51f57734c0bffa843060d953b9bd27f365b4a11b36.svg","flags/4x3/mv.svg":"flags/4x3/mv-421f31e8be8d80695f9f4811435214e8a8ac8729e145f9d491b888d91d0ca999.svg","flags/1x1/mv.svg":"flags/1x1/mv-c0056befcc1b506b4b498bf37dfa30642839a1beb6373f682e1214850b51cf6d.svg","flags/4x3/mw.svg":"flags/4x3/mw-644750e23780e66258d7b56777be8ef47ce3ca2d9d5735eac5abbb22fae33056.svg","flags/1x1/mw.svg":"flags/1x1/mw-70a282f17250f7fb49f8fbeb357dc492b742dd2a9c58e13281f0e900a8c63e94.svg","flags/4x3/mx.svg":"flags/4x3/mx-246482013102c12a6f83dcdfe0fa40c350560ae64505f9b4d3113ea5356e2f71.svg","flags/1x1/mx.svg":"flags/1x1/mx-27887b671ab9de501b6693ab60380e809962ac12222ddb580c9426e79e1360e3.svg","flags/4x3/my.svg":"flags/4x3/my-00a98291486af1c01c11fe46a203dd07bee31d6b5ffb5f60d04ad337a3499775.svg","flags/1x1/my.svg":"flags/1x1/my-a60a1ae968ed1ebbb60626370bd0494112b562a358c1381e6bb162268a110d8f.svg","flags/4x3/mz.svg":"flags/4x3/mz-8281fb68c18d27bf1588de7684e67f14aeabbf8e66117eb4e640faac9762dbb4.svg","flags/1x1/mz.svg":"flags/1x1/mz-dc805944726edfe3a8900cecd82ef15037381b81b6fab0d96d2cf93ba0d7a3ec.svg","flags/4x3/na.svg":"flags/4x3/na-d798d2db5bccea439f545e5e6dfa5aad6a166966cb5e223f7f2aa4d4dc73abd7.svg","flags/1x1/na.svg":"flags/1x1/na-0fceb3e900c021df14c00cab058c84cd834cb2f494a1db2fa58728a7f9445762.svg","flags/4x3/nc.svg":"flags/4x3/nc-2861e50f3a0a1b1c368d913df4f4092c65bb3faa2d01e4d084fa33ed041e537a.svg","flags/1x1/nc.svg":"flags/1x1/nc-1d65d86f9caaec75cc886c8abca3cc39b8de23c48e67b55936be3649ae67d716.svg","flags/4x3/ne.svg":"flags/4x3/ne-90b12ff4abee66e42d27b6c55dd602af3cc249f3492c8a449ec84a35a74ee6ed.svg","flags/1x1/ne.svg":"flags/1x1/ne-ecd9bd0f027c05147c336ef396ffce7c16cf011f051860ae082ea99be34554e0.svg","flags/4x3/nf.svg":"flags/4x3/nf-3323e2cb59cb8f9282e45155b6830e4c06876bc0c24ee28e5dd4dcff28d2dc70.svg","flags/1x1/nf.svg":"flags/1x1/nf-3da2a0db99d85998154510ac50674728e4768079a57443529b18b1ed87e5c077.svg","flags/4x3/ng.svg":"flags/4x3/ng-387e036e728aa4c36d93fad3c90e76e3beab727783ec11da7fbce30ff52c805e.svg","flags/1x1/ng.svg":"flags/1x1/ng-c4c24f43d15d5690390ea6d5a4b41911aa7cf0807167d69e95748c4439211dcb.svg","flags/4x3/ni.svg":"flags/4x3/ni-b83cccf0a65d0abf0398b905936ca6b6d5b1b64db8a34223225e3e4eb4f0311d.svg","flags/1x1/ni.svg":"flags/1x1/ni-35731438cffa30b56cc403c5e9a59e85e661566a0d72c5310865aaf282731e0f.svg","flags/4x3/nl.svg":"flags/4x3/nl-a71cd17ec0d083d39373108c1f5e994e71491e1f7ac34119e60c859142a2d34d.svg","flags/1x1/nl.svg":"flags/1x1/nl-6bfba1aa0f31f33e126e51832eddba06a92106d569f3e01dc4989a3425f45eac.svg","flags/4x3/no.svg":"flags/4x3/no-d4ae9765d2dd03faef1007008bf1ccde064e36c765faef79a270e7e8fa97c23a.svg","flags/1x1/no.svg":"flags/1x1/no-7b3a522b5101f7bcc5c9ac05adbfbfa3dacde4fc4420d2997b1ab38af7e50dbc.svg","flags/4x3/np.svg":"flags/4x3/np-043dff0f7f1cd254f2c2d82367557e5f4a15579af81242e2979523700adaeaf1.svg","flags/1x1/np.svg":"flags/1x1/np-976aa23f62798e1c0974a78649ff295334fc0d39f63eb19e990d2a13efe9fbe2.svg","flags/4x3/nr.svg":"flags/4x3/nr-f977239dc4f2dbb4185bcb741dc0aae4b46dd2d647444150f317e8dfb3062fd3.svg","flags/1x1/nr.svg":"flags/1x1/nr-1899ab289aa424dfa1bb1a787a5dae3d9081b212433441fe9a7c95c1c377fc01.svg","flags/4x3/nu.svg":"flags/4x3/nu-84b56f2711a6b958b9072dff3912f225c034d246341cc29c4eba6c34c70fe6f0.svg","flags/1x1/nu.svg":"flags/1x1/nu-60cdb57b27737dddc21980f6630e7476471ce8c1bc34b3a2632819bef23a26a5.svg","flags/4x3/nz.svg":"flags/4x3/nz-9cca5c871f70cdd784a33836d5a07ada7f6eaa720811c70dc2306a2a5056648d.svg","flags/1x1/nz.svg":"flags/1x1/nz-e5c8b6660d172e25e80f1d9530fb3e8b05fba1c4c02b95679fbcd5a0c50169f9.svg","flags/4x3/om.svg":"flags/4x3/om-fbef9222761223ced04e2946ec71432c761618ad58b8a3a5af5627a1d75b48e9.svg","flags/1x1/om.svg":"flags/1x1/om-07148a6924f8ce843e33be4f3d9d5dd40040da366e667925985e7b247073d08e.svg","flags/4x3/pa.svg":"flags/4x3/pa-50535df4995256b70ce0a7971ba95922046d445c06a567fd951d7f5a79cbe547.svg","flags/1x1/pa.svg":"flags/1x1/pa-e4d955c65827104b4f898beb392af5ffed5f62a09035f42801512b5b3d7767d1.svg","flags/4x3/pe.svg":"flags/4x3/pe-b518a86545125ff3c3fde029c2992233df876b663d8ec723bd4d67f90f72cb62.svg","flags/1x1/pe.svg":"flags/1x1/pe-8e395c37a87d3ea212ceaf0768869f2ae38ad507761ef6b10b2077f01274d6b0.svg","flags/4x3/pf.svg":"flags/4x3/pf-d1537625ade03a7fae7a5bdcfc5fe9f6449977613a38ddd258c8572f3630185b.svg","flags/1x1/pf.svg":"flags/1x1/pf-c78c72a0ad139c9da31592af7c443cfef4e1e1baf208e44088ca667298324c9e.svg","flags/4x3/pg.svg":"flags/4x3/pg-3190ab67d73878026d59e98e14b0cf98812c5c086d35956383c9986f7e0433a3.svg","flags/1x1/pg.svg":"flags/1x1/pg-fe2bbe3c6599a4bf895b9f748d5a15650a7d29c854252e3b074c780a77cd51b9.svg","flags/4x3/ph.svg":"flags/4x3/ph-ec483bd752a5a0d1f063397a2c206bdd9b23451d2c262eceba6411b2769ed3b1.svg","flags/1x1/ph.svg":"flags/1x1/ph-0d61f012185140030d9879f180b8279ab7798a9d7d062e141937ba83b51ab20e.svg","flags/4x3/pk.svg":"flags/4x3/pk-776714f751e4347341656ce5e88c6fa13316e2e36205cd8d09c73779794c2a56.svg","flags/1x1/pk.svg":"flags/1x1/pk-50284d5da424696f41ac4861f8eff6e5bc23a6e1812df7b444967c6e58ec6f81.svg","flags/4x3/pl.svg":"flags/4x3/pl-9bb56d1ec91d8c843ec53b018dc861772e466bad1582a9ba42148524347adf6d.svg","flags/1x1/pl.svg":"flags/1x1/pl-acc73e013a67a13fde68d812b22889be9150cce57d029deab6ba5b0ba4e7b69a.svg","flags/4x3/pm.svg":"flags/4x3/pm-5d990f5bc74366f734851ceb35046baaae3555ccff57e6cf95c7143f9b245532.svg","flags/1x1/pm.svg":"flags/1x1/pm-781f551a82a88b0a5e238b078310bc843950c844092d8ce1e52587feca285606.svg","flags/4x3/pn.svg":"flags/4x3/pn-1e347803c27d86312324a6a6712dee0bf5590971f027fffe082681dccce6c4c1.svg","flags/1x1/pn.svg":"flags/1x1/pn-b9762ab4fd752edc4506fd05f2810094e8de8b3cf6fffd00bafb89b6ed95359c.svg","flags/4x3/pr.svg":"flags/4x3/pr-4c0359aa4277d04c3c3af8ff89d0bbea462b480334cd6974beb6c5739c42903a.svg","flags/1x1/pr.svg":"flags/1x1/pr-dc838368c71fe79aea88491ec3e419ff01c26a5af460b05a79cb6cc6fa02b6b2.svg","flags/4x3/ps.svg":"flags/4x3/ps-39b00800524af9e8d270c479274be2dd5459c13d67a6f308139a69adbae4997f.svg","flags/1x1/ps.svg":"flags/1x1/ps-9102a922196261028bd07e60d1b2ef435e123aae8bba6d49a5918123f8be18f6.svg","flags/4x3/pt.svg":"flags/4x3/pt-f76294ca6203778375158111051358fb535eaebb06d50951eb5326f9ede31536.svg","flags/1x1/pt.svg":"flags/1x1/pt-09b4548e5764d2a6c56bf9c33e8652911f91b16ab6bfa3041630506480281047.svg","flags/4x3/pw.svg":"flags/4x3/pw-029fb7bb87eec12c79cbe662fe3614698c7638186958fb6032e59a17705777cb.svg","flags/1x1/pw.svg":"flags/1x1/pw-39f82e7a0e390333a2d0f4a1396a8f710af7ec3002c5542d7d6c76d634a67e82.svg","flags/4x3/py.svg":"flags/4x3/py-6f18a4e716e9fbe7d0caf99651fee56e44ffd2a13ce77f50a8374a7fe6b0879d.svg","flags/1x1/py.svg":"flags/1x1/py-0325fb333b5ea2adb996345bf2bf5df0c460c87ca97cb3c8f6e65a7f33aa1722.svg","flags/4x3/qa.svg":"flags/4x3/qa-55eb7d6716998d68fe6e3345807dc410e5c5e8511bb2c78f0d08d51da707a131.svg","flags/1x1/qa.svg":"flags/1x1/qa-cfff93f4c31946f7646a855521a7db667c78cb89a7c2ac339c64c14f06be0f7a.svg","flags/4x3/re.svg":"flags/4x3/re-8b3124b78a7752ee288a401ae16c3cf5dafc1296e443ba941de8b338b16c2723.svg","flags/1x1/re.svg":"flags/1x1/re-c7173d64ef4a62237f83c7af8cb144fba8c38bd7ac8e7125eda78320931215ca.svg","flags/4x3/ro.svg":"flags/4x3/ro-a10768f5227b028969ceb2bce6e3fc2ecbea0c5e40d1946c47d913d2745a8b21.svg","flags/1x1/ro.svg":"flags/1x1/ro-a4cfc4bce72dc7b034f2b84e932ba3d47f7a9404b94b1450af48263c576b62c8.svg","flags/4x3/rs.svg":"flags/4x3/rs-9792f9ae9694c0dfa1a213ec6ceb29d7b41819a508bedc4bf89dc4c285e48712.svg","flags/1x1/rs.svg":"flags/1x1/rs-cd44c0b89c5e2c2d0afe1902a263d60648dd18e97636256eb1ffc3148e336cd7.svg","flags/4x3/ru.svg":"flags/4x3/ru-ce34e72a9d955c6c6860a5e552cd3902d236bbff5a714a49a1b8f8dbbce3c410.svg","flags/1x1/ru.svg":"flags/1x1/ru-aa0d5e4855f92f211efad3979493956dfe01ad4a0b552814cad05fa67694de03.svg","flags/4x3/rw.svg":"flags/4x3/rw-0f08a5e527db8287642f1aafeb397fd49ac3add8e86dbb0d9a8be7d2c43b0153.svg","flags/1x1/rw.svg":"flags/1x1/rw-297915f2fa836eba2dc1d795a4f5b1c51f8d9abdc6704b13e63cd81c81476f09.svg","flags/4x3/sa.svg":"flags/4x3/sa-70281c72fb6008faf5d36c401593c7c8f0c8870332e23fa3b1b53cd0f88e9ad5.svg","flags/1x1/sa.svg":"flags/1x1/sa-463ab66153968c569b854793714e414ea77185758a8236364019d4e7e40582fc.svg","flags/4x3/sb.svg":"flags/4x3/sb-5de262c7e2fda747ea4ac98c2ca9ce045f07de995330b1fc3bbbf39e25ae42f6.svg","flags/1x1/sb.svg":"flags/1x1/sb-638ead7b9c9a42fe2318daf753a8f0ce9cea4792114d8d7475d5a5abcf697cb6.svg","flags/4x3/sc.svg":"flags/4x3/sc-46736983ebac2719d3e3aca36e3dbb896f612db71b72e9e5d6f3da36ae59c0ac.svg","flags/1x1/sc.svg":"flags/1x1/sc-1dc9321cdeeecad7c6485b2bc3aef87a1a1ca116c18908286b5f79bdb5ee8313.svg","flags/4x3/sd.svg":"flags/4x3/sd-3b49e891fcda945b02ee18ce8cee078f251d8e822201ba0f8953eb3efb0b2860.svg","flags/1x1/sd.svg":"flags/1x1/sd-993e4821f73f36e6dd12332ed727047a97c7d31b1c8f0b3312e924c5f437eb34.svg","flags/4x3/se.svg":"flags/4x3/se-8e13876ab89aedc66156f36f55fefe66068c43657a803ba6b98843c171fb06c7.svg","flags/1x1/se.svg":"flags/1x1/se-8af88180b9c1ca0b24dbf5e04039a523c6f0ce975094c7fb6b38a4901b2e5c5d.svg","flags/4x3/sg.svg":"flags/4x3/sg-da88143d134efe0c37b67471ceb24a9ced62ae9ade25530232c92435e6f46b65.svg","flags/1x1/sg.svg":"flags/1x1/sg-80e8f95951096bba14b6d6ebea036b0717617668d96f32b5a8172a06be1feb22.svg","flags/4x3/sh.svg":"flags/4x3/sh-3b36e972618f594e95974a9c551d3ba9ead3e9b175d8dac0bc30fd1910f82561.svg","flags/1x1/sh.svg":"flags/1x1/sh-f25afcdb45a6c2d58e3984d40188a03342271f2f6312b868236b2a1c02a2e60e.svg","flags/4x3/si.svg":"flags/4x3/si-a9715a0c1db87762010c25b6d3bb90f73de3c893aa3bbc7412d57dfa14f28dd5.svg","flags/1x1/si.svg":"flags/1x1/si-daa3e030c059585d235a78f228c89a32bc50df223da8efa32f85a13978524365.svg","flags/4x3/sj.svg":"flags/4x3/sj-a2fa34115702482c2af9c7632eaeec77a26a1de129ce825bc38e27b6523e19ba.svg","flags/1x1/sj.svg":"flags/1x1/sj-55f27b8e6aa75b9db244543edd19b891f3c07d59106cf08ff5c47781c480d272.svg","flags/4x3/sk.svg":"flags/4x3/sk-b285dd82884088b14db516eac76a39b29752279ac9f0f3e7c84b624edea66aa8.svg","flags/1x1/sk.svg":"flags/1x1/sk-cf28c14c8d736a45cbb0a31c0743373b6414974d561729d322cb7204e6a2f25b.svg","flags/4x3/sl.svg":"flags/4x3/sl-571df59f51a68477e49c8bbbe397e505d30d27ed1611b37485c94198b6401a9a.svg","flags/1x1/sl.svg":"flags/1x1/sl-038ea846f3362ef266345b5a7f9f0c7e94334edf697c24c5faeda27bc0396927.svg","flags/4x3/sm.svg":"flags/4x3/sm-a15cef2d34582deb77e611ac2df3580749a7faafa1bc7c5c661c906ccbdad64d.svg","flags/1x1/sm.svg":"flags/1x1/sm-b9bb79651c85755c984570a106213c32d87c7fbe5737b9b6a6e5512a05d98429.svg","flags/4x3/sn.svg":"flags/4x3/sn-d8a7143973e5ea3d4b58e707ac2b791b45b5c7a7e65cea521fa82e9e5920926d.svg","flags/1x1/sn.svg":"flags/1x1/sn-2432d592221bbdd387548cfa5069c62f75245597749ffa6e2dc8d029b76e88ae.svg","flags/4x3/so.svg":"flags/4x3/so-c82eddc49e0c223a307286bed233a03794954ad83efd12d8e2499a728bb78f22.svg","flags/1x1/so.svg":"flags/1x1/so-52cb6599bb12bafd9e49b2661297961fe585068009eb1b1c1153023514a342a7.svg","flags/4x3/sr.svg":"flags/4x3/sr-cda17a0b4748b11b3e116d4f034adf47def0faaae1e71a5bb5d5c61645be9795.svg","flags/1x1/sr.svg":"flags/1x1/sr-fb0ff6fc7108d1b993a838bb0e9db479af4e2af4cda72c80e7456c0777cdea28.svg","flags/4x3/ss.svg":"flags/4x3/ss-744839019f2833ed8059e53d0d6e1cde2471c6a61d51f9e09814bda42bdc1f12.svg","flags/1x1/ss.svg":"flags/1x1/ss-d77200a3fe67f1533ea642a6013667ce15bb0c8068b09db151c960593b37549a.svg","flags/4x3/st.svg":"flags/4x3/st-b0a9259277e38c0c8e0efec1d10b40d3e9c80a9eef21c174246aad28511e976d.svg","flags/1x1/st.svg":"flags/1x1/st-02eb52348f8547d028ba692f909483c32474105aae7940731d9264027493e479.svg","flags/4x3/sv.svg":"flags/4x3/sv-b524450c407002e1cf8e85444bb4225849cae409f54f5dc87d14d65faeeb833a.svg","flags/1x1/sv.svg":"flags/1x1/sv-e16fe96bd7f32dadd74091ee73b723c2b8dd92e791f337c54ee5bb18693ef1d2.svg","flags/4x3/sx.svg":"flags/4x3/sx-076f4363898d1374f985352dddbfe2a618bf4e7fedd80e43956be6614ca27ec0.svg","flags/1x1/sx.svg":"flags/1x1/sx-689aabb209fec5e8fc325bbaff80aa0bf11a2d6c819fa821b82069a2e5f12911.svg","flags/4x3/sy.svg":"flags/4x3/sy-d99ddced9cf98e95f7086a70703cd234cc8e21e744c37a6f90820c37ebc755d2.svg","flags/1x1/sy.svg":"flags/1x1/sy-c7f1e1422a9d941be9abd5e0f51b4c4ebdd08efd31c4ba3e378c155911cbe844.svg","flags/4x3/sz.svg":"flags/4x3/sz-b8760e27e50f7f31f0b38c2cdbcfa0121317bad064561cbcfeb8413ee8764e6d.svg","flags/1x1/sz.svg":"flags/1x1/sz-6c0e7ae75aa0fa71821d7b6230dff63e34b65221c0dc08f50226299d37716652.svg","flags/4x3/tc.svg":"flags/4x3/tc-abf0740c371bb155066651fca91c9e27e12b3cc9c05c14494e53dac851cc78bb.svg","flags/1x1/tc.svg":"flags/1x1/tc-13c94ed220ff9c70284c379e33fc85891de95dce60ec053787549485bca40a36.svg","flags/4x3/td.svg":"flags/4x3/td-354d8d74597706ece28b45f28030c948596f91c04392d07307b800cb0fc6e4cd.svg","flags/1x1/td.svg":"flags/1x1/td-fb3c31a792ab9fffe28bfe959cacdac54daebe9f795c30515830d93773805c3e.svg","flags/4x3/tf.svg":"flags/4x3/tf-f4edacabdba5b4d4d898a4edd7f07976f6a01ceee97c03fdf3561f2ba369b4f3.svg","flags/1x1/tf.svg":"flags/1x1/tf-fa00833e3ac96967c55c7f495a580ad5beb1fd912d32d0c9751b93c3c89be893.svg","flags/4x3/tg.svg":"flags/4x3/tg-32688daf8870e048421dcbfa2777d9b5f146e588f5f604433d17143fe702dac7.svg","flags/1x1/tg.svg":"flags/1x1/tg-0e62ff3b4c2106e7c5fe27a6f32fb3c10f69f9cfd5dad9aeb7a8b54af7cab786.svg","flags/4x3/th.svg":"flags/4x3/th-da4f1fda6eda5971dd52bad365bfc4aae176f0eedebf5c8bd9af25789c03993d.svg","flags/1x1/th.svg":"flags/1x1/th-95ac5f4463da0b9164f2fbed65ca12046370fcb1e250c6170975b77d1509b3e5.svg","flags/4x3/tj.svg":"flags/4x3/tj-d072d6cd4136ae97533d32ac74d20350ac794f8a79eaecd1c55142e76b93b3d9.svg","flags/1x1/tj.svg":"flags/1x1/tj-2cefbad6aee66d30fd757ea564fdbbde86aebde70720e9c961799caa6bdc8b84.svg","flags/4x3/tk.svg":"flags/4x3/tk-da715012efe8731020fe54063a76bffb256ea6696da290ccbb599ab36990edfe.svg","flags/1x1/tk.svg":"flags/1x1/tk-4055f5153398c294b2344880102e23847e952df1d04ad8734218fb0f6b43bf42.svg","flags/4x3/tl.svg":"flags/4x3/tl-388fac3c65fbbc18779b88f7fcdea523ba440860923a7e1602ca1138bcd5c40b.svg","flags/1x1/tl.svg":"flags/1x1/tl-9fea1b22d992cd15cafd1e5824d65f1f0f84b7c89a0f5a460b82429e2f9a8e95.svg","flags/4x3/tm.svg":"flags/4x3/tm-f5d7cce194b88ed026465717ee593c35c03f76f3483d77bee2a3e05827628679.svg","flags/1x1/tm.svg":"flags/1x1/tm-a3f255f0a6874a326140c9a4cad876cd386c30ac7b9e974905699ada62811042.svg","flags/4x3/tn.svg":"flags/4x3/tn-ba48fb29a4c8511d1145b87abc10cb75e8dc9ac4e704dc9efc113cf920d4b640.svg","flags/1x1/tn.svg":"flags/1x1/tn-d9b89cb7ab0b22d5a4709eb4681d77b8f6877d572a1d2f6424f6ce2fbed2dede.svg","flags/4x3/to.svg":"flags/4x3/to-9f1079a109d27abe53f17281320474ecfa6edc571502831f167471edd470773e.svg","flags/1x1/to.svg":"flags/1x1/to-a543262eaac18a114c5c70153895192a3e58981d4a00084473cd479bbca5783b.svg","flags/4x3/tr.svg":"flags/4x3/tr-04941a0f055d2ee2466b8e19532f58a2a0c4e3a83d986a601220fda2b6a3b090.svg","flags/1x1/tr.svg":"flags/1x1/tr-0df7b630a61ad40f32017487e6fef02258e8b2c8709c6fc8c1d3de1e9b36b09c.svg","flags/4x3/tt.svg":"flags/4x3/tt-9ca06051696b194f98d36ab4adb6aa7eb75275333cc0b48c9c9e1c34601013aa.svg","flags/1x1/tt.svg":"flags/1x1/tt-b05ee6c590e5c757190226182ac72648604086a272479f91d73dc24d90162eef.svg","flags/4x3/tv.svg":"flags/4x3/tv-5875f68681a06f613b3f84cd6959eb9dba70524bf14b0c8aa4a823a833dd6a98.svg","flags/1x1/tv.svg":"flags/1x1/tv-d8be186cccd6335a8f85c89085ef08b19c247df4081ed61698604972fdb8fa43.svg","flags/4x3/tw.svg":"flags/4x3/tw-29e639da18e668c62eb04ed3f3a02e11b0809890a2a0c82b529e50d53076e4e2.svg","flags/1x1/tw.svg":"flags/1x1/tw-2a2531772efdfcc74f70cc88f6fc15df7dc42dc344d9ed94b08e1847557976c4.svg","flags/4x3/tz.svg":"flags/4x3/tz-69ae0bf011f019428148ba9c3d793b4104be88621741beb216dfc9f43d125d6c.svg","flags/1x1/tz.svg":"flags/1x1/tz-581f05e20eeb5d8d77f807f2d6edaf786da8226284726841f33d9288ee84d6b7.svg","flags/4x3/ua.svg":"flags/4x3/ua-ddfa2a9985ed8342421c8df6fe852ec92e15d584c2565c525347bcd5f524c9da.svg","flags/1x1/ua.svg":"flags/1x1/ua-86260ecf3aa1da110f92b58861d7918e3e574a79cfb4334f9c82b1a750a8a875.svg","flags/4x3/ug.svg":"flags/4x3/ug-b748460c255e064ba8a2d89bb78c48fd29bdf496a7ca3c3af0ed0d83e49995cb.svg","flags/1x1/ug.svg":"flags/1x1/ug-8a8552bd983c6e2136f9eba9b4917d0e158415a24d9945f663ed56239299b44b.svg","flags/4x3/um.svg":"flags/4x3/um-d3a2b6a726a36d08db81fe4a5f0decd0afe5aa4ad8515304db4c3ace8f27e415.svg","flags/1x1/um.svg":"flags/1x1/um-0bcb31652ebcfa8c6727911e3df341b30425c3c699e6c4bf9f47c739ab9f442d.svg","flags/4x3/us.svg":"flags/4x3/us-c10177f8d2a93643101b39e419273bdd2f43a58ff9beff88a90431b0a4aa6a00.svg","flags/1x1/us.svg":"flags/1x1/us-a46068d8032a1e3364325da9675a41ba85a40c5401981c403fb7297aea254906.svg","flags/4x3/uy.svg":"flags/4x3/uy-ab18ad511d2822414e3b4f32e3309dca27b5b559cabd89cba2b4b4072387f440.svg","flags/1x1/uy.svg":"flags/1x1/uy-d94f5244cbd79f9348a048b7ec8861d37a237806dc1a6427fc9e743b86f43097.svg","flags/4x3/uz.svg":"flags/4x3/uz-78ae3b6ad90b0bb256102b6db50b8f9a7700fb6275e80d0c5b755e0defdcf8e5.svg","flags/1x1/uz.svg":"flags/1x1/uz-eff129a2e58e047e1daa2883f9ab0ef410bc11c42d652b9c4635bce5ab045b4f.svg","flags/4x3/va.svg":"flags/4x3/va-20117c2869d005de2cc54801f2d264b2823c214276f5559de1e48108f572fc79.svg","flags/1x1/va.svg":"flags/1x1/va-3206ffbb26fff2b3cd06959ba7f9d713efa9d133932d94ea1f1f6e3dd42687a3.svg","flags/4x3/vc.svg":"flags/4x3/vc-dccc1c2e4dc2d36ff71f8b04ebda868a7c4ce753b9fe5ccf0bed00edd7d41abb.svg","flags/1x1/vc.svg":"flags/1x1/vc-08a544ff242da12cc3fbad36579499a0b125c4b7ee7aa0af4eff0a261ea27a13.svg","flags/4x3/ve.svg":"flags/4x3/ve-d62ba31ca157e54409e09617a264e0dd18a2c597b1ad611c34da7fe7962e05dc.svg","flags/1x1/ve.svg":"flags/1x1/ve-f465be9b82185e94a0f84a3d8b2f536e026b8893fecfc324997ca711b9fe0097.svg","flags/4x3/vg.svg":"flags/4x3/vg-d6c3f0ef53e605acc97f33a4e0a61711b6a8207c6a2cff55b9427870053da583.svg","flags/1x1/vg.svg":"flags/1x1/vg-8a2a8af88748ff501bc90aceb327488cce5f323948d59f62c960ccfb58ca7510.svg","flags/4x3/vi.svg":"flags/4x3/vi-882e3005bf905201f3ccb79736ff058aad41d99046ef58fefb2e5f7df30d4ef4.svg","flags/1x1/vi.svg":"flags/1x1/vi-8f89c34e92ffdc8d17724234254fadad1bbb4b2828cb5e041b4d6a21ec5c3caa.svg","flags/4x3/vn.svg":"flags/4x3/vn-53c52e450c6e603d8b08c0170dd3bd15aaa0d4e9d250657bea188945c1252138.svg","flags/1x1/vn.svg":"flags/1x1/vn-7267ad3b33fb6d304ff414c998a2c69c6b46abc2528c2e955ff4367959cae8e1.svg","flags/4x3/vu.svg":"flags/4x3/vu-2dd468b3a9c89ef0bcbb155422cb38bb19e6255d2871ec2b7012055d31d13e2a.svg","flags/1x1/vu.svg":"flags/1x1/vu-477e1ac8d2d514517a8a6b84f917f9c43d0145d52f4b89e7205277ee3bbea422.svg","flags/4x3/wf.svg":"flags/4x3/wf-d2b9db8f6fa2a78507a5b4751f95e92c334673ecddd68eb33844ea91fc62d771.svg","flags/1x1/wf.svg":"flags/1x1/wf-095484363036fafbb44da7fbbdb6bb371c92c002163fb610c29912c6027a3cb7.svg","flags/4x3/ws.svg":"flags/4x3/ws-6a3fef801ba087404d3718c0b5b8741261d790cb2bf8b7581fea317e9689bcc7.svg","flags/1x1/ws.svg":"flags/1x1/ws-a312f6f7ddd2d5694c70b935f000ccc7716aae0b207e98ca4ad6ee252d272f49.svg","flags/4x3/ye.svg":"flags/4x3/ye-38ca92e79aeba152eee33f0d5dac55430af032a31b39d56d49c4287b0639fe72.svg","flags/1x1/ye.svg":"flags/1x1/ye-2d43095605cb09aeebaa7d9ec1147717dfffb26cd6a7ab66adfbf550a3bc8962.svg","flags/4x3/yt.svg":"flags/4x3/yt-2b54852c423d68df342c5bec300477510632be3f1046a2d9d9715a9617bc90ae.svg","flags/1x1/yt.svg":"flags/1x1/yt-3ea3c372eb1f7e269abafc08882bdb99d94c18ea363b905f8422f2733a550db8.svg","flags/4x3/za.svg":"flags/4x3/za-c57ff71cb91d156461c64ada7fb86779c009a9c0a53df0b6de2e87044eeefb74.svg","flags/1x1/za.svg":"flags/1x1/za-571b8b7da7f17cd9a4ce08e5696468e86efce9be83bb776c7586184fa75e99a9.svg","flags/4x3/zm.svg":"flags/4x3/zm-8a6d8f87b53dd7256d461f64cf66e2cd90df833aca8833849fbfe7445caeeae2.svg","flags/1x1/zm.svg":"flags/1x1/zm-d68871c839973048d37ad325312abfc1b22b525e3f48faefedcebea29e3e9175.svg","flags/4x3/zw.svg":"flags/4x3/zw-506cb345575e94583b442c3a23ded41e36cf454e797b3b2e03b4445a37395666.svg","flags/1x1/zw.svg":"flags/1x1/zw-f7716b45f4f267a661f85af47e95447adc282a4b9fc18bc88316cd970f8d947d.svg","flags/4x3/es-ct.svg":"flags/4x3/es-ct-bcbb454a50c9a647efd43dcf041445f15e8dd70654bde530bf62401d4fb7738d.svg","flags/1x1/es-ct.svg":"flags/1x1/es-ct-7f13eb2b2f5c11dccd7043286bed7540d4dad4b1a8367b0aca1b8405a351b2ef.svg","flags/4x3/eu.svg":"flags/4x3/eu-dfa7f5c90f5fe9eb16c8c865e73cf7e3e8fea328bf6cfc1b07f6bc28eefd43f5.svg","flags/1x1/eu.svg":"flags/1x1/eu-c3a400ee8dc3ee4dcc2d0f2868698ce781d403a9ea249d972115c8455cfcaa9b.svg","flags/4x3/gb-eng.svg":"flags/4x3/gb-eng-65a380032580f7144bddfd4ab353bb478d523232c4303edb0095e34e98c7dcb9.svg","flags/1x1/gb-eng.svg":"flags/1x1/gb-eng-6fe299a85ef920693f193828362f306fbd23020d2bfc61dcf9143d85a6a5001b.svg","flags/4x3/gb-nir.svg":"flags/4x3/gb-nir-7cdb174057442ee76cc8a3fef9df4650460b3a3a9c0634c2417c42e7383efe3f.svg","flags/1x1/gb-nir.svg":"flags/1x1/gb-nir-ea58e209ad11b7e21e357799a5a0d4c7cfd13b2f7407cb09933a2dc485da41ff.svg","flags/4x3/gb-sct.svg":"flags/4x3/gb-sct-f7b13851e9b9de7532ef86afefb7fe2efe6149fee8ea50505771b4f7d112cf7b.svg","flags/1x1/gb-sct.svg":"flags/1x1/gb-sct-76e5e39a38915cf5f6020d6f58d0385f1fc0d502dbecddabf00a18cd50c88995.svg","flags/4x3/gb-wls.svg":"flags/4x3/gb-wls-c6e549d37113c25f679d5ea75020ea514971a1038b3c92d6a71c316a56b542da.svg","flags/1x1/gb-wls.svg":"flags/1x1/gb-wls-99a7a03c4ef2a0789d35aa1ab8b746ec72c1c8de58426afc7fa096d5a00802a7.svg","flags/4x3/un.svg":"flags/4x3/un-3760dc125288de6c2143060b283497dfed4de7430943f5be86a67d7668ede7a3.svg","flags/1x1/un.svg":"flags/1x1/un-aac693764e62f5d0bccf80bc53f68bb6cde75b18c3b3829a89b79555df538c71.svg","leaflet/dist/images/layers.png":"leaflet/dist/images/layers-0e356f4d554162eb71f127f50460dbc55d405027189ebe90b20729ef18d13d36.png","leaflet/dist/images/layers-2x.png":"leaflet/dist/images/layers-2x-ba8fa601e413b14db27db07285ade3951721e02244c31523284ab2d1ed53c3dc.png","leaflet/dist/images/marker-icon.png":"leaflet/dist/images/marker-icon-3d253116ec4ba0e1f22a01cdf1ff7f120fa4d89a6cd0933d68f12951d19809b4.png","markers-soft.png":"markers-soft-6743c1321400ff5ed1fb4c3b0a68a7f8857956084f426b6bb8bff03cab2b724e.png","markers-shadow.png":"markers-shadow-883ead799be0d0437c65d6172342237e860d121f35a2d215ce4170a8da302338.png","markers-soft@2x.png":"markers-soft@2x-dd562751740663b74ed9a16c1484444d40fb95b79b8b1b13e5e12a2f8331c5e2.png","markers-shadow@2x.png":"markers-shadow@2x-64fe7e2740a7d015109cd31a498357dada39f7552caac379a8d1f0c18dc3d77c.png","events.js":"events-3e83b10967184ff7800176a5aae37f0d45162e4dbc6a8d101e79636eb2274842.js","filter.js":"filter-aec6405be3a059d4c6182c2b78a7d862e5879d378af79f10c70dd70115d76c69.js","flash.js":"flash-757c43f7bcfec72eb8c147d7e40eea4373bbc31269904db4c67a187a13fc856e.js","frTypo.js":"frTypo-e14689364c33d905e570ab98d54aa6effd3d6a32bff772ff61f4d444a677b507.js","list.js":"list-4bca572230746ba29b71588069332bc93e191c4d354e70ce7f4d79d6de930b2b.js","maps.js":"maps-e1374da0139727945cef18b9825aac8ff8385c42bd52e4392dfb6d5b42b9d0ee.js","moderations.js":"moderations-1083e9b51d8fdacde5ae79ae6e653e83ea2f97cf547b76137bc7dc870b1cca1e.js","notes.js":"notes-27cfb9694c5e92d25d972c2b4a2d2e222ad088aef866823f772241c1db423402.js","orgas.js":"orgas-27cfb9694c5e92d25d972c2b4a2d2e222ad088aef866823f772241c1db423402.js","pages.js":"pages-ebefad825b6310fe638f3e10bb941230b69ee16fc9de859ce670c3e282c2ba61.js","pagination.js":"pagination-ab6b8afabe3d53764287ed9d0ee9d4b7092cab98cdfb453a54471066fed05aa5.js","setup_tinymce.js":"setup_tinymce-25067ac5d8f690f8eee54a28349199fcb5831ea846457867835bcf47d57952f6.js","stats.js":"stats-57831421e685bf087e5d17e18193ec7b883975e14affaefeff0b1f2ad9cf1287.js","_variables.css":"_variables-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css","agendadescommuns.css":"agendadescommuns-18a01cd096b29d12a928627259ca8820b2f291b55421b3e99d8d36a557cb81f5.css","all.css":"all-961f78ee92432ef39fd4ccd99a0f2f752e1a8edfb766706ceb1a339b255958d8.css","digest.css":"digest-104627419d74f190311b5b3cdf13e9d62090ec931cdcba30c9b4cf162f340e60.css","events.css":"events-f6adf5fd5d2bef673919b4d5db87b539121c6c3cf5a70c1a0e0fec222c194dd3.css","form.css":"form-f538ad878340c212194ccc353a0413127beb91a909abf7c713cf0d59e8bdab0c.css","frTypo.css":"frTypo-3ac4d503c4f2ecb1b79218c06eae720b3be67dc97f345d88742d0169534c73ee.css","list.css":"list-561b0a756f4d38ca2e80f68e71f3cf9209d36ae15c5986d05e3989860c0f30ec.css","maps.css":"maps-725c7d4efc62c8c339fee78c80a21b5282c666f0a86f10799ca2a9f44dea33cd.css","mobile.css":"mobile-f85c37d44d2b40fbcdf2ca4a3e992b55a271deb6d69e48cf302fd68c24e47e75.css","moderations.css":"moderations-0096ff2dbaaf4cb827c0ea9595246185e8f6eb1201a95ad47383204f767cfbb7.css","notes.css":"notes-dfb4401eda9f1493c47d21bfde74b3bea884e032b8475dc754f9f1fb3689796d.css","orgas.css":"orgas-bf3c0aa4f00bc446c1ccfdb4cd77994db2fa465436c6420c22bebab5738409a7.css","pages.css":"pages-b29917202190ced028521961bd8de890197e6987a2e5c8e871dbfaf2ea51fa9e.css","region.css":"region-da39e2fee3e61e44603f5248317352e5901effd4339eccb6cb8c14df81319115.css","scaffolds.css":"scaffolds-f62d5fc6ab54601c38d8281da2a240b651784b27a628a5d6c328df499c3dbeac.css","sessions.css":"sessions-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css","stats.css":"stats-f9fe4057e217c7e56a4bd9cc12618d1ff98805bb494f368a6dcce15d9b9ef0c3.css","tags.css":"tags-fd1c7a90a96d15f57a9d27860a1192f4daf34dc715ca12e9db90efb3dac04955.css","versions.css":"versions-51d9b0340f6b1229364dc45dd44b1b81253212ccac013d642313f59ac833138e.css","tinymce/jquery.tinymce.js":"tinymce/jquery.tinymce.js","tinymce/langs/readme.md":"tinymce/langs/readme.md","tinymce/license.txt":"tinymce/license.txt","tinymce/plugins/advlist/plugin.js":"tinymce/plugins/advlist/plugin.js","tinymce/plugins/anchor/plugin.js":"tinymce/plugins/anchor/plugin.js","tinymce/plugins/autolink/plugin.js":"tinymce/plugins/autolink/plugin.js","tinymce/plugins/autoresize/plugin.js":"tinymce/plugins/autoresize/plugin.js","tinymce/plugins/autosave/plugin.js":"tinymce/plugins/autosave/plugin.js","tinymce/plugins/bbcode/plugin.js":"tinymce/plugins/bbcode/plugin.js","tinymce/plugins/charmap/plugin.js":"tinymce/plugins/charmap/plugin.js","tinymce/plugins/code/plugin.js":"tinymce/plugins/code/plugin.js","tinymce/plugins/codesample/plugin.js":"tinymce/plugins/codesample/plugin.js","tinymce/plugins/colorpicker/plugin.js":"tinymce/plugins/colorpicker/plugin.js","tinymce/plugins/contextmenu/plugin.js":"tinymce/plugins/contextmenu/plugin.js","tinymce/plugins/directionality/plugin.js":"tinymce/plugins/directionality/plugin.js","tinymce/plugins/emoticons/js/emojis.js":"tinymce/plugins/emoticons/js/emojis.js","tinymce/plugins/emoticons/plugin.js":"tinymce/plugins/emoticons/plugin.js","tinymce/plugins/fullpage/plugin.js":"tinymce/plugins/fullpage/plugin.js","tinymce/plugins/fullscreen/plugin.js":"tinymce/plugins/fullscreen/plugin.js","tinymce/plugins/help/plugin.js":"tinymce/plugins/help/plugin.js","tinymce/plugins/hr/plugin.js":"tinymce/plugins/hr/plugin.js","tinymce/plugins/image/plugin.js":"tinymce/plugins/image/plugin.js","tinymce/plugins/imagetools/plugin.js":"tinymce/plugins/imagetools/plugin.js","tinymce/plugins/importcss/plugin.js":"tinymce/plugins/importcss/plugin.js","tinymce/plugins/insertdatetime/plugin.js":"tinymce/plugins/insertdatetime/plugin.js","tinymce/plugins/legacyoutput/plugin.js":"tinymce/plugins/legacyoutput/plugin.js","tinymce/plugins/link/plugin.js":"tinymce/plugins/link/plugin.js","tinymce/plugins/lists/plugin.js":"tinymce/plugins/lists/plugin.js","tinymce/plugins/media/plugin.js":"tinymce/plugins/media/plugin.js","tinymce/plugins/nonbreaking/plugin.js":"tinymce/plugins/nonbreaking/plugin.js","tinymce/plugins/noneditable/plugin.js":"tinymce/plugins/noneditable/plugin.js","tinymce/plugins/pagebreak/plugin.js":"tinymce/plugins/pagebreak/plugin.js","tinymce/plugins/paste/plugin.js":"tinymce/plugins/paste/plugin.js","tinymce/plugins/preview/plugin.js":"tinymce/plugins/preview/plugin.js","tinymce/plugins/print/plugin.js":"tinymce/plugins/print/plugin.js","tinymce/plugins/quickbars/plugin.js":"tinymce/plugins/quickbars/plugin.js","tinymce/plugins/save/plugin.js":"tinymce/plugins/save/plugin.js","tinymce/plugins/searchreplace/plugin.js":"tinymce/plugins/searchreplace/plugin.js","tinymce/plugins/spellchecker/plugin.js":"tinymce/plugins/spellchecker/plugin.js","tinymce/plugins/tabfocus/plugin.js":"tinymce/plugins/tabfocus/plugin.js","tinymce/plugins/table/plugin.js":"tinymce/plugins/table/plugin.js","tinymce/plugins/template/plugin.js":"tinymce/plugins/template/plugin.js","tinymce/plugins/textcolor/plugin.js":"tinymce/plugins/textcolor/plugin.js","tinymce/plugins/textpattern/plugin.js":"tinymce/plugins/textpattern/plugin.js","tinymce/plugins/toc/plugin.js":"tinymce/plugins/toc/plugin.js","tinymce/plugins/visualblocks/plugin.js":"tinymce/plugins/visualblocks/plugin.js","tinymce/plugins/visualchars/plugin.js":"tinymce/plugins/visualchars/plugin.js","tinymce/plugins/wordcount/plugin.js":"tinymce/plugins/wordcount/plugin.js","tinymce/skins/content/dark/content.css":"tinymce/skins/content/dark/content.css","tinymce/skins/content/dark/content.min.css":"tinymce/skins/content/dark/content.min.css","tinymce/skins/content/default/content.css":"tinymce/skins/content/default/content.css","tinymce/skins/content/default/content.min.css":"tinymce/skins/content/default/content.min.css","tinymce/skins/content/document/content.css":"tinymce/skins/content/document/content.css","tinymce/skins/content/document/content.min.css":"tinymce/skins/content/document/content.min.css","tinymce/skins/content/writer/content.css":"tinymce/skins/content/writer/content.css","tinymce/skins/content/writer/content.min.css":"tinymce/skins/content/writer/content.min.css","tinymce/skins/ui/oxide-dark/content.css":"tinymce/skins/ui/oxide-dark/content.css","tinymce/skins/ui/oxide-dark/content.inline.css":"tinymce/skins/ui/oxide-dark/content.inline.css","tinymce/skins/ui/oxide-dark/content.inline.min.css":"tinymce/skins/ui/oxide-dark/content.inline.min.css","tinymce/skins/ui/oxide-dark/content.min.css":"tinymce/skins/ui/oxide-dark/content.min.css","tinymce/skins/ui/oxide-dark/content.mobile.css":"tinymce/skins/ui/oxide-dark/content.mobile.css","tinymce/skins/ui/oxide-dark/content.mobile.min.css":"tinymce/skins/ui/oxide-dark/content.mobile.min.css","tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff":"tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff","tinymce/skins/ui/oxide-dark/skin.css":"tinymce/skins/ui/oxide-dark/skin.css","tinymce/skins/ui/oxide-dark/skin.min.css":"tinymce/skins/ui/oxide-dark/skin.min.css","tinymce/skins/ui/oxide-dark/skin.mobile.css":"tinymce/skins/ui/oxide-dark/skin.mobile.css","tinymce/skins/ui/oxide-dark/skin.mobile.min.css":"tinymce/skins/ui/oxide-dark/skin.mobile.min.css","tinymce/skins/ui/oxide/content.css":"tinymce/skins/ui/oxide/content.css","tinymce/skins/ui/oxide/content.inline.css":"tinymce/skins/ui/oxide/content.inline.css","tinymce/skins/ui/oxide/content.inline.min.css":"tinymce/skins/ui/oxide/content.inline.min.css","tinymce/skins/ui/oxide/content.min.css":"tinymce/skins/ui/oxide/content.min.css","tinymce/skins/ui/oxide/content.mobile.css":"tinymce/skins/ui/oxide/content.mobile.css","tinymce/skins/ui/oxide/content.mobile.min.css":"tinymce/skins/ui/oxide/content.mobile.min.css","tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff":"tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff","tinymce/skins/ui/oxide/skin.css":"tinymce/skins/ui/oxide/skin.css","tinymce/skins/ui/oxide/skin.min.css":"tinymce/skins/ui/oxide/skin.min.css","tinymce/skins/ui/oxide/skin.mobile.css":"tinymce/skins/ui/oxide/skin.mobile.css","tinymce/skins/ui/oxide/skin.mobile.min.css":"tinymce/skins/ui/oxide/skin.mobile.min.css","tinymce/themes/mobile/theme.js":"tinymce/themes/mobile/theme.js","tinymce/themes/silver/theme.js":"tinymce/themes/silver/theme.js","tinymce/tinymce.js":"tinymce/tinymce.js","tinymce-rails.manifest.js":"tinymce-rails.manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js","flags/4x3/es-ca.svg":"flags/4x3/es-ca-884e8f11877dc43b5c29bbc00c6980cc57ee8e671b710b9f9d59e29927cd25d4.svg","flags/1x1/es-ca.svg":"flags/1x1/es-ca-2f61e283eeea7f76c15207644f2a8538e05a4eae39dbc8186509209773701cd9.svg","flags/4x3/xk.svg":"flags/4x3/xk-c40be9a1d1844391b275542b4a4ef7a9eecac72a93b08e7f4f2f4ebb17c7538c.svg","flags/1x1/xk.svg":"flags/1x1/xk-c5498f241b2608496ac30b7c8570d9dcd8f88432ea739ac0ca1abd7fd8beae99.svg","tinymce/icons/default/icons.js":"tinymce/icons/default/icons.js","tinymce/plugins/emoticons/js/emojiimages.js":"tinymce/plugins/emoticons/js/emojiimages.js","tinymce/skins/ui/oxide-dark/skin.shadowdom.css":"tinymce/skins/ui/oxide-dark/skin.shadowdom.css","tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css":"tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css","tinymce/skins/ui/oxide/skin.shadowdom.css":"tinymce/skins/ui/oxide/skin.shadowdom.css","tinymce/skins/ui/oxide/skin.shadowdom.min.css":"tinymce/skins/ui/oxide/skin.shadowdom.min.css","appel-web-180x60-libre-en-fete-2022.png":"appel-web-180x60-libre-en-fete-2022-02d051e0a863d530e6fc940a19720325cd3283c8067773f6c2802fafe81f5f79.png","appel-web-486x80-libre-en-fete-2022.png":"appel-web-486x80-libre-en-fete-2022-90f1d12c05449cbb3bae6d682438d4c5664771e267da331c1ac58e5a51bbc486.png","appel-web-1429x352-libre-en-fete-2022-merci.png":"appel-web-1429x352-libre-en-fete-2022-merci-10eb65847b1807928109cc9c46bb764e2d91c13a0b81a5d1a8db741176d4d76b.png","actiontext.js":"actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js","trix.js":"trix-1563ff9c10f74e143b3ded40a8458497eaf2f87a648a5cbbfebdb7dec3447a5e.js","trix.css":"trix-6fd35bb8fae1d6a795115763ca265369b9750f73a1c6283a0b0ef4b6c2d550c8.css","activestorage.js":"activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js","activestorage.esm.js":"activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js","actioncable.js":"actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js","actioncable.esm.js":"actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js","es-module-shims.js":"es-module-shims-98e5c1733b56bbd38eb81a6b95c76993d1549a149630db86b70b52ef7bf09f38.js","es-module-shims.min.js":"es-module-shims.min-8b21b40925fc92896e87358f40a2a8aaea6bf306b34ee4a215ec09c59c6cb3ba.js","es-module-shims.js.map":"es-module-shims.js-b3dc1eaec0edc72cb130edacd5193386c67b6be171383614226d986a6b991ad4.map","tinymce/langs/README.md":"tinymce/langs/README.md","tinymce/models/dom/model.js":"tinymce/models/dom/model.js","tinymce/skins/content/tinymce-5/content.css":"tinymce/skins/content/tinymce-5/content.css","tinymce/skins/content/tinymce-5/content.min.css":"tinymce/skins/content/tinymce-5/content.min.css","tinymce/skins/content/tinymce-5-dark/content.css":"tinymce/skins/content/tinymce-5-dark/content.css","tinymce/skins/content/tinymce-5-dark/content.min.css":"tinymce/skins/content/tinymce-5-dark/content.min.css","tinymce/skins/ui/tinymce-5/content.css":"tinymce/skins/ui/tinymce-5/content.css","tinymce/skins/ui/tinymce-5/content.inline.css":"tinymce/skins/ui/tinymce-5/content.inline.css","tinymce/skins/ui/tinymce-5/content.inline.min.css":"tinymce/skins/ui/tinymce-5/content.inline.min.css","tinymce/skins/ui/tinymce-5/content.min.css":"tinymce/skins/ui/tinymce-5/content.min.css","tinymce/skins/ui/tinymce-5/skin.css":"tinymce/skins/ui/tinymce-5/skin.css","tinymce/skins/ui/tinymce-5/skin.min.css":"tinymce/skins/ui/tinymce-5/skin.min.css","tinymce/skins/ui/tinymce-5/skin.shadowdom.css":"tinymce/skins/ui/tinymce-5/skin.shadowdom.css","tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css":"tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css","tinymce/skins/ui/tinymce-5-dark/content.css":"tinymce/skins/ui/tinymce-5-dark/content.css","tinymce/skins/ui/tinymce-5-dark/content.inline.css":"tinymce/skins/ui/tinymce-5-dark/content.inline.css","tinymce/skins/ui/tinymce-5-dark/content.inline.min.css":"tinymce/skins/ui/tinymce-5-dark/content.inline.min.css","tinymce/skins/ui/tinymce-5-dark/content.min.css":"tinymce/skins/ui/tinymce-5-dark/content.min.css","tinymce/skins/ui/tinymce-5-dark/skin.css":"tinymce/skins/ui/tinymce-5-dark/skin.css","tinymce/skins/ui/tinymce-5-dark/skin.min.css":"tinymce/skins/ui/tinymce-5-dark/skin.min.css","tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css":"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css","tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css":"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css","tinymce/tinymce.d.ts":"tinymce/tinymce.d.ts"}}
\ No newline at end of file
+{"files":{"modernizr-34f958b565f8b625d03a9216afe69e6819d4d0bb5eb423e48c532aab27d533b0.js":{"logical_path":"modernizr.js","mtime":"2020-04-06T16:47:39+02:00","size":51364,"digest":"34f958b565f8b625d03a9216afe69e6819d4d0bb5eb423e48c532aab27d533b0","integrity":"sha256-NPlYtWX4tiXQOpIWr+aeaBnU0LtetCPkjFMqqyfVM7A="},"active_admin/print-9ca4108e628bcfc6e44c479857ca1db74875fcc9c7966d070fe80be7bb50c98b.css":{"logical_path":"active_admin/print.css","mtime":"2020-04-06T16:47:39+02:00","size":7086,"digest":"9ca4108e628bcfc6e44c479857ca1db74875fcc9c7966d070fe80be7bb50c98b","integrity":"sha256-nKQQjmKLz8bkTEeYV8odt0h1/MnHlm0HD+gL57tQyYs="},"manifest-39627dc52fb1b4829654c355d77d306701477a489888ca0be3235350102e858f.js":{"logical_path":"manifest.js","mtime":"2020-04-06T16:47:39+02:00","size":6,"digest":"39627dc52fb1b4829654c355d77d306701477a489888ca0be3235350102e858f","integrity":"sha256-OWJ9xS+xtIKWVMNV130wZwFHekiYiMoL4yNTUBAuhY8="},"agendadescommuns-0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33.png":{"logical_path":"agendadescommuns.png","mtime":"2020-04-06T16:47:39+02:00","size":2760,"digest":"0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33","integrity":"sha256-ABe+9T9iYcs7+VLUt4DGQwc2lxSy4eLU659p39mGqzM="},"alert-762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906.png":{"logical_path":"alert.png","mtime":"2020-04-06T16:47:39+02:00","size":47876,"digest":"762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906","integrity":"sha256-dirOlHkygkOkQGE0a2TE1rmX6WPGjfxr3dnk0kEZKQY="},"baby_gnu_adl-463a81820aa2d4ffd8e7210dbce1a19ffcac67ef362aa7b092280c6f95c903fc.png":{"logical_path":"baby_gnu_adl.png","mtime":"2020-04-06T16:47:39+02:00","size":7411,"digest":"463a81820aa2d4ffd8e7210dbce1a19ffcac67ef362aa7b092280c6f95c903fc","integrity":"sha256-RjqBggqi1P/Y5yENvOGhn/ysZ+82KqewkigMb5XJA/w="},"baby_gnu_adl-97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e.svg":{"logical_path":"baby_gnu_adl.svg","mtime":"2020-04-06T16:47:39+02:00","size":109635,"digest":"97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e","integrity":"sha256-lyUQBdMiXPHVi4xJfWt5BdvJVgzIrNUBGPzOYNCiZ54="},"communs-0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33.png":{"logical_path":"communs.png","mtime":"2020-04-06T16:47:39+02:00","size":2760,"digest":"0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33","integrity":"sha256-ABe+9T9iYcs7+VLUt4DGQwc2lxSy4eLU659p39mGqzM="},"lef-small-93285d531af463f877951d63fe844a6e9600b782c2c81f78723b730072fa942e.png":{"logical_path":"lef-small.png","mtime":"2020-04-06T16:47:40+02:00","size":1059,"digest":"93285d531af463f877951d63fe844a6e9600b782c2c81f78723b730072fa942e","integrity":"sha256-kyhdUxr0Y/h3lR1j/oRKbpYAt4LCyB94cjtzAHL6lC4="},"linux-presentation-day-863b30562924505dd21841220861f83643d310e0b943a0e6a905462ddfac86f1.png":{"logical_path":"linux-presentation-day.png","mtime":"2020-04-06T16:47:39+02:00","size":9358,"digest":"863b30562924505dd21841220861f83643d310e0b943a0e6a905462ddfac86f1","integrity":"sha256-hjswVikkUF3SGEEiCGH4NkPTEOC5Q6DmqQVGLd+shvE="},"osm_logo-0e91a8acd0a92c1bf14204322322e57c65c2a7e318fec6907252fed929b7d6d3.svg":{"logical_path":"osm_logo.svg","mtime":"2020-04-06T16:47:39+02:00","size":89730,"digest":"0e91a8acd0a92c1bf14204322322e57c65c2a7e318fec6907252fed929b7d6d3","integrity":"sha256-DpGorNCpLBvxQgQyIyLlfGXCp+MY/saQclL+2Sm31tM="},"priorite-logiciel-libre-je-soutiens-april_2_m-6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc.png":{"logical_path":"priorite-logiciel-libre-je-soutiens-april_2_m.png","mtime":"2020-04-06T16:47:39+02:00","size":16952,"digest":"6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc","integrity":"sha256-ZELkVOlu1FzB68QGc6bFC9KGucKOpqi1hXLpT31kWfw="},"regions/CA-QC-70699e6a6e25c69040a3f1548b0afd829c4903ccca2760b6c10f49cc87d5d174.png":{"logical_path":"regions/CA-QC.png","mtime":"2020-04-06T16:47:40+02:00","size":469,"digest":"70699e6a6e25c69040a3f1548b0afd829c4903ccca2760b6c10f49cc87d5d174","integrity":"sha256-cGmeam4lxpBAo/FUiwr9gpxJA8zKJ2C2wQ9JzIfV0XQ="},"team-65c86021cf8a1154493664094aeafcbe3e5aa13dc675bb8ef34b220481db98fa.png":{"logical_path":"team.png","mtime":"2020-04-06T16:47:39+02:00","size":3586,"digest":"65c86021cf8a1154493664094aeafcbe3e5aa13dc675bb8ef34b220481db98fa","integrity":"sha256-ZchgIc+KEVRJNmQJSur8vj5aoT3GdbuO80siBIHbmPo="},"flags/4x3/ad-f67c4e5a3f709ead53c04d9ff35614e6c67517c3d3289170f7a317390f661497.svg":{"logical_path":"flags/4x3/ad.svg","mtime":"2020-02-08T21:52:35+01:00","size":33972,"digest":"f67c4e5a3f709ead53c04d9ff35614e6c67517c3d3289170f7a317390f661497","integrity":"sha256-9nxOWj9wnq1TwE2f81YU5sZ1F8PTKJFw96MXOQ9mFJc="},"flags/1x1/ad-a315836ec2c9dcc11ef9bfd8b18aa7ccfc2d31435cbf46a2c31930836076e09c.svg":{"logical_path":"flags/1x1/ad.svg","mtime":"2020-02-08T21:52:35+01:00","size":32745,"digest":"a315836ec2c9dcc11ef9bfd8b18aa7ccfc2d31435cbf46a2c31930836076e09c","integrity":"sha256-oxWDbsLJ3MEe+b/YsYqnzPwtMUNcv0aiwxkwg2B24Jw="},"flags/4x3/ae-7a3b3dc0f50b5310014cfbcc8200a5f1ce568127bf43452e40e8158e0cff2d2e.svg":{"logical_path":"flags/4x3/ae.svg","mtime":"2020-02-08T21:52:35+01:00","size":257,"digest":"7a3b3dc0f50b5310014cfbcc8200a5f1ce568127bf43452e40e8158e0cff2d2e","integrity":"sha256-ejs9wPULUxABTPvMggCl8c5WgSe/Q0UuQOgVjgz/LS4="},"flags/1x1/ae-bcdd9a4da09598785f3e31db4ff431e22687b2ead18209a3e615600655068cd5.svg":{"logical_path":"flags/1x1/ae.svg","mtime":"2020-02-08T21:52:35+01:00","size":265,"digest":"bcdd9a4da09598785f3e31db4ff431e22687b2ead18209a3e615600655068cd5","integrity":"sha256-vN2aTaCVmHhfPjHbT/Qx4iaHsurRggmj5hVgBlUGjNU="},"flags/4x3/af-01601b521fa86582e32c39eed8c88480afec1f801b6de929b52ed7e49da47260.svg":{"logical_path":"flags/4x3/af.svg","mtime":"2020-02-08T21:52:35+01:00","size":21279,"digest":"01601b521fa86582e32c39eed8c88480afec1f801b6de929b52ed7e49da47260","integrity":"sha256-AWAbUh+oZYLjLDnu2MiEgK/sH4AbbekptS7X5J2kcmA="},"flags/1x1/af-6332cf754a5e2866db631923e1f7cfc52a0a554d32b97bcf19f8263819e4ca7d.svg":{"logical_path":"flags/1x1/af.svg","mtime":"2020-02-08T21:52:35+01:00","size":21145,"digest":"6332cf754a5e2866db631923e1f7cfc52a0a554d32b97bcf19f8263819e4ca7d","integrity":"sha256-YzLPdUpeKGbbYxkj4ffPxSoKVU0yuXvPGfgmOBnkyn0="},"flags/4x3/ag-cb6952d821bac7855231c2cb4d1c44f7c730f6b3621518ab20f30d2b9afe604b.svg":{"logical_path":"flags/4x3/ag.svg","mtime":"2020-02-08T21:52:35+01:00","size":748,"digest":"cb6952d821bac7855231c2cb4d1c44f7c730f6b3621518ab20f30d2b9afe604b","integrity":"sha256-y2lS2CG6x4VSMcLLTRxE98cw9rNiFRirIPMNK5r+YEs="},"flags/1x1/ag-14f7d9978487aaf4446b55167e85a711c48a13ff07edac175c172969a38650c4.svg":{"logical_path":"flags/1x1/ag.svg","mtime":"2020-02-08T21:52:35+01:00","size":764,"digest":"14f7d9978487aaf4446b55167e85a711c48a13ff07edac175c172969a38650c4","integrity":"sha256-FPfZl4SHqvREa1UWfoWnEcSKE/8H7awXXBcpaaOGUMQ="},"flags/4x3/ai-f07c6cc0646fdfa441b9a506e1d46e8dce0d97b37222292e9c6733c995dc89bc.svg":{"logical_path":"flags/4x3/ai.svg","mtime":"2020-02-08T21:52:35+01:00","size":42208,"digest":"f07c6cc0646fdfa441b9a506e1d46e8dce0d97b37222292e9c6733c995dc89bc","integrity":"sha256-8HxswGRv36RBuaUG4dRujc4Nl7NyIikunGczyZXcibw="},"flags/1x1/ai-95099e544de29bcea3ba735de535823f2e19aeb4043e82dbc1d9862f9262b810.svg":{"logical_path":"flags/1x1/ai.svg","mtime":"2020-02-08T21:52:35+01:00","size":47975,"digest":"95099e544de29bcea3ba735de535823f2e19aeb4043e82dbc1d9862f9262b810","integrity":"sha256-lQmeVE3im86junNd5TWCPy4ZrrQEPoLbwdmGL5JiuBA="},"flags/4x3/al-9b997f2720de861e1b0ccec8ddf42a2890795ebf50817f9223e1ceba712c9b03.svg":{"logical_path":"flags/4x3/al.svg","mtime":"2020-02-08T21:52:35+01:00","size":3221,"digest":"9b997f2720de861e1b0ccec8ddf42a2890795ebf50817f9223e1ceba712c9b03","integrity":"sha256-m5l/JyDehh4bDM7I3fQqKJB5Xr9QgX+SI+HOunEsmwM="},"flags/1x1/al-94852d2711fc23abf3423534b9edb950a0c6aabf1d2d98bf2643f3c7dadfac09.svg":{"logical_path":"flags/1x1/al.svg","mtime":"2020-02-08T21:52:35+01:00","size":3228,"digest":"94852d2711fc23abf3423534b9edb950a0c6aabf1d2d98bf2643f3c7dadfac09","integrity":"sha256-lIUtJxH8I6vzQjU0ue25UKDGqr8dLZi/JkPzx9rfrAk="},"flags/4x3/am-85a199ec21d1af74a256335ead0c1e38592bb603d8da81feda4678945e9e00e6.svg":{"logical_path":"flags/4x3/am.svg","mtime":"2020-02-08T21:52:35+01:00","size":226,"digest":"85a199ec21d1af74a256335ead0c1e38592bb603d8da81feda4678945e9e00e6","integrity":"sha256-haGZ7CHRr3SiVjNerQweOFkrtgPY2oH+2kZ4lF6eAOY="},"flags/1x1/am-869391b014ac299924d30777d72a4aba430752177290a90a1fc3255a7ad79ee7.svg":{"logical_path":"flags/1x1/am.svg","mtime":"2020-02-08T21:52:35+01:00","size":234,"digest":"869391b014ac299924d30777d72a4aba430752177290a90a1fc3255a7ad79ee7","integrity":"sha256-hpORsBSsKZkk0wd31ypKukMHUhdykKkKH8MlWnrXnuc="},"flags/4x3/ao-29224a61bf632826d530cda55d87c2615884bd2c2c3a322036ed468e34d85c75.svg":{"logical_path":"flags/4x3/ao.svg","mtime":"2020-02-08T21:52:35+01:00","size":1608,"digest":"29224a61bf632826d530cda55d87c2615884bd2c2c3a322036ed468e34d85c75","integrity":"sha256-KSJKYb9jKCbVMM2lXYfCYViEvSwsOjIgNu1GjjTYXHU="},"flags/1x1/ao-048eacbc862fe1868cf0ec73457b70a8b49a598c80dea049856f0e1fd6fec83e.svg":{"logical_path":"flags/1x1/ao.svg","mtime":"2020-02-08T21:52:35+01:00","size":1608,"digest":"048eacbc862fe1868cf0ec73457b70a8b49a598c80dea049856f0e1fd6fec83e","integrity":"sha256-BI6svIYv4YaM8OxzRXtwqLSaWYyA3qBJhW8OH9b+yD4="},"flags/4x3/aq-b401a776d2f1a7944170114f0aeeceab5e1d962df3de7ed1eff47d96824b73fd.svg":{"logical_path":"flags/4x3/aq.svg","mtime":"2020-02-08T21:52:35+01:00","size":2974,"digest":"b401a776d2f1a7944170114f0aeeceab5e1d962df3de7ed1eff47d96824b73fd","integrity":"sha256-tAGndtLxp5RBcBFPCu7Oq14dli3z3n7R7/R9loJLc/0="},"flags/1x1/aq-a8d7ce9bfb860b6e2b58608b50bf2cafc5220c77f6d049ab7770891f64334531.svg":{"logical_path":"flags/1x1/aq.svg","mtime":"2020-02-08T21:52:35+01:00","size":3183,"digest":"a8d7ce9bfb860b6e2b58608b50bf2cafc5220c77f6d049ab7770891f64334531","integrity":"sha256-qNfOm/uGC24rWGCLUL8sr8UiDHf20Emrd3CJH2QzRTE="},"flags/4x3/ar-bf73475bb707100874dec538ce4b7e1b5afc4ed67dc50a8a800ee519e51cc826.svg":{"logical_path":"flags/4x3/ar.svg","mtime":"2020-02-08T21:52:35+01:00","size":3430,"digest":"bf73475bb707100874dec538ce4b7e1b5afc4ed67dc50a8a800ee519e51cc826","integrity":"sha256-v3NHW7cHEAh03sU4zkt+G1r8TtZ9xQqKgA7lGeUcyCY="},"flags/1x1/ar-fc6582cc6d3ef0782805d8497ee77ab2d836c53422e91007e48f81a4a9fa2e60.svg":{"logical_path":"flags/1x1/ar.svg","mtime":"2020-02-08T21:52:35+01:00","size":3503,"digest":"fc6582cc6d3ef0782805d8497ee77ab2d836c53422e91007e48f81a4a9fa2e60","integrity":"sha256-/GWCzG0+8HgoBdhJfud6stg2xTQi6RAH5I+BpKn6LmA="},"flags/4x3/as-79d395190345206ea03475b67b44638e1111562411504b60646483c9c0b0f7d1.svg":{"logical_path":"flags/4x3/as.svg","mtime":"2020-02-08T21:52:35+01:00","size":8098,"digest":"79d395190345206ea03475b67b44638e1111562411504b60646483c9c0b0f7d1","integrity":"sha256-edOVGQNFIG6gNHW2e0RjjhERViQRUEtgZGSDycCw99E="},"flags/1x1/as-04f0db77c5d8610a55c69508b226a7c338924f8cf7d6577d5d6590e85ee57183.svg":{"logical_path":"flags/1x1/as.svg","mtime":"2020-02-08T21:52:35+01:00","size":7845,"digest":"04f0db77c5d8610a55c69508b226a7c338924f8cf7d6577d5d6590e85ee57183","integrity":"sha256-BPDbd8XYYQpVxpUIsianwziST4z31ld9XWWQ6F7lcYM="},"flags/4x3/at-3d197de8f1f0096a2b0d440b6fc7d80821585a6637e646c05487a87718bf6b5f.svg":{"logical_path":"flags/4x3/at.svg","mtime":"2020-02-08T21:52:35+01:00","size":243,"digest":"3d197de8f1f0096a2b0d440b6fc7d80821585a6637e646c05487a87718bf6b5f","integrity":"sha256-PRl96PHwCWorDUQLb8fYCCFYWmY35kbAVIeodxi/a18="},"flags/1x1/at-ec4db9aeac793827ac7c8e40c072a76f7675010058cc8c8dfd3a86bb5acfa6b8.svg":{"logical_path":"flags/1x1/at.svg","mtime":"2020-02-08T21:52:35+01:00","size":245,"digest":"ec4db9aeac793827ac7c8e40c072a76f7675010058cc8c8dfd3a86bb5acfa6b8","integrity":"sha256-7E25rqx5OCesfI5AwHKnb3Z1AQBYzIyN/TqGu1rPprg="},"flags/4x3/au-126fa2500a315287a5f847f4d958bb929f11da9b39f35912cc440c0fcffb8b12.svg":{"logical_path":"flags/4x3/au.svg","mtime":"2020-02-08T21:52:35+01:00","size":1335,"digest":"126fa2500a315287a5f847f4d958bb929f11da9b39f35912cc440c0fcffb8b12","integrity":"sha256-Em+iUAoxUoel+Ef02Vi7kp8R2ps581kSzEQMD8/7ixI="},"flags/1x1/au-bf990dcc957c9f74eb908e8ffa733f1731277bf6ec8b7301a6ea1ed92b59cc4b.svg":{"logical_path":"flags/1x1/au.svg","mtime":"2020-02-08T21:52:35+01:00","size":1320,"digest":"bf990dcc957c9f74eb908e8ffa733f1731277bf6ec8b7301a6ea1ed92b59cc4b","integrity":"sha256-v5kNzJV8n3TrkI6P+nM/FzEne/bsi3MBpuoe2StZzEs="},"flags/4x3/aw-4524643452423e95f3b0dbe6216b059a9e52126b34c73ae4b3c17b682f893aa6.svg":{"logical_path":"flags/4x3/aw.svg","mtime":"2020-02-08T21:52:35+01:00","size":9948,"digest":"4524643452423e95f3b0dbe6216b059a9e52126b34c73ae4b3c17b682f893aa6","integrity":"sha256-RSRkNFJCPpXzsNvmIWsFmp5SEms0xzrks8F7aC+JOqY="},"flags/1x1/aw-f7002bceef55486a442bf6bf433be0c60d0b15b2aa548b81c524c67ccf0565a8.svg":{"logical_path":"flags/1x1/aw.svg","mtime":"2020-02-08T21:52:35+01:00","size":12088,"digest":"f7002bceef55486a442bf6bf433be0c60d0b15b2aa548b81c524c67ccf0565a8","integrity":"sha256-9wArzu9VSGpEK/a/Qzvgxg0LFbKqVIuBxSTGfM8FZag="},"flags/4x3/ax-c297e0eb654ca62e58f5eb3abb70df9f245e4919490f29bd0f1d49c4fe052d90.svg":{"logical_path":"flags/4x3/ax.svg","mtime":"2020-02-08T21:52:35+01:00","size":556,"digest":"c297e0eb654ca62e58f5eb3abb70df9f245e4919490f29bd0f1d49c4fe052d90","integrity":"sha256-wpfg62VMpi5Y9es6u3DfnyReSRlJDym9Dx1JxP4FLZA="},"flags/1x1/ax-a1245689ecbf321c0a9e556bba17f3c9f2aeb8b1f63d14fcb591d76a87f12880.svg":{"logical_path":"flags/1x1/ax.svg","mtime":"2020-02-08T21:52:35+01:00","size":544,"digest":"a1245689ecbf321c0a9e556bba17f3c9f2aeb8b1f63d14fcb591d76a87f12880","integrity":"sha256-oSRWiey/MhwKnlVruhfzyfKuuLH2PRT8tZHXaofxKIA="},"flags/4x3/az-132e68d5e0386d3b9fa05b4288a0fd66f1414e2bc7af6b9d437b6935a7dfa00c.svg":{"logical_path":"flags/4x3/az.svg","mtime":"2020-02-08T21:52:35+01:00","size":515,"digest":"132e68d5e0386d3b9fa05b4288a0fd66f1414e2bc7af6b9d437b6935a7dfa00c","integrity":"sha256-Ey5o1eA4bTufoFtCiKD9ZvFBTivHr2udQ3tpNaffoAw="},"flags/1x1/az-3990c0526b933bd650285d821f2b93e432a73ba709869549b8ef75b051d3bd2d.svg":{"logical_path":"flags/1x1/az.svg","mtime":"2020-02-08T21:52:35+01:00","size":501,"digest":"3990c0526b933bd650285d821f2b93e432a73ba709869549b8ef75b051d3bd2d","integrity":"sha256-OZDAUmuTO9ZQKF2CHyuT5DKnO6cJhpVJuO91sFHTvS0="},"flags/4x3/ba-89dd0c1600d94741de7d667a487310193a0c48c4cf1a5159c3bf9dd37d65d2b5.svg":{"logical_path":"flags/4x3/ba.svg","mtime":"2020-02-08T21:52:35+01:00","size":1306,"digest":"89dd0c1600d94741de7d667a487310193a0c48c4cf1a5159c3bf9dd37d65d2b5","integrity":"sha256-id0MFgDZR0HefWZ6SHMQGToMSMTPGlFZw7+d031l0rU="},"flags/1x1/ba-2dbe90eb12b937f4a9ae8db95760930a3e318f4ce5829ac05e292ead698bae5a.svg":{"logical_path":"flags/1x1/ba.svg","mtime":"2020-02-08T21:52:35+01:00","size":1247,"digest":"2dbe90eb12b937f4a9ae8db95760930a3e318f4ce5829ac05e292ead698bae5a","integrity":"sha256-Lb6Q6xK5N/Spro25V2CTCj4xj0zlgprAXikurWmLrlo="},"flags/4x3/bb-16f8249ff958bfbc18fb1f23a5282000347bffdb5769ac620966185b1dcb57f6.svg":{"logical_path":"flags/4x3/bb.svg","mtime":"2020-02-08T21:52:35+01:00","size":613,"digest":"16f8249ff958bfbc18fb1f23a5282000347bffdb5769ac620966185b1dcb57f6","integrity":"sha256-Fvgkn/lYv7wY+x8jpSggADR7/9tXaaxiCWYYWx3LV/Y="},"flags/1x1/bb-fae92d8426196ae24ffa561aca72613fae651a5e9c0bcda63ecc877add05b060.svg":{"logical_path":"flags/1x1/bb.svg","mtime":"2020-02-08T21:52:35+01:00","size":616,"digest":"fae92d8426196ae24ffa561aca72613fae651a5e9c0bcda63ecc877add05b060","integrity":"sha256-+ukthCYZauJP+lYaynJhP65lGl6cC82mPsyHet0FsGA="},"flags/4x3/bd-8dac0547e73ee25a04148a3f0fd026a90e56c23b7e92921565d4263050ba77a6.svg":{"logical_path":"flags/4x3/bd.svg","mtime":"2020-02-08T21:52:35+01:00","size":193,"digest":"8dac0547e73ee25a04148a3f0fd026a90e56c23b7e92921565d4263050ba77a6","integrity":"sha256-jawFR+c+4loEFIo/D9AmqQ5Wwjt+kpIVZdQmMFC6d6Y="},"flags/1x1/bd-ecc3c3e87d4cc59c8350f2b4d7dca8f5cf46bdb26319db0ee80b744482af50c1.svg":{"logical_path":"flags/1x1/bd.svg","mtime":"2020-02-08T21:52:35+01:00","size":195,"digest":"ecc3c3e87d4cc59c8350f2b4d7dca8f5cf46bdb26319db0ee80b744482af50c1","integrity":"sha256-7MPD6H1MxZyDUPK019yo9c9GvbJjGdsO6At0RIKvUME="},"flags/4x3/be-a180ca68521188017bb5367f19e503d9599d6cbecd61bf054e59a57f58e648ae.svg":{"logical_path":"flags/4x3/be.svg","mtime":"2020-02-08T21:52:35+01:00","size":293,"digest":"a180ca68521188017bb5367f19e503d9599d6cbecd61bf054e59a57f58e648ae","integrity":"sha256-oYDKaFIRiAF7tTZ/GeUD2VmdbL7NYb8FTlmlf1jmSK4="},"flags/1x1/be-c8d4194137bd01955285b329dfdf996490d16c3116a92ce2f322e354b6d7494e.svg":{"logical_path":"flags/1x1/be.svg","mtime":"2020-02-08T21:52:35+01:00","size":293,"digest":"c8d4194137bd01955285b329dfdf996490d16c3116a92ce2f322e354b6d7494e","integrity":"sha256-yNQZQTe9AZVShbMp39+ZZJDRbDEWqSzi8yLjVLbXSU4="},"flags/4x3/bf-6b214936ef89f19133d4a84e99cdf0cfdb99d6409f2f373f6d18694423013313.svg":{"logical_path":"flags/4x3/bf.svg","mtime":"2020-02-08T21:52:35+01:00","size":360,"digest":"6b214936ef89f19133d4a84e99cdf0cfdb99d6409f2f373f6d18694423013313","integrity":"sha256-ayFJNu+J8ZEz1KhOmc3wz9uZ1kCfLzc/bRhpRCMBMxM="},"flags/1x1/bf-04c7d61aa314adab5a41bd79d77aa780c10136bb6b8f4c62423e61e23e3851ee.svg":{"logical_path":"flags/1x1/bf.svg","mtime":"2020-02-08T21:52:35+01:00","size":386,"digest":"04c7d61aa314adab5a41bd79d77aa780c10136bb6b8f4c62423e61e23e3851ee","integrity":"sha256-BMfWGqMUrataQb1513qngMEBNrtrj0xiQj5h4j44Ue4="},"flags/4x3/bg-dd3985ba746942b0e65bc52a280cc4d28fb24fd2c7d9e22ac9afd2d75ee7bfc4.svg":{"logical_path":"flags/4x3/bg.svg","mtime":"2020-02-08T21:52:35+01:00","size":289,"digest":"dd3985ba746942b0e65bc52a280cc4d28fb24fd2c7d9e22ac9afd2d75ee7bfc4","integrity":"sha256-3TmFunRpQrDmW8UqKAzE0o+yT9LH2eIqya/S117nv8Q="},"flags/1x1/bg-f59294a736d5bdc0f102b58d70dbe45d02bd92df822820bf95336840f75a0746.svg":{"logical_path":"flags/1x1/bg.svg","mtime":"2020-02-08T21:52:35+01:00","size":297,"digest":"f59294a736d5bdc0f102b58d70dbe45d02bd92df822820bf95336840f75a0746","integrity":"sha256-9ZKUpzbVvcDxArWNcNvkXQK9kt+CKCC/lTNoQPdaB0Y="},"flags/4x3/bh-7c82c4a6ba963172c6c1b4423f39a0ebe9c999449cc7dd87018917943db4735c.svg":{"logical_path":"flags/4x3/bh.svg","mtime":"2020-02-08T21:52:35+01:00","size":546,"digest":"7c82c4a6ba963172c6c1b4423f39a0ebe9c999449cc7dd87018917943db4735c","integrity":"sha256-fILEprqWMXLGwbRCPzmg6+nJmUScx92HAYkXlD20c1w="},"flags/1x1/bh-6893aac3e55c6480e9dac0c023ec2179f6c12a0da82a0bc2717134384c097e88.svg":{"logical_path":"flags/1x1/bh.svg","mtime":"2020-02-08T21:52:35+01:00","size":572,"digest":"6893aac3e55c6480e9dac0c023ec2179f6c12a0da82a0bc2717134384c097e88","integrity":"sha256-aJOqw+VcZIDp2sDAI+whefbBKg2oKgvCcXE0OEwJfog="},"flags/4x3/bi-4fcd0116f7f93c0564c6955806f3c3563d0ea7334ae406f29a897255845c923c.svg":{"logical_path":"flags/4x3/bi.svg","mtime":"2020-02-08T21:52:35+01:00","size":1074,"digest":"4fcd0116f7f93c0564c6955806f3c3563d0ea7334ae406f29a897255845c923c","integrity":"sha256-T80BFvf5PAVkxpVYBvPDVj0OpzNK5AbymolyVYRckjw="},"flags/1x1/bi-91c34eb431b26be67852782a0b93e1d7d577a925454d6c8cea00a0d872d2de8a.svg":{"logical_path":"flags/1x1/bi.svg","mtime":"2020-02-08T21:52:35+01:00","size":1048,"digest":"91c34eb431b26be67852782a0b93e1d7d577a925454d6c8cea00a0d872d2de8a","integrity":"sha256-kcNOtDGya+Z4UngqC5Ph19V3qSVFTWyM6gCg2HLS3oo="},"flags/4x3/bj-63bddb4268f5f8c2ed867041bcf058fb18fcd9d1e0799e01286fca2d5e961c7f.svg":{"logical_path":"flags/4x3/bj.svg","mtime":"2020-02-08T21:52:35+01:00","size":499,"digest":"63bddb4268f5f8c2ed867041bcf058fb18fcd9d1e0799e01286fca2d5e961c7f","integrity":"sha256-Y73bQmj1+MLthnBBvPBY+xj82dHgeZ4BKG/KLV6WHH8="},"flags/1x1/bj-e2606c5a8498c474a6b6708626b88108fcb73840344766566dc56f804279cdfc.svg":{"logical_path":"flags/1x1/bj.svg","mtime":"2020-02-08T21:52:35+01:00","size":502,"digest":"e2606c5a8498c474a6b6708626b88108fcb73840344766566dc56f804279cdfc","integrity":"sha256-4mBsWoSYxHSmtnCGJriBCPy3OEA0R2ZWbcVvgEJ5zfw="},"flags/4x3/bl-824a7265f48789d5e1ad5c5b0042a13a7d2d4357210e5bd8124fca19931e8c74.svg":{"logical_path":"flags/4x3/bl.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"824a7265f48789d5e1ad5c5b0042a13a7d2d4357210e5bd8124fca19931e8c74","integrity":"sha256-gkpyZfSHidXhrVxbAEKhOn0tQ1chDlvYEk/KGZMejHQ="},"flags/1x1/bl-ba6a7881b0ca72ac57aee4d823ae611ab4ad24a938ee9e01a7a4d5ae04cfccf6.svg":{"logical_path":"flags/1x1/bl.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"ba6a7881b0ca72ac57aee4d823ae611ab4ad24a938ee9e01a7a4d5ae04cfccf6","integrity":"sha256-ump4gbDKcqxXruTYI65hGrStJKk47p4Bp6TVrgTPzPY="},"flags/4x3/bm-2e2f09e5a4edf4b18afff581656f50b0b4c37783db29591ff00ca768f7f755bc.svg":{"logical_path":"flags/4x3/bm.svg","mtime":"2020-02-08T21:52:35+01:00","size":22650,"digest":"2e2f09e5a4edf4b18afff581656f50b0b4c37783db29591ff00ca768f7f755bc","integrity":"sha256-Li8J5aTt9LGK//WBZW9QsLTDd4PbKVkf8AynaPf3Vbw="},"flags/1x1/bm-f553f953f8784ea4d67a5197f5d808a67747eb8a1cb56990d6838e690090d2d6.svg":{"logical_path":"flags/1x1/bm.svg","mtime":"2020-02-08T21:52:35+01:00","size":22337,"digest":"f553f953f8784ea4d67a5197f5d808a67747eb8a1cb56990d6838e690090d2d6","integrity":"sha256-9VP5U/h4TqTWelGX9dgIpndH64octWmQ1oOOaQCQ0tY="},"flags/4x3/bn-bcf9967c12eb6397346cb5b960ae92efa41f314f780d09a3d7c81f5dacac4180.svg":{"logical_path":"flags/4x3/bn.svg","mtime":"2020-02-08T21:52:35+01:00","size":14387,"digest":"bcf9967c12eb6397346cb5b960ae92efa41f314f780d09a3d7c81f5dacac4180","integrity":"sha256-vPmWfBLrY5c0bLW5YK6S76QfMU94DQmj18gfXaysQYA="},"flags/1x1/bn-1d1aad3fe9fd33ce922eba33c9ae6047a5646349239c20d1bc7307ec6d19a043.svg":{"logical_path":"flags/1x1/bn.svg","mtime":"2020-02-08T21:52:35+01:00","size":14521,"digest":"1d1aad3fe9fd33ce922eba33c9ae6047a5646349239c20d1bc7307ec6d19a043","integrity":"sha256-HRqtP+n9M86SLrozya5gR6VkY0kjnCDRvHMH7G0ZoEM="},"flags/4x3/bo-fa423f2bb4ab6e8e9dd399ad73781ea8d9cbafd30f1b7ee0bcecfb9e7b75581e.svg":{"logical_path":"flags/4x3/bo.svg","mtime":"2020-02-08T21:52:35+01:00","size":118272,"digest":"fa423f2bb4ab6e8e9dd399ad73781ea8d9cbafd30f1b7ee0bcecfb9e7b75581e","integrity":"sha256-+kI/K7Srbo6d05mtc3geqNnLr9MPG37gvOz7nnt1WB4="},"flags/1x1/bo-f5faa29e40191e0c76070ac1a1d2a1f2b18e9cd358b8a77cefaed8efc49a265e.svg":{"logical_path":"flags/1x1/bo.svg","mtime":"2020-02-08T21:52:35+01:00","size":119850,"digest":"f5faa29e40191e0c76070ac1a1d2a1f2b18e9cd358b8a77cefaed8efc49a265e","integrity":"sha256-9fqinkAZHgx2BwrBodKh8rGOnNNYuKd8767Y78SaJl4="},"flags/4x3/bq-493c92ab19204c3ad319e6caba021df050132b99bd57a8f9b74131b78229c29e.svg":{"logical_path":"flags/4x3/bq.svg","mtime":"2020-02-08T21:52:35+01:00","size":227,"digest":"493c92ab19204c3ad319e6caba021df050132b99bd57a8f9b74131b78229c29e","integrity":"sha256-STySqxkgTDrTGebKugId8FATK5m9V6j5t0Ext4Ipwp4="},"flags/1x1/bq-6e30bbeabc2aa097f657a411984b3c23278a8fcce2fc016b1cd6d2262f672d33.svg":{"logical_path":"flags/1x1/bq.svg","mtime":"2020-02-08T21:52:35+01:00","size":231,"digest":"6e30bbeabc2aa097f657a411984b3c23278a8fcce2fc016b1cd6d2262f672d33","integrity":"sha256-bjC76rwqoJf2V6QRmEs8IyeKj8zi/AFrHNbSJi9nLTM="},"flags/4x3/br-cf3ba80ec2c9fd4d3c845c3a3c43a2b9d81cf90707a2918789e8b1f596833e01.svg":{"logical_path":"flags/4x3/br.svg","mtime":"2020-02-08T21:52:35+01:00","size":8244,"digest":"cf3ba80ec2c9fd4d3c845c3a3c43a2b9d81cf90707a2918789e8b1f596833e01","integrity":"sha256-zzuoDsLJ/U08hFw6PEOiudgc+QcHopGHieix9ZaDPgE="},"flags/1x1/br-7bf4e4b31650ac25f0bc6c86eb87491a7e5a8eac13acccfcbde44346c88728f6.svg":{"logical_path":"flags/1x1/br.svg","mtime":"2020-02-08T21:52:35+01:00","size":7852,"digest":"7bf4e4b31650ac25f0bc6c86eb87491a7e5a8eac13acccfcbde44346c88728f6","integrity":"sha256-e/TksxZQrCXwvGyG64dJGn5ajqwTrMz8veRDRsiHKPY="},"flags/4x3/bs-69f60b5fea96b67dd939e597099994921bb3dc3bcf31b8dee7cc45be2885c836.svg":{"logical_path":"flags/4x3/bs.svg","mtime":"2020-02-08T21:52:35+01:00","size":549,"digest":"69f60b5fea96b67dd939e597099994921bb3dc3bcf31b8dee7cc45be2885c836","integrity":"sha256-afYLX+qWtn3ZOeWXCZmUkhuz3DvPMbje58xFviiFyDY="},"flags/1x1/bs-f5d6acf7ef7a240dc09ac88710fd77fd3494501104392db74d5c540d482f2262.svg":{"logical_path":"flags/1x1/bs.svg","mtime":"2020-02-08T21:52:35+01:00","size":571,"digest":"f5d6acf7ef7a240dc09ac88710fd77fd3494501104392db74d5c540d482f2262","integrity":"sha256-9das9+96JA3AmsiHEP13/TSUUBEEOS23TVxUDUgvImI="},"flags/4x3/bt-6c20b0c00e12d5898be0239a0c66ce775debd0bd536de56a271859a0285a039e.svg":{"logical_path":"flags/4x3/bt.svg","mtime":"2020-02-08T21:52:35+01:00","size":25345,"digest":"6c20b0c00e12d5898be0239a0c66ce775debd0bd536de56a271859a0285a039e","integrity":"sha256-bCCwwA4S1YmL4COaDGbOd13r0L1TbeVqJxhZoChaA54="},"flags/1x1/bt-58de3ca9438811ef1920e2f84c4ba4ce32d01069f4d197ab5d577de6acbe0c85.svg":{"logical_path":"flags/1x1/bt.svg","mtime":"2020-02-08T21:52:35+01:00","size":25172,"digest":"58de3ca9438811ef1920e2f84c4ba4ce32d01069f4d197ab5d577de6acbe0c85","integrity":"sha256-WN48qUOIEe8ZIOL4TEukzjLQEGn00ZerXVd95qy+DIU="},"flags/4x3/bv-ff173190fc339b3cb8b6e8235bc5e373853d7127fd94cbc32ac737e839aeb586.svg":{"logical_path":"flags/4x3/bv.svg","mtime":"2020-02-08T21:52:35+01:00","size":582,"digest":"ff173190fc339b3cb8b6e8235bc5e373853d7127fd94cbc32ac737e839aeb586","integrity":"sha256-/xcxkPwzmzy4tugjW8Xjc4U9cSf9lMvDKsc36DmutYY="},"flags/1x1/bv-59616ff1a722959064c83927ca2e49c1fce42a9b18e91b9ecbb74f62527aff43.svg":{"logical_path":"flags/1x1/bv.svg","mtime":"2020-02-08T21:52:35+01:00","size":585,"digest":"59616ff1a722959064c83927ca2e49c1fce42a9b18e91b9ecbb74f62527aff43","integrity":"sha256-WWFv8acilZBkyDknyi5JwfzkKpsY6Ruey7dPYlJ6/0M="},"flags/4x3/bw-4bb1d3131b88c65b5decc67f7b44903e931bca2fcac841942591c599f0cbb850.svg":{"logical_path":"flags/4x3/bw.svg","mtime":"2020-02-08T21:52:35+01:00","size":255,"digest":"4bb1d3131b88c65b5decc67f7b44903e931bca2fcac841942591c599f0cbb850","integrity":"sha256-S7HTExuIxltd7MZ/e0SQPpMbyi/KyEGUJZHFmfDLuFA="},"flags/1x1/bw-e08f50c0836ca5858aed7b0526aed6fb630da8dc6b6b96bd9a476af599dc89d6.svg":{"logical_path":"flags/1x1/bw.svg","mtime":"2020-02-08T21:52:35+01:00","size":257,"digest":"e08f50c0836ca5858aed7b0526aed6fb630da8dc6b6b96bd9a476af599dc89d6","integrity":"sha256-4I9QwINspYWK7XsFJq7W+2MNqNxra5a9mkdq9ZncidY="},"flags/4x3/by-324ac96bfbe075781c664be3b9e2ac6b4d2a46dd2b418ca0920284f64394c7d4.svg":{"logical_path":"flags/4x3/by.svg","mtime":"2020-02-08T21:52:35+01:00","size":5998,"digest":"324ac96bfbe075781c664be3b9e2ac6b4d2a46dd2b418ca0920284f64394c7d4","integrity":"sha256-MkrJa/vgdXgcZkvjueKsa00qRt0rQYygkgKE9kOUx9Q="},"flags/1x1/by-37b80e8bf7e51fef99a8307d6dffb04ee164790ceeafef606d516ca333e9488a.svg":{"logical_path":"flags/1x1/by.svg","mtime":"2020-02-08T21:52:35+01:00","size":6105,"digest":"37b80e8bf7e51fef99a8307d6dffb04ee164790ceeafef606d516ca333e9488a","integrity":"sha256-N7gOi/flH++ZqDB9bf+wTuFkeQzur+9gbVFsozPpSIo="},"flags/4x3/bz-156fdc45f8c15c9520a1ea9fc0f395f294f02077408ea1938c222a37cfbb7f1d.svg":{"logical_path":"flags/4x3/bz.svg","mtime":"2020-02-08T21:52:35+01:00","size":46916,"digest":"156fdc45f8c15c9520a1ea9fc0f395f294f02077408ea1938c222a37cfbb7f1d","integrity":"sha256-FW/cRfjBXJUgoeqfwPOV8pTwIHdAjqGTjCIqN8+7fx0="},"flags/1x1/bz-24577d4e7b29b33ab3b1d37914c8479889baa7e8c8399c6d1c99faed31ab053a.svg":{"logical_path":"flags/1x1/bz.svg","mtime":"2020-02-08T21:52:35+01:00","size":47160,"digest":"24577d4e7b29b33ab3b1d37914c8479889baa7e8c8399c6d1c99faed31ab053a","integrity":"sha256-JFd9TnspszqzsdN5FMhHmIm6p+jIOZxtHJn67TGrBTo="},"flags/4x3/ca-0d57cab46d5dbb0012a5e4ae0a9efee3baee90d5d157950a6c5d67edf2daa58f.svg":{"logical_path":"flags/4x3/ca.svg","mtime":"2020-02-08T21:52:35+01:00","size":731,"digest":"0d57cab46d5dbb0012a5e4ae0a9efee3baee90d5d157950a6c5d67edf2daa58f","integrity":"sha256-DVfKtG1duwASpeSuCp7+47rukNXRV5UKbF1n7fLapY8="},"flags/1x1/ca-192a6fb0544e5a6f33a32149d62f1e7ac0a1d61c5c5afa57f3a42346ca8e8c90.svg":{"logical_path":"flags/1x1/ca.svg","mtime":"2020-02-08T21:52:35+01:00","size":712,"digest":"192a6fb0544e5a6f33a32149d62f1e7ac0a1d61c5c5afa57f3a42346ca8e8c90","integrity":"sha256-GSpvsFROWm8zoyFJ1i8eesCh1hxcWvpX86QjRsqOjJA="},"flags/4x3/cc-a35f2a9e10a28d6918ced65e0623b03bb2fbf1f20670b581bc0a409d33b4e843.svg":{"logical_path":"flags/4x3/cc.svg","mtime":"2020-02-08T21:52:35+01:00","size":3144,"digest":"a35f2a9e10a28d6918ced65e0623b03bb2fbf1f20670b581bc0a409d33b4e843","integrity":"sha256-o18qnhCijWkYztZeBiOwO7L78fIGcLWBvApAnTO06EM="},"flags/1x1/cc-d2025eefc9d30f724f3fcd95c0fd9f7938930ecb01af7e0cd6ee6553d7358eb6.svg":{"logical_path":"flags/1x1/cc.svg","mtime":"2020-02-08T21:52:35+01:00","size":3092,"digest":"d2025eefc9d30f724f3fcd95c0fd9f7938930ecb01af7e0cd6ee6553d7358eb6","integrity":"sha256-0gJe78nTD3JPP82VwP2feTiTDssBr34M1u5lU9c1jrY="},"flags/4x3/cd-5d2127c991b30522ae0a29d05facbc88728c050d7e333a60d614af1545459c5c.svg":{"logical_path":"flags/4x3/cd.svg","mtime":"2020-02-08T21:52:35+01:00","size":352,"digest":"5d2127c991b30522ae0a29d05facbc88728c050d7e333a60d614af1545459c5c","integrity":"sha256-XSEnyZGzBSKuCinQX6y8iHKMBQ1+Mzpg1hSvFUVFnFw="},"flags/1x1/cd-59dacf424d1c8c779db66c5b7f2a93a3c8f14976c2975ccfb07639676a1602e3.svg":{"logical_path":"flags/1x1/cd.svg","mtime":"2020-02-08T21:52:35+01:00","size":510,"digest":"59dacf424d1c8c779db66c5b7f2a93a3c8f14976c2975ccfb07639676a1602e3","integrity":"sha256-WdrPQk0cjHedtmxbfyqTo8jxSXbCl1zPsHY5Z2oWAuM="},"flags/4x3/cf-ac0aaffba354d848eba2501a402ee81dc96a56ad0acd3741ec9905e76c372e1e.svg":{"logical_path":"flags/4x3/cf.svg","mtime":"2020-02-08T21:52:35+01:00","size":689,"digest":"ac0aaffba354d848eba2501a402ee81dc96a56ad0acd3741ec9905e76c372e1e","integrity":"sha256-rAqv+6NU2EjrolAaQC7oHclqVq0KzTdB7JkF52w3Lh4="},"flags/1x1/cf-e637674faf7edcdad37182192d038448c157421ab0c69377d9b8e56ab2c0249d.svg":{"logical_path":"flags/1x1/cf.svg","mtime":"2020-02-08T21:52:35+01:00","size":635,"digest":"e637674faf7edcdad37182192d038448c157421ab0c69377d9b8e56ab2c0249d","integrity":"sha256-5jdnT69+3NrTcYIZLQOESMFXQhqwxpN32bjlarLAJJ0="},"flags/4x3/cg-3729f717c83c9df7d0543a1a5d4a506efe184bdfeb39f9260b4b63edf19d2538.svg":{"logical_path":"flags/4x3/cg.svg","mtime":"2020-02-08T21:52:35+01:00","size":484,"digest":"3729f717c83c9df7d0543a1a5d4a506efe184bdfeb39f9260b4b63edf19d2538","integrity":"sha256-Nyn3F8g8nffQVDoaXUpQbv4YS9/rOfkmC0tj7fGdJTg="},"flags/1x1/cg-8353ff1f251714b1b8905eec1722378426719955d0637d206d35d1dcfa68ddcf.svg":{"logical_path":"flags/1x1/cg.svg","mtime":"2020-02-08T21:52:35+01:00","size":472,"digest":"8353ff1f251714b1b8905eec1722378426719955d0637d206d35d1dcfa68ddcf","integrity":"sha256-g1P/HyUXFLG4kF7sFyI3hCZxmVXQY30gbTXR3Ppo3c8="},"flags/4x3/ch-6739edee6d1ef72c4ed97cfe723d3bb7f17e4df5390f3a4ae234f1ffdeece0cf.svg":{"logical_path":"flags/4x3/ch.svg","mtime":"2020-02-08T21:52:35+01:00","size":300,"digest":"6739edee6d1ef72c4ed97cfe723d3bb7f17e4df5390f3a4ae234f1ffdeece0cf","integrity":"sha256-Zznt7m0e9yxO2Xz+cj07t/F+TfU5DzpK4jTx/97s4M8="},"flags/1x1/ch-7c3dec465228981c57a90a3a7b3a6c42dd3e699230663e770b55008ce6d14208.svg":{"logical_path":"flags/1x1/ch.svg","mtime":"2020-02-08T21:52:35+01:00","size":298,"digest":"7c3dec465228981c57a90a3a7b3a6c42dd3e699230663e770b55008ce6d14208","integrity":"sha256-fD3sRlIomBxXqQo6ezpsQt0+aZIwZj53C1UAjObRQgg="},"flags/4x3/ci-3e076d13c9524149508c442f8f727424660124e3591280d8ae9bddf9d8272a1e.svg":{"logical_path":"flags/4x3/ci.svg","mtime":"2020-02-08T21:52:35+01:00","size":283,"digest":"3e076d13c9524149508c442f8f727424660124e3591280d8ae9bddf9d8272a1e","integrity":"sha256-PgdtE8lSQUlQjEQvj3J0JGYBJONZEoDYrpvd+dgnKh4="},"flags/1x1/ci-691a0a8577b7d555fc90dc7170adc9ec7571191cb3507c46c0e8516fd1778a91.svg":{"logical_path":"flags/1x1/ci.svg","mtime":"2020-02-08T21:52:35+01:00","size":286,"digest":"691a0a8577b7d555fc90dc7170adc9ec7571191cb3507c46c0e8516fd1778a91","integrity":"sha256-aRoKhXe31VX8kNxxcK3J7HVxGRyzUHxGwOhRb9F3ipE="},"flags/4x3/ck-9cff098e505afde9bf5166cb7b0c409178575633b913ce08c1c700d08c477db6.svg":{"logical_path":"flags/4x3/ck.svg","mtime":"2020-02-08T21:52:35+01:00","size":1887,"digest":"9cff098e505afde9bf5166cb7b0c409178575633b913ce08c1c700d08c477db6","integrity":"sha256-nP8JjlBa/em/UWbLewxAkXhXVjO5E84IwccA0IxHfbY="},"flags/1x1/ck-9c8dffa3bd5953d8a121780831f25b58738e67f3be71961894c56dfd25848c88.svg":{"logical_path":"flags/1x1/ck.svg","mtime":"2020-02-08T21:52:35+01:00","size":1846,"digest":"9c8dffa3bd5953d8a121780831f25b58738e67f3be71961894c56dfd25848c88","integrity":"sha256-nI3/o71ZU9ihIXgIMfJbWHOOZ/O+cZYYlMVt/SWEjIg="},"flags/4x3/cl-a4c57ec2bb9adcb67e1850256e5165227b764187d6941a38d95d0def5144699b.svg":{"logical_path":"flags/4x3/cl.svg","mtime":"2020-02-08T21:52:35+01:00","size":560,"digest":"a4c57ec2bb9adcb67e1850256e5165227b764187d6941a38d95d0def5144699b","integrity":"sha256-pMV+wrua3LZ+GFAlblFlInt2QYfWlBo42V0N71FEaZs="},"flags/1x1/cl-5a3e95cf63358e3911c97404818c2cddfd46414d8445e47d6976ee166c48926c.svg":{"logical_path":"flags/1x1/cl.svg","mtime":"2020-02-08T21:52:35+01:00","size":577,"digest":"5a3e95cf63358e3911c97404818c2cddfd46414d8445e47d6976ee166c48926c","integrity":"sha256-Wj6Vz2M1jjkRyXQEgYws3f1GQU2EReR9aXbuFmxIkmw="},"flags/4x3/cm-5dce9f36d92a61bdc0c482141bdb4f55bfcec0a2ecc745db643a7953e2e5a722.svg":{"logical_path":"flags/4x3/cm.svg","mtime":"2020-02-08T21:52:35+01:00","size":827,"digest":"5dce9f36d92a61bdc0c482141bdb4f55bfcec0a2ecc745db643a7953e2e5a722","integrity":"sha256-Xc6fNtkqYb3AxIIUG9tPVb/OwKLsx0XbZDp5U+LlpyI="},"flags/1x1/cm-d8d21f54c44df5df9edef227691384a4ad37c15ff57c8aa0dead684d19eac8cd.svg":{"logical_path":"flags/1x1/cm.svg","mtime":"2020-02-08T21:52:35+01:00","size":827,"digest":"d8d21f54c44df5df9edef227691384a4ad37c15ff57c8aa0dead684d19eac8cd","integrity":"sha256-2NIfVMRN9d+e3vInaROEpK03wV/1fIqg3q1oTRnqyM0="},"flags/4x3/cn-48ce1c2837bb806a6aaf8b7a9878b6d040c0d069a0ffca9a8a49e7a31aa30e7f.svg":{"logical_path":"flags/4x3/cn.svg","mtime":"2020-02-08T21:52:35+01:00","size":804,"digest":"48ce1c2837bb806a6aaf8b7a9878b6d040c0d069a0ffca9a8a49e7a31aa30e7f","integrity":"sha256-SM4cKDe7gGpqr4t6mHi20EDA0Gmg/8qaiknnoxqjDn8="},"flags/1x1/cn-e6be64c6c4a976e64d39bfe8a6ae4a5b1d38a6aa1b138ddcacf34a942dff50bc.svg":{"logical_path":"flags/1x1/cn.svg","mtime":"2020-02-08T21:52:35+01:00","size":746,"digest":"e6be64c6c4a976e64d39bfe8a6ae4a5b1d38a6aa1b138ddcacf34a942dff50bc","integrity":"sha256-5r5kxsSpduZNOb/opq5KWx04pqobE43crPNKlC3/ULw="},"flags/4x3/co-648d3ff596a0ecf3e85ac17c53abe1d7ca4759688e10a7a3a8b56f096ba6b6f7.svg":{"logical_path":"flags/4x3/co.svg","mtime":"2020-02-08T21:52:35+01:00","size":292,"digest":"648d3ff596a0ecf3e85ac17c53abe1d7ca4759688e10a7a3a8b56f096ba6b6f7","integrity":"sha256-ZI0/9Zag7PPoWsF8U6vh18pHWWiOEKejqLVvCWumtvc="},"flags/1x1/co-d3c16180c6bce630f762aff789104d10e9dbc949e740535a61396cd0ec34c1a1.svg":{"logical_path":"flags/1x1/co.svg","mtime":"2020-02-08T21:52:35+01:00","size":292,"digest":"d3c16180c6bce630f762aff789104d10e9dbc949e740535a61396cd0ec34c1a1","integrity":"sha256-08FhgMa85jD3Yq/3iRBNEOnbyUnnQFNaYTls0Ow0waE="},"flags/4x3/cr-84aec60f19bd33e1ac1a209155fec8d372e17cb59dc1346bb9124e5cc867375d.svg":{"logical_path":"flags/4x3/cr.svg","mtime":"2020-02-08T21:52:35+01:00","size":296,"digest":"84aec60f19bd33e1ac1a209155fec8d372e17cb59dc1346bb9124e5cc867375d","integrity":"sha256-hK7GDxm9M+GsGiCRVf7I03LhfLWdwTRruRJOXMhnN10="},"flags/1x1/cr-5371cf8bc5ad1a805155c1b3065e420a0a418c8d63b472bc545890289a365b35.svg":{"logical_path":"flags/1x1/cr.svg","mtime":"2020-02-08T21:52:35+01:00","size":296,"digest":"5371cf8bc5ad1a805155c1b3065e420a0a418c8d63b472bc545890289a365b35","integrity":"sha256-U3HPi8WtGoBRVcGzBl5CCgpBjI1jtHK8VFiQKJo2WzU="},"flags/4x3/cu-bb3f857e02aeab606120d9f164283f07a44b227f12aad7d6d344c7579f7b3ff0.svg":{"logical_path":"flags/4x3/cu.svg","mtime":"2020-02-08T21:52:35+01:00","size":619,"digest":"bb3f857e02aeab606120d9f164283f07a44b227f12aad7d6d344c7579f7b3ff0","integrity":"sha256-uz+FfgKuq2BhINnxZCg/B6RLIn8SqtfW00THV597P/A="},"flags/1x1/cu-02c0054169b874a8d231de1f45b2d0884de48848157734e0ddcd0f684c05c18d.svg":{"logical_path":"flags/1x1/cu.svg","mtime":"2020-02-08T21:52:35+01:00","size":576,"digest":"02c0054169b874a8d231de1f45b2d0884de48848157734e0ddcd0f684c05c18d","integrity":"sha256-AsAFQWm4dKjSMd4fRbLQiE3kiEgVdzTg3c0PaEwFwY0="},"flags/4x3/cv-90ee90ab59713454a218d8c300c71139e62655de80bfbea81df93142a529b81f.svg":{"logical_path":"flags/4x3/cv.svg","mtime":"2020-02-08T21:52:35+01:00","size":1414,"digest":"90ee90ab59713454a218d8c300c71139e62655de80bfbea81df93142a529b81f","integrity":"sha256-kO6Qq1lxNFSiGNjDAMcROeYmVd6Av76oHfkxQqUpuB8="},"flags/1x1/cv-2cf3eede97a468d28459ccc2271c28bb5b6029af2388b0301f6203be55e49308.svg":{"logical_path":"flags/1x1/cv.svg","mtime":"2020-02-08T21:52:35+01:00","size":1362,"digest":"2cf3eede97a468d28459ccc2271c28bb5b6029af2388b0301f6203be55e49308","integrity":"sha256-LPPu3pekaNKEWczCJxwou1tgKa8jiLAwH2IDvlXkkwg="},"flags/4x3/cw-d46beb7b10b40fa82cfd40eb86a3b3879f59f5da2a2f5ef91d121ab9b16c0aad.svg":{"logical_path":"flags/4x3/cw.svg","mtime":"2020-02-08T21:52:35+01:00","size":678,"digest":"d46beb7b10b40fa82cfd40eb86a3b3879f59f5da2a2f5ef91d121ab9b16c0aad","integrity":"sha256-1GvrexC0D6gs/UDrhqOzh59Z9doqL175HRIaubFsCq0="},"flags/1x1/cw-ba78c834e61b24a8a2b6bc7c80ab9f14e42c3c69415941ddb7c8c1f652ccd8b5.svg":{"logical_path":"flags/1x1/cw.svg","mtime":"2020-02-08T21:52:35+01:00","size":685,"digest":"ba78c834e61b24a8a2b6bc7c80ab9f14e42c3c69415941ddb7c8c1f652ccd8b5","integrity":"sha256-unjINOYbJKiitrx8gKufFOQsPGlBWUHdt8jB9lLM2LU="},"flags/4x3/cx-28187fb9d91bedc6f239b107d26eb6ec1cc2a0c7730810306c5a6b313c14f2b2.svg":{"logical_path":"flags/4x3/cx.svg","mtime":"2020-02-08T21:52:35+01:00","size":2469,"digest":"28187fb9d91bedc6f239b107d26eb6ec1cc2a0c7730810306c5a6b313c14f2b2","integrity":"sha256-KBh/udkb7cbyObEH0m627BzCoMdzCBAwbFprMTwU8rI="},"flags/1x1/cx-8ebe073d997f93d092a493300ea1d234c91aef80c6e8f431e88aa7f8e724f9a6.svg":{"logical_path":"flags/1x1/cx.svg","mtime":"2020-02-08T21:52:35+01:00","size":2508,"digest":"8ebe073d997f93d092a493300ea1d234c91aef80c6e8f431e88aa7f8e724f9a6","integrity":"sha256-jr4HPZl/k9CSpJMwDqHSNMka74DG6PQx6Iqn+Ock+aY="},"flags/4x3/cy-8d633ecabc7968bb8a869c62545f122aacbbc3e108c25ceb421bb8bc8734b9be.svg":{"logical_path":"flags/4x3/cy.svg","mtime":"2020-02-08T21:52:35+01:00","size":5949,"digest":"8d633ecabc7968bb8a869c62545f122aacbbc3e108c25ceb421bb8bc8734b9be","integrity":"sha256-jWM+yrx5aLuKhpxiVF8SKqy7w+EIwlzrQhu4vIc0ub4="},"flags/1x1/cy-6ef37fdd7518f18727bec1ed9741bb4d1f854dde7ef1a7e9fd2f4ba6291a7790.svg":{"logical_path":"flags/1x1/cy.svg","mtime":"2020-02-08T21:52:35+01:00","size":6053,"digest":"6ef37fdd7518f18727bec1ed9741bb4d1f854dde7ef1a7e9fd2f4ba6291a7790","integrity":"sha256-bvN/3XUY8YcnvsHtl0G7TR+FTd5+8afp/S9Lpikad5A="},"flags/4x3/cz-6c94e3d53fc1ae5982d8eb058b76d86f07d3fb4cd325698fea3291fa35504c56.svg":{"logical_path":"flags/4x3/cz.svg","mtime":"2020-02-08T21:52:35+01:00","size":481,"digest":"6c94e3d53fc1ae5982d8eb058b76d86f07d3fb4cd325698fea3291fa35504c56","integrity":"sha256-bJTj1T/BrlmC2OsFi3bYbwfT+0zTJWmP6jKR+jVQTFY="},"flags/1x1/cz-af9898ebd32559cdbea2fd17b351e5eedafccada6fbc6a2b7952cad78369817e.svg":{"logical_path":"flags/1x1/cz.svg","mtime":"2020-02-08T21:52:35+01:00","size":483,"digest":"af9898ebd32559cdbea2fd17b351e5eedafccada6fbc6a2b7952cad78369817e","integrity":"sha256-r5iY69MlWc2+ov0Xs1Hl7tr8ytpvvGoreVLK14NpgX4="},"flags/4x3/de-e7323083675d25107c85f0cea6534bd21d21e77e6d524d92e1b2d0a4e21117a1.svg":{"logical_path":"flags/4x3/de.svg","mtime":"2020-02-08T21:52:35+01:00","size":216,"digest":"e7323083675d25107c85f0cea6534bd21d21e77e6d524d92e1b2d0a4e21117a1","integrity":"sha256-5zIwg2ddJRB8hfDOplNL0h0h535tUk2S4bLQpOIRF6E="},"flags/1x1/de-fdb60146952d3b2d104310b28882a0ecde44d808240c3bab2cd6c302a538b266.svg":{"logical_path":"flags/1x1/de.svg","mtime":"2020-02-08T21:52:35+01:00","size":224,"digest":"fdb60146952d3b2d104310b28882a0ecde44d808240c3bab2cd6c302a538b266","integrity":"sha256-/bYBRpUtOy0QQxCyiIKg7N5E2AgkDDurLNbDAqU4smY="},"flags/4x3/dj-546da4a0dae9b1ab74dc6ac6076d0c706f37ef2a0d799342dd0345e11f770f03.svg":{"logical_path":"flags/4x3/dj.svg","mtime":"2020-02-08T21:52:35+01:00","size":588,"digest":"546da4a0dae9b1ab74dc6ac6076d0c706f37ef2a0d799342dd0345e11f770f03","integrity":"sha256-VG2koNrpsat03GrGB20McG837yoNeZNC3QNF4R93DwM="},"flags/1x1/dj-c0481b667f003d9d5a3c93861023a97a98224227ac19aa7e07b5b6edd35fe900.svg":{"logical_path":"flags/1x1/dj.svg","mtime":"2020-02-08T21:52:35+01:00","size":588,"digest":"c0481b667f003d9d5a3c93861023a97a98224227ac19aa7e07b5b6edd35fe900","integrity":"sha256-wEgbZn8APZ1aPJOGECOpepgiQiesGap+B7W27dNf6QA="},"flags/4x3/dk-a13735c0337ab4679cd8679508bf5e8067637ab611ca5c54172c621d740420e5.svg":{"logical_path":"flags/4x3/dk.svg","mtime":"2020-02-08T21:52:35+01:00","size":242,"digest":"a13735c0337ab4679cd8679508bf5e8067637ab611ca5c54172c621d740420e5","integrity":"sha256-oTc1wDN6tGec2GeVCL9egGdjerYRylxUFyxiHXQEIOU="},"flags/1x1/dk-822a3b8b6948f49aa81fe7620bd173453d9a45406a9680f24bad7e714e58cb7c.svg":{"logical_path":"flags/1x1/dk.svg","mtime":"2020-02-08T21:52:35+01:00","size":238,"digest":"822a3b8b6948f49aa81fe7620bd173453d9a45406a9680f24bad7e714e58cb7c","integrity":"sha256-gio7i2lI9JqoH+diC9FzRT2aRUBqloDyS61+cU5Yy3w="},"flags/4x3/dm-7713fabd3cf341694b4c1ef5d1379820773722b61c190234ac7416f2872e3940.svg":{"logical_path":"flags/4x3/dm.svg","mtime":"2020-02-08T21:52:35+01:00","size":16026,"digest":"7713fabd3cf341694b4c1ef5d1379820773722b61c190234ac7416f2872e3940","integrity":"sha256-dxP6vTzzQWlLTB710TeYIHc3IrYcGQI0rHQW8ocuOUA="},"flags/1x1/dm-33d984fc9897bb2a3bd16c6672b876effc1a8adc0c57ad122a16db54061e4e46.svg":{"logical_path":"flags/1x1/dm.svg","mtime":"2020-02-08T21:52:35+01:00","size":16514,"digest":"33d984fc9897bb2a3bd16c6672b876effc1a8adc0c57ad122a16db54061e4e46","integrity":"sha256-M9mE/JiXuyo70Wxmcrh27/waitwMV60SKhbbVAYeTkY="},"flags/4x3/do-714b6f307ea3a9c3d30348684b8574e8b7f5078f51649dfa97ae2a69a7108b4a.svg":{"logical_path":"flags/4x3/do.svg","mtime":"2020-02-08T21:52:35+01:00","size":394146,"digest":"714b6f307ea3a9c3d30348684b8574e8b7f5078f51649dfa97ae2a69a7108b4a","integrity":"sha256-cUtvMH6jqcPTA0hoS4V06Lf1B49RZJ36l64qaacQi0o="},"flags/1x1/do-d37306c4b346f89ea14739144374caad69652be31e8ce8e2504c9a0d422a4857.svg":{"logical_path":"flags/1x1/do.svg","mtime":"2020-02-08T21:52:35+01:00","size":391714,"digest":"d37306c4b346f89ea14739144374caad69652be31e8ce8e2504c9a0d422a4857","integrity":"sha256-03MGxLNG+J6hRzkUQ3TKrWllK+MejOjiUEyaDUIqSFc="},"flags/4x3/dz-a96e943c830558fe9823044aac2bfb3f6a4caf3bd3c57943352280a7f6b68cb1.svg":{"logical_path":"flags/4x3/dz.svg","mtime":"2020-02-08T21:52:35+01:00","size":301,"digest":"a96e943c830558fe9823044aac2bfb3f6a4caf3bd3c57943352280a7f6b68cb1","integrity":"sha256-qW6UPIMFWP6YIwRKrCv7P2pMrzvTxXlDNSKAp/a2jLE="},"flags/1x1/dz-09400d3b2c58e641a1641a687b81476761d05f9d0ff65861aeaa33c7f508cda4.svg":{"logical_path":"flags/1x1/dz.svg","mtime":"2020-02-08T21:52:35+01:00","size":312,"digest":"09400d3b2c58e641a1641a687b81476761d05f9d0ff65861aeaa33c7f508cda4","integrity":"sha256-CUANOyxY5kGhZBpoe4FHZ2HQX50P9lhhrqozx/UIzaQ="},"flags/4x3/ec-6762ba85ea0f7bb289b0aa6219c797e5243103d281b1462c61b61030fa329d5e.svg":{"logical_path":"flags/4x3/ec.svg","mtime":"2020-02-08T21:52:35+01:00","size":29417,"digest":"6762ba85ea0f7bb289b0aa6219c797e5243103d281b1462c61b61030fa329d5e","integrity":"sha256-Z2K6heoPe7KJsKpiGceX5SQxA9KBsUYsYbYQMPoynV4="},"flags/1x1/ec-7410a75a013738fbb8cbd756d967380e02ae54ca74e9ef9a41c4b583c2c2794f.svg":{"logical_path":"flags/1x1/ec.svg","mtime":"2020-02-08T21:52:35+01:00","size":29972,"digest":"7410a75a013738fbb8cbd756d967380e02ae54ca74e9ef9a41c4b583c2c2794f","integrity":"sha256-dBCnWgE3OPu4y9dW2Wc4DgKuVMp06e+aQcS1g8LCeU8="},"flags/4x3/ee-ce3b622214bd9eefb43373cae2811ea8cf6ef6a16bb6afbaa5bcaaea34024da0.svg":{"logical_path":"flags/4x3/ee.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"ce3b622214bd9eefb43373cae2811ea8cf6ef6a16bb6afbaa5bcaaea34024da0","integrity":"sha256-zjtiIhS9nu+0M3PK4oEeqM9u9qFrtq+6pbyq6jQCTaA="},"flags/1x1/ee-a207a8363b4dde44f59951501c2cb539419e92b0814b25d6448710ced52226f8.svg":{"logical_path":"flags/1x1/ee.svg","mtime":"2020-02-08T21:52:35+01:00","size":355,"digest":"a207a8363b4dde44f59951501c2cb539419e92b0814b25d6448710ced52226f8","integrity":"sha256-ogeoNjtN3kT1mVFQHCy1OUGekrCBSyXWRIcQztUiJvg="},"flags/4x3/eg-16a11fa93856ddc5fd46f8811adfc93660175724b20eaab55ff046855a352d2c.svg":{"logical_path":"flags/4x3/eg.svg","mtime":"2020-02-08T21:52:35+01:00","size":9978,"digest":"16a11fa93856ddc5fd46f8811adfc93660175724b20eaab55ff046855a352d2c","integrity":"sha256-FqEfqThW3cX9RviBGt/JNmAXVySyDqq1X/BGhVo1LSw="},"flags/1x1/eg-9f4d098c604326bbc3692f9e2f335dbc9b34bdf2706565bf448380f0a889d1e2.svg":{"logical_path":"flags/1x1/eg.svg","mtime":"2020-02-08T21:52:35+01:00","size":9992,"digest":"9f4d098c604326bbc3692f9e2f335dbc9b34bdf2706565bf448380f0a889d1e2","integrity":"sha256-n00JjGBDJrvDaS+eLzNdvJs0vfJwZWW/RIOA8KiJ0eI="},"flags/4x3/eh-9cf4a74d29c1a1afc4137deeb5b678d55c8fbdf8d181217267f3a5cce6a76a97.svg":{"logical_path":"flags/4x3/eh.svg","mtime":"2020-02-08T21:52:35+01:00","size":878,"digest":"9cf4a74d29c1a1afc4137deeb5b678d55c8fbdf8d181217267f3a5cce6a76a97","integrity":"sha256-nPSnTSnBoa/EE33utbZ41VyPvfjRgSFyZ/OlzOanapc="},"flags/1x1/eh-16c3327dbcf3483e634b3536b056324b5478212dae6d060f2ffb2ec961cd382f.svg":{"logical_path":"flags/1x1/eh.svg","mtime":"2020-02-08T21:52:35+01:00","size":828,"digest":"16c3327dbcf3483e634b3536b056324b5478212dae6d060f2ffb2ec961cd382f","integrity":"sha256-FsMyfbzzSD5jSzU2sFYyS1R4IS2ubQYPL/suyWHNOC8="},"flags/4x3/er-69a1e1e45289d1282df4b1e5ce5e712d69fbe314abd0c922353fce90814c543e.svg":{"logical_path":"flags/4x3/er.svg","mtime":"2020-02-08T21:52:35+01:00","size":3207,"digest":"69a1e1e45289d1282df4b1e5ce5e712d69fbe314abd0c922353fce90814c543e","integrity":"sha256-aaHh5FKJ0Sgt9LHlzl5xLWn74xSr0MkiNT/OkIFMVD4="},"flags/1x1/er-90d49408e58955cf1cf3185b0193e03c4a107042d47ef5e975dbbe10c6ef7f4a.svg":{"logical_path":"flags/1x1/er.svg","mtime":"2020-02-08T21:52:35+01:00","size":3395,"digest":"90d49408e58955cf1cf3185b0193e03c4a107042d47ef5e975dbbe10c6ef7f4a","integrity":"sha256-kNSUCOWJVc8c8xhbAZPgPEoQcELUfvXpddu+EMbvf0o="},"flags/4x3/es-50e59681c6b6412498bd9cbfc473abedc713db75c54c538b839db3c394d64499.svg":{"logical_path":"flags/4x3/es.svg","mtime":"2020-02-08T21:52:35+01:00","size":92574,"digest":"50e59681c6b6412498bd9cbfc473abedc713db75c54c538b839db3c394d64499","integrity":"sha256-UOWWgca2QSSYvZy/xHOr7ccT23XFTFOLg52zw5TWRJk="},"flags/1x1/es-29c68fa3c9c8c2adacdc2eb0162e9c2fa998faa408836900ec6285000476800d.svg":{"logical_path":"flags/1x1/es.svg","mtime":"2020-02-08T21:52:35+01:00","size":94269,"digest":"29c68fa3c9c8c2adacdc2eb0162e9c2fa998faa408836900ec6285000476800d","integrity":"sha256-KcaPo8nIwq2s3C6wFi6cL6mY+qQIg2kA7GKFAAR2gA0="},"flags/4x3/et-14263ba7ea890fd0a4d89a2791343ecb7acc89aab1fc2593e00a6093b22251df.svg":{"logical_path":"flags/4x3/et.svg","mtime":"2020-02-08T21:52:35+01:00","size":1243,"digest":"14263ba7ea890fd0a4d89a2791343ecb7acc89aab1fc2593e00a6093b22251df","integrity":"sha256-FCY7p+qJD9Ck2JonkTQ+y3rMiaqx/CWT4Apgk7IiUd8="},"flags/1x1/et-086eefb70e9adad537cc1c640a72cc0fa843ec7a9b06b2778aa98b2db055bfe6.svg":{"logical_path":"flags/1x1/et.svg","mtime":"2020-02-08T21:52:35+01:00","size":1242,"digest":"086eefb70e9adad537cc1c640a72cc0fa843ec7a9b06b2778aa98b2db055bfe6","integrity":"sha256-CG7vtw6a2tU3zBxkCnLMD6hD7HqbBrJ3iqmLLbBVv+Y="},"flags/4x3/fi-a4c41caa02a4f6803ea0d6c36de4beebf20d150e3df742b1369a4099c2ff648e.svg":{"logical_path":"flags/4x3/fi.svg","mtime":"2020-02-08T21:52:35+01:00","size":240,"digest":"a4c41caa02a4f6803ea0d6c36de4beebf20d150e3df742b1369a4099c2ff648e","integrity":"sha256-pMQcqgKk9oA+oNbDbeS+6/INFQ4990KxNppAmcL/ZI4="},"flags/1x1/fi-c5fdf318fac5fdfc94fe54268618e58a2bc5933617ead09992900f90cc25de9a.svg":{"logical_path":"flags/1x1/fi.svg","mtime":"2020-02-08T21:52:35+01:00","size":243,"digest":"c5fdf318fac5fdfc94fe54268618e58a2bc5933617ead09992900f90cc25de9a","integrity":"sha256-xf3zGPrF/fyU/lQmhhjliivFkzYX6tCZkpAPkMwl3po="},"flags/4x3/fj-cb0cc4b3b5c202f07487ee519f48b3eadb47035f5f2d5d3f99d20f81e48d6b79.svg":{"logical_path":"flags/4x3/fj.svg","mtime":"2020-02-08T21:52:35+01:00","size":27388,"digest":"cb0cc4b3b5c202f07487ee519f48b3eadb47035f5f2d5d3f99d20f81e48d6b79","integrity":"sha256-ywzEs7XCAvB0h+5Rn0iz6ttHA19fLV0/mdIPgeSNa3k="},"flags/1x1/fj-c2c7fd536841925e7647b2d510d6a0c58700e2a8ded0e42008fb93ffacde101f.svg":{"logical_path":"flags/1x1/fj.svg","mtime":"2020-02-08T21:52:35+01:00","size":27519,"digest":"c2c7fd536841925e7647b2d510d6a0c58700e2a8ded0e42008fb93ffacde101f","integrity":"sha256-wsf9U2hBkl52R7LVENagxYcA4qje0OQgCPuT/6zeEB8="},"flags/4x3/fk-cb61eaa0d7221823f7d17de59ea88ed16b506f9585ab0c7291cf839449d82968.svg":{"logical_path":"flags/4x3/fk.svg","mtime":"2020-02-08T21:52:35+01:00","size":30453,"digest":"cb61eaa0d7221823f7d17de59ea88ed16b506f9585ab0c7291cf839449d82968","integrity":"sha256-y2HqoNciGCP30X3lnqiO0WtQb5WFqwxykc+DlEnYKWg="},"flags/1x1/fk-a871742380ae157d1211a63cc35cd3621b1bf6de6d67e4a8e3565ad200b1d8cf.svg":{"logical_path":"flags/1x1/fk.svg","mtime":"2020-02-08T21:52:35+01:00","size":30648,"digest":"a871742380ae157d1211a63cc35cd3621b1bf6de6d67e4a8e3565ad200b1d8cf","integrity":"sha256-qHF0I4CuFX0SEaY8w1zTYhsb9t5tZ+So41Za0gCx2M8="},"flags/4x3/fm-079b937562a9a412aae8fb762b571ddb49bf23627943c97247b6a9bbdb768153.svg":{"logical_path":"flags/4x3/fm.svg","mtime":"2020-02-08T21:52:35+01:00","size":773,"digest":"079b937562a9a412aae8fb762b571ddb49bf23627943c97247b6a9bbdb768153","integrity":"sha256-B5uTdWKppBKq6Pt2K1cd20m/I2J5Q8lyR7apu9t2gVM="},"flags/1x1/fm-dbec73633ecd8a6c50f56d54df36bbe6a2f8fb534ac7658477c82cad14a806a8.svg":{"logical_path":"flags/1x1/fm.svg","mtime":"2020-02-08T21:52:35+01:00","size":763,"digest":"dbec73633ecd8a6c50f56d54df36bbe6a2f8fb534ac7658477c82cad14a806a8","integrity":"sha256-2+xzYz7NimxQ9W1U3za75qL4+1NKx2WEd8gsrRSoBqg="},"flags/4x3/fo-27279c2481bb1cb3e44850a948987d6a8411acffa770c3aecd1b76d4c5853413.svg":{"logical_path":"flags/4x3/fo.svg","mtime":"2020-02-08T21:52:35+01:00","size":567,"digest":"27279c2481bb1cb3e44850a948987d6a8411acffa770c3aecd1b76d4c5853413","integrity":"sha256-JyecJIG7HLPkSFCpSJh9aoQRrP+ncMOuzRt21MWFNBM="},"flags/1x1/fo-7cb4fdbba1c7223702d843cb0709ddc799f89f909dfe101e3e36d6bf36c3e67f.svg":{"logical_path":"flags/1x1/fo.svg","mtime":"2020-02-08T21:52:35+01:00","size":537,"digest":"7cb4fdbba1c7223702d843cb0709ddc799f89f909dfe101e3e36d6bf36c3e67f","integrity":"sha256-fLT9u6HHIjcC2EPLBwndx5n4n5Cd/hAePjbWvzbD5n8="},"flags/4x3/fr-30ed2f68dc9a17927643640f48f3d2a858bd041770547035349c6e79713cd84e.svg":{"logical_path":"flags/4x3/fr.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"30ed2f68dc9a17927643640f48f3d2a858bd041770547035349c6e79713cd84e","integrity":"sha256-MO0vaNyaF5J2Q2QPSPPSqFi9BBdwVHA1NJxueXE82E4="},"flags/1x1/fr-6b849151204c66fa661c30b34e62919a13b9e66b7cd37a4fc8962e8e0baf9bdc.svg":{"logical_path":"flags/1x1/fr.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"6b849151204c66fa661c30b34e62919a13b9e66b7cd37a4fc8962e8e0baf9bdc","integrity":"sha256-a4SRUSBMZvpmHDCzTmKRmhO55mt803pPyJYujguvm9w="},"flags/4x3/ga-e3840f9d5bd6ee08db748d37a534500b837bee0f8ce65987b2f099a6afd2cc63.svg":{"logical_path":"flags/4x3/ga.svg","mtime":"2020-02-08T21:52:35+01:00","size":277,"digest":"e3840f9d5bd6ee08db748d37a534500b837bee0f8ce65987b2f099a6afd2cc63","integrity":"sha256-44QPnVvW7gjbdI03pTRQC4N77g+M5lmHsvCZpq/SzGM="},"flags/1x1/ga-9eafd5388042b3d2258ac6223075b726426210136b9851b637973105721b64d9.svg":{"logical_path":"flags/1x1/ga.svg","mtime":"2020-02-08T21:52:35+01:00","size":281,"digest":"9eafd5388042b3d2258ac6223075b726426210136b9851b637973105721b64d9","integrity":"sha256-nq/VOIBCs9IlisYiMHW3JkJiEBNrmFG2N5cxBXIbZNk="},"flags/4x3/gb-ce93c8a6b974d63998e263f6d25f898fc20580a28464457f2f4463b687e4fe8d.svg":{"logical_path":"flags/4x3/gb.svg","mtime":"2020-02-08T21:52:35+01:00","size":834,"digest":"ce93c8a6b974d63998e263f6d25f898fc20580a28464457f2f4463b687e4fe8d","integrity":"sha256-zpPIprl01jmY4mP20l+Jj8IFgKKEZEV/L0Rjtofk/o0="},"flags/1x1/gb-1d93e1ce2e2e10c1709e4dc50ac956c007b2c1a63a4bc22ddfd64354f79ad457.svg":{"logical_path":"flags/1x1/gb.svg","mtime":"2020-02-08T21:52:35+01:00","size":792,"digest":"1d93e1ce2e2e10c1709e4dc50ac956c007b2c1a63a4bc22ddfd64354f79ad457","integrity":"sha256-HZPhzi4uEMFwnk3FCslWwAeywaY6S8It39ZDVPea1Fc="},"flags/4x3/gd-7c3a6b6068bbd9a6abc98c2297dd4acd5e31022e5a4210fc0e1205ec28498fa2.svg":{"logical_path":"flags/4x3/gd.svg","mtime":"2020-02-08T21:52:35+01:00","size":1694,"digest":"7c3a6b6068bbd9a6abc98c2297dd4acd5e31022e5a4210fc0e1205ec28498fa2","integrity":"sha256-fDprYGi72aaryYwil91KzV4xAi5aQhD8DhIF7ChJj6I="},"flags/1x1/gd-2310bc03d9e8ddc8599b40891bfb10b812b07023881599a7e02e3028d1bc9ca8.svg":{"logical_path":"flags/1x1/gd.svg","mtime":"2020-02-08T21:52:35+01:00","size":1834,"digest":"2310bc03d9e8ddc8599b40891bfb10b812b07023881599a7e02e3028d1bc9ca8","integrity":"sha256-IxC8A9no3chZm0CJG/sQuBKwcCOIFZmn4C4wKNG8nKg="},"flags/4x3/ge-501c0135fb8c377dbd2859ff6290b47ef4907a8e2ab2ae1e39116b716db6795f.svg":{"logical_path":"flags/4x3/ge.svg","mtime":"2020-02-08T21:52:35+01:00","size":1400,"digest":"501c0135fb8c377dbd2859ff6290b47ef4907a8e2ab2ae1e39116b716db6795f","integrity":"sha256-UBwBNfuMN329KFn/YpC0fvSQeo4qsq4eORFrcW22eV8="},"flags/1x1/ge-ca9ee36883ec12048fbb7fbbfaf231c0d4848ae0b07dab74a46d53b7b34d8114.svg":{"logical_path":"flags/1x1/ge.svg","mtime":"2020-02-08T21:52:35+01:00","size":1544,"digest":"ca9ee36883ec12048fbb7fbbfaf231c0d4848ae0b07dab74a46d53b7b34d8114","integrity":"sha256-yp7jaIPsEgSPu3+7+vIxwNSEiuCwfat0pG1Tt7NNgRQ="},"flags/4x3/gf-7c165f90bfe6ac3674903632182221a992f017ff706354b1761002382e89c2c2.svg":{"logical_path":"flags/4x3/gf.svg","mtime":"2020-02-08T21:52:35+01:00","size":261,"digest":"7c165f90bfe6ac3674903632182221a992f017ff706354b1761002382e89c2c2","integrity":"sha256-fBZfkL/mrDZ0kDYyGCIhqZLwF/9wY1SxdhACOC6JwsI="},"flags/1x1/gf-8838337b15cdcf143fac16c714e8dbf2d893d2ea8f1c8ef06dadcb652dfec41c.svg":{"logical_path":"flags/1x1/gf.svg","mtime":"2020-02-08T21:52:35+01:00","size":264,"digest":"8838337b15cdcf143fac16c714e8dbf2d893d2ea8f1c8ef06dadcb652dfec41c","integrity":"sha256-iDgzexXNzxQ/rBbHFOjb8tiT0uqPHI7wba3LZS3+xBw="},"flags/4x3/gg-2c7bfc50d5bcd374b5f6107974d06af24e70edba31ad71a225e0c2ecc2d6e778.svg":{"logical_path":"flags/4x3/gg.svg","mtime":"2020-02-08T21:52:35+01:00","size":598,"digest":"2c7bfc50d5bcd374b5f6107974d06af24e70edba31ad71a225e0c2ecc2d6e778","integrity":"sha256-LHv8UNW803S19hB5dNBq8k5w7boxrXGiJeDC7MLW53g="},"flags/1x1/gg-509489b1792831bb27d6975c76aa0a2ac2fa2c3906bcf844f616de5e0fbbc359.svg":{"logical_path":"flags/1x1/gg.svg","mtime":"2020-02-08T21:52:35+01:00","size":628,"digest":"509489b1792831bb27d6975c76aa0a2ac2fa2c3906bcf844f616de5e0fbbc359","integrity":"sha256-UJSJsXkoMbsn1pdcdqoKKsL6LDkGvPhE9hbeXg+7w1k="},"flags/4x3/gh-79c187756e93df22fae571ad9419629c5247c016e32a74471e0d461048fdf5cf.svg":{"logical_path":"flags/4x3/gh.svg","mtime":"2020-02-08T21:52:35+01:00","size":286,"digest":"79c187756e93df22fae571ad9419629c5247c016e32a74471e0d461048fdf5cf","integrity":"sha256-ecGHdW6T3yL65XGtlBlinFJHwBbjKnRHHg1GEEj99c8="},"flags/1x1/gh-e7bf18e6337982ee31e3673ab93e722b3410b7a4c202656a4bc3887d8656286b.svg":{"logical_path":"flags/1x1/gh.svg","mtime":"2020-02-08T21:52:35+01:00","size":299,"digest":"e7bf18e6337982ee31e3673ab93e722b3410b7a4c202656a4bc3887d8656286b","integrity":"sha256-578Y5jN5gu4x42c6uT5yKzQQt6TCAmVqS8OIfYZWKGs="},"flags/4x3/gi-ed99b369c8c77e64abd59fab1f28155d71b4378b49625c66ab0ab6dff4f88087.svg":{"logical_path":"flags/4x3/gi.svg","mtime":"2020-02-08T21:52:35+01:00","size":2972,"digest":"ed99b369c8c77e64abd59fab1f28155d71b4378b49625c66ab0ab6dff4f88087","integrity":"sha256-7ZmzacjHfmSr1Z+rHygVXXG0N4tJYlxmqwq23/T4gIc="},"flags/1x1/gi-2e563e96e766e13c0a9c5a3a372059a44739bb696e853d71a6f6b08c491dfb9a.svg":{"logical_path":"flags/1x1/gi.svg","mtime":"2020-02-08T21:52:35+01:00","size":2964,"digest":"2e563e96e766e13c0a9c5a3a372059a44739bb696e853d71a6f6b08c491dfb9a","integrity":"sha256-LlY+ludm4TwKnFo6NyBZpEc5u2luhT1xpvawjEkd+5o="},"flags/4x3/gl-612e560dbad68d540be672b80e22c54db43d6e2070523e81c156ccd6b3fc4260.svg":{"logical_path":"flags/4x3/gl.svg","mtime":"2020-02-08T21:52:35+01:00","size":229,"digest":"612e560dbad68d540be672b80e22c54db43d6e2070523e81c156ccd6b3fc4260","integrity":"sha256-YS5WDbrWjVQL5nK4DiLFTbQ9biBwUj6BwVbM1rP8QmA="},"flags/1x1/gl-a9bb35d2b9ff27638658d9ad6b9e2c4f452072b9a80b508d32e76d37bf62cf6e.svg":{"logical_path":"flags/1x1/gl.svg","mtime":"2020-02-08T21:52:35+01:00","size":243,"digest":"a9bb35d2b9ff27638658d9ad6b9e2c4f452072b9a80b508d32e76d37bf62cf6e","integrity":"sha256-qbs10rn/J2OGWNmta54sT0UgcrmoC1CNMudtN79iz24="},"flags/4x3/gm-4a6f9670a41548cceaced2b728e4bc56acbc4a3ba5544e7a097f7dae7a8bb045.svg":{"logical_path":"flags/4x3/gm.svg","mtime":"2020-02-08T21:52:35+01:00","size":543,"digest":"4a6f9670a41548cceaced2b728e4bc56acbc4a3ba5544e7a097f7dae7a8bb045","integrity":"sha256-Sm+WcKQVSMzqztK3KOS8Vqy8SjulVE56CX99rnqLsEU="},"flags/1x1/gm-b67f9f6bce2f8c8700c198de8bfafac72d01b8a1e55b77f71e8cafdc58f8af5c.svg":{"logical_path":"flags/1x1/gm.svg","mtime":"2020-02-08T21:52:35+01:00","size":385,"digest":"b67f9f6bce2f8c8700c198de8bfafac72d01b8a1e55b77f71e8cafdc58f8af5c","integrity":"sha256-tn+fa84vjIcAwZjei/r6xy0BuKHlW3f3Hoyv3Fj4r1w="},"flags/4x3/gn-873b4eb52f34c7558bef93cfd1b82117b5c32c9fbc0610f8821ccd22f28abe28.svg":{"logical_path":"flags/4x3/gn.svg","mtime":"2020-02-08T21:52:35+01:00","size":298,"digest":"873b4eb52f34c7558bef93cfd1b82117b5c32c9fbc0610f8821ccd22f28abe28","integrity":"sha256-hztOtS80x1WL75PP0bghF7XDLJ+8BhD4ghzNIvKKvig="},"flags/1x1/gn-72f51dc30cf0ed5459ad0f239cf3043eac05ece75945bcaf4ea6653af868c504.svg":{"logical_path":"flags/1x1/gn.svg","mtime":"2020-02-08T21:52:35+01:00","size":298,"digest":"72f51dc30cf0ed5459ad0f239cf3043eac05ece75945bcaf4ea6653af868c504","integrity":"sha256-cvUdwwzw7VRZrQ8jnPMEPqwF7OdZRbyvTqZlOvhoxQQ="},"flags/4x3/gp-4559cad3eb2d173214161d16b0237c68f5c817749a39c862fa7b23dfb4aee923.svg":{"logical_path":"flags/4x3/gp.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"4559cad3eb2d173214161d16b0237c68f5c817749a39c862fa7b23dfb4aee923","integrity":"sha256-RVnK0+stFzIUFh0WsCN8aPXIF3SaOchi+nsj37Su6SM="},"flags/1x1/gp-d6669532054db5b7e441f4858c28920246a65ca3e8a15518c64c7bbb4f9c6416.svg":{"logical_path":"flags/1x1/gp.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"d6669532054db5b7e441f4858c28920246a65ca3e8a15518c64c7bbb4f9c6416","integrity":"sha256-1maVMgVNtbfkQfSFjCiSAkamXKPooVUYxkx7u0+cZBY="},"flags/4x3/gq-0c8dfe7f9543307056bbe6d6e44a16c17201228e5344d5afec1ccf1b9a5eb2f9.svg":{"logical_path":"flags/4x3/gq.svg","mtime":"2020-02-08T21:52:35+01:00","size":5188,"digest":"0c8dfe7f9543307056bbe6d6e44a16c17201228e5344d5afec1ccf1b9a5eb2f9","integrity":"sha256-DI3+f5VDMHBWu+bW5EoWwXIBIo5TRNWv7BzPG5pesvk="},"flags/1x1/gq-ecb761e6db59b9bf8ba37533eaf0c60b7fcc7c0dfa2fcf281ee84c970dcb10f8.svg":{"logical_path":"flags/1x1/gq.svg","mtime":"2020-02-08T21:52:35+01:00","size":5280,"digest":"ecb761e6db59b9bf8ba37533eaf0c60b7fcc7c0dfa2fcf281ee84c970dcb10f8","integrity":"sha256-7Ldh5ttZub+Lo3Uz6vDGC3/MfA36L88oHuhMlw3LEPg="},"flags/4x3/gr-4a4086310397bffa682d439be8650a9e28d94e32963b6411b61435292ac4cf80.svg":{"logical_path":"flags/4x3/gr.svg","mtime":"2020-02-08T21:52:35+01:00","size":818,"digest":"4a4086310397bffa682d439be8650a9e28d94e32963b6411b61435292ac4cf80","integrity":"sha256-SkCGMQOXv/poLUOb6GUKnijZTjKWO2QRthQ1KSrEz4A="},"flags/1x1/gr-0cbd171892c0568b055d3b6585d58ac13dd60dfbcfad16eda1f4f9ead11dd16f.svg":{"logical_path":"flags/1x1/gr.svg","mtime":"2020-02-08T21:52:35+01:00","size":875,"digest":"0cbd171892c0568b055d3b6585d58ac13dd60dfbcfad16eda1f4f9ead11dd16f","integrity":"sha256-DL0XGJLAVosFXTtlhdWKwT3WDfvPrRbtofT56tEd0W8="},"flags/4x3/gs-e45169a93a9e94c15f5cb765a6c863319171fb9b4dce56094411829cd688d486.svg":{"logical_path":"flags/4x3/gs.svg","mtime":"2020-02-08T21:52:35+01:00","size":34658,"digest":"e45169a93a9e94c15f5cb765a6c863319171fb9b4dce56094411829cd688d486","integrity":"sha256-5FFpqTqelMFfXLdlpshjMZFx+5tNzlYJRBGCnNaI1IY="},"flags/1x1/gs-3efc9e1b32961f9aa9d7faa2626e596282b63d049f6717c2378b28e3f508e79a.svg":{"logical_path":"flags/1x1/gs.svg","mtime":"2020-02-08T21:52:35+01:00","size":35151,"digest":"3efc9e1b32961f9aa9d7faa2626e596282b63d049f6717c2378b28e3f508e79a","integrity":"sha256-PvyeGzKWH5qp1/qiYm5ZYoK2PQSfZxfCN4so4/UI55o="},"flags/4x3/gt-64a7345cf66facf7f323d2142aebb4172191108a78ac7493b1a6077b78ac8ec5.svg":{"logical_path":"flags/4x3/gt.svg","mtime":"2020-02-08T21:52:35+01:00","size":37857,"digest":"64a7345cf66facf7f323d2142aebb4172191108a78ac7493b1a6077b78ac8ec5","integrity":"sha256-ZKc0XPZvrPfzI9IUKuu0FyGREIp4rHSTsaYHe3isjsU="},"flags/1x1/gt-436a2af3d95cf3cb13ded897f319cfd6e2c087d678ad0e971c198b0d2c029911.svg":{"logical_path":"flags/1x1/gt.svg","mtime":"2020-02-08T21:52:35+01:00","size":37857,"digest":"436a2af3d95cf3cb13ded897f319cfd6e2c087d678ad0e971c198b0d2c029911","integrity":"sha256-Q2oq89lc88sT3tiX8xnP1uLAh9Z4rQ6XHBmLDSwCmRE="},"flags/4x3/gu-f560822ee237e5277829e63613a615a2ee3d8cc6196dffffe0f0d56a49b11c53.svg":{"logical_path":"flags/4x3/gu.svg","mtime":"2020-02-08T21:52:35+01:00","size":4859,"digest":"f560822ee237e5277829e63613a615a2ee3d8cc6196dffffe0f0d56a49b11c53","integrity":"sha256-9WCCLuI35Sd4KeY2E6YVou49jMYZbf//4PDVakmxHFM="},"flags/1x1/gu-a71c9d290c66c1a0929b05436dc6a8229b1147d7cc62336e04c9adf697030450.svg":{"logical_path":"flags/1x1/gu.svg","mtime":"2020-02-08T21:52:35+01:00","size":4644,"digest":"a71c9d290c66c1a0929b05436dc6a8229b1147d7cc62336e04c9adf697030450","integrity":"sha256-pxydKQxmwaCSmwVDbcaoIpsRR9fMYjNuBMmt9pcDBFA="},"flags/4x3/gw-0dc9ec17735ed605b68672947ce55c49a4ec1551491ccd121f482c1875cdf219.svg":{"logical_path":"flags/4x3/gw.svg","mtime":"2020-02-08T21:52:35+01:00","size":816,"digest":"0dc9ec17735ed605b68672947ce55c49a4ec1551491ccd121f482c1875cdf219","integrity":"sha256-DcnsF3Ne1gW2hnKUfOVcSaTsFVFJHM0SH0gsGHXN8hk="},"flags/1x1/gw-7868c305e4a64b0d8ebfd3f7cb8c881841d71a7e0c3ead2683fe503c80de0674.svg":{"logical_path":"flags/1x1/gw.svg","mtime":"2020-02-08T21:52:35+01:00","size":892,"digest":"7868c305e4a64b0d8ebfd3f7cb8c881841d71a7e0c3ead2683fe503c80de0674","integrity":"sha256-eGjDBeSmSw2Ov9P3y4yIGEHXGn4MPq0mg/5QPIDeBnQ="},"flags/4x3/gy-c9126e544c62508abfb898f0af0bd79c46f4c767c9ed6f928418a24b0f246d85.svg":{"logical_path":"flags/4x3/gy.svg","mtime":"2020-02-08T21:52:35+01:00","size":491,"digest":"c9126e544c62508abfb898f0af0bd79c46f4c767c9ed6f928418a24b0f246d85","integrity":"sha256-yRJuVExiUIq/uJjwrwvXnEb0x2fJ7W+ShBiiSw8kbYU="},"flags/1x1/gy-0e3b849ce460f8ab1ec7cf66a25be1ba91e89b72d8b0aa679a0553464f37a972.svg":{"logical_path":"flags/1x1/gy.svg","mtime":"2020-02-08T21:52:35+01:00","size":484,"digest":"0e3b849ce460f8ab1ec7cf66a25be1ba91e89b72d8b0aa679a0553464f37a972","integrity":"sha256-DjuEnORg+Ksex89molvhupHom3LYsKpnmgVTRk83qXI="},"flags/4x3/hk-cece9126ccbf9151feadfed75791ebf32d4a16beab12f182404519d0cc24eec7.svg":{"logical_path":"flags/4x3/hk.svg","mtime":"2020-02-08T21:52:35+01:00","size":3511,"digest":"cece9126ccbf9151feadfed75791ebf32d4a16beab12f182404519d0cc24eec7","integrity":"sha256-zs6RJsy/kVH+rf7XV5Hr8y1KFr6rEvGCQEUZ0Mwk7sc="},"flags/1x1/hk-9fad00e06f9034877149394914baa2bc3292223b0e32df2b1f9399d4de6e167d.svg":{"logical_path":"flags/1x1/hk.svg","mtime":"2020-02-08T21:52:35+01:00","size":3561,"digest":"9fad00e06f9034877149394914baa2bc3292223b0e32df2b1f9399d4de6e167d","integrity":"sha256-n60A4G+QNIdxSTlJFLqivDKSIjsOMt8rH5OZ1N5uFn0="},"flags/4x3/hm-4b4923b81da24d62ebf31a9bc0addf76beef84593374b1cbd03ba19f3b12e3e9.svg":{"logical_path":"flags/4x3/hm.svg","mtime":"2020-02-08T21:52:35+01:00","size":1328,"digest":"4b4923b81da24d62ebf31a9bc0addf76beef84593374b1cbd03ba19f3b12e3e9","integrity":"sha256-S0kjuB2iTWLr8xqbwK3fdr7vhFkzdLHL0DuhnzsS4+k="},"flags/1x1/hm-776c822113a22e83581234d05f40bfc0ed38b60648d87f513f3da3fff96ffb61.svg":{"logical_path":"flags/1x1/hm.svg","mtime":"2020-02-08T21:52:35+01:00","size":1312,"digest":"776c822113a22e83581234d05f40bfc0ed38b60648d87f513f3da3fff96ffb61","integrity":"sha256-d2yCIROiLoNYEjTQX0C/wO04tgZI2H9RPz2j//lv+2E="},"flags/4x3/hn-855c830786283862a5f399e0d69dffe52b6223b91b32e31b55d55c82f2fa32c9.svg":{"logical_path":"flags/4x3/hn.svg","mtime":"2020-02-08T21:52:35+01:00","size":1115,"digest":"855c830786283862a5f399e0d69dffe52b6223b91b32e31b55d55c82f2fa32c9","integrity":"sha256-hVyDB4YoOGKl85ng1p3/5StiI7kbMuMbVdVcgvL6Msk="},"flags/1x1/hn-64c38bac9403417c4e276bf5536d284fc5410fc04b80acd39a961d298f430dbd.svg":{"logical_path":"flags/1x1/hn.svg","mtime":"2020-02-08T21:52:35+01:00","size":1119,"digest":"64c38bac9403417c4e276bf5536d284fc5410fc04b80acd39a961d298f430dbd","integrity":"sha256-ZMOLrJQDQXxOJ2v1U20oT8VBD8BLgKzTmpYdKY9DDb0="},"flags/4x3/hr-c8cad861f7398a22b9d27ea682d2778df0dde8e146d30142b5294daf988854af.svg":{"logical_path":"flags/4x3/hr.svg","mtime":"2020-02-08T21:52:35+01:00","size":41617,"digest":"c8cad861f7398a22b9d27ea682d2778df0dde8e146d30142b5294daf988854af","integrity":"sha256-yMrYYfc5iiK50n6mgtJ3jfDd6OFG0wFCtSlNr5iIVK8="},"flags/1x1/hr-60c093df6760e4cc6abe26c37a52be3b51458f02712f18e11f08b07dc623b489.svg":{"logical_path":"flags/1x1/hr.svg","mtime":"2020-02-08T21:52:35+01:00","size":41808,"digest":"60c093df6760e4cc6abe26c37a52be3b51458f02712f18e11f08b07dc623b489","integrity":"sha256-YMCT32dg5MxqvibDelK+O1FFjwJxLxjhHwiwfcYjtIk="},"flags/4x3/ht-fe81da06228fa36e7f211bec0d9f0c020f5b9c7f81534b4cb2251848aa276b16.svg":{"logical_path":"flags/4x3/ht.svg","mtime":"2020-02-08T21:52:35+01:00","size":15231,"digest":"fe81da06228fa36e7f211bec0d9f0c020f5b9c7f81534b4cb2251848aa276b16","integrity":"sha256-/oHaBiKPo25/IRvsDZ8MAg9bnH+BU0tMsiUYSKonaxY="},"flags/1x1/ht-dd0197c078859c5a66ff3a51d3a3f92809768e36bfabdec0fc0ab60d068afcd9.svg":{"logical_path":"flags/1x1/ht.svg","mtime":"2020-02-08T21:52:35+01:00","size":15317,"digest":"dd0197c078859c5a66ff3a51d3a3f92809768e36bfabdec0fc0ab60d068afcd9","integrity":"sha256-3QGXwHiFnFpm/zpR06P5KAl2jja/q97A/Aq2DQaK/Nk="},"flags/4x3/hu-9aa998e636687aede491e307f3d068dbe58f2d90bfdfaec0e7ad03baa5b36344.svg":{"logical_path":"flags/4x3/hu.svg","mtime":"2020-02-08T21:52:35+01:00","size":277,"digest":"9aa998e636687aede491e307f3d068dbe58f2d90bfdfaec0e7ad03baa5b36344","integrity":"sha256-mqmY5jZoeu3kkeMH89Bo2+WPLZC/367A560DuqWzY0Q="},"flags/1x1/hu-06858d0fbd4320496e849010e35c8fe82eb618188cf6ec329aef93f5e7af1c23.svg":{"logical_path":"flags/1x1/hu.svg","mtime":"2020-02-08T21:52:35+01:00","size":279,"digest":"06858d0fbd4320496e849010e35c8fe82eb618188cf6ec329aef93f5e7af1c23","integrity":"sha256-BoWND71DIEluhJAQ41yP6C62GBiM9uwymu+T9eevHCM="},"flags/4x3/id-775dbfedd6533afdf5bd017ccc1ad4f8f4238cbe87393d9c837a669196f17293.svg":{"logical_path":"flags/4x3/id.svg","mtime":"2020-02-08T21:52:35+01:00","size":240,"digest":"775dbfedd6533afdf5bd017ccc1ad4f8f4238cbe87393d9c837a669196f17293","integrity":"sha256-d12/7dZTOv31vQF8zBrU+PQjjL6HOT2cg3pmkZbxcpM="},"flags/1x1/id-3920ce662a7ea937b2c11707d8e1f53db52611dd004edf753b0389ed490d9d29.svg":{"logical_path":"flags/1x1/id.svg","mtime":"2020-02-08T21:52:35+01:00","size":242,"digest":"3920ce662a7ea937b2c11707d8e1f53db52611dd004edf753b0389ed490d9d29","integrity":"sha256-OSDOZip+qTeywRcH2OH1PbUmEd0ATt91OwOJ7UkNnSk="},"flags/4x3/ie-6368a1c92440fcf80d3c35607543bcaa2d4662d6e0bc7acf6749ddbc418a72c0.svg":{"logical_path":"flags/4x3/ie.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"6368a1c92440fcf80d3c35607543bcaa2d4662d6e0bc7acf6749ddbc418a72c0","integrity":"sha256-Y2ihySRA/PgNPDVgdUO8qi1GYtbgvHrPZ0ndvEGKcsA="},"flags/1x1/ie-1997e9de640fa764677aa8f5d52f7888bb24a029160e8f67b06dbd043b4f11b3.svg":{"logical_path":"flags/1x1/ie.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"1997e9de640fa764677aa8f5d52f7888bb24a029160e8f67b06dbd043b4f11b3","integrity":"sha256-GZfp3mQPp2Rneqj11S94iLskoCkWDo9nsG29BDtPEbM="},"flags/4x3/il-d76883a2330f9a05a4a64990ba955fc1be90bb46bcb19ae548c21816e7e74178.svg":{"logical_path":"flags/4x3/il.svg","mtime":"2020-02-08T21:52:35+01:00","size":898,"digest":"d76883a2330f9a05a4a64990ba955fc1be90bb46bcb19ae548c21816e7e74178","integrity":"sha256-12iDojMPmgWkpkmQupVfwb6Qu0a8sZrlSMIYFufnQXg="},"flags/1x1/il-f5e643d0e10169a438119dc441ea3100b52a2ff569bbb3a3ad6d1131b47602d8.svg":{"logical_path":"flags/1x1/il.svg","mtime":"2020-02-08T21:52:35+01:00","size":851,"digest":"f5e643d0e10169a438119dc441ea3100b52a2ff569bbb3a3ad6d1131b47602d8","integrity":"sha256-9eZD0OEBaaQ4EZ3EQeoxALUqL/Vpu7OjrW0RMbR2Atg="},"flags/4x3/im-bbae8aa9dd129f8446556afe4904194ad43377d882f9a705fcf1da2bdbfabccf.svg":{"logical_path":"flags/4x3/im.svg","mtime":"2020-02-08T21:52:35+01:00","size":9948,"digest":"bbae8aa9dd129f8446556afe4904194ad43377d882f9a705fcf1da2bdbfabccf","integrity":"sha256-u66Kqd0Sn4RGVWr+SQQZStQzd9iC+acF/PHaK9v6vM8="},"flags/1x1/im-767d72c2e72d732d65c9b016adad983778dfbbb2b5b52e71830f4e41297728d3.svg":{"logical_path":"flags/1x1/im.svg","mtime":"2020-02-08T21:52:35+01:00","size":10295,"digest":"767d72c2e72d732d65c9b016adad983778dfbbb2b5b52e71830f4e41297728d3","integrity":"sha256-dn1ywuctcy1lybAWra2YN3jfu7K1tS5xgw9OQSl3KNM="},"flags/4x3/in-519e33321b8b2ba70a0b7557d66c62d7efdc9723896c49f82528b107028ffe29.svg":{"logical_path":"flags/4x3/in.svg","mtime":"2020-02-08T21:52:35+01:00","size":1077,"digest":"519e33321b8b2ba70a0b7557d66c62d7efdc9723896c49f82528b107028ffe29","integrity":"sha256-UZ4zMhuLK6cKC3VX1mxi1+/clyOJbEn4JSixBwKP/ik="},"flags/1x1/in-27831f76dc6a218a529b6e5d0eafc4c19c999461327b7c013f59226c0601a361.svg":{"logical_path":"flags/1x1/in.svg","mtime":"2020-02-08T21:52:35+01:00","size":1091,"digest":"27831f76dc6a218a529b6e5d0eafc4c19c999461327b7c013f59226c0601a361","integrity":"sha256-J4MfdtxqIYpSm25dDq/EwZyZlGEye3wBP1kibAYBo2E="},"flags/4x3/io-8d25a8e98f682199b413adfbcb6898c37058c9bae085e427fbab03d56e8c0de6.svg":{"logical_path":"flags/4x3/io.svg","mtime":"2020-02-08T21:52:35+01:00","size":27446,"digest":"8d25a8e98f682199b413adfbcb6898c37058c9bae085e427fbab03d56e8c0de6","integrity":"sha256-jSWo6Y9oIZm0E637y2iYw3BYybrgheQn+6sD1W6MDeY="},"flags/1x1/io-627f3b0cef72fd91ff426d74a007dc32d74c9fe677cf2c8355cba84359e16fde.svg":{"logical_path":"flags/1x1/io.svg","mtime":"2020-02-08T21:52:35+01:00","size":27497,"digest":"627f3b0cef72fd91ff426d74a007dc32d74c9fe677cf2c8355cba84359e16fde","integrity":"sha256-Yn87DO9y/ZH/Qm10oAfcMtdMn+Z3zyyDVcuoQ1nhb94="},"flags/4x3/iq-96b24d1439184d0a4c35ca7cea65e5f20469a0e8c8438963aad016e59c399cc6.svg":{"logical_path":"flags/4x3/iq.svg","mtime":"2020-02-08T21:52:35+01:00","size":1479,"digest":"96b24d1439184d0a4c35ca7cea65e5f20469a0e8c8438963aad016e59c399cc6","integrity":"sha256-lrJNFDkYTQpMNcp86mXl8gRpoOjIQ4ljqtAW5Zw5nMY="},"flags/1x1/iq-af04db139f8c44cfe0c612e2c05e848ccfad88fbbfcb58e88cdb7c80db365669.svg":{"logical_path":"flags/1x1/iq.svg","mtime":"2020-02-08T21:52:35+01:00","size":1484,"digest":"af04db139f8c44cfe0c612e2c05e848ccfad88fbbfcb58e88cdb7c80db365669","integrity":"sha256-rwTbE5+MRM/gxhLiwF6EjM+tiPu/y1jojNt8gNs2Vmk="},"flags/4x3/ir-db2c230d355ade2b1ac235ec647bb1535e4703c639a44f9ce112473272ee1019.svg":{"logical_path":"flags/4x3/ir.svg","mtime":"2020-02-08T21:52:35+01:00","size":15484,"digest":"db2c230d355ade2b1ac235ec647bb1535e4703c639a44f9ce112473272ee1019","integrity":"sha256-2ywjDTVa3isawjXsZHuxU15HA8Y5pE+c4RJHMnLuEBk="},"flags/1x1/ir-c648cbf56fc8f324fda477ea816783c9df8a7d398f45f5f94acc1c16c8877b63.svg":{"logical_path":"flags/1x1/ir.svg","mtime":"2020-02-08T21:52:35+01:00","size":15387,"digest":"c648cbf56fc8f324fda477ea816783c9df8a7d398f45f5f94acc1c16c8877b63","integrity":"sha256-xkjL9W/I8yT9pHfqgWeDyd+KfTmPRfX5SswcFsiHe2M="},"flags/4x3/is-29508693138977229758b0f322ba34e90dbcd7a8a74e8820729933d24051d9a7.svg":{"logical_path":"flags/4x3/is.svg","mtime":"2020-02-08T21:52:35+01:00","size":521,"digest":"29508693138977229758b0f322ba34e90dbcd7a8a74e8820729933d24051d9a7","integrity":"sha256-KVCGkxOJdyKXWLDzIro06Q2816inToggcpkz0kBR2ac="},"flags/1x1/is-b1c5db1d4b4853b8144f1d88ababbf14fc88752340457ba3e2c94ab5d54c9c01.svg":{"logical_path":"flags/1x1/is.svg","mtime":"2020-02-08T21:52:35+01:00","size":529,"digest":"b1c5db1d4b4853b8144f1d88ababbf14fc88752340457ba3e2c94ab5d54c9c01","integrity":"sha256-scXbHUtIU7gUTx2Iq6u/FPyIdSNARXuj4slKtdVMnAE="},"flags/4x3/it-d2c168050fc509adac1163b097b0ed409217560735b27802ae9259587c146562.svg":{"logical_path":"flags/4x3/it.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"d2c168050fc509adac1163b097b0ed409217560735b27802ae9259587c146562","integrity":"sha256-0sFoBQ/FCa2sEWOwl7DtQJIXVgc1sngCrpJZWHwUZWI="},"flags/1x1/it-592d34fb666430fa00f98d333623d5efa3c8e0e65ac4eee06bbc4c1de7ce4bea.svg":{"logical_path":"flags/1x1/it.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"592d34fb666430fa00f98d333623d5efa3c8e0e65ac4eee06bbc4c1de7ce4bea","integrity":"sha256-WS00+2ZkMPoA+Y0zNiPV76PI4OZaxO7ga7xMHefOS+o="},"flags/4x3/je-b363a4e3a21630f10791c2ebeb7f918320816ef87c155d4fd29ce37982f4df35.svg":{"logical_path":"flags/4x3/je.svg","mtime":"2020-02-08T21:52:35+01:00","size":4776,"digest":"b363a4e3a21630f10791c2ebeb7f918320816ef87c155d4fd29ce37982f4df35","integrity":"sha256-s2Ok46IWMPEHkcLr63+RgyCBbvh8FV1P0pzjeYL03zU="},"flags/1x1/je-6d43f74e30e099bc056da925ec34c0200708f0a6e90da34db1e59d54ce10cfd9.svg":{"logical_path":"flags/1x1/je.svg","mtime":"2020-02-08T21:52:35+01:00","size":4757,"digest":"6d43f74e30e099bc056da925ec34c0200708f0a6e90da34db1e59d54ce10cfd9","integrity":"sha256-bUP3TjDgmbwFbakl7DTAIAcI8KbpDaNNseWdVM4Qz9k="},"flags/4x3/jm-3d133fbc2564f29e036855e8be224d1579fe66fe49e0f5a2ba0bdcf3cb272823.svg":{"logical_path":"flags/4x3/jm.svg","mtime":"2020-02-08T21:52:35+01:00","size":392,"digest":"3d133fbc2564f29e036855e8be224d1579fe66fe49e0f5a2ba0bdcf3cb272823","integrity":"sha256-PRM/vCVk8p4DaFXoviJNFXn+Zv5J4PWiugvc88snKCM="},"flags/1x1/jm-1aea8ea5d8cbc717fa3ef331d8caa9a1421c88a7bd076e40f8276a5b6f8d0467.svg":{"logical_path":"flags/1x1/jm.svg","mtime":"2020-02-08T21:52:35+01:00","size":392,"digest":"1aea8ea5d8cbc717fa3ef331d8caa9a1421c88a7bd076e40f8276a5b6f8d0467","integrity":"sha256-GuqOpdjLxxf6PvMx2MqpoUIciKe9B25A+CdqW2+NBGc="},"flags/4x3/jo-eee432339f8ea6750987e1121187eb4b53ec537dd7ccb240c018de63f7a92db6.svg":{"logical_path":"flags/4x3/jo.svg","mtime":"2020-02-08T21:52:35+01:00","size":717,"digest":"eee432339f8ea6750987e1121187eb4b53ec537dd7ccb240c018de63f7a92db6","integrity":"sha256-7uQyM5+OpnUJh+ESEYfrS1PsU33XzLJAwBjeY/epLbY="},"flags/1x1/jo-7969b2083c535c85b7e714b755459a6606940e0b5ddb1b71e24daf0a180d14aa.svg":{"logical_path":"flags/1x1/jo.svg","mtime":"2020-02-08T21:52:35+01:00","size":694,"digest":"7969b2083c535c85b7e714b755459a6606940e0b5ddb1b71e24daf0a180d14aa","integrity":"sha256-eWmyCDxTXIW35xS3VUWaZgaUDgtd2xtx4k2vChgNFKo="},"flags/4x3/jp-2eadcfc67ba8cd50c1da86e08e6778e0102c3072865dab8c312cc88006da0abe.svg":{"logical_path":"flags/4x3/jp.svg","mtime":"2020-02-08T21:52:35+01:00","size":484,"digest":"2eadcfc67ba8cd50c1da86e08e6778e0102c3072865dab8c312cc88006da0abe","integrity":"sha256-Lq3PxnuozVDB2obgjmd44BAsMHKGXauMMSzIgAbaCr4="},"flags/1x1/jp-551281a75e6c6fd64eb65b39f56102b52c182f6c38ee045c9422f6592f0f65c5.svg":{"logical_path":"flags/1x1/jp.svg","mtime":"2020-02-08T21:52:35+01:00","size":500,"digest":"551281a75e6c6fd64eb65b39f56102b52c182f6c38ee045c9422f6592f0f65c5","integrity":"sha256-VRKBp15sb9ZOtls59WECtSwYL2w47gRclCL2WS8PZcU="},"flags/4x3/ke-45790bc3ec1ed8ed0124777a7c9e09163353b5af4ff70ae6604a61b53712df4b.svg":{"logical_path":"flags/4x3/ke.svg","mtime":"2020-02-08T21:52:35+01:00","size":1383,"digest":"45790bc3ec1ed8ed0124777a7c9e09163353b5af4ff70ae6604a61b53712df4b","integrity":"sha256-RXkLw+we2O0BJHd6fJ4JFjNTta9P9wrmYEphtTcS30s="},"flags/1x1/ke-2cca24ecf024b801543c0572efc9969ffdaf25cec313e2149c64961839bc301b.svg":{"logical_path":"flags/1x1/ke.svg","mtime":"2020-02-08T21:52:35+01:00","size":1495,"digest":"2cca24ecf024b801543c0572efc9969ffdaf25cec313e2149c64961839bc301b","integrity":"sha256-LMok7PAkuAFUPAVy78mWn/2vJc7DE+IUnGSWGDm8MBs="},"flags/4x3/kg-3879f8931d74cc9c5927261f4095b2bb786f3d62c803b2a96ec550a23fae9f49.svg":{"logical_path":"flags/4x3/kg.svg","mtime":"2020-02-08T21:52:35+01:00","size":3387,"digest":"3879f8931d74cc9c5927261f4095b2bb786f3d62c803b2a96ec550a23fae9f49","integrity":"sha256-OHn4kx10zJxZJyYfQJWyu3hvPWLIA7KpbsVQoj+un0k="},"flags/1x1/kg-74318932808f85b72df308358f2f2699ab0cb7ab4f7ad3c84c4be4024f0fb140.svg":{"logical_path":"flags/1x1/kg.svg","mtime":"2020-02-08T21:52:35+01:00","size":3337,"digest":"74318932808f85b72df308358f2f2699ab0cb7ab4f7ad3c84c4be4024f0fb140","integrity":"sha256-dDGJMoCPhbct8wg1jy8mmasMt6tPetPITEvkAk8PsUA="},"flags/4x3/kh-7409fab4ba4e676db7b5c61020b97893b1735fe0b8e39e9b4f96108400be704e.svg":{"logical_path":"flags/4x3/kh.svg","mtime":"2020-02-08T21:52:35+01:00","size":7295,"digest":"7409fab4ba4e676db7b5c61020b97893b1735fe0b8e39e9b4f96108400be704e","integrity":"sha256-dAn6tLpOZ223tcYQILl4k7FzX+C4456bT5YQhAC+cE4="},"flags/1x1/kh-2603f6a61b400cb12b87397eeba60ae1707511467d5e0c430c05809bf89e5042.svg":{"logical_path":"flags/1x1/kh.svg","mtime":"2020-02-08T21:52:35+01:00","size":7296,"digest":"2603f6a61b400cb12b87397eeba60ae1707511467d5e0c430c05809bf89e5042","integrity":"sha256-JgP2phtADLErhzl+66YK4XB1EUZ9XgxDDAWAm/ieUEI="},"flags/4x3/ki-617c1b52f3d9aee99d094edbd1775cae77aade266a1318eb4671b2bb1620ded5.svg":{"logical_path":"flags/4x3/ki.svg","mtime":"2020-02-08T21:52:35+01:00","size":5818,"digest":"617c1b52f3d9aee99d094edbd1775cae77aade266a1318eb4671b2bb1620ded5","integrity":"sha256-YXwbUvPZrumdCU7b0Xdcrneq3iZqExjrRnGyuxYg3tU="},"flags/1x1/ki-74615266b440a24f09abdeae3853d7e1111f0eba77df71ccd176d83fbd1fd9ad.svg":{"logical_path":"flags/1x1/ki.svg","mtime":"2020-02-08T21:52:35+01:00","size":5955,"digest":"74615266b440a24f09abdeae3853d7e1111f0eba77df71ccd176d83fbd1fd9ad","integrity":"sha256-dGFSZrRAok8Jq96uOFPX4REfDrp333HM0XbYP70f2a0="},"flags/4x3/km-0c9bcbf7e677a541fc8dff6f848c9d92b6982ac2934ae75faa56a2b846bb5698.svg":{"logical_path":"flags/4x3/km.svg","mtime":"2020-02-08T21:52:35+01:00","size":1061,"digest":"0c9bcbf7e677a541fc8dff6f848c9d92b6982ac2934ae75faa56a2b846bb5698","integrity":"sha256-DJvL9+Z3pUH8jf9vhIydkraYKsKTSudfqlaiuEa7Vpg="},"flags/1x1/km-81b0fbe53d09194270e8ed4cbe9be8eb1ae727e77957005369ad8bdc651dd1c8.svg":{"logical_path":"flags/1x1/km.svg","mtime":"2020-02-08T21:52:35+01:00","size":1044,"digest":"81b0fbe53d09194270e8ed4cbe9be8eb1ae727e77957005369ad8bdc651dd1c8","integrity":"sha256-gbD75T0JGUJw6O1Mvpvo6xrnJ+d5VwBTaa2L3GUd0cg="},"flags/4x3/kn-0442f55f81cd3b1057c609301f0af2b503d89a895a954af8c970df997e92bd03.svg":{"logical_path":"flags/4x3/kn.svg","mtime":"2020-02-08T21:52:35+01:00","size":816,"digest":"0442f55f81cd3b1057c609301f0af2b503d89a895a954af8c970df997e92bd03","integrity":"sha256-BEL1X4HNOxBXxgkwHwrytQPYmolalUr4yXDfmX6SvQM="},"flags/1x1/kn-897c34ef54bee486f0d24d2191e2400f49a19d98efb19f8c3f1a27fb0b97131a.svg":{"logical_path":"flags/1x1/kn.svg","mtime":"2020-02-08T21:52:35+01:00","size":820,"digest":"897c34ef54bee486f0d24d2191e2400f49a19d98efb19f8c3f1a27fb0b97131a","integrity":"sha256-iXw071S+5Ibw0k0hkeJAD0mhnZjvsZ+MPxon+wuXExo="},"flags/4x3/kp-a54f7201982b29530381b71a5e2a11c1153860f22c04c0a2d91bb0d20fedf78e.svg":{"logical_path":"flags/4x3/kp.svg","mtime":"2020-02-08T21:52:35+01:00","size":792,"digest":"a54f7201982b29530381b71a5e2a11c1153860f22c04c0a2d91bb0d20fedf78e","integrity":"sha256-pU9yAZgrKVMDgbcaXioRwRU4YPIsBMCi2Ruw0g/t944="},"flags/1x1/kp-758eccd89ef3707808fb68d931f086e49333904f4cc67c88468f3c96fb43b7b6.svg":{"logical_path":"flags/1x1/kp.svg","mtime":"2020-02-08T21:52:35+01:00","size":855,"digest":"758eccd89ef3707808fb68d931f086e49333904f4cc67c88468f3c96fb43b7b6","integrity":"sha256-dY7M2J7zcHgI+2jZMfCG5JMzkE9MxnyIRo88lvtDt7Y="},"flags/4x3/kr-c0b9b2c854133410c0ad9cadbc10b1e0bacf0305519883126d55bfa3214f9d06.svg":{"logical_path":"flags/4x3/kr.svg","mtime":"2020-02-08T21:52:35+01:00","size":1827,"digest":"c0b9b2c854133410c0ad9cadbc10b1e0bacf0305519883126d55bfa3214f9d06","integrity":"sha256-wLmyyFQTNBDArZytvBCx4LrPAwVRmIMSbVW/oyFPnQY="},"flags/1x1/kr-7c0457ac5d284b28b742ea2e061a1aa2a35f63171e464b3a7eb501a48756ce7b.svg":{"logical_path":"flags/1x1/kr.svg","mtime":"2020-02-08T21:52:35+01:00","size":1733,"digest":"7c0457ac5d284b28b742ea2e061a1aa2a35f63171e464b3a7eb501a48756ce7b","integrity":"sha256-fARXrF0oSyi3QuouBhoaoqNfYxceRks6frUBpIdWzns="},"flags/4x3/kw-81c3d5d25c7b840ef14783b51d18c6b7cfc61f94932c664bbc9e5879fef020eb.svg":{"logical_path":"flags/4x3/kw.svg","mtime":"2020-02-08T21:52:35+01:00","size":506,"digest":"81c3d5d25c7b840ef14783b51d18c6b7cfc61f94932c664bbc9e5879fef020eb","integrity":"sha256-gcPV0lx7hA7xR4O1HRjGt8/GH5STLGZLvJ5Yef7wIOs="},"flags/1x1/kw-66670211a67a4e61d4652a19d821dc5195f01a28a3a9b28b7e4c6048cd86b19c.svg":{"logical_path":"flags/1x1/kw.svg","mtime":"2020-02-08T21:52:35+01:00","size":510,"digest":"66670211a67a4e61d4652a19d821dc5195f01a28a3a9b28b7e4c6048cd86b19c","integrity":"sha256-ZmcCEaZ6TmHUZSoZ2CHcUZXwGiijqbKLfkxgSM2GsZw="},"flags/4x3/ky-0f4ab66d951ae33f800d680aaa5704804ba9c8844d4d80e5bee2e3fa0e100af3.svg":{"logical_path":"flags/4x3/ky.svg","mtime":"2020-02-08T21:52:35+01:00","size":21886,"digest":"0f4ab66d951ae33f800d680aaa5704804ba9c8844d4d80e5bee2e3fa0e100af3","integrity":"sha256-D0q2bZUa4z+ADWgKqlcEgEupyIRNTYDlvuLj+g4QCvM="},"flags/1x1/ky-fb5f57bb58b74d23377bad9954a75ab88d1587af68546ce137a6ae7a88a7701e.svg":{"logical_path":"flags/1x1/ky.svg","mtime":"2020-02-08T21:52:35+01:00","size":22495,"digest":"fb5f57bb58b74d23377bad9954a75ab88d1587af68546ce137a6ae7a88a7701e","integrity":"sha256-+19Xu1i3TSM3e62ZVKdauI0Vh69oVGzhN6aueoincB4="},"flags/4x3/kz-39edc952c598c71be2c9510944a8faf708d8e4b367b5ad78a688d1cd37f522eb.svg":{"logical_path":"flags/4x3/kz.svg","mtime":"2020-02-08T21:52:35+01:00","size":11339,"digest":"39edc952c598c71be2c9510944a8faf708d8e4b367b5ad78a688d1cd37f522eb","integrity":"sha256-Oe3JUsWYxxviyVEJRKj69wjY5LNnta14pojRzTf1Ius="},"flags/1x1/kz-924c04dc19267b049f35213af0e2b0c540933c06389433cb4aacd8dda33b286c.svg":{"logical_path":"flags/1x1/kz.svg","mtime":"2020-02-08T21:52:35+01:00","size":11433,"digest":"924c04dc19267b049f35213af0e2b0c540933c06389433cb4aacd8dda33b286c","integrity":"sha256-kkwE3BkmewSfNSE68OKwxUCTPAY4lDPLSqzY3aM7KGw="},"flags/4x3/la-e3a36a3bd0003442c3a21d3a192995fa6fb3b3c08a2daadc8f38f62736b5b1e3.svg":{"logical_path":"flags/4x3/la.svg","mtime":"2020-02-08T21:52:35+01:00","size":457,"digest":"e3a36a3bd0003442c3a21d3a192995fa6fb3b3c08a2daadc8f38f62736b5b1e3","integrity":"sha256-46NqO9AANELDoh06GSmV+m+zs8CKLarcjzj2Jza1seM="},"flags/1x1/la-c9d4223a897e5e2938a4892bbc593d3828093b9439fc3f6de21520e4013ddbc5.svg":{"logical_path":"flags/1x1/la.svg","mtime":"2020-02-08T21:52:35+01:00","size":507,"digest":"c9d4223a897e5e2938a4892bbc593d3828093b9439fc3f6de21520e4013ddbc5","integrity":"sha256-ydQiOol+Xik4pIkrvFk9OCgJO5Q5/D9t4hUg5AE928U="},"flags/4x3/lb-508c2a5a9b50d604895675b9f1c1e5914c394a7f468f5d823eb0476acaacbc7f.svg":{"logical_path":"flags/4x3/lb.svg","mtime":"2020-02-08T21:52:35+01:00","size":2814,"digest":"508c2a5a9b50d604895675b9f1c1e5914c394a7f468f5d823eb0476acaacbc7f","integrity":"sha256-UIwqWptQ1gSJVnW58cHlkUw5Sn9Gj12CPrBHasqsvH8="},"flags/1x1/lb-10c9ba8ea7aa3189f16a7273c837982a887fc4ddfc9d514d8f5a660d72356f7f.svg":{"logical_path":"flags/1x1/lb.svg","mtime":"2020-02-08T21:52:35+01:00","size":2754,"digest":"10c9ba8ea7aa3189f16a7273c837982a887fc4ddfc9d514d8f5a660d72356f7f","integrity":"sha256-EMm6jqeqMYnxanJzyDeYKoh/xN38nVFNj1pmDXI1b38="},"flags/4x3/lc-04ccd92fb1578654181febaea30ebd6b6620f56115730b2a2d673c712307bf5c.svg":{"logical_path":"flags/4x3/lc.svg","mtime":"2020-02-08T21:52:35+01:00","size":373,"digest":"04ccd92fb1578654181febaea30ebd6b6620f56115730b2a2d673c712307bf5c","integrity":"sha256-BMzZL7FXhlQYH+uuow69a2Yg9WEVcwsqLWc8cSMHv1w="},"flags/1x1/lc-4ffb53afb8bd296d526ac26fd8007afc74855e92833a893d3c934a5d12eb152a.svg":{"logical_path":"flags/1x1/lc.svg","mtime":"2020-02-08T21:52:35+01:00","size":373,"digest":"4ffb53afb8bd296d526ac26fd8007afc74855e92833a893d3c934a5d12eb152a","integrity":"sha256-T/tTr7i9KW1SasJv2AB6/HSFXpKDOok9PJNKXRLrFSo="},"flags/4x3/li-3058dc4aeaf2bd2da8cb910892137d732b56e5e9d342e565a4059de1a8e40e40.svg":{"logical_path":"flags/4x3/li.svg","mtime":"2020-02-08T21:52:35+01:00","size":8327,"digest":"3058dc4aeaf2bd2da8cb910892137d732b56e5e9d342e565a4059de1a8e40e40","integrity":"sha256-MFjcSuryvS2oy5EIkhN9cytW5enTQuVlpAWd4ajkDkA="},"flags/1x1/li-0780a4f218b9ee466e33d14274b8a01575a86b3787b347e3269a3b301c220d5f.svg":{"logical_path":"flags/1x1/li.svg","mtime":"2020-02-08T21:52:35+01:00","size":8350,"digest":"0780a4f218b9ee466e33d14274b8a01575a86b3787b347e3269a3b301c220d5f","integrity":"sha256-B4Ck8hi57kZuM9FCdLigFXWoazeHs0fjJpo7MBwiDV8="},"flags/4x3/lk-a13d6ab1da51be3b1d2c5b80f4d866c923d42b017e197469e1bfc0dd021c4bfe.svg":{"logical_path":"flags/4x3/lk.svg","mtime":"2020-02-08T21:52:35+01:00","size":11333,"digest":"a13d6ab1da51be3b1d2c5b80f4d866c923d42b017e197469e1bfc0dd021c4bfe","integrity":"sha256-oT1qsdpRvjsdLFuA9NhmySPUKwF+GXRp4b/A3QIcS/4="},"flags/1x1/lk-99759363f0df6b868fd1398bf05666c680bafe1eeec8b859b64d450930213e02.svg":{"logical_path":"flags/1x1/lk.svg","mtime":"2020-02-08T21:52:35+01:00","size":11345,"digest":"99759363f0df6b868fd1398bf05666c680bafe1eeec8b859b64d450930213e02","integrity":"sha256-mXWTY/Dfa4aP0TmL8FZmxoC6/h7uyLhZtk1FCTAhPgI="},"flags/4x3/lr-b06a1d70899826b305ce387fa31e1fa0bdb3bcb17c1392f15f995ce1dba723cf.svg":{"logical_path":"flags/4x3/lr.svg","mtime":"2020-02-08T21:52:35+01:00","size":724,"digest":"b06a1d70899826b305ce387fa31e1fa0bdb3bcb17c1392f15f995ce1dba723cf","integrity":"sha256-sGodcImYJrMFzjh/ox4foL2zvLF8E5LxX5lc4dunI88="},"flags/1x1/lr-820a9d023e5b1e68ed640bfaba8f84ad4379c42a6c5c982cb76b0390dd2bcbdd.svg":{"logical_path":"flags/1x1/lr.svg","mtime":"2020-02-08T21:52:35+01:00","size":697,"digest":"820a9d023e5b1e68ed640bfaba8f84ad4379c42a6c5c982cb76b0390dd2bcbdd","integrity":"sha256-ggqdAj5bHmjtZAv6uo+ErUN5xCpsXJgst2sDkN0ry90="},"flags/4x3/ls-d02bcefe7c298c153665f35c33eedb08e2e2b345350e4bf1714a87abf86b2d0e.svg":{"logical_path":"flags/4x3/ls.svg","mtime":"2020-02-08T21:52:35+01:00","size":1222,"digest":"d02bcefe7c298c153665f35c33eedb08e2e2b345350e4bf1714a87abf86b2d0e","integrity":"sha256-0CvO/nwpjBU2ZfNcM+7bCOLis0U1DkvxcUqHq/hrLQ4="},"flags/1x1/ls-85c731c313a46db12bdb27fe229e9f7d052b447c624663b73ffa1dbab97f03fb.svg":{"logical_path":"flags/1x1/ls.svg","mtime":"2020-02-08T21:52:35+01:00","size":1245,"digest":"85c731c313a46db12bdb27fe229e9f7d052b447c624663b73ffa1dbab97f03fb","integrity":"sha256-hccxwxOkbbEr2yf+Ip6ffQUrRHxiRmO3P/odurl/A/s="},"flags/4x3/lt-c08eb18a15d2003cb544432b11c5081d3d5741370669b4df306d1c6bce14cb51.svg":{"logical_path":"flags/4x3/lt.svg","mtime":"2020-02-08T21:52:35+01:00","size":445,"digest":"c08eb18a15d2003cb544432b11c5081d3d5741370669b4df306d1c6bce14cb51","integrity":"sha256-wI6xihXSADy1REMrEcUIHT1XQTcGabTfMG0ca84Uy1E="},"flags/1x1/lt-c1bd7e3d289ac9b0df06d47237780eaf4d30f01281ed50a7df9a22bc3a2489c5.svg":{"logical_path":"flags/1x1/lt.svg","mtime":"2020-02-08T21:52:35+01:00","size":445,"digest":"c1bd7e3d289ac9b0df06d47237780eaf4d30f01281ed50a7df9a22bc3a2489c5","integrity":"sha256-wb1+PSiaybDfBtRyN3gOr00w8BKB7VCn35oivDokicU="},"flags/4x3/lu-99e7b6adb3a9e0f867b17eb3b1f0f33db92fd27cfd7b651f62453f359bace22f.svg":{"logical_path":"flags/4x3/lu.svg","mtime":"2020-02-08T21:52:35+01:00","size":231,"digest":"99e7b6adb3a9e0f867b17eb3b1f0f33db92fd27cfd7b651f62453f359bace22f","integrity":"sha256-mee2rbOp4PhnsX6zsfDzPbkv0nz9e2UfYkU/NZus4i8="},"flags/1x1/lu-ab544445f16afa450549288ac86c2cc9a458a9d7747b3a89d5ecef7db9c83ce7.svg":{"logical_path":"flags/1x1/lu.svg","mtime":"2020-02-08T21:52:35+01:00","size":235,"digest":"ab544445f16afa450549288ac86c2cc9a458a9d7747b3a89d5ecef7db9c83ce7","integrity":"sha256-q1RERfFq+kUFSSiKyGwsyaRYqdd0ezqJ1ezvfbnIPOc="},"flags/4x3/lv-f8844d50b89f0369f73d580d3676553e7e55dd8ab2460e592a29a530d9bed886.svg":{"logical_path":"flags/4x3/lv.svg","mtime":"2020-02-08T21:52:35+01:00","size":236,"digest":"f8844d50b89f0369f73d580d3676553e7e55dd8ab2460e592a29a530d9bed886","integrity":"sha256-+IRNULifA2n3PVgNNnZVPn5V3YqyRg5ZKimlMNm+2IY="},"flags/1x1/lv-baeced49dd4249e36a25b0f23a5c601a69e9dee3137627cd4450194b85a99dd4.svg":{"logical_path":"flags/1x1/lv.svg","mtime":"2020-02-08T21:52:35+01:00","size":240,"digest":"baeced49dd4249e36a25b0f23a5c601a69e9dee3137627cd4450194b85a99dd4","integrity":"sha256-uuztSd1CSeNqJbDyOlxgGmnp3uMTdifNRFAZS4WpndQ="},"flags/4x3/ly-03209121483967f9d74849fb9261de23e9ff2e02c4e40b29f1cda0631b8a5fae.svg":{"logical_path":"flags/4x3/ly.svg","mtime":"2020-02-08T21:52:35+01:00","size":534,"digest":"03209121483967f9d74849fb9261de23e9ff2e02c4e40b29f1cda0631b8a5fae","integrity":"sha256-AyCRIUg5Z/nXSEn7kmHeI+n/LgLE5Asp8c2gYxuKX64="},"flags/1x1/ly-1e6e070aaa4bfc97a5a446a39bf746ab3c4c81d9f62c975cab164e16de3a3ffe.svg":{"logical_path":"flags/1x1/ly.svg","mtime":"2020-02-08T21:52:35+01:00","size":533,"digest":"1e6e070aaa4bfc97a5a446a39bf746ab3c4c81d9f62c975cab164e16de3a3ffe","integrity":"sha256-Hm4HCqpL/JelpEajm/dGqzxMgdn2LJdcqxZOFt46P/4="},"flags/4x3/ma-9a25cc7c2868fa45b251dd1b99a0be3b583df69732146142020fe9c6c0c95b63.svg":{"logical_path":"flags/4x3/ma.svg","mtime":"2020-02-08T21:52:35+01:00","size":253,"digest":"9a25cc7c2868fa45b251dd1b99a0be3b583df69732146142020fe9c6c0c95b63","integrity":"sha256-miXMfCho+kWyUd0bmaC+O1g99pcyFGFCAg/pxsDJW2M="},"flags/1x1/ma-4f18b9c355b8b8bf0db69badb235a183dbd558deb6439bf03b4f18e56837a7f3.svg":{"logical_path":"flags/1x1/ma.svg","mtime":"2020-02-08T21:52:35+01:00","size":253,"digest":"4f18b9c355b8b8bf0db69badb235a183dbd558deb6439bf03b4f18e56837a7f3","integrity":"sha256-Txi5w1W4uL8NtputsjWhg9vVWN62Q5vwO08Y5Wg3p/M="},"flags/4x3/mc-b0c50599ea2a550680a6a867579930e0b47d3e05193a7294a26b7849a7ad35e2.svg":{"logical_path":"flags/4x3/mc.svg","mtime":"2020-02-08T21:52:35+01:00","size":240,"digest":"b0c50599ea2a550680a6a867579930e0b47d3e05193a7294a26b7849a7ad35e2","integrity":"sha256-sMUFmeoqVQaApqhnV5kw4LR9PgUZOnKUomt4SaetNeI="},"flags/1x1/mc-8f1fe6210338399d8791d91f39234b1a09acf2aa5e0387696048dc7068534a28.svg":{"logical_path":"flags/1x1/mc.svg","mtime":"2020-02-08T21:52:35+01:00","size":240,"digest":"8f1fe6210338399d8791d91f39234b1a09acf2aa5e0387696048dc7068534a28","integrity":"sha256-jx/mIQM4OZ2HkdkfOSNLGgms8qpeA4dpYEjccGhTSig="},"flags/4x3/md-8849eef7bdf916e962f7bb31af87c8d47aef33f9f4a2017b2ce55c4166e79643.svg":{"logical_path":"flags/4x3/md.svg","mtime":"2020-02-08T21:52:35+01:00","size":11283,"digest":"8849eef7bdf916e962f7bb31af87c8d47aef33f9f4a2017b2ce55c4166e79643","integrity":"sha256-iEnu9735Fuli97sxr4fI1HrvM/n0ogF7LOVcQWbnlkM="},"flags/1x1/md-43f1bb4157545abe6e79215459efb548d913bbe7922078cd40cb722a4e19d9b4.svg":{"logical_path":"flags/1x1/md.svg","mtime":"2020-02-08T21:52:35+01:00","size":11387,"digest":"43f1bb4157545abe6e79215459efb548d913bbe7922078cd40cb722a4e19d9b4","integrity":"sha256-Q/G7QVdUWr5ueSFUWe+1SNkTu+eSIHjNQMtyKk4Z2bQ="},"flags/4x3/me-983d452d43cfb8d628bfc5c0cf4991c2ba3cf0e39e70aa5353cfd4e9ec3da62d.svg":{"logical_path":"flags/4x3/me.svg","mtime":"2020-02-08T21:52:35+01:00","size":63177,"digest":"983d452d43cfb8d628bfc5c0cf4991c2ba3cf0e39e70aa5353cfd4e9ec3da62d","integrity":"sha256-mD1FLUPPuNYov8XAz0mRwro88OOecKpTU8/U6ew9pi0="},"flags/1x1/me-104d6a96038ef06d3d8b89c9221996f3649b5b821139b11b2e07695b0f6fda2f.svg":{"logical_path":"flags/1x1/me.svg","mtime":"2020-02-08T21:52:35+01:00","size":64191,"digest":"104d6a96038ef06d3d8b89c9221996f3649b5b821139b11b2e07695b0f6fda2f","integrity":"sha256-EE1qlgOO8G09i4nJIhmW82SbW4IRObEbLgdpWw9v2i8="},"flags/4x3/mf-31fb851bfcc2340d2fa43e86a099cc7becfc8e7f996a4d2ca56bd050e6537086.svg":{"logical_path":"flags/4x3/mf.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"31fb851bfcc2340d2fa43e86a099cc7becfc8e7f996a4d2ca56bd050e6537086","integrity":"sha256-MfuFG/zCNA0vpD6GoJnMe+z8jn+Zak0spWvQUOZTcIY="},"flags/1x1/mf-fe20ce9bf911631d6e79edf21c8cff0716f2dc1ffded39515735444d9a66fa55.svg":{"logical_path":"flags/1x1/mf.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"fe20ce9bf911631d6e79edf21c8cff0716f2dc1ffded39515735444d9a66fa55","integrity":"sha256-/iDOm/kRYx1uee3yHIz/Bxby3B/97TlRVzVETZpm+lU="},"flags/4x3/mg-5effe963e29f804a26f95dbbc9519add454a0fd9eb918ddfeb55e1e99a1a2701.svg":{"logical_path":"flags/4x3/mg.svg","mtime":"2020-02-08T21:52:35+01:00","size":305,"digest":"5effe963e29f804a26f95dbbc9519add454a0fd9eb918ddfeb55e1e99a1a2701","integrity":"sha256-Xv/pY+KfgEom+V27yVGa3UVKD9nrkY3f61Xh6ZoaJwE="},"flags/1x1/mg-9e546cfb78810d9b25c814a84aadd6907880b8e0cdd2e4e30738b519e7c1ac91.svg":{"logical_path":"flags/1x1/mg.svg","mtime":"2020-02-08T21:52:35+01:00","size":305,"digest":"9e546cfb78810d9b25c814a84aadd6907880b8e0cdd2e4e30738b519e7c1ac91","integrity":"sha256-nlRs+3iBDZslyBSoSq3WkHiAuODN0uTjBzi1GefBrJE="},"flags/4x3/mh-d8cfd123007dbb99aa700c335957926a6d5e877ab49680c79629a32716d7a782.svg":{"logical_path":"flags/4x3/mh.svg","mtime":"2020-02-08T21:52:35+01:00","size":744,"digest":"d8cfd123007dbb99aa700c335957926a6d5e877ab49680c79629a32716d7a782","integrity":"sha256-2M/RIwB9u5mqcAwzWVeSam1eh3q0loDHlimjJxbXp4I="},"flags/1x1/mh-3fe03d4d063a4729fc8b68fd5e9d7d2eef6e65c4e82954c83f76b138cea2eb45.svg":{"logical_path":"flags/1x1/mh.svg","mtime":"2020-02-08T21:52:35+01:00","size":767,"digest":"3fe03d4d063a4729fc8b68fd5e9d7d2eef6e65c4e82954c83f76b138cea2eb45","integrity":"sha256-P+A9TQY6Ryn8i2j9Xp19Lu9uZcToKVTIP3axOM6i60U="},"flags/4x3/mk-6e8071d15f2ff125d30bf89d000dcb47db9545cf9b7ff04f1474650ec2f4d25c.svg":{"logical_path":"flags/4x3/mk.svg","mtime":"2020-02-08T21:52:35+01:00","size":385,"digest":"6e8071d15f2ff125d30bf89d000dcb47db9545cf9b7ff04f1474650ec2f4d25c","integrity":"sha256-boBx0V8v8SXTC/idAA3LR9uVRc+bf/BPFHRlDsL00lw="},"flags/1x1/mk-fdc9212f9f311cbface56b6587468a2e845111b697edc11b7edda9fcf100c1d5.svg":{"logical_path":"flags/1x1/mk.svg","mtime":"2020-02-08T21:52:35+01:00","size":413,"digest":"fdc9212f9f311cbface56b6587468a2e845111b697edc11b7edda9fcf100c1d5","integrity":"sha256-/ckhL58xHL+s5Wtlh0aKLoRREbaX7cEbft2p/PEAwdU="},"flags/4x3/ml-a730102e0c6f6362de9c10ef8da6cf7b123465d01a297e7a89808b01fa4771cd.svg":{"logical_path":"flags/4x3/ml.svg","mtime":"2020-02-08T21:52:35+01:00","size":279,"digest":"a730102e0c6f6362de9c10ef8da6cf7b123465d01a297e7a89808b01fa4771cd","integrity":"sha256-pzAQLgxvY2LenBDvjabPexI0ZdAaKX56iYCLAfpHcc0="},"flags/1x1/ml-a661355da206b0cb7ac4c84b6cdf7e411fbca8fcb271ae999fa60d5c67578192.svg":{"logical_path":"flags/1x1/ml.svg","mtime":"2020-02-08T21:52:35+01:00","size":282,"digest":"a661355da206b0cb7ac4c84b6cdf7e411fbca8fcb271ae999fa60d5c67578192","integrity":"sha256-pmE1XaIGsMt6xMhLbN9+QR+8qPyyca6Zn6YNXGdXgZI="},"flags/4x3/mm-6d0d207d662477110f2b863488088818d8400386358dcbc669a2d8c54d1bae16.svg":{"logical_path":"flags/4x3/mm.svg","mtime":"2020-02-08T21:52:35+01:00","size":851,"digest":"6d0d207d662477110f2b863488088818d8400386358dcbc669a2d8c54d1bae16","integrity":"sha256-bQ0gfWYkdxEPK4Y0iAiIGNhAA4Y1jcvGaaLYxU0brhY="},"flags/1x1/mm-de7d46b6543343af61ba997045cb41a707bd0db1e7a5879971ca8fddcbdf9e99.svg":{"logical_path":"flags/1x1/mm.svg","mtime":"2020-02-08T21:52:35+01:00","size":868,"digest":"de7d46b6543343af61ba997045cb41a707bd0db1e7a5879971ca8fddcbdf9e99","integrity":"sha256-3n1GtlQzQ69huplwRctBpwe9DbHnpYeZccqP3cvfnpk="},"flags/4x3/mn-656eb51e88bfce82401e4080eb791ddf16d571cbba102cdd4316c5de4711ac65.svg":{"logical_path":"flags/4x3/mn.svg","mtime":"2020-02-08T21:52:35+01:00","size":1256,"digest":"656eb51e88bfce82401e4080eb791ddf16d571cbba102cdd4316c5de4711ac65","integrity":"sha256-ZW61Hoi/zoJAHkCA63kd3xbVccu6ECzdQxbF3kcRrGU="},"flags/1x1/mn-ad22cb2c195a7d8ca8e4174db011d5f58238ee25039b5b2da2649d8ca8b00123.svg":{"logical_path":"flags/1x1/mn.svg","mtime":"2020-02-08T21:52:35+01:00","size":1263,"digest":"ad22cb2c195a7d8ca8e4174db011d5f58238ee25039b5b2da2649d8ca8b00123","integrity":"sha256-rSLLLBlafYyo5BdNsBHV9YI47iUDm1stomSdjKiwASM="},"flags/4x3/mo-37a1088aa687af13951bc93886e3e51cb246eccfde1b56528f189327ea291792.svg":{"logical_path":"flags/4x3/mo.svg","mtime":"2020-02-08T21:52:35+01:00","size":1516,"digest":"37a1088aa687af13951bc93886e3e51cb246eccfde1b56528f189327ea291792","integrity":"sha256-N6EIiqaHrxOVG8k4huPlHLJG7M/eG1ZSjxiTJ+opF5I="},"flags/1x1/mo-b463a1c37b69131d662e3fb2ae937583458824a09bcf68fc7ed2d7fd729138d1.svg":{"logical_path":"flags/1x1/mo.svg","mtime":"2020-02-08T21:52:35+01:00","size":1550,"digest":"b463a1c37b69131d662e3fb2ae937583458824a09bcf68fc7ed2d7fd729138d1","integrity":"sha256-tGOhw3tpEx1mLj+yrpN1g0WIJKCbz2j8ftLX/XKRONE="},"flags/4x3/mp-ecd12cadc358fdf293e856c0a3ffc09409123cabd3c7201225b2d21b59551e14.svg":{"logical_path":"flags/4x3/mp.svg","mtime":"2020-02-08T21:52:35+01:00","size":23425,"digest":"ecd12cadc358fdf293e856c0a3ffc09409123cabd3c7201225b2d21b59551e14","integrity":"sha256-7NEsrcNY/fKT6FbAo//AlAkSPKvTxyASJbLSG1lVHhQ="},"flags/1x1/mp-d1f4ba10c1409e713253f1fbb107eeccbd4ec1a8f9036663f1ac1991aee53835.svg":{"logical_path":"flags/1x1/mp.svg","mtime":"2020-02-08T21:52:35+01:00","size":23663,"digest":"d1f4ba10c1409e713253f1fbb107eeccbd4ec1a8f9036663f1ac1991aee53835","integrity":"sha256-0fS6EMFAnnEyU/H7sQfuzL1Owaj5A2Zj8awZka7lODU="},"flags/4x3/mq-b4e1b08a93c1364c79e6d61f95b16fca5b884da6e77835bc0e0adfff8ecc2d7f.svg":{"logical_path":"flags/4x3/mq.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"b4e1b08a93c1364c79e6d61f95b16fca5b884da6e77835bc0e0adfff8ecc2d7f","integrity":"sha256-tOGwipPBNkx55tYflbFvyluITabneDW8Dgrf/47MLX8="},"flags/1x1/mq-19cb6f7cb7354c3fd40e987c93a2d76329d34b2ed3873c3f25fe56802f251ea8.svg":{"logical_path":"flags/1x1/mq.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"19cb6f7cb7354c3fd40e987c93a2d76329d34b2ed3873c3f25fe56802f251ea8","integrity":"sha256-GctvfLc1TD/UDph8k6LXYynTSy7Thzw/Jf5WgC8lHqg="},"flags/4x3/mr-9f64af3ed5c6d8d1f68b5cb09fd1aa9d28c3c95107e063f64a0ef95f0cb9429a.svg":{"logical_path":"flags/4x3/mr.svg","mtime":"2020-02-08T21:52:35+01:00","size":450,"digest":"9f64af3ed5c6d8d1f68b5cb09fd1aa9d28c3c95107e063f64a0ef95f0cb9429a","integrity":"sha256-n2SvPtXG2NH2i1ywn9GqnSjDyVEH4GP2Sg75Xwy5Qpo="},"flags/1x1/mr-0e79b7bcc669bb871d94021db2b78b162b9867c7eaf934d8f7a3025fd5903576.svg":{"logical_path":"flags/1x1/mr.svg","mtime":"2020-02-08T21:52:35+01:00","size":438,"digest":"0e79b7bcc669bb871d94021db2b78b162b9867c7eaf934d8f7a3025fd5903576","integrity":"sha256-Dnm3vMZpu4cdlAIdsreLFiuYZ8fq+TTY96MCX9WQNXY="},"flags/4x3/ms-32620dd70353777b2ee62951556976f398cd38ae359b5a8c97311a1dc61eb8bc.svg":{"logical_path":"flags/4x3/ms.svg","mtime":"2020-02-08T21:52:35+01:00","size":6792,"digest":"32620dd70353777b2ee62951556976f398cd38ae359b5a8c97311a1dc61eb8bc","integrity":"sha256-MmIN1wNTd3su5ilRVWl285jNOK41m1qMlzEaHcYeuLw="},"flags/1x1/ms-4104d4f36cb5cf1c6de78e52e90bc3c5b8bfa262617b16a737673feb8c30a00c.svg":{"logical_path":"flags/1x1/ms.svg","mtime":"2020-02-08T21:52:35+01:00","size":6700,"digest":"4104d4f36cb5cf1c6de78e52e90bc3c5b8bfa262617b16a737673feb8c30a00c","integrity":"sha256-QQTU82y1zxxt545S6QvDxbi/omJhexanN2c/64wwoAw="},"flags/4x3/mt-0c9819aa69b34b84c1ee43620922737122eb38f107be9864a0690ac66ef8aa64.svg":{"logical_path":"flags/4x3/mt.svg","mtime":"2020-02-08T21:52:35+01:00","size":8807,"digest":"0c9819aa69b34b84c1ee43620922737122eb38f107be9864a0690ac66ef8aa64","integrity":"sha256-DJgZqmmzS4TB7kNiCSJzcSLrOPEHvphkoGkKxm74qmQ="},"flags/1x1/mt-3c3fe71f2a2bf0d961fd145ad7e48ca1e9d3a05cce514354714ba4568503d106.svg":{"logical_path":"flags/1x1/mt.svg","mtime":"2020-02-08T21:52:35+01:00","size":10519,"digest":"3c3fe71f2a2bf0d961fd145ad7e48ca1e9d3a05cce514354714ba4568503d106","integrity":"sha256-PD/nHyor8Nlh/RRa1+SMoenToFzOUUNUcUukVoUD0QY="},"flags/4x3/mu-c78c23f1499756b9db762ae434ca354d1481447fa94c66bc10aca9443b399059.svg":{"logical_path":"flags/4x3/mu.svg","mtime":"2020-02-08T21:52:35+01:00","size":322,"digest":"c78c23f1499756b9db762ae434ca354d1481447fa94c66bc10aca9443b399059","integrity":"sha256-x4wj8UmXVrnbdirkNMo1TRSBRH+pTGa8EKypRDs5kFk="},"flags/1x1/mu-91ebc79d0fa306127ea8b7a33f77d5b28f35c516ea91ff0468c7344dc838db69.svg":{"logical_path":"flags/1x1/mu.svg","mtime":"2020-02-08T21:52:35+01:00","size":322,"digest":"91ebc79d0fa306127ea8b7a33f77d5b28f35c516ea91ff0468c7344dc838db69","integrity":"sha256-kevHnQ+jBhJ+qLejP3fVso81xRbqkf8EaMc0Tcg422k="},"flags/4x3/mv-a17c947e17adae6aacef01a3e131c4150aa094911b53fbaead41783683e008eb.svg":{"logical_path":"flags/4x3/mv.svg","mtime":"2020-02-08T21:52:35+01:00","size":292,"digest":"a17c947e17adae6aacef01a3e131c4150aa094911b53fbaead41783683e008eb","integrity":"sha256-oXyUfhetrmqs7wGj4THEFQqglJEbU/uurUF4NoPgCOs="},"flags/1x1/mv-d138e94d9d2ed093ef1425c1164493b780202f9a7f7937241a7b081b79ff8b01.svg":{"logical_path":"flags/1x1/mv.svg","mtime":"2020-02-08T21:52:35+01:00","size":310,"digest":"d138e94d9d2ed093ef1425c1164493b780202f9a7f7937241a7b081b79ff8b01","integrity":"sha256-0TjpTZ0u0JPvFCXBFkSTt4AgL5p/eTckGnsIG3n/iwE="},"flags/4x3/mw-21f116afdf71df80e3c59084c6ba640814fa5389430328ff55c9403b5c239632.svg":{"logical_path":"flags/4x3/mw.svg","mtime":"2020-02-08T21:52:35+01:00","size":3721,"digest":"21f116afdf71df80e3c59084c6ba640814fa5389430328ff55c9403b5c239632","integrity":"sha256-IfEWr99x34DjxZCExrpkCBT6U4lDAyj/VclAO1wjljI="},"flags/1x1/mw-5c2228d3f1cf1f9cf8cb158e813202981828c11e8caf117836fc57fa6bc1c788.svg":{"logical_path":"flags/1x1/mw.svg","mtime":"2020-02-08T21:52:35+01:00","size":3930,"digest":"5c2228d3f1cf1f9cf8cb158e813202981828c11e8caf117836fc57fa6bc1c788","integrity":"sha256-XCIo0/HPH5z4yxWOgTICmBgowR6MrxF4NvxX+mvBx4g="},"flags/4x3/mx-a235f9b16921590b7e78caa6f76339361356946eaf0046badd10732b4647c0b6.svg":{"logical_path":"flags/4x3/mx.svg","mtime":"2020-02-08T21:52:35+01:00","size":95864,"digest":"a235f9b16921590b7e78caa6f76339361356946eaf0046badd10732b4647c0b6","integrity":"sha256-ojX5sWkhWQt+eMqm92M5NhNWlG6vAEa63RBzK0ZHwLY="},"flags/1x1/mx-cdab01ebcdccc020ca16e1355ef1fd18ca0043b501f399ca8edc48adfa8c7292.svg":{"logical_path":"flags/1x1/mx.svg","mtime":"2020-02-08T21:52:35+01:00","size":91341,"digest":"cdab01ebcdccc020ca16e1355ef1fd18ca0043b501f399ca8edc48adfa8c7292","integrity":"sha256-zasB683MwCDKFuE1XvH9GMoAQ7UB85nKjtxIrfqMcpI="},"flags/4x3/my-0ed63574cf5f20c0663ab8cd1f700e150fb641fd0b93602ba013abbfaae5ee59.svg":{"logical_path":"flags/4x3/my.svg","mtime":"2020-02-08T21:52:35+01:00","size":1284,"digest":"0ed63574cf5f20c0663ab8cd1f700e150fb641fd0b93602ba013abbfaae5ee59","integrity":"sha256-DtY1dM9fIMBmOrjNH3AOFQ+2Qf0Lk2AroBOrv6rl7lk="},"flags/1x1/my-5e8d31ef06ffc8af33a5616d760592ecd022c52afc8ba33c721f1e4989da0628.svg":{"logical_path":"flags/1x1/my.svg","mtime":"2020-02-08T21:52:35+01:00","size":1275,"digest":"5e8d31ef06ffc8af33a5616d760592ecd022c52afc8ba33c721f1e4989da0628","integrity":"sha256-Xo0x7wb/yK8zpWFtdgWS7NAixSr8i6M8ch8eSYnaBig="},"flags/4x3/mz-752e2293917b1d2ece3f097104caeadf6a679054a779e9d3be8e49dc324bb88a.svg":{"logical_path":"flags/4x3/mz.svg","mtime":"2020-02-08T21:52:35+01:00","size":2623,"digest":"752e2293917b1d2ece3f097104caeadf6a679054a779e9d3be8e49dc324bb88a","integrity":"sha256-dS4ik5F7HS7OPwlxBMrq32pnkFSneenTvo5J3DJLuIo="},"flags/1x1/mz-300cba975ad43c962ceca0d266ded1fe3d21d6b4d701d657fb42b27268ea2964.svg":{"logical_path":"flags/1x1/mz.svg","mtime":"2020-02-08T21:52:35+01:00","size":2604,"digest":"300cba975ad43c962ceca0d266ded1fe3d21d6b4d701d657fb42b27268ea2964","integrity":"sha256-MAy6l1rUPJYs7KDSZt7R/j0h1rTXAdZX+0KycmjqKWQ="},"flags/4x3/na-a0655a2e70751278e6a60d31e818f672864a6e68e8b3d3361b2fbb70fa9bfef8.svg":{"logical_path":"flags/4x3/na.svg","mtime":"2020-02-08T21:52:35+01:00","size":1005,"digest":"a0655a2e70751278e6a60d31e818f672864a6e68e8b3d3361b2fbb70fa9bfef8","integrity":"sha256-oGVaLnB1Enjmpg0x6Bj2coZKbmjos9M2Gy+7cPqb/vg="},"flags/1x1/na-1ce089a189db5be15eb05df8155f9bd017b61fc1a497e5b3021ff2ca664e122d.svg":{"logical_path":"flags/1x1/na.svg","mtime":"2020-02-08T21:52:35+01:00","size":983,"digest":"1ce089a189db5be15eb05df8155f9bd017b61fc1a497e5b3021ff2ca664e122d","integrity":"sha256-HOCJoYnbW+FesF34FV+b0Be2H8Gkl+WzAh/yymZOEi0="},"flags/4x3/nc-0c7171d91c44414ed69808611db588f1283ee7e34ea8a74a9a5101ba4b1cb305.svg":{"logical_path":"flags/4x3/nc.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"0c7171d91c44414ed69808611db588f1283ee7e34ea8a74a9a5101ba4b1cb305","integrity":"sha256-DHFx2RxEQU7WmAhhHbWI8Sg+5+NOqKdKmlEBukscswU="},"flags/1x1/nc-d3a1629f06dc3200af7669f2d895fce1908d2c1ca02d71e530bdfa6646a9516c.svg":{"logical_path":"flags/1x1/nc.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"d3a1629f06dc3200af7669f2d895fce1908d2c1ca02d71e530bdfa6646a9516c","integrity":"sha256-06FinwbcMgCvdmny2JX84ZCNLBygLXHlML36ZkapUWw="},"flags/4x3/ne-2b61d30a6cb4554535538e3b753926853e8c629a494a347286b9731c803548e4.svg":{"logical_path":"flags/4x3/ne.svg","mtime":"2020-02-08T21:52:35+01:00","size":279,"digest":"2b61d30a6cb4554535538e3b753926853e8c629a494a347286b9731c803548e4","integrity":"sha256-K2HTCmy0VUU1U447dTkmhT6MYppJSjRyhrlzHIA1SOQ="},"flags/1x1/ne-9c5f798ccd7d3dd3771ae628b4a39dfb2a4578fefd2e006f3ce89c3e494d0cb1.svg":{"logical_path":"flags/1x1/ne.svg","mtime":"2020-02-08T21:52:35+01:00","size":285,"digest":"9c5f798ccd7d3dd3771ae628b4a39dfb2a4578fefd2e006f3ce89c3e494d0cb1","integrity":"sha256-nF95jM19PdN3GuYotKOd+ypFeP79LgBvPOicPklNDLE="},"flags/4x3/nf-4e615baa83a8b4db3e39fe1d251ab913943d64e0cd320f251d619ab54e7512d3.svg":{"logical_path":"flags/4x3/nf.svg","mtime":"2020-02-08T21:52:35+01:00","size":5845,"digest":"4e615baa83a8b4db3e39fe1d251ab913943d64e0cd320f251d619ab54e7512d3","integrity":"sha256-TmFbqoOotNs+Of4dJRq5E5Q9ZODNMg8lHWGatU51EtM="},"flags/1x1/nf-45403247c90050484813acf23c50f543779528e346317274373c3c24fd830103.svg":{"logical_path":"flags/1x1/nf.svg","mtime":"2020-02-08T21:52:35+01:00","size":5598,"digest":"45403247c90050484813acf23c50f543779528e346317274373c3c24fd830103","integrity":"sha256-RUAyR8kAUEhIE6zyPFD1Q3eVKONGMXJ0Nzw8JP2DAQM="},"flags/4x3/ng-d52fd188be973f31dd34e5a0b3fed0de68fe736c8a41c6028d9c248c038c8641.svg":{"logical_path":"flags/4x3/ng.svg","mtime":"2020-02-08T21:52:35+01:00","size":263,"digest":"d52fd188be973f31dd34e5a0b3fed0de68fe736c8a41c6028d9c248c038c8641","integrity":"sha256-1S/RiL6XPzHdNOWgs/7Q3mj+c2yKQcYCjZwkjAOMhkE="},"flags/1x1/ng-f22edcc5867554d69ecbe15add0fbbb1389631f3ced07a4f820065c7770c65f5.svg":{"logical_path":"flags/1x1/ng.svg","mtime":"2020-02-08T21:52:35+01:00","size":263,"digest":"f22edcc5867554d69ecbe15add0fbbb1389631f3ced07a4f820065c7770c65f5","integrity":"sha256-8i7cxYZ1VNaey+Fa3Q+7sTiWMfPO0HpPggBlx3cMZfU="},"flags/4x3/ni-2fbb883e46fbe3b2ecfed9dac004ceb546f25c77a84a5966eea224674aebc610.svg":{"logical_path":"flags/4x3/ni.svg","mtime":"2020-02-08T21:52:35+01:00","size":18584,"digest":"2fbb883e46fbe3b2ecfed9dac004ceb546f25c77a84a5966eea224674aebc610","integrity":"sha256-L7uIPkb747Ls/tnawATOtUbyXHeoSllm7qIkZ0rrxhA="},"flags/1x1/ni-214aed148b615c4846f842b47f99cf178ac62a96cf18c5dd6b23467184b56680.svg":{"logical_path":"flags/1x1/ni.svg","mtime":"2020-02-08T21:52:35+01:00","size":18664,"digest":"214aed148b615c4846f842b47f99cf178ac62a96cf18c5dd6b23467184b56680","integrity":"sha256-IUrtFIthXEhG+EK0f5nPF4rGKpbPGMXdayNGcYS1ZoA="},"flags/4x3/nl-4f0ecea529dd4c0099dd41a7801fa5ac44aa04cd872ca31e11efd58b5a813774.svg":{"logical_path":"flags/4x3/nl.svg","mtime":"2020-02-08T21:52:35+01:00","size":367,"digest":"4f0ecea529dd4c0099dd41a7801fa5ac44aa04cd872ca31e11efd58b5a813774","integrity":"sha256-Tw7OpSndTACZ3UGngB+lrESqBM2HLKMeEe/Vi1qBN3Q="},"flags/1x1/nl-9c8f60e638879d642487818975e58c61cd3102f0e68c360708243c076436ff68.svg":{"logical_path":"flags/1x1/nl.svg","mtime":"2020-02-08T21:52:35+01:00","size":375,"digest":"9c8f60e638879d642487818975e58c61cd3102f0e68c360708243c076436ff68","integrity":"sha256-nI9g5jiHnWQkh4GJdeWMYc0xAvDmjDYHCCQ8B2Q2/2g="},"flags/4x3/no-270f7ee9d1d2efa6abf16f693faba8586adae842d79d8aad9e3f37e96c27cbce.svg":{"logical_path":"flags/4x3/no.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"270f7ee9d1d2efa6abf16f693faba8586adae842d79d8aad9e3f37e96c27cbce","integrity":"sha256-Jw9+6dHS76ar8W9pP6uoWGra6ELXnYqtnj836Wwny84="},"flags/1x1/no-7d377325e8c5ec4de0376e9f4c13463f183af637e6c443716f22020c7a313979.svg":{"logical_path":"flags/1x1/no.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"7d377325e8c5ec4de0376e9f4c13463f183af637e6c443716f22020c7a313979","integrity":"sha256-fTdzJejF7E3gN26fTBNGPxg69jfmxENxbyICDHoxOXk="},"flags/4x3/np-69637ddb3a173c4522a71598278aa32462e1762e34dd99c9dc99a515433a6cf8.svg":{"logical_path":"flags/4x3/np.svg","mtime":"2020-02-08T21:52:35+01:00","size":1061,"digest":"69637ddb3a173c4522a71598278aa32462e1762e34dd99c9dc99a515433a6cf8","integrity":"sha256-aWN92zoXPEUipxWYJ4qjJGLhdi403ZnJ3JmlFUM6bPg="},"flags/1x1/np-44ead118cce3a1fcbb720cc8d6eab6ecb6b62292315f61ae5963a40262ee11d2.svg":{"logical_path":"flags/1x1/np.svg","mtime":"2020-02-08T21:52:35+01:00","size":1199,"digest":"44ead118cce3a1fcbb720cc8d6eab6ecb6b62292315f61ae5963a40262ee11d2","integrity":"sha256-ROrRGMzjofy7cgzI1uq27La2IpIxX2GuWWOkAmLuEdI="},"flags/4x3/nr-0bd3c0ba7bbac4bd5985b838096eeebd67711d39065619ef092fa4bb55b22a6d.svg":{"logical_path":"flags/4x3/nr.svg","mtime":"2020-02-08T21:52:35+01:00","size":648,"digest":"0bd3c0ba7bbac4bd5985b838096eeebd67711d39065619ef092fa4bb55b22a6d","integrity":"sha256-C9PAunu6xL1Zhbg4CW7uvWdxHTkGVhnvCS+ku1WyKm0="},"flags/1x1/nr-63b9c44e5dd66a59895f52707dc24db5bd1eab6e535298d24e414c0f2dafcb3c.svg":{"logical_path":"flags/1x1/nr.svg","mtime":"2020-02-08T21:52:35+01:00","size":671,"digest":"63b9c44e5dd66a59895f52707dc24db5bd1eab6e535298d24e414c0f2dafcb3c","integrity":"sha256-Y7nETl3WalmJX1JwfcJNtb0eq25TUpjSTkFMDy2vyzw="},"flags/4x3/nu-259989e1eea0cbf6b41a33176a4c9c1eaa2e7ae6571ad80a324c6309bd5aa5fc.svg":{"logical_path":"flags/4x3/nu.svg","mtime":"2020-02-08T21:52:35+01:00","size":1748,"digest":"259989e1eea0cbf6b41a33176a4c9c1eaa2e7ae6571ad80a324c6309bd5aa5fc","integrity":"sha256-JZmJ4e6gy/a0GjMXakycHqoueuZXGtgKMkxjCb1apfw="},"flags/1x1/nu-1cb535708f64ed8b386a245e571e677e935009af92f2b214760a2832c1ee1b53.svg":{"logical_path":"flags/1x1/nu.svg","mtime":"2020-02-08T21:52:35+01:00","size":1736,"digest":"1cb535708f64ed8b386a245e571e677e935009af92f2b214760a2832c1ee1b53","integrity":"sha256-HLU1cI9k7Ys4aiReVx5nfpNQCa+S8rIUdgooMsHuG1M="},"flags/4x3/nz-90ceca2a683fbec395a91b77b0880cea99c3b2cbdb24caa5474925cbdcc3675e.svg":{"logical_path":"flags/4x3/nz.svg","mtime":"2020-02-08T21:52:35+01:00","size":3019,"digest":"90ceca2a683fbec395a91b77b0880cea99c3b2cbdb24caa5474925cbdcc3675e","integrity":"sha256-kM7KKmg/vsOVqRt3sIgM6pnDssvbJMqlR0kly9zDZ14="},"flags/1x1/nz-b0d78f165a72edd46599222a2ea5f6a91a8252975cb03e33c4ca08e389859aac.svg":{"logical_path":"flags/1x1/nz.svg","mtime":"2020-02-08T21:52:35+01:00","size":3045,"digest":"b0d78f165a72edd46599222a2ea5f6a91a8252975cb03e33c4ca08e389859aac","integrity":"sha256-sNePFlpy7dRlmSIqLqX2qRqCUpdcsD4zxMoI44mFmqw="},"flags/4x3/om-aadcca7bc7ad318400097b84849dd64c4744306cd9b4f152fba34f2e84116965.svg":{"logical_path":"flags/4x3/om.svg","mtime":"2020-02-08T21:52:35+01:00","size":22891,"digest":"aadcca7bc7ad318400097b84849dd64c4744306cd9b4f152fba34f2e84116965","integrity":"sha256-qtzKe8etMYQACXuEhJ3WTEdEMGzZtPFS+6NPLoQRaWU="},"flags/1x1/om-705e2bd2b2fc7d13c152aa06bfb9e6ee4ad8b299f8c06ca16adad0b18b2b18ed.svg":{"logical_path":"flags/1x1/om.svg","mtime":"2020-02-08T21:52:35+01:00","size":22875,"digest":"705e2bd2b2fc7d13c152aa06bfb9e6ee4ad8b299f8c06ca16adad0b18b2b18ed","integrity":"sha256-cF4r0rL8fRPBUqoGv7nm7krYspn4wGyhatrQsYsrGO0="},"flags/4x3/pa-027e679bd65dcaa2c53145a14669c1e674a467a889ef702cbe2a260f7ca8ad38.svg":{"logical_path":"flags/4x3/pa.svg","mtime":"2020-02-08T21:52:35+01:00","size":746,"digest":"027e679bd65dcaa2c53145a14669c1e674a467a889ef702cbe2a260f7ca8ad38","integrity":"sha256-An5nm9ZdyqLFMUWhRmnB5nSkZ6iJ73AsviomD3yorTg="},"flags/1x1/pa-edeb4faeadaa286de7fdc667e25d38ad0cdbccaec5023182fed6a3c74e8b09eb.svg":{"logical_path":"flags/1x1/pa.svg","mtime":"2020-02-08T21:52:35+01:00","size":662,"digest":"edeb4faeadaa286de7fdc667e25d38ad0cdbccaec5023182fed6a3c74e8b09eb","integrity":"sha256-7etPrq2qKG3n/cZn4l04rQzbzK7FAjGC/tajx06LCes="},"flags/4x3/pe-7ec59842737c90d6ff543f1831fd69b51e1e7ee1b068c3ac6259cbf2c214d611.svg":{"logical_path":"flags/4x3/pe.svg","mtime":"2020-02-08T21:52:35+01:00","size":74343,"digest":"7ec59842737c90d6ff543f1831fd69b51e1e7ee1b068c3ac6259cbf2c214d611","integrity":"sha256-fsWYQnN8kNb/VD8YMf1ptR4efuGwaMOsYlnL8sIU1hE="},"flags/1x1/pe-97d1b8ed1d4ed5e5f0348a731ca4a3a4b9abc7d440447dc87a521f229f375ed3.svg":{"logical_path":"flags/1x1/pe.svg","mtime":"2020-02-08T21:52:35+01:00","size":73629,"digest":"97d1b8ed1d4ed5e5f0348a731ca4a3a4b9abc7d440447dc87a521f229f375ed3","integrity":"sha256-l9G47R1O1eXwNIpzHKSjpLmrx9RARH3IelIfIp83XtM="},"flags/4x3/pf-27955c73c5be4043c5b7ddf64c8f46d11c6648e3b1fc0efe028b8afea21a40e1.svg":{"logical_path":"flags/4x3/pf.svg","mtime":"2020-02-08T21:52:35+01:00","size":4292,"digest":"27955c73c5be4043c5b7ddf64c8f46d11c6648e3b1fc0efe028b8afea21a40e1","integrity":"sha256-J5Vcc8W+QEPFt932TI9G0RxmSOOx/A7+AouK/qIaQOE="},"flags/1x1/pf-83e3e1d36fba45e015c62f938e6d182029edc05ebfdc50bcb33860f36f96d73a.svg":{"logical_path":"flags/1x1/pf.svg","mtime":"2020-02-08T21:52:35+01:00","size":4235,"digest":"83e3e1d36fba45e015c62f938e6d182029edc05ebfdc50bcb33860f36f96d73a","integrity":"sha256-g+Ph02+6ReAVxi+Tjm0YICntwF6/3FC8szhg82+W1zo="},"flags/4x3/pg-c2fdd2551f9044c461eccfae2d7ba0a347a99143f6002b71a429942af0217897.svg":{"logical_path":"flags/4x3/pg.svg","mtime":"2020-02-08T21:52:35+01:00","size":1671,"digest":"c2fdd2551f9044c461eccfae2d7ba0a347a99143f6002b71a429942af0217897","integrity":"sha256-wv3SVR+QRMRh7M+uLXugo0epkUP2ACtxpCmUKvAheJc="},"flags/1x1/pg-cf60257fa85f9270b1e9980e703435186110167f76c153bc460c10ee8b2d4b09.svg":{"logical_path":"flags/1x1/pg.svg","mtime":"2020-02-08T21:52:35+01:00","size":2111,"digest":"cf60257fa85f9270b1e9980e703435186110167f76c153bc460c10ee8b2d4b09","integrity":"sha256-z2Alf6hfknCx6ZgOcDQ1GGEQFn92wVO8RgwQ7ostSwk="},"flags/4x3/ph-bf3394850a6cec6a535420eabce263e7f8193413e4af1fb317c76da025388c1b.svg":{"logical_path":"flags/4x3/ph.svg","mtime":"2020-02-08T21:52:35+01:00","size":1303,"digest":"bf3394850a6cec6a535420eabce263e7f8193413e4af1fb317c76da025388c1b","integrity":"sha256-vzOUhQps7GpTVCDqvOJj5/gZNBPkrx+zF8dtoCU4jBs="},"flags/1x1/ph-006c3218effe4269252cb9638de82ea339eb2894951705c630533ceffa842169.svg":{"logical_path":"flags/1x1/ph.svg","mtime":"2020-02-08T21:52:35+01:00","size":1303,"digest":"006c3218effe4269252cb9638de82ea339eb2894951705c630533ceffa842169","integrity":"sha256-AGwyGO/+QmklLLljjeguoznrKJSVFwXGMFM87/qEIWk="},"flags/4x3/pk-b64f6a32e5bb598f57cfe49c4899c2021f2d153653f3d92101e6e11b2158e500.svg":{"logical_path":"flags/4x3/pk.svg","mtime":"2020-02-08T21:52:35+01:00","size":743,"digest":"b64f6a32e5bb598f57cfe49c4899c2021f2d153653f3d92101e6e11b2158e500","integrity":"sha256-tk9qMuW7WY9Xz+ScSJnCAh8tFTZT89khAebhGyFY5QA="},"flags/1x1/pk-d2d58def913c9081c5eeeda5f0b6895068ec13c955694e359531e23422145e60.svg":{"logical_path":"flags/1x1/pk.svg","mtime":"2020-02-08T21:52:35+01:00","size":694,"digest":"d2d58def913c9081c5eeeda5f0b6895068ec13c955694e359531e23422145e60","integrity":"sha256-0tWN75E8kIHF7u2l8LaJUGjsE8lVaU41lTHiNCIUXmA="},"flags/4x3/pl-f55a710991a94c2e6c2f9f1a7a4a36ebb84b24b7c9d9df4e1ffe86d61321fa6f.svg":{"logical_path":"flags/4x3/pl.svg","mtime":"2020-02-08T21:52:35+01:00","size":228,"digest":"f55a710991a94c2e6c2f9f1a7a4a36ebb84b24b7c9d9df4e1ffe86d61321fa6f","integrity":"sha256-9VpxCZGpTC5sL58aeko267hLJLfJ2d9OH/6G1hMh+m8="},"flags/1x1/pl-fafb539259385f2b99df910cff085710a9b4d9706b74e4e0f8a6ef627615c4e7.svg":{"logical_path":"flags/1x1/pl.svg","mtime":"2020-02-08T21:52:35+01:00","size":228,"digest":"fafb539259385f2b99df910cff085710a9b4d9706b74e4e0f8a6ef627615c4e7","integrity":"sha256-+vtTklk4XyuZ35EM/whXEKm02XBrdOTg+KbvYnYVxOc="},"flags/4x3/pm-8f6338d2ae3e0e42adc9754720ca21ad4979095cf6d7467a8db5a5a1c3e0b2a5.svg":{"logical_path":"flags/4x3/pm.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"8f6338d2ae3e0e42adc9754720ca21ad4979095cf6d7467a8db5a5a1c3e0b2a5","integrity":"sha256-j2M40q4+DkKtyXVHIMohrUl5CVz210Z6jbWlocPgsqU="},"flags/1x1/pm-63029c6198dc42c404ec39807a99528b1d198eeeea6f9a1e309548242480140b.svg":{"logical_path":"flags/1x1/pm.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"63029c6198dc42c404ec39807a99528b1d198eeeea6f9a1e309548242480140b","integrity":"sha256-YwKcYZjcQsQE7DmAeplSix0Zju7qb5oeMJVIJCSAFAs="},"flags/4x3/pn-4006c11ca83011c0dd60a13ac30b27da0578b9f1368bd8c6de5aab423f6662d8.svg":{"logical_path":"flags/4x3/pn.svg","mtime":"2020-02-08T21:52:35+01:00","size":10953,"digest":"4006c11ca83011c0dd60a13ac30b27da0578b9f1368bd8c6de5aab423f6662d8","integrity":"sha256-QAbBHKgwEcDdYKE6wwsn2gV4ufE2i9jG3lqrQj9mYtg="},"flags/1x1/pn-6c433f7f9cb79c6d5ed7bbeade8a495e3b26ca2604f4fd3995096109684ac5dd.svg":{"logical_path":"flags/1x1/pn.svg","mtime":"2020-02-08T21:52:35+01:00","size":8624,"digest":"6c433f7f9cb79c6d5ed7bbeade8a495e3b26ca2604f4fd3995096109684ac5dd","integrity":"sha256-bEM/f5y3nG1e17vq3opJXjsmyiYE9P05lQlhCWhKxd0="},"flags/4x3/pr-6287e1515fa80e2d05133ed93f14ca03a1be6909a9ef6c736fd60f9c9fe73132.svg":{"logical_path":"flags/4x3/pr.svg","mtime":"2020-02-08T21:52:35+01:00","size":634,"digest":"6287e1515fa80e2d05133ed93f14ca03a1be6909a9ef6c736fd60f9c9fe73132","integrity":"sha256-YofhUV+oDi0FEz7ZPxTKA6G+aQmp72xzb9YPnJ/nMTI="},"flags/1x1/pr-526985b3a6d2d6de577ed0ed92d0b49ce854667e3ff630304813fd5af15527cd.svg":{"logical_path":"flags/1x1/pr.svg","mtime":"2020-02-08T21:52:35+01:00","size":622,"digest":"526985b3a6d2d6de577ed0ed92d0b49ce854667e3ff630304813fd5af15527cd","integrity":"sha256-UmmFs6bS1t5XftDtktC0nOhUZn4/9jAwSBP9WvFVJ80="},"flags/4x3/ps-31f50e1fcb44b9aa6e9ce4473c3085f744e70ea0fa1fd8d85787f4e7b0c4a69b.svg":{"logical_path":"flags/4x3/ps.svg","mtime":"2020-02-08T21:52:35+01:00","size":558,"digest":"31f50e1fcb44b9aa6e9ce4473c3085f744e70ea0fa1fd8d85787f4e7b0c4a69b","integrity":"sha256-MfUOH8tEuapunORHPDCF90TnDqD6H9jYV4f057DEpps="},"flags/1x1/ps-c43918bc71bef71b24dd46e8cacc53e0df53e02dcce6199d06d11a4637f08a04.svg":{"logical_path":"flags/1x1/ps.svg","mtime":"2020-02-08T21:52:35+01:00","size":544,"digest":"c43918bc71bef71b24dd46e8cacc53e0df53e02dcce6199d06d11a4637f08a04","integrity":"sha256-xDkYvHG+9xsk3UboysxT4N9T4C3M5hmdBtEaRjfwigQ="},"flags/4x3/pt-9aab20caed714ee47fc408f017037aea94a649b3ba4d87e2da37870ee31e4f92.svg":{"logical_path":"flags/4x3/pt.svg","mtime":"2020-02-08T21:52:35+01:00","size":8393,"digest":"9aab20caed714ee47fc408f017037aea94a649b3ba4d87e2da37870ee31e4f92","integrity":"sha256-mqsgyu1xTuR/xAjwFwN66pSmSbO6TYfi2jeHDuMeT5I="},"flags/1x1/pt-a309869e5018c9690a65ebdf8a2d69d61f82772068a7920f9680ed0581ae5966.svg":{"logical_path":"flags/1x1/pt.svg","mtime":"2020-02-08T21:52:35+01:00","size":8775,"digest":"a309869e5018c9690a65ebdf8a2d69d61f82772068a7920f9680ed0581ae5966","integrity":"sha256-owmGnlAYyWkKZevfii1p1h+CdyBop5IPloDtBYGuWWY="},"flags/4x3/pw-9262037d114d0f61571c74f9a5455809709b43e6565443ae2667981eecb5f12a.svg":{"logical_path":"flags/4x3/pw.svg","mtime":"2020-02-08T21:52:35+01:00","size":467,"digest":"9262037d114d0f61571c74f9a5455809709b43e6565443ae2667981eecb5f12a","integrity":"sha256-kmIDfRFND2FXHHT5pUVYCXCbQ+ZWVEOuJmeYHuy18So="},"flags/1x1/pw-a6f42019653ae26d43c6e9b7bef83fc98cff8ec5e8d0c50ad7cb0a17d5e565a6.svg":{"logical_path":"flags/1x1/pw.svg","mtime":"2020-02-08T21:52:35+01:00","size":511,"digest":"a6f42019653ae26d43c6e9b7bef83fc98cff8ec5e8d0c50ad7cb0a17d5e565a6","integrity":"sha256-pvQgGWU64m1Dxum3vvg/yYz/jsXo0MUK18sKF9XlZaY="},"flags/4x3/py-5bc9e9f0dee94ae3d9bd80ae6fb1aac297dc81a1c592d0a73bc3383bce73af74.svg":{"logical_path":"flags/4x3/py.svg","mtime":"2020-02-08T21:52:35+01:00","size":17312,"digest":"5bc9e9f0dee94ae3d9bd80ae6fb1aac297dc81a1c592d0a73bc3383bce73af74","integrity":"sha256-W8np8N7pSuPZvYCub7GqwpfcgaHFktCnO8M4O85zr3Q="},"flags/1x1/py-182eff300f4507fd9399fb6310d1cd3b45adadd7924ad2814003c7111ec5c0de.svg":{"logical_path":"flags/1x1/py.svg","mtime":"2020-02-08T21:52:35+01:00","size":17478,"digest":"182eff300f4507fd9399fb6310d1cd3b45adadd7924ad2814003c7111ec5c0de","integrity":"sha256-GC7/MA9FB/2TmftjENHNO0WtrdeSStKBQAPHER7FwN4="},"flags/4x3/qa-32c93970f8e521850eddfaf2a89dfff987f0ae3b0b73a253c301b61cf547cf9e.svg":{"logical_path":"flags/4x3/qa.svg","mtime":"2020-02-08T21:52:35+01:00","size":362,"digest":"32c93970f8e521850eddfaf2a89dfff987f0ae3b0b73a253c301b61cf547cf9e","integrity":"sha256-Msk5cPjlIYUO3fryqJ3/+YfwrjsLc6JTwwG2HPVHz54="},"flags/1x1/qa-182e4d8ace2607d0c02d3c29d65eb084af71092357006bc41cd601981ec3b81c.svg":{"logical_path":"flags/1x1/qa.svg","mtime":"2020-02-08T21:52:35+01:00","size":359,"digest":"182e4d8ace2607d0c02d3c29d65eb084af71092357006bc41cd601981ec3b81c","integrity":"sha256-GC5Nis4mB9DALTwp1l6whK9xCSNXAGvEHNYBmB7DuBw="},"flags/4x3/re-8b2ea1f2727c266a2b80cb12a9b7195f6b656f521552b67893b6761a07f9bc92.svg":{"logical_path":"flags/4x3/re.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"8b2ea1f2727c266a2b80cb12a9b7195f6b656f521552b67893b6761a07f9bc92","integrity":"sha256-iy6h8nJ8JmorgMsSqbcZX2tlb1IVUrZ4k7Z2Ggf5vJI="},"flags/1x1/re-07eb7d855022bc678b47b0ce5fd05da5044d6dde86ad3697d4ae55c68ff447c1.svg":{"logical_path":"flags/1x1/re.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"07eb7d855022bc678b47b0ce5fd05da5044d6dde86ad3697d4ae55c68ff447c1","integrity":"sha256-B+t9hVAivGeLR7DOX9BdpQRNbd6GrTaX1K5Vxo/0R8E="},"flags/4x3/ro-4ab797571e1d9eb326486f75654a4590fd33f20444f85b77ba0997eb6138c21f.svg":{"logical_path":"flags/4x3/ro.svg","mtime":"2020-02-08T21:52:35+01:00","size":308,"digest":"4ab797571e1d9eb326486f75654a4590fd33f20444f85b77ba0997eb6138c21f","integrity":"sha256-SreXVx4dnrMmSG91ZUpFkP0z8gRE+Ft3ugmX62E4wh8="},"flags/1x1/ro-ddfcbaec04d11bf7f95abebd1d3a42b2862b1af8fca9b02764a6ed0e409a1d75.svg":{"logical_path":"flags/1x1/ro.svg","mtime":"2020-02-08T21:52:35+01:00","size":308,"digest":"ddfcbaec04d11bf7f95abebd1d3a42b2862b1af8fca9b02764a6ed0e409a1d75","integrity":"sha256-3fy67ATRG/f5Wr69HTpCsoYrGvj8qbAnZKbtDkCaHXU="},"flags/4x3/rs-dd8a52473ea40e23b393b5f4a30d1edd91865aab167f0c1835ae84b15dcce585.svg":{"logical_path":"flags/4x3/rs.svg","mtime":"2020-02-08T21:52:35+01:00","size":187640,"digest":"dd8a52473ea40e23b393b5f4a30d1edd91865aab167f0c1835ae84b15dcce585","integrity":"sha256-3YpSRz6kDiOzk7X0ow0e3ZGGWqsWfwwYNa6EsV3M5YU="},"flags/1x1/rs-42bf40209c92e4e7169daf29fbcb7253b2804eee7a463051529327f38851f865.svg":{"logical_path":"flags/1x1/rs.svg","mtime":"2020-02-08T21:52:35+01:00","size":187503,"digest":"42bf40209c92e4e7169daf29fbcb7253b2804eee7a463051529327f38851f865","integrity":"sha256-Qr9AIJyS5OcWna8p+8tyU7KATu56RjBRUpMn84hR+GU="},"flags/4x3/ru-13f4525a4caad6e31afa523d2bc4a0c1e6377c0bef1bfd872682130d3f199d1d.svg":{"logical_path":"flags/4x3/ru.svg","mtime":"2020-02-08T21:52:35+01:00","size":289,"digest":"13f4525a4caad6e31afa523d2bc4a0c1e6377c0bef1bfd872682130d3f199d1d","integrity":"sha256-E/RSWkyq1uMa+lI9K8SgweY3fAvvG/2HJoITDT8ZnR0="},"flags/1x1/ru-b9792a963faf667447e0456dba5be80a3b37c197a4284d1539a3433721d9e2fe.svg":{"logical_path":"flags/1x1/ru.svg","mtime":"2020-02-08T21:52:35+01:00","size":293,"digest":"b9792a963faf667447e0456dba5be80a3b37c197a4284d1539a3433721d9e2fe","integrity":"sha256-uXkqlj+vZnRH4EVtulvoCjs3wZekKE0VOaNDNyHZ4v4="},"flags/4x3/rw-bc38bcd6e19d2941839b253af6e863b13338cde1174874f9674471026c15e422.svg":{"logical_path":"flags/4x3/rw.svg","mtime":"2020-02-08T21:52:35+01:00","size":750,"digest":"bc38bcd6e19d2941839b253af6e863b13338cde1174874f9674471026c15e422","integrity":"sha256-vDi81uGdKUGDmyU69uhjsTM4zeEXSHT5Z0RxAmwV5CI="},"flags/1x1/rw-456698123775b83d2b0fa1b9fe073f9ccdba0b6bf39a703b8979dcce158eb32c.svg":{"logical_path":"flags/1x1/rw.svg","mtime":"2020-02-08T21:52:35+01:00","size":751,"digest":"456698123775b83d2b0fa1b9fe073f9ccdba0b6bf39a703b8979dcce158eb32c","integrity":"sha256-RWaYEjd1uD0rD6G5/gc/nM26C2vzmnA7iXnczhWOsyw="},"flags/4x3/sa-2b2fd6abb48415d5407c576c24a24fbd80af5877ef06cf2d026452f6c67f5f4d.svg":{"logical_path":"flags/4x3/sa.svg","mtime":"2020-02-08T21:52:35+01:00","size":10303,"digest":"2b2fd6abb48415d5407c576c24a24fbd80af5877ef06cf2d026452f6c67f5f4d","integrity":"sha256-Ky/Wq7SEFdVAfFdsJKJPvYCvWHfvBs8tAmRS9sZ/X00="},"flags/1x1/sa-d9ebc73e7957f86604164dd5054fb32601ad14d7dfd4bfe73da5bdd10bb2f8ae.svg":{"logical_path":"flags/1x1/sa.svg","mtime":"2020-02-08T21:52:35+01:00","size":10233,"digest":"d9ebc73e7957f86604164dd5054fb32601ad14d7dfd4bfe73da5bdd10bb2f8ae","integrity":"sha256-2evHPnlX+GYEFk3VBU+zJgGtFNff1L/nPaW90Quy+K4="},"flags/4x3/sb-37761927039d0a37ba0995c59fd31bbe36c8a0ca161e5b72b8131e3659f8dddf.svg":{"logical_path":"flags/4x3/sb.svg","mtime":"2020-02-08T21:52:35+01:00","size":950,"digest":"37761927039d0a37ba0995c59fd31bbe36c8a0ca161e5b72b8131e3659f8dddf","integrity":"sha256-N3YZJwOdCje6CZXFn9MbvjbIoMoWHltyuBMeNln43d8="},"flags/1x1/sb-bedbf8464cd82f391bfe6178c63055b650d0cf3aee60c37fa79a586f95783b79.svg":{"logical_path":"flags/1x1/sb.svg","mtime":"2020-02-08T21:52:35+01:00","size":956,"digest":"bedbf8464cd82f391bfe6178c63055b650d0cf3aee60c37fa79a586f95783b79","integrity":"sha256-vtv4RkzYLzkb/mF4xjBVtlDQzzruYMN/p5pYb5V4O3k="},"flags/4x3/sc-f6a2f8f37be93f07600b491b52cb58d80d74b92d8ace0af313f4ce081b0d1345.svg":{"logical_path":"flags/4x3/sc.svg","mtime":"2020-02-08T21:52:35+01:00","size":568,"digest":"f6a2f8f37be93f07600b491b52cb58d80d74b92d8ace0af313f4ce081b0d1345","integrity":"sha256-9qL483vpPwdgC0kbUstY2A10uS2KzgrzE/TOCBsNE0U="},"flags/1x1/sc-5dcd01b98c34460c9624280fb5047811fbae7d976620cd0a70ad4263a9085b60.svg":{"logical_path":"flags/1x1/sc.svg","mtime":"2020-02-08T21:52:35+01:00","size":573,"digest":"5dcd01b98c34460c9624280fb5047811fbae7d976620cd0a70ad4263a9085b60","integrity":"sha256-Xc0BuYw0RgyWJCgPtQR4EfuufZdmIM0KcK1CY6kIW2A="},"flags/4x3/sd-cc9cf97e8a37622b9e1bad28811d46c4471595afa448dc055e0e3aae7687fe4b.svg":{"logical_path":"flags/4x3/sd.svg","mtime":"2020-02-08T21:52:35+01:00","size":494,"digest":"cc9cf97e8a37622b9e1bad28811d46c4471595afa448dc055e0e3aae7687fe4b","integrity":"sha256-zJz5foo3YiueG60ogR1GxEcVla+kSNwFXg46rnaH/ks="},"flags/1x1/sd-1f5d13f9780085acbaad13d959b1918c796ba7b0450954b15d145e87cebe045c.svg":{"logical_path":"flags/1x1/sd.svg","mtime":"2020-02-08T21:52:35+01:00","size":496,"digest":"1f5d13f9780085acbaad13d959b1918c796ba7b0450954b15d145e87cebe045c","integrity":"sha256-H10T+XgAhay6rRPZWbGRjHlrp7BFCVSxXRReh86+BFw="},"flags/4x3/se-84b06bcd5bd90ea8dd6d1c3c8d2799a843c47b0256ce098aef75414964618286.svg":{"logical_path":"flags/4x3/se.svg","mtime":"2020-02-08T21:52:35+01:00","size":688,"digest":"84b06bcd5bd90ea8dd6d1c3c8d2799a843c47b0256ce098aef75414964618286","integrity":"sha256-hLBrzVvZDqjdbRw8jSeZqEPEewJWzgmK73VBSWRhgoY="},"flags/1x1/se-39f128686652cf914f8601110fcc9ac879bca204407013b93aff4ca4fb2ed9bc.svg":{"logical_path":"flags/1x1/se.svg","mtime":"2020-02-08T21:52:35+01:00","size":701,"digest":"39f128686652cf914f8601110fcc9ac879bca204407013b93aff4ca4fb2ed9bc","integrity":"sha256-OfEoaGZSz5FPhgERD8yayHm8ogRAcBO5Ov9MpPsu2bw="},"flags/4x3/sg-a82acd90077e76318ddb0be96999d9695b9a9f4627e8a0f341d3987a62747dcc.svg":{"logical_path":"flags/4x3/sg.svg","mtime":"2020-02-08T21:52:35+01:00","size":890,"digest":"a82acd90077e76318ddb0be96999d9695b9a9f4627e8a0f341d3987a62747dcc","integrity":"sha256-qCrNkAd+djGN2wvpaZnZaVuan0Yn6KDzQdOYemJ0fcw="},"flags/1x1/sg-c22e093634568aae249bf35f9ddcaa6796b5f27d76c39ff5336abf7f1b8a47d4.svg":{"logical_path":"flags/1x1/sg.svg","mtime":"2020-02-08T21:52:35+01:00","size":954,"digest":"c22e093634568aae249bf35f9ddcaa6796b5f27d76c39ff5336abf7f1b8a47d4","integrity":"sha256-wi4JNjRWiq4km/NfndyqZ5a18n12w5/1M2q/fxuKR9Q="},"flags/4x3/sh-57470d9a75955f0fac605a94e853bab524c7461a4c025e809fb09db762ebe46f.svg":{"logical_path":"flags/4x3/sh.svg","mtime":"2020-02-08T21:52:35+01:00","size":29702,"digest":"57470d9a75955f0fac605a94e853bab524c7461a4c025e809fb09db762ebe46f","integrity":"sha256-V0cNmnWVXw+sYFqU6FO6tSTHRhpMAl6An7Cdt2Lr5G8="},"flags/1x1/sh-8d06a0fff61e51eb65357d138e00736545835b8649aa2694152f4cdc9f941c16.svg":{"logical_path":"flags/1x1/sh.svg","mtime":"2020-02-08T21:52:35+01:00","size":30308,"digest":"8d06a0fff61e51eb65357d138e00736545835b8649aa2694152f4cdc9f941c16","integrity":"sha256-jQag//YeUetlNX0TjgBzZUWDW4ZJqiaUFS9M3J+UHBY="},"flags/4x3/si-289d6417f154323e7922df09ffc0f49ded31548c7ee8020c39cb85724ffbcea8.svg":{"logical_path":"flags/4x3/si.svg","mtime":"2020-02-08T21:52:35+01:00","size":2055,"digest":"289d6417f154323e7922df09ffc0f49ded31548c7ee8020c39cb85724ffbcea8","integrity":"sha256-KJ1kF/FUMj55It8J/8D0ne0xVIx+6AIMOcuFck/7zqg="},"flags/1x1/si-ca40a5f4f38119d6f52ffd3ddb36af95951a2aa1fadcd897f5bc1641bb2e0051.svg":{"logical_path":"flags/1x1/si.svg","mtime":"2020-02-08T21:52:35+01:00","size":2068,"digest":"ca40a5f4f38119d6f52ffd3ddb36af95951a2aa1fadcd897f5bc1641bb2e0051","integrity":"sha256-ykCl9POBGdb1L/092zavlZUaKqH63NiX9bwWQbsuAFE="},"flags/4x3/sj-67d4cdd268d0c0cd93fc561b506cb5646cb508385c93ed350d11f94aa1c83833.svg":{"logical_path":"flags/4x3/sj.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"67d4cdd268d0c0cd93fc561b506cb5646cb508385c93ed350d11f94aa1c83833","integrity":"sha256-Z9TN0mjQwM2T/FYbUGy1ZGy1CDhck+01DRH5SqHIODM="},"flags/1x1/sj-f7c489607033138039612d6abe7f4b0b4b6dada5cac75d78204f404a0d292b1c.svg":{"logical_path":"flags/1x1/sj.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"f7c489607033138039612d6abe7f4b0b4b6dada5cac75d78204f404a0d292b1c","integrity":"sha256-98SJYHAzE4A5YS1qvn9LC0ttraXKx114IE9ASg0pKxw="},"flags/4x3/sk-a0bdbb7f5d6998ffe9fcbc80bbdf0e6cff3629740d2ce1b8d61025e0a8b322b5.svg":{"logical_path":"flags/4x3/sk.svg","mtime":"2020-02-08T21:52:35+01:00","size":1208,"digest":"a0bdbb7f5d6998ffe9fcbc80bbdf0e6cff3629740d2ce1b8d61025e0a8b322b5","integrity":"sha256-oL27f11pmP/p/LyAu98ObP82KXQNLOG41hAl4KizIrU="},"flags/1x1/sk-a82a813b2d81af9be1aa775f22b2c2457d11e870e072d7e23957a11d0878faed.svg":{"logical_path":"flags/1x1/sk.svg","mtime":"2020-02-08T21:52:35+01:00","size":1187,"digest":"a82a813b2d81af9be1aa775f22b2c2457d11e870e072d7e23957a11d0878faed","integrity":"sha256-qCqBOy2Br5vhqndfIrLCRX0R6HDgctfiOVehHQh4+u0="},"flags/4x3/sl-be265bed24cfe0b25778201f251e52e4e721e3d319795875913805d1aea84ebb.svg":{"logical_path":"flags/4x3/sl.svg","mtime":"2020-02-08T21:52:35+01:00","size":278,"digest":"be265bed24cfe0b25778201f251e52e4e721e3d319795875913805d1aea84ebb","integrity":"sha256-viZb7STP4LJXeCAfJR5S5Och49MZeVh1kTgF0a6oTrs="},"flags/1x1/sl-cb8bccbaa21957f006ed4ae0144da81c999e93bd8014023b16b500fdcdc397d3.svg":{"logical_path":"flags/1x1/sl.svg","mtime":"2020-02-08T21:52:35+01:00","size":441,"digest":"cb8bccbaa21957f006ed4ae0144da81c999e93bd8014023b16b500fdcdc397d3","integrity":"sha256-y4vMuqIZV/AG7UrgFE2oHJmek72AFAI7FrUA/c3Dl9M="},"flags/4x3/sm-d7818df3f8f2d5dbed27dc5a0a80b1e41cdcd6130eeff221da58f0321e925f27.svg":{"logical_path":"flags/4x3/sm.svg","mtime":"2020-02-08T21:52:35+01:00","size":15960,"digest":"d7818df3f8f2d5dbed27dc5a0a80b1e41cdcd6130eeff221da58f0321e925f27","integrity":"sha256-14GN8/jy1dvtJ9xaCoCx5Bzc1hMO7/Ih2ljwMh6SXyc="},"flags/1x1/sm-6f87660dcac925bbdb036c79a0e20d3b208215d327be4c4764ae1069d6464efd.svg":{"logical_path":"flags/1x1/sm.svg","mtime":"2020-02-08T21:52:35+01:00","size":15881,"digest":"6f87660dcac925bbdb036c79a0e20d3b208215d327be4c4764ae1069d6464efd","integrity":"sha256-b4dmDcrJJbvbA2x5oOINOyCCFdMnvkxHZK4QadZGTv0="},"flags/4x3/sn-b131b17a374bcfbd00d442d282fa52f0e4e0e448cda1cdfaac25a95ff56443c0.svg":{"logical_path":"flags/4x3/sn.svg","mtime":"2020-02-08T21:52:35+01:00","size":427,"digest":"b131b17a374bcfbd00d442d282fa52f0e4e0e448cda1cdfaac25a95ff56443c0","integrity":"sha256-sTGxejdLz70A1ELSgvpS8OTg5EjNoc36rCWpX/VkQ8A="},"flags/1x1/sn-d180d3ce9846966dee6a3d9433ede7d24801dc4311636aabd470ec5b8765d772.svg":{"logical_path":"flags/1x1/sn.svg","mtime":"2020-02-08T21:52:35+01:00","size":418,"digest":"d180d3ce9846966dee6a3d9433ede7d24801dc4311636aabd470ec5b8765d772","integrity":"sha256-0YDTzphGlm3uaj2UM+3n0kgB3EMRY2qr1HDsW4dl13I="},"flags/4x3/so-3b5b77b371299478144a94b60c99524fb6b99bfedb3dcc976ab70185e07f399e.svg":{"logical_path":"flags/4x3/so.svg","mtime":"2020-02-08T21:52:35+01:00","size":494,"digest":"3b5b77b371299478144a94b60c99524fb6b99bfedb3dcc976ab70185e07f399e","integrity":"sha256-O1t3s3EplHgUSpS2DJlST7a5m/7bPcyXarcBheB/OZ4="},"flags/1x1/so-50aa941f2d2954285ef9e5ac260cdd264a73cf2e4b0c627677f04141fff2afd3.svg":{"logical_path":"flags/1x1/so.svg","mtime":"2020-02-08T21:52:35+01:00","size":501,"digest":"50aa941f2d2954285ef9e5ac260cdd264a73cf2e4b0c627677f04141fff2afd3","integrity":"sha256-UKqUHy0pVChe+eWsJgzdJkpzzy5LDGJ2d/BBQf/yr9M="},"flags/4x3/sr-94d0f0aefcbdea8d7ba35648eda5037e99bf4126723ce36416582ea43b08d3e2.svg":{"logical_path":"flags/4x3/sr.svg","mtime":"2020-02-08T21:52:35+01:00","size":318,"digest":"94d0f0aefcbdea8d7ba35648eda5037e99bf4126723ce36416582ea43b08d3e2","integrity":"sha256-lNDwrvy96o17o1ZI7aUDfpm/QSZyPONkFlgupDsI0+I="},"flags/1x1/sr-3944d683068d437471725d22fd71ccbe6a63ae307ff9775690417d3bf262cf82.svg":{"logical_path":"flags/1x1/sr.svg","mtime":"2020-02-08T21:52:35+01:00","size":323,"digest":"3944d683068d437471725d22fd71ccbe6a63ae307ff9775690417d3bf262cf82","integrity":"sha256-OUTWgwaNQ3Rxcl0i/XHMvmpjrjB/+XdWkEF9O/Jiz4I="},"flags/4x3/ss-f391e5002cbce83f97f7d1a11c284fa2e36a7d6dc734757d733656801ab17d0a.svg":{"logical_path":"flags/4x3/ss.svg","mtime":"2020-02-08T21:52:35+01:00","size":389,"digest":"f391e5002cbce83f97f7d1a11c284fa2e36a7d6dc734757d733656801ab17d0a","integrity":"sha256-85HlACy86D+X99GhHChPouNqfW3HNHV9czZWgBqxfQo="},"flags/1x1/ss-853bd9f713d2f6b1fe540a82e8bf4754912da21575b3fe756b8741767f318f7a.svg":{"logical_path":"flags/1x1/ss.svg","mtime":"2020-02-08T21:52:35+01:00","size":400,"digest":"853bd9f713d2f6b1fe540a82e8bf4754912da21575b3fe756b8741767f318f7a","integrity":"sha256-hTvZ9xPS9rH+VAqC6L9HVJEtohV1s/51a4dBdn8xj3o="},"flags/4x3/st-b52bb48a2c0800f5cb4b07bdd93c3908f77bcb6800be883ebf943bbd3d99d42c.svg":{"logical_path":"flags/4x3/st.svg","mtime":"2020-02-08T21:52:35+01:00","size":919,"digest":"b52bb48a2c0800f5cb4b07bdd93c3908f77bcb6800be883ebf943bbd3d99d42c","integrity":"sha256-tSu0iiwIAPXLSwe92Tw5CPd7y2gAvog+v5Q7vT2Z1Cw="},"flags/1x1/st-d8b5b1c8b9fe947086a4d277d2ac5d6b9cff188dfd37bda66c8bf5e02c5facc8.svg":{"logical_path":"flags/1x1/st.svg","mtime":"2020-02-08T21:52:35+01:00","size":923,"digest":"d8b5b1c8b9fe947086a4d277d2ac5d6b9cff188dfd37bda66c8bf5e02c5facc8","integrity":"sha256-2LWxyLn+lHCGpNJ30qxda5z/GI39N72mbIv14CxfrMg="},"flags/4x3/sv-6d02d63c7f04c9388e98f892cc43d8daa2110fc84242758d5627fcd247bfd09b.svg":{"logical_path":"flags/4x3/sv.svg","mtime":"2020-02-08T21:52:35+01:00","size":84037,"digest":"6d02d63c7f04c9388e98f892cc43d8daa2110fc84242758d5627fcd247bfd09b","integrity":"sha256-bQLWPH8EyTiOmPiSzEPY2qIRD8hCQnWNVif80ke/0Js="},"flags/1x1/sv-fb4c8d7eb98396a93c5b9c37195d70e809e0d71d8b8f9316e842121f95bb82ea.svg":{"logical_path":"flags/1x1/sv.svg","mtime":"2020-02-08T21:52:35+01:00","size":84509,"digest":"fb4c8d7eb98396a93c5b9c37195d70e809e0d71d8b8f9316e842121f95bb82ea","integrity":"sha256-+0yNfrmDlqk8W5w3GV1w6Ang1x2Lj5MW6EISH5W7guo="},"flags/4x3/sx-fb6a7b1cbc5b29eeeb39a5aec64ef7aad432c37bbe848d29955a3786b9763224.svg":{"logical_path":"flags/4x3/sx.svg","mtime":"2020-02-08T21:52:35+01:00","size":13306,"digest":"fb6a7b1cbc5b29eeeb39a5aec64ef7aad432c37bbe848d29955a3786b9763224","integrity":"sha256-+2p7HLxbKe7rOaWuxk73qtQyw3u+hI0plVo3hrl2MiQ="},"flags/1x1/sx-a37b124212f8530b921aef7657cfb35c2895a731c7a06f333faee4c93f32806a.svg":{"logical_path":"flags/1x1/sx.svg","mtime":"2020-02-08T21:52:35+01:00","size":13115,"digest":"a37b124212f8530b921aef7657cfb35c2895a731c7a06f333faee4c93f32806a","integrity":"sha256-o3sSQhL4UwuSGu92V8+zXCiVpzHHoG8zP67kyT8ygGo="},"flags/4x3/sy-e35f8d88c864ed4f38edb2f9f96d5bd69f6df078b50515b8c5467bf6b1689f50.svg":{"logical_path":"flags/4x3/sy.svg","mtime":"2020-02-08T21:52:35+01:00","size":568,"digest":"e35f8d88c864ed4f38edb2f9f96d5bd69f6df078b50515b8c5467bf6b1689f50","integrity":"sha256-41+NiMhk7U847bL5+W1b1p9t8Hi1BRW4xUZ79rFon1A="},"flags/1x1/sy-5d537bd5b42b58f6e8a7e33fbe5942a16126abb639edf9cb58b88938c57ebaa9.svg":{"logical_path":"flags/1x1/sy.svg","mtime":"2020-02-08T21:52:35+01:00","size":582,"digest":"5d537bd5b42b58f6e8a7e33fbe5942a16126abb639edf9cb58b88938c57ebaa9","integrity":"sha256-XVN71bQrWPbop+M/vllCoWEmq7Y57fnLWLiJOMV+uqk="},"flags/4x3/sz-c65ae592e943217787848364bdb4c57335869f4626ce705adabdc2620669c1c6.svg":{"logical_path":"flags/4x3/sz.svg","mtime":"2020-02-08T21:52:35+01:00","size":6755,"digest":"c65ae592e943217787848364bdb4c57335869f4626ce705adabdc2620669c1c6","integrity":"sha256-xlrlkulDIXeHhINkvbTFczWGn0YmznBa2r3CYgZpwcY="},"flags/1x1/sz-dd3d1c65bdf09317553f205e588e3dc7336acec1cb9315bfbe0f5bd8ca5bba3f.svg":{"logical_path":"flags/1x1/sz.svg","mtime":"2020-02-08T21:52:35+01:00","size":6706,"digest":"dd3d1c65bdf09317553f205e588e3dc7336acec1cb9315bfbe0f5bd8ca5bba3f","integrity":"sha256-3T0cZb3wkxdVPyBeWI49xzNqzsHLkxW/vg9b2Mpbuj8="},"flags/4x3/tc-594b6cc87040836c6d6777afb5833d565d3e5e75f404350a51443ec4588a1ccb.svg":{"logical_path":"flags/4x3/tc.svg","mtime":"2020-02-08T21:52:35+01:00","size":14585,"digest":"594b6cc87040836c6d6777afb5833d565d3e5e75f404350a51443ec4588a1ccb","integrity":"sha256-WUtsyHBAg2xtZ3evtYM9Vl0+XnX0BDUKUUQ+xFiKHMs="},"flags/1x1/tc-34a37006252eea340488220585c31d047b57e3e7934c77180d930972aaceadc3.svg":{"logical_path":"flags/1x1/tc.svg","mtime":"2020-02-08T21:52:35+01:00","size":14843,"digest":"34a37006252eea340488220585c31d047b57e3e7934c77180d930972aaceadc3","integrity":"sha256-NKNwBiUu6jQEiCIFhcMdBHtX4+eTTHcYDZMJcqrOrcM="},"flags/4x3/td-b67a1978e3badb895ff640c80bb6c0e33eac354220c08cf3fc93d62bf5d685a3.svg":{"logical_path":"flags/4x3/td.svg","mtime":"2020-02-08T21:52:35+01:00","size":270,"digest":"b67a1978e3badb895ff640c80bb6c0e33eac354220c08cf3fc93d62bf5d685a3","integrity":"sha256-tnoZeOO624lf9kDIC7bA4z6sNUIgwIzz/JPWK/XWhaM="},"flags/1x1/td-556b3a7991c17010cb7e1ff23c4edcc2dcdb8c406a128d407fd165ea8a19d311.svg":{"logical_path":"flags/1x1/td.svg","mtime":"2020-02-08T21:52:35+01:00","size":282,"digest":"556b3a7991c17010cb7e1ff23c4edcc2dcdb8c406a128d407fd165ea8a19d311","integrity":"sha256-VWs6eZHBcBDLfh/yPE7cwtzbjEBqEo1Af9Fl6ooZ0xE="},"flags/4x3/tf-35cd83351521f3022a43e01f0c40f34663a66ac1e92045979f31d3fd65c16d02.svg":{"logical_path":"flags/4x3/tf.svg","mtime":"2020-02-08T21:52:35+01:00","size":1091,"digest":"35cd83351521f3022a43e01f0c40f34663a66ac1e92045979f31d3fd65c16d02","integrity":"sha256-Nc2DNRUh8wIqQ+AfDEDzRmOmasHpIEWXnzHT/WXBbQI="},"flags/1x1/tf-485e71f61ff577735dbc4ba1025515c22a83c48ee7f3a2ed49804766c35f6ea5.svg":{"logical_path":"flags/1x1/tf.svg","mtime":"2020-02-08T21:52:35+01:00","size":1199,"digest":"485e71f61ff577735dbc4ba1025515c22a83c48ee7f3a2ed49804766c35f6ea5","integrity":"sha256-SF5x9h/1d3NdvEuhAlUVwiqDxI7n86LtSYBHZsNfbqU="},"flags/4x3/tg-24b25f4c2213fe35e5f5586d7ab23abf0c25ad2049708cd52ba72e1ec7b754ff.svg":{"logical_path":"flags/4x3/tg.svg","mtime":"2020-02-08T21:52:35+01:00","size":725,"digest":"24b25f4c2213fe35e5f5586d7ab23abf0c25ad2049708cd52ba72e1ec7b754ff","integrity":"sha256-JLJfTCIT/jXl9VhterI6vwwlrSBJcIzVK6cuHse3VP8="},"flags/1x1/tg-05f3d98392a5ec3e4aecf8f629d3d03f05ac55abb7d9d84187d599acfe271374.svg":{"logical_path":"flags/1x1/tg.svg","mtime":"2020-02-08T21:52:35+01:00","size":736,"digest":"05f3d98392a5ec3e4aecf8f629d3d03f05ac55abb7d9d84187d599acfe271374","integrity":"sha256-BfPZg5Kl7D5K7Pj2KdPQPwWsVau32dhBh9WZrP4nE3Q="},"flags/4x3/th-cc936bacd84dddd15454ef06bc64e357f83854af34692fc37363272d61f637d4.svg":{"logical_path":"flags/4x3/th.svg","mtime":"2020-02-08T21:52:35+01:00","size":287,"digest":"cc936bacd84dddd15454ef06bc64e357f83854af34692fc37363272d61f637d4","integrity":"sha256-zJNrrNhN3dFUVO8GvGTjV/g4VK80aS/Dc2MnLWH2N9Q="},"flags/1x1/th-de82cbd770db2be53a8e3d59d86e2b748a5d3f96eb8584f7b9364cefbd06a172.svg":{"logical_path":"flags/1x1/th.svg","mtime":"2020-02-08T21:52:35+01:00","size":288,"digest":"de82cbd770db2be53a8e3d59d86e2b748a5d3f96eb8584f7b9364cefbd06a172","integrity":"sha256-3oLL13DbK+U6jj1Z2G4rdIpdP5brhYT3uTZM770GoXI="},"flags/4x3/tj-b90bf3e2dd63265d55b67962b160df65f021c42b6ea304e2943c10b9e2a8749d.svg":{"logical_path":"flags/4x3/tj.svg","mtime":"2020-02-08T21:52:35+01:00","size":1831,"digest":"b90bf3e2dd63265d55b67962b160df65f021c42b6ea304e2943c10b9e2a8749d","integrity":"sha256-uQvz4t1jJl1VtnlisWDfZfAhxCtuowTilDwQueKodJ0="},"flags/1x1/tj-5f6571e74b1f8720f9ecc2d3aa2098ca45d2e7ad6602b2a57c206384719b9f36.svg":{"logical_path":"flags/1x1/tj.svg","mtime":"2020-02-08T21:52:35+01:00","size":1788,"digest":"5f6571e74b1f8720f9ecc2d3aa2098ca45d2e7ad6602b2a57c206384719b9f36","integrity":"sha256-X2Vx50sfhyD57MLTqiCYykXS561mArKlfCBjhHGbnzY="},"flags/4x3/tk-602520b29b909c96baea17a38eb654d6c6fbc7088f46a0cb8d8fe34ff92e3cb8.svg":{"logical_path":"flags/4x3/tk.svg","mtime":"2020-02-08T21:52:35+01:00","size":791,"digest":"602520b29b909c96baea17a38eb654d6c6fbc7088f46a0cb8d8fe34ff92e3cb8","integrity":"sha256-YCUgspuQnJa66hejjrZU1sb7xwiPRqDLjY/jT/kuPLg="},"flags/1x1/tk-fe1dc8aaa0643a45a74ecec8aec09f0fe2207d104bb3c28c0b84405f1275aeba.svg":{"logical_path":"flags/1x1/tk.svg","mtime":"2020-02-08T21:52:35+01:00","size":781,"digest":"fe1dc8aaa0643a45a74ecec8aec09f0fe2207d104bb3c28c0b84405f1275aeba","integrity":"sha256-/h3IqqBkOkWnTs7IrsCfD+IgfRBLs8KMC4RAXxJ1rro="},"flags/4x3/tl-ebdb862aa5ae5de1a72242571deaa70bfb222f488a93b70e304f2075b474d54b.svg":{"logical_path":"flags/4x3/tl.svg","mtime":"2020-02-08T21:52:35+01:00","size":600,"digest":"ebdb862aa5ae5de1a72242571deaa70bfb222f488a93b70e304f2075b474d54b","integrity":"sha256-69uGKqWuXeGnIkJXHeqnC/siL0iKk7cOME8gdbR01Us="},"flags/1x1/tl-485f02183bdb192ba3ce6e5f076e184112739f883ae0a8fde33c454377b848d6.svg":{"logical_path":"flags/1x1/tl.svg","mtime":"2020-02-08T21:52:35+01:00","size":582,"digest":"485f02183bdb192ba3ce6e5f076e184112739f883ae0a8fde33c454377b848d6","integrity":"sha256-SF8CGDvbGSujzm5fB24YQRJzn4g64Kj94zxFQ3e4SNY="},"flags/4x3/tm-5ddb4128bf0becd7c60413d5418027f5f01ca4bc72561d54b94febfee7a5a24b.svg":{"logical_path":"flags/4x3/tm.svg","mtime":"2020-02-08T21:52:35+01:00","size":32579,"digest":"5ddb4128bf0becd7c60413d5418027f5f01ca4bc72561d54b94febfee7a5a24b","integrity":"sha256-XdtBKL8L7NfGBBPVQYAn9fAcpLxyVh1UuU/r/ueloks="},"flags/1x1/tm-3521ad569a4095aa8d4166d5d9094fccfdbb3ea411207ad685b6dd5814ef3392.svg":{"logical_path":"flags/1x1/tm.svg","mtime":"2020-02-08T21:52:35+01:00","size":31884,"digest":"3521ad569a4095aa8d4166d5d9094fccfdbb3ea411207ad685b6dd5814ef3392","integrity":"sha256-NSGtVppAlaqNQWbV2QlPzP27PqQRIHrWhbbdWBTvM5I="},"flags/4x3/tn-ca27eb50d88b11d20b5b09e2bbecb7753267222489920c526608e5d2acd22d79.svg":{"logical_path":"flags/4x3/tn.svg","mtime":"2020-02-08T21:52:35+01:00","size":753,"digest":"ca27eb50d88b11d20b5b09e2bbecb7753267222489920c526608e5d2acd22d79","integrity":"sha256-yifrUNiLEdILWwniu+y3dTJnIiSJkgxSZgjl0qzSLXk="},"flags/1x1/tn-222c6cd4742c558f48ebcacb47ea334057642fffa3456a1c75e0fad9e728d09b.svg":{"logical_path":"flags/1x1/tn.svg","mtime":"2020-02-08T21:52:35+01:00","size":743,"digest":"222c6cd4742c558f48ebcacb47ea334057642fffa3456a1c75e0fad9e728d09b","integrity":"sha256-Iixs1HQsVY9I68rLR+ozQFdkL/+jRWocdeD62eco0Js="},"flags/4x3/to-c9c509fc24f591fbe52bbf732c44291384c787796e1fc9c703a973587c3f8ad1.svg":{"logical_path":"flags/4x3/to.svg","mtime":"2020-02-08T21:52:35+01:00","size":358,"digest":"c9c509fc24f591fbe52bbf732c44291384c787796e1fc9c703a973587c3f8ad1","integrity":"sha256-ycUJ/CT1kfvlK79zLEQpE4THh3luH8nHA6lzWHw/itE="},"flags/1x1/to-cf26dfb44b56b915b2f11896355cb778b938ed54423311d69d7cda9626887dda.svg":{"logical_path":"flags/1x1/to.svg","mtime":"2020-02-08T21:52:35+01:00","size":364,"digest":"cf26dfb44b56b915b2f11896355cb778b938ed54423311d69d7cda9626887dda","integrity":"sha256-zybftEtWuRWy8RiWNVy3eLk47VRCMxHWnXzaliaIfdo="},"flags/4x3/tr-c40f697070cf8d8358785b9203d1c8f438976e3cd644a87d9ee16fa9960deaa4.svg":{"logical_path":"flags/4x3/tr.svg","mtime":"2020-02-08T21:52:35+01:00","size":557,"digest":"c40f697070cf8d8358785b9203d1c8f438976e3cd644a87d9ee16fa9960deaa4","integrity":"sha256-xA9pcHDPjYNYeFuSA9HI9DiXbjzWRKh9nuFvqZYN6qQ="},"flags/1x1/tr-627dcf91a1e5153c045e33a3459b5d56002530fddd3fc53927f4d0fb7ea004a5.svg":{"logical_path":"flags/1x1/tr.svg","mtime":"2020-02-08T21:52:35+01:00","size":578,"digest":"627dcf91a1e5153c045e33a3459b5d56002530fddd3fc53927f4d0fb7ea004a5","integrity":"sha256-Yn3PkaHlFTwEXjOjRZtdVgAlMP3dP8U5J/TQ+36gBKU="},"flags/4x3/tt-04786ffedbde2c96a30ad1cbf4db000848f14bd700324651fc88364e5f3c2fd0.svg":{"logical_path":"flags/4x3/tt.svg","mtime":"2020-02-08T21:52:35+01:00","size":324,"digest":"04786ffedbde2c96a30ad1cbf4db000848f14bd700324651fc88364e5f3c2fd0","integrity":"sha256-BHhv/tveLJajCtHL9NsACEjxS9cAMkZR/Ig2Tl88L9A="},"flags/1x1/tt-6a3c73bfa7782366d95e673d847ef8f84c0475b364d359def1efd264297bac30.svg":{"logical_path":"flags/1x1/tt.svg","mtime":"2020-02-08T21:52:35+01:00","size":323,"digest":"6a3c73bfa7782366d95e673d847ef8f84c0475b364d359def1efd264297bac30","integrity":"sha256-ajxzv6d4I2bZXmc9hH74+EwEdbNk01ne8e/SZCl7rDA="},"flags/4x3/tv-20b56e7c0a2fbaa2a0b7b1bd87afc6368440f175fb3a0589de5e34e99d163fd7.svg":{"logical_path":"flags/4x3/tv.svg","mtime":"2020-02-08T21:52:35+01:00","size":2299,"digest":"20b56e7c0a2fbaa2a0b7b1bd87afc6368440f175fb3a0589de5e34e99d163fd7","integrity":"sha256-ILVufAovuqKgt7G9h6/GNoRA8XX7OgWJ3l406Z0WP9c="},"flags/1x1/tv-8bce1d7bde2e20dcc473ed3a33c66e4bedcf1acf2d2fff6d54353a480b8cafbc.svg":{"logical_path":"flags/1x1/tv.svg","mtime":"2020-02-08T21:52:35+01:00","size":2166,"digest":"8bce1d7bde2e20dcc473ed3a33c66e4bedcf1acf2d2fff6d54353a480b8cafbc","integrity":"sha256-i84de94uINzEc+06M8ZuS+3PGs8tL/9tVDU6SAuMr7w="},"flags/4x3/tw-36070ac0a15ab1f4811478da62e7678756a9aa266b141ed0549aba1c0e04333a.svg":{"logical_path":"flags/4x3/tw.svg","mtime":"2020-02-08T21:52:35+01:00","size":945,"digest":"36070ac0a15ab1f4811478da62e7678756a9aa266b141ed0549aba1c0e04333a","integrity":"sha256-NgcKwKFasfSBFHjaYudnh1apqiZrFB7QVJq6HA4EMzo="},"flags/1x1/tw-fd7a0db2f3808842ca99176f097356fe9e6f3c120d6aa9e8c4a9c2dd4c3943ba.svg":{"logical_path":"flags/1x1/tw.svg","mtime":"2020-02-08T21:52:35+01:00","size":960,"digest":"fd7a0db2f3808842ca99176f097356fe9e6f3c120d6aa9e8c4a9c2dd4c3943ba","integrity":"sha256-/XoNsvOAiELKmRdvCXNW/p5vPBINaqnoxKnC3Uw5Q7o="},"flags/4x3/tz-51ad7d69f059075df61b9226468af0d78642af4ad34a7540f64c5bea82e803d7.svg":{"logical_path":"flags/4x3/tz.svg","mtime":"2020-02-08T21:52:35+01:00","size":546,"digest":"51ad7d69f059075df61b9226468af0d78642af4ad34a7540f64c5bea82e803d7","integrity":"sha256-Ua19afBZB132G5ImRorw14ZCr0rTSnVA9kxb6oLoA9c="},"flags/1x1/tz-0703f29a7ae02a9a1753cb1726dd2934d75ed3a12e8d63faa9fa866e1fe61440.svg":{"logical_path":"flags/1x1/tz.svg","mtime":"2020-02-08T21:52:35+01:00","size":605,"digest":"0703f29a7ae02a9a1753cb1726dd2934d75ed3a12e8d63faa9fa866e1fe61440","integrity":"sha256-BwPymnrgKpoXU8sXJt0pNNde06EujWP6qfqGbh/mFEA="},"flags/4x3/ua-7f7db03c3b492aaacd11b0abac70d543a7c0ec5265a36d529bbb80a7c432d81a.svg":{"logical_path":"flags/4x3/ua.svg","mtime":"2020-02-08T21:52:35+01:00","size":241,"digest":"7f7db03c3b492aaacd11b0abac70d543a7c0ec5265a36d529bbb80a7c432d81a","integrity":"sha256-f32wPDtJKqrNEbCrrHDVQ6fA7FJlo21Sm7uAp8Qy2Bo="},"flags/1x1/ua-25192fa80f120edb1dd1c4757fd7b79ef38f5e1729238f4135003e6a1501bf28.svg":{"logical_path":"flags/1x1/ua.svg","mtime":"2020-02-08T21:52:35+01:00","size":241,"digest":"25192fa80f120edb1dd1c4757fd7b79ef38f5e1729238f4135003e6a1501bf28","integrity":"sha256-JRkvqA8SDtsd0cR1f9e3nvOPXhcpI49BNQA+ahUBvyg="},"flags/4x3/ug-7635df53eafdf411be0809df835bfbcffd61badd6c4df3db0909c8b3188015a0.svg":{"logical_path":"flags/4x3/ug.svg","mtime":"2020-02-08T21:52:35+01:00","size":3959,"digest":"7635df53eafdf411be0809df835bfbcffd61badd6c4df3db0909c8b3188015a0","integrity":"sha256-djXfU+r99BG+CAnfg1v7z/1hut1sTfPbCQnIsxiAFaA="},"flags/1x1/ug-537f34f64e723fbe7cb7902ea0e61303f1ada79214197efc39ebe2c52ce24186.svg":{"logical_path":"flags/1x1/ug.svg","mtime":"2020-02-08T21:52:35+01:00","size":4038,"digest":"537f34f64e723fbe7cb7902ea0e61303f1ada79214197efc39ebe2c52ce24186","integrity":"sha256-U3809k5yP758t5AuoOYTA/Gtp5IUGX78OevixSziQYY="},"flags/4x3/um-a0ae80e34bbf94677dd6052ea87cc0090aba747dab5440e5ca6e231f7f07c96d.svg":{"logical_path":"flags/4x3/um.svg","mtime":"2020-02-08T21:52:35+01:00","size":4524,"digest":"a0ae80e34bbf94677dd6052ea87cc0090aba747dab5440e5ca6e231f7f07c96d","integrity":"sha256-oK6A40u/lGd91gUuqHzACQq6dH2rVEDlym4jH38HyW0="},"flags/1x1/um-3f1bc09babe7fdcf32518bb49d1aac3a66d0204f955eacca291c58d4f4ef895a.svg":{"logical_path":"flags/1x1/um.svg","mtime":"2020-02-08T21:52:35+01:00","size":3975,"digest":"3f1bc09babe7fdcf32518bb49d1aac3a66d0204f955eacca291c58d4f4ef895a","integrity":"sha256-PxvAm6vn/c8yUYu0nRqsOmbQIE+VXqzKKRxY1PTviVo="},"flags/4x3/us-aefd8f7e57d11f7b0416d01d9c665ab3848b10af849f35a4d772d58d24d83329.svg":{"logical_path":"flags/4x3/us.svg","mtime":"2020-02-08T21:52:35+01:00","size":4468,"digest":"aefd8f7e57d11f7b0416d01d9c665ab3848b10af849f35a4d772d58d24d83329","integrity":"sha256-rv2PflfRH3sEFtAdnGZas4SLEK+EnzWk13LVjSTYMyk="},"flags/1x1/us-87af45be9346e8c820312976abe332ee11f8931e29fa361328d28660a711b1e2.svg":{"logical_path":"flags/1x1/us.svg","mtime":"2020-02-08T21:52:35+01:00","size":3924,"digest":"87af45be9346e8c820312976abe332ee11f8931e29fa361328d28660a711b1e2","integrity":"sha256-h69FvpNG6MggMSl2q+My7hH4kx4p+jYTKNKGYKcRseI="},"flags/4x3/uy-9f636c8283abf56cc930746fd427c1d1644dcf8736c537629df13f760da96ebc.svg":{"logical_path":"flags/4x3/uy.svg","mtime":"2020-02-08T21:52:35+01:00","size":1721,"digest":"9f636c8283abf56cc930746fd427c1d1644dcf8736c537629df13f760da96ebc","integrity":"sha256-n2NsgoOr9WzJMHRv1CfB0WRNz4c2xTdinfE/dg2pbrw="},"flags/1x1/uy-e216b762a93ec55bf9b4ae3d35b7febe0b192a12246fd66c45139ce77fb2095e.svg":{"logical_path":"flags/1x1/uy.svg","mtime":"2020-02-08T21:52:35+01:00","size":1718,"digest":"e216b762a93ec55bf9b4ae3d35b7febe0b192a12246fd66c45139ce77fb2095e","integrity":"sha256-4ha3Yqk+xVv5tK49Nbf+vgsZKhIkb9ZsRROc53+yCV4="},"flags/4x3/uz-697d596705372323beddccb3626d1ce405b36249315c6b006ff1529e24909ceb.svg":{"logical_path":"flags/4x3/uz.svg","mtime":"2020-02-08T21:52:35+01:00","size":1457,"digest":"697d596705372323beddccb3626d1ce405b36249315c6b006ff1529e24909ceb","integrity":"sha256-aX1ZZwU3IyO+3cyzYm0c5AWzYkkxXGsAb/FSniSQnOs="},"flags/1x1/uz-aa34cbe4f6f0e4b5d890975578d28cc9b1e88ebd503d3bdca693748eb29b3353.svg":{"logical_path":"flags/1x1/uz.svg","mtime":"2020-02-08T21:52:35+01:00","size":1457,"digest":"aa34cbe4f6f0e4b5d890975578d28cc9b1e88ebd503d3bdca693748eb29b3353","integrity":"sha256-qjTL5Pbw5LXYkJdVeNKMybHojr1QPTvcppN0jrKbM1M="},"flags/4x3/va-d24d3c5bee108c396997c3d5b2bd2273433752d8c222eb531650e51551a4afd0.svg":{"logical_path":"flags/4x3/va.svg","mtime":"2020-02-08T21:52:35+01:00","size":91241,"digest":"d24d3c5bee108c396997c3d5b2bd2273433752d8c222eb531650e51551a4afd0","integrity":"sha256-0k08W+4QjDlpl8PVsr0ic0M3UtjCIutTFlDlFVGkr9A="},"flags/1x1/va-01160c1bffda12f0b94554ba0c50162a88da807943617334bd4c57a030985e95.svg":{"logical_path":"flags/1x1/va.svg","mtime":"2020-02-08T21:52:35+01:00","size":90876,"digest":"01160c1bffda12f0b94554ba0c50162a88da807943617334bd4c57a030985e95","integrity":"sha256-ARYMG//aEvC5RVS6DFAWKojagHlDYXM0vUxXoDCYXpU="},"flags/4x3/vc-ddf979bee2889414e5a05ac55f39a9c93f34e0aff0d35f007605049a2d8b5afb.svg":{"logical_path":"flags/4x3/vc.svg","mtime":"2020-02-08T21:52:35+01:00","size":454,"digest":"ddf979bee2889414e5a05ac55f39a9c93f34e0aff0d35f007605049a2d8b5afb","integrity":"sha256-3fl5vuKIlBTloFrFXzmpyT804K/w018AdgUEmi2LWvs="},"flags/1x1/vc-ac776e16dec19ff2e2d9238f541dae5d977282b451a83ab3d4122efed2392be9.svg":{"logical_path":"flags/1x1/vc.svg","mtime":"2020-02-08T21:52:35+01:00","size":501,"digest":"ac776e16dec19ff2e2d9238f541dae5d977282b451a83ab3d4122efed2392be9","integrity":"sha256-rHduFt7Bn/Li2SOPVB2uXZdygrRRqDqz1BIu/tI5K+k="},"flags/4x3/ve-e23abd006cc75a8c4f9ec1cb122b46f9b52e26c5606532d2c868277d4ccd523b.svg":{"logical_path":"flags/4x3/ve.svg","mtime":"2020-02-08T21:52:35+01:00","size":1171,"digest":"e23abd006cc75a8c4f9ec1cb122b46f9b52e26c5606532d2c868277d4ccd523b","integrity":"sha256-4jq9AGzHWoxPnsHLEitG+bUuJsVgZTLSyGgnfUzNUjs="},"flags/1x1/ve-1480713f28719e0a83da2c5f1333407dbfa5bcc0de8c9ba718fcf47273ee95ef.svg":{"logical_path":"flags/1x1/ve.svg","mtime":"2020-02-08T21:52:35+01:00","size":1191,"digest":"1480713f28719e0a83da2c5f1333407dbfa5bcc0de8c9ba718fcf47273ee95ef","integrity":"sha256-FIBxPyhxngqD2ixfEzNAfb+lvMDejJunGPz0cnPule8="},"flags/4x3/vg-7f8f24a4d6995e4dd39e3d9098dad5e14649821fa12ffc200edf0a586285ee15.svg":{"logical_path":"flags/4x3/vg.svg","mtime":"2020-02-08T21:52:35+01:00","size":24818,"digest":"7f8f24a4d6995e4dd39e3d9098dad5e14649821fa12ffc200edf0a586285ee15","integrity":"sha256-f48kpNaZXk3Tnj2QmNrV4UZJgh+hL/wgDt8KWGKF7hU="},"flags/1x1/vg-b464b6a78e46c29df9e4bdadc2646208f11c59168706456075f970552a24efa8.svg":{"logical_path":"flags/1x1/vg.svg","mtime":"2020-02-08T21:52:35+01:00","size":24997,"digest":"b464b6a78e46c29df9e4bdadc2646208f11c59168706456075f970552a24efa8","integrity":"sha256-tGS2p45Gwp355L2twmRiCPEcWRaHBkVgdflwVSok76g="},"flags/4x3/vi-58311325a293b046044976d899f288ce0fbe9bfd705a23947a9b38d7991983d7.svg":{"logical_path":"flags/4x3/vi.svg","mtime":"2020-02-08T21:52:35+01:00","size":8775,"digest":"58311325a293b046044976d899f288ce0fbe9bfd705a23947a9b38d7991983d7","integrity":"sha256-WDETJaKTsEYESXbYmfKIzg++m/1wWiOUeps415kZg9c="},"flags/1x1/vi-1c132d2cff66cdbdb7b6acf504bb0cd9d7579595d80c3fa6604ff24ca7a0184d.svg":{"logical_path":"flags/1x1/vi.svg","mtime":"2020-02-08T21:52:35+01:00","size":8730,"digest":"1c132d2cff66cdbdb7b6acf504bb0cd9d7579595d80c3fa6604ff24ca7a0184d","integrity":"sha256-HBMtLP9mzb23tqz1BLsM2ddXlZXYDD+mYE/yTKegGE0="},"flags/4x3/vn-a918d3c9cdc368b1d2ff9614d58cbcd1d43b725889b0ba18f5d4e693071e389a.svg":{"logical_path":"flags/4x3/vn.svg","mtime":"2020-02-08T21:52:35+01:00","size":492,"digest":"a918d3c9cdc368b1d2ff9614d58cbcd1d43b725889b0ba18f5d4e693071e389a","integrity":"sha256-qRjTyc3DaLHS/5YU1Yy80dQ7cliJsLoY9dTmkwceOJo="},"flags/1x1/vn-895e428ae3d98c99dbb02088cf8ef040bfb031df6f16c3c8fc3678505d869791.svg":{"logical_path":"flags/1x1/vn.svg","mtime":"2020-02-08T21:52:35+01:00","size":501,"digest":"895e428ae3d98c99dbb02088cf8ef040bfb031df6f16c3c8fc3678505d869791","integrity":"sha256-iV5CiuPZjJnbsCCIz47wQL+wMd9vFsPI/DZ4UF2Gl5E="},"flags/4x3/vu-2c286c778a7bed03cb603ab24b68dc91868f4f054cf4f851bdd17aa16731571c.svg":{"logical_path":"flags/4x3/vu.svg","mtime":"2020-02-08T21:52:35+01:00","size":3771,"digest":"2c286c778a7bed03cb603ab24b68dc91868f4f054cf4f851bdd17aa16731571c","integrity":"sha256-LChsd4p77QPLYDqyS2jckYaPTwVM9PhRvdF6oWcxVxw="},"flags/1x1/vu-51ef23121e2641ebeeac50d31c4e52b7d00d3ab1bc9fc0ad95ea86fd3631975a.svg":{"logical_path":"flags/1x1/vu.svg","mtime":"2020-02-08T21:52:35+01:00","size":3740,"digest":"51ef23121e2641ebeeac50d31c4e52b7d00d3ab1bc9fc0ad95ea86fd3631975a","integrity":"sha256-Ue8jEh4mQevurFDTHE5St9ANOrG8n8CtleqG/TYxl1o="},"flags/4x3/wf-f7e9ac5edac196ac32d7bafa04b5c0d924b89e9d7e4f3535a6a26c6c1523639c.svg":{"logical_path":"flags/4x3/wf.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"f7e9ac5edac196ac32d7bafa04b5c0d924b89e9d7e4f3535a6a26c6c1523639c","integrity":"sha256-9+msXtrBlqwy17r6BLXA2SS4np1+TzU1pqJsbBUjY5w="},"flags/1x1/wf-95a920a79aa32d92f8a362321aae4230e17025ac04d976593f4423d0c37c1aee.svg":{"logical_path":"flags/1x1/wf.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"95a920a79aa32d92f8a362321aae4230e17025ac04d976593f4423d0c37c1aee","integrity":"sha256-lakgp5qjLZL4o2IyGq5CMOFwJawE2XZZP0Qj0MN8Gu4="},"flags/4x3/ws-efc6505a802a3fa2018bc102fc2e11db8c738464c619381b6edc32d0a89341a3.svg":{"logical_path":"flags/4x3/ws.svg","mtime":"2020-02-08T21:52:35+01:00","size":663,"digest":"efc6505a802a3fa2018bc102fc2e11db8c738464c619381b6edc32d0a89341a3","integrity":"sha256-78ZQWoAqP6IBi8EC/C4R24xzhGTGGTgbbtwy0KiTQaM="},"flags/1x1/ws-e3afb81c037c814620027bf61ac5e266683cab7ba5796ecf10b64c110cfcb932.svg":{"logical_path":"flags/1x1/ws.svg","mtime":"2020-02-08T21:52:35+01:00","size":645,"digest":"e3afb81c037c814620027bf61ac5e266683cab7ba5796ecf10b64c110cfcb932","integrity":"sha256-46+4HAN8gUYgAnv2GsXiZmg8q3uleW7PELZMEQz8uTI="},"flags/4x3/ye-fd88856e70d66b01b4f0f608936a61cf3b1d9dad40a2932fc5da4d01f72a447b.svg":{"logical_path":"flags/4x3/ye.svg","mtime":"2020-02-08T21:52:35+01:00","size":278,"digest":"fd88856e70d66b01b4f0f608936a61cf3b1d9dad40a2932fc5da4d01f72a447b","integrity":"sha256-/YiFbnDWawG08PYIk2phzzsdna1AopMvxdpNAfcqRHs="},"flags/1x1/ye-0c0e32330871e6d83af54affb7dadbbe736f9799068508211fbae54db9bbdcc6.svg":{"logical_path":"flags/1x1/ye.svg","mtime":"2020-02-08T21:52:35+01:00","size":278,"digest":"0c0e32330871e6d83af54affb7dadbbe736f9799068508211fbae54db9bbdcc6","integrity":"sha256-DA4yMwhx5tg69Ur/t9rbvnNvl5kGhQghH7rlTbm73MY="},"flags/4x3/yt-2eef17b543424082d9f9b42a67e84c20b52e7f7eae8c4326d60711158da51d5b.svg":{"logical_path":"flags/4x3/yt.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"2eef17b543424082d9f9b42a67e84c20b52e7f7eae8c4326d60711158da51d5b","integrity":"sha256-Lu8XtUNCQILZ+bQqZ+hMILUuf36ujEMm1gcRFY2lHVs="},"flags/1x1/yt-911da8075337fd8f75ecc8a338c294cb771c6b9a08576f96c9de1437888cd2a7.svg":{"logical_path":"flags/1x1/yt.svg","mtime":"2020-02-08T21:52:35+01:00","size":295,"digest":"911da8075337fd8f75ecc8a338c294cb771c6b9a08576f96c9de1437888cd2a7","integrity":"sha256-kR2oB1M3/Y917MijOMKUy3cca5oIV2+Wyd4UN4iM0qc="},"flags/4x3/za-45991a2aee307198510e56bf92523070aac4241cafe6c3ddb8f89b20a61d6371.svg":{"logical_path":"flags/4x3/za.svg","mtime":"2020-02-08T21:52:35+01:00","size":856,"digest":"45991a2aee307198510e56bf92523070aac4241cafe6c3ddb8f89b20a61d6371","integrity":"sha256-RZkaKu4wcZhRDla/klIwcKrEJByv5sPduPibIKYdY3E="},"flags/1x1/za-bc09a89b29311ea7e582ef60bf4e18aff7c29de6fbefe309463ca765723a0ce8.svg":{"logical_path":"flags/1x1/za.svg","mtime":"2020-02-08T21:52:35+01:00","size":875,"digest":"bc09a89b29311ea7e582ef60bf4e18aff7c29de6fbefe309463ca765723a0ce8","integrity":"sha256-vAmomykxHqflgu9gv04Yr/fCneb77+MJRjynZXI6DOg="},"flags/4x3/zm-07c0f30d86e66d0cad9d66cd9c9384d9cce1844f159d245deff6717101fe49c2.svg":{"logical_path":"flags/4x3/zm.svg","mtime":"2020-02-08T21:52:35+01:00","size":5508,"digest":"07c0f30d86e66d0cad9d66cd9c9384d9cce1844f159d245deff6717101fe49c2","integrity":"sha256-B8DzDYbmbQytnWbNnJOE2czhhE8VnSRd7/ZxcQH+ScI="},"flags/1x1/zm-fc5bce3834c71fe36617ea5f57f0bd1dcf3880a7c6aa515dcf92ae067f796241.svg":{"logical_path":"flags/1x1/zm.svg","mtime":"2020-02-08T21:52:35+01:00","size":5429,"digest":"fc5bce3834c71fe36617ea5f57f0bd1dcf3880a7c6aa515dcf92ae067f796241","integrity":"sha256-/FvOODTHH+NmF+pfV/C9Hc84gKfGqlFdz5KuBn95YkE="},"flags/4x3/zw-5217c74f14d9fdda244b69c5982bbabee052ac0f1cc0704926e8b1e621e50f9a.svg":{"logical_path":"flags/4x3/zw.svg","mtime":"2020-02-08T21:52:35+01:00","size":6791,"digest":"5217c74f14d9fdda244b69c5982bbabee052ac0f1cc0704926e8b1e621e50f9a","integrity":"sha256-UhfHTxTZ/dokS2nFmCu6vuBSrA8cwHBJJuix5iHlD5o="},"flags/1x1/zw-a33b191c631709b9e1d85e06f5b15535fb544d4668c8bef865ede2a0b6a88ed9.svg":{"logical_path":"flags/1x1/zw.svg","mtime":"2020-02-08T21:52:35+01:00","size":6770,"digest":"a33b191c631709b9e1d85e06f5b15535fb544d4668c8bef865ede2a0b6a88ed9","integrity":"sha256-ozsZHGMXCbnh2F4G9bFVNftUTUZoyL74Ze3ioLaojtk="},"flags/4x3/es-ct-bcbb454a50c9a647efd43dcf041445f15e8dd70654bde530bf62401d4fb7738d.svg":{"logical_path":"flags/4x3/es-ct.svg","mtime":"2020-02-08T21:52:35+01:00","size":261,"digest":"bcbb454a50c9a647efd43dcf041445f15e8dd70654bde530bf62401d4fb7738d","integrity":"sha256-vLtFSlDJpkfv1D3PBBRF8V6N1wZUveUwv2JAHU+3c40="},"flags/1x1/es-ct-7f13eb2b2f5c11dccd7043286bed7540d4dad4b1a8367b0aca1b8405a351b2ef.svg":{"logical_path":"flags/1x1/es-ct.svg","mtime":"2020-02-08T21:52:35+01:00","size":260,"digest":"7f13eb2b2f5c11dccd7043286bed7540d4dad4b1a8367b0aca1b8405a351b2ef","integrity":"sha256-fxPrKy9cEdzNcEMoa+11QNTa1LGoNnsKyhuEBaNRsu8="},"flags/4x3/eu-5f129db64306353251b78f998d531d2f1019404cfa890ae63ed70dc316c7f240.svg":{"logical_path":"flags/4x3/eu.svg","mtime":"2020-02-08T21:52:35+01:00","size":1252,"digest":"5f129db64306353251b78f998d531d2f1019404cfa890ae63ed70dc316c7f240","integrity":"sha256-XxKdtkMGNTJRt4+ZjVMdLxAZQEz6iQrmPtcNwxbH8kA="},"flags/1x1/eu-ec59ac8daf2a63ea8e299ad63a208445d68a96affe6a10a7328acb6799d44127.svg":{"logical_path":"flags/1x1/eu.svg","mtime":"2020-02-08T21:52:35+01:00","size":1253,"digest":"ec59ac8daf2a63ea8e299ad63a208445d68a96affe6a10a7328acb6799d44127","integrity":"sha256-7Fmsja8qY+qOKZrWOiCERdaKlq/+ahCnMorLZ5nUQSc="},"flags/4x3/gb-eng-1895f4e35ae299f5d869da2462ffcf98df4b08dcddc531c8f175e49720001a14.svg":{"logical_path":"flags/4x3/gb-eng.svg","mtime":"2020-02-08T21:52:35+01:00","size":245,"digest":"1895f4e35ae299f5d869da2462ffcf98df4b08dcddc531c8f175e49720001a14","integrity":"sha256-GJX041rimfXYadokYv/PmN9LCNzdxTHI8XXklyAAGhQ="},"flags/1x1/gb-eng-d11afb87f40f35acda435a886ea044bd5e0b6f363ba0c7319f1d0181551fecf3.svg":{"logical_path":"flags/1x1/gb-eng.svg","mtime":"2020-02-08T21:52:35+01:00","size":235,"digest":"d11afb87f40f35acda435a886ea044bd5e0b6f363ba0c7319f1d0181551fecf3","integrity":"sha256-0Rr7h/QPNazaQ1qIbqBEvV4LbzY7oMcxnx0BgVUf7PM="},"flags/4x3/gb-nir-b280f09c787f495c1074376cd67537b40216f672917e7d204bb12b8e7c72afaf.svg":{"logical_path":"flags/4x3/gb-nir.svg","mtime":"2020-02-08T21:52:35+01:00","size":23738,"digest":"b280f09c787f495c1074376cd67537b40216f672917e7d204bb12b8e7c72afaf","integrity":"sha256-soDwnHh/SVwQdDds1nU3tAIW9nKRfn0gS7Erjnxyr68="},"flags/1x1/gb-nir-2e516e72e0e8e244ef430e6608322f8c4fb276807ab033279b2a6570dd68fd41.svg":{"logical_path":"flags/1x1/gb-nir.svg","mtime":"2020-02-08T21:52:35+01:00","size":25263,"digest":"2e516e72e0e8e244ef430e6608322f8c4fb276807ab033279b2a6570dd68fd41","integrity":"sha256-LlFucuDo4kTvQw5mCDIvjE+ydoB6sDMnmyplcN1o/UE="},"flags/4x3/gb-sct-1b9e407802ae901cf8da740c382ec2b19821837d76271a73346e0c63c2244506.svg":{"logical_path":"flags/4x3/gb-sct.svg","mtime":"2020-02-08T21:52:35+01:00","size":234,"digest":"1b9e407802ae901cf8da740c382ec2b19821837d76271a73346e0c63c2244506","integrity":"sha256-G55AeAKukBz42nQMOC7CsZghg312JxpzNG4MY8IkRQY="},"flags/1x1/gb-sct-d01e8a06a340e30ce52e8a3aba7ca6207afb96fdb238a815cc6cb92df8fa5df3.svg":{"logical_path":"flags/1x1/gb-sct.svg","mtime":"2020-02-08T21:52:35+01:00","size":242,"digest":"d01e8a06a340e30ce52e8a3aba7ca6207afb96fdb238a815cc6cb92df8fa5df3","integrity":"sha256-0B6KBqNA4wzlLoo6unymIHr7lv2yOKgVzGy5Lfj6XfM="},"flags/4x3/gb-wls-5232b3e376a19866cddec8225cba242783b2a48063811957f1ce5a2c347c5bc9.svg":{"logical_path":"flags/4x3/gb-wls.svg","mtime":"2020-02-08T21:52:35+01:00","size":9188,"digest":"5232b3e376a19866cddec8225cba242783b2a48063811957f1ce5a2c347c5bc9","integrity":"sha256-UjKz43ahmGbN3sgiXLokJ4OypIBjgRlX8c5aLDR8W8k="},"flags/1x1/gb-wls-126615bc3597fda1ca4ee931ef24f6c2cf2547998c06db9c1ded69fe66c479e9.svg":{"logical_path":"flags/1x1/gb-wls.svg","mtime":"2020-02-08T21:52:35+01:00","size":9083,"digest":"126615bc3597fda1ca4ee931ef24f6c2cf2547998c06db9c1ded69fe66c479e9","integrity":"sha256-EmYVvDWX/aHKTukx7yT2ws8lR5mMBtucHe1p/mbEeek="},"flags/4x3/un-31dece22ae18c3e01e86648ef3ef45f2f5b3d9d28a1e2bbbcdb1d87c37af55af.svg":{"logical_path":"flags/4x3/un.svg","mtime":"2020-02-08T21:52:35+01:00","size":20268,"digest":"31dece22ae18c3e01e86648ef3ef45f2f5b3d9d28a1e2bbbcdb1d87c37af55af","integrity":"sha256-Md7OIq4Yw+AehmSO8+9F8vWz2dKKHiu7zbHYfDevVa8="},"flags/1x1/un-455b5f3173ca9ac64f2135fac4ead7217d7fbe07551d0d2cc60216f83208f798.svg":{"logical_path":"flags/1x1/un.svg","mtime":"2020-02-08T21:52:35+01:00","size":20476,"digest":"455b5f3173ca9ac64f2135fac4ead7217d7fbe07551d0d2cc60216f83208f798","integrity":"sha256-RVtfMXPKmsZPITX6xOrXIX1/vgdVHQ0sxgIW+DII95g="},"leaflet/dist/images/layers-1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6.png":{"logical_path":"leaflet/dist/images/layers.png","mtime":"2020-04-06T16:47:40+02:00","size":696,"digest":"1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6","integrity":"sha256-Hbvp0CjikvNvy6j4s6KNXokydU/CIVuaxp5M3s9RB8Y="},"leaflet/dist/images/layers-2x-066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf.png":{"logical_path":"leaflet/dist/images/layers-2x.png","mtime":"2020-04-06T16:47:40+02:00","size":1259,"digest":"066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf","integrity":"sha256-Bm2sqFDY/77wB68AsG6sABVyje4nnFHzy2xxbffELt8="},"leaflet/dist/images/marker-icon-574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437.png":{"logical_path":"leaflet/dist/images/marker-icon.png","mtime":"2020-04-06T16:47:40+02:00","size":1466,"digest":"574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437","integrity":"sha256-V0w6XMqF9BFAhbaEFZbWLwDXyJLHsD8oy/owHesdxDc="},"markers-soft-e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739.png":{"logical_path":"markers-soft.png","mtime":"2020-04-06T16:47:40+02:00","size":41226,"digest":"e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739","integrity":"sha256-54eE5O1wqv/d1zwxX6tZAjPMTntyOI191HoUeW/Hxzk="},"markers-shadow-8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20.png":{"logical_path":"markers-shadow.png","mtime":"2020-04-06T16:47:40+02:00","size":535,"digest":"8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20","integrity":"sha256-hwOiJicQ9ePSnmXSrN+Q1lEuFZ4RnSe4I0cx2KYgiiA="},"markers-soft@2x-c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf.png":{"logical_path":"markers-soft@2x.png","mtime":"2020-04-06T16:47:40+02:00","size":66408,"digest":"c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf","integrity":"sha256-wedyU6i/vjDOwkiF1wRvRDt267ZvTJYfdwg7A/Sly68="},"markers-shadow@2x-b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a.png":{"logical_path":"markers-shadow@2x.png","mtime":"2020-04-06T16:47:40+02:00","size":1469,"digest":"b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a","integrity":"sha256-shpTa+JzE/tQT2n1iZ/wsSRbJ2VxdprAjWwyw1Z25Ho="},"events-f12a16c68c84767cfc222c763d56e2209bc4d5ad519f05095f2d4429c0b1a315.js":{"logical_path":"events.js","mtime":"2020-04-06T16:47:40+02:00","size":1220,"digest":"f12a16c68c84767cfc222c763d56e2209bc4d5ad519f05095f2d4429c0b1a315","integrity":"sha256-8SoWxoyEdnz8Iix2PVbiIJvE1a1RnwUJXy1EKcCxoxU="},"filter-2ec96b9d0c650c880941d7e9fd568decd1d587dc037d106144a07ad103b0e0ca.js":{"logical_path":"filter.js","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"2ec96b9d0c650c880941d7e9fd568decd1d587dc037d106144a07ad103b0e0ca","integrity":"sha256-LslrnQxlDIgJQdfp/VaN7NHVh9wDfRBhRKB60QOw4Mo="},"flash-41f5b95206f7a684b89eb997846a01155f94ab0b6568b4275704d3f285f599d7.js":{"logical_path":"flash.js","mtime":"2020-04-06T16:47:40+02:00","size":82,"digest":"41f5b95206f7a684b89eb997846a01155f94ab0b6568b4275704d3f285f599d7","integrity":"sha256-QfW5Ugb3poS4nrmXhGoBFV+UqwtlaLQnVwTT8oX1mdc="},"frTypo-fed98b7d2ce187c2a3cff9153ac6aa2dbf7b91d33809da77c6561ff34d1be836.js":{"logical_path":"frTypo.js","mtime":"2020-04-06T16:47:40+02:00","size":1962,"digest":"fed98b7d2ce187c2a3cff9153ac6aa2dbf7b91d33809da77c6561ff34d1be836","integrity":"sha256-/tmLfSzhh8Kjz/kVOsaqLb97kdM4Cdp3xlYf800b6DY="},"maps-e86261c3df6f4ff292d786ab7261c98c408f466557b2f4915ae6dc25c1a05819.js":{"logical_path":"maps.js","mtime":"2020-01-07T21:15:22+01:00","size":3970,"digest":"e86261c3df6f4ff292d786ab7261c98c408f466557b2f4915ae6dc25c1a05819","integrity":"sha256-6GJhw99vT/KS14arcmHJjECPRmVXsvSRWubcJcGgWBk="},"moderations-c5471afdd75123fdbb36ee14b85e6633c8127d0c115e35931616c329a8605380.js":{"logical_path":"moderations.js","mtime":"2020-04-06T16:47:40+02:00","size":377,"digest":"c5471afdd75123fdbb36ee14b85e6633c8127d0c115e35931616c329a8605380","integrity":"sha256-xUca/ddRI/27Nu4UuF5mM8gSfQwRXjWTFhbDKahgU4A="},"notes-85819c738920d4fe3e6b89716788590d27b2db4b11802c0a0cdd48baefb18fcb.js":{"logical_path":"notes.js","mtime":"2020-04-06T16:47:40+02:00","size":31,"digest":"85819c738920d4fe3e6b89716788590d27b2db4b11802c0a0cdd48baefb18fcb","integrity":"sha256-hYGcc4kg1P4+a4lxZ4hZDSey20sRgCwKDN1Iuu+xj8s="},"orgas-85819c738920d4fe3e6b89716788590d27b2db4b11802c0a0cdd48baefb18fcb.js":{"logical_path":"orgas.js","mtime":"2020-04-06T16:47:40+02:00","size":31,"digest":"85819c738920d4fe3e6b89716788590d27b2db4b11802c0a0cdd48baefb18fcb","integrity":"sha256-hYGcc4kg1P4+a4lxZ4hZDSey20sRgCwKDN1Iuu+xj8s="},"pages-9dcc8cb3626a9f198ab95f9e64bb4d269167a7405dd07f94140f5ec6d32b6084.js":{"logical_path":"pages.js","mtime":"2020-04-05T17:14:06+02:00","size":694,"digest":"9dcc8cb3626a9f198ab95f9e64bb4d269167a7405dd07f94140f5ec6d32b6084","integrity":"sha256-ncyMs2JqnxmKuV+eZLtNJpFnp0Bd0H+UFA9extMrYIQ="},"pagination-ab6b8afabe3d53764287ed9d0ee9d4b7092cab98cdfb453a54471066fed05aa5.js":{"logical_path":"pagination.js","mtime":"2020-01-16T20:20:11+01:00","size":728,"digest":"ab6b8afabe3d53764287ed9d0ee9d4b7092cab98cdfb453a54471066fed05aa5","integrity":"sha256-q2uK+r49U3ZCh+2dDunUtwksq5jN+0U6VEcQZv7QWqU="},"stats-40295d647e6144715bc9fb45f60096ddff913afddf11844aeacda47cbed68400.js":{"logical_path":"stats.js","mtime":"2020-04-06T16:47:40+02:00","size":908,"digest":"40295d647e6144715bc9fb45f60096ddff913afddf11844aeacda47cbed68400","integrity":"sha256-QCldZH5hRHFbyftF9gCW3f+ROv3fEYRK6s2kfL7WhAA="},"_variables-d0ff5974b6aa52cf562bea5921840c032a860a91a3512f7fe8f768f6bbe005f6.css":{"logical_path":"_variables.css","mtime":"2020-04-06T16:47:40+02:00","size":0,"digest":"d0ff5974b6aa52cf562bea5921840c032a860a91a3512f7fe8f768f6bbe005f6","integrity":"sha256-0P9ZdLaqUs9WK+pZIYQMAyqGCpGjUS9/6Pdo9rvgBfY="},"agendadescommuns-734d24884af76ee167fcf102dbdbec43e5b2726e65f40c350ad3800f7ee99f55.css":{"logical_path":"agendadescommuns.css","mtime":"2020-04-06T16:47:40+02:00","size":939,"digest":"734d24884af76ee167fcf102dbdbec43e5b2726e65f40c350ad3800f7ee99f55","integrity":"sha256-c00kiEr3buFn/PEC29vsQ+Wycm5l9Aw1CtOAD37pn1U="},"all-a55a9ed762f8344ecd74346308ae7066a283d34302fbce1ef5924ad5ce19bb27.css":{"logical_path":"all.css","mtime":"2020-04-06T16:47:40+02:00","size":2745,"digest":"a55a9ed762f8344ecd74346308ae7066a283d34302fbce1ef5924ad5ce19bb27","integrity":"sha256-pVqe12L4NE7NdDRjCK5wZqKD00MC+84e9ZJK1c4Zuyc="},"digest-e13dd03a72165cef5027b81a774f458fe1a6910d2baaae84bae560b3199a77c3.css":{"logical_path":"digest.css","mtime":"2020-04-06T16:47:40+02:00","size":304,"digest":"e13dd03a72165cef5027b81a774f458fe1a6910d2baaae84bae560b3199a77c3","integrity":"sha256-4T3QOnIWXO9QJ7gad09Fj+GmkQ0rqq6EuuVgsxmad8M="},"events-bb56649a8c5b11d0b8005a8e23e7560f34d7b79fcccccffe4a1407102cfffed6.css":{"logical_path":"events.css","mtime":"2020-04-06T16:47:40+02:00","size":3191,"digest":"bb56649a8c5b11d0b8005a8e23e7560f34d7b79fcccccffe4a1407102cfffed6","integrity":"sha256-u1ZkmoxbEdC4AFqOI+dWDzTXt5/MzM/+ShQHECz//tY="},"frTypo-ebcaa45fa7c0bf7821d05959aaceda63d26a30d30079e70619932b0e1d49f512.css":{"logical_path":"frTypo.css","mtime":"2020-04-06T16:47:40+02:00","size":76,"digest":"ebcaa45fa7c0bf7821d05959aaceda63d26a30d30079e70619932b0e1d49f512","integrity":"sha256-68qkX6fAv3gh0FlZqs7aY9JqMNMAeecGGZMrDh1J9RI="},"maps-644829bf7b14b0c1b73efb7b2d44049969271bd969174b5bf7c53d0159cf424c.css":{"logical_path":"maps.css","mtime":"2020-01-17T21:34:48+01:00","size":536,"digest":"644829bf7b14b0c1b73efb7b2d44049969271bd969174b5bf7c53d0159cf424c","integrity":"sha256-ZEgpv3sUsMG3Pvt7LUQEmWknG9lpF0tb98U9AVnPQkw="},"mobile-59b7aeed8e7ee6e2ced7bb7a6f26ae9e4e2ed3c514a584c0e706128b4ad7fe36.css":{"logical_path":"mobile.css","mtime":"2020-04-06T16:47:40+02:00","size":2414,"digest":"59b7aeed8e7ee6e2ced7bb7a6f26ae9e4e2ed3c514a584c0e706128b4ad7fe36","integrity":"sha256-Wbeu7Y5+5uLO17t6byaunk4u08UUpYTA5wYSi0rX/jY="},"notes-e607250b9cef023a762c009acc65c3320ec1f6d5814a30aa3c1ba907b4f8cb5f.css":{"logical_path":"notes.css","mtime":"2020-04-06T16:47:40+02:00","size":37,"digest":"e607250b9cef023a762c009acc65c3320ec1f6d5814a30aa3c1ba907b4f8cb5f","integrity":"sha256-5gclC5zvAjp2LACazGXDMg7B9tWBSjCqPBupB7T4y18="},"orgas-dd7a2a3fc67e9fa14675e1b59263b8f83e052274d6b900875b0ee4494143ad80.css":{"logical_path":"orgas.css","mtime":"2020-04-06T16:47:40+02:00","size":672,"digest":"dd7a2a3fc67e9fa14675e1b59263b8f83e052274d6b900875b0ee4494143ad80","integrity":"sha256-3XoqP8Z+n6FGdeG1kmO4+D4FInTWuQCHWw7kSUFDrYA="},"pages-5eed9147c9cfe84eb1299bc0ca0d8b0c81fb0c07ecb38e26949e7d4e483746e2.css":{"logical_path":"pages.css","mtime":"2020-04-06T16:47:40+02:00","size":75,"digest":"5eed9147c9cfe84eb1299bc0ca0d8b0c81fb0c07ecb38e26949e7d4e483746e2","integrity":"sha256-Xu2RR8nP6E6xKZvAyg2LDIH7DAfss44mlJ59Tkg3RuI="},"region-d285b5ecdf6d5b5ee68faac92854e4868a609e5509b90e90047178ac45649153.css":{"logical_path":"region.css","mtime":"2019-12-22T12:30:30+01:00","size":1903,"digest":"d285b5ecdf6d5b5ee68faac92854e4868a609e5509b90e90047178ac45649153","integrity":"sha256-0oW17N9tW17mj6rJKFTkhopgnlUJuQ6QBHF4rEVkkVM="},"scaffolds-c26fee551087c3b72541cae52a1cc6b454f153e2d04c01d4b35b9ec1ae6cf09b.css":{"logical_path":"scaffolds.css","mtime":"2020-04-06T16:47:40+02:00","size":430,"digest":"c26fee551087c3b72541cae52a1cc6b454f153e2d04c01d4b35b9ec1ae6cf09b","integrity":"sha256-wm/uVRCHw7clQcrlKhzGtFTxU+LQTAHUs1uewa5s8Js="},"sessions-d0ff5974b6aa52cf562bea5921840c032a860a91a3512f7fe8f768f6bbe005f6.css":{"logical_path":"sessions.css","mtime":"2020-04-06T16:47:40+02:00","size":0,"digest":"d0ff5974b6aa52cf562bea5921840c032a860a91a3512f7fe8f768f6bbe005f6","integrity":"sha256-0P9ZdLaqUs9WK+pZIYQMAyqGCpGjUS9/6Pdo9rvgBfY="},"tags-c338d658bc3a1e40d8c6694d1fab6a633686ccc2c626563f890384fab38c20f0.css":{"logical_path":"tags.css","mtime":"2020-02-08T21:52:35+01:00","size":1399,"digest":"c338d658bc3a1e40d8c6694d1fab6a633686ccc2c626563f890384fab38c20f0","integrity":"sha256-wzjWWLw6HkDYxmlNH6tqYzaGzMLGJlY/iQOE+rOMIPA="},"versions-3e2a6ffdc6f7728b0e5e517a208c4d1a72167a6d4da6bc4d36db4941150926bb.css":{"logical_path":"versions.css","mtime":"2020-04-06T16:47:40+02:00","size":47,"digest":"3e2a6ffdc6f7728b0e5e517a208c4d1a72167a6d4da6bc4d36db4941150926bb","integrity":"sha256-Pipv/cb3cosOXlF6IIxNGnIWem1NprxNNttJQRUJJrs="},"moderations-d96d93c516d69b280e4d312ec96d2c13f3650e03c57cc08bf582b2d26bf2882e.css":{"logical_path":"moderations.css","mtime":"2019-12-25T17:18:51+01:00","size":939,"digest":"d96d93c516d69b280e4d312ec96d2c13f3650e03c57cc08bf582b2d26bf2882e","integrity":"sha256-2W2TxRbWmygOTTEuyW0sE/NlDgPFfMCL9YKy0mvyiC4="},"region-0d416c6171a588eb6a1a40642f2984f08b0b205d2eab077b12bd859fd60cef3e.css":{"logical_path":"region.css","mtime":"2020-04-06T16:47:40+02:00","size":1871,"digest":"0d416c6171a588eb6a1a40642f2984f08b0b205d2eab077b12bd859fd60cef3e","integrity":"sha256-DUFsYXGliOtqGkBkLymE8IsLIF0uqwd7Er2Fn9YM7z4="},"stats-e46b6e6ffdd66de16d29c029216debae3fc6f81d83e21bc8be2700df34cb4f20.css":{"logical_path":"stats.css","mtime":"2019-12-25T17:18:51+01:00","size":403,"digest":"e46b6e6ffdd66de16d29c029216debae3fc6f81d83e21bc8be2700df34cb4f20","integrity":"sha256-5Gtub/3WbeFtKcApIW3rrj/G+B2D4hvIvicA3zTLTyA="},"moderations-ede8f4f2808ab572908780f2daea2ea4e76b1d0b0c5735d744bb7cc51fb69895.css":{"logical_path":"moderations.css","mtime":"2020-04-06T16:47:40+02:00","size":979,"digest":"ede8f4f2808ab572908780f2daea2ea4e76b1d0b0c5735d744bb7cc51fb69895","integrity":"sha256-7ej08oCKtXKQh4Dy2uoupOdrHQsMVzXXRLt8xR+2mJU="},"stats-a22ad34b2184e63c6ee60f75829dcae68c2a3e9094a0af419e06306b5b68af45.css":{"logical_path":"stats.css","mtime":"2020-04-06T16:47:40+02:00","size":505,"digest":"a22ad34b2184e63c6ee60f75829dcae68c2a3e9094a0af419e06306b5b68af45","integrity":"sha256-oirTSyGE5jxu5g91gp3K5owqPpCUoK9BngYwa1tor0U="},"tinymce-rails.manifest-e761884522a9ca2dac475b68bac1946c990fb9af8b676d3b6b45692a920c8d04.js":{"logical_path":"tinymce-rails.manifest.js","mtime":"2020-04-06T16:47:39+02:00","size":3,"digest":"e761884522a9ca2dac475b68bac1946c990fb9af8b676d3b6b45692a920c8d04","integrity":"sha256-52GIRSKpyi2sR1tousGUbJkPua+LZ207a0VpKpIMjQQ="},"tinymce/skins/content/dark/content-6d10d0c4a63ab02f8fb5d35269832ba1e26d4e74e419d01f4c66c5282d3dd1af.css":{"logical_path":"tinymce/skins/content/dark/content.css","mtime":"2020-04-06T16:47:39+02:00","size":832,"digest":"6d10d0c4a63ab02f8fb5d35269832ba1e26d4e74e419d01f4c66c5282d3dd1af","integrity":"sha256-bRDQxKY6sC+PtdNSaYMroeJtTnTkGdAfTGbFKC090a8="},"tinymce/skins/content/dark/content.min-6d10d0c4a63ab02f8fb5d35269832ba1e26d4e74e419d01f4c66c5282d3dd1af.css":{"logical_path":"tinymce/skins/content/dark/content.min.css","mtime":"2020-04-06T16:47:39+02:00","size":832,"digest":"6d10d0c4a63ab02f8fb5d35269832ba1e26d4e74e419d01f4c66c5282d3dd1af","integrity":"sha256-bRDQxKY6sC+PtdNSaYMroeJtTnTkGdAfTGbFKC090a8="},"tinymce/skins/content/default/content-6c8756ba3e02f97451d5c55be85537c3fc75da6e9edea7121c8b9e64aa903528.css":{"logical_path":"tinymce/skins/content/default/content.css","mtime":"2020-04-06T16:47:39+02:00","size":707,"digest":"6c8756ba3e02f97451d5c55be85537c3fc75da6e9edea7121c8b9e64aa903528","integrity":"sha256-bIdWuj4C+XRR1cVb6FU3w/x12m6e3qcSHIueZKqQNSg="},"tinymce/skins/content/default/content.min-6c8756ba3e02f97451d5c55be85537c3fc75da6e9edea7121c8b9e64aa903528.css":{"logical_path":"tinymce/skins/content/default/content.min.css","mtime":"2020-04-06T16:47:39+02:00","size":707,"digest":"6c8756ba3e02f97451d5c55be85537c3fc75da6e9edea7121c8b9e64aa903528","integrity":"sha256-bIdWuj4C+XRR1cVb6FU3w/x12m6e3qcSHIueZKqQNSg="},"tinymce/skins/content/document/content-cef2580b983fd570768ec93bed32544cfd4f3aeb5cc71da988e5acaa803c276f.css":{"logical_path":"tinymce/skins/content/document/content.css","mtime":"2020-04-06T16:47:39+02:00","size":791,"digest":"cef2580b983fd570768ec93bed32544cfd4f3aeb5cc71da988e5acaa803c276f","integrity":"sha256-zvJYC5g/1XB2jsk77TJUTP1POutcxx2piOWsqoA8J28="},"tinymce/skins/content/document/content.min-cef2580b983fd570768ec93bed32544cfd4f3aeb5cc71da988e5acaa803c276f.css":{"logical_path":"tinymce/skins/content/document/content.min.css","mtime":"2020-04-06T16:47:39+02:00","size":791,"digest":"cef2580b983fd570768ec93bed32544cfd4f3aeb5cc71da988e5acaa803c276f","integrity":"sha256-zvJYC5g/1XB2jsk77TJUTP1POutcxx2piOWsqoA8J28="},"tinymce/skins/content/writer/content-eb8e48d175f37ee3a4deb4fafb4cde5f579420b4ba62c14e96e6da9fd937b622.css":{"logical_path":"tinymce/skins/content/writer/content.css","mtime":"2020-04-06T16:47:39+02:00","size":728,"digest":"eb8e48d175f37ee3a4deb4fafb4cde5f579420b4ba62c14e96e6da9fd937b622","integrity":"sha256-645I0XXzfuOk3rT6+0zeX1eUILS6YsFOluban9k3tiI="},"tinymce/skins/content/writer/content.min-eb8e48d175f37ee3a4deb4fafb4cde5f579420b4ba62c14e96e6da9fd937b622.css":{"logical_path":"tinymce/skins/content/writer/content.min.css","mtime":"2020-04-06T16:47:39+02:00","size":728,"digest":"eb8e48d175f37ee3a4deb4fafb4cde5f579420b4ba62c14e96e6da9fd937b622","integrity":"sha256-645I0XXzfuOk3rT6+0zeX1eUILS6YsFOluban9k3tiI="},"tinymce/skins/ui/oxide-dark/content.mobile-72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.mobile.css","mtime":"2020-04-06T16:47:39+02:00","size":294,"digest":"72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064","integrity":"sha256-clFMbAK98C/nJ8v0qPyNBz3uj8+u376EdEmmIb/w8GQ="},"tinymce/skins/ui/oxide-dark/content.mobile.min-72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.mobile.min.css","mtime":"2020-04-06T16:47:39+02:00","size":294,"digest":"72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064","integrity":"sha256-clFMbAK98C/nJ8v0qPyNBz3uj8+u376EdEmmIb/w8GQ="},"tinymce/skins/ui/oxide-dark/skin.mobile-8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.css","mtime":"2020-04-06T16:47:39+02:00","size":20783,"digest":"8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a","integrity":"sha256-im0d74Ken0Iv2S24iFdAWuUSioFtsMM8+OTv9RNzizo="},"tinymce/skins/ui/oxide-dark/skin.mobile.min-8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.min.css","mtime":"2020-04-06T16:47:39+02:00","size":20783,"digest":"8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a","integrity":"sha256-im0d74Ken0Iv2S24iFdAWuUSioFtsMM8+OTv9RNzizo="},"tinymce/skins/ui/oxide/content.mobile-72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064.css":{"logical_path":"tinymce/skins/ui/oxide/content.mobile.css","mtime":"2020-04-06T16:47:39+02:00","size":294,"digest":"72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064","integrity":"sha256-clFMbAK98C/nJ8v0qPyNBz3uj8+u376EdEmmIb/w8GQ="},"tinymce/skins/ui/oxide/content.mobile.min-72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064.css":{"logical_path":"tinymce/skins/ui/oxide/content.mobile.min.css","mtime":"2020-04-06T16:47:39+02:00","size":294,"digest":"72514c6c02bdf02fe727cbf4a8fc8d073dee8fcfaedfbe847449a621bff0f064","integrity":"sha256-clFMbAK98C/nJ8v0qPyNBz3uj8+u376EdEmmIb/w8GQ="},"tinymce/skins/ui/oxide/skin.mobile-8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.css","mtime":"2020-04-06T16:47:39+02:00","size":20783,"digest":"8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a","integrity":"sha256-im0d74Ken0Iv2S24iFdAWuUSioFtsMM8+OTv9RNzizo="},"tinymce/skins/ui/oxide/skin.mobile.min-8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.min.css","mtime":"2020-04-06T16:47:39+02:00","size":20783,"digest":"8a6d1def829e9f422fd92db88857405ae5128a816db0c33cf8e4eff513738b3a","integrity":"sha256-im0d74Ken0Iv2S24iFdAWuUSioFtsMM8+OTv9RNzizo="},"tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile-e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213.woff":{"logical_path":"tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff","mtime":"2020-04-06T16:47:39+02:00","size":4624,"digest":"e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213","integrity":"sha256-5kvxVqQy1j9bNLRWe1E9wNNRtJFhx/YI+4JXS/3Z0hM="},"tinymce/skins/ui/oxide/fonts/tinymce-mobile-e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213.woff":{"logical_path":"tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff","mtime":"2020-04-06T16:47:39+02:00","size":4624,"digest":"e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213","integrity":"sha256-5kvxVqQy1j9bNLRWe1E9wNNRtJFhx/YI+4JXS/3Z0hM="},"maps-81cfae958ef9248cab2f666cc53c8a003cf1e11bcb0b90297c01c87fde557e25.js":{"logical_path":"maps.js","mtime":"2020-04-06T16:47:40+02:00","size":3760,"digest":"81cfae958ef9248cab2f666cc53c8a003cf1e11bcb0b90297c01c87fde557e25","integrity":"sha256-gc+ulY75JIyrL2ZsxTyKADzx4RvLC5ApfAHIf95VfiU="},"lef-6508797f5a020d87aa0db27dcddd904ba3cc9e438adb1c90f5163af8377acaee.png":{"logical_path":"lef.png","mtime":"2020-04-06T16:47:39+02:00","size":24674,"digest":"6508797f5a020d87aa0db27dcddd904ba3cc9e438adb1c90f5163af8377acaee","integrity":"sha256-ZQh5f1oCDYeqDbJ9zd2QS6PMnkOK2xyQ9RY6+Dd6yu4="},"list-36f999a19ad2efdd776921f8c8a1cbcc168ab9735fec39326a040907b72f6f2c.js":{"logical_path":"list.js","mtime":"2020-02-04T18:01:42+01:00","size":1103,"digest":"36f999a19ad2efdd776921f8c8a1cbcc168ab9735fec39326a040907b72f6f2c","integrity":"sha256-NvmZoZrS7913aSH4yKHLzBaKuXNf7DkyagQJB7cvbyw="},"maps-2cbe926bbfbadc48d08ee61a7fad5dfd9d56573ff070d94c4045cf79daa919ba.css":{"logical_path":"maps.css","mtime":"2020-04-06T16:47:40+02:00","size":524,"digest":"2cbe926bbfbadc48d08ee61a7fad5dfd9d56573ff070d94c4045cf79daa919ba","integrity":"sha256-LL6Sa7+63EjQjuYaf61d/Z1WVz/wcNlMQEXPedqpGbo="},"list-e31f674476f4f7c5b464b1ee3c6832f4dc7d0588597a383a6fb372127b2b27bd.js":{"logical_path":"list.js","mtime":"2020-04-06T16:47:40+02:00","size":1272,"digest":"e31f674476f4f7c5b464b1ee3c6832f4dc7d0588597a383a6fb372127b2b27bd","integrity":"sha256-4x9nRHb098W0ZLHuPGgy9Nx9BYhZejg6b7NyEnsrJ70="},"list-efff25153e0f94f2af353b02e239c51da65e3a1250369a9960ca35648925d9f7.css":{"logical_path":"list.css","mtime":"2020-04-06T16:47:40+02:00","size":940,"digest":"efff25153e0f94f2af353b02e239c51da65e3a1250369a9960ca35648925d9f7","integrity":"sha256-7/8lFT4PlPKvNTsC4jnFHaZeOhJQNpqZYMo1ZIkl2fc="},"flags/4x3/ad-af21bc50f12e6076f79dbddb6049ea32bf747e4a9dbf628781eaf29e81c6232c.svg":{"logical_path":"flags/4x3/ad.svg","mtime":"2020-04-06T16:47:40+02:00","size":33473,"digest":"af21bc50f12e6076f79dbddb6049ea32bf747e4a9dbf628781eaf29e81c6232c","integrity":"sha256-ryG8UPEuYHb3nb3bYEnqMr90fkqdv2KHgerynoHGIyw="},"flags/1x1/ad-5f301eee62631c50459507a29617ac02cc8106359da22b9705d3b73e50dcb839.svg":{"logical_path":"flags/1x1/ad.svg","mtime":"2020-04-06T16:47:40+02:00","size":32253,"digest":"5f301eee62631c50459507a29617ac02cc8106359da22b9705d3b73e50dcb839","integrity":"sha256-XzAe7mJjHFBFlQeilhesAsyBBjWdoiuXBdO3PlDcuDk="},"flags/4x3/ae-660f600189f77fbacd2099f5b898864e08a67d0cfe3905c390dcf6b86489dbe4.svg":{"logical_path":"flags/4x3/ae.svg","mtime":"2020-04-06T16:47:40+02:00","size":254,"digest":"660f600189f77fbacd2099f5b898864e08a67d0cfe3905c390dcf6b86489dbe4","integrity":"sha256-Zg9gAYn3f7rNIJn1uJiGTgimfQz+OQXDkNz2uGSJ2+Q="},"flags/1x1/ae-09943e355944d6870f74093d858503de204f02ca78f70122a5a7d74897134b6d.svg":{"logical_path":"flags/1x1/ae.svg","mtime":"2020-04-06T16:47:40+02:00","size":262,"digest":"09943e355944d6870f74093d858503de204f02ca78f70122a5a7d74897134b6d","integrity":"sha256-CZQ+NVlE1ocPdAk9hYUD3iBPAsp49wEipafXSJcTS20="},"flags/4x3/af-c7bfd83db1aefc08972a093aca88285194feb05ab87fb5ede44acb107a2f84e0.svg":{"logical_path":"flags/4x3/af.svg","mtime":"2020-04-06T16:47:40+02:00","size":21066,"digest":"c7bfd83db1aefc08972a093aca88285194feb05ab87fb5ede44acb107a2f84e0","integrity":"sha256-x7/YPbGu/AiXKgk6yogoUZT+sFq4f7Xt5ErLEHovhOA="},"flags/1x1/af-f0fe67d6b190381b4b7a039173c8d74a2dc8f7773ca6ac79de25b0b14c8b80f0.svg":{"logical_path":"flags/1x1/af.svg","mtime":"2020-04-06T16:47:40+02:00","size":20928,"digest":"f0fe67d6b190381b4b7a039173c8d74a2dc8f7773ca6ac79de25b0b14c8b80f0","integrity":"sha256-8P5n1rGQOBtLegORc8jXSi3I93c8pqx53iWwsUyLgPA="},"flags/4x3/ag-a986cf9b57900ccf9ac75cf39b5f519385e80dc6319fbf584c33e08e5b913d50.svg":{"logical_path":"flags/4x3/ag.svg","mtime":"2020-04-06T16:47:40+02:00","size":749,"digest":"a986cf9b57900ccf9ac75cf39b5f519385e80dc6319fbf584c33e08e5b913d50","integrity":"sha256-qYbPm1eQDM+ax1zzm19Rk4XoDcYxn79YTDPgjluRPVA="},"flags/1x1/ag-b0ee8dc5572db906f3765696c41fbaef3df72651fe0eaa306acfaa310ab80d06.svg":{"logical_path":"flags/1x1/ag.svg","mtime":"2020-04-06T16:47:40+02:00","size":761,"digest":"b0ee8dc5572db906f3765696c41fbaef3df72651fe0eaa306acfaa310ab80d06","integrity":"sha256-sO6NxVctuQbzdlaWxB+67z33JlH+Dqowas+qMQq4DQY="},"flags/4x3/ai-efd0c274edd8ce7fc9b665c783f1fc297218b699965677ea0762fe46c0cceff6.svg":{"logical_path":"flags/4x3/ai.svg","mtime":"2020-04-06T16:47:40+02:00","size":48259,"digest":"efd0c274edd8ce7fc9b665c783f1fc297218b699965677ea0762fe46c0cceff6","integrity":"sha256-79DCdO3Yzn/JtmXHg/H8KXIYtpmWVnfqB2L+RsDM7/Y="},"flags/1x1/ai-b6ba8568e879a3c78e19c6aa712b47617c9ec91ab03de656f43a41bbbc1cf02f.svg":{"logical_path":"flags/1x1/ai.svg","mtime":"2020-04-06T16:47:40+02:00","size":48199,"digest":"b6ba8568e879a3c78e19c6aa712b47617c9ec91ab03de656f43a41bbbc1cf02f","integrity":"sha256-trqFaOh5o8eOGcaqcStHYXyeyRqwPeZW9DpBu7wc8C8="},"flags/4x3/al-87476e4c4b339983bcda71637a718eed1670bed1e39d7419db41b8f9db3a9485.svg":{"logical_path":"flags/4x3/al.svg","mtime":"2020-04-06T16:47:40+02:00","size":3206,"digest":"87476e4c4b339983bcda71637a718eed1670bed1e39d7419db41b8f9db3a9485","integrity":"sha256-h0duTEszmYO82nFjenGO7RZwvtHjnXQZ20G4+ds6lIU="},"flags/1x1/al-b8c66c9d8f77fe6292e524164c8072fdaf2728daae036fe52cf541dc8dcea217.svg":{"logical_path":"flags/1x1/al.svg","mtime":"2020-04-06T16:47:40+02:00","size":3205,"digest":"b8c66c9d8f77fe6292e524164c8072fdaf2728daae036fe52cf541dc8dcea217","integrity":"sha256-uMZsnY93/mKS5SQWTIBy/a8nKNquA2/lLPVB3I3Oohc="},"flags/4x3/am-8244966df26ff96a23e4d1ec5411c7f8fdd2b935c48189dfb2e258bda95e986e.svg":{"logical_path":"flags/4x3/am.svg","mtime":"2020-04-06T16:47:40+02:00","size":223,"digest":"8244966df26ff96a23e4d1ec5411c7f8fdd2b935c48189dfb2e258bda95e986e","integrity":"sha256-gkSWbfJv+Woj5NHsVBHH+P3SuTXEgYnfsuJYvalemG4="},"flags/1x1/am-48d3c9b60f3f9f482d83cd54459703e760b1a9524a290a491290588eb656387b.svg":{"logical_path":"flags/1x1/am.svg","mtime":"2020-04-06T16:47:40+02:00","size":231,"digest":"48d3c9b60f3f9f482d83cd54459703e760b1a9524a290a491290588eb656387b","integrity":"sha256-SNPJtg8/n0gtg81URZcD52CxqVJKKQpJEpBYjrZWOHs="},"flags/4x3/ao-7ac46e1cd0c7d36c3229911376e38f7a9f578f627bd889f23ab5d5c9597cbc36.svg":{"logical_path":"flags/4x3/ao.svg","mtime":"2020-04-06T16:47:40+02:00","size":1588,"digest":"7ac46e1cd0c7d36c3229911376e38f7a9f578f627bd889f23ab5d5c9597cbc36","integrity":"sha256-esRuHNDH02wyKZETduOPep9Xj2J72InyOrXVyVl8vDY="},"flags/1x1/ao-b4bdbc4113ca80e45c6f96cf620a4638a4fea2dbd143780cc086531bb968ee63.svg":{"logical_path":"flags/1x1/ao.svg","mtime":"2020-04-06T16:47:40+02:00","size":1588,"digest":"b4bdbc4113ca80e45c6f96cf620a4638a4fea2dbd143780cc086531bb968ee63","integrity":"sha256-tL28QRPKgORcb5bPYgpGOKT+otvRQ3gMwIZTG7lo7mM="},"flags/4x3/aq-62ee1988140dee84b7c8dd5ffa27db67b3242505b9ac16a91981cd05599c49b4.svg":{"logical_path":"flags/4x3/aq.svg","mtime":"2020-04-06T16:47:40+02:00","size":6143,"digest":"62ee1988140dee84b7c8dd5ffa27db67b3242505b9ac16a91981cd05599c49b4","integrity":"sha256-Yu4ZiBQN7oS3yN1f+ifbZ7MkJQW5rBapGYHNBVmcSbQ="},"flags/1x1/aq-2fd9279bb4fe7bd6cb53aeab191764e3602ca9e5324e306dd178e9b229ab6d93.svg":{"logical_path":"flags/1x1/aq.svg","mtime":"2020-04-06T16:47:40+02:00","size":5958,"digest":"2fd9279bb4fe7bd6cb53aeab191764e3602ca9e5324e306dd178e9b229ab6d93","integrity":"sha256-L9knm7T+e9bLU66rGRdk42AsqeUyTjBt0XjpsimrbZM="},"flags/4x3/ar-036d9c340499588b37c3ff853da7ea105eb35fae876d7cfe034ebe3cc3764cd8.svg":{"logical_path":"flags/4x3/ar.svg","mtime":"2020-04-06T16:47:40+02:00","size":3402,"digest":"036d9c340499588b37c3ff853da7ea105eb35fae876d7cfe034ebe3cc3764cd8","integrity":"sha256-A22cNASZWIs3w/+FPafqEF6zX66HbXz+A06+PMN2TNg="},"flags/1x1/ar-3c7a866d916efd9ab117bebd9651daceee196ee95e420f6fd6be8c8839c067d4.svg":{"logical_path":"flags/1x1/ar.svg","mtime":"2020-04-06T16:47:40+02:00","size":3473,"digest":"3c7a866d916efd9ab117bebd9651daceee196ee95e420f6fd6be8c8839c067d4","integrity":"sha256-PHqGbZFu/ZqxF769llHazu4ZbuleQg9v1r6MiDnAZ9Q="},"flags/4x3/as-3193ab22284dbfe3b88049d07de78b43be8bd841ff00e71e84e3c957cbdaee6a.svg":{"logical_path":"flags/4x3/as.svg","mtime":"2020-04-06T16:47:40+02:00","size":8068,"digest":"3193ab22284dbfe3b88049d07de78b43be8bd841ff00e71e84e3c957cbdaee6a","integrity":"sha256-MZOrIihNv+O4gEnQfeeLQ76L2EH/AOcehOPJV8va7mo="},"flags/1x1/as-e8ce581d75d4d6262dcd1abdd577273cbb06d2b15e13df17427c8881775d5c81.svg":{"logical_path":"flags/1x1/as.svg","mtime":"2020-04-06T16:47:40+02:00","size":7828,"digest":"e8ce581d75d4d6262dcd1abdd577273cbb06d2b15e13df17427c8881775d5c81","integrity":"sha256-6M5YHXXU1iYtzRq91XcnPLsG0rFeE98XQnyIgXddXIE="},"flags/4x3/at-1e513e59cf959d38287ad72edc6f07cda754b7621efb04ed74c333df73ff4176.svg":{"logical_path":"flags/4x3/at.svg","mtime":"2020-04-06T16:47:40+02:00","size":240,"digest":"1e513e59cf959d38287ad72edc6f07cda754b7621efb04ed74c333df73ff4176","integrity":"sha256-HlE+Wc+VnTgoetcu3G8HzadUt2Ie+wTtdMMz33P/QXY="},"flags/1x1/at-73ae6b3c0378e6855da2f6f164668218485117334175d68e44f88a3846a1e179.svg":{"logical_path":"flags/1x1/at.svg","mtime":"2020-04-06T16:47:40+02:00","size":242,"digest":"73ae6b3c0378e6855da2f6f164668218485117334175d68e44f88a3846a1e179","integrity":"sha256-c65rPAN45oVdovbxZGaCGEhRFzNBddaORPiKOEah4Xk="},"flags/4x3/au-213bcc5e8c0c7defccd96f191f39e53f873da8129e55d230faafdd683d4168f9.svg":{"logical_path":"flags/4x3/au.svg","mtime":"2020-04-06T16:47:40+02:00","size":1546,"digest":"213bcc5e8c0c7defccd96f191f39e53f873da8129e55d230faafdd683d4168f9","integrity":"sha256-ITvMXowMfe/M2W8ZHznlP4c9qBKeVdIw+q/daD1BaPk="},"flags/1x1/au-dfc984d3a89cfdcaf4417482af869ee04c6d0399aa2905c7d3b5d09d5af4aa5a.svg":{"logical_path":"flags/1x1/au.svg","mtime":"2020-04-06T16:47:40+02:00","size":1483,"digest":"dfc984d3a89cfdcaf4417482af869ee04c6d0399aa2905c7d3b5d09d5af4aa5a","integrity":"sha256-38mE06ic/cr0QXSCr4ae4ExtA5mqKQXH07XQnVr0qlo="},"flags/4x3/aw-424db29f64f3c72757bc5542144a2347d30102d17aeb30ae977559fd68e6f637.svg":{"logical_path":"flags/4x3/aw.svg","mtime":"2020-04-06T16:47:40+02:00","size":9951,"digest":"424db29f64f3c72757bc5542144a2347d30102d17aeb30ae977559fd68e6f637","integrity":"sha256-Qk2yn2TzxydXvFVCFEojR9MBAtF66zCul3VZ/Wjm9jc="},"flags/1x1/aw-b5162dba277197f89aa8ea36a1b50ec057d38b2e8d7229eadbe55fcc7fae20ac.svg":{"logical_path":"flags/1x1/aw.svg","mtime":"2020-04-06T16:47:40+02:00","size":12084,"digest":"b5162dba277197f89aa8ea36a1b50ec057d38b2e8d7229eadbe55fcc7fae20ac","integrity":"sha256-tRYtuidxl/iaqOo2obUOwFfTiy6Ncinq2+VfzH+uIKw="},"flags/4x3/ax-e0b7f6dd55f2611d2a69e9f111dc39c5342069c32855f72933ff53e6f7488811.svg":{"logical_path":"flags/4x3/ax.svg","mtime":"2020-04-06T16:47:40+02:00","size":559,"digest":"e0b7f6dd55f2611d2a69e9f111dc39c5342069c32855f72933ff53e6f7488811","integrity":"sha256-4Lf23VXyYR0qaenxEdw5xTQgacMoVfcpM/9T5vdIiBE="},"flags/1x1/ax-952771b31fc59cffe5c33677e6d701bcb782262e86a01e7a591eab5a11e47eb3.svg":{"logical_path":"flags/1x1/ax.svg","mtime":"2020-04-06T16:47:40+02:00","size":541,"digest":"952771b31fc59cffe5c33677e6d701bcb782262e86a01e7a591eab5a11e47eb3","integrity":"sha256-lSdxsx/FnP/lwzZ35tcBvLeCJi6GoB56WR6rWhHkfrM="},"flags/4x3/az-3a16ff227d8a0295cf07c9f3fcab7e4004f0c4b6f18c5858dc1633cf6b16fe78.svg":{"logical_path":"flags/4x3/az.svg","mtime":"2020-04-06T16:47:40+02:00","size":512,"digest":"3a16ff227d8a0295cf07c9f3fcab7e4004f0c4b6f18c5858dc1633cf6b16fe78","integrity":"sha256-Ohb/In2KApXPB8nz/Kt+QATwxLbxjFhY3BYzz2sW/ng="},"flags/1x1/az-ce76ab744019e9980d0b9dda74b664e933461cf96eeb305a858a39b9a38b9b17.svg":{"logical_path":"flags/1x1/az.svg","mtime":"2020-04-06T16:47:40+02:00","size":498,"digest":"ce76ab744019e9980d0b9dda74b664e933461cf96eeb305a858a39b9a38b9b17","integrity":"sha256-znardEAZ6ZgNC53adLZk6TNGHPlu6zBahYo5uaOLmxc="},"flags/4x3/ba-0145a56b0f2d7e25856b2c62fcef5a8e2d62257ec67c0806fa0e92933082503e.svg":{"logical_path":"flags/4x3/ba.svg","mtime":"2020-04-06T16:47:40+02:00","size":1310,"digest":"0145a56b0f2d7e25856b2c62fcef5a8e2d62257ec67c0806fa0e92933082503e","integrity":"sha256-AUWlaw8tfiWFayxi/O9aji1iJX7GfAgG+g6SkzCCUD4="},"flags/1x1/ba-b4466a08b71725f8b5057ef0946b19d77a4d23eed0b81fd1abe4380dd6dde3c1.svg":{"logical_path":"flags/1x1/ba.svg","mtime":"2020-04-06T16:47:40+02:00","size":1242,"digest":"b4466a08b71725f8b5057ef0946b19d77a4d23eed0b81fd1abe4380dd6dde3c1","integrity":"sha256-tEZqCLcXJfi1BX7wlGsZ13pNI+7QuB/Rq+Q4Ddbd48E="},"flags/4x3/bb-667b79ca265802e179cfdc8ab06295e9e23301659f610ea11005b7415ae98673.svg":{"logical_path":"flags/4x3/bb.svg","mtime":"2020-04-06T16:47:40+02:00","size":609,"digest":"667b79ca265802e179cfdc8ab06295e9e23301659f610ea11005b7415ae98673","integrity":"sha256-Znt5yiZYAuF5z9yKsGKV6eIzAWWfYQ6hEAW3QVrphnM="},"flags/1x1/bb-2ce0c4f55ba85069897fa15337b07e10470c9846698257bea85971d4307b417c.svg":{"logical_path":"flags/1x1/bb.svg","mtime":"2020-04-06T16:47:40+02:00","size":609,"digest":"2ce0c4f55ba85069897fa15337b07e10470c9846698257bea85971d4307b417c","integrity":"sha256-LODE9VuoUGmJf6FTN7B+EEcMmEZpgle+qFlx1DB7QXw="},"flags/4x3/bd-d5ee762ba69448db5fadd6a18f5213ca922c0f04fe7d47bca6983afbb301fe2e.svg":{"logical_path":"flags/4x3/bd.svg","mtime":"2020-04-06T16:47:40+02:00","size":190,"digest":"d5ee762ba69448db5fadd6a18f5213ca922c0f04fe7d47bca6983afbb301fe2e","integrity":"sha256-1e52K6aUSNtfrdahj1ITypIsDwT+fUe8ppg6+7MB/i4="},"flags/1x1/bd-749b63aa937201843f63cedfd7d0db3019ddf95b931b4be80693716fd2b84cce.svg":{"logical_path":"flags/1x1/bd.svg","mtime":"2020-04-06T16:47:40+02:00","size":192,"digest":"749b63aa937201843f63cedfd7d0db3019ddf95b931b4be80693716fd2b84cce","integrity":"sha256-dJtjqpNyAYQ/Y87f19DbMBnd+VuTG0voBpNxb9K4TM4="},"flags/4x3/be-b3df2b94815bb9f38846ee9bf98e13f70cee99f9b08d80b95f96117255bb14ae.svg":{"logical_path":"flags/4x3/be.svg","mtime":"2020-04-06T16:47:40+02:00","size":290,"digest":"b3df2b94815bb9f38846ee9bf98e13f70cee99f9b08d80b95f96117255bb14ae","integrity":"sha256-s98rlIFbufOIRu6b+Y4T9wzumfmwjYC5X5YRclW7FK4="},"flags/1x1/be-b998bdfa696aaa291b5c97eb783c3b525082462dc1fa69d32ded3a3df758eacc.svg":{"logical_path":"flags/1x1/be.svg","mtime":"2020-04-06T16:47:40+02:00","size":290,"digest":"b998bdfa696aaa291b5c97eb783c3b525082462dc1fa69d32ded3a3df758eacc","integrity":"sha256-uZi9+mlqqikbXJfreDw7UlCCRi3B+mnTLe06PfdY6sw="},"flags/4x3/bf-bb500b0772dba72a64a3cede92898c2803bb9fbd72743826590cce2a8f4dd066.svg":{"logical_path":"flags/4x3/bf.svg","mtime":"2020-04-06T16:47:40+02:00","size":357,"digest":"bb500b0772dba72a64a3cede92898c2803bb9fbd72743826590cce2a8f4dd066","integrity":"sha256-u1ALB3Lbpypko87ekomMKAO7n71ydDgmWQzOKo9N0GY="},"flags/1x1/bf-8f795ecc74ce0431b735094709b535fe2f6ffc49efc32976106ba332741c2244.svg":{"logical_path":"flags/1x1/bf.svg","mtime":"2020-04-06T16:47:40+02:00","size":383,"digest":"8f795ecc74ce0431b735094709b535fe2f6ffc49efc32976106ba332741c2244","integrity":"sha256-j3lezHTOBDG3NQlHCbU1/i9v/Envwyl2EGujMnQcIkQ="},"flags/4x3/bg-c67e049a9f003f098e554808e74e3359970e4df9adcfb69b33dcb7bfd5b7a8c5.svg":{"logical_path":"flags/4x3/bg.svg","mtime":"2020-04-06T16:47:40+02:00","size":286,"digest":"c67e049a9f003f098e554808e74e3359970e4df9adcfb69b33dcb7bfd5b7a8c5","integrity":"sha256-xn4Emp8APwmOVUgI504zWZcOTfmtz7abM9y3v9W3qMU="},"flags/1x1/bg-9ddbc7b674ff21cbf2c0d82ae5e701f89902c4ce8841585e25d8e5ce36902205.svg":{"logical_path":"flags/1x1/bg.svg","mtime":"2020-04-06T16:47:40+02:00","size":294,"digest":"9ddbc7b674ff21cbf2c0d82ae5e701f89902c4ce8841585e25d8e5ce36902205","integrity":"sha256-ndvHtnT/IcvywNgq5ecB+JkCxM6IQVheJdjlzjaQIgU="},"flags/4x3/bh-b89b1dd1f40b59b119a3788653182317859e93b7e506ba08516de97b8590803e.svg":{"logical_path":"flags/4x3/bh.svg","mtime":"2020-04-06T16:47:40+02:00","size":517,"digest":"b89b1dd1f40b59b119a3788653182317859e93b7e506ba08516de97b8590803e","integrity":"sha256-uJsd0fQLWbEZo3iGUxgjF4Wek7flBroIUW3pe4WQgD4="},"flags/1x1/bh-9a6f53af3af276804af165a6df525364ab0775485e209f3f84a351a9c8537df8.svg":{"logical_path":"flags/1x1/bh.svg","mtime":"2020-04-06T16:47:40+02:00","size":538,"digest":"9a6f53af3af276804af165a6df525364ab0775485e209f3f84a351a9c8537df8","integrity":"sha256-mm9TrzrydoBK8WWm31JTZKsHdUheIJ8/hKNRqchTffg="},"flags/4x3/bi-d9cc0b58ddd6c7a1147999f96ff25d4fd80e00a71636f2e0dba952f0c5771532.svg":{"logical_path":"flags/4x3/bi.svg","mtime":"2020-04-06T16:47:40+02:00","size":1074,"digest":"d9cc0b58ddd6c7a1147999f96ff25d4fd80e00a71636f2e0dba952f0c5771532","integrity":"sha256-2cwLWN3Wx6EUeZn5b/JdT9gOAKcWNvLg26lS8MV3FTI="},"flags/1x1/bi-78476c6682fd0fdc9d621974a6e8daab640383db2f95603a9acdbfbc1d8ebfc3.svg":{"logical_path":"flags/1x1/bi.svg","mtime":"2020-04-06T16:47:40+02:00","size":1042,"digest":"78476c6682fd0fdc9d621974a6e8daab640383db2f95603a9acdbfbc1d8ebfc3","integrity":"sha256-eEdsZoL9D9ydYhl0pujaq2QDg9svlWA6ms2/vB2Ov8M="},"flags/4x3/bj-9085e2dc8e991e0dc1e0192979ca19db8dd9e22cd8ec7228f6289e2b8231a9c2.svg":{"logical_path":"flags/4x3/bj.svg","mtime":"2020-04-06T16:47:40+02:00","size":502,"digest":"9085e2dc8e991e0dc1e0192979ca19db8dd9e22cd8ec7228f6289e2b8231a9c2","integrity":"sha256-kIXi3I6ZHg3B4BkpecoZ243Z4izY7HIo9iieK4IxqcI="},"flags/1x1/bj-126f6103d81a930d8d8e185e1064c6502e99d1709e622e371b551f6b0f460ccb.svg":{"logical_path":"flags/1x1/bj.svg","mtime":"2020-04-06T16:47:40+02:00","size":499,"digest":"126f6103d81a930d8d8e185e1064c6502e99d1709e622e371b551f6b0f460ccb","integrity":"sha256-Em9hA9gakw2NjhheEGTGUC6Z0XCeYi43G1Ufaw9GDMs="},"flags/4x3/bl-1c0fc0dc03abc76091b6e9b874ab94975b4fb6898ff39dd8fc4705f81b1c94f2.svg":{"logical_path":"flags/4x3/bl.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"1c0fc0dc03abc76091b6e9b874ab94975b4fb6898ff39dd8fc4705f81b1c94f2","integrity":"sha256-HA/A3AOrx2CRtum4dKuUl1tPtomP853Y/EcF+BsclPI="},"flags/1x1/bl-b41eb06ebe9a9ad8176b247be6884b2d2562261aac85b148bb4fc953477701b3.svg":{"logical_path":"flags/1x1/bl.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"b41eb06ebe9a9ad8176b247be6884b2d2562261aac85b148bb4fc953477701b3","integrity":"sha256-tB6wbr6amtgXayR75ohLLSViJhqshbFIu0/JU0d3AbM="},"flags/4x3/bm-13cb511dd4f639bcb07b08499c6a596ef4a300745a740f5158e70bef9823913a.svg":{"logical_path":"flags/4x3/bm.svg","mtime":"2020-04-06T16:47:40+02:00","size":22569,"digest":"13cb511dd4f639bcb07b08499c6a596ef4a300745a740f5158e70bef9823913a","integrity":"sha256-E8tRHdT2ObywewhJnGpZbvSjAHRadA9RWOcL75gjkTo="},"flags/1x1/bm-1af07e53e38af85994614d0e3a1edfae8f5c74091a82c63a051ac1ae889e5125.svg":{"logical_path":"flags/1x1/bm.svg","mtime":"2020-04-06T16:47:40+02:00","size":22270,"digest":"1af07e53e38af85994614d0e3a1edfae8f5c74091a82c63a051ac1ae889e5125","integrity":"sha256-GvB+U+OK+FmUYU0OOh7fro9cdAkagsY6BRrBroieUSU="},"flags/4x3/bn-7c5eafd90f22b14301a5784167e70326557e8732de95e702d9780afb9ba351f6.svg":{"logical_path":"flags/4x3/bn.svg","mtime":"2020-04-06T16:47:40+02:00","size":14213,"digest":"7c5eafd90f22b14301a5784167e70326557e8732de95e702d9780afb9ba351f6","integrity":"sha256-fF6v2Q8isUMBpXhBZ+cDJlV+hzLelecC2XgK+5ujUfY="},"flags/1x1/bn-58930c2508f1ade40240bc93e4fad7de229e1f7b6ca3e5f8bdb97fecda54f24e.svg":{"logical_path":"flags/1x1/bn.svg","mtime":"2020-04-06T16:47:40+02:00","size":14359,"digest":"58930c2508f1ade40240bc93e4fad7de229e1f7b6ca3e5f8bdb97fecda54f24e","integrity":"sha256-WJMMJQjxreQCQLyT5PrX3iKeH3tso+X4vbl/7NpU8k4="},"flags/4x3/bo-4ab35795d73ec5cc7ce784bedbd1c72c7ab5402f3665998d998c1b6e244bf4bc.svg":{"logical_path":"flags/4x3/bo.svg","mtime":"2020-04-06T16:47:40+02:00","size":117062,"digest":"4ab35795d73ec5cc7ce784bedbd1c72c7ab5402f3665998d998c1b6e244bf4bc","integrity":"sha256-SrNXldc+xcx854S+29HHLHq1QC82ZZmNmYwbbiRL9Lw="},"flags/1x1/bo-2a091af9404186fae5b2a5044b061ace8ffa53a874187caf007842ca70bb4294.svg":{"logical_path":"flags/1x1/bo.svg","mtime":"2020-04-06T16:47:40+02:00","size":118659,"digest":"2a091af9404186fae5b2a5044b061ace8ffa53a874187caf007842ca70bb4294","integrity":"sha256-Kgka+UBBhvrlsqUESwYazo/6U6h0GHyvAHhCynC7QpQ="},"flags/4x3/bq-4f69e04ac3651b9112d1411a085bd6d632544c593fad9d20c27616d809746f07.svg":{"logical_path":"flags/4x3/bq.svg","mtime":"2020-04-06T16:47:40+02:00","size":224,"digest":"4f69e04ac3651b9112d1411a085bd6d632544c593fad9d20c27616d809746f07","integrity":"sha256-T2ngSsNlG5ES0UEaCFvW1jJUTFk/rZ0gwnYW2Al0bwc="},"flags/1x1/bq-21e4c616d5cd5c0486640b66400d9c8559cab08650e7601e291c4f5b1643a6ab.svg":{"logical_path":"flags/1x1/bq.svg","mtime":"2020-04-06T16:47:40+02:00","size":228,"digest":"21e4c616d5cd5c0486640b66400d9c8559cab08650e7601e291c4f5b1643a6ab","integrity":"sha256-IeTGFtXNXASGZAtmQA2chVnKsIZQ52AeKRxPWxZDpqs="},"flags/4x3/br-5626545274de6de8e4e2c0f800b7b664bc3521f0ee9bc98547f3cbec3effe2d8.svg":{"logical_path":"flags/4x3/br.svg","mtime":"2020-04-06T16:47:40+02:00","size":8097,"digest":"5626545274de6de8e4e2c0f800b7b664bc3521f0ee9bc98547f3cbec3effe2d8","integrity":"sha256-ViZUUnTebejk4sD4ALe2ZLw1IfDum8mFR/PL7D7/4tg="},"flags/1x1/br-38e5114c9912eb4f5f1944b4e43eeb96791ef552d855a2f16e177ce7ce145d5e.svg":{"logical_path":"flags/1x1/br.svg","mtime":"2020-04-06T16:47:40+02:00","size":7686,"digest":"38e5114c9912eb4f5f1944b4e43eeb96791ef552d855a2f16e177ce7ce145d5e","integrity":"sha256-OOURTJkS609fGUS05D7rlnke9VLYVaLxbhd8584UXV4="},"flags/4x3/bs-d45540c1f333ad6b70ae998b317d6c545b2f608b896dc384da069459dd6f0838.svg":{"logical_path":"flags/4x3/bs.svg","mtime":"2020-04-06T16:47:40+02:00","size":552,"digest":"d45540c1f333ad6b70ae998b317d6c545b2f608b896dc384da069459dd6f0838","integrity":"sha256-1FVAwfMzrWtwrpmLMX1sVFsvYIuJbcOE2gaUWd1vCDg="},"flags/1x1/bs-f10d64856c57efee0f27b3e7960de782f38e026aa55402e801f10bd5ab505dcf.svg":{"logical_path":"flags/1x1/bs.svg","mtime":"2020-04-06T16:47:40+02:00","size":568,"digest":"f10d64856c57efee0f27b3e7960de782f38e026aa55402e801f10bd5ab505dcf","integrity":"sha256-8Q1khWxX7+4PJ7Pnlg3ngvOOAmqlVALoAfEL1atQXc8="},"flags/4x3/bt-6f109e6e0465742b9a132f29d356bab77e47f8429263056d4dd77f1f6cdae063.svg":{"logical_path":"flags/4x3/bt.svg","mtime":"2020-04-06T16:47:40+02:00","size":25227,"digest":"6f109e6e0465742b9a132f29d356bab77e47f8429263056d4dd77f1f6cdae063","integrity":"sha256-bxCebgRldCuaEy8p01a6t35H+EKSYwVtTdd/H2za4GM="},"flags/1x1/bt-569e13412ede4f000d327ac29c21c49b051d6043719fdad19eabec3a04d44f36.svg":{"logical_path":"flags/1x1/bt.svg","mtime":"2020-04-06T16:47:40+02:00","size":25045,"digest":"569e13412ede4f000d327ac29c21c49b051d6043719fdad19eabec3a04d44f36","integrity":"sha256-Vp4TQS7eTwANMnrCnCHEmwUdYENxn9rRnqvsOgTUTzY="},"flags/4x3/bv-f251755196f171e5d7ab2684a09ce6dfef2037cc273bb14460934e1a2c1c538e.svg":{"logical_path":"flags/4x3/bv.svg","mtime":"2020-04-06T16:47:40+02:00","size":585,"digest":"f251755196f171e5d7ab2684a09ce6dfef2037cc273bb14460934e1a2c1c538e","integrity":"sha256-8lF1UZbxceXXqyaEoJzm3+8gN8wnO7FEYJNOGiwcU44="},"flags/1x1/bv-6be2ac5c2b7b353de7dd361efd3a55c228ba00ca60ade0b664d177e3182bbe8f.svg":{"logical_path":"flags/1x1/bv.svg","mtime":"2020-04-06T16:47:40+02:00","size":582,"digest":"6be2ac5c2b7b353de7dd361efd3a55c228ba00ca60ade0b664d177e3182bbe8f","integrity":"sha256-a+KsXCt7NT3n3TYe/TpVwii6AMpgreC2ZNF34xgrvo8="},"flags/4x3/bw-115b2165fe0c1f881a45409a24bc3bcfd42de9a1cdad5686ed36b06c0d646262.svg":{"logical_path":"flags/4x3/bw.svg","mtime":"2020-04-06T16:47:40+02:00","size":252,"digest":"115b2165fe0c1f881a45409a24bc3bcfd42de9a1cdad5686ed36b06c0d646262","integrity":"sha256-EVshZf4MH4gaRUCaJLw7z9Qt6aHNrVaG7TawbA1kYmI="},"flags/1x1/bw-df92e4d60f9cd10c1607dd60b8b10d63b10c9dbe30e0a026ad04670dc06a0e86.svg":{"logical_path":"flags/1x1/bw.svg","mtime":"2020-04-06T16:47:40+02:00","size":254,"digest":"df92e4d60f9cd10c1607dd60b8b10d63b10c9dbe30e0a026ad04670dc06a0e86","integrity":"sha256-35Lk1g+c0QwWB91guLENY7EMnb4w4KAmrQRnDcBqDoY="},"flags/4x3/by-91b26dd7a972c1eba9a387e521bb4db94c891635bb0dd2b55238e4552ca39047.svg":{"logical_path":"flags/4x3/by.svg","mtime":"2020-04-06T16:47:40+02:00","size":5962,"digest":"91b26dd7a972c1eba9a387e521bb4db94c891635bb0dd2b55238e4552ca39047","integrity":"sha256-kbJt16lyweupo4flIbtNuUyJFjW7DdK1UjjkVSyjkEc="},"flags/1x1/by-b7ada8d1fb46487c83b827c16b69f51274e42c655fa537a7ffffa4b20468cafc.svg":{"logical_path":"flags/1x1/by.svg","mtime":"2020-04-06T16:47:40+02:00","size":6086,"digest":"b7ada8d1fb46487c83b827c16b69f51274e42c655fa537a7ffffa4b20468cafc","integrity":"sha256-t62o0ftGSHyDuCfBa2n1EnTkLGVfpTen//+ksgRoyvw="},"flags/4x3/bz-173ecf7b1acfb23e569b7f305630bfe1a39943ebf504ad66ac3f5d613e121c9a.svg":{"logical_path":"flags/4x3/bz.svg","mtime":"2020-04-06T16:47:40+02:00","size":46427,"digest":"173ecf7b1acfb23e569b7f305630bfe1a39943ebf504ad66ac3f5d613e121c9a","integrity":"sha256-Fz7PexrPsj5Wm38wVjC/4aOZQ+v1BK1mrD9dYT4SHJo="},"flags/1x1/bz-1d05349d5a497be367155310b692e7aec42e80797378d748178b70d379da1249.svg":{"logical_path":"flags/1x1/bz.svg","mtime":"2020-04-06T16:47:40+02:00","size":46678,"digest":"1d05349d5a497be367155310b692e7aec42e80797378d748178b70d379da1249","integrity":"sha256-HQU0nVpJe+NnFVMQtpLnrsQugHlzeNdIF4tw03naEkk="},"flags/4x3/ca-5bda905693ffed32df95f79a8eeac1fbf062630de05f48875e109c35681e2331.svg":{"logical_path":"flags/4x3/ca.svg","mtime":"2020-04-06T16:47:40+02:00","size":728,"digest":"5bda905693ffed32df95f79a8eeac1fbf062630de05f48875e109c35681e2331","integrity":"sha256-W9qQVpP/7TLflfeajurB+/BiYw3gX0iHXhCcNWgeIzE="},"flags/1x1/ca-85ee89fa698c2efcad4817723fac44311ca520da3be63f52a10e21c3f65e8fad.svg":{"logical_path":"flags/1x1/ca.svg","mtime":"2020-04-06T16:47:40+02:00","size":708,"digest":"85ee89fa698c2efcad4817723fac44311ca520da3be63f52a10e21c3f65e8fad","integrity":"sha256-he6J+mmMLvytSBdyP6xEMRylINo75j9SoQ4hw/Zej60="},"flags/4x3/cc-d49eb3730b2cbe3eaa7028d5bd5f425caafd83154cf47523c27279c10257d3f6.svg":{"logical_path":"flags/4x3/cc.svg","mtime":"2020-04-06T16:47:40+02:00","size":3123,"digest":"d49eb3730b2cbe3eaa7028d5bd5f425caafd83154cf47523c27279c10257d3f6","integrity":"sha256-1J6zcwssvj6qcCjVvV9CXKr9gxVM9HUjwnJ5wQJX0/Y="},"flags/1x1/cc-7c46b5f38449f3320ae45f9511a36e1b1c22894f84977c235208ebfb8dea9970.svg":{"logical_path":"flags/1x1/cc.svg","mtime":"2020-04-06T16:47:40+02:00","size":3083,"digest":"7c46b5f38449f3320ae45f9511a36e1b1c22894f84977c235208ebfb8dea9970","integrity":"sha256-fEa184RJ8zIK5F+VEaNuGxwiiU+El3wjUgjr+43qmXA="},"flags/4x3/cd-3e5799ffef91d8cb30dc6b847867e209e82cbffe277445202c5f291d36ef0248.svg":{"logical_path":"flags/4x3/cd.svg","mtime":"2020-04-06T16:47:40+02:00","size":349,"digest":"3e5799ffef91d8cb30dc6b847867e209e82cbffe277445202c5f291d36ef0248","integrity":"sha256-PleZ/++R2Msw3GuEeGfiCegsv/4ndEUgLF8pHTbvAkg="},"flags/1x1/cd-600e736963214a9f6701463345f91b569dab9e68f7668317df2f40def88e2d6e.svg":{"logical_path":"flags/1x1/cd.svg","mtime":"2020-04-06T16:47:40+02:00","size":507,"digest":"600e736963214a9f6701463345f91b569dab9e68f7668317df2f40def88e2d6e","integrity":"sha256-YA5zaWMhSp9nAUYzRfkbVp2rnmj3ZoMX3y9A3viOLW4="},"flags/4x3/cf-44e68fe825719854c92a8285944e619288d5f651fd17f874153081449c100d1f.svg":{"logical_path":"flags/4x3/cf.svg","mtime":"2020-04-06T16:47:40+02:00","size":691,"digest":"44e68fe825719854c92a8285944e619288d5f651fd17f874153081449c100d1f","integrity":"sha256-ROaP6CVxmFTJKoKFlE5hkojV9lH9F/h0FTCBRJwQDR8="},"flags/1x1/cf-b3a61e22f7d8bdc611d532720cf8ed292eab336063c5699036755dc160154175.svg":{"logical_path":"flags/1x1/cf.svg","mtime":"2020-04-06T16:47:40+02:00","size":632,"digest":"b3a61e22f7d8bdc611d532720cf8ed292eab336063c5699036755dc160154175","integrity":"sha256-s6YeIvfYvcYR1TJyDPjtKS6rM2BjxWmQNnVdwWAVQXU="},"flags/4x3/cg-7e4f9efc379203b9cc9677042de4c07bd411308c80074919035c08fe131dbca2.svg":{"logical_path":"flags/4x3/cg.svg","mtime":"2020-04-06T16:47:40+02:00","size":487,"digest":"7e4f9efc379203b9cc9677042de4c07bd411308c80074919035c08fe131dbca2","integrity":"sha256-fk+e/DeSA7nMlncELeTAe9QRMIyAB0kZA1wI/hMdvKI="},"flags/1x1/cg-20a742a21789fc04344e90463c05b35ee2fe86a624d3b6432b4edd6bd3fe651d.svg":{"logical_path":"flags/1x1/cg.svg","mtime":"2020-04-06T16:47:40+02:00","size":469,"digest":"20a742a21789fc04344e90463c05b35ee2fe86a624d3b6432b4edd6bd3fe651d","integrity":"sha256-IKdCoheJ/AQ0TpBGPAWzXuL+hqYk07ZDK07da9P+ZR0="},"flags/4x3/ch-4e94e5c3a524345e7c24f3807ab2ca812225ea6ccdb59ec67125b0ea3ed02cd5.svg":{"logical_path":"flags/4x3/ch.svg","mtime":"2020-04-06T16:47:40+02:00","size":297,"digest":"4e94e5c3a524345e7c24f3807ab2ca812225ea6ccdb59ec67125b0ea3ed02cd5","integrity":"sha256-TpTlw6UkNF58JPOAerLKgSIl6mzNtZ7GcSWw6j7QLNU="},"flags/1x1/ch-a0660f7371c42a1e8be299a9ff0d762ed12b578ea438df33890aae8eba431106.svg":{"logical_path":"flags/1x1/ch.svg","mtime":"2020-04-06T16:47:40+02:00","size":295,"digest":"a0660f7371c42a1e8be299a9ff0d762ed12b578ea438df33890aae8eba431106","integrity":"sha256-oGYPc3HEKh6L4pmp/w12LtErV46kON8ziQqujrpDEQY="},"flags/4x3/ci-d7fd4124cb8f4d9cc2d70bd2c87543fd279750bd7082d51e5916fea65847e992.svg":{"logical_path":"flags/4x3/ci.svg","mtime":"2020-04-06T16:47:40+02:00","size":280,"digest":"d7fd4124cb8f4d9cc2d70bd2c87543fd279750bd7082d51e5916fea65847e992","integrity":"sha256-1/1BJMuPTZzC1wvSyHVD/SeXUL1wgtUeWRb+plhH6ZI="},"flags/1x1/ci-ba7f763547ca1b9243fcf644d83f3100546f7fe557f22fb380b5fcddef7e02bc.svg":{"logical_path":"flags/1x1/ci.svg","mtime":"2020-04-06T16:47:40+02:00","size":283,"digest":"ba7f763547ca1b9243fcf644d83f3100546f7fe557f22fb380b5fcddef7e02bc","integrity":"sha256-un92NUfKG5JD/PZE2D8xAFRvf+VX8i+zgLX83e9+Arw="},"flags/4x3/ck-95e850b027e198e275840a2c96fde8be006f7c4b50d274c2da10dcfad50d3cf8.svg":{"logical_path":"flags/4x3/ck.svg","mtime":"2020-04-06T16:47:40+02:00","size":2097,"digest":"95e850b027e198e275840a2c96fde8be006f7c4b50d274c2da10dcfad50d3cf8","integrity":"sha256-lehQsCfhmOJ1hAoslv3ovgBvfEtQ0nTC2hDc+tUNPPg="},"flags/1x1/ck-a60ec48dfd291bcf6e032345fdcf72edc995efaeb749534a38d192d81891b754.svg":{"logical_path":"flags/1x1/ck.svg","mtime":"2020-04-06T16:47:40+02:00","size":2020,"digest":"a60ec48dfd291bcf6e032345fdcf72edc995efaeb749534a38d192d81891b754","integrity":"sha256-pg7Ejf0pG89uAyNF/c9y7cmV7663SVNKONGS2BiRt1Q="},"flags/4x3/cl-b0c3f433217a039247b2c7f3f8694d05237ba684726b604a33c102d10f279fde.svg":{"logical_path":"flags/4x3/cl.svg","mtime":"2020-04-06T16:47:40+02:00","size":563,"digest":"b0c3f433217a039247b2c7f3f8694d05237ba684726b604a33c102d10f279fde","integrity":"sha256-sMP0MyF6A5JHssfz+GlNBSN7poRya2BKM8EC0Q8nn94="},"flags/1x1/cl-250f409f558fe17f01f32614ebf6275c2fcce776ce50ec959642babbc67036e0.svg":{"logical_path":"flags/1x1/cl.svg","mtime":"2020-04-06T16:47:40+02:00","size":574,"digest":"250f409f558fe17f01f32614ebf6275c2fcce776ce50ec959642babbc67036e0","integrity":"sha256-JQ9An1WP4X8B8yYU6/YnXC/M53bOUOyVlkK6u8ZwNuA="},"flags/4x3/cm-1b2e52b5962f38e58da1973b23796ccefae0e82321856c61bda68bd3f277ea6f.svg":{"logical_path":"flags/4x3/cm.svg","mtime":"2020-04-06T16:47:40+02:00","size":824,"digest":"1b2e52b5962f38e58da1973b23796ccefae0e82321856c61bda68bd3f277ea6f","integrity":"sha256-Gy5StZYvOOWNoZc7I3lszvrg6CMhhWxhvaaL0/J36m8="},"flags/1x1/cm-809ea5ab516c4e59ee5f90c4b0515365c3d41d77544ff10abb1dea88c9f377e4.svg":{"logical_path":"flags/1x1/cm.svg","mtime":"2020-04-06T16:47:40+02:00","size":824,"digest":"809ea5ab516c4e59ee5f90c4b0515365c3d41d77544ff10abb1dea88c9f377e4","integrity":"sha256-gJ6lq1FsTlnuX5DEsFFTZcPUHXdUT/EKux3qiMnzd+Q="},"flags/4x3/cn-e80d714480a795617992d733d0678e5ad5025f8852b35d20a402a78fce4ccaf8.svg":{"logical_path":"flags/4x3/cn.svg","mtime":"2020-04-06T16:47:40+02:00","size":801,"digest":"e80d714480a795617992d733d0678e5ad5025f8852b35d20a402a78fce4ccaf8","integrity":"sha256-6A1xRICnlWF5ktcz0GeOWtUCX4hSs10gpAKnj85Myvg="},"flags/1x1/cn-ab9a2dc6b1aaeaa7017b96904b7a760517ac9e57ee589ee6dd1238c7754bd8f6.svg":{"logical_path":"flags/1x1/cn.svg","mtime":"2020-04-06T16:47:40+02:00","size":743,"digest":"ab9a2dc6b1aaeaa7017b96904b7a760517ac9e57ee589ee6dd1238c7754bd8f6","integrity":"sha256-q5otxrGq6qcBe5aQS3p2BResnlfuWJ7m3RI4x3VL2PY="},"flags/4x3/co-bc15eabb8dc37b36d7be228c68a2f7a62957a3ba9e4d8c35db50b919c9d150da.svg":{"logical_path":"flags/4x3/co.svg","mtime":"2020-04-06T16:47:40+02:00","size":289,"digest":"bc15eabb8dc37b36d7be228c68a2f7a62957a3ba9e4d8c35db50b919c9d150da","integrity":"sha256-vBXqu43DezbXviKMaKL3pilXo7qeTYw121C5GcnRUNo="},"flags/1x1/co-cb36ae4084e1e678bed8e0a64397e0109f9afc95c241a04c8e3da36a577cfaf2.svg":{"logical_path":"flags/1x1/co.svg","mtime":"2020-04-06T16:47:40+02:00","size":289,"digest":"cb36ae4084e1e678bed8e0a64397e0109f9afc95c241a04c8e3da36a577cfaf2","integrity":"sha256-yzauQITh5ni+2OCmQ5fgEJ+a/JXCQaBMjj2jald8+vI="},"flags/4x3/cr-12fe80c814de382b53955ab5223514278f7b4985f51c32fd1f60356280e1e5cd.svg":{"logical_path":"flags/4x3/cr.svg","mtime":"2020-04-06T16:47:40+02:00","size":293,"digest":"12fe80c814de382b53955ab5223514278f7b4985f51c32fd1f60356280e1e5cd","integrity":"sha256-Ev6AyBTeOCtTlVq1IjUUJ497SYX1HDL9H2A1YoDh5c0="},"flags/1x1/cr-c7830f0e5b8025c1f9205b2d89ce1b7ac81ec64f6a9e9093da9a2d9e05206b49.svg":{"logical_path":"flags/1x1/cr.svg","mtime":"2020-04-06T16:47:40+02:00","size":293,"digest":"c7830f0e5b8025c1f9205b2d89ce1b7ac81ec64f6a9e9093da9a2d9e05206b49","integrity":"sha256-x4MPDluAJcH5IFstic4besgexk9qnpCT2potngUga0k="},"flags/4x3/cu-0a09bdca54a5347ba1238476ea90ea7d7d99fec7163df43e762313ddbce9b145.svg":{"logical_path":"flags/4x3/cu.svg","mtime":"2020-04-06T16:47:40+02:00","size":622,"digest":"0a09bdca54a5347ba1238476ea90ea7d7d99fec7163df43e762313ddbce9b145","integrity":"sha256-Cgm9ylSlNHuhI4R26pDqfX2Z/scWPfQ+diMT3bzpsUU="},"flags/1x1/cu-f5f7e6c58d9ee8046fb142f0d35f23df7e49763b35305b7fcc719db23554b404.svg":{"logical_path":"flags/1x1/cu.svg","mtime":"2020-04-06T16:47:40+02:00","size":573,"digest":"f5f7e6c58d9ee8046fb142f0d35f23df7e49763b35305b7fcc719db23554b404","integrity":"sha256-9ffmxY2e6ARvsULw018j335Jdjs1MFt/zHGdsjVUtAQ="},"flags/4x3/cv-3ab6aaaf11d9a3a6f2fba17248ea85d36967163214e98b0bb30123d0b3def532.svg":{"logical_path":"flags/4x3/cv.svg","mtime":"2020-04-06T16:47:40+02:00","size":1415,"digest":"3ab6aaaf11d9a3a6f2fba17248ea85d36967163214e98b0bb30123d0b3def532","integrity":"sha256-OraqrxHZo6by+6FySOqF02lnFjIU6YsLswEj0LPe9TI="},"flags/1x1/cv-698aea344d6bb9f87de513ff525d16fdb2590ad1cd7b2d1200878c1e7cd2ce64.svg":{"logical_path":"flags/1x1/cv.svg","mtime":"2020-04-06T16:47:40+02:00","size":1357,"digest":"698aea344d6bb9f87de513ff525d16fdb2590ad1cd7b2d1200878c1e7cd2ce64","integrity":"sha256-aYrqNE1rufh95RP/Ul0W/bJZCtHNey0SAIeMHnzSzmQ="},"flags/4x3/cw-186b6d2347845c903689468db9a51cec41d7458461725fcdcecab27eebc3c376.svg":{"logical_path":"flags/4x3/cw.svg","mtime":"2020-04-06T16:47:40+02:00","size":681,"digest":"186b6d2347845c903689468db9a51cec41d7458461725fcdcecab27eebc3c376","integrity":"sha256-GGttI0eEXJA2iUaNuaUc7EHXRYRhcl/NzsqyfuvDw3Y="},"flags/1x1/cw-e1c281f45124597730be155051b4628bf25974ff4dac5f990262c5f074ab7484.svg":{"logical_path":"flags/1x1/cw.svg","mtime":"2020-04-06T16:47:40+02:00","size":682,"digest":"e1c281f45124597730be155051b4628bf25974ff4dac5f990262c5f074ab7484","integrity":"sha256-4cKB9FEkWXcwvhVQUbRii/JZdP9NrF+ZAmLF8HSrdIQ="},"flags/4x3/cx-aaf17168e49e9efc24b259929e40b7b135f78f4ee327577ab57e9a14fe8dfe9d.svg":{"logical_path":"flags/4x3/cx.svg","mtime":"2020-04-06T16:47:40+02:00","size":2455,"digest":"aaf17168e49e9efc24b259929e40b7b135f78f4ee327577ab57e9a14fe8dfe9d","integrity":"sha256-qvFxaOSenvwkslmSnkC3sTX3j07jJ1d6tX6aFP6N/p0="},"flags/1x1/cx-8af706f9e34d7867578f025a073e033c901b05012519a65bac5d319b961f1a99.svg":{"logical_path":"flags/1x1/cx.svg","mtime":"2020-04-06T16:47:40+02:00","size":2496,"digest":"8af706f9e34d7867578f025a073e033c901b05012519a65bac5d319b961f1a99","integrity":"sha256-ivcG+eNNeGdXjwJaBz4DPJAbBQElGaZbrF0xm5YfGpk="},"flags/4x3/cy-88d041c0eec06dab21e4d9c777ead616f2ab97eedef8b619f78f95dd51e74ab7.svg":{"logical_path":"flags/4x3/cy.svg","mtime":"2020-04-06T16:47:40+02:00","size":5866,"digest":"88d041c0eec06dab21e4d9c777ead616f2ab97eedef8b619f78f95dd51e74ab7","integrity":"sha256-iNBBwO7Abash5NnHd+rWFvKrl+7e+LYZ94+V3VHnSrc="},"flags/1x1/cy-0e1f361ed98ca9f027657583276d0f0e404fcedc95cb314fd5122793e4cec9ba.svg":{"logical_path":"flags/1x1/cy.svg","mtime":"2020-04-06T16:47:40+02:00","size":5955,"digest":"0e1f361ed98ca9f027657583276d0f0e404fcedc95cb314fd5122793e4cec9ba","integrity":"sha256-Dh82HtmMqfAnZXWDJ20PDkBPztyVyzFP1RInk+TOybo="},"flags/4x3/cz-a094f93ce465415ead374aa60fb7ea55921b956683f2809d6a08b1af81ffd609.svg":{"logical_path":"flags/4x3/cz.svg","mtime":"2020-04-06T16:47:40+02:00","size":484,"digest":"a094f93ce465415ead374aa60fb7ea55921b956683f2809d6a08b1af81ffd609","integrity":"sha256-oJT5PORlQV6tN0qmD7fqVZIblWaD8oCdagixr4H/1gk="},"flags/1x1/cz-fca144bdc4bc563cc612a0bc931738ab096a362323982a4ac1e2f74d66792c77.svg":{"logical_path":"flags/1x1/cz.svg","mtime":"2020-04-06T16:47:40+02:00","size":480,"digest":"fca144bdc4bc563cc612a0bc931738ab096a362323982a4ac1e2f74d66792c77","integrity":"sha256-/KFEvcS8VjzGEqC8kxc4qwlqNiMjmCpKweL3TWZ5LHc="},"flags/4x3/de-226631a8fa9deee07022680ce0461b7a09b416b616c56ebcaf21f50e2b34ea8f.svg":{"logical_path":"flags/4x3/de.svg","mtime":"2020-04-06T16:47:40+02:00","size":213,"digest":"226631a8fa9deee07022680ce0461b7a09b416b616c56ebcaf21f50e2b34ea8f","integrity":"sha256-ImYxqPqd7uBwImgM4EYbegm0FrYWxW68ryH1Dis06o8="},"flags/1x1/de-d7cc619b1c880981e17adba3bd44cb8addfff1d63e7cb2b4d59a88abe5ff31e0.svg":{"logical_path":"flags/1x1/de.svg","mtime":"2020-04-06T16:47:40+02:00","size":221,"digest":"d7cc619b1c880981e17adba3bd44cb8addfff1d63e7cb2b4d59a88abe5ff31e0","integrity":"sha256-18xhmxyICYHhetujvUTLit3/8dY+fLK01ZqIq+X/MeA="},"flags/4x3/dj-55b23581525743a29fb3602ae988dc91e8f6f5ea07d66337ea8051bf92e7c3ae.svg":{"logical_path":"flags/4x3/dj.svg","mtime":"2020-04-06T16:47:40+02:00","size":591,"digest":"55b23581525743a29fb3602ae988dc91e8f6f5ea07d66337ea8051bf92e7c3ae","integrity":"sha256-VbI1gVJXQ6Kfs2Aq6Yjckej29eoH1mM36oBRv5Lnw64="},"flags/1x1/dj-ffd9ebcba08793bb8ed7e508cd1187d9e867e43ca0c9c669c6eca2a7c0e61896.svg":{"logical_path":"flags/1x1/dj.svg","mtime":"2020-04-06T16:47:40+02:00","size":585,"digest":"ffd9ebcba08793bb8ed7e508cd1187d9e867e43ca0c9c669c6eca2a7c0e61896","integrity":"sha256-/9nry6CHk7uO1+UIzRGH2ehn5DygycZpxuyip8DmGJY="},"flags/4x3/dk-c29517b4eb6b056475330a26a3f929c0523ef80268a8457ca5d44a7def3cdf44.svg":{"logical_path":"flags/4x3/dk.svg","mtime":"2020-04-06T16:47:40+02:00","size":239,"digest":"c29517b4eb6b056475330a26a3f929c0523ef80268a8457ca5d44a7def3cdf44","integrity":"sha256-wpUXtOtrBWR1Mwomo/kpwFI++AJoqEV8pdRKfe8830Q="},"flags/1x1/dk-feeb27682ce93b2e5fe14a32a67aa7141f505725daf8b6018864b0bbec103469.svg":{"logical_path":"flags/1x1/dk.svg","mtime":"2020-04-06T16:47:40+02:00","size":235,"digest":"feeb27682ce93b2e5fe14a32a67aa7141f505725daf8b6018864b0bbec103469","integrity":"sha256-/usnaCzpOy5f4UoypnqnFB9QVyXa+LYBiGSwu+wQNGk="},"flags/4x3/dm-80221b928ecc38c82c3d290b36be1c6c9388a51e9533c31c197016b00e63b070.svg":{"logical_path":"flags/4x3/dm.svg","mtime":"2020-04-06T16:47:40+02:00","size":15975,"digest":"80221b928ecc38c82c3d290b36be1c6c9388a51e9533c31c197016b00e63b070","integrity":"sha256-gCIbko7MOMgsPSkLNr4cbJOIpR6VM8McGXAWsA5jsHA="},"flags/1x1/dm-e5d72576962d7a5ecd56631c5a2541c1359f15f086a3d384c563983c40fc2711.svg":{"logical_path":"flags/1x1/dm.svg","mtime":"2020-04-06T16:47:40+02:00","size":16457,"digest":"e5d72576962d7a5ecd56631c5a2541c1359f15f086a3d384c563983c40fc2711","integrity":"sha256-5dcldpYtel7NVmMcWiVBwTWfFfCGo9OExWOYPED8JxE="},"flags/4x3/do-d399ea939e23c000ce12ba4f7c4d4abccdd28f783248b819ebb20b90546f619f.svg":{"logical_path":"flags/4x3/do.svg","mtime":"2020-04-06T16:47:40+02:00","size":393849,"digest":"d399ea939e23c000ce12ba4f7c4d4abccdd28f783248b819ebb20b90546f619f","integrity":"sha256-05nqk54jwADOErpPfE1KvM3Sj3gySLgZ67ILkFRvYZ8="},"flags/1x1/do-2af33aacc98dde2ca5cc2f3499370e9715b5f76b5ca7446de00490083346754c.svg":{"logical_path":"flags/1x1/do.svg","mtime":"2020-04-06T16:47:40+02:00","size":391369,"digest":"2af33aacc98dde2ca5cc2f3499370e9715b5f76b5ca7446de00490083346754c","integrity":"sha256-KvM6rMmN3iylzC80mTcOlxW192tcp0Rt4ASQCDNGdUw="},"flags/4x3/dz-6a1e2abb0d8a33b0209a37123e44710b4b27b50723a5d2ab7fb8746c88447cf6.svg":{"logical_path":"flags/4x3/dz.svg","mtime":"2020-04-06T16:47:40+02:00","size":294,"digest":"6a1e2abb0d8a33b0209a37123e44710b4b27b50723a5d2ab7fb8746c88447cf6","integrity":"sha256-ah4quw2KM7AgmjcSPkRxC0sntQcjpdKrf7h0bIhEfPY="},"flags/1x1/dz-75568129d430536c4a994d05f114e0b1b91e10af7350d635f2da721f73d4871c.svg":{"logical_path":"flags/1x1/dz.svg","mtime":"2020-04-06T16:47:40+02:00","size":305,"digest":"75568129d430536c4a994d05f114e0b1b91e10af7350d635f2da721f73d4871c","integrity":"sha256-dVaBKdQwU2xKmU0F8RTgsbkeEK9zUNY18tpyH3PUhxw="},"flags/4x3/ec-63bf6e3ac63634199c0929715a715109f8ad229c526c08bfbe7f6a7a9f30fcde.svg":{"logical_path":"flags/4x3/ec.svg","mtime":"2020-04-06T16:47:40+02:00","size":29320,"digest":"63bf6e3ac63634199c0929715a715109f8ad229c526c08bfbe7f6a7a9f30fcde","integrity":"sha256-Y79uOsY2NBmcCSlxWnFRCfitIpxSbAi/vn9qep8w/N4="},"flags/1x1/ec-672567f45dcd0d543af21e7518c41bf8fe74fa090141736b414697b682971f84.svg":{"logical_path":"flags/1x1/ec.svg","mtime":"2020-04-06T16:47:40+02:00","size":29875,"digest":"672567f45dcd0d543af21e7518c41bf8fe74fa090141736b414697b682971f84","integrity":"sha256-ZyVn9F3NDVQ68h51GMQb+P50+gkBQXNrQUaXtoKXH4Q="},"flags/4x3/ee-b4c2ebcd79e821fb8ee37e39d688560a79dee100a981402224a4f2bd9762e41e.svg":{"logical_path":"flags/4x3/ee.svg","mtime":"2020-04-06T16:47:40+02:00","size":321,"digest":"b4c2ebcd79e821fb8ee37e39d688560a79dee100a981402224a4f2bd9762e41e","integrity":"sha256-tMLrzXnoIfuO43451ohWCnne4QCpgUAiJKTyvZdi5B4="},"flags/1x1/ee-53df0c62e5835adce98e59520ae55ddb9f2a35882c5aba2ccb4021d6b0ee88fd.svg":{"logical_path":"flags/1x1/ee.svg","mtime":"2020-04-06T16:47:40+02:00","size":352,"digest":"53df0c62e5835adce98e59520ae55ddb9f2a35882c5aba2ccb4021d6b0ee88fd","integrity":"sha256-U98MYuWDWtzpjllSCuVd258qNYgsWrosy0Ah1rDuiP0="},"flags/4x3/eg-83f4a01c0e76210691d46b0cff7ec97b6ed93290c32a1e94fab96efd3d9b7d42.svg":{"logical_path":"flags/4x3/eg.svg","mtime":"2020-04-06T16:47:40+02:00","size":9899,"digest":"83f4a01c0e76210691d46b0cff7ec97b6ed93290c32a1e94fab96efd3d9b7d42","integrity":"sha256-g/SgHA52IQaR1GsM/37Je27ZMpDDKh6U+rlu/T2bfUI="},"flags/1x1/eg-6234c7747c535705d9b6725f4a6a09158774f288cb14d7e99295822c4e561c22.svg":{"logical_path":"flags/1x1/eg.svg","mtime":"2020-04-06T16:47:40+02:00","size":9913,"digest":"6234c7747c535705d9b6725f4a6a09158774f288cb14d7e99295822c4e561c22","integrity":"sha256-YjTHdHxTVwXZtnJfSmoJFYd08ojLFNfpkpWCLE5WHCI="},"flags/4x3/eh-62f153a1a4ea6e8ed2f79f26ed10eccbbb295bed16ecb46f4e77a6f5f49df639.svg":{"logical_path":"flags/4x3/eh.svg","mtime":"2020-04-06T16:47:40+02:00","size":873,"digest":"62f153a1a4ea6e8ed2f79f26ed10eccbbb295bed16ecb46f4e77a6f5f49df639","integrity":"sha256-YvFToaTqbo7S958m7RDsy7spW+0W7LRvTnem9fSd9jk="},"flags/1x1/eh-15abbba286e48ba50c4aec3b765d8c05f9b4c53ae385a7c8a38d3cebd688b03c.svg":{"logical_path":"flags/1x1/eh.svg","mtime":"2020-04-06T16:47:40+02:00","size":817,"digest":"15abbba286e48ba50c4aec3b765d8c05f9b4c53ae385a7c8a38d3cebd688b03c","integrity":"sha256-Fau7oobki6UMSuw7dl2MBfm0xTrjhafIo40869aIsDw="},"flags/4x3/er-4c57685960d0cd27bc4ee6cc8356f2ed8d0a5cc54a22b5b503529091705a2b04.svg":{"logical_path":"flags/4x3/er.svg","mtime":"2020-04-06T16:47:40+02:00","size":3187,"digest":"4c57685960d0cd27bc4ee6cc8356f2ed8d0a5cc54a22b5b503529091705a2b04","integrity":"sha256-TFdoWWDQzSe8TubMg1by7Y0KXMVKIrW1A1KQkXBaKwQ="},"flags/1x1/er-29ca0e1f31a14f5ee5674a3fcec9aec0ec652b458b66cffd60ac0839fc364729.svg":{"logical_path":"flags/1x1/er.svg","mtime":"2020-04-06T16:47:40+02:00","size":3371,"digest":"29ca0e1f31a14f5ee5674a3fcec9aec0ec652b458b66cffd60ac0839fc364729","integrity":"sha256-KcoOHzGhT17lZ0o/zsmuwOxlK0WLZs/9YKwIOfw2Ryk="},"flags/4x3/es-ab3d438837b7f1c4ebce6980cc9274cd2e6adcc8af9be6f5cfc47ef2c4c464e3.svg":{"logical_path":"flags/4x3/es.svg","mtime":"2020-04-06T16:47:40+02:00","size":90819,"digest":"ab3d438837b7f1c4ebce6980cc9274cd2e6adcc8af9be6f5cfc47ef2c4c464e3","integrity":"sha256-qz1DiDe38cTrzmmAzJJ0zS5q3Mivm+b1z8R+8sTEZOM="},"flags/1x1/es-bfe2d95adf69f339badcf901e33d12c0b6146d7d16a1100b12c3abc13dc3521c.svg":{"logical_path":"flags/1x1/es.svg","mtime":"2020-04-06T16:47:40+02:00","size":92546,"digest":"bfe2d95adf69f339badcf901e33d12c0b6146d7d16a1100b12c3abc13dc3521c","integrity":"sha256-v+LZWt9p8zm63PkB4z0SwLYUbX0WoRALEsOrwT3DUhw="},"flags/4x3/et-e28f1f69ecf1b26e002d8c8dad55ec8af5e822b3cca7f111c399e72b4e0f9c79.svg":{"logical_path":"flags/4x3/et.svg","mtime":"2020-04-06T16:47:40+02:00","size":1233,"digest":"e28f1f69ecf1b26e002d8c8dad55ec8af5e822b3cca7f111c399e72b4e0f9c79","integrity":"sha256-4o8faezxsm4ALYyNrVXsivXoIrPMp/ERw5nnK04PnHk="},"flags/1x1/et-59795d6d33015e4ec1042861541df6c2034e8e1880869d695a1fea5a951e2e71.svg":{"logical_path":"flags/1x1/et.svg","mtime":"2020-04-06T16:47:40+02:00","size":1226,"digest":"59795d6d33015e4ec1042861541df6c2034e8e1880869d695a1fea5a951e2e71","integrity":"sha256-WXldbTMBXk7BBChhVB32wgNOjhiAhp1pWh/qWpUeLnE="},"flags/4x3/fi-83783a7dc69702dfbb59833d81c309748ffb04574aab8ed1cb7589189c0f80d2.svg":{"logical_path":"flags/4x3/fi.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"83783a7dc69702dfbb59833d81c309748ffb04574aab8ed1cb7589189c0f80d2","integrity":"sha256-g3g6fcaXAt+7WYM9gcMJdI/7BFdKq47Ry3WJGJwPgNI="},"flags/1x1/fi-6c32372acfba871cdcd22614f0ebbf58ea2b88de648ee4e843a2bbda5c0a3336.svg":{"logical_path":"flags/1x1/fi.svg","mtime":"2020-04-06T16:47:40+02:00","size":240,"digest":"6c32372acfba871cdcd22614f0ebbf58ea2b88de648ee4e843a2bbda5c0a3336","integrity":"sha256-bDI3Ks+6hxzc0iYU8Ou/WOoriN5kjuToQ6K72lwKMzY="},"flags/4x3/fj-4972d31a0e0d2516c08a305844e5310bf8963d7cca69cc86ed4ed2e121f41be9.svg":{"logical_path":"flags/4x3/fj.svg","mtime":"2020-04-06T16:47:40+02:00","size":27237,"digest":"4972d31a0e0d2516c08a305844e5310bf8963d7cca69cc86ed4ed2e121f41be9","integrity":"sha256-SXLTGg4NJRbAijBYROUxC/iWPXzKacyG7U7S4SH0G+k="},"flags/1x1/fj-36ff3e628fc0bee99878cc9740e54a7b95e9599c263595b5db0c8be2c6ab8978.svg":{"logical_path":"flags/1x1/fj.svg","mtime":"2020-04-06T16:47:40+02:00","size":27518,"digest":"36ff3e628fc0bee99878cc9740e54a7b95e9599c263595b5db0c8be2c6ab8978","integrity":"sha256-Nv8+Yo/AvumYeMyXQOVKe5XpWZwmNZW12wyL4sariXg="},"flags/4x3/fk-6d11c1ecbf413d27f4068e211b7f5f46e83b9067c9fd73ea9c3f5d48c7bbb457.svg":{"logical_path":"flags/4x3/fk.svg","mtime":"2020-04-06T16:47:40+02:00","size":31973,"digest":"6d11c1ecbf413d27f4068e211b7f5f46e83b9067c9fd73ea9c3f5d48c7bbb457","integrity":"sha256-bRHB7L9BPSf0Bo4hG39fRug7kGfJ/XPqnD9dSMe7tFc="},"flags/1x1/fk-2705e5d996f753fdd666b1d3a7c6f4085adc070be85957ba71fa1f07f17eca79.svg":{"logical_path":"flags/1x1/fk.svg","mtime":"2020-04-06T16:47:40+02:00","size":31798,"digest":"2705e5d996f753fdd666b1d3a7c6f4085adc070be85957ba71fa1f07f17eca79","integrity":"sha256-JwXl2Zb3U/3WZrHTp8b0CFrcBwvoWVe6cfofB/F+ynk="},"flags/4x3/fm-881458469239020624b90d2601d347330d21dd7b512c011cba2bcb0c4dc4ea75.svg":{"logical_path":"flags/4x3/fm.svg","mtime":"2020-04-06T16:47:40+02:00","size":776,"digest":"881458469239020624b90d2601d347330d21dd7b512c011cba2bcb0c4dc4ea75","integrity":"sha256-iBRYRpI5AgYkuQ0mAdNHMw0h3XtRLAEcuivLDE3E6nU="},"flags/1x1/fm-0b0d81c2932c2a3a114f5095a9e89e6ac274c54d0cd9e794136a339ad4df8cb4.svg":{"logical_path":"flags/1x1/fm.svg","mtime":"2020-04-06T16:47:40+02:00","size":759,"digest":"0b0d81c2932c2a3a114f5095a9e89e6ac274c54d0cd9e794136a339ad4df8cb4","integrity":"sha256-Cw2BwpMsKjoRT1CVqeieasJ0xU0M2eeUE2ozmtTfjLQ="},"flags/4x3/fo-c0b32df51365a3947ddcda18c15575c5c617b75b29330d78e606e684f3304334.svg":{"logical_path":"flags/4x3/fo.svg","mtime":"2020-04-06T16:47:40+02:00","size":570,"digest":"c0b32df51365a3947ddcda18c15575c5c617b75b29330d78e606e684f3304334","integrity":"sha256-wLMt9RNlo5R93NoYwVV1xcYXt1spMw145gbmhPMwQzQ="},"flags/1x1/fo-5910fc8006f125ce3c7ec5b93b86ccbe0a79e5fbc2e60a9a9b481c882d1bac7c.svg":{"logical_path":"flags/1x1/fo.svg","mtime":"2020-04-06T16:47:40+02:00","size":534,"digest":"5910fc8006f125ce3c7ec5b93b86ccbe0a79e5fbc2e60a9a9b481c882d1bac7c","integrity":"sha256-WRD8gAbxJc48fsW5O4bMvgp55fvC5gqam0gciC0brHw="},"flags/4x3/fr-63667b36ddd95d29a9f163e3ab4b9f7000dcd310350c565c19b975a0a2418117.svg":{"logical_path":"flags/4x3/fr.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"63667b36ddd95d29a9f163e3ab4b9f7000dcd310350c565c19b975a0a2418117","integrity":"sha256-Y2Z7Nt3ZXSmp8WPjq0ufcADc0xA1DFZcGbl1oKJBgRc="},"flags/1x1/fr-5d247ee39647a05667b52e04510b76ae465c009da242ff8d98637d138ea410ff.svg":{"logical_path":"flags/1x1/fr.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"5d247ee39647a05667b52e04510b76ae465c009da242ff8d98637d138ea410ff","integrity":"sha256-XSR+45ZHoFZntS4EUQt2rkZcAJ2iQv+NmGN9E46kEP8="},"flags/4x3/ga-6cf1908ef7a47d61ead3f969bb5dfb96e4b691b66291e2cd7dc71c513d1a5659.svg":{"logical_path":"flags/4x3/ga.svg","mtime":"2020-04-06T16:47:40+02:00","size":274,"digest":"6cf1908ef7a47d61ead3f969bb5dfb96e4b691b66291e2cd7dc71c513d1a5659","integrity":"sha256-bPGQjvekfWHq0/lpu137luS2kbZikeLNfcccUT0aVlk="},"flags/1x1/ga-2b2ea5084b741bf0b1dd1ebc87ee72e4e9fad78046275d37becb41831d259686.svg":{"logical_path":"flags/1x1/ga.svg","mtime":"2020-04-06T16:47:40+02:00","size":278,"digest":"2b2ea5084b741bf0b1dd1ebc87ee72e4e9fad78046275d37becb41831d259686","integrity":"sha256-Ky6lCEt0G/Cx3R68h+5y5On614BGJ103vstBgx0lloY="},"flags/4x3/gb-825310f9bcc8892559317bfc87fc28d5d7bad06c02d562b5740aafcf4b040803.svg":{"logical_path":"flags/4x3/gb.svg","mtime":"2020-04-06T16:47:40+02:00","size":538,"digest":"825310f9bcc8892559317bfc87fc28d5d7bad06c02d562b5740aafcf4b040803","integrity":"sha256-glMQ+bzIiSVZMXv8h/wo1de60GwC1WK1dAqvz0sECAM="},"flags/1x1/gb-6ce6ebb0c16f1f4aa74a78a5db382783545d1ca28f2b6133b6228b4dff0340f0.svg":{"logical_path":"flags/1x1/gb.svg","mtime":"2020-04-06T16:47:40+02:00","size":541,"digest":"6ce6ebb0c16f1f4aa74a78a5db382783545d1ca28f2b6133b6228b4dff0340f0","integrity":"sha256-bObrsMFvH0qnSnil2zgng1RdHKKPK2EztiKLTf8DQPA="},"flags/4x3/gd-eb435c57c240fd302400f1ecb887ec63c672b524032bd0e7c6261ae6a2f1e249.svg":{"logical_path":"flags/4x3/gd.svg","mtime":"2020-04-06T16:47:40+02:00","size":1681,"digest":"eb435c57c240fd302400f1ecb887ec63c672b524032bd0e7c6261ae6a2f1e249","integrity":"sha256-60NcV8JA/TAkAPHsuIfsY8ZytSQDK9DnxiYa5qLx4kk="},"flags/1x1/gd-407dac34390ab8b1ed80fafa4f7ef1fe3225d1d92c5403a80264b4956177e51d.svg":{"logical_path":"flags/1x1/gd.svg","mtime":"2020-04-06T16:47:40+02:00","size":1828,"digest":"407dac34390ab8b1ed80fafa4f7ef1fe3225d1d92c5403a80264b4956177e51d","integrity":"sha256-QH2sNDkKuLHtgPr6T37x/jIl0dksVAOoAmS0lWF35R0="},"flags/4x3/ge-3054d4e61ec2de31e08ce51c8e1bff64fe2d4cc39f3bc6b3988a5e3aab32379c.svg":{"logical_path":"flags/4x3/ge.svg","mtime":"2020-04-06T16:47:40+02:00","size":1397,"digest":"3054d4e61ec2de31e08ce51c8e1bff64fe2d4cc39f3bc6b3988a5e3aab32379c","integrity":"sha256-MFTU5h7C3jHgjOUcjhv/ZP4tTMOfO8azmIpeOqsyN5w="},"flags/1x1/ge-3f7e3b7075838308212d191c4ff1ff3915a4a0c3e1b140420bc1095be16aee0a.svg":{"logical_path":"flags/1x1/ge.svg","mtime":"2020-04-06T16:47:40+02:00","size":1541,"digest":"3f7e3b7075838308212d191c4ff1ff3915a4a0c3e1b140420bc1095be16aee0a","integrity":"sha256-P347cHWDgwghLRkcT/H/ORWkoMPhsUBCC8EJW+Fq7go="},"flags/4x3/gf-8b1d049abec1dc1e6e28247d4f649f5146e8c29a4b928f94c97741da16bcc422.svg":{"logical_path":"flags/4x3/gf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"8b1d049abec1dc1e6e28247d4f649f5146e8c29a4b928f94c97741da16bcc422","integrity":"sha256-ix0Emr7B3B5uKCR9T2SfUUbowppLko+UyXdB2ha8xCI="},"flags/1x1/gf-7e25c5fdc494625ccc8390d3fb1cc6d9a423372c7f30a6c402b138b11840e59f.svg":{"logical_path":"flags/1x1/gf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"7e25c5fdc494625ccc8390d3fb1cc6d9a423372c7f30a6c402b138b11840e59f","integrity":"sha256-fiXF/cSUYlzMg5DT+xzG2aQjNyx/MKbEArE4sRhA5Z8="},"flags/4x3/gg-7a521b07e2a60e914abf16a2553dd7b8f18d3ff21ece58b2c41ba5264c3117e3.svg":{"logical_path":"flags/4x3/gg.svg","mtime":"2020-04-06T16:47:40+02:00","size":595,"digest":"7a521b07e2a60e914abf16a2553dd7b8f18d3ff21ece58b2c41ba5264c3117e3","integrity":"sha256-elIbB+KmDpFKvxaiVT3XuPGNP/IezliyxBulJkwxF+M="},"flags/1x1/gg-e01d6706db308999fde70ce031a660160c3234d9d6e7ba4547f10975e5a1ffcf.svg":{"logical_path":"flags/1x1/gg.svg","mtime":"2020-04-06T16:47:40+02:00","size":625,"digest":"e01d6706db308999fde70ce031a660160c3234d9d6e7ba4547f10975e5a1ffcf","integrity":"sha256-4B1nBtswiZn95wzgMaZgFgwyNNnW57pFR/EJdeWh/88="},"flags/4x3/gh-120554a519bce5c340f98f8cb7bcf98ea18572d3ad137804b4b0c5d806a54016.svg":{"logical_path":"flags/4x3/gh.svg","mtime":"2020-04-06T16:47:40+02:00","size":281,"digest":"120554a519bce5c340f98f8cb7bcf98ea18572d3ad137804b4b0c5d806a54016","integrity":"sha256-EgVUpRm85cNA+Y+Mt7z5jqGFctOtE3gEtLDF2AalQBY="},"flags/1x1/gh-b979935b065bbef93c1a62caedf03ae3833c055f617bdc32824fd15c59d4bf6e.svg":{"logical_path":"flags/1x1/gh.svg","mtime":"2020-04-06T16:47:40+02:00","size":296,"digest":"b979935b065bbef93c1a62caedf03ae3833c055f617bdc32824fd15c59d4bf6e","integrity":"sha256-uXmTWwZbvvk8GmLK7fA644M8BV9he9wygk/RXFnUv24="},"flags/4x3/gi-c84fb25bb5c8d9b9cc2d70f630a927f4ea4f4cbeb2674eb97b4b9dc2d2256c14.svg":{"logical_path":"flags/4x3/gi.svg","mtime":"2020-04-06T16:47:40+02:00","size":2938,"digest":"c84fb25bb5c8d9b9cc2d70f630a927f4ea4f4cbeb2674eb97b4b9dc2d2256c14","integrity":"sha256-yE+yW7XI2bnMLXD2MKkn9OpPTL6yZ065e0udwtIlbBQ="},"flags/1x1/gi-7283b9d6ac27b497fafd867b580d0f12fea7551a4211150087d95816c2143e21.svg":{"logical_path":"flags/1x1/gi.svg","mtime":"2020-04-06T16:47:40+02:00","size":2930,"digest":"7283b9d6ac27b497fafd867b580d0f12fea7551a4211150087d95816c2143e21","integrity":"sha256-coO51qwntJf6/YZ7WA0PEv6nVRpCERUAh9lYFsIUPiE="},"flags/4x3/gl-1149b6b3a90dd6f4f6ac8dd4af0ddfcb33e801858e4835c5f8c6c7346dee3288.svg":{"logical_path":"flags/4x3/gl.svg","mtime":"2020-04-06T16:47:40+02:00","size":223,"digest":"1149b6b3a90dd6f4f6ac8dd4af0ddfcb33e801858e4835c5f8c6c7346dee3288","integrity":"sha256-EUm2s6kN1vT2rI3Urw3fyzPoAYWOSDXF+MbHNG3uMog="},"flags/1x1/gl-5e6efacd630a7f36a1574444a9893613e5c6d03d5d569e140b592f8e7542feb8.svg":{"logical_path":"flags/1x1/gl.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"5e6efacd630a7f36a1574444a9893613e5c6d03d5d569e140b592f8e7542feb8","integrity":"sha256-Xm76zWMKfzahV0REqYk2E+XG0D1dVp4UC1kvjnVC/rg="},"flags/4x3/gm-6d6da6987a4243bb9fff8138ad9e0b301098c6f963cacedf997850fb679ec28c.svg":{"logical_path":"flags/4x3/gm.svg","mtime":"2020-04-06T16:47:40+02:00","size":546,"digest":"6d6da6987a4243bb9fff8138ad9e0b301098c6f963cacedf997850fb679ec28c","integrity":"sha256-bW2mmHpCQ7uf/4E4rZ4LMBCYxvljys7fmXhQ+2eewow="},"flags/1x1/gm-5f8874f8ab093f84c3465b3110ed400cd8eb457110f9b61e684edc867ef99b2f.svg":{"logical_path":"flags/1x1/gm.svg","mtime":"2020-04-06T16:47:40+02:00","size":382,"digest":"5f8874f8ab093f84c3465b3110ed400cd8eb457110f9b61e684edc867ef99b2f","integrity":"sha256-X4h0+KsJP4TDRlsxEO1ADNjrRXEQ+bYeaE7chn75my8="},"flags/4x3/gn-735109ba23330ad9e8602b6e27e658bd12e36f2616b7ead65bd908d553b2acda.svg":{"logical_path":"flags/4x3/gn.svg","mtime":"2020-04-06T16:47:40+02:00","size":295,"digest":"735109ba23330ad9e8602b6e27e658bd12e36f2616b7ead65bd908d553b2acda","integrity":"sha256-c1EJuiMzCtnoYCtuJ+ZYvRLjbyYWt+rWW9kI1VOyrNo="},"flags/1x1/gn-255e2c2930544e25827f220ebc26c6f533d291079f34f2ad6644533d3dfbd726.svg":{"logical_path":"flags/1x1/gn.svg","mtime":"2020-04-06T16:47:40+02:00","size":295,"digest":"255e2c2930544e25827f220ebc26c6f533d291079f34f2ad6644533d3dfbd726","integrity":"sha256-JV4sKTBUTiWCfyIOvCbG9TPSkQefNPKtZkRTPT371yY="},"flags/4x3/gp-b9c509941ec97521fd81904dc81a2845faa44349cc068344f4f738dad7a558b2.svg":{"logical_path":"flags/4x3/gp.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"b9c509941ec97521fd81904dc81a2845faa44349cc068344f4f738dad7a558b2","integrity":"sha256-ucUJlB7JdSH9gZBNyBooRfqkQ0nMBoNE9Pc42telWLI="},"flags/1x1/gp-8bf5d31fdbb388b5bee19d19f7a7cf1e0c0378d5759c5a4254549b2542727a2c.svg":{"logical_path":"flags/1x1/gp.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"8bf5d31fdbb388b5bee19d19f7a7cf1e0c0378d5759c5a4254549b2542727a2c","integrity":"sha256-i/XTH9uziLW+4Z0Z96fPHgwDeNV1nFpCVFSbJUJyeiw="},"flags/4x3/gq-52b8daea18383c355f1f6db428bcd4ebdf777734148da4403f1e93797b4dc9da.svg":{"logical_path":"flags/4x3/gq.svg","mtime":"2020-04-06T16:47:40+02:00","size":5182,"digest":"52b8daea18383c355f1f6db428bcd4ebdf777734148da4403f1e93797b4dc9da","integrity":"sha256-Urja6hg4PDVfH220KLzU6993dzQUjaRAPx6TeXtNydo="},"flags/1x1/gq-f4a44fd2e337cfa52f199707b606891ab0bd3b68bfaeca033e70c274739a6131.svg":{"logical_path":"flags/1x1/gq.svg","mtime":"2020-04-06T16:47:40+02:00","size":5273,"digest":"f4a44fd2e337cfa52f199707b606891ab0bd3b68bfaeca033e70c274739a6131","integrity":"sha256-9KRP0uM3z6UvGZcHtgaJGrC9O2i/rsoDPnDCdHOaYTE="},"flags/4x3/gr-d22330d2af43ce22eab7d8ec9efdbe27ccd9ac1255f3bd289aa671db07fd0205.svg":{"logical_path":"flags/4x3/gr.svg","mtime":"2020-04-06T16:47:40+02:00","size":1096,"digest":"d22330d2af43ce22eab7d8ec9efdbe27ccd9ac1255f3bd289aa671db07fd0205","integrity":"sha256-0iMw0q9DziLqt9jsnv2+J8zZrBJV870omqZx2wf9AgU="},"flags/1x1/gr-565e017faa966d20d9a4051a1853c366bbd59ebaaced77fed32f850b8a9c5099.svg":{"logical_path":"flags/1x1/gr.svg","mtime":"2020-04-06T16:47:40+02:00","size":1085,"digest":"565e017faa966d20d9a4051a1853c366bbd59ebaaced77fed32f850b8a9c5099","integrity":"sha256-Vl4Bf6qWbSDZpAUaGFPDZrvVnrqs7Xf+0y+FC4qcUJk="},"flags/4x3/gs-ad593ae4b9e8c7a4c109a15385a221464240cf3f77e607af2adba53d7b7d2a69.svg":{"logical_path":"flags/4x3/gs.svg","mtime":"2020-04-06T16:47:40+02:00","size":34568,"digest":"ad593ae4b9e8c7a4c109a15385a221464240cf3f77e607af2adba53d7b7d2a69","integrity":"sha256-rVk65Lnox6TBCaFThaIhRkJAzz935gevKtulPXt9Kmk="},"flags/1x1/gs-718e0e89dee0f138fe8e45e84c64f72259b41d0f36224b9b2507bce77be21186.svg":{"logical_path":"flags/1x1/gs.svg","mtime":"2020-04-06T16:47:40+02:00","size":35061,"digest":"718e0e89dee0f138fe8e45e84c64f72259b41d0f36224b9b2507bce77be21186","integrity":"sha256-cY4Oid7g8Tj+jkXoTGT3Ilm0HQ82IkubJQe853viEYY="},"flags/4x3/gt-aa19f58abef6e0b68f7bee73452e26679a640c0fed12f9fc2cb6cde32fc04da5.svg":{"logical_path":"flags/4x3/gt.svg","mtime":"2020-04-06T16:47:40+02:00","size":37255,"digest":"aa19f58abef6e0b68f7bee73452e26679a640c0fed12f9fc2cb6cde32fc04da5","integrity":"sha256-qhn1ir724LaPe+5zRS4mZ5pkDA/tEvn8LLbN4y/ATaU="},"flags/1x1/gt-66d29cdd8660d4380902884c08d9be64f3d8a02536873814f2909778b6e234e0.svg":{"logical_path":"flags/1x1/gt.svg","mtime":"2020-04-06T16:47:40+02:00","size":37255,"digest":"66d29cdd8660d4380902884c08d9be64f3d8a02536873814f2909778b6e234e0","integrity":"sha256-ZtKc3YZg1DgJAohMCNm+ZPPYoCU2hzgU8pCXeLbiNOA="},"flags/4x3/gu-6d39ec648f0366b77918f779bef9619d06561d223bcb98b56813dc32e8403d2d.svg":{"logical_path":"flags/4x3/gu.svg","mtime":"2020-04-06T16:47:40+02:00","size":4840,"digest":"6d39ec648f0366b77918f779bef9619d06561d223bcb98b56813dc32e8403d2d","integrity":"sha256-bTnsZI8DZrd5GPd5vvlhnQZWHSI7y5i1aBPcMuhAPS0="},"flags/1x1/gu-390cbafa22e9b9131e3bf37109317115684519abf87088acfa0f355c608b4729.svg":{"logical_path":"flags/1x1/gu.svg","mtime":"2020-04-06T16:47:40+02:00","size":4614,"digest":"390cbafa22e9b9131e3bf37109317115684519abf87088acfa0f355c608b4729","integrity":"sha256-OQy6+iLpuRMeO/NxCTFxFWhFGav4cIis+g81XGCLRyk="},"flags/4x3/gw-ef2b9b0a28a50cc12689fb576cf4dc5b507b01fbb15a498298921d7a57f0fd77.svg":{"logical_path":"flags/4x3/gw.svg","mtime":"2020-04-06T16:47:40+02:00","size":813,"digest":"ef2b9b0a28a50cc12689fb576cf4dc5b507b01fbb15a498298921d7a57f0fd77","integrity":"sha256-7yubCiilDMEmiftXbPTcW1B7AfuxWkmCmJIdelfw/Xc="},"flags/1x1/gw-14078000daf10cc29b7167c3f9b1b239ab3708b3bad35e8ef185cb92643f88de.svg":{"logical_path":"flags/1x1/gw.svg","mtime":"2020-04-06T16:47:40+02:00","size":889,"digest":"14078000daf10cc29b7167c3f9b1b239ab3708b3bad35e8ef185cb92643f88de","integrity":"sha256-FAeAANrxDMKbcWfD+bGyOas3CLO6016O8YXLkmQ/iN4="},"flags/4x3/gy-0b13a1778887768d5e7767f5e4a484444f4cf3be655142fd6d5d5acb945e7919.svg":{"logical_path":"flags/4x3/gy.svg","mtime":"2020-04-06T16:47:40+02:00","size":488,"digest":"0b13a1778887768d5e7767f5e4a484444f4cf3be655142fd6d5d5acb945e7919","integrity":"sha256-CxOhd4iHdo1ed2f15KSERE9M875lUUL9bV1ay5ReeRk="},"flags/1x1/gy-7562ed6db701af0658a763a1d4701c12467cd962cfd0bfd262cac16d4fc80c88.svg":{"logical_path":"flags/1x1/gy.svg","mtime":"2020-04-06T16:47:40+02:00","size":481,"digest":"7562ed6db701af0658a763a1d4701c12467cd962cfd0bfd262cac16d4fc80c88","integrity":"sha256-dWLtbbcBrwZYp2Oh1HAcEkZ82WLP0L/SYsrBbU/IDIg="},"flags/4x3/hk-17c1c66141f1aa0339fefc5863866d67eabcb1732bda7d5d757b2cb937c93da1.svg":{"logical_path":"flags/4x3/hk.svg","mtime":"2020-04-06T16:47:40+02:00","size":3494,"digest":"17c1c66141f1aa0339fefc5863866d67eabcb1732bda7d5d757b2cb937c93da1","integrity":"sha256-F8HGYUHxqgM5/vxYY4ZtZ+q8sXMr2n1ddXssuTfJPaE="},"flags/1x1/hk-9f59b3d68a943ed25c5e00cb3d1b97d522951d85db0f66fed087418358f88927.svg":{"logical_path":"flags/1x1/hk.svg","mtime":"2020-04-06T16:47:40+02:00","size":3529,"digest":"9f59b3d68a943ed25c5e00cb3d1b97d522951d85db0f66fed087418358f88927","integrity":"sha256-n1mz1oqUPtJcXgDLPRuX1SKVHYXbD2b+0IdBg1j4iSc="},"flags/4x3/hm-d0e56b8208a450dc19b6e1eafaa826c439a318b33314c503ebab05d7a9d14ba3.svg":{"logical_path":"flags/4x3/hm.svg","mtime":"2020-04-06T16:47:40+02:00","size":1324,"digest":"d0e56b8208a450dc19b6e1eafaa826c439a318b33314c503ebab05d7a9d14ba3","integrity":"sha256-0OVrggikUNwZtuHq+qgmxDmjGLMzFMUD66sF16nRS6M="},"flags/1x1/hm-78ed36c627b9370e2c8737226f62105718c18b2f04c62618168e43adcccc1ca6.svg":{"logical_path":"flags/1x1/hm.svg","mtime":"2020-04-06T16:47:40+02:00","size":1308,"digest":"78ed36c627b9370e2c8737226f62105718c18b2f04c62618168e43adcccc1ca6","integrity":"sha256-eO02xie5Nw4shzcib2IQVxjBiy8ExiYYFo5DrczMHKY="},"flags/4x3/hn-38a5028605f6645a95c607f24db6d27d5b915580be561a365cfb9d238736b594.svg":{"logical_path":"flags/4x3/hn.svg","mtime":"2020-04-06T16:47:40+02:00","size":1112,"digest":"38a5028605f6645a95c607f24db6d27d5b915580be561a365cfb9d238736b594","integrity":"sha256-OKUChgX2ZFqVxgfyTbbSfVuRVYC+Vho2XPudI4c2tZQ="},"flags/1x1/hn-79cc97901f534c2998d1ec6cd506a81b59eabc0a040dc66ee46ef8a7405e6641.svg":{"logical_path":"flags/1x1/hn.svg","mtime":"2020-04-06T16:47:40+02:00","size":1116,"digest":"79cc97901f534c2998d1ec6cd506a81b59eabc0a040dc66ee46ef8a7405e6641","integrity":"sha256-ecyXkB9TTCmY0exs1QaoG1nqvAoEDcZu5G74p0BeZkE="},"flags/4x3/hr-b0b1d075c651e2ceb10f558b33a13c9dd89310edfbe67df0f46a7b5d8d550de6.svg":{"logical_path":"flags/4x3/hr.svg","mtime":"2020-04-06T16:47:40+02:00","size":40615,"digest":"b0b1d075c651e2ceb10f558b33a13c9dd89310edfbe67df0f46a7b5d8d550de6","integrity":"sha256-sLHQdcZR4s6xD1WLM6E8ndiTEO375n3w9Gp7XY1VDeY="},"flags/1x1/hr-1041347a78192d0e7688af7adec3cd93d85fd0dd7ab792dc80fd82629708a7bf.svg":{"logical_path":"flags/1x1/hr.svg","mtime":"2020-04-06T16:47:40+02:00","size":40852,"digest":"1041347a78192d0e7688af7adec3cd93d85fd0dd7ab792dc80fd82629708a7bf","integrity":"sha256-EEE0engZLQ52iK963sPNk9hf0N16t5LcgP2CYpcIp78="},"flags/4x3/ht-ba77c23de904dea8ddf2390f9e363fa96679253b425be7d4dbf0021c4a0c9911.svg":{"logical_path":"flags/4x3/ht.svg","mtime":"2020-04-06T16:47:40+02:00","size":15005,"digest":"ba77c23de904dea8ddf2390f9e363fa96679253b425be7d4dbf0021c4a0c9911","integrity":"sha256-unfCPekE3qjd8jkPnjY/qWZ5JTtCW+fU2/ACHEoMmRE="},"flags/1x1/ht-092fc65d74cf70aa35a8dd3a5581f5bb668aba72ddf788c4ffc22278be4ee70b.svg":{"logical_path":"flags/1x1/ht.svg","mtime":"2020-04-06T16:47:40+02:00","size":15094,"digest":"092fc65d74cf70aa35a8dd3a5581f5bb668aba72ddf788c4ffc22278be4ee70b","integrity":"sha256-CS/GXXTPcKo1qN06VYH1u2aKunLd94jE/8IieL5O5ws="},"flags/4x3/hu-470431d1ed0dc2099f20313f78f906848acaf9efce57c543d83b3b62f8b7a448.svg":{"logical_path":"flags/4x3/hu.svg","mtime":"2020-04-06T16:47:40+02:00","size":274,"digest":"470431d1ed0dc2099f20313f78f906848acaf9efce57c543d83b3b62f8b7a448","integrity":"sha256-RwQx0e0NwgmfIDE/ePkGhIrK+e/OV8VD2Ds7Yvi3pEg="},"flags/1x1/hu-ac2bf4284d73c0c0d607f5ec46855b982f56d2ee430306fca04da3a5cda8515b.svg":{"logical_path":"flags/1x1/hu.svg","mtime":"2020-04-06T16:47:40+02:00","size":276,"digest":"ac2bf4284d73c0c0d607f5ec46855b982f56d2ee430306fca04da3a5cda8515b","integrity":"sha256-rCv0KE1zwMDWB/XsRoVbmC9W0u5DAwb8oE2jpc2oUVs="},"flags/4x3/id-c9871d91b6b58310831a0d78b904e44eb92a64630ac219ac43165d0ca8f0dacd.svg":{"logical_path":"flags/4x3/id.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"c9871d91b6b58310831a0d78b904e44eb92a64630ac219ac43165d0ca8f0dacd","integrity":"sha256-yYcdkba1gxCDGg14uQTkTrkqZGMKwhmsQxZdDKjw2s0="},"flags/1x1/id-b4e3434244c27c95f6933e19a65fc273348f2edc6b695dd5dfe810d12f5459aa.svg":{"logical_path":"flags/1x1/id.svg","mtime":"2020-04-06T16:47:40+02:00","size":239,"digest":"b4e3434244c27c95f6933e19a65fc273348f2edc6b695dd5dfe810d12f5459aa","integrity":"sha256-tONDQkTCfJX2kz4Zpl/CczSPLtxraV3V3+gQ0S9UWao="},"flags/4x3/ie-4d73eedf98a4c487c352db58751ff766f05f6aa3bfac1ecc0f9384e50d019191.svg":{"logical_path":"flags/4x3/ie.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"4d73eedf98a4c487c352db58751ff766f05f6aa3bfac1ecc0f9384e50d019191","integrity":"sha256-TXPu35ikxIfDUttYdR/3ZvBfaqO/rB7MD5OE5Q0BkZE="},"flags/1x1/ie-e8a2121f51aa8eccbaab9fdc1e986418f75b6e3adf81329b1251db3a6678851d.svg":{"logical_path":"flags/1x1/ie.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"e8a2121f51aa8eccbaab9fdc1e986418f75b6e3adf81329b1251db3a6678851d","integrity":"sha256-6KISH1Gqjsy6q5/cHphkGPdbbjrfgTKbElHbOmZ4hR0="},"flags/4x3/il-1dcc3e315cf8b00b8a9914d9ce696b05612aec294bf85e784b25c672b259c58a.svg":{"logical_path":"flags/4x3/il.svg","mtime":"2020-04-06T16:47:40+02:00","size":901,"digest":"1dcc3e315cf8b00b8a9914d9ce696b05612aec294bf85e784b25c672b259c58a","integrity":"sha256-Hcw+MVz4sAuKmRTZzmlrBWEq7ClL+F54SyXGcrJZxYo="},"flags/1x1/il-343c040339a72ace51208700f40fe69bfb90e3b4f5ad62b1ed69ac404470722a.svg":{"logical_path":"flags/1x1/il.svg","mtime":"2020-04-06T16:47:40+02:00","size":848,"digest":"343c040339a72ace51208700f40fe69bfb90e3b4f5ad62b1ed69ac404470722a","integrity":"sha256-NDwEAzmnKs5RIIcA9A/mm/uQ47T1rWKx7WmsQERwcio="},"flags/4x3/im-5b256ebd75ab1fc4d1e7af4f4306b4c6b54ae64a67eb1d968a84065a007b7cd7.svg":{"logical_path":"flags/4x3/im.svg","mtime":"2020-04-06T16:47:40+02:00","size":9870,"digest":"5b256ebd75ab1fc4d1e7af4f4306b4c6b54ae64a67eb1d968a84065a007b7cd7","integrity":"sha256-WyVuvXWrH8TR569PQwa0xrVK5kpn6x2WioQGWgB7fNc="},"flags/1x1/im-6dd9078e0d7934b575a00aa2b81effafa5b8aed1fa6c3f6824d56187ca7a63ba.svg":{"logical_path":"flags/1x1/im.svg","mtime":"2020-04-06T16:47:40+02:00","size":10197,"digest":"6dd9078e0d7934b575a00aa2b81effafa5b8aed1fa6c3f6824d56187ca7a63ba","integrity":"sha256-bdkHjg15NLV1oAqiuB7/r6W4rtH6bD9oJNVhh8p6Y7o="},"flags/4x3/in-cbc15f5fb40df22adf2b3792eb6c1d359e1a7affb44318a5a779943fc7299d45.svg":{"logical_path":"flags/4x3/in.svg","mtime":"2020-04-06T16:47:40+02:00","size":1074,"digest":"cbc15f5fb40df22adf2b3792eb6c1d359e1a7affb44318a5a779943fc7299d45","integrity":"sha256-y8FfX7QN8irfKzeS62wdNZ4aev+0Qxilp3mUP8cpnUU="},"flags/1x1/in-dd68b8ac425f8b0e1a479337e4fb6e8c647241f5042e63ba4cd9853e5e3b661b.svg":{"logical_path":"flags/1x1/in.svg","mtime":"2020-04-06T16:47:40+02:00","size":1088,"digest":"dd68b8ac425f8b0e1a479337e4fb6e8c647241f5042e63ba4cd9853e5e3b661b","integrity":"sha256-3Wi4rEJfiw4aR5M35PtujGRyQfUELmO6TNmFPl47Zhs="},"flags/4x3/io-b942bddf710a42e617b2fcabb8bdfbe210b85d2ac9a60b5063d513ecc6648eec.svg":{"logical_path":"flags/4x3/io.svg","mtime":"2020-04-06T16:47:40+02:00","size":27341,"digest":"b942bddf710a42e617b2fcabb8bdfbe210b85d2ac9a60b5063d513ecc6648eec","integrity":"sha256-uUK933EKQuYXsvyruL374hC4XSrJpgtQY9UT7MZkjuw="},"flags/1x1/io-5b124813bf16fe4c96b606443527a5f17f6cdde9f0abf94d6884f5f81118198e.svg":{"logical_path":"flags/1x1/io.svg","mtime":"2020-04-06T16:47:40+02:00","size":27357,"digest":"5b124813bf16fe4c96b606443527a5f17f6cdde9f0abf94d6884f5f81118198e","integrity":"sha256-WxJIE78W/kyWtgZENSel8X9s3enwq/lNaIT1+BEYGY4="},"flags/4x3/iq-4b13b01690d870625d61a87bbaf4328a714626698d056dc3f56a9a37c133d77a.svg":{"logical_path":"flags/4x3/iq.svg","mtime":"2020-04-06T16:47:40+02:00","size":1470,"digest":"4b13b01690d870625d61a87bbaf4328a714626698d056dc3f56a9a37c133d77a","integrity":"sha256-SxOwFpDYcGJdYah7uvQyinFGJmmNBW3D9WqaN8Ez13o="},"flags/1x1/iq-4a529e765a46ab3cea5be74d6754d6646b175cc5da0a725114e1fcd1f877734c.svg":{"logical_path":"flags/1x1/iq.svg","mtime":"2020-04-06T16:47:40+02:00","size":1475,"digest":"4a529e765a46ab3cea5be74d6754d6646b175cc5da0a725114e1fcd1f877734c","integrity":"sha256-SlKedlpGqzzqW+dNZ1TWZGsXXMXaCnJRFOH80fh3c0w="},"flags/4x3/ir-2047b977f2d7e8835035e30551fe8333403452134c3164105ed30b2e6fd14a23.svg":{"logical_path":"flags/4x3/ir.svg","mtime":"2020-04-06T16:47:40+02:00","size":15451,"digest":"2047b977f2d7e8835035e30551fe8333403452134c3164105ed30b2e6fd14a23","integrity":"sha256-IEe5d/LX6INQNeMFUf6DM0A0UhNMMWQQXtMLLm/RSiM="},"flags/1x1/ir-18b8f0da914e052490e627f2dbe57a24a1448e84cfedead2d2ffa9795135afc6.svg":{"logical_path":"flags/1x1/ir.svg","mtime":"2020-04-06T16:47:40+02:00","size":15356,"digest":"18b8f0da914e052490e627f2dbe57a24a1448e84cfedead2d2ffa9795135afc6","integrity":"sha256-GLjw2pFOBSSQ5ify2+V6JKFEjoTP7erS0v+peVE1r8Y="},"flags/4x3/is-89b266e3c5824fabc91b8d04a830a3f32c62484b49543bc3921e14c57ba6cb7e.svg":{"logical_path":"flags/4x3/is.svg","mtime":"2020-04-06T16:47:40+02:00","size":524,"digest":"89b266e3c5824fabc91b8d04a830a3f32c62484b49543bc3921e14c57ba6cb7e","integrity":"sha256-ibJm48WCT6vJG40EqDCj8yxiSEtJVDvDkh4UxXumy34="},"flags/1x1/is-74bbf9d0f1714110da6ba438163ff7de135dd91d32b2172757a943ac7bc355a3.svg":{"logical_path":"flags/1x1/is.svg","mtime":"2020-04-06T16:47:40+02:00","size":526,"digest":"74bbf9d0f1714110da6ba438163ff7de135dd91d32b2172757a943ac7bc355a3","integrity":"sha256-dLv50PFxQRDaa6Q4Fj/33hNd2R0yshcnV6lDrHvDVaM="},"flags/4x3/it-2d46fd7fde3f19c3f278fe9028e6fab6fa997fbdda3e18116fb70e57cfc78598.svg":{"logical_path":"flags/4x3/it.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"2d46fd7fde3f19c3f278fe9028e6fab6fa997fbdda3e18116fb70e57cfc78598","integrity":"sha256-LUb9f94/GcPyeP6QKOb6tvqZf73aPhgRb7cOV8/HhZg="},"flags/1x1/it-28a4339b1dc59c4e776f6bf07f51117de9fade0a8a749492e478764b8bd8c2f2.svg":{"logical_path":"flags/1x1/it.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"28a4339b1dc59c4e776f6bf07f51117de9fade0a8a749492e478764b8bd8c2f2","integrity":"sha256-KKQzmx3FnE53b2vwf1ERfen63gqKdJSS5Hh2S4vYwvI="},"flags/4x3/je-365f0f9dea4804f7f9a9ca052beb1b39bc0811cd5d47d013094418d5b6c53d1a.svg":{"logical_path":"flags/4x3/je.svg","mtime":"2020-04-06T16:47:40+02:00","size":4700,"digest":"365f0f9dea4804f7f9a9ca052beb1b39bc0811cd5d47d013094418d5b6c53d1a","integrity":"sha256-Nl8PnepIBPf5qcoFK+sbObwIEc1dR9ATCUQY1bbFPRo="},"flags/1x1/je-0cdc51ec29101669d333d4b91b61d87f3d302473cc81bd17ff80ccbed6c7e0f6.svg":{"logical_path":"flags/1x1/je.svg","mtime":"2020-04-06T16:47:40+02:00","size":4675,"digest":"0cdc51ec29101669d333d4b91b61d87f3d302473cc81bd17ff80ccbed6c7e0f6","integrity":"sha256-DNxR7CkQFmnTM9S5G2HYfz0wJHPMgb0X/4DMvtbH4PY="},"flags/4x3/jm-fc7c5d90b44fa5ba160c644f6c7f8918f5460a5842a517e3fd99ea94ba963594.svg":{"logical_path":"flags/4x3/jm.svg","mtime":"2020-04-06T16:47:40+02:00","size":389,"digest":"fc7c5d90b44fa5ba160c644f6c7f8918f5460a5842a517e3fd99ea94ba963594","integrity":"sha256-/HxdkLRPpboWDGRPbH+JGPVGClhCpRfj/ZnqlLqWNZQ="},"flags/1x1/jm-1b80b0d1f940a94945335aa2683e0195890c35f5bae24a3321c7752c5cdf8416.svg":{"logical_path":"flags/1x1/jm.svg","mtime":"2020-04-06T16:47:40+02:00","size":389,"digest":"1b80b0d1f940a94945335aa2683e0195890c35f5bae24a3321c7752c5cdf8416","integrity":"sha256-G4Cw0flAqUlFM1qiaD4BlYkMNfW64kozIcd1LFzfhBY="},"flags/4x3/jo-c3109f9f849f581918a4567768bd334506cb517bf8a3ed3afc8e670ae434af27.svg":{"logical_path":"flags/4x3/jo.svg","mtime":"2020-04-06T16:47:40+02:00","size":720,"digest":"c3109f9f849f581918a4567768bd334506cb517bf8a3ed3afc8e670ae434af27","integrity":"sha256-wxCfn4SfWBkYpFZ3aL0zRQbLUXv4o+06/I5nCuQ0ryc="},"flags/1x1/jo-e183a9aa500d7bbef58df474d4b1a0554e4c68e187c9803a68272cbbecd45118.svg":{"logical_path":"flags/1x1/jo.svg","mtime":"2020-04-06T16:47:40+02:00","size":691,"digest":"e183a9aa500d7bbef58df474d4b1a0554e4c68e187c9803a68272cbbecd45118","integrity":"sha256-4YOpqlANe771jfR01LGgVU5MaOGHyYA6aCcsu+zUURg="},"flags/4x3/jp-e759dccba5bc383814ab190daba0d12ef591ad9f161502a47222c2eacf770606.svg":{"logical_path":"flags/4x3/jp.svg","mtime":"2020-04-06T16:47:40+02:00","size":474,"digest":"e759dccba5bc383814ab190daba0d12ef591ad9f161502a47222c2eacf770606","integrity":"sha256-51ncy6W8ODgUqxkNq6DRLvWRrZ8WFQKkciLC6s93BgY="},"flags/1x1/jp-0573d020325a0795ebf2b83b6d604ecce164efc5c6e16c6fb4a48f124d2902d5.svg":{"logical_path":"flags/1x1/jp.svg","mtime":"2020-04-06T16:47:40+02:00","size":484,"digest":"0573d020325a0795ebf2b83b6d604ecce164efc5c6e16c6fb4a48f124d2902d5","integrity":"sha256-BXPQIDJaB5Xr8rg7bWBOzOFk78XG4WxvtKSPEk0pAtU="},"flags/4x3/ke-c6390bd1dead222763be7c93e10ce8d48ce550d2083d00b907504d01f3be8da8.svg":{"logical_path":"flags/4x3/ke.svg","mtime":"2020-04-06T16:47:40+02:00","size":1379,"digest":"c6390bd1dead222763be7c93e10ce8d48ce550d2083d00b907504d01f3be8da8","integrity":"sha256-xjkL0d6tIidjvnyT4Qzo1IzlUNIIPQC5B1BNAfO+jag="},"flags/1x1/ke-3cc6fb778db9f415d50e5651069719c7becdcb7cca53868586a287e024e26d8f.svg":{"logical_path":"flags/1x1/ke.svg","mtime":"2020-04-06T16:47:40+02:00","size":1485,"digest":"3cc6fb778db9f415d50e5651069719c7becdcb7cca53868586a287e024e26d8f","integrity":"sha256-PMb7d4259BXVDlZRBpcZx77Ny3zKU4aFhqKH4CTibY8="},"flags/4x3/kg-618432f0701371ef7260a11fde248179e49360f1acd1a0fd07c4efcd153f4721.svg":{"logical_path":"flags/4x3/kg.svg","mtime":"2020-04-06T16:47:40+02:00","size":3374,"digest":"618432f0701371ef7260a11fde248179e49360f1acd1a0fd07c4efcd153f4721","integrity":"sha256-YYQy8HATce9yYKEf3iSBeeSTYPGs0aD9B8TvzRU/RyE="},"flags/1x1/kg-059ee9448b06e00eee47ca8a059e608618ddcd7e2fbb949149ee0bd46836dd35.svg":{"logical_path":"flags/1x1/kg.svg","mtime":"2020-04-06T16:47:40+02:00","size":3316,"digest":"059ee9448b06e00eee47ca8a059e608618ddcd7e2fbb949149ee0bd46836dd35","integrity":"sha256-BZ7pRIsG4A7uR8qKBZ5ghhjdzX4vu5SRSe4L1Gg23TU="},"flags/4x3/kh-ec1e0984d167e8c6bfa026cfddd6048c64e9b3634a99c9a20db194f28f10b1a6.svg":{"logical_path":"flags/4x3/kh.svg","mtime":"2020-04-06T16:47:40+02:00","size":7261,"digest":"ec1e0984d167e8c6bfa026cfddd6048c64e9b3634a99c9a20db194f28f10b1a6","integrity":"sha256-7B4JhNFn6Ma/oCbP3dYEjGTps2NKmcmiDbGU8o8QsaY="},"flags/1x1/kh-16c097cc28b308b92d65e4ad3c025160256a36838bae538c0b1357f044788da3.svg":{"logical_path":"flags/1x1/kh.svg","mtime":"2020-04-06T16:47:40+02:00","size":7262,"digest":"16c097cc28b308b92d65e4ad3c025160256a36838bae538c0b1357f044788da3","integrity":"sha256-FsCXzCizCLktZeStPAJRYCVqNoOLrlOMCxNX8ER4jaM="},"flags/4x3/ki-591a87de7bbeb711663f6dcaad93e269108ca6ab9ccbcb653e84c9779e9d3e2d.svg":{"logical_path":"flags/4x3/ki.svg","mtime":"2020-04-06T16:47:40+02:00","size":5813,"digest":"591a87de7bbeb711663f6dcaad93e269108ca6ab9ccbcb653e84c9779e9d3e2d","integrity":"sha256-WRqH3nu+txFmP23KrZPiaRCMpqucy8tlPoTJd56dPi0="},"flags/1x1/ki-210537cc2766114f72f9f838c5dc138a18c3f49e78575f7b1d699873061b0315.svg":{"logical_path":"flags/1x1/ki.svg","mtime":"2020-04-06T16:47:40+02:00","size":5941,"digest":"210537cc2766114f72f9f838c5dc138a18c3f49e78575f7b1d699873061b0315","integrity":"sha256-IQU3zCdmEU9y+fg4xdwTihjD9J54V197HWmYcwYbAxU="},"flags/4x3/km-f6cd3ead925661739946379d122420dfd0287b6332e25ecefc5e8a97adefdb0f.svg":{"logical_path":"flags/4x3/km.svg","mtime":"2020-04-06T16:47:40+02:00","size":1064,"digest":"f6cd3ead925661739946379d122420dfd0287b6332e25ecefc5e8a97adefdb0f","integrity":"sha256-9s0+rZJWYXOZRjedEiQg39Aoe2My4l7O/F6Kl63v2w8="},"flags/1x1/km-a6a467329036e9963b7aca186e74b5affd615663ad9802807a64c04aa79a5f19.svg":{"logical_path":"flags/1x1/km.svg","mtime":"2020-04-06T16:47:40+02:00","size":1037,"digest":"a6a467329036e9963b7aca186e74b5affd615663ad9802807a64c04aa79a5f19","integrity":"sha256-pqRnMpA26ZY7esoYbnS1r/1hVmOtmAKAemTASqeaXxk="},"flags/4x3/kn-d0f010da3fc35e1b9b520e8c063eaf9a650c16a0dd6507928cbf013a04508924.svg":{"logical_path":"flags/4x3/kn.svg","mtime":"2020-04-06T16:47:40+02:00","size":819,"digest":"d0f010da3fc35e1b9b520e8c063eaf9a650c16a0dd6507928cbf013a04508924","integrity":"sha256-0PAQ2j/DXhubUg6MBj6vmmUMFqDdZQeSjL8BOgRQiSQ="},"flags/1x1/kn-ae4abba1402d60d25f380c8aa7dd081e7efc1349733b36ffbc7e61b951b54363.svg":{"logical_path":"flags/1x1/kn.svg","mtime":"2020-04-06T16:47:40+02:00","size":817,"digest":"ae4abba1402d60d25f380c8aa7dd081e7efc1349733b36ffbc7e61b951b54363","integrity":"sha256-rkq7oUAtYNJfOAyKp90IHn78E0lzOzb/vH5huVG1Q2M="},"flags/4x3/kp-8d34a3fd7d34c53ce01854e2b1e69c71fd6b0c65dda1b8aa90f2935a551b8f79.svg":{"logical_path":"flags/4x3/kp.svg","mtime":"2020-04-06T16:47:40+02:00","size":795,"digest":"8d34a3fd7d34c53ce01854e2b1e69c71fd6b0c65dda1b8aa90f2935a551b8f79","integrity":"sha256-jTSj/X00xTzgGFTiseaccf1rDGXdobiqkPKTWlUbj3k="},"flags/1x1/kp-d0cb440831181be36d7ea60f5adff5bb1dae7d8ab06738a920ab994ad42652cc.svg":{"logical_path":"flags/1x1/kp.svg","mtime":"2020-04-06T16:47:40+02:00","size":852,"digest":"d0cb440831181be36d7ea60f5adff5bb1dae7d8ab06738a920ab994ad42652cc","integrity":"sha256-0MtECDEYG+NtfqYPWt/1ux2ufYqwZzipIKuZStQmUsw="},"flags/4x3/kr-3162c67e01704d06fd77d78fefeb5937fee5f4ee326d369da13a5b25b75db16a.svg":{"logical_path":"flags/4x3/kr.svg","mtime":"2020-04-06T16:47:40+02:00","size":1822,"digest":"3162c67e01704d06fd77d78fefeb5937fee5f4ee326d369da13a5b25b75db16a","integrity":"sha256-MWLGfgFwTQb9d9eP7+tZN/7l9O4ybTadoTpbJbddsWo="},"flags/1x1/kr-3f72f5b1c788ac2bc2d7e3680f25f55692dff661e0dc3819bb78cd711f152d76.svg":{"logical_path":"flags/1x1/kr.svg","mtime":"2020-04-06T16:47:40+02:00","size":1719,"digest":"3f72f5b1c788ac2bc2d7e3680f25f55692dff661e0dc3819bb78cd711f152d76","integrity":"sha256-P3L1sceIrCvC1+NoDyX1VpLf9mHg3DgZu3jNcR8VLXY="},"flags/4x3/kw-ac538e6cbafc0a94611bb9c653df3056cfa3303faff143308aa5680178e34f71.svg":{"logical_path":"flags/4x3/kw.svg","mtime":"2020-04-06T16:47:40+02:00","size":509,"digest":"ac538e6cbafc0a94611bb9c653df3056cfa3303faff143308aa5680178e34f71","integrity":"sha256-rFOObLr8CpRhG7nGU98wVs+jMD+v8UMwiqVoAXjjT3E="},"flags/1x1/kw-c874c334dca89cb394b3534eb2eb5ed408293d32052e9179fc75832191b5759e.svg":{"logical_path":"flags/1x1/kw.svg","mtime":"2020-04-06T16:47:40+02:00","size":507,"digest":"c874c334dca89cb394b3534eb2eb5ed408293d32052e9179fc75832191b5759e","integrity":"sha256-yHTDNNyonLOUs1NOsute1AgpPTIFLpF5/HWDIZG1dZ4="},"flags/4x3/ky-fcecffb01a890f01464e6067e5593099b9919746443d16c69c7e223e13be50ef.svg":{"logical_path":"flags/4x3/ky.svg","mtime":"2020-04-06T16:47:40+02:00","size":21724,"digest":"fcecffb01a890f01464e6067e5593099b9919746443d16c69c7e223e13be50ef","integrity":"sha256-/Oz/sBqJDwFGTmBn5VkwmbmRl0ZEPRbGnH4iPhO+UO8="},"flags/1x1/ky-707d019e77714b8dee2074bbd17aaac157d2de0991a8d4c8472a038403c5471f.svg":{"logical_path":"flags/1x1/ky.svg","mtime":"2020-04-06T16:47:40+02:00","size":22357,"digest":"707d019e77714b8dee2074bbd17aaac157d2de0991a8d4c8472a038403c5471f","integrity":"sha256-cH0BnndxS43uIHS70XqqwVfS3gmRqNTIRyoDhAPFRx8="},"flags/4x3/kz-8214283b99e5781396996fdfd84c551ea7ac15a248465ccbb9358b13373d802a.svg":{"logical_path":"flags/4x3/kz.svg","mtime":"2020-04-06T16:47:40+02:00","size":11327,"digest":"8214283b99e5781396996fdfd84c551ea7ac15a248465ccbb9358b13373d802a","integrity":"sha256-ghQoO5nleBOWmW/f2ExVHqesFaJIRlzLuTWLEzc9gCo="},"flags/1x1/kz-af4496d258a36c41ce92d7713c7206e2e92ac6037c6dcdac687ba815e74a4f49.svg":{"logical_path":"flags/1x1/kz.svg","mtime":"2020-04-06T16:47:40+02:00","size":11415,"digest":"af4496d258a36c41ce92d7713c7206e2e92ac6037c6dcdac687ba815e74a4f49","integrity":"sha256-r0SW0lijbEHOktdxPHIG4ukqxgN8bc2saHuoFedKT0k="},"flags/4x3/la-1f70bf3805542fff3addba9e2148d541cb30b125c692a8c7e0868cf4c7dea409.svg":{"logical_path":"flags/4x3/la.svg","mtime":"2020-04-06T16:47:40+02:00","size":457,"digest":"1f70bf3805542fff3addba9e2148d541cb30b125c692a8c7e0868cf4c7dea409","integrity":"sha256-H3C/OAVUL/863bqeIUjVQcswsSXGkqjH4IaM9MfepAk="},"flags/1x1/la-dafd3a0212ab43c02323bd5bb6fb1b4378a96e05cd352c354f6f4863a3f43f6d.svg":{"logical_path":"flags/1x1/la.svg","mtime":"2020-04-06T16:47:40+02:00","size":501,"digest":"dafd3a0212ab43c02323bd5bb6fb1b4378a96e05cd352c354f6f4863a3f43f6d","integrity":"sha256-2v06AhKrQ8AjI71btvsbQ3ipbgXNNSw1T29IY6P0P20="},"flags/4x3/lb-80a2aaa6b4ad4e44ad197ccdb7defba58af6ff0ab0692817804de12ff594bc8e.svg":{"logical_path":"flags/4x3/lb.svg","mtime":"2020-04-06T16:47:40+02:00","size":2816,"digest":"80a2aaa6b4ad4e44ad197ccdb7defba58af6ff0ab0692817804de12ff594bc8e","integrity":"sha256-gKKqprStTkStGXzNt977pYr2/wqwaSgXgE3hL/WUvI4="},"flags/1x1/lb-5da3263f37d0e740a94283824f5f0ad6c3ceed6f12dbe108fce0ddd760418373.svg":{"logical_path":"flags/1x1/lb.svg","mtime":"2020-04-06T16:47:40+02:00","size":2747,"digest":"5da3263f37d0e740a94283824f5f0ad6c3ceed6f12dbe108fce0ddd760418373","integrity":"sha256-XaMmPzfQ50CpQoOCT18K1sPO7W8S2+EI/ODd12BBg3M="},"flags/4x3/lc-6f18658956e6da5c5bf468181b465a33c33045134dfb327d35a9b6ea6c56d23e.svg":{"logical_path":"flags/4x3/lc.svg","mtime":"2020-04-06T16:47:40+02:00","size":370,"digest":"6f18658956e6da5c5bf468181b465a33c33045134dfb327d35a9b6ea6c56d23e","integrity":"sha256-bxhliVbm2lxb9GgYG0ZaM8MwRRNN+zJ9Nam26mxW0j4="},"flags/1x1/lc-c4afe17342a7894f5dc7eed56716e9149378561a12c2bbd88d4c0bf740087c38.svg":{"logical_path":"flags/1x1/lc.svg","mtime":"2020-04-06T16:47:40+02:00","size":370,"digest":"c4afe17342a7894f5dc7eed56716e9149378561a12c2bbd88d4c0bf740087c38","integrity":"sha256-xK/hc0KniU9dx+7VZxbpFJN4VhoSwrvYjUwL90AIfDg="},"flags/4x3/li-c97f90de5ee09d5594f9d3154e7eae0158a8f922e394c3ad24502a9274dd68fb.svg":{"logical_path":"flags/4x3/li.svg","mtime":"2020-04-06T16:47:40+02:00","size":8268,"digest":"c97f90de5ee09d5594f9d3154e7eae0158a8f922e394c3ad24502a9274dd68fb","integrity":"sha256-yX+Q3l7gnVWU+dMVTn6uAVio+SLjlMOtJFAqknTdaPs="},"flags/1x1/li-956ad50772021978069fde52a08f25b6fe310b0019ccabe8acd274099fb21ad5.svg":{"logical_path":"flags/1x1/li.svg","mtime":"2020-04-06T16:47:40+02:00","size":8291,"digest":"956ad50772021978069fde52a08f25b6fe310b0019ccabe8acd274099fb21ad5","integrity":"sha256-lWrVB3ICGXgGn95SoI8ltv4xCwAZzKvorNJ0CZ+yGtU="},"flags/4x3/lk-599de52b1450460f083ac0654eb4e833c06b809903c7ce11cbe202005e3f080e.svg":{"logical_path":"flags/4x3/lk.svg","mtime":"2020-04-06T16:47:40+02:00","size":11242,"digest":"599de52b1450460f083ac0654eb4e833c06b809903c7ce11cbe202005e3f080e","integrity":"sha256-WZ3lKxRQRg8IOsBlTrToM8BrgJkDx84Ry+ICAF4/CA4="},"flags/1x1/lk-379d62d2296d30d484a1c0469582d3a95736284bcdbc58e9d6bcb4f648836d1d.svg":{"logical_path":"flags/1x1/lk.svg","mtime":"2020-04-06T16:47:40+02:00","size":11254,"digest":"379d62d2296d30d484a1c0469582d3a95736284bcdbc58e9d6bcb4f648836d1d","integrity":"sha256-N51i0iltMNSEocBGlYLTqVc2KEvNvFjp1ry09kiDbR0="},"flags/4x3/lr-66c008c2d58e2b50772ad95a30801a9b62566d5f3ac8ec1ea1ad41aaadc0f4c7.svg":{"logical_path":"flags/4x3/lr.svg","mtime":"2020-04-06T16:47:40+02:00","size":727,"digest":"66c008c2d58e2b50772ad95a30801a9b62566d5f3ac8ec1ea1ad41aaadc0f4c7","integrity":"sha256-ZsAIwtWOK1B3KtlaMIAam2JWbV86yOweoa1Bqq3A9Mc="},"flags/1x1/lr-371f542a58fe7e4a3c67dc92f92009757337ba428a368af4e077a4cccac652e6.svg":{"logical_path":"flags/1x1/lr.svg","mtime":"2020-04-06T16:47:40+02:00","size":694,"digest":"371f542a58fe7e4a3c67dc92f92009757337ba428a368af4e077a4cccac652e6","integrity":"sha256-Nx9UKlj+fko8Z9yS+SAJdXM3ukKKNor04HekzMrGUuY="},"flags/4x3/ls-285534456c1acd523d23e09220799faf851218c1b2d8015b0bb557910ca1b9e4.svg":{"logical_path":"flags/4x3/ls.svg","mtime":"2020-04-06T16:47:40+02:00","size":1219,"digest":"285534456c1acd523d23e09220799faf851218c1b2d8015b0bb557910ca1b9e4","integrity":"sha256-KFU0RWwazVI9I+CSIHmfr4USGMGy2AFbC7VXkQyhueQ="},"flags/1x1/ls-80ad805e34b571d758604e2b1b735fe2c0f38dc1593c11c7d9a987e89f8fc6aa.svg":{"logical_path":"flags/1x1/ls.svg","mtime":"2020-04-06T16:47:40+02:00","size":1242,"digest":"80ad805e34b571d758604e2b1b735fe2c0f38dc1593c11c7d9a987e89f8fc6aa","integrity":"sha256-gK2AXjS1cddYYE4rG3Nf4sDzjcFZPBHH2amH6J+Pxqo="},"flags/4x3/lt-9012691cb1689944fd0813b33b7a58fb97921944ec8988f23590fed21a1ff07c.svg":{"logical_path":"flags/4x3/lt.svg","mtime":"2020-04-06T16:47:40+02:00","size":442,"digest":"9012691cb1689944fd0813b33b7a58fb97921944ec8988f23590fed21a1ff07c","integrity":"sha256-kBJpHLFomUT9CBOzO3pY+5eSGUTsiYjyNZD+0hof8Hw="},"flags/1x1/lt-74f423c6210d7dc76867b1f620d0d15644db5c39b9e4197805ad20504d271f08.svg":{"logical_path":"flags/1x1/lt.svg","mtime":"2020-04-06T16:47:40+02:00","size":442,"digest":"74f423c6210d7dc76867b1f620d0d15644db5c39b9e4197805ad20504d271f08","integrity":"sha256-dPQjxiENfcdoZ7H2INDRVkTbXDm55Bl4Ba0gUE0nHwg="},"flags/4x3/lu-4622624d698a9577a3fb92bd4fa5f98f305d704bc51306b86d109c6c865d069a.svg":{"logical_path":"flags/4x3/lu.svg","mtime":"2020-04-06T16:47:40+02:00","size":228,"digest":"4622624d698a9577a3fb92bd4fa5f98f305d704bc51306b86d109c6c865d069a","integrity":"sha256-RiJiTWmKlXej+5K9T6X5jzBdcEvFEwa4bRCcbIZdBpo="},"flags/1x1/lu-67ceb25fba1fc6a2c3836cef4033fad77752db08bcbc88fa7622b22a5f6ada2e.svg":{"logical_path":"flags/1x1/lu.svg","mtime":"2020-04-06T16:47:40+02:00","size":232,"digest":"67ceb25fba1fc6a2c3836cef4033fad77752db08bcbc88fa7622b22a5f6ada2e","integrity":"sha256-Z86yX7ofxqLDg2zvQDP613dS2wi8vIj6diKyKl9q2i4="},"flags/4x3/lv-dc67526a1833d2cd7c50d87f0da252e1fa2b361d7d418715535d3aa63e5a76b7.svg":{"logical_path":"flags/4x3/lv.svg","mtime":"2020-04-06T16:47:40+02:00","size":233,"digest":"dc67526a1833d2cd7c50d87f0da252e1fa2b361d7d418715535d3aa63e5a76b7","integrity":"sha256-3GdSahgz0s18UNh/DaJS4forNh19QYcVU106pj5adrc="},"flags/1x1/lv-23e2589c8a374ecf955772e01a4b6a7302133346737279eac1e8214b68bb0308.svg":{"logical_path":"flags/1x1/lv.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"23e2589c8a374ecf955772e01a4b6a7302133346737279eac1e8214b68bb0308","integrity":"sha256-I+JYnIo3Ts+VV3LgGktqcwITM0ZzcnnqweghS2i7Awg="},"flags/4x3/ly-3ad0387cfe11942e1f55114d49e6083185afde3528d2b05885160bdd043ff470.svg":{"logical_path":"flags/4x3/ly.svg","mtime":"2020-04-06T16:47:40+02:00","size":533,"digest":"3ad0387cfe11942e1f55114d49e6083185afde3528d2b05885160bdd043ff470","integrity":"sha256-OtA4fP4RlC4fVRFNSeYIMYWv3jUo0rBYhRYL3QQ/9HA="},"flags/1x1/ly-5139e7519b7c833dfca645e2e7424517489927cb9facc6f0dff3d80b72d1e59d.svg":{"logical_path":"flags/1x1/ly.svg","mtime":"2020-04-06T16:47:40+02:00","size":526,"digest":"5139e7519b7c833dfca645e2e7424517489927cb9facc6f0dff3d80b72d1e59d","integrity":"sha256-UTnnUZt8gz38pkXi50JFF0iZJ8ufrMbw3/PYC3LR5Z0="},"flags/4x3/ma-f40a79d79c88c1bb927ec0e40c5d044f838f0a2c48d820b3e8449e92a71d02d6.svg":{"logical_path":"flags/4x3/ma.svg","mtime":"2020-04-06T16:47:40+02:00","size":250,"digest":"f40a79d79c88c1bb927ec0e40c5d044f838f0a2c48d820b3e8449e92a71d02d6","integrity":"sha256-9Ap515yIwbuSfsDkDF0ET4OPCixI2CCz6ESekqcdAtY="},"flags/1x1/ma-3190fa17944b136ba27880e354cf385a1d7f6af076859fd8e3a25b30eaded302.svg":{"logical_path":"flags/1x1/ma.svg","mtime":"2020-04-06T16:47:40+02:00","size":250,"digest":"3190fa17944b136ba27880e354cf385a1d7f6af076859fd8e3a25b30eaded302","integrity":"sha256-MZD6F5RLE2uieIDjVM84Wh1/avB2hZ/Y46JbMOre0wI="},"flags/4x3/mc-65c30fed3b3ade292a366ca3cea6155962e94a13944fd62e73706a7f872253ec.svg":{"logical_path":"flags/4x3/mc.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"65c30fed3b3ade292a366ca3cea6155962e94a13944fd62e73706a7f872253ec","integrity":"sha256-ZcMP7Ts63ikqNmyjzqYVWWLpShOUT9Yuc3Bqf4ciU+w="},"flags/1x1/mc-83f9d4ff92513bfe22f55c5df31e600c77893660b9b3c000efad29ea4f6c32ad.svg":{"logical_path":"flags/1x1/mc.svg","mtime":"2020-04-06T16:47:40+02:00","size":237,"digest":"83f9d4ff92513bfe22f55c5df31e600c77893660b9b3c000efad29ea4f6c32ad","integrity":"sha256-g/nU/5JRO/4i9Vxd8x5gDHeJNmC5s8AA760p6k9sMq0="},"flags/4x3/md-92475a7045515ebb11c2127a896010934a569a7d16adc4a702d41adf4565d440.svg":{"logical_path":"flags/4x3/md.svg","mtime":"2020-04-06T16:47:40+02:00","size":11237,"digest":"92475a7045515ebb11c2127a896010934a569a7d16adc4a702d41adf4565d440","integrity":"sha256-kkdacEVRXrsRwhJ6iWAQk0pWmn0WrcSnAtQa30Vl1EA="},"flags/1x1/md-af363b1645da518014f81a5670419b70adc6fc09b1c32def53145c26d5fc256f.svg":{"logical_path":"flags/1x1/md.svg","mtime":"2020-04-06T16:47:40+02:00","size":11337,"digest":"af363b1645da518014f81a5670419b70adc6fc09b1c32def53145c26d5fc256f","integrity":"sha256-rzY7FkXaUYAU+BpWcEGbcK3G/Amxwy3vUxRcJtX8JW8="},"flags/4x3/me-29052367756da76b9ddcc3a71a17dc15cc39a7d387cb381fc5daad5880cd1895.svg":{"logical_path":"flags/4x3/me.svg","mtime":"2020-04-06T16:47:40+02:00","size":62373,"digest":"29052367756da76b9ddcc3a71a17dc15cc39a7d387cb381fc5daad5880cd1895","integrity":"sha256-KQUjZ3Vtp2ud3MOnGhfcFcw5p9OHyzgfxdqtWIDNGJU="},"flags/1x1/me-551e531eae9f601ce16f204217b0dea54396c8e689dd2792667e1c4fdd239367.svg":{"logical_path":"flags/1x1/me.svg","mtime":"2020-04-06T16:47:40+02:00","size":63354,"digest":"551e531eae9f601ce16f204217b0dea54396c8e689dd2792667e1c4fdd239367","integrity":"sha256-VR5THq6fYBzhbyBCF7DepUOWyOaJ3SeSZn4cT90jk2c="},"flags/4x3/mf-a07c29d68d55c8c614265e1bfc1ec179073e983f9d30a1a361310d68d2e30fa5.svg":{"logical_path":"flags/4x3/mf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"a07c29d68d55c8c614265e1bfc1ec179073e983f9d30a1a361310d68d2e30fa5","integrity":"sha256-oHwp1o1VyMYUJl4b/B7BeQc+mD+dMKGjYTENaNLjD6U="},"flags/1x1/mf-bf59a29b95c033e21fc58c30f4369db5d0312954389ab46c0e3d14b17dbd8b4e.svg":{"logical_path":"flags/1x1/mf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"bf59a29b95c033e21fc58c30f4369db5d0312954389ab46c0e3d14b17dbd8b4e","integrity":"sha256-v1mim5XAM+IfxYww9DadtdAxKVQ4mrRsDj0UsX29i04="},"flags/4x3/mg-9e1ecee816ab8ef6441e6bb5a6d14c4238f074fcbc278a4ffa6168809669e586.svg":{"logical_path":"flags/4x3/mg.svg","mtime":"2020-04-06T16:47:40+02:00","size":302,"digest":"9e1ecee816ab8ef6441e6bb5a6d14c4238f074fcbc278a4ffa6168809669e586","integrity":"sha256-nh7O6BarjvZEHmu1ptFMQjjwdPy8J4pP+mFogJZp5YY="},"flags/1x1/mg-e87135a47b177787871c8e7a341fe3b4f89843d33025affd16c2cf89bcfaac56.svg":{"logical_path":"flags/1x1/mg.svg","mtime":"2020-04-06T16:47:40+02:00","size":302,"digest":"e87135a47b177787871c8e7a341fe3b4f89843d33025affd16c2cf89bcfaac56","integrity":"sha256-6HE1pHsXd4eHHI56NB/jtPiYQ9MwJa/9FsLPibz6rFY="},"flags/4x3/mh-4785fd6418f936a2702773e3e131f282067da3d8d406c4c31d0d1bcbfc638af7.svg":{"logical_path":"flags/4x3/mh.svg","mtime":"2020-04-06T16:47:40+02:00","size":741,"digest":"4785fd6418f936a2702773e3e131f282067da3d8d406c4c31d0d1bcbfc638af7","integrity":"sha256-R4X9ZBj5NqJwJ3Pj4THyggZ9o9jUBsTDHQ0by/xjivc="},"flags/1x1/mh-ab6f55130abfca1e85a6818f74ea0f262e9327fb99f75868aae2bd2b83aef6aa.svg":{"logical_path":"flags/1x1/mh.svg","mtime":"2020-04-06T16:47:40+02:00","size":763,"digest":"ab6f55130abfca1e85a6818f74ea0f262e9327fb99f75868aae2bd2b83aef6aa","integrity":"sha256-q29VEwq/yh6FpoGPdOoPJi6TJ/uZ91hoquK9K4Ou9qo="},"flags/4x3/mk-3c7035086a33b244188bfc3ad050eb100aab771dfe39dd82c619ae6cd103af4c.svg":{"logical_path":"flags/4x3/mk.svg","mtime":"2020-04-06T16:47:40+02:00","size":382,"digest":"3c7035086a33b244188bfc3ad050eb100aab771dfe39dd82c619ae6cd103af4c","integrity":"sha256-PHA1CGozskQYi/w60FDrEAqrdx3+Od2CxhmubNEDr0w="},"flags/1x1/mk-ebcd71d69e1fad32c0acbd1c9887945069b1f75ea52ef857e2e26e8927a7d98d.svg":{"logical_path":"flags/1x1/mk.svg","mtime":"2020-04-06T16:47:40+02:00","size":410,"digest":"ebcd71d69e1fad32c0acbd1c9887945069b1f75ea52ef857e2e26e8927a7d98d","integrity":"sha256-681x1p4frTLArL0cmIeUUGmx916lLvhX4uJuiSen2Y0="},"flags/4x3/ml-e8326589ad95d63b2856367db0b6343479eb591d116bc7e7a2c15e7d422e8dca.svg":{"logical_path":"flags/4x3/ml.svg","mtime":"2020-04-06T16:47:40+02:00","size":276,"digest":"e8326589ad95d63b2856367db0b6343479eb591d116bc7e7a2c15e7d422e8dca","integrity":"sha256-6DJlia2V1jsoVjZ9sLY0NHnrWR0Ra8fnosFefUIujco="},"flags/1x1/ml-0f990fac6a324676dad90acd1f8e5cf8e660bd62f978ee44acedefaccc226b7a.svg":{"logical_path":"flags/1x1/ml.svg","mtime":"2020-04-06T16:47:40+02:00","size":279,"digest":"0f990fac6a324676dad90acd1f8e5cf8e660bd62f978ee44acedefaccc226b7a","integrity":"sha256-D5kPrGoyRnba2QrNH45c+OZgvWL5eO5ErO3vrMwia3o="},"flags/4x3/mm-f7ef4a34cf98d96f557d0a7020f178154b730129be4c2b5f8425b825665875c1.svg":{"logical_path":"flags/4x3/mm.svg","mtime":"2020-04-06T16:47:40+02:00","size":848,"digest":"f7ef4a34cf98d96f557d0a7020f178154b730129be4c2b5f8425b825665875c1","integrity":"sha256-9+9KNM+Y2W9VfQpwIPF4FUtzASm+TCtfhCW4JWZYdcE="},"flags/1x1/mm-f4df9e4b3a4df8d9ee464504a1f88cdc0ea08d9923c8c7b3099ec8eabbf4258b.svg":{"logical_path":"flags/1x1/mm.svg","mtime":"2020-04-06T16:47:40+02:00","size":865,"digest":"f4df9e4b3a4df8d9ee464504a1f88cdc0ea08d9923c8c7b3099ec8eabbf4258b","integrity":"sha256-9N+eSzpN+NnuRkUEofiM3A6gjZkjyMezCZ7I6rv0JYs="},"flags/4x3/mn-00649cb56bad07f8d34472e881fbe370a46879416fcba8dfc655f6eeed0056a3.svg":{"logical_path":"flags/4x3/mn.svg","mtime":"2020-04-06T16:47:40+02:00","size":1245,"digest":"00649cb56bad07f8d34472e881fbe370a46879416fcba8dfc655f6eeed0056a3","integrity":"sha256-AGSctWutB/jTRHLogfvjcKRoeUFvy6jfxlX27u0AVqM="},"flags/1x1/mn-ff5ea681d66e1a88ff8584dfc7fb20e8ed282b218bf9cc06518b1df90f3f99c7.svg":{"logical_path":"flags/1x1/mn.svg","mtime":"2020-04-06T16:47:40+02:00","size":1251,"digest":"ff5ea681d66e1a88ff8584dfc7fb20e8ed282b218bf9cc06518b1df90f3f99c7","integrity":"sha256-/16mgdZuGoj/hYTfx/sg6O0oKyGL+cwGUYsd+Q8/mcc="},"flags/4x3/mo-62610131201312d4268197556e2952932ee4cde22ce876668722cc332b83989e.svg":{"logical_path":"flags/4x3/mo.svg","mtime":"2020-04-06T16:47:40+02:00","size":1461,"digest":"62610131201312d4268197556e2952932ee4cde22ce876668722cc332b83989e","integrity":"sha256-YmEBMSATEtQmgZdVbilSky7kzeIs6HZmhyLMMyuDmJ4="},"flags/1x1/mo-8eaad37d10c6db6035b0d4a74c33015539f2c78cd655e0ce4e1aa4b04f3ce36a.svg":{"logical_path":"flags/1x1/mo.svg","mtime":"2020-04-06T16:47:40+02:00","size":1495,"digest":"8eaad37d10c6db6035b0d4a74c33015539f2c78cd655e0ce4e1aa4b04f3ce36a","integrity":"sha256-jqrTfRDG22A1sNSnTDMBVTnyx4zWVeDOThqksE8842o="},"flags/4x3/mp-2e4af783bec6f474fc03275a7dc048a146d28ad3da615d65e6eb6d930c0054ef.svg":{"logical_path":"flags/4x3/mp.svg","mtime":"2020-04-06T16:47:40+02:00","size":23398,"digest":"2e4af783bec6f474fc03275a7dc048a146d28ad3da615d65e6eb6d930c0054ef","integrity":"sha256-Lkr3g77G9HT8AydafcBIoUbSitPaYV1l5uttkwwAVO8="},"flags/1x1/mp-9b89316de0a803f61b8a4e842483db37436cc9e53911d6e2f59b53dfa422d563.svg":{"logical_path":"flags/1x1/mp.svg","mtime":"2020-04-06T16:47:40+02:00","size":23628,"digest":"9b89316de0a803f61b8a4e842483db37436cc9e53911d6e2f59b53dfa422d563","integrity":"sha256-m4kxbeCoA/Ybik6EJIPbN0NsyeU5Edbi9ZtT36Qi1WM="},"flags/4x3/mq-297d268a5e967f7d34c91aa4513f86ec67b2efcef6df294a7846a554d73f22d9.svg":{"logical_path":"flags/4x3/mq.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"297d268a5e967f7d34c91aa4513f86ec67b2efcef6df294a7846a554d73f22d9","integrity":"sha256-KX0mil6Wf300yRqkUT+G7Gey78723ylKeEalVNc/Itk="},"flags/1x1/mq-0e466f6d604a1134afaa8fcced93845bd17be04debfd302d70964a806532f093.svg":{"logical_path":"flags/1x1/mq.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"0e466f6d604a1134afaa8fcced93845bd17be04debfd302d70964a806532f093","integrity":"sha256-DkZvbWBKETSvqo/M7ZOEW9F74E3r/TAtcJZKgGUy8JM="},"flags/4x3/mr-e41908b9de58fe9479e9a2e2a5bc0074ca1013cc247f2b1410568e8babe4ebfe.svg":{"logical_path":"flags/4x3/mr.svg","mtime":"2020-04-06T16:47:40+02:00","size":442,"digest":"e41908b9de58fe9479e9a2e2a5bc0074ca1013cc247f2b1410568e8babe4ebfe","integrity":"sha256-5BkIud5Y/pR56aLipbwAdMoQE8wkfysUEFaOi6vk6/4="},"flags/1x1/mr-fa0266040f7fa99236c10e36bd23ad92a558fdd79d250a23076733ae2aade799.svg":{"logical_path":"flags/1x1/mr.svg","mtime":"2020-04-06T16:47:40+02:00","size":431,"digest":"fa0266040f7fa99236c10e36bd23ad92a558fdd79d250a23076733ae2aade799","integrity":"sha256-+gJmBA9/qZI2wQ42vSOtkqVY/dedJQojB2czriqt55k="},"flags/4x3/ms-c2c0dfeea4a1f46dfb510afc8a97e99cc5a91d89851e97e4edd48f10d10eb262.svg":{"logical_path":"flags/4x3/ms.svg","mtime":"2020-04-06T16:47:40+02:00","size":9279,"digest":"c2c0dfeea4a1f46dfb510afc8a97e99cc5a91d89851e97e4edd48f10d10eb262","integrity":"sha256-wsDf7qSh9G37UQr8ipfpnMWpHYmFHpfk7dSPENEOsmI="},"flags/1x1/ms-c1ba27711118135b0d694151a37e397e71ae19470cd2fb7bb21ccb8178f4be43.svg":{"logical_path":"flags/1x1/ms.svg","mtime":"2020-04-06T16:47:40+02:00","size":12140,"digest":"c1ba27711118135b0d694151a37e397e71ae19470cd2fb7bb21ccb8178f4be43","integrity":"sha256-wboncREYE1sNaUFRo345fnGuGUcM0vt7shzLgXj0vkM="},"flags/4x3/mt-fd6a6cbf958e7d3b88070ded68716b2b85bc130acf68e3b0bbab05361dbab47d.svg":{"logical_path":"flags/4x3/mt.svg","mtime":"2020-04-06T16:47:40+02:00","size":8733,"digest":"fd6a6cbf958e7d3b88070ded68716b2b85bc130acf68e3b0bbab05361dbab47d","integrity":"sha256-/Wpsv5WOfTuIBw3taHFrK4W8EwrPaOOwu6sFNh26tH0="},"flags/1x1/mt-b841b8cd3c568b0638ab7fd12e8dcf24f09f1b6bbf7942a28c52212ac465d100.svg":{"logical_path":"flags/1x1/mt.svg","mtime":"2020-04-06T16:47:40+02:00","size":10422,"digest":"b841b8cd3c568b0638ab7fd12e8dcf24f09f1b6bbf7942a28c52212ac465d100","integrity":"sha256-uEG4zTxWiwY4q3/RLo3PJPCfG2u/eUKijFIhKsRl0QA="},"flags/4x3/mu-e3ce67e697fb6b33a39726379574752eef57b121d6f60d160e6bc7d7ed8f5ae6.svg":{"logical_path":"flags/4x3/mu.svg","mtime":"2020-04-06T16:47:40+02:00","size":319,"digest":"e3ce67e697fb6b33a39726379574752eef57b121d6f60d160e6bc7d7ed8f5ae6","integrity":"sha256-485n5pf7azOjlyY3lXR1Lu9XsSHW9g0WDmvH1+2PWuY="},"flags/1x1/mu-9e4e19a678ac8b84eb14740be948a7dea035b5c0623639ba6e06e242359aa1bb.svg":{"logical_path":"flags/1x1/mu.svg","mtime":"2020-04-06T16:47:40+02:00","size":319,"digest":"9e4e19a678ac8b84eb14740be948a7dea035b5c0623639ba6e06e242359aa1bb","integrity":"sha256-nk4Zpnisi4TrFHQL6Uin3qA1tcBiNjm6bgbiQjWaobs="},"flags/4x3/mv-0f9b86efb7f8d66d28223ff592232812cfd2d2567db83ef96bf783ea3154eb8d.svg":{"logical_path":"flags/4x3/mv.svg","mtime":"2020-04-06T16:47:40+02:00","size":289,"digest":"0f9b86efb7f8d66d28223ff592232812cfd2d2567db83ef96bf783ea3154eb8d","integrity":"sha256-D5uG77f41m0oIj/1kiMoEs/S0lZ9uD75a/eD6jFU640="},"flags/1x1/mv-57323390cdd79b28e658b6089304469012536c57101787020701ed91518848da.svg":{"logical_path":"flags/1x1/mv.svg","mtime":"2020-04-06T16:47:40+02:00","size":307,"digest":"57323390cdd79b28e658b6089304469012536c57101787020701ed91518848da","integrity":"sha256-VzIzkM3XmyjmWLYIkwRGkBJTbFcQF4cCBwHtkVGISNo="},"flags/4x3/mw-c2c93e168527ec8bda2799854370dfacafcb491f39d6083900d903244c00cc4b.svg":{"logical_path":"flags/4x3/mw.svg","mtime":"2020-04-06T16:47:40+02:00","size":3652,"digest":"c2c93e168527ec8bda2799854370dfacafcb491f39d6083900d903244c00cc4b","integrity":"sha256-wsk+FoUn7IvaJ5mFQ3DfrK/LSR851gg5ANkDJEwAzEs="},"flags/1x1/mw-5baad15595dcd8c0822e2bb9581efd027ac23ce10efa4202f3b5f566819080a0.svg":{"logical_path":"flags/1x1/mw.svg","mtime":"2020-04-06T16:47:40+02:00","size":3797,"digest":"5baad15595dcd8c0822e2bb9581efd027ac23ce10efa4202f3b5f566819080a0","integrity":"sha256-W6rRVZXc2MCCLiu5WB79AnrCPOEO+kIC87X1ZoGQgKA="},"flags/4x3/mx-8258503043a0a3b6fc68ef1af0025ef0de85fa482fb77e8ba220c3cd6a7a86a7.svg":{"logical_path":"flags/4x3/mx.svg","mtime":"2020-04-06T16:47:40+02:00","size":94979,"digest":"8258503043a0a3b6fc68ef1af0025ef0de85fa482fb77e8ba220c3cd6a7a86a7","integrity":"sha256-glhQMEOgo7b8aO8a8AJe8N6F+kgvt36LoiDDzWp6hqc="},"flags/1x1/mx-b67b689c0045cb4e8a4d5a439adbbf4c471cc090cbeb7ba7b2aed0eeabdbef3e.svg":{"logical_path":"flags/1x1/mx.svg","mtime":"2020-04-06T16:47:40+02:00","size":90505,"digest":"b67b689c0045cb4e8a4d5a439adbbf4c471cc090cbeb7ba7b2aed0eeabdbef3e","integrity":"sha256-tntonABFy06KTVpDmtu/TEccwJDL63unsq7Q7qvb7z4="},"flags/4x3/my-c992340a8c8284fca33fbcbcb287ace68c355a0603c471d9b09a207ab4f7390c.svg":{"logical_path":"flags/4x3/my.svg","mtime":"2020-04-06T16:47:40+02:00","size":1270,"digest":"c992340a8c8284fca33fbcbcb287ace68c355a0603c471d9b09a207ab4f7390c","integrity":"sha256-yZI0CoyChPyjP7y8soes5ow1WgYDxHHZsJogerT3OQw="},"flags/1x1/my-cb10a92508324c9de2641b74ca7a0c4872548dc874fbcbe9f75d6aa46ecd28bd.svg":{"logical_path":"flags/1x1/my.svg","mtime":"2020-04-06T16:47:40+02:00","size":1262,"digest":"cb10a92508324c9de2641b74ca7a0c4872548dc874fbcbe9f75d6aa46ecd28bd","integrity":"sha256-yxCpJQgyTJ3iZBt0ynoMSHJUjch0+8vp911qpG7NKL0="},"flags/4x3/mz-db6310ed68179491d7d9ad03d133cd8ace0fd75dd0624f3f9f1c856eb799fdb1.svg":{"logical_path":"flags/4x3/mz.svg","mtime":"2020-04-06T16:47:40+02:00","size":2622,"digest":"db6310ed68179491d7d9ad03d133cd8ace0fd75dd0624f3f9f1c856eb799fdb1","integrity":"sha256-22MQ7WgXlJHX2a0D0TPNis4P113QYk8/nxyFbreZ/bE="},"flags/1x1/mz-cbc5741e7cb4a2212dc311772b55688c4e9e2d2f11d1e2c3c42dd4f2a1464473.svg":{"logical_path":"flags/1x1/mz.svg","mtime":"2020-04-06T16:47:40+02:00","size":2597,"digest":"cbc5741e7cb4a2212dc311772b55688c4e9e2d2f11d1e2c3c42dd4f2a1464473","integrity":"sha256-y8V0Hny0oiEtwxF3K1VojE6eLS8R0eLDxC3U8qFGRHM="},"flags/4x3/na-7c73485829c6aee5fb2e678707883ae99de6ddc50f4393025fdadedd78944213.svg":{"logical_path":"flags/4x3/na.svg","mtime":"2020-04-06T16:47:40+02:00","size":1005,"digest":"7c73485829c6aee5fb2e678707883ae99de6ddc50f4393025fdadedd78944213","integrity":"sha256-fHNIWCnGruX7LmeHB4g66Z3m3cUPQ5MCX9re3XiUQhM="},"flags/1x1/na-37d8c89f1f7e5e2dd7a7e2211afd542a9565533995500e5686c791a6e9f51d20.svg":{"logical_path":"flags/1x1/na.svg","mtime":"2020-04-06T16:47:40+02:00","size":977,"digest":"37d8c89f1f7e5e2dd7a7e2211afd542a9565533995500e5686c791a6e9f51d20","integrity":"sha256-N9jInx9+Xi3Xp+IhGv1UKpVlUzmVUA5WhseRpun1HSA="},"flags/4x3/nc-b0c095d359e58de45a984c4d3aa73c5442e76c2b8837ae491f53284de1a15475.svg":{"logical_path":"flags/4x3/nc.svg","mtime":"2020-04-06T16:47:40+02:00","size":1380,"digest":"b0c095d359e58de45a984c4d3aa73c5442e76c2b8837ae491f53284de1a15475","integrity":"sha256-sMCV01nljeRamExNOqc8VELnbCuIN65JH1MoTeGhVHU="},"flags/1x1/nc-d7a07223b8b040a88ea6a11662b947add62e438a993721494df88951aa9df656.svg":{"logical_path":"flags/1x1/nc.svg","mtime":"2020-04-06T16:47:40+02:00","size":1387,"digest":"d7a07223b8b040a88ea6a11662b947add62e438a993721494df88951aa9df656","integrity":"sha256-16ByI7iwQKiOpqEWYrlHrdYuQ4qZNyFJTfiJUaqd9lY="},"flags/4x3/ne-54d7076def267766d8e49d822d6b9b774e82bfe0a91269b0951148f5a19e4900.svg":{"logical_path":"flags/4x3/ne.svg","mtime":"2020-04-06T16:47:40+02:00","size":276,"digest":"54d7076def267766d8e49d822d6b9b774e82bfe0a91269b0951148f5a19e4900","integrity":"sha256-VNcHbe8md2bY5J2CLWubd06Cv+CpEmmwlRFI9aGeSQA="},"flags/1x1/ne-bee088c42b4ce13a5dc346424f354a53a78db7db8eaa064bf534b711532f19c3.svg":{"logical_path":"flags/1x1/ne.svg","mtime":"2020-04-06T16:47:40+02:00","size":282,"digest":"bee088c42b4ce13a5dc346424f354a53a78db7db8eaa064bf534b711532f19c3","integrity":"sha256-vuCIxCtM4Tpdw0ZCTzVKU6eNt9uOqgZL9TS3EVMvGcM="},"flags/4x3/nf-f0e0b96f2586ad66b367fe6490b48df8aeea0c100bf5178cd1ffbc03571fe95c.svg":{"logical_path":"flags/4x3/nf.svg","mtime":"2020-04-06T16:47:40+02:00","size":5837,"digest":"f0e0b96f2586ad66b367fe6490b48df8aeea0c100bf5178cd1ffbc03571fe95c","integrity":"sha256-8OC5byWGrWazZ/5kkLSN+K7qDBAL9ReM0f+8A1cf6Vw="},"flags/1x1/nf-4880d7db266b4219bf4878fa435f9021c02d86c7309d6571c5cc6a0eba81777d.svg":{"logical_path":"flags/1x1/nf.svg","mtime":"2020-04-06T16:47:40+02:00","size":5591,"digest":"4880d7db266b4219bf4878fa435f9021c02d86c7309d6571c5cc6a0eba81777d","integrity":"sha256-SIDX2yZrQhm/SHj6Q1+QIcAthscwnWVxxcxqDrqBd30="},"flags/4x3/ng-f1ca02b4d2034f53a5b768674883dab4b21852dc2ae39b2d02bc281384d95e33.svg":{"logical_path":"flags/4x3/ng.svg","mtime":"2020-04-06T16:47:40+02:00","size":260,"digest":"f1ca02b4d2034f53a5b768674883dab4b21852dc2ae39b2d02bc281384d95e33","integrity":"sha256-8coCtNIDT1Olt2hnSIPatLIYUtwq45stArwoE4TZXjM="},"flags/1x1/ng-8b34a12b4b7116eb6ecc79744e0b0244cacdea5ea200940522042fa12953097a.svg":{"logical_path":"flags/1x1/ng.svg","mtime":"2020-04-06T16:47:40+02:00","size":260,"digest":"8b34a12b4b7116eb6ecc79744e0b0244cacdea5ea200940522042fa12953097a","integrity":"sha256-izShK0txFutuzHl0TgsCRMrN6l6iAJQFIgQvoSlTCXo="},"flags/4x3/ni-a6c8d7f7a74b93a4c42589c951ce37ea3e073daf82f2418efa6a5ff1ec2d23fb.svg":{"logical_path":"flags/4x3/ni.svg","mtime":"2020-04-06T16:47:40+02:00","size":18408,"digest":"a6c8d7f7a74b93a4c42589c951ce37ea3e073daf82f2418efa6a5ff1ec2d23fb","integrity":"sha256-psjX96dLk6TEJYnJUc436j4HPa+C8kGO+mpf8ewtI/s="},"flags/1x1/ni-a9ead4b075e183ce139f9c26256dd2a8d083d4d126d85f3848d8e9ac884ab504.svg":{"logical_path":"flags/1x1/ni.svg","mtime":"2020-04-06T16:47:40+02:00","size":18463,"digest":"a9ead4b075e183ce139f9c26256dd2a8d083d4d126d85f3848d8e9ac884ab504","integrity":"sha256-qerUsHXhg84Tn5wmJW3SqNCD1NEm2F84SNjprIhKtQQ="},"flags/4x3/nl-a91174a3cccd5ec66da2cc68e0cbf86a3ea73d2976dc303c72109198b2504b51.svg":{"logical_path":"flags/4x3/nl.svg","mtime":"2020-04-06T16:47:40+02:00","size":224,"digest":"a91174a3cccd5ec66da2cc68e0cbf86a3ea73d2976dc303c72109198b2504b51","integrity":"sha256-qRF0o8zNXsZtosxo4Mv4aj6nPSl23DA8chCRmLJQS1E="},"flags/1x1/nl-426beba2bc0a7ae4079c8586509f6902dc9a6082f4a0ec7c71520572ac3f86c2.svg":{"logical_path":"flags/1x1/nl.svg","mtime":"2020-04-06T16:47:40+02:00","size":228,"digest":"426beba2bc0a7ae4079c8586509f6902dc9a6082f4a0ec7c71520572ac3f86c2","integrity":"sha256-QmvrorwKeuQHnIWGUJ9pAtyaYIL0oOx8cVIFcqw/hsI="},"flags/4x3/no-c59f156ddd70507f05267dc35e2e4f3e44467b9ef414995abb91589dc486dd6a.svg":{"logical_path":"flags/4x3/no.svg","mtime":"2020-04-06T16:47:40+02:00","size":321,"digest":"c59f156ddd70507f05267dc35e2e4f3e44467b9ef414995abb91589dc486dd6a","integrity":"sha256-xZ8Vbd1wUH8FJn3DXi5PPkRGe570FJlau5FYncSG3Wo="},"flags/1x1/no-567df11f5e12f95a4c707234127ad878db61c286cfdd034dbcab8c4222c4af25.svg":{"logical_path":"flags/1x1/no.svg","mtime":"2020-04-06T16:47:40+02:00","size":321,"digest":"567df11f5e12f95a4c707234127ad878db61c286cfdd034dbcab8c4222c4af25","integrity":"sha256-Vn3xH14S+VpMcHI0EnrYeNthwobP3QNNvKuMQiLEryU="},"flags/4x3/np-ddc042ba58c0842e4a1dd8ac56701dd8e22659cb04e3905d3866810d6333aaf0.svg":{"logical_path":"flags/4x3/np.svg","mtime":"2020-04-06T16:47:40+02:00","size":1061,"digest":"ddc042ba58c0842e4a1dd8ac56701dd8e22659cb04e3905d3866810d6333aaf0","integrity":"sha256-3cBCuljAhC5KHdisVnAd2OImWcsE45BdOGaBDWMzqvA="},"flags/1x1/np-d81adac491e4e7cef7e94ab6e94f00564b319f9a383b85e0dd753aebc1cfeea2.svg":{"logical_path":"flags/1x1/np.svg","mtime":"2020-04-06T16:47:40+02:00","size":1193,"digest":"d81adac491e4e7cef7e94ab6e94f00564b319f9a383b85e0dd753aebc1cfeea2","integrity":"sha256-2BraxJHk58736Uq26U8AVksxn5o4O4Xg3XU668HP7qI="},"flags/4x3/nr-2f19fb532598a59536ccf4bb6f4446c08eb1b9ed5ebe0ff1f00bc6fc8c36e792.svg":{"logical_path":"flags/4x3/nr.svg","mtime":"2020-04-06T16:47:40+02:00","size":651,"digest":"2f19fb532598a59536ccf4bb6f4446c08eb1b9ed5ebe0ff1f00bc6fc8c36e792","integrity":"sha256-Lxn7UyWYpZU2zPS7b0RGwI6xue1evg/x8AvG/Iw255I="},"flags/1x1/nr-6e66f80525a6b92920b1acd01c9bcc214b1a2f05393d65af6428567e7de0cc6c.svg":{"logical_path":"flags/1x1/nr.svg","mtime":"2020-04-06T16:47:40+02:00","size":668,"digest":"6e66f80525a6b92920b1acd01c9bcc214b1a2f05393d65af6428567e7de0cc6c","integrity":"sha256-bmb4BSWmuSkgsazQHJvMIUsaLwU5PWWvZChWfn3gzGw="},"flags/4x3/nu-55390cc014e85eb56b9d08004470900d13d95ed83ddb5006bf4e0e1cf519028c.svg":{"logical_path":"flags/4x3/nu.svg","mtime":"2020-04-06T16:47:40+02:00","size":1745,"digest":"55390cc014e85eb56b9d08004470900d13d95ed83ddb5006bf4e0e1cf519028c","integrity":"sha256-VTkMwBToXrVrnQgARHCQDRPZXtg921AGv04OHPUZAow="},"flags/1x1/nu-1bfa55a93eca4ffd981f98935d6c2cab58a29be4f0d2f15a50148d695ab50f3f.svg":{"logical_path":"flags/1x1/nu.svg","mtime":"2020-04-06T16:47:40+02:00","size":1727,"digest":"1bfa55a93eca4ffd981f98935d6c2cab58a29be4f0d2f15a50148d695ab50f3f","integrity":"sha256-G/pVqT7KT/2YH5iTXWwsq1iim+Tw0vFaUBSNaVq1Dz8="},"flags/4x3/nz-b7f4f0961f007b0cc355df85903b0af0cfd6b655e23aa56aa547dc5ed693ae7f.svg":{"logical_path":"flags/4x3/nz.svg","mtime":"2020-04-06T16:47:40+02:00","size":2989,"digest":"b7f4f0961f007b0cc355df85903b0af0cfd6b655e23aa56aa547dc5ed693ae7f","integrity":"sha256-t/Twlh8AewzDVd+FkDsK8M/WtlXiOqVqpUfcXtaTrn8="},"flags/1x1/nz-b93a77fe262ed1d5fbd196f2224c0fa2b3dd6d1e84c0027c5a122643fdad8d23.svg":{"logical_path":"flags/1x1/nz.svg","mtime":"2020-04-06T16:47:40+02:00","size":2999,"digest":"b93a77fe262ed1d5fbd196f2224c0fa2b3dd6d1e84c0027c5a122643fdad8d23","integrity":"sha256-uTp3/iYu0dX70ZbyIkwPorPdbR6EwAJ8WhImQ/2tjSM="},"flags/4x3/om-d66047c0f554b25250566bdbdf7d4ac03c0f708f03cd4c4159c57f16fa056967.svg":{"logical_path":"flags/4x3/om.svg","mtime":"2020-04-06T16:47:40+02:00","size":22636,"digest":"d66047c0f554b25250566bdbdf7d4ac03c0f708f03cd4c4159c57f16fa056967","integrity":"sha256-1mBHwPVUslJQVmvb331KwDwPcI8DzUxBWcV/FvoFaWc="},"flags/1x1/om-20669c3a4f181d035b5acd82a12d7354b3c5decb53383ea6b7a53d02b7138fe9.svg":{"logical_path":"flags/1x1/om.svg","mtime":"2020-04-06T16:47:40+02:00","size":22614,"digest":"20669c3a4f181d035b5acd82a12d7354b3c5decb53383ea6b7a53d02b7138fe9","integrity":"sha256-IGacOk8YHQNbWs2CoS1zVLPF3stTOD6mt6U9ArcTj+k="},"flags/4x3/pa-0bd4b6709d9ca822851f2d7c57ef9fb3c098ceeea5d239bbf8f3196b062d1d11.svg":{"logical_path":"flags/4x3/pa.svg","mtime":"2020-04-06T16:47:40+02:00","size":749,"digest":"0bd4b6709d9ca822851f2d7c57ef9fb3c098ceeea5d239bbf8f3196b062d1d11","integrity":"sha256-C9S2cJ2cqCKFHy18V++fs8CYzu6l0jm7+PMZawYtHRE="},"flags/1x1/pa-6e0e27190b3c3806b6cae82d0e3708c05e02bc82479e252f4486a0eee43a58d7.svg":{"logical_path":"flags/1x1/pa.svg","mtime":"2020-04-06T16:47:40+02:00","size":659,"digest":"6e0e27190b3c3806b6cae82d0e3708c05e02bc82479e252f4486a0eee43a58d7","integrity":"sha256-bg4nGQs8OAa2yugtDjcIwF4CvIJHniUvRIag7uQ6WNc="},"flags/4x3/pe-3fddfd9a5405daa75ae35d717219be04940fbd956b583fa9a75d0c54ec5d6da5.svg":{"logical_path":"flags/4x3/pe.svg","mtime":"2020-04-06T16:47:40+02:00","size":73609,"digest":"3fddfd9a5405daa75ae35d717219be04940fbd956b583fa9a75d0c54ec5d6da5","integrity":"sha256-P939mlQF2qda411xchm+BJQPvZVrWD+pp10MVOxdbaU="},"flags/1x1/pe-e0468f05eddaea5fb78d8d86440a580cd9cf5f27baa3e2ac4f229b4423abd7f9.svg":{"logical_path":"flags/1x1/pe.svg","mtime":"2020-04-06T16:47:40+02:00","size":72907,"digest":"e0468f05eddaea5fb78d8d86440a580cd9cf5f27baa3e2ac4f229b4423abd7f9","integrity":"sha256-4EaPBe3a6l+3jY2GRApYDNnPXye6o+KsTyKbRCOr1/k="},"flags/4x3/pf-de72e06f1af9d5d3f44995e41ec69b3669da1d59a40b4d99b03164617ab326b1.svg":{"logical_path":"flags/4x3/pf.svg","mtime":"2020-04-06T16:47:40+02:00","size":4290,"digest":"de72e06f1af9d5d3f44995e41ec69b3669da1d59a40b4d99b03164617ab326b1","integrity":"sha256-3nLgbxr51dP0SZXkHsabNmnaHVmkC02ZsDFkYXqzJrE="},"flags/1x1/pf-d68e024f9a826b0790679bf50cf2f004f5063aacbf99948a0aeb792c97e20c88.svg":{"logical_path":"flags/1x1/pf.svg","mtime":"2020-04-06T16:47:40+02:00","size":4229,"digest":"d68e024f9a826b0790679bf50cf2f004f5063aacbf99948a0aeb792c97e20c88","integrity":"sha256-1o4CT5qCaweQZ5v1DPLwBPUGOqy/mZSKCut5LJfiDIg="},"flags/4x3/pg-10ae837d9c7828178cc70a3489b719ab88a3c3dfbd58bfcf7c0ce26908efc809.svg":{"logical_path":"flags/4x3/pg.svg","mtime":"2020-04-06T16:47:40+02:00","size":1661,"digest":"10ae837d9c7828178cc70a3489b719ab88a3c3dfbd58bfcf7c0ce26908efc809","integrity":"sha256-EK6DfZx4KBeMxwo0ibcZq4ijw9+9WL/PfAziaQjvyAk="},"flags/1x1/pg-40cd64620f6af0b94340fa7c71de0e2ef541e6072d886e666ddf6acd2f5aecdb.svg":{"logical_path":"flags/1x1/pg.svg","mtime":"2020-04-06T16:47:40+02:00","size":2095,"digest":"40cd64620f6af0b94340fa7c71de0e2ef541e6072d886e666ddf6acd2f5aecdb","integrity":"sha256-QM1kYg9q8LlDQPp8cd4OLvVB5gctiG5mbd9qzS9a7Ns="},"flags/4x3/ph-fd167a43304972aa43f76a0ec3f03dc89dde4f96adc654a7e0e2e1257aa9a7e5.svg":{"logical_path":"flags/4x3/ph.svg","mtime":"2020-04-06T16:47:40+02:00","size":1565,"digest":"fd167a43304972aa43f76a0ec3f03dc89dde4f96adc654a7e0e2e1257aa9a7e5","integrity":"sha256-/RZ6QzBJcqpD92oOw/A9yJ3eT5atxlSn4OLhJXqpp+U="},"flags/1x1/ph-2f9dd37f9762ce80f198b8cb9b4acab9e19c482d7cbb927f7866b1920133af3c.svg":{"logical_path":"flags/1x1/ph.svg","mtime":"2020-04-06T16:47:40+02:00","size":1510,"digest":"2f9dd37f9762ce80f198b8cb9b4acab9e19c482d7cbb927f7866b1920133af3c","integrity":"sha256-L53Tf5dizoDxmLjLm0rKueGcSC18u5J/eGaxkgEzrzw="},"flags/4x3/pk-0c5ada4d149d7ff18ea90733cf9bfa8754981730138c20ec97b864d97fe34ef9.svg":{"logical_path":"flags/4x3/pk.svg","mtime":"2020-04-06T16:47:40+02:00","size":739,"digest":"0c5ada4d149d7ff18ea90733cf9bfa8754981730138c20ec97b864d97fe34ef9","integrity":"sha256-DFraTRSdf/GOqQczz5v6h1SYFzATjCDsl7hk2X/jTvk="},"flags/1x1/pk-637994c86e94944be181dba8727a3b136191f72ebe53f043f0b7297fcced5903.svg":{"logical_path":"flags/1x1/pk.svg","mtime":"2020-04-06T16:47:40+02:00","size":684,"digest":"637994c86e94944be181dba8727a3b136191f72ebe53f043f0b7297fcced5903","integrity":"sha256-Y3mUyG6UlEvhgduocno7E2GR9y6+U/BD8Lcpf8ztWQM="},"flags/4x3/pl-bd8c588ce4c71594e5f3789b700c935e3c97e5c06e62ddb595752c805e90d851.svg":{"logical_path":"flags/4x3/pl.svg","mtime":"2020-04-06T16:47:40+02:00","size":222,"digest":"bd8c588ce4c71594e5f3789b700c935e3c97e5c06e62ddb595752c805e90d851","integrity":"sha256-vYxYjOTHFZTl83ibcAyTXjyX5cBuYt21lXUsgF6Q2FE="},"flags/1x1/pl-d7c4aadb69ef13492016a7b2995020f9d754d128f9354dd742c32d420c3340ad.svg":{"logical_path":"flags/1x1/pl.svg","mtime":"2020-04-06T16:47:40+02:00","size":222,"digest":"d7c4aadb69ef13492016a7b2995020f9d754d128f9354dd742c32d420c3340ad","integrity":"sha256-18Sq22nvE0kgFqeymVAg+ddU0Sj5NU3XQsMtQgwzQK0="},"flags/4x3/pm-e1e1de44f61b53fb70041acec8426e6505526c9a29317a4fc1dbc206f0f261e6.svg":{"logical_path":"flags/4x3/pm.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"e1e1de44f61b53fb70041acec8426e6505526c9a29317a4fc1dbc206f0f261e6","integrity":"sha256-4eHeRPYbU/twBBrOyEJuZQVSbJopMXpPwdvCBvDyYeY="},"flags/1x1/pm-4e3a65b4577055027d41ebf6441200b8e1f360a1677e2032f262b58805689641.svg":{"logical_path":"flags/1x1/pm.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"4e3a65b4577055027d41ebf6441200b8e1f360a1677e2032f262b58805689641","integrity":"sha256-TjpltFdwVQJ9Qev2RBIAuOHzYKFnfiAy8mK1iAVolkE="},"flags/4x3/pn-d05afc2826bdaa9121a17e9ff42d35ec4a72668a4efe0b65acd6e6de23f8268c.svg":{"logical_path":"flags/4x3/pn.svg","mtime":"2020-04-06T16:47:40+02:00","size":10878,"digest":"d05afc2826bdaa9121a17e9ff42d35ec4a72668a4efe0b65acd6e6de23f8268c","integrity":"sha256-0Fr8KCa9qpEhoX6f9C017EpyZopO/gtlrNbm3iP4Jow="},"flags/1x1/pn-c2f3565f6e8282d44babe06fd25605c002f5abb3edafa843762a9ed6de06464b.svg":{"logical_path":"flags/1x1/pn.svg","mtime":"2020-04-06T16:47:40+02:00","size":8517,"digest":"c2f3565f6e8282d44babe06fd25605c002f5abb3edafa843762a9ed6de06464b","integrity":"sha256-wvNWX26CgtRLq+Bv0lYFwAL1q7Ptr6hDdiqe1t4GRks="},"flags/4x3/pr-f87e928ea7a84ebc9c7d6e8ee6e43e9f93014adebc4604f01fe36db29e635ed8.svg":{"logical_path":"flags/4x3/pr.svg","mtime":"2020-04-06T16:47:40+02:00","size":637,"digest":"f87e928ea7a84ebc9c7d6e8ee6e43e9f93014adebc4604f01fe36db29e635ed8","integrity":"sha256-+H6SjqeoTrycfW6O5uQ+n5MBSt68RgTwH+Ntsp5jXtg="},"flags/1x1/pr-7a94e53dbfc93808d194a05e79f780aef0d2b231e830e4fb4b931cdde7d6da26.svg":{"logical_path":"flags/1x1/pr.svg","mtime":"2020-04-06T16:47:40+02:00","size":619,"digest":"7a94e53dbfc93808d194a05e79f780aef0d2b231e830e4fb4b931cdde7d6da26","integrity":"sha256-epTlPb/JOAjRlKBeefeArvDSsjHoMOT7S5Mc3efW2iY="},"flags/4x3/ps-84421fd66f9058e424da190fc8b3f6a0d35e7bb918aa6fffacd00a1a2c1b2d71.svg":{"logical_path":"flags/4x3/ps.svg","mtime":"2020-04-06T16:47:40+02:00","size":561,"digest":"84421fd66f9058e424da190fc8b3f6a0d35e7bb918aa6fffacd00a1a2c1b2d71","integrity":"sha256-hEIf1m+QWOQk2hkPyLP2oNNee7kYqm//rNAKGiwbLXE="},"flags/1x1/ps-31a06ee8dc4500f9665b4e3654489abc6a77851c7a43c245809bc874ac6f77e9.svg":{"logical_path":"flags/1x1/ps.svg","mtime":"2020-04-06T16:47:40+02:00","size":541,"digest":"31a06ee8dc4500f9665b4e3654489abc6a77851c7a43c245809bc874ac6f77e9","integrity":"sha256-MaBu6NxFAPlmW042VEiavGp3hRx6Q8JFgJvIdKxvd+k="},"flags/4x3/pt-62137f64b8b37b24510095926415b3120029f0d57e97817209e895f9c50b26dd.svg":{"logical_path":"flags/4x3/pt.svg","mtime":"2020-04-06T16:47:40+02:00","size":8280,"digest":"62137f64b8b37b24510095926415b3120029f0d57e97817209e895f9c50b26dd","integrity":"sha256-YhN/ZLizeyRRAJWSZBWzEgAp8NV+l4FyCeiV+cULJt0="},"flags/1x1/pt-2fc8fb378410d636377385d6d007f20a41d6493fdae51a35cab5eaa5da3328fa.svg":{"logical_path":"flags/1x1/pt.svg","mtime":"2020-04-06T16:47:40+02:00","size":8661,"digest":"2fc8fb378410d636377385d6d007f20a41d6493fdae51a35cab5eaa5da3328fa","integrity":"sha256-L8j7N4QQ1jY3c4XW0AfyCkHWST/a5Ro1yrXqpdozKPo="},"flags/4x3/pw-c59cfacb984b59244f48132977b96327c880f391431a2610ec4617d1f73ee3a7.svg":{"logical_path":"flags/4x3/pw.svg","mtime":"2020-04-06T16:47:40+02:00","size":467,"digest":"c59cfacb984b59244f48132977b96327c880f391431a2610ec4617d1f73ee3a7","integrity":"sha256-xZz6y5hLWSRPSBMpd7ljJ8iA85FDGiYQ7EYX0fc+46c="},"flags/1x1/pw-21a677b7fa3f33a6304926ac4b0d516f2710d9d576cefb46674e3f9c2a444956.svg":{"logical_path":"flags/1x1/pw.svg","mtime":"2020-04-06T16:47:40+02:00","size":507,"digest":"21a677b7fa3f33a6304926ac4b0d516f2710d9d576cefb46674e3f9c2a444956","integrity":"sha256-IaZ3t/o/M6YwSSasSw1RbycQ2dV2zvtGZ04/nCpESVY="},"flags/4x3/py-22570d444732336f9af31307c5b4c5809d8c028319b81c24966d0b48e441f08c.svg":{"logical_path":"flags/4x3/py.svg","mtime":"2020-04-06T16:47:40+02:00","size":17097,"digest":"22570d444732336f9af31307c5b4c5809d8c028319b81c24966d0b48e441f08c","integrity":"sha256-IlcNREcyM2+a8xMHxbTFgJ2MAoMZuBwklm0LSORB8Iw="},"flags/1x1/py-da5901ec6f8fa93f84e42140bd923592b84084a648569d76b476e7512e3620da.svg":{"logical_path":"flags/1x1/py.svg","mtime":"2020-04-06T16:47:40+02:00","size":17246,"digest":"da5901ec6f8fa93f84e42140bd923592b84084a648569d76b476e7512e3620da","integrity":"sha256-2lkB7G+PqT+E5CFAvZI1krhAhKZIVp12tHbnUS42INo="},"flags/4x3/qa-a5e58fc790b76e90b945a68bb4f15223254201bf006040d953092dee5ca8da31.svg":{"logical_path":"flags/4x3/qa.svg","mtime":"2020-04-06T16:47:40+02:00","size":359,"digest":"a5e58fc790b76e90b945a68bb4f15223254201bf006040d953092dee5ca8da31","integrity":"sha256-peWPx5C3bpC5RaaLtPFSIyVCAb8AYEDZUwkt7lyo2jE="},"flags/1x1/qa-ffa8cd4edd7ac169127363f8f0476ffe11279367334f1fa910320541a1a94505.svg":{"logical_path":"flags/1x1/qa.svg","mtime":"2020-04-06T16:47:40+02:00","size":356,"digest":"ffa8cd4edd7ac169127363f8f0476ffe11279367334f1fa910320541a1a94505","integrity":"sha256-/6jNTt16wWkSc2P48Edv/hEnk2czTx+pEDIFQaGpRQU="},"flags/4x3/re-5183af67c4fa08369e9251a2a102a4ed578c24bb59092dd92f3a572d90223434.svg":{"logical_path":"flags/4x3/re.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"5183af67c4fa08369e9251a2a102a4ed578c24bb59092dd92f3a572d90223434","integrity":"sha256-UYOvZ8T6CDaeklGioQKk7VeMJLtZCS3ZLzpXLZAiNDQ="},"flags/1x1/re-37be9dc3645dac4c1463068f9001cff31288ef527c2fca0d6432022858070084.svg":{"logical_path":"flags/1x1/re.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"37be9dc3645dac4c1463068f9001cff31288ef527c2fca0d6432022858070084","integrity":"sha256-N76dw2RdrEwUYwaPkAHP8xKI71J8L8oNZDICKFgHAIQ="},"flags/4x3/ro-854593a65b29383274aabe385c4ff58794a2b5d4b89c5414a0ff11f96d016f1e.svg":{"logical_path":"flags/4x3/ro.svg","mtime":"2020-04-06T16:47:40+02:00","size":305,"digest":"854593a65b29383274aabe385c4ff58794a2b5d4b89c5414a0ff11f96d016f1e","integrity":"sha256-hUWTplspODJ0qr44XE/1h5SitdS4nFQUoP8R+W0Bbx4="},"flags/1x1/ro-da9e0ce1ebd0f466ff68500173fe067212d304b8f4594f54bd61bd3e5409c7a9.svg":{"logical_path":"flags/1x1/ro.svg","mtime":"2020-04-06T16:47:40+02:00","size":305,"digest":"da9e0ce1ebd0f466ff68500173fe067212d304b8f4594f54bd61bd3e5409c7a9","integrity":"sha256-2p4M4evQ9Gb/aFABc/4GchLTBLj0WU9UvWG9PlQJx6k="},"flags/4x3/rs-cbb54d608b15e2bd4d422b8d83f061115c2087d070969b2e9f6112647569ce3a.svg":{"logical_path":"flags/4x3/rs.svg","mtime":"2020-04-06T16:47:40+02:00","size":187134,"digest":"cbb54d608b15e2bd4d422b8d83f061115c2087d070969b2e9f6112647569ce3a","integrity":"sha256-y7VNYIsV4r1NQiuNg/BhEVwgh9Bwlpsun2ESZHVpzjo="},"flags/1x1/rs-04c759a5129437dcc03dffb362199c84fc773a185726dc2ed09f9cfd41370fdb.svg":{"logical_path":"flags/1x1/rs.svg","mtime":"2020-04-06T16:47:40+02:00","size":186989,"digest":"04c759a5129437dcc03dffb362199c84fc773a185726dc2ed09f9cfd41370fdb","integrity":"sha256-BMdZpRKUN9zAPf+zYhmchPx3OhhXJtwu0J+c/UE3D9s="},"flags/4x3/ru-5b51b57f63cf58e451abddeaee39a8c7b133cb3d58c6ef1a903883bda7c346b0.svg":{"logical_path":"flags/4x3/ru.svg","mtime":"2020-04-06T16:47:40+02:00","size":286,"digest":"5b51b57f63cf58e451abddeaee39a8c7b133cb3d58c6ef1a903883bda7c346b0","integrity":"sha256-W1G1f2PPWORRq93q7jmox7Ezyz1Yxu8akDiDvafDRrA="},"flags/1x1/ru-bb2782a916b1a28eb081895afa90f4ed5dca5df320b9cc95f867bc2a26e29064.svg":{"logical_path":"flags/1x1/ru.svg","mtime":"2020-04-06T16:47:40+02:00","size":290,"digest":"bb2782a916b1a28eb081895afa90f4ed5dca5df320b9cc95f867bc2a26e29064","integrity":"sha256-uyeCqRaxoo6wgYla+pD07V3KXfMgucyV+Ge8KibikGQ="},"flags/4x3/rw-aeb9bc73cd3fe25e7c1a1a7bdddc11eb3d71a3273919dd2f4247873db78fbe75.svg":{"logical_path":"flags/4x3/rw.svg","mtime":"2020-04-06T16:47:40+02:00","size":747,"digest":"aeb9bc73cd3fe25e7c1a1a7bdddc11eb3d71a3273919dd2f4247873db78fbe75","integrity":"sha256-rrm8c80/4l58Ghp73dwR6z1xoyc5Gd0vQkeHPbePvnU="},"flags/1x1/rw-8c27cde746de68484394ef6dc519583cf67e380ca5e8d48cf37fa4d99fef57ed.svg":{"logical_path":"flags/1x1/rw.svg","mtime":"2020-04-06T16:47:40+02:00","size":748,"digest":"8c27cde746de68484394ef6dc519583cf67e380ca5e8d48cf37fa4d99fef57ed","integrity":"sha256-jCfN50beaEhDlO9txRlYPPZ+OAyl6NSM83+k2Z/vV+0="},"flags/4x3/sa-d54e76d7ad9da5242aa26d5dbec120b8a4530c097ae45d0b22e539f2d9c6ad8b.svg":{"logical_path":"flags/4x3/sa.svg","mtime":"2020-04-06T16:47:40+02:00","size":10238,"digest":"d54e76d7ad9da5242aa26d5dbec120b8a4530c097ae45d0b22e539f2d9c6ad8b","integrity":"sha256-1U52162dpSQqom1dvsEguKRTDAl65F0LIuU58tnGrYs="},"flags/1x1/sa-639ee1c158b0b61e8789bde27ae64edb246afe63cb8999e3468ca88c344927be.svg":{"logical_path":"flags/1x1/sa.svg","mtime":"2020-04-06T16:47:40+02:00","size":10179,"digest":"639ee1c158b0b61e8789bde27ae64edb246afe63cb8999e3468ca88c344927be","integrity":"sha256-Y57hwViwth6Hib3ieuZO2yRq/mPLiZnjRoyojDRJJ74="},"flags/4x3/sb-651213df067f16dbdba2288928434afdd54f192b50bf15d06206ade966d54bac.svg":{"logical_path":"flags/4x3/sb.svg","mtime":"2020-04-06T16:47:40+02:00","size":953,"digest":"651213df067f16dbdba2288928434afdd54f192b50bf15d06206ade966d54bac","integrity":"sha256-ZRIT3wZ/FtvboiiJKENK/dVPGStQvxXQYgat6WbVS6w="},"flags/1x1/sb-19048c26004da6fe2a1dd5f3f695066b24f3096d1527edbdaac03c2817046fe3.svg":{"logical_path":"flags/1x1/sb.svg","mtime":"2020-04-06T16:47:40+02:00","size":952,"digest":"19048c26004da6fe2a1dd5f3f695066b24f3096d1527edbdaac03c2817046fe3","integrity":"sha256-GQSMJgBNpv4qHdXz9pUGayTzCW0VJ+29qsA8KBcEb+M="},"flags/4x3/sc-2ed9272d5fd2fa92d29289f49f58f5f64f66977165fa1a80f9eb6aa57335517e.svg":{"logical_path":"flags/4x3/sc.svg","mtime":"2020-04-06T16:47:40+02:00","size":571,"digest":"2ed9272d5fd2fa92d29289f49f58f5f64f66977165fa1a80f9eb6aa57335517e","integrity":"sha256-LtknLV/S+pLSkon0n1j19k9ml3Fl+hqA+etqpXM1UX4="},"flags/1x1/sc-90424aafda9a2aa7d98030c0aa7bc604c77c1b0f7c5e6a094dffd2b803a88c71.svg":{"logical_path":"flags/1x1/sc.svg","mtime":"2020-04-06T16:47:40+02:00","size":570,"digest":"90424aafda9a2aa7d98030c0aa7bc604c77c1b0f7c5e6a094dffd2b803a88c71","integrity":"sha256-kEJKr9qaKqfZgDDAqnvGBMd8Gw98XmoJTf/SuAOojHE="},"flags/4x3/sd-b8b9d97103e668a2b043311b6453c2df25d5c3adcf62481e4c79a627c6784f4d.svg":{"logical_path":"flags/4x3/sd.svg","mtime":"2020-04-06T16:47:40+02:00","size":497,"digest":"b8b9d97103e668a2b043311b6453c2df25d5c3adcf62481e4c79a627c6784f4d","integrity":"sha256-uLnZcQPmaKKwQzEbZFPC3yXVw63PYkgeTHmmJ8Z4T00="},"flags/1x1/sd-da52cd7a173ecc0bc7e9a7c7ed4a20558a7f4cb5b6cd308790b7552a70421abc.svg":{"logical_path":"flags/1x1/sd.svg","mtime":"2020-04-06T16:47:40+02:00","size":493,"digest":"da52cd7a173ecc0bc7e9a7c7ed4a20558a7f4cb5b6cd308790b7552a70421abc","integrity":"sha256-2lLNehc+zAvH6afH7UogVYp/TLW2zTCHkLdVKnBCGrw="},"flags/4x3/se-7b5be8932db6e5153d1f11ddba2d36cb4a33ddd7100e5c59cef3a2502215b062.svg":{"logical_path":"flags/4x3/se.svg","mtime":"2020-04-06T16:47:40+02:00","size":691,"digest":"7b5be8932db6e5153d1f11ddba2d36cb4a33ddd7100e5c59cef3a2502215b062","integrity":"sha256-e1voky225RU9HxHdui02y0oz3dcQDlxZzvOiUCIVsGI="},"flags/1x1/se-9b0845f8163d147e4fce6e814709d5813e53f00f8f5ccb40cfa4cb9e37388837.svg":{"logical_path":"flags/1x1/se.svg","mtime":"2020-04-06T16:47:40+02:00","size":698,"digest":"9b0845f8163d147e4fce6e814709d5813e53f00f8f5ccb40cfa4cb9e37388837","integrity":"sha256-mwhF+BY9FH5Pzm6BRwnVgT5T8A+PXMtAz6TLnjc4iDc="},"flags/4x3/sg-fa164984f038fa81540d519c5d08123ed55f31bb8aa73798af7698c69dca2226.svg":{"logical_path":"flags/4x3/sg.svg","mtime":"2020-04-06T16:47:40+02:00","size":887,"digest":"fa164984f038fa81540d519c5d08123ed55f31bb8aa73798af7698c69dca2226","integrity":"sha256-+hZJhPA4+oFUDVGcXQgSPtVfMbuKpzeYr3aYxp3KIiY="},"flags/1x1/sg-f6f8ecdd6f0099c072886716d98098d08de334f6f307398e9922f4df40ef7b2a.svg":{"logical_path":"flags/1x1/sg.svg","mtime":"2020-04-06T16:47:40+02:00","size":948,"digest":"f6f8ecdd6f0099c072886716d98098d08de334f6f307398e9922f4df40ef7b2a","integrity":"sha256-9vjs3W8AmcByiGcW2YCY0I3jNPbzBzmOmSL030Dveyo="},"flags/4x3/sh-e7b5e4dc5360fd9ec2e0dd50074e82a53566a61ab88a36b6b5cc80451a2d9279.svg":{"logical_path":"flags/4x3/sh.svg","mtime":"2020-04-06T16:47:40+02:00","size":29501,"digest":"e7b5e4dc5360fd9ec2e0dd50074e82a53566a61ab88a36b6b5cc80451a2d9279","integrity":"sha256-57Xk3FNg/Z7C4N1QB06CpTVmphq4ija2tcyARRotknk="},"flags/1x1/sh-c3a061079dd7f5ea785a4b4a4903ec4cefc4a26cd73371c0bfa3a0b231593947.svg":{"logical_path":"flags/1x1/sh.svg","mtime":"2020-04-06T16:47:40+02:00","size":30113,"digest":"c3a061079dd7f5ea785a4b4a4903ec4cefc4a26cd73371c0bfa3a0b231593947","integrity":"sha256-w6BhB53X9ep4WktKSQPsTO/EomzXM3HAv6OgsjFZOUc="},"flags/4x3/si-25487f7aa91f115d558f031ffaf0d399924b032100d24d467c3bd1cb026d9001.svg":{"logical_path":"flags/4x3/si.svg","mtime":"2020-04-06T16:47:40+02:00","size":2053,"digest":"25487f7aa91f115d558f031ffaf0d399924b032100d24d467c3bd1cb026d9001","integrity":"sha256-JUh/eqkfEV1VjwMf+vDTmZJLAyEA0k1GfDvRywJtkAE="},"flags/1x1/si-53973e8d5c2086570023dbffbdef1a8a181cd49b33da4fde01de7a57b8346c57.svg":{"logical_path":"flags/1x1/si.svg","mtime":"2020-04-06T16:47:40+02:00","size":2065,"digest":"53973e8d5c2086570023dbffbdef1a8a181cd49b33da4fde01de7a57b8346c57","integrity":"sha256-U5c+jVwghlcAI9v/ve8aihgc1Jsz2k/eAd56V7g0bFc="},"flags/4x3/sj-e64bad4f257ee1219640dce3608270b8a4c7ebfc37f91ac9e4fa5957ea0814f5.svg":{"logical_path":"flags/4x3/sj.svg","mtime":"2020-04-06T16:47:40+02:00","size":321,"digest":"e64bad4f257ee1219640dce3608270b8a4c7ebfc37f91ac9e4fa5957ea0814f5","integrity":"sha256-5kutTyV+4SGWQNzjYIJwuKTH6/w3+RrJ5PpZV+oIFPU="},"flags/1x1/sj-d764d5de8ca4a67ea323376c7c4dc48a3ec51bb043556ee07dca9e4989ba147f.svg":{"logical_path":"flags/1x1/sj.svg","mtime":"2020-04-06T16:47:40+02:00","size":321,"digest":"d764d5de8ca4a67ea323376c7c4dc48a3ec51bb043556ee07dca9e4989ba147f","integrity":"sha256-12TV3oykpn6jIzdsfE3Eij7FG7BDVW7gfcqeSYm6FH8="},"flags/4x3/sk-4ca76c921fae3345c47f1f540cdaf3716a7807ffcba532caea50090c8bbecac2.svg":{"logical_path":"flags/4x3/sk.svg","mtime":"2020-04-06T16:47:40+02:00","size":1202,"digest":"4ca76c921fae3345c47f1f540cdaf3716a7807ffcba532caea50090c8bbecac2","integrity":"sha256-TKdskh+uM0XEfx9UDNrzcWp4B//LpTLK6lAJDIu+ysI="},"flags/1x1/sk-48d976a953d0778fced47cc5d25890f3dd7befc28a85d9bddfae6b50fa98c84b.svg":{"logical_path":"flags/1x1/sk.svg","mtime":"2020-04-06T16:47:40+02:00","size":1173,"digest":"48d976a953d0778fced47cc5d25890f3dd7befc28a85d9bddfae6b50fa98c84b","integrity":"sha256-SNl2qVPQd4/O1HzF0liQ891778KKhdm9365rUPqYyEs="},"flags/4x3/sl-d8106777ab26efc28f786a1345bd411a4a0a10da738b691e3f4deea96d3c3c3a.svg":{"logical_path":"flags/4x3/sl.svg","mtime":"2020-04-06T16:47:40+02:00","size":275,"digest":"d8106777ab26efc28f786a1345bd411a4a0a10da738b691e3f4deea96d3c3c3a","integrity":"sha256-2BBnd6sm78KPeGoTRb1BGkoKENpzi2keP03uqW08PDo="},"flags/1x1/sl-9b4b8d18e4921e812d1fc34279d9871d7b6d5a72feb8e451b4b4aed33890bee6.svg":{"logical_path":"flags/1x1/sl.svg","mtime":"2020-04-06T16:47:40+02:00","size":438,"digest":"9b4b8d18e4921e812d1fc34279d9871d7b6d5a72feb8e451b4b4aed33890bee6","integrity":"sha256-m0uNGOSSHoEtH8NCedmHHXttWnL+uORRtLSu0ziQvuY="},"flags/4x3/sm-d8ebb10444ef5bef482c0b886a617d832a62629887061d916f6e3af7ee49c01c.svg":{"logical_path":"flags/4x3/sm.svg","mtime":"2020-04-06T16:47:40+02:00","size":15801,"digest":"d8ebb10444ef5bef482c0b886a617d832a62629887061d916f6e3af7ee49c01c","integrity":"sha256-2OuxBETvW+9ILAuIamF9gypiYpiHBh2Rb2469+5JwBw="},"flags/1x1/sm-2cc3fc6d4667654a4842dba27cbd3fd6cb9e8f23ad1dc1fe78cbd9621b5e7d8d.svg":{"logical_path":"flags/1x1/sm.svg","mtime":"2020-04-06T16:47:40+02:00","size":15729,"digest":"2cc3fc6d4667654a4842dba27cbd3fd6cb9e8f23ad1dc1fe78cbd9621b5e7d8d","integrity":"sha256-LMP8bUZnZUpIQtuifL0/1suejyOtHcH+eMvZYhtefY0="},"flags/4x3/sn-e8f288fc52101ac915f7321dffce4c0af0a830244791f63efea069cbbc311ffa.svg":{"logical_path":"flags/4x3/sn.svg","mtime":"2020-04-06T16:47:40+02:00","size":424,"digest":"e8f288fc52101ac915f7321dffce4c0af0a830244791f63efea069cbbc311ffa","integrity":"sha256-6PKI/FIQGskV9zId/85MCvCoMCRHkfY+/qBpy7wxH/o="},"flags/1x1/sn-1e2477f3991b0329067f700db10898bc0761c241ecdbe5cf3c0a79998ee86748.svg":{"logical_path":"flags/1x1/sn.svg","mtime":"2020-04-06T16:47:40+02:00","size":414,"digest":"1e2477f3991b0329067f700db10898bc0761c241ecdbe5cf3c0a79998ee86748","integrity":"sha256-HiR385kbAykGf3ANsQiYvAdhwkHs2+XPPAp5mY7oZ0g="},"flags/4x3/so-50c5153e92331af5eb0bcda9b17ed8ded87f69f94803d50315514c8d95f241dd.svg":{"logical_path":"flags/4x3/so.svg","mtime":"2020-04-06T16:47:40+02:00","size":497,"digest":"50c5153e92331af5eb0bcda9b17ed8ded87f69f94803d50315514c8d95f241dd","integrity":"sha256-UMUVPpIzGvXrC82psX7Y3th/aflIA9UDFVFMjZXyQd0="},"flags/1x1/so-74f68a5972d287abb010860d78e9ea8158499c1187e9f30a533f14f62395aff3.svg":{"logical_path":"flags/1x1/so.svg","mtime":"2020-04-06T16:47:40+02:00","size":498,"digest":"74f68a5972d287abb010860d78e9ea8158499c1187e9f30a533f14f62395aff3","integrity":"sha256-dPaKWXLSh6uwEIYNeOnqgVhJnBGH6fMKUz8U9iOVr/M="},"flags/4x3/sr-04f64ba6540237ec9188f9f776ea8e300ab8da9e69b0987c7f84d57e485d03fa.svg":{"logical_path":"flags/4x3/sr.svg","mtime":"2020-04-06T16:47:40+02:00","size":315,"digest":"04f64ba6540237ec9188f9f776ea8e300ab8da9e69b0987c7f84d57e485d03fa","integrity":"sha256-BPZLplQCN+yRiPn3duqOMAq42p5psJh8f4TVfkhdA/o="},"flags/1x1/sr-e146a0ccedd75c58f6bbc1684b42662e295617bbad9fa96086b3ef3e6afe2278.svg":{"logical_path":"flags/1x1/sr.svg","mtime":"2020-04-06T16:47:40+02:00","size":320,"digest":"e146a0ccedd75c58f6bbc1684b42662e295617bbad9fa96086b3ef3e6afe2278","integrity":"sha256-4UagzO3XXFj2u8FoS0JmLilWF7utn6lghrPvPmr+Ing="},"flags/4x3/ss-d0545941635094a4083da0238fec28147c845f146e122c745d0977bd0c9433d6.svg":{"logical_path":"flags/4x3/ss.svg","mtime":"2020-04-06T16:47:40+02:00","size":386,"digest":"d0545941635094a4083da0238fec28147c845f146e122c745d0977bd0c9433d6","integrity":"sha256-0FRZQWNQlKQIPaAjj+woFHyEXxRuEix0XQl3vQyUM9Y="},"flags/1x1/ss-15466776e5a57ff54c2fba7cb590cd7f27298d38cbf2c1ddcde63a81d8e9c102.svg":{"logical_path":"flags/1x1/ss.svg","mtime":"2020-04-06T16:47:40+02:00","size":397,"digest":"15466776e5a57ff54c2fba7cb590cd7f27298d38cbf2c1ddcde63a81d8e9c102","integrity":"sha256-FUZnduWlf/VML7p8tZDNfycpjTjL8sHdzeY6gdjpwQI="},"flags/4x3/st-ebb813a81f4959663ce7a00f33acb9513cb0aeaacc6e6b42becf3964114b97a1.svg":{"logical_path":"flags/4x3/st.svg","mtime":"2020-04-06T16:47:40+02:00","size":916,"digest":"ebb813a81f4959663ce7a00f33acb9513cb0aeaacc6e6b42becf3964114b97a1","integrity":"sha256-67gTqB9JWWY856APM6y5UTywrqrMbmtCvs85ZBFLl6E="},"flags/1x1/st-a866043ab37ce805b64abec78b95b6c083271c13e8e1ec7ca96449410578e89d.svg":{"logical_path":"flags/1x1/st.svg","mtime":"2020-04-06T16:47:40+02:00","size":920,"digest":"a866043ab37ce805b64abec78b95b6c083271c13e8e1ec7ca96449410578e89d","integrity":"sha256-qGYEOrN86AW2Sr7Hi5W2wIMnHBPo4ex8qWRJQQV46J0="},"flags/4x3/sv-4a2c02ae1c8fa104bdf722d8040868f47d1159fc774e32082e7fd1516c0c8e6d.svg":{"logical_path":"flags/4x3/sv.svg","mtime":"2020-04-06T16:47:40+02:00","size":82697,"digest":"4a2c02ae1c8fa104bdf722d8040868f47d1159fc774e32082e7fd1516c0c8e6d","integrity":"sha256-SiwCrhyPoQS99yLYBAho9H0RWfx3TjIILn/RUWwMjm0="},"flags/1x1/sv-ece5f580bf1a30a24794f29e85b851709f2ff7adc3b8d5a88634b5df5a73533e.svg":{"logical_path":"flags/1x1/sv.svg","mtime":"2020-04-06T16:47:40+02:00","size":83238,"digest":"ece5f580bf1a30a24794f29e85b851709f2ff7adc3b8d5a88634b5df5a73533e","integrity":"sha256-7OX1gL8aMKJHlPKehbhRcJ8v963DuNWohjS131pzUz4="},"flags/4x3/sx-aa8a47e9aa8b9ba218c6875d2435df72740ab4c0b924869286b4cadb1365d49c.svg":{"logical_path":"flags/4x3/sx.svg","mtime":"2020-04-06T16:47:40+02:00","size":13209,"digest":"aa8a47e9aa8b9ba218c6875d2435df72740ab4c0b924869286b4cadb1365d49c","integrity":"sha256-qopH6aqLm6IYxoddJDXfcnQKtMC5JIaShrTK2xNl1Jw="},"flags/1x1/sx-ac716ddb83c8e34353666b6102c03688503eb97ae55ca9aeeb86c4e954ae8b06.svg":{"logical_path":"flags/1x1/sx.svg","mtime":"2020-04-06T16:47:40+02:00","size":12992,"digest":"ac716ddb83c8e34353666b6102c03688503eb97ae55ca9aeeb86c4e954ae8b06","integrity":"sha256-rHFt24PI40NTZmthAsA2iFA+uXrlXKmu64bE6VSuiwY="},"flags/4x3/sy-3b78773e392f046fb9b3f83bc34ce38515f72320c575d93c41c95d90ffb5d039.svg":{"logical_path":"flags/4x3/sy.svg","mtime":"2020-04-06T16:47:40+02:00","size":565,"digest":"3b78773e392f046fb9b3f83bc34ce38515f72320c575d93c41c95d90ffb5d039","integrity":"sha256-O3h3PjkvBG+5s/g7w0zjhRX3IyDFddk8QcldkP+10Dk="},"flags/1x1/sy-fdec8ea00a33abe5dfade7864c28d9ad713c3cda3e7d828ff699647da3e74446.svg":{"logical_path":"flags/1x1/sy.svg","mtime":"2020-04-06T16:47:40+02:00","size":579,"digest":"fdec8ea00a33abe5dfade7864c28d9ad713c3cda3e7d828ff699647da3e74446","integrity":"sha256-/eyOoAozq+XfreeGTCjZrXE8PNo+fYKP9plkfaPnREY="},"flags/4x3/sz-57cefe0c71e90edba3c03594a69a3a9a33f779c0c2405efaedb8d64290e28d1f.svg":{"logical_path":"flags/4x3/sz.svg","mtime":"2020-04-06T16:47:40+02:00","size":6742,"digest":"57cefe0c71e90edba3c03594a69a3a9a33f779c0c2405efaedb8d64290e28d1f","integrity":"sha256-V87+DHHpDtujwDWUppo6mjP3ecDCQF767bjWQpDijR8="},"flags/1x1/sz-ad977a6b06f85ee23b3ea5ec49f83363720525a3fd37475ef79cb59591c32951.svg":{"logical_path":"flags/1x1/sz.svg","mtime":"2020-04-06T16:47:40+02:00","size":6689,"digest":"ad977a6b06f85ee23b3ea5ec49f83363720525a3fd37475ef79cb59591c32951","integrity":"sha256-rZd6awb4XuI7PqXsSfgzY3IFJaP9N0de95y1lZHDKVE="},"flags/4x3/tc-c3e7a86e64d439e6b25dc833f685cd5461e9c5ce33d0f004f3570adfba65c9bc.svg":{"logical_path":"flags/4x3/tc.svg","mtime":"2020-04-06T16:47:40+02:00","size":14497,"digest":"c3e7a86e64d439e6b25dc833f685cd5461e9c5ce33d0f004f3570adfba65c9bc","integrity":"sha256-w+eobmTUOeayXcgz9oXNVGHpxc4z0PAE81cK37plybw="},"flags/1x1/tc-d91ac6bce029f8aa5b760be2a62884b67e03180eb9a9c67ae6066df67c85154c.svg":{"logical_path":"flags/1x1/tc.svg","mtime":"2020-04-06T16:47:40+02:00","size":14756,"digest":"d91ac6bce029f8aa5b760be2a62884b67e03180eb9a9c67ae6066df67c85154c","integrity":"sha256-2RrGvOAp+KpbdgvipiiEtn4DGA65qcZ65gZt9nyFFUw="},"flags/4x3/td-b6ce40aff60feef4e8fe1417f075b57688b5cc4c32d09296d02776a797e0b0d3.svg":{"logical_path":"flags/4x3/td.svg","mtime":"2020-04-06T16:47:40+02:00","size":267,"digest":"b6ce40aff60feef4e8fe1417f075b57688b5cc4c32d09296d02776a797e0b0d3","integrity":"sha256-ts5Ar/YP7vTo/hQX8HW1doi1zEwy0JKW0Cd2p5fgsNM="},"flags/1x1/td-ef115b3942ae5cb74b046b0a5faad35fbd6126d8c6fda489881b16494c8c632c.svg":{"logical_path":"flags/1x1/td.svg","mtime":"2020-04-06T16:47:40+02:00","size":279,"digest":"ef115b3942ae5cb74b046b0a5faad35fbd6126d8c6fda489881b16494c8c632c","integrity":"sha256-7xFbOUKuXLdLBGsKX6rTX71hJtjG/aSJiBsWSUyMYyw="},"flags/4x3/tf-0681ec54dffc4f628efd8b4726fc3f00c628aab4fb0c797c332c80a25d559820.svg":{"logical_path":"flags/4x3/tf.svg","mtime":"2020-04-06T16:47:40+02:00","size":1088,"digest":"0681ec54dffc4f628efd8b4726fc3f00c628aab4fb0c797c332c80a25d559820","integrity":"sha256-BoHsVN/8T2KO/YtHJvw/AMYoqrT7DHl8MyyAol1VmCA="},"flags/1x1/tf-90ad184cfd769cdda3da9c43b4fb5a494962f3095f38f4175ce37c371e0180d6.svg":{"logical_path":"flags/1x1/tf.svg","mtime":"2020-04-06T16:47:40+02:00","size":1196,"digest":"90ad184cfd769cdda3da9c43b4fb5a494962f3095f38f4175ce37c371e0180d6","integrity":"sha256-kK0YTP12nN2j2pxDtPtaSUli8wlfOPQXXON8Nx4BgNY="},"flags/4x3/tg-486dca2420c797d9a37b03d11767c9418b5e26d07c7c694d897b7d85092ea499.svg":{"logical_path":"flags/4x3/tg.svg","mtime":"2020-04-06T16:47:40+02:00","size":728,"digest":"486dca2420c797d9a37b03d11767c9418b5e26d07c7c694d897b7d85092ea499","integrity":"sha256-SG3KJCDHl9mjewPRF2fJQYteJtB8fGlNiXt9hQkupJk="},"flags/1x1/tg-830f49a57206bf654bc37aaa1668ee8840a23595b2ed440c968f81d961e820ad.svg":{"logical_path":"flags/1x1/tg.svg","mtime":"2020-04-06T16:47:40+02:00","size":733,"digest":"830f49a57206bf654bc37aaa1668ee8840a23595b2ed440c968f81d961e820ad","integrity":"sha256-gw9JpXIGv2VLw3qqFmjuiECiNZWy7UQMlo+B2WHoIK0="},"flags/4x3/th-4e206b563d27b5a7a3f7cabf944d6d278e6e8640018a72ce7b7ff989f1396df9.svg":{"logical_path":"flags/4x3/th.svg","mtime":"2020-04-06T16:47:40+02:00","size":287,"digest":"4e206b563d27b5a7a3f7cabf944d6d278e6e8640018a72ce7b7ff989f1396df9","integrity":"sha256-TiBrVj0ntaej98q/lE1tJ45uhkABinLOe3/5ifE5bfk="},"flags/1x1/th-cb480908e2c394e816623b7fcd5b63b484f25578fd89905d6aa1453bcd041887.svg":{"logical_path":"flags/1x1/th.svg","mtime":"2020-04-06T16:47:40+02:00","size":288,"digest":"cb480908e2c394e816623b7fcd5b63b484f25578fd89905d6aa1453bcd041887","integrity":"sha256-y0gJCOLDlOgWYjt/zVtjtITyVXj9iZBdaqFFO80EGIc="},"flags/4x3/tj-1a8979f03a820cec54ff4a900e843afee074f3b4004e1aeeb706caaea0379ffe.svg":{"logical_path":"flags/4x3/tj.svg","mtime":"2020-04-06T16:47:40+02:00","size":1812,"digest":"1a8979f03a820cec54ff4a900e843afee074f3b4004e1aeeb706caaea0379ffe","integrity":"sha256-Gol58DqCDOxU/0qQDoQ6/uB087QAThrutwbKrqA3n/4="},"flags/1x1/tj-a133d52c99a285aa2dd0b86739163bd5bb7a2c0eaa5a1fd522a11ec4b5b3bece.svg":{"logical_path":"flags/1x1/tj.svg","mtime":"2020-04-06T16:47:40+02:00","size":1767,"digest":"a133d52c99a285aa2dd0b86739163bd5bb7a2c0eaa5a1fd522a11ec4b5b3bece","integrity":"sha256-oTPVLJmihaot0LhnORY71bt6LA6qWh/VIqEexLWzvs4="},"flags/4x3/tk-3e49a632d5d87de3ef67aca8faa159c1b69bc16669f6c8c117748dc9625d1c58.svg":{"logical_path":"flags/4x3/tk.svg","mtime":"2020-04-06T16:47:40+02:00","size":788,"digest":"3e49a632d5d87de3ef67aca8faa159c1b69bc16669f6c8c117748dc9625d1c58","integrity":"sha256-PkmmMtXYfePvZ6yo+qFZwbabwWZp9sjBF3SNyWJdHFg="},"flags/1x1/tk-137c7ebb28233cdc2f417bc1e29bfad502ef7dd404c35ac36188e7dd98aecb6d.svg":{"logical_path":"flags/1x1/tk.svg","mtime":"2020-04-06T16:47:40+02:00","size":778,"digest":"137c7ebb28233cdc2f417bc1e29bfad502ef7dd404c35ac36188e7dd98aecb6d","integrity":"sha256-E3x+uygjPNwvQXvB4pv61QLvfdQEw1rDYYjn3Ziuy20="},"flags/4x3/tl-8662a8d01007fcbe0f41a694a5cd927265409d59b783b50e0bf4561302a77e40.svg":{"logical_path":"flags/4x3/tl.svg","mtime":"2020-04-06T16:47:40+02:00","size":603,"digest":"8662a8d01007fcbe0f41a694a5cd927265409d59b783b50e0bf4561302a77e40","integrity":"sha256-hmKo0BAH/L4PQaaUpc2ScmVAnVm3g7UOC/RWEwKnfkA="},"flags/1x1/tl-d26071ddf754d77ea56779d817e8c62f37a38fa64102e0c864901ff3941cffbf.svg":{"logical_path":"flags/1x1/tl.svg","mtime":"2020-04-06T16:47:40+02:00","size":577,"digest":"d26071ddf754d77ea56779d817e8c62f37a38fa64102e0c864901ff3941cffbf","integrity":"sha256-0mBx3fdU136lZ3nYF+jGLzejj6ZBAuDIZJAf85Qc/78="},"flags/4x3/tm-22b811ff90642de341a3e28a1775d1992d1f32088e922abddafca79157e3c2ec.svg":{"logical_path":"flags/4x3/tm.svg","mtime":"2020-04-06T16:47:40+02:00","size":32287,"digest":"22b811ff90642de341a3e28a1775d1992d1f32088e922abddafca79157e3c2ec","integrity":"sha256-IrgR/5BkLeNBo+KKF3XRmS0fMgiOkiq92vynkVfjwuw="},"flags/1x1/tm-42c8536f18d9a9878a90872649f0ec85b27ba59e1942ca5ac619f2f2f993aa38.svg":{"logical_path":"flags/1x1/tm.svg","mtime":"2020-04-06T16:47:40+02:00","size":31566,"digest":"42c8536f18d9a9878a90872649f0ec85b27ba59e1942ca5ac619f2f2f993aa38","integrity":"sha256-QshTbxjZqYeKkIcmSfDshbJ7pZ4ZQspaxhny8vmTqjg="},"flags/4x3/tn-5d05bcd60eb3118eae45baf24be63aab68e236ec6d19124eed90548f1ec42bd5.svg":{"logical_path":"flags/4x3/tn.svg","mtime":"2020-04-06T16:47:40+02:00","size":751,"digest":"5d05bcd60eb3118eae45baf24be63aab68e236ec6d19124eed90548f1ec42bd5","integrity":"sha256-XQW81g6zEY6uRbryS+Y6q2jiNuxtGRJO7ZBUjx7EK9U="},"flags/1x1/tn-84116fb50ddb30d2f08991ae4e3762d7191fe4387e1cf05d55a4e3f2e95c3c57.svg":{"logical_path":"flags/1x1/tn.svg","mtime":"2020-04-06T16:47:40+02:00","size":733,"digest":"84116fb50ddb30d2f08991ae4e3762d7191fe4387e1cf05d55a4e3f2e95c3c57","integrity":"sha256-hBFvtQ3bMNLwiZGuTjdi1xkf5Dh+HPBdVaTj8ulcPFc="},"flags/4x3/to-a2007667f47550dd1a6db5e83911fcc0acdf00909db626d592a9390c4e8aa1fa.svg":{"logical_path":"flags/4x3/to.svg","mtime":"2020-04-06T16:47:40+02:00","size":355,"digest":"a2007667f47550dd1a6db5e83911fcc0acdf00909db626d592a9390c4e8aa1fa","integrity":"sha256-ogB2Z/R1UN0abbXoORH8wKzfAJCdtibVkqk5DE6Kofo="},"flags/1x1/to-5e87ab54fa5f3124d1fc521d29259865fdd1f528e968dad12a33aff22ff788f2.svg":{"logical_path":"flags/1x1/to.svg","mtime":"2020-04-06T16:47:40+02:00","size":361,"digest":"5e87ab54fa5f3124d1fc521d29259865fdd1f528e968dad12a33aff22ff788f2","integrity":"sha256-XoerVPpfMSTR/FIdKSWYZf3R9SjpaNrRKjOv8i/3iPI="},"flags/4x3/tr-033a416ecc30a516c54c6a0fac2d212a38fb051e5976cda49eb9d22264814a66.svg":{"logical_path":"flags/4x3/tr.svg","mtime":"2020-04-06T16:47:40+02:00","size":554,"digest":"033a416ecc30a516c54c6a0fac2d212a38fb051e5976cda49eb9d22264814a66","integrity":"sha256-AzpBbswwpRbFTGoPrC0hKjj7BR5Zds2knrnSImSBSmY="},"flags/1x1/tr-74e60d09369c164cc245d49d109c78ea322a117e0fe58945c380b65a71c691ae.svg":{"logical_path":"flags/1x1/tr.svg","mtime":"2020-04-06T16:47:40+02:00","size":575,"digest":"74e60d09369c164cc245d49d109c78ea322a117e0fe58945c380b65a71c691ae","integrity":"sha256-dOYNCTacFkzCRdSdEJx46jIqEX4P5YlFw4C2WnHGka4="},"flags/4x3/tt-f6ac88577c57d12df95251c21a7adb68ced1720731d754a462d2958879b56e00.svg":{"logical_path":"flags/4x3/tt.svg","mtime":"2020-04-06T16:47:40+02:00","size":315,"digest":"f6ac88577c57d12df95251c21a7adb68ced1720731d754a462d2958879b56e00","integrity":"sha256-9qyIV3xX0S35UlHCGnrbaM7Rcgcx11SkYtKViHm1bgA="},"flags/1x1/tt-3d65dcbca5b7d40a1730e1c190d0c7e2874d1b3b44e0a0941ec033056044f3de.svg":{"logical_path":"flags/1x1/tt.svg","mtime":"2020-04-06T16:47:40+02:00","size":320,"digest":"3d65dcbca5b7d40a1730e1c190d0c7e2874d1b3b44e0a0941ec033056044f3de","integrity":"sha256-PWXcvKW31AoXMOHBkNDH4odNGztE4KCUHsAzBWBE894="},"flags/4x3/tv-6017cefb02fcc099faa8f072149bbce7f8c155ad6ffa620a6d6258409b786ce4.svg":{"logical_path":"flags/4x3/tv.svg","mtime":"2020-04-06T16:47:40+02:00","size":1783,"digest":"6017cefb02fcc099faa8f072149bbce7f8c155ad6ffa620a6d6258409b786ce4","integrity":"sha256-YBfO+wL8wJn6qPByFJu85/jBVa1v+mIKbWJYQJt4bOQ="},"flags/1x1/tv-add42a023b56a92f42007afb933e28e1d08d734e55ccecbfc3f9fae70701a240.svg":{"logical_path":"flags/1x1/tv.svg","mtime":"2020-04-06T16:47:40+02:00","size":1716,"digest":"add42a023b56a92f42007afb933e28e1d08d734e55ccecbfc3f9fae70701a240","integrity":"sha256-rdQqAjtWqS9CAHr7kz4o4dCNc05VzOy/w/n65wcBokA="},"flags/4x3/tw-44b7d1f3acc75aa8ff817b55d499dcb24770a3423b624bff829cb26729de7c16.svg":{"logical_path":"flags/4x3/tw.svg","mtime":"2020-04-06T16:47:40+02:00","size":945,"digest":"44b7d1f3acc75aa8ff817b55d499dcb24770a3423b624bff829cb26729de7c16","integrity":"sha256-RLfR86zHWqj/gXtV1Jncskdwo0I7Ykv/gpyyZynefBY="},"flags/1x1/tw-06af22c30adfccca9975a99fd05310568de59f039a14fd8dbabab7c17a33cb19.svg":{"logical_path":"flags/1x1/tw.svg","mtime":"2020-04-06T16:47:40+02:00","size":954,"digest":"06af22c30adfccca9975a99fd05310568de59f039a14fd8dbabab7c17a33cb19","integrity":"sha256-Bq8iwwrfzMqZdamf0FMQVo3lnwOaFP2Nurq3wXozyxk="},"flags/4x3/tz-1d5e7fb7a12497358a19b92671184b14664125a143d909abbee5615b57f7e988.svg":{"logical_path":"flags/4x3/tz.svg","mtime":"2020-04-06T16:47:40+02:00","size":549,"digest":"1d5e7fb7a12497358a19b92671184b14664125a143d909abbee5615b57f7e988","integrity":"sha256-HV5/t6EklzWKGbkmcRhLFGZBJaFD2QmrvuVhW1f36Yg="},"flags/1x1/tz-ad4c35de9f6aec57aac272de390d5730a75aa7e1a4431166a5dcea3bcbdc62f2.svg":{"logical_path":"flags/1x1/tz.svg","mtime":"2020-04-06T16:47:40+02:00","size":602,"digest":"ad4c35de9f6aec57aac272de390d5730a75aa7e1a4431166a5dcea3bcbdc62f2","integrity":"sha256-rUw13p9q7FeqwnLeOQ1XMKdap+GkQxFmpdzqO8vcYvI="},"flags/4x3/ua-fbbf0f0e9a6d6187561f38af9b3f28e3125e406c3deea268bcb64dac7a03a6aa.svg":{"logical_path":"flags/4x3/ua.svg","mtime":"2020-04-06T16:47:40+02:00","size":238,"digest":"fbbf0f0e9a6d6187561f38af9b3f28e3125e406c3deea268bcb64dac7a03a6aa","integrity":"sha256-+78PDpptYYdWHzivmz8o4xJeQGw97qJovLZNrHoDpqo="},"flags/1x1/ua-79092de6d22db0454898a7d17f26961709256110620e67933043799fa86b2296.svg":{"logical_path":"flags/1x1/ua.svg","mtime":"2020-04-06T16:47:40+02:00","size":238,"digest":"79092de6d22db0454898a7d17f26961709256110620e67933043799fa86b2296","integrity":"sha256-eQkt5tItsEVImKfRfyaWFwklYRBiDmeTMEN5n6hrIpY="},"flags/4x3/ug-001fa554127aafd736752727490db9f8893164c0369d0ba5cb6d742c44370975.svg":{"logical_path":"flags/4x3/ug.svg","mtime":"2020-04-06T16:47:40+02:00","size":3951,"digest":"001fa554127aafd736752727490db9f8893164c0369d0ba5cb6d742c44370975","integrity":"sha256-AB+lVBJ6r9c2dScnSQ25+IkxZMA2nQuly210LEQ3CXU="},"flags/1x1/ug-59bc76deefd22802e7d4ab2bd5e34f59c6bc112135c8052284410a0787954af9.svg":{"logical_path":"flags/1x1/ug.svg","mtime":"2020-04-06T16:47:40+02:00","size":4024,"digest":"59bc76deefd22802e7d4ab2bd5e34f59c6bc112135c8052284410a0787954af9","integrity":"sha256-Wbx23u/SKALn1Ksr1eNPWca8ESE1yAUihEEKB4eVSvk="},"flags/4x3/um-d2e8ac2079a27fb6f120ab4bc4d29597450bd01a9fedf9b7f5a09ad65e8dd164.svg":{"logical_path":"flags/4x3/um.svg","mtime":"2020-04-06T16:47:40+02:00","size":4523,"digest":"d2e8ac2079a27fb6f120ab4bc4d29597450bd01a9fedf9b7f5a09ad65e8dd164","integrity":"sha256-0uisIHmif7bxIKtLxNKVl0UL0Bqf7fm39aCa1l6N0WQ="},"flags/1x1/um-9674c82888b92fbbba22f3588e7d83e8c0ce887d9ccdf3abac317f9725530ab5.svg":{"logical_path":"flags/1x1/um.svg","mtime":"2020-04-06T16:47:40+02:00","size":3972,"digest":"9674c82888b92fbbba22f3588e7d83e8c0ce887d9ccdf3abac317f9725530ab5","integrity":"sha256-lnTIKIi5L7u6IvNYjn2D6MDOiH2czfOrrDF/lyVTCrU="},"flags/4x3/us-c70ba1cb67cc649da2b1f5dc4a26891437d8bba2cc098c88461e6bfc23949d9e.svg":{"logical_path":"flags/4x3/us.svg","mtime":"2020-04-06T16:47:40+02:00","size":4461,"digest":"c70ba1cb67cc649da2b1f5dc4a26891437d8bba2cc098c88461e6bfc23949d9e","integrity":"sha256-xwuhy2fMZJ2isfXcSiaJFDfYu6LMCYyIRh5r/COUnZ4="},"flags/1x1/us-c4ffd0455cf50bc1683646dc77e7263d81cffad51f36d3c39b85a9848fb5a196.svg":{"logical_path":"flags/1x1/us.svg","mtime":"2020-04-06T16:47:40+02:00","size":3921,"digest":"c4ffd0455cf50bc1683646dc77e7263d81cffad51f36d3c39b85a9848fb5a196","integrity":"sha256-xP/QRVz1C8FoNkbcd+cmPYHP+tUfNtPDm4WphI+1oZY="},"flags/4x3/uy-25c640333545843d345dbda694ca41c404dcaa69d3e32fbebc89d5620b5b881a.svg":{"logical_path":"flags/4x3/uy.svg","mtime":"2020-04-06T16:47:40+02:00","size":1718,"digest":"25c640333545843d345dbda694ca41c404dcaa69d3e32fbebc89d5620b5b881a","integrity":"sha256-JcZAMzVFhD00Xb2mlMpBxATcqmnT4y++vInVYgtbiBo="},"flags/1x1/uy-4466c6f09de93905872fe47bfc03c6e5a143cbf77cdfc93fcd450663572f3d60.svg":{"logical_path":"flags/1x1/uy.svg","mtime":"2020-04-06T16:47:40+02:00","size":1715,"digest":"4466c6f09de93905872fe47bfc03c6e5a143cbf77cdfc93fcd450663572f3d60","integrity":"sha256-RGbG8J3pOQWHL+R7/APG5aFDy/d838k/zUUGY1cvPWA="},"flags/4x3/uz-76a3658f5f45def0750a70247d604356ff4eba996b30aa23a657ac07044caed4.svg":{"logical_path":"flags/4x3/uz.svg","mtime":"2020-04-06T16:47:40+02:00","size":1454,"digest":"76a3658f5f45def0750a70247d604356ff4eba996b30aa23a657ac07044caed4","integrity":"sha256-dqNlj19F3vB1CnAkfWBDVv9OuplrMKojplesBwRMrtQ="},"flags/1x1/uz-96eba693faa2439ebee48d27072a67086b7be80001ec8c5e3f0743b37f2a42a1.svg":{"logical_path":"flags/1x1/uz.svg","mtime":"2020-04-06T16:47:40+02:00","size":1454,"digest":"96eba693faa2439ebee48d27072a67086b7be80001ec8c5e3f0743b37f2a42a1","integrity":"sha256-luumk/qiQ56+5I0nBypnCGt76AAB7IxePwdDs38qQqE="},"flags/4x3/va-89b12d71ce8ea74250d99da84ad4417c53eab133e4be8db99e6b8e0b26f71278.svg":{"logical_path":"flags/4x3/va.svg","mtime":"2020-04-06T16:47:40+02:00","size":91076,"digest":"89b12d71ce8ea74250d99da84ad4417c53eab133e4be8db99e6b8e0b26f71278","integrity":"sha256-ibEtcc6Op0JQ2Z2oStRBfFPqsTPkvo25nmuOCyb3Eng="},"flags/1x1/va-bcc69d5aaddda710e0c480c64f1ad9730ba45edd4692684fcca1c4f8083c5d19.svg":{"logical_path":"flags/1x1/va.svg","mtime":"2020-04-06T16:47:40+02:00","size":90711,"digest":"bcc69d5aaddda710e0c480c64f1ad9730ba45edd4692684fcca1c4f8083c5d19","integrity":"sha256-vMadWq3dpxDgxIDGTxrZcwukXt1GkmhPzKHE+Ag8XRk="},"flags/4x3/vc-55b7f903c7e603de7eec36bca0760a51930ae7ba90c2e758fcf3aa4d7e959ee5.svg":{"logical_path":"flags/4x3/vc.svg","mtime":"2020-04-06T16:47:40+02:00","size":451,"digest":"55b7f903c7e603de7eec36bca0760a51930ae7ba90c2e758fcf3aa4d7e959ee5","integrity":"sha256-Vbf5A8fmA95+7Da8oHYKUZMK57qQwudY/POqTX6VnuU="},"flags/1x1/vc-3be977d9f161a5800728de845aa7632df3263927fea4b03544400755d27e7c19.svg":{"logical_path":"flags/1x1/vc.svg","mtime":"2020-04-06T16:47:40+02:00","size":498,"digest":"3be977d9f161a5800728de845aa7632df3263927fea4b03544400755d27e7c19","integrity":"sha256-O+l32fFhpYAHKN6EWqdjLfMmOSf+pLA1REAHVdJ+fBk="},"flags/4x3/ve-3079fd19521114a5585b23e37a3d443676b52fd593b68bae5026c29de0bf5561.svg":{"logical_path":"flags/4x3/ve.svg","mtime":"2020-04-06T16:47:40+02:00","size":1168,"digest":"3079fd19521114a5585b23e37a3d443676b52fd593b68bae5026c29de0bf5561","integrity":"sha256-MHn9GVIRFKVYWyPjej1ENna1L9WTtouuUCbCneC/VWE="},"flags/1x1/ve-2fe0f692a6986f2b21ebd6260b6750b29a0487b9486e70fcf789e113ad0e1192.svg":{"logical_path":"flags/1x1/ve.svg","mtime":"2020-04-06T16:47:40+02:00","size":1188,"digest":"2fe0f692a6986f2b21ebd6260b6750b29a0487b9486e70fcf789e113ad0e1192","integrity":"sha256-L+D2kqaYbysh69YmC2dQspoEh7lIbnD894nhE60OEZI="},"flags/4x3/vg-509967cefab0422e7e4162aa75d3cede7620a4a17d9b2015adfa74e84051f364.svg":{"logical_path":"flags/4x3/vg.svg","mtime":"2020-04-06T16:47:40+02:00","size":24640,"digest":"509967cefab0422e7e4162aa75d3cede7620a4a17d9b2015adfa74e84051f364","integrity":"sha256-UJlnzvqwQi5+QWKqddPO3nYgpKF9myAVrfp06EBR82Q="},"flags/1x1/vg-caec07f09c87f0ebd2843dedf7e8fd5ebe3ed795b2649c648788775c65f48b31.svg":{"logical_path":"flags/1x1/vg.svg","mtime":"2020-04-06T16:47:40+02:00","size":24814,"digest":"caec07f09c87f0ebd2843dedf7e8fd5ebe3ed795b2649c648788775c65f48b31","integrity":"sha256-yuwH8JyH8OvShD3t9+j9Xr4+15WyZJxkh4h3XGX0izE="},"flags/4x3/vi-0c1811861e17033d8d2ee291edb8b710dc877fbec06ab4e4d250218724966032.svg":{"logical_path":"flags/4x3/vi.svg","mtime":"2020-04-06T16:47:40+02:00","size":8742,"digest":"0c1811861e17033d8d2ee291edb8b710dc877fbec06ab4e4d250218724966032","integrity":"sha256-DBgRhh4XAz2NLuKR7bi3ENyHf77AarTk0lAhhySWYDI="},"flags/1x1/vi-8112962dc3d3194f3bbf70018fcb5accc21d2cbd033957579427241fbd931e62.svg":{"logical_path":"flags/1x1/vi.svg","mtime":"2020-04-06T16:47:40+02:00","size":8697,"digest":"8112962dc3d3194f3bbf70018fcb5accc21d2cbd033957579427241fbd931e62","integrity":"sha256-gRKWLcPTGU87v3ABj8tazMIdLL0DOVdXlCckH72THmI="},"flags/4x3/vn-1768f5ce4bad46f4907f598e6097e6e1340500f4d7d75a76266f3e6ab9463d5e.svg":{"logical_path":"flags/4x3/vn.svg","mtime":"2020-04-06T16:47:40+02:00","size":494,"digest":"1768f5ce4bad46f4907f598e6097e6e1340500f4d7d75a76266f3e6ab9463d5e","integrity":"sha256-F2j1zkutRvSQf1mOYJfm4TQFAPTX11p2Jm8+arlGPV4="},"flags/1x1/vn-42db427a67708ab79be29119530cedf2108f7a4bcebfdf754a1d8faeedfadb77.svg":{"logical_path":"flags/1x1/vn.svg","mtime":"2020-04-06T16:47:40+02:00","size":498,"digest":"42db427a67708ab79be29119530cedf2108f7a4bcebfdf754a1d8faeedfadb77","integrity":"sha256-QttCemdwireb4pEZUwzt8hCPekvOv991Sh2Pru3623c="},"flags/4x3/vu-03a36a9550f9eba48a2cbe65dc4be5e00b79447fa6d0863378046cc5836a4014.svg":{"logical_path":"flags/4x3/vu.svg","mtime":"2020-04-06T16:47:40+02:00","size":3772,"digest":"03a36a9550f9eba48a2cbe65dc4be5e00b79447fa6d0863378046cc5836a4014","integrity":"sha256-A6NqlVD566SKLL5l3Evl4At5RH+m0IYzeARsxYNqQBQ="},"flags/1x1/vu-016c68fdb5c59b9342aa68a196d73fdf6b7a867694fc406d1338b507a4d05c56.svg":{"logical_path":"flags/1x1/vu.svg","mtime":"2020-04-06T16:47:40+02:00","size":3732,"digest":"016c68fdb5c59b9342aa68a196d73fdf6b7a867694fc406d1338b507a4d05c56","integrity":"sha256-AWxo/bXFm5NCqmihltc/32t6hnaU/EBtEzi1B6TQXFY="},"flags/4x3/wf-e8360ce364de6826f01716b7d320eef87621b70101c129df459682a790267f89.svg":{"logical_path":"flags/4x3/wf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"e8360ce364de6826f01716b7d320eef87621b70101c129df459682a790267f89","integrity":"sha256-6DYM42TeaCbwFxa30yDu+HYhtwEBwSnfRZaCp5Amf4k="},"flags/1x1/wf-5878874353a81033882d683151d7a94765656f867015f75985388e3817a37f8d.svg":{"logical_path":"flags/1x1/wf.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"5878874353a81033882d683151d7a94765656f867015f75985388e3817a37f8d","integrity":"sha256-WHiHQ1OoEDOILWgxUdepR2Vlb4ZwFfdZhTiOOBejf40="},"flags/4x3/ws-e77b5573407b1162d26d40dee59e28684aee6ebbff9961ac32242943c9e96e26.svg":{"logical_path":"flags/4x3/ws.svg","mtime":"2020-04-06T16:47:40+02:00","size":693,"digest":"e77b5573407b1162d26d40dee59e28684aee6ebbff9961ac32242943c9e96e26","integrity":"sha256-53tVc0B7EWLSbUDe5Z4oaErubrv/mWGsMiQpQ8npbiY="},"flags/1x1/ws-7cdc90f71e92b252dc69902df2f7ea33a7033a776a00199730239aa4e8fa8b18.svg":{"logical_path":"flags/1x1/ws.svg","mtime":"2020-04-06T16:47:40+02:00","size":706,"digest":"7cdc90f71e92b252dc69902df2f7ea33a7033a776a00199730239aa4e8fa8b18","integrity":"sha256-fNyQ9x6SslLcaZAt8vfqM6cDOndqABmXMCOapOj6ixg="},"flags/4x3/ye-ccc0af8c1220d0583d1432c0c340c21aad14e987d7d73d2601cc35451a37cf9c.svg":{"logical_path":"flags/4x3/ye.svg","mtime":"2020-04-06T16:47:40+02:00","size":275,"digest":"ccc0af8c1220d0583d1432c0c340c21aad14e987d7d73d2601cc35451a37cf9c","integrity":"sha256-zMCvjBIg0Fg9FDLAw0DCGq0U6YfX1z0mAcw1RRo3z5w="},"flags/1x1/ye-d7527d589cebe8037b89e642afcca050b9da0cb4e63ed52bbf116f8461f6c60e.svg":{"logical_path":"flags/1x1/ye.svg","mtime":"2020-04-06T16:47:40+02:00","size":275,"digest":"d7527d589cebe8037b89e642afcca050b9da0cb4e63ed52bbf116f8461f6c60e","integrity":"sha256-11J9WJzr6AN7ieZCr8ygULnaDLTmPtUrvxFvhGH2xg4="},"flags/4x3/yt-b1e78ed98f7111d6a115d73d2c604f5c1ef65ba9b01713ca47d914de0d22b351.svg":{"logical_path":"flags/4x3/yt.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"b1e78ed98f7111d6a115d73d2c604f5c1ef65ba9b01713ca47d914de0d22b351","integrity":"sha256-seeO2Y9xEdahFdc9LGBPXB72W6mwFxPKR9kU3g0is1E="},"flags/1x1/yt-794597839bd5ac5c9bdc0885fe713d3d0a69e38711f9a74654a1599d7c7a7927.svg":{"logical_path":"flags/1x1/yt.svg","mtime":"2020-04-06T16:47:40+02:00","size":292,"digest":"794597839bd5ac5c9bdc0885fe713d3d0a69e38711f9a74654a1599d7c7a7927","integrity":"sha256-eUWXg5vVrFyb3AiF/nE9PQpp44cR+adGVKFZnXx6eSc="},"flags/4x3/za-d2d473f4e2e4707604a7caac42f9cb6415bf5e8ce35b5e72bc78775d8aae03e5.svg":{"logical_path":"flags/4x3/za.svg","mtime":"2020-04-06T16:47:40+02:00","size":859,"digest":"d2d473f4e2e4707604a7caac42f9cb6415bf5e8ce35b5e72bc78775d8aae03e5","integrity":"sha256-0tRz9OLkcHYEp8qsQvnLZBW/XozjW15yvHh3XYquA+U="},"flags/1x1/za-3985889b8382293dbb3ae27353e864661415afa0ef66d291591b447df8bf8693.svg":{"logical_path":"flags/1x1/za.svg","mtime":"2020-04-06T16:47:40+02:00","size":872,"digest":"3985889b8382293dbb3ae27353e864661415afa0ef66d291591b447df8bf8693","integrity":"sha256-OYWIm4OCKT27OuJzU+hkZhQVr6DvZtKRWRtEffi/hpM="},"flags/4x3/zm-107a1d20ce64bbc59bdf3ef022215742bf5fd79d94636e7d4376586d2e0bb0b4.svg":{"logical_path":"flags/4x3/zm.svg","mtime":"2020-04-06T16:47:40+02:00","size":5497,"digest":"107a1d20ce64bbc59bdf3ef022215742bf5fd79d94636e7d4376586d2e0bb0b4","integrity":"sha256-EHodIM5ku8Wb3z7wIiFXQr9f152UY259Q3ZYbS4LsLQ="},"flags/1x1/zm-4b557cfd170ed4332809862db59879e1da2797deb4b24a288c525d0d72c0bb84.svg":{"logical_path":"flags/1x1/zm.svg","mtime":"2020-04-06T16:47:40+02:00","size":5401,"digest":"4b557cfd170ed4332809862db59879e1da2797deb4b24a288c525d0d72c0bb84","integrity":"sha256-S1V8/RcO1DMoCYYttZh54donl960skoojFJdDXLAu4Q="},"flags/4x3/zw-a357182ee43243cf7989366b10afb15296f814cba5d9a035e3d66ff401aaa115.svg":{"logical_path":"flags/4x3/zw.svg","mtime":"2020-04-06T16:47:40+02:00","size":6641,"digest":"a357182ee43243cf7989366b10afb15296f814cba5d9a035e3d66ff401aaa115","integrity":"sha256-o1cYLuQyQ895iTZrEK+xUpb4FMul2aA149Zv9AGqoRU="},"flags/1x1/zw-c763d38c87df2000c01e5faa5ef51823a9e076b7b9e8e52244ff35270a099401.svg":{"logical_path":"flags/1x1/zw.svg","mtime":"2020-04-06T16:47:40+02:00","size":6614,"digest":"c763d38c87df2000c01e5faa5ef51823a9e076b7b9e8e52244ff35270a099401","integrity":"sha256-x2PTjIffIADAHl+qXvUYI6ngdre56OUiRP81JwoJlAE="},"flags/4x3/es-ca-e6d65a5eae996b410a099eadfc691c380ad0f734578ce2ac14f2d5bf31eb63db.svg":{"logical_path":"flags/4x3/es-ca.svg","mtime":"2020-04-06T16:47:40+02:00","size":258,"digest":"e6d65a5eae996b410a099eadfc691c380ad0f734578ce2ac14f2d5bf31eb63db","integrity":"sha256-5tZaXq6Za0EKCZ6t/GkcOArQ9zRXjOKsFPLVvzHrY9s="},"flags/1x1/es-ca-620053dffeefac1c5eb2f455e2cada12044e5366ffa6516a3bd611ffbbe15dcd.svg":{"logical_path":"flags/1x1/es-ca.svg","mtime":"2020-04-06T16:47:40+02:00","size":257,"digest":"620053dffeefac1c5eb2f455e2cada12044e5366ffa6516a3bd611ffbbe15dcd","integrity":"sha256-YgBT3/7vrBxesvRV4sraEgROU2b/plFqO9YR/7vhXc0="},"flags/4x3/eu-8c749adacf82b6b5d58ce51dbcfa748c6bc6a9a205e5efcb6e96f126f8953f6e.svg":{"logical_path":"flags/4x3/eu.svg","mtime":"2020-04-06T16:47:40+02:00","size":1249,"digest":"8c749adacf82b6b5d58ce51dbcfa748c6bc6a9a205e5efcb6e96f126f8953f6e","integrity":"sha256-jHSa2s+CtrXVjOUdvPp0jGvGqaIF5e/LbpbxJviVP24="},"flags/1x1/eu-7085aed716bfce96bbfc2811fe55bc9855236a4216dd7c925fcb7c142578a3f9.svg":{"logical_path":"flags/1x1/eu.svg","mtime":"2020-04-06T16:47:40+02:00","size":1250,"digest":"7085aed716bfce96bbfc2811fe55bc9855236a4216dd7c925fcb7c142578a3f9","integrity":"sha256-cIWu1xa/zpa7/CgR/lW8mFUjakIW3XySX8t8FCV4o/k="},"flags/4x3/gb-eng-d2de597c10f3c833fd8c7bfbe818189e6209db19882a27398b8e180884697eca.svg":{"logical_path":"flags/4x3/gb-eng.svg","mtime":"2020-04-06T16:47:40+02:00","size":242,"digest":"d2de597c10f3c833fd8c7bfbe818189e6209db19882a27398b8e180884697eca","integrity":"sha256-0t5ZfBDzyDP9jHv76BgYnmIJ2xmIKic5i44YCIRpfso="},"flags/1x1/gb-eng-83388730d99f674d825da4c089650366b965abd338cf15f10f5aadfe0d8276ba.svg":{"logical_path":"flags/1x1/gb-eng.svg","mtime":"2020-04-06T16:47:40+02:00","size":232,"digest":"83388730d99f674d825da4c089650366b965abd338cf15f10f5aadfe0d8276ba","integrity":"sha256-gziHMNmfZ02CXaTAiWUDZrllq9M4zxXxD1qt/g2Cdro="},"flags/4x3/gb-nir-5130c70b20a02f9f6dfff69c9e55b3aa0054906318e4afc12c692dcfb7f55216.svg":{"logical_path":"flags/4x3/gb-nir.svg","mtime":"2020-04-06T16:47:40+02:00","size":25061,"digest":"5130c70b20a02f9f6dfff69c9e55b3aa0054906318e4afc12c692dcfb7f55216","integrity":"sha256-UTDHCyCgL59t//acnlWzqgBUkGMY5K/BLGktz7f1UhY="},"flags/1x1/gb-nir-f5c0a725da9e3e0d7321ae75c61ff5df64d065f1bdece6e2625201735177e558.svg":{"logical_path":"flags/1x1/gb-nir.svg","mtime":"2020-04-06T16:47:40+02:00","size":26487,"digest":"f5c0a725da9e3e0d7321ae75c61ff5df64d065f1bdece6e2625201735177e558","integrity":"sha256-9cCnJdqePg1zIa51xh/132TQZfG97ObiYlIBc1F35Vg="},"flags/4x3/gb-sct-bc44f4448f55c576b4f8e1aa1d61a8b28751dfae10cf3d26d0408befa6d0bde0.svg":{"logical_path":"flags/4x3/gb-sct.svg","mtime":"2020-04-06T16:47:40+02:00","size":231,"digest":"bc44f4448f55c576b4f8e1aa1d61a8b28751dfae10cf3d26d0408befa6d0bde0","integrity":"sha256-vET0RI9VxXa0+OGqHWGosodR364Qzz0m0ECL76bQveA="},"flags/1x1/gb-sct-21234ce6c027716f5ea7f9b5ad128aea007534f32ee77557f7e968c82e7627a1.svg":{"logical_path":"flags/1x1/gb-sct.svg","mtime":"2020-04-06T16:47:40+02:00","size":239,"digest":"21234ce6c027716f5ea7f9b5ad128aea007534f32ee77557f7e968c82e7627a1","integrity":"sha256-ISNM5sAncW9ep/m1rRKK6gB1NPMu53VX9+loyC52J6E="},"flags/4x3/gb-wls-2e24673349bd8ee843980d052d79c354f993efb345d1ef5ee0fe29807e8d19d4.svg":{"logical_path":"flags/4x3/gb-wls.svg","mtime":"2020-04-06T16:47:40+02:00","size":9161,"digest":"2e24673349bd8ee843980d052d79c354f993efb345d1ef5ee0fe29807e8d19d4","integrity":"sha256-LiRnM0m9juhDmA0FLXnDVPmT77NF0e9e4P4pgH6NGdQ="},"flags/1x1/gb-wls-23a0c563a49267894d20b55a5bf6089a582d1ac227a7144c975a191b8f751843.svg":{"logical_path":"flags/1x1/gb-wls.svg","mtime":"2020-04-06T16:47:40+02:00","size":9055,"digest":"23a0c563a49267894d20b55a5bf6089a582d1ac227a7144c975a191b8f751843","integrity":"sha256-I6DFY6SSZ4lNILVaW/YImlgtGsInpxRMl1oZG491GEM="},"flags/4x3/un-6685994fae5d4918c5b6aa20ed98c3bc736bb1bd88ad2d86b40261682766791d.svg":{"logical_path":"flags/4x3/un.svg","mtime":"2020-04-06T16:47:40+02:00","size":19935,"digest":"6685994fae5d4918c5b6aa20ed98c3bc736bb1bd88ad2d86b40261682766791d","integrity":"sha256-ZoWZT65dSRjFtqog7ZjDvHNrsb2IrS2GtAJhaCdmeR0="},"flags/1x1/un-774bae01cbe6a00e4daa93396d860d2ce3d53bb6a5a1f1470e11174fd9315d79.svg":{"logical_path":"flags/1x1/un.svg","mtime":"2020-04-06T16:47:40+02:00","size":20185,"digest":"774bae01cbe6a00e4daa93396d860d2ce3d53bb6a5a1f1470e11174fd9315d79","integrity":"sha256-d0uuAcvmoA5NqpM5bYYNLOPVO7alofFHDhEXT9kxXXk="},"flags/4x3/xk-201401507976e570a410ef6fea6a56db0e05749575bf61ba04a86c7724c6b5c1.svg":{"logical_path":"flags/4x3/xk.svg","mtime":"2020-04-06T16:47:40+02:00","size":9643,"digest":"201401507976e570a410ef6fea6a56db0e05749575bf61ba04a86c7724c6b5c1","integrity":"sha256-IBQBUHl25XCkEO9v6mpW2w4FdJV1v2G6BKhsdyTGtcE="},"flags/1x1/xk-a63525c9f71527db7258c39de2e41edb404955ffb3e5d2b9dd1a7f3173e3b028.svg":{"logical_path":"flags/1x1/xk.svg","mtime":"2020-04-06T16:47:40+02:00","size":8963,"digest":"a63525c9f71527db7258c39de2e41edb404955ffb3e5d2b9dd1a7f3173e3b028","integrity":"sha256-pjUlyfcVJ9tyWMOd4uQe20BJVf+z5dK53Rp/MXPjsCg="},"tags-0d512d7592918932ae6c9633e02d81053dac1efbdb34156d9ea903344f79f76c.css":{"logical_path":"tags.css","mtime":"2020-04-06T16:47:40+02:00","size":1377,"digest":"0d512d7592918932ae6c9633e02d81053dac1efbdb34156d9ea903344f79f76c","integrity":"sha256-DVEtdZKRiTKubJYz4C2BBT2sHvvbNBVtnqkDNE9592w="},"pages-9095e3d3785d23f61fcfb57e1cb9f4c10cf262409efe6d656b9710c721249e6c.js":{"logical_path":"pages.js","mtime":"2020-04-06T16:47:40+02:00","size":999,"digest":"9095e3d3785d23f61fcfb57e1cb9f4c10cf262409efe6d656b9710c721249e6c","integrity":"sha256-kJXj03hdI/Yfz7V+HLn0wQzyYkCe/m1la5cQxyEknmw="},"active_admin/print-f6ce3ffc349ca6c010940202a36b916e852d26179018d2cdc1513350bea7dcba.css":{"logical_path":"active_admin/print.css","mtime":"2022-04-04T22:49:05+02:00","size":7086,"digest":"cf99cbf27fb92065a9eacd28e6fad48fa72cadaf6e0918790e8d35b11d8f99f6","integrity":"sha256-z5nL8n+5IGWp6s0o5vrUj6csra9uCRh5Do01sR2PmfY="},"modernizr-79e0181ec91aff04bb01d87cba546535ede843f75d19f5c60f66b8dd6546971f.js":{"logical_path":"modernizr.js","mtime":"2022-05-27T21:42:11+02:00","size":51364,"digest":"ee94dda0af1fc5c5045741b39e54136015365eedca34095f1d3c666998bb442d","integrity":"sha256-7pTdoK8fxcUEV0GznlQTYBU2Xu3KNAlfHTxmaZi7RC0="},"font-awesome/fa-brands-400-5e54feb2d8cde6b938fa70c95c8e928eff34859e8aaa965b47320872a87ce547.eot":{"logical_path":"font-awesome/fa-brands-400.eot","mtime":"2020-08-25T22:06:58+02:00","size":131930,"digest":"e9fdf947c39f06f1b5e63c58eea2f2f74850421b4e32047dacb9c7b75dd42a16","integrity":"sha256-6f35R8OfBvG15jxY7qLy90hQQhtOMgR9rLnHt13UKhY="},"font-awesome/fa-regular-400-7cf61689b348595522e00a5634d9b35e7eb7a25d7ba7e9cce5f02484e1684377.eot":{"logical_path":"font-awesome/fa-regular-400.eot","mtime":"2020-08-25T22:06:58+02:00","size":34390,"digest":"c1465a6b8743622f759b08a6d5336e57eb6eabdba1b6393fba6d30d45382f3d2","integrity":"sha256-wUZaa4dDYi91mwim1TNuV+tuq9uhtjk/um0w1FOC89I="},"font-awesome/fa-solid-900-934a94434bf9d70c1240a78d5fe78757ff91d1264ae00a1741450e0eef8e9493.eot":{"logical_path":"font-awesome/fa-solid-900.eot","mtime":"2020-08-25T22:06:58+02:00","size":194066,"digest":"f29eef66eb3ad0e3574d8edb4b9e72a04692a0b2b92d99eb7c4b977611ddd4fe","integrity":"sha256-8p7vZus60ONXTY7bS55yoEaSoLK5LZnrfEuXdhHd1P4="},"font-awesome/fa-brands-400-e938fcdde52485595e32c17bcf19a8ff23390e2081b52352d8a345f5170dce7f.svg":{"logical_path":"font-awesome/fa-brands-400.svg","mtime":"2020-08-25T22:06:58+02:00","size":708706,"digest":"36b51fbe6b87587541b9173cd79c16c6b359ad22a172b922204f9aa87411acd9","integrity":"sha256-NrUfvmuHWHVBuRc815wWxrNZrSKhcrkiIE+aqHQRrNk="},"font-awesome/fa-regular-400-d20f2c71ef1e9a5b46e2aacfad2f759e8abdb20fce27fd6bc7d401af8fa7c93a.svg":{"logical_path":"font-awesome/fa-regular-400.svg","mtime":"2020-08-25T22:06:58+02:00","size":144322,"digest":"7ab8a39f4c48b743bd6acbbf5ea4c7547efcb62ad966e9bef3e41996afc44fd4","integrity":"sha256-erijn0xIt0O9asu/XqTHVH78tirZZum+8+QZlq/ET9Q="},"font-awesome/fa-solid-900-46cf582bfe3502172a3a4d54cfd380444289c03c9480a107f00c190db3722950.svg":{"logical_path":"font-awesome/fa-solid-900.svg","mtime":"2020-08-25T22:06:58+02:00","size":849145,"digest":"eaf0f3d0cadad17eed1045cf68c30db7abffb4c8ef4ee9cb5f4026fdefc99a59","integrity":"sha256-6vDz0Mra0X7tEEXPaMMNt6v/tMjvTunLX0Am/e/Jmlk="},"font-awesome/fa-brands-400-e9fa99e59489b4d9270af15949c0df98b805649278b41063f4221819b3d8772e.woff":{"logical_path":"font-awesome/fa-brands-400.woff","mtime":"2020-08-25T22:06:58+02:00","size":89100,"digest":"1af816db9a686faa76bfbda779df959e6213de714a94b87aa7374a151f6f4900","integrity":"sha256-GvgW25pob6p2v72ned+VnmIT3nFKlLh6pzdKFR9vSQA="},"font-awesome/fa-regular-400-ecc54652d705cda26767bc7dd7516893e0d2838b79be2427cb9188f9e4a64eff.woff":{"logical_path":"font-awesome/fa-regular-400.woff","mtime":"2020-08-25T22:06:58+02:00","size":16800,"digest":"864c8f702a5e63198bb76ef0240b599cc065d4904c2afc5da6c8a29bbf0d6c64","integrity":"sha256-hkyPcCpeYxmLt27wJAtZnMBl1JBMKvxdpsiim78NbGQ="},"font-awesome/fa-solid-900-fda129aceafe7c9c766010fbc4461fa2eb86563d80bbc15f0442dc7c674d9e39.woff":{"logical_path":"font-awesome/fa-solid-900.woff","mtime":"2020-08-25T22:06:58+02:00","size":98996,"digest":"3b60c77e0c81c1c9cdc9adb96ade6dbac7ef2b9402a316185855de7122e517db","integrity":"sha256-O2DHfgyBwcnNya25at5tusfvK5QCoxYYWFXecSLlF9s="},"tinymce-rails.manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js":{"logical_path":"tinymce-rails.manifest.js","mtime":"2022-04-11T11:07:13+02:00","size":3,"digest":"6a3cf5192354f71615ac51034b3e97c20eda99643fcaf5bbe6d41ad59bd12167","integrity":"sha256-ajz1GSNU9xYVrFEDSz6Xwg7amWQ/yvW75tQa1ZvRIWc="},"tinymce/jquery.tinymce-a7a666d7b38ac6b8c40928406cb4a074d651e544849694ed61fdb2285e81b477.js":{"logical_path":"tinymce/jquery.tinymce.js","mtime":"2020-08-25T22:06:57+02:00","size":6636,"digest":"11390388288c7c1a1a7e9caaad0fddefe117d60658325f210cd37072999ccbad","integrity":"sha256-ETkDiCiMfBoafpyqrQ/d7+EX1gZYMl8hDNNwcpmcy60="},"tinymce/plugins/emoticons/js/emojis-43f86383feec36f4242fda3a86055a3d063fba82a661647167c0725e69c38638.js":{"logical_path":"tinymce/plugins/emoticons/js/emojis.js","mtime":"2021-02-12T23:07:40+01:00","size":193223,"digest":"c617813820d61e9c41ebf47f1b97509e9c0b385153cda2ed07c33b13fb00feff","integrity":"sha256-xheBOCDWHpxB6/R/G5dQnpwLOFFTzaLtB8M7E/sA/v8="},"tinymce/skins/content/dark/content-8a230e2373a74566412e7941e7f1776e51fb58fc92da0a09dbf8add304ad2a10.css":{"logical_path":"tinymce/skins/content/dark/content.css","mtime":"2020-08-25T22:06:57+02:00","size":832,"digest":"6be8ae40ea68fbf4d9b33024e15b9f841050a13f1e91ab25e657b87da541ec04","integrity":"sha256-a+iuQOpo+/TZszAk4VufhBBQoT8ekasl5le4faVB7AQ="},"tinymce/skins/content/dark/content.min-8a230e2373a74566412e7941e7f1776e51fb58fc92da0a09dbf8add304ad2a10.css":{"logical_path":"tinymce/skins/content/dark/content.min.css","mtime":"2020-08-25T22:06:57+02:00","size":832,"digest":"6be8ae40ea68fbf4d9b33024e15b9f841050a13f1e91ab25e657b87da541ec04","integrity":"sha256-a+iuQOpo+/TZszAk4VufhBBQoT8ekasl5le4faVB7AQ="},"tinymce/skins/content/default/content-0b5678fc5add1150ea9fb103b8617b8f70168ae18e939c07a488b1f3f7fa028e.css":{"logical_path":"tinymce/skins/content/default/content.css","mtime":"2020-08-25T22:06:57+02:00","size":707,"digest":"d3c1ff087c66f0b11014c2851292a295ac5559daa2c9f96499808b8b6cf4401a","integrity":"sha256-08H/CHxm8LEQFMKFEpKilaxVWdqiyflkmYCLi2z0QBo="},"tinymce/skins/content/default/content.min-0b5678fc5add1150ea9fb103b8617b8f70168ae18e939c07a488b1f3f7fa028e.css":{"logical_path":"tinymce/skins/content/default/content.min.css","mtime":"2020-08-25T22:06:57+02:00","size":707,"digest":"d3c1ff087c66f0b11014c2851292a295ac5559daa2c9f96499808b8b6cf4401a","integrity":"sha256-08H/CHxm8LEQFMKFEpKilaxVWdqiyflkmYCLi2z0QBo="},"tinymce/skins/content/document/content-7d70f3c98198a157d0d99a9b75ffe5f071231f678ab2dce6409a449a19197a34.css":{"logical_path":"tinymce/skins/content/document/content.css","mtime":"2020-08-25T22:06:57+02:00","size":791,"digest":"402e66b491fb67e0ed3ad875fed913fbd265e9906fb4610f1d3701e94b80fcc0","integrity":"sha256-QC5mtJH7Z+DtOth1/tkT+9Jl6ZBvtGEPHTcB6UuA/MA="},"tinymce/skins/content/document/content.min-7d70f3c98198a157d0d99a9b75ffe5f071231f678ab2dce6409a449a19197a34.css":{"logical_path":"tinymce/skins/content/document/content.min.css","mtime":"2020-08-25T22:06:57+02:00","size":791,"digest":"402e66b491fb67e0ed3ad875fed913fbd265e9906fb4610f1d3701e94b80fcc0","integrity":"sha256-QC5mtJH7Z+DtOth1/tkT+9Jl6ZBvtGEPHTcB6UuA/MA="},"tinymce/skins/content/writer/content-d09946d43e172fe0cf69f0590d9ce2932a3212ddca1271922ac39f8d26c7781e.css":{"logical_path":"tinymce/skins/content/writer/content.css","mtime":"2020-08-25T22:06:57+02:00","size":728,"digest":"c1e6a9061ac3b75106e78cf28cf17c2f78f1c6fc8982917a21df32d563196129","integrity":"sha256-weapBhrDt1EG54zyjPF8L3jxxvyJgpF6Id8y1WMZYSk="},"tinymce/skins/content/writer/content.min-d09946d43e172fe0cf69f0590d9ce2932a3212ddca1271922ac39f8d26c7781e.css":{"logical_path":"tinymce/skins/content/writer/content.min.css","mtime":"2020-08-25T22:06:57+02:00","size":728,"digest":"c1e6a9061ac3b75106e78cf28cf17c2f78f1c6fc8982917a21df32d563196129","integrity":"sha256-weapBhrDt1EG54zyjPF8L3jxxvyJgpF6Id8y1WMZYSk="},"tinymce/skins/ui/oxide-dark/skin.mobile-f88bd33c7437e51a2e3fc58ae6e1760fa6f6ddb8604d5448dda4a2a206c95bac.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.css","mtime":"2022-04-04T22:49:05+02:00","size":20783,"digest":"b0a97925b320970c4b5846cf2c6f3a7222b1268563eeb89c11f20533f469346e","integrity":"sha256-sKl5JbMglwxLWEbPLG86ciKxJoVj7ricEfIFM/RpNG4="},"tinymce/skins/ui/oxide-dark/skin.mobile.min-f88bd33c7437e51a2e3fc58ae6e1760fa6f6ddb8604d5448dda4a2a206c95bac.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.min.css","mtime":"2022-04-04T22:49:05+02:00","size":20783,"digest":"b0a97925b320970c4b5846cf2c6f3a7222b1268563eeb89c11f20533f469346e","integrity":"sha256-sKl5JbMglwxLWEbPLG86ciKxJoVj7ricEfIFM/RpNG4="},"tinymce/skins/ui/oxide/skin.mobile-f88bd33c7437e51a2e3fc58ae6e1760fa6f6ddb8604d5448dda4a2a206c95bac.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.css","mtime":"2022-04-04T22:49:05+02:00","size":20783,"digest":"b0a97925b320970c4b5846cf2c6f3a7222b1268563eeb89c11f20533f469346e","integrity":"sha256-sKl5JbMglwxLWEbPLG86ciKxJoVj7ricEfIFM/RpNG4="},"tinymce/skins/ui/oxide/skin.mobile.min-f88bd33c7437e51a2e3fc58ae6e1760fa6f6ddb8604d5448dda4a2a206c95bac.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.min.css","mtime":"2022-04-04T22:49:05+02:00","size":20783,"digest":"b0a97925b320970c4b5846cf2c6f3a7222b1268563eeb89c11f20533f469346e","integrity":"sha256-sKl5JbMglwxLWEbPLG86ciKxJoVj7ricEfIFM/RpNG4="},"manifest-90aab26ade71e747f745b1227b433fd7d580a54f279ee2be6e1a67bb326bf03a.js":{"logical_path":"manifest.js","mtime":"2022-04-11T11:07:12+02:00","size":6,"digest":"d088784b7ecb87f1ea17e6f982fa968ffefcc07b79de6ecc548fc00242868da6","integrity":"sha256-0Ih4S37Lh/HqF+b5gvqWj/78wHt53m7MVI/AAkKGjaY="},"agendadescommuns-04172a222503a300e6ccc24863ac39c7e17aab83d4fddd47fa233b2ba10150ce.png":{"logical_path":"agendadescommuns.png","mtime":"2022-05-27T21:42:11+02:00","size":2760,"digest":"0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33","integrity":"sha256-ABe+9T9iYcs7+VLUt4DGQwc2lxSy4eLU659p39mGqzM="},"alert-4401130d700faadafe42bf322264e2689dae9ded22c1186c38ad2699d28b9715.png":{"logical_path":"alert.png","mtime":"2022-05-27T21:42:11+02:00","size":47876,"digest":"762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906","integrity":"sha256-dirOlHkygkOkQGE0a2TE1rmX6WPGjfxr3dnk0kEZKQY="},"baby_gnu_adl-16fb75eef2962c69ecbbe7c41bd49c38f9c59318aacbf18c8b8fefd41cc7be12.png":{"logical_path":"baby_gnu_adl.png","mtime":"2022-05-27T21:42:11+02:00","size":7411,"digest":"463a81820aa2d4ffd8e7210dbce1a19ffcac67ef362aa7b092280c6f95c903fc","integrity":"sha256-RjqBggqi1P/Y5yENvOGhn/ysZ+82KqewkigMb5XJA/w="},"baby_gnu_adl-70951d780455e377aa0564b263a36704960870d645900005d18eb907ac4627cb.svg":{"logical_path":"baby_gnu_adl.svg","mtime":"2022-05-27T21:42:11+02:00","size":109635,"digest":"97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e","integrity":"sha256-lyUQBdMiXPHVi4xJfWt5BdvJVgzIrNUBGPzOYNCiZ54="},"communs-04172a222503a300e6ccc24863ac39c7e17aab83d4fddd47fa233b2ba10150ce.png":{"logical_path":"communs.png","mtime":"2022-05-27T21:42:11+02:00","size":2760,"digest":"0017bef53f6261cb3bf952d4b780c64307369714b2e1e2d4eb9f69dfd986ab33","integrity":"sha256-ABe+9T9iYcs7+VLUt4DGQwc2lxSy4eLU659p39mGqzM="},"lef-small-5d6eb3183e342c1918feba6dcbefd7efbf9f8eb6058599a7a1d2252beb0369d0.png":{"logical_path":"lef-small.png","mtime":"2022-05-27T21:42:11+02:00","size":1059,"digest":"93285d531af463f877951d63fe844a6e9600b782c2c81f78723b730072fa942e","integrity":"sha256-kyhdUxr0Y/h3lR1j/oRKbpYAt4LCyB94cjtzAHL6lC4="},"lef-1422d96f5f5e792673b1ac60adc86797775bcf2630faf955ff0d0a35953837ba.png":{"logical_path":"lef.png","mtime":"2020-10-11T20:13:15+02:00","size":24674,"digest":"6508797f5a020d87aa0db27dcddd904ba3cc9e438adb1c90f5163af8377acaee","integrity":"sha256-ZQh5f1oCDYeqDbJ9zd2QS6PMnkOK2xyQ9RY6+Dd6yu4="},"linux-presentation-day-30da5011055ef1b832234bf8fa8777b60bda3fed09a3cf7ae36a507e1fb8f272.png":{"logical_path":"linux-presentation-day.png","mtime":"2022-05-27T21:42:11+02:00","size":9358,"digest":"863b30562924505dd21841220861f83643d310e0b943a0e6a905462ddfac86f1","integrity":"sha256-hjswVikkUF3SGEEiCGH4NkPTEOC5Q6DmqQVGLd+shvE="},"osm_logo-d4979005d8a03d67bbf051b4e7e6ef1b26c6a34a5cd1b65908e2947c360ca391.svg":{"logical_path":"osm_logo.svg","mtime":"2022-05-27T21:42:11+02:00","size":89730,"digest":"0e91a8acd0a92c1bf14204322322e57c65c2a7e318fec6907252fed929b7d6d3","integrity":"sha256-DpGorNCpLBvxQgQyIyLlfGXCp+MY/saQclL+2Sm31tM="},"priorite-logiciel-libre-je-soutiens-april_2_m-61a1cf930cdc5b1bd39dea68ef26aad7ea086d7baaf04f96b72ffaa5a7a68bdc.png":{"logical_path":"priorite-logiciel-libre-je-soutiens-april_2_m.png","mtime":"2022-05-27T21:42:11+02:00","size":16952,"digest":"6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc","integrity":"sha256-ZELkVOlu1FzB68QGc6bFC9KGucKOpqi1hXLpT31kWfw="},"regions/CA-QC-8d0df3da21ac158626b9aba2827b07d708e9fd1e6277414ab0d01f9a31ee5099.png":{"logical_path":"regions/CA-QC.png","mtime":"2022-05-27T21:42:11+02:00","size":469,"digest":"70699e6a6e25c69040a3f1548b0afd829c4903ccca2760b6c10f49cc87d5d174","integrity":"sha256-cGmeam4lxpBAo/FUiwr9gpxJA8zKJ2C2wQ9JzIfV0XQ="},"team-810a9268a50ca2d493299c8738aa15885a4fed1dd22101844b488b0071b6c44a.png":{"logical_path":"team.png","mtime":"2022-05-27T21:42:11+02:00","size":3586,"digest":"65c86021cf8a1154493664094aeafcbe3e5aa13dc675bb8ef34b220481db98fa","integrity":"sha256-ZchgIc+KEVRJNmQJSur8vj5aoT3GdbuO80siBIHbmPo="},"flags/4x3/ad-04b4b65e6a104b102172258b3894a9a4e29890aa63e8edc4812033dd7387b77e.svg":{"logical_path":"flags/4x3/ad.svg","mtime":"2022-05-27T21:42:11+02:00","size":33473,"digest":"af21bc50f12e6076f79dbddb6049ea32bf747e4a9dbf628781eaf29e81c6232c","integrity":"sha256-ryG8UPEuYHb3nb3bYEnqMr90fkqdv2KHgerynoHGIyw="},"flags/1x1/ad-847534ad5665b0bb24f766110a56922d9115cbd4c35746597e1fc5edb381b41a.svg":{"logical_path":"flags/1x1/ad.svg","mtime":"2022-05-27T21:42:11+02:00","size":32253,"digest":"5f301eee62631c50459507a29617ac02cc8106359da22b9705d3b73e50dcb839","integrity":"sha256-XzAe7mJjHFBFlQeilhesAsyBBjWdoiuXBdO3PlDcuDk="},"flags/4x3/ae-f6dd88c6cb3940f07ad1ee2635ec0f081d53885efea97c2f363f61c4f06129e8.svg":{"logical_path":"flags/4x3/ae.svg","mtime":"2022-05-27T21:42:11+02:00","size":254,"digest":"660f600189f77fbacd2099f5b898864e08a67d0cfe3905c390dcf6b86489dbe4","integrity":"sha256-Zg9gAYn3f7rNIJn1uJiGTgimfQz+OQXDkNz2uGSJ2+Q="},"flags/1x1/ae-c5992978bbf00ada1971a746b819936eb2f73aefac7f10518995545c2ccf2c10.svg":{"logical_path":"flags/1x1/ae.svg","mtime":"2022-05-27T21:42:11+02:00","size":262,"digest":"09943e355944d6870f74093d858503de204f02ca78f70122a5a7d74897134b6d","integrity":"sha256-CZQ+NVlE1ocPdAk9hYUD3iBPAsp49wEipafXSJcTS20="},"flags/4x3/af-745ad7e8ea956edf06641d01bf5a0374cfae6902846e62a30ed56ad80f889906.svg":{"logical_path":"flags/4x3/af.svg","mtime":"2022-05-27T21:42:11+02:00","size":21066,"digest":"c7bfd83db1aefc08972a093aca88285194feb05ab87fb5ede44acb107a2f84e0","integrity":"sha256-x7/YPbGu/AiXKgk6yogoUZT+sFq4f7Xt5ErLEHovhOA="},"flags/1x1/af-50e587ac98a5af98e21994909aa1f9898add6842954e2ad6a709d857b39a8b55.svg":{"logical_path":"flags/1x1/af.svg","mtime":"2022-05-27T21:42:11+02:00","size":20928,"digest":"f0fe67d6b190381b4b7a039173c8d74a2dc8f7773ca6ac79de25b0b14c8b80f0","integrity":"sha256-8P5n1rGQOBtLegORc8jXSi3I93c8pqx53iWwsUyLgPA="},"flags/4x3/ag-ec678db01740bd72757a7883a1dbea0c163e2b0a7a692cc8a0749c6f50428abb.svg":{"logical_path":"flags/4x3/ag.svg","mtime":"2022-05-27T21:42:11+02:00","size":749,"digest":"a986cf9b57900ccf9ac75cf39b5f519385e80dc6319fbf584c33e08e5b913d50","integrity":"sha256-qYbPm1eQDM+ax1zzm19Rk4XoDcYxn79YTDPgjluRPVA="},"flags/1x1/ag-35c11ca3ad0581842f9c1eddc462690e6166f94a8dbb15e248398df93a276004.svg":{"logical_path":"flags/1x1/ag.svg","mtime":"2022-05-27T21:42:11+02:00","size":761,"digest":"b0ee8dc5572db906f3765696c41fbaef3df72651fe0eaa306acfaa310ab80d06","integrity":"sha256-sO6NxVctuQbzdlaWxB+67z33JlH+Dqowas+qMQq4DQY="},"flags/4x3/ai-d688814fa60d2294b79b6ffe3d2a64e55a0bc013718cbf028b5d5720e3041794.svg":{"logical_path":"flags/4x3/ai.svg","mtime":"2022-05-27T21:42:11+02:00","size":48259,"digest":"efd0c274edd8ce7fc9b665c783f1fc297218b699965677ea0762fe46c0cceff6","integrity":"sha256-79DCdO3Yzn/JtmXHg/H8KXIYtpmWVnfqB2L+RsDM7/Y="},"flags/1x1/ai-850f5995f9b55ac8f30b35157cb1881d149e8257c168f39dbc8e51cae25c222d.svg":{"logical_path":"flags/1x1/ai.svg","mtime":"2022-05-27T21:42:11+02:00","size":48199,"digest":"b6ba8568e879a3c78e19c6aa712b47617c9ec91ab03de656f43a41bbbc1cf02f","integrity":"sha256-trqFaOh5o8eOGcaqcStHYXyeyRqwPeZW9DpBu7wc8C8="},"flags/4x3/al-5631be891ba0ccdb1f2a9b3a934031ed681aaeb139acc9e3b414e2561a608495.svg":{"logical_path":"flags/4x3/al.svg","mtime":"2022-05-27T21:42:11+02:00","size":3206,"digest":"87476e4c4b339983bcda71637a718eed1670bed1e39d7419db41b8f9db3a9485","integrity":"sha256-h0duTEszmYO82nFjenGO7RZwvtHjnXQZ20G4+ds6lIU="},"flags/1x1/al-96787887d75cd3bd02e8eff8a75ba0856873167743205a5cbfc5439197e3070d.svg":{"logical_path":"flags/1x1/al.svg","mtime":"2022-05-27T21:42:11+02:00","size":3205,"digest":"b8c66c9d8f77fe6292e524164c8072fdaf2728daae036fe52cf541dc8dcea217","integrity":"sha256-uMZsnY93/mKS5SQWTIBy/a8nKNquA2/lLPVB3I3Oohc="},"flags/4x3/am-fd6eb7b12b2bbd15d4e5db6949b57255849f5fecc62d9a48d848bab767f1123e.svg":{"logical_path":"flags/4x3/am.svg","mtime":"2022-05-27T21:42:11+02:00","size":223,"digest":"8244966df26ff96a23e4d1ec5411c7f8fdd2b935c48189dfb2e258bda95e986e","integrity":"sha256-gkSWbfJv+Woj5NHsVBHH+P3SuTXEgYnfsuJYvalemG4="},"flags/1x1/am-85e618fb93d8a64fc145ce0ebfb0397e5468816476df4c43ff0419dfea72d53b.svg":{"logical_path":"flags/1x1/am.svg","mtime":"2022-05-27T21:42:11+02:00","size":231,"digest":"48d3c9b60f3f9f482d83cd54459703e760b1a9524a290a491290588eb656387b","integrity":"sha256-SNPJtg8/n0gtg81URZcD52CxqVJKKQpJEpBYjrZWOHs="},"flags/4x3/ao-09b6b18d13202b859e9e94b9a88e59701b7b2d00d88d8a749f7f0d3bb71c745c.svg":{"logical_path":"flags/4x3/ao.svg","mtime":"2022-05-27T21:42:11+02:00","size":1588,"digest":"7ac46e1cd0c7d36c3229911376e38f7a9f578f627bd889f23ab5d5c9597cbc36","integrity":"sha256-esRuHNDH02wyKZETduOPep9Xj2J72InyOrXVyVl8vDY="},"flags/1x1/ao-dd2f7930f4f4214707f7a311f16cae422471094601319a5b69abeb48d384855c.svg":{"logical_path":"flags/1x1/ao.svg","mtime":"2022-05-27T21:42:11+02:00","size":1588,"digest":"b4bdbc4113ca80e45c6f96cf620a4638a4fea2dbd143780cc086531bb968ee63","integrity":"sha256-tL28QRPKgORcb5bPYgpGOKT+otvRQ3gMwIZTG7lo7mM="},"flags/4x3/aq-2adcc4b28a1da2ac271675b5377a39f226fe06b135d287215c153957b2176da2.svg":{"logical_path":"flags/4x3/aq.svg","mtime":"2022-05-27T21:42:11+02:00","size":6143,"digest":"62ee1988140dee84b7c8dd5ffa27db67b3242505b9ac16a91981cd05599c49b4","integrity":"sha256-Yu4ZiBQN7oS3yN1f+ifbZ7MkJQW5rBapGYHNBVmcSbQ="},"flags/1x1/aq-8809bb8b30a063b921c866da0a83236d7dd8a17148ef4c0db3c53ccd0dc15e6f.svg":{"logical_path":"flags/1x1/aq.svg","mtime":"2022-05-27T21:42:11+02:00","size":5958,"digest":"2fd9279bb4fe7bd6cb53aeab191764e3602ca9e5324e306dd178e9b229ab6d93","integrity":"sha256-L9knm7T+e9bLU66rGRdk42AsqeUyTjBt0XjpsimrbZM="},"flags/4x3/ar-8208e0546b8e666d806ee3fc3061504a62bf6cdea5fa4385d54c3ba131e3135c.svg":{"logical_path":"flags/4x3/ar.svg","mtime":"2022-05-27T21:42:11+02:00","size":3402,"digest":"036d9c340499588b37c3ff853da7ea105eb35fae876d7cfe034ebe3cc3764cd8","integrity":"sha256-A22cNASZWIs3w/+FPafqEF6zX66HbXz+A06+PMN2TNg="},"flags/1x1/ar-2d821fddef311e29c74ce2b19bbc651a2d613aebbd88f59ad8fc6c3a81544d1b.svg":{"logical_path":"flags/1x1/ar.svg","mtime":"2022-05-27T21:42:11+02:00","size":3473,"digest":"3c7a866d916efd9ab117bebd9651daceee196ee95e420f6fd6be8c8839c067d4","integrity":"sha256-PHqGbZFu/ZqxF769llHazu4ZbuleQg9v1r6MiDnAZ9Q="},"flags/4x3/as-a7ce0712972b05287e9ddf7da0e19630d4b440f0ce59b3a50397bc29d162192e.svg":{"logical_path":"flags/4x3/as.svg","mtime":"2022-05-27T21:42:11+02:00","size":8068,"digest":"3193ab22284dbfe3b88049d07de78b43be8bd841ff00e71e84e3c957cbdaee6a","integrity":"sha256-MZOrIihNv+O4gEnQfeeLQ76L2EH/AOcehOPJV8va7mo="},"flags/1x1/as-06505370c9bcfcad7b057757c3e892d12930db56565c0fd0bc86f4af5af5686f.svg":{"logical_path":"flags/1x1/as.svg","mtime":"2022-05-27T21:42:11+02:00","size":7828,"digest":"e8ce581d75d4d6262dcd1abdd577273cbb06d2b15e13df17427c8881775d5c81","integrity":"sha256-6M5YHXXU1iYtzRq91XcnPLsG0rFeE98XQnyIgXddXIE="},"flags/4x3/at-644b0cc2d91fe69f18d9992488a748efa0df7eb6ddc83ac79351ba9226956d25.svg":{"logical_path":"flags/4x3/at.svg","mtime":"2022-05-27T21:42:11+02:00","size":240,"digest":"1e513e59cf959d38287ad72edc6f07cda754b7621efb04ed74c333df73ff4176","integrity":"sha256-HlE+Wc+VnTgoetcu3G8HzadUt2Ie+wTtdMMz33P/QXY="},"flags/1x1/at-b36d3570a5102400e028dfa0b5204e9c2cd8d72b398e94bab5c51edd0954ce40.svg":{"logical_path":"flags/1x1/at.svg","mtime":"2022-05-27T21:42:11+02:00","size":242,"digest":"73ae6b3c0378e6855da2f6f164668218485117334175d68e44f88a3846a1e179","integrity":"sha256-c65rPAN45oVdovbxZGaCGEhRFzNBddaORPiKOEah4Xk="},"flags/4x3/au-887bb0cc0e77e15153e4c9006e785d5f68c77ca0ab9eb7f538e371a0e4f218af.svg":{"logical_path":"flags/4x3/au.svg","mtime":"2022-05-27T21:42:11+02:00","size":1546,"digest":"213bcc5e8c0c7defccd96f191f39e53f873da8129e55d230faafdd683d4168f9","integrity":"sha256-ITvMXowMfe/M2W8ZHznlP4c9qBKeVdIw+q/daD1BaPk="},"flags/1x1/au-ba82260247c564d9f4735fa2eeca092ac9b5d4e32c6a6a8db1d4177b746516a5.svg":{"logical_path":"flags/1x1/au.svg","mtime":"2022-05-27T21:42:11+02:00","size":1483,"digest":"dfc984d3a89cfdcaf4417482af869ee04c6d0399aa2905c7d3b5d09d5af4aa5a","integrity":"sha256-38mE06ic/cr0QXSCr4ae4ExtA5mqKQXH07XQnVr0qlo="},"flags/4x3/aw-ea7eeaeec20598c43c59a2536b150a7fb5e7f6443a5bfb7e1bd72aa7186be8e1.svg":{"logical_path":"flags/4x3/aw.svg","mtime":"2022-05-27T21:42:11+02:00","size":9951,"digest":"424db29f64f3c72757bc5542144a2347d30102d17aeb30ae977559fd68e6f637","integrity":"sha256-Qk2yn2TzxydXvFVCFEojR9MBAtF66zCul3VZ/Wjm9jc="},"flags/1x1/aw-c39c9c3d5de9ece42a7e717ac3670886532dd75d50a34e1b3ae10e39487679fb.svg":{"logical_path":"flags/1x1/aw.svg","mtime":"2022-05-27T21:42:11+02:00","size":12084,"digest":"b5162dba277197f89aa8ea36a1b50ec057d38b2e8d7229eadbe55fcc7fae20ac","integrity":"sha256-tRYtuidxl/iaqOo2obUOwFfTiy6Ncinq2+VfzH+uIKw="},"flags/4x3/ax-4825f85b2d4669c70f360bd63f1e36215d16bace4700dffc61992911de53198a.svg":{"logical_path":"flags/4x3/ax.svg","mtime":"2022-05-27T21:42:11+02:00","size":559,"digest":"e0b7f6dd55f2611d2a69e9f111dc39c5342069c32855f72933ff53e6f7488811","integrity":"sha256-4Lf23VXyYR0qaenxEdw5xTQgacMoVfcpM/9T5vdIiBE="},"flags/1x1/ax-ce68def4e721fcb48feb3b2aee81ad4ba7e75642ace96f24c059ee82b906c35b.svg":{"logical_path":"flags/1x1/ax.svg","mtime":"2022-05-27T21:42:11+02:00","size":541,"digest":"952771b31fc59cffe5c33677e6d701bcb782262e86a01e7a591eab5a11e47eb3","integrity":"sha256-lSdxsx/FnP/lwzZ35tcBvLeCJi6GoB56WR6rWhHkfrM="},"flags/4x3/az-9e3354b743219dbaf19cc54a63e1a8ed41d1f41485455330775b3b5c6dd6c9fe.svg":{"logical_path":"flags/4x3/az.svg","mtime":"2022-05-27T21:42:11+02:00","size":512,"digest":"3a16ff227d8a0295cf07c9f3fcab7e4004f0c4b6f18c5858dc1633cf6b16fe78","integrity":"sha256-Ohb/In2KApXPB8nz/Kt+QATwxLbxjFhY3BYzz2sW/ng="},"flags/1x1/az-4e93f9eef0ef96515e8c152c87d4a278d725ecb20108257105c9ccd48a156ddb.svg":{"logical_path":"flags/1x1/az.svg","mtime":"2022-05-27T21:42:11+02:00","size":498,"digest":"ce76ab744019e9980d0b9dda74b664e933461cf96eeb305a858a39b9a38b9b17","integrity":"sha256-znardEAZ6ZgNC53adLZk6TNGHPlu6zBahYo5uaOLmxc="},"flags/4x3/ba-7e420cae1feb7be337a34f25fb8fd6421295cde2e03273efa7e880d7d5d9281e.svg":{"logical_path":"flags/4x3/ba.svg","mtime":"2022-05-27T21:42:11+02:00","size":1310,"digest":"0145a56b0f2d7e25856b2c62fcef5a8e2d62257ec67c0806fa0e92933082503e","integrity":"sha256-AUWlaw8tfiWFayxi/O9aji1iJX7GfAgG+g6SkzCCUD4="},"flags/1x1/ba-2e20ab2d7c91e67460cc9a910016a7706b0d7e5865895cce6b835b4f557cc861.svg":{"logical_path":"flags/1x1/ba.svg","mtime":"2022-05-27T21:42:11+02:00","size":1242,"digest":"b4466a08b71725f8b5057ef0946b19d77a4d23eed0b81fd1abe4380dd6dde3c1","integrity":"sha256-tEZqCLcXJfi1BX7wlGsZ13pNI+7QuB/Rq+Q4Ddbd48E="},"flags/4x3/bb-35373b19bd542d0382d79bbd162be7583932adbb180c8b6223614a52c31fb1a0.svg":{"logical_path":"flags/4x3/bb.svg","mtime":"2022-05-27T21:42:11+02:00","size":609,"digest":"667b79ca265802e179cfdc8ab06295e9e23301659f610ea11005b7415ae98673","integrity":"sha256-Znt5yiZYAuF5z9yKsGKV6eIzAWWfYQ6hEAW3QVrphnM="},"flags/1x1/bb-f5d71a0072d6dbc25a4264c4ab0d997b785550f8e6581230c22bb30fec7c9841.svg":{"logical_path":"flags/1x1/bb.svg","mtime":"2022-05-27T21:42:11+02:00","size":609,"digest":"2ce0c4f55ba85069897fa15337b07e10470c9846698257bea85971d4307b417c","integrity":"sha256-LODE9VuoUGmJf6FTN7B+EEcMmEZpgle+qFlx1DB7QXw="},"flags/4x3/bd-0531b5c730836d8ecfb4b9b79aad2e560dfc53a30e65f2a4030d2f275827f5ae.svg":{"logical_path":"flags/4x3/bd.svg","mtime":"2022-05-27T21:42:11+02:00","size":190,"digest":"d5ee762ba69448db5fadd6a18f5213ca922c0f04fe7d47bca6983afbb301fe2e","integrity":"sha256-1e52K6aUSNtfrdahj1ITypIsDwT+fUe8ppg6+7MB/i4="},"flags/1x1/bd-c35883811cce9a21ef91202da7fc4648cc62b9ffee53a5ad0a88b179494e95fc.svg":{"logical_path":"flags/1x1/bd.svg","mtime":"2022-05-27T21:42:11+02:00","size":192,"digest":"749b63aa937201843f63cedfd7d0db3019ddf95b931b4be80693716fd2b84cce","integrity":"sha256-dJtjqpNyAYQ/Y87f19DbMBnd+VuTG0voBpNxb9K4TM4="},"flags/4x3/be-ac7f9445060d07698cf4c4b5126b13397e12949102326caa3179eb98d4a90974.svg":{"logical_path":"flags/4x3/be.svg","mtime":"2022-05-27T21:42:11+02:00","size":290,"digest":"b3df2b94815bb9f38846ee9bf98e13f70cee99f9b08d80b95f96117255bb14ae","integrity":"sha256-s98rlIFbufOIRu6b+Y4T9wzumfmwjYC5X5YRclW7FK4="},"flags/1x1/be-61e1bb398ed6bf0253a21f9e32feb26395cf5aec5dc05640235d4accf43c2ee1.svg":{"logical_path":"flags/1x1/be.svg","mtime":"2022-05-27T21:42:11+02:00","size":290,"digest":"b998bdfa696aaa291b5c97eb783c3b525082462dc1fa69d32ded3a3df758eacc","integrity":"sha256-uZi9+mlqqikbXJfreDw7UlCCRi3B+mnTLe06PfdY6sw="},"flags/4x3/bf-4f19b8dfd521393da6d1f2ca95cc79d22d558c34c3d74b2718417d9df29726f3.svg":{"logical_path":"flags/4x3/bf.svg","mtime":"2022-05-27T21:42:11+02:00","size":357,"digest":"bb500b0772dba72a64a3cede92898c2803bb9fbd72743826590cce2a8f4dd066","integrity":"sha256-u1ALB3Lbpypko87ekomMKAO7n71ydDgmWQzOKo9N0GY="},"flags/1x1/bf-7b037b76d1915df2f978852ebc0b88e6fa9abf8d579ed85e360d081b8f95e09c.svg":{"logical_path":"flags/1x1/bf.svg","mtime":"2022-05-27T21:42:11+02:00","size":383,"digest":"8f795ecc74ce0431b735094709b535fe2f6ffc49efc32976106ba332741c2244","integrity":"sha256-j3lezHTOBDG3NQlHCbU1/i9v/Envwyl2EGujMnQcIkQ="},"flags/4x3/bg-1433c1cd05916af99e2db72a9e2c6d7532013a619770b66b51595fcd349cbaa6.svg":{"logical_path":"flags/4x3/bg.svg","mtime":"2022-05-27T21:42:11+02:00","size":286,"digest":"c67e049a9f003f098e554808e74e3359970e4df9adcfb69b33dcb7bfd5b7a8c5","integrity":"sha256-xn4Emp8APwmOVUgI504zWZcOTfmtz7abM9y3v9W3qMU="},"flags/1x1/bg-d631585f0e0981298746582b913765429bbcdd2349cc6062b8e9e790be5f31f0.svg":{"logical_path":"flags/1x1/bg.svg","mtime":"2022-05-27T21:42:11+02:00","size":294,"digest":"9ddbc7b674ff21cbf2c0d82ae5e701f89902c4ce8841585e25d8e5ce36902205","integrity":"sha256-ndvHtnT/IcvywNgq5ecB+JkCxM6IQVheJdjlzjaQIgU="},"flags/4x3/bh-d677a52979c37517212e9b9b6697541a366b0104e09808d396a6d02411a983f5.svg":{"logical_path":"flags/4x3/bh.svg","mtime":"2022-05-27T21:42:11+02:00","size":517,"digest":"b89b1dd1f40b59b119a3788653182317859e93b7e506ba08516de97b8590803e","integrity":"sha256-uJsd0fQLWbEZo3iGUxgjF4Wek7flBroIUW3pe4WQgD4="},"flags/1x1/bh-d408321e7282b8ee67413917d3063536197d8ceeb23abc05677d748ebb8a6378.svg":{"logical_path":"flags/1x1/bh.svg","mtime":"2022-05-27T21:42:11+02:00","size":538,"digest":"9a6f53af3af276804af165a6df525364ab0775485e209f3f84a351a9c8537df8","integrity":"sha256-mm9TrzrydoBK8WWm31JTZKsHdUheIJ8/hKNRqchTffg="},"flags/4x3/bi-6323bc95384cf7a6ea6c91332c3054e55152b391e8f823828df3d05a3e40854a.svg":{"logical_path":"flags/4x3/bi.svg","mtime":"2022-05-27T21:42:11+02:00","size":1074,"digest":"d9cc0b58ddd6c7a1147999f96ff25d4fd80e00a71636f2e0dba952f0c5771532","integrity":"sha256-2cwLWN3Wx6EUeZn5b/JdT9gOAKcWNvLg26lS8MV3FTI="},"flags/1x1/bi-e79238de5c139c78aeb157e1b7d5646a79dc5e154f35ad49aeae21321c0a8d78.svg":{"logical_path":"flags/1x1/bi.svg","mtime":"2022-05-27T21:42:11+02:00","size":1042,"digest":"78476c6682fd0fdc9d621974a6e8daab640383db2f95603a9acdbfbc1d8ebfc3","integrity":"sha256-eEdsZoL9D9ydYhl0pujaq2QDg9svlWA6ms2/vB2Ov8M="},"flags/4x3/bj-951d79103aea5585768fa178923f6127f918fc01d02556174dff9f8506cf90ea.svg":{"logical_path":"flags/4x3/bj.svg","mtime":"2022-05-27T21:42:11+02:00","size":502,"digest":"9085e2dc8e991e0dc1e0192979ca19db8dd9e22cd8ec7228f6289e2b8231a9c2","integrity":"sha256-kIXi3I6ZHg3B4BkpecoZ243Z4izY7HIo9iieK4IxqcI="},"flags/1x1/bj-7f5cc7510ece68a729788fcfbebd91dd941e0014ba3187b66bcd3da245c78460.svg":{"logical_path":"flags/1x1/bj.svg","mtime":"2022-05-27T21:42:11+02:00","size":499,"digest":"126f6103d81a930d8d8e185e1064c6502e99d1709e622e371b551f6b0f460ccb","integrity":"sha256-Em9hA9gakw2NjhheEGTGUC6Z0XCeYi43G1Ufaw9GDMs="},"flags/4x3/bl-cc250a31e29ac0fe10c9e79a35920b280f6ec2731b9d5f701b2313bee631e114.svg":{"logical_path":"flags/4x3/bl.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"1c0fc0dc03abc76091b6e9b874ab94975b4fb6898ff39dd8fc4705f81b1c94f2","integrity":"sha256-HA/A3AOrx2CRtum4dKuUl1tPtomP853Y/EcF+BsclPI="},"flags/1x1/bl-cfb5dd954f586d0662e09cdcbd338da8e225d481896414688262e2bd14c38c8a.svg":{"logical_path":"flags/1x1/bl.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"b41eb06ebe9a9ad8176b247be6884b2d2562261aac85b148bb4fc953477701b3","integrity":"sha256-tB6wbr6amtgXayR75ohLLSViJhqshbFIu0/JU0d3AbM="},"flags/4x3/bm-1e95c5f49d3f1f4a7049a82cdcd6ae326e4c37effd2249df9f7df423942b7396.svg":{"logical_path":"flags/4x3/bm.svg","mtime":"2022-05-27T21:42:11+02:00","size":22569,"digest":"13cb511dd4f639bcb07b08499c6a596ef4a300745a740f5158e70bef9823913a","integrity":"sha256-E8tRHdT2ObywewhJnGpZbvSjAHRadA9RWOcL75gjkTo="},"flags/1x1/bm-e0b05c8af03f5fe3728e191b24bedb2ac2429b86abfba4fa14b7d48960883d9c.svg":{"logical_path":"flags/1x1/bm.svg","mtime":"2022-05-27T21:42:11+02:00","size":22270,"digest":"1af07e53e38af85994614d0e3a1edfae8f5c74091a82c63a051ac1ae889e5125","integrity":"sha256-GvB+U+OK+FmUYU0OOh7fro9cdAkagsY6BRrBroieUSU="},"flags/4x3/bn-2e92465bcaef939fcf20029aedac6af2262eb4ee25e36d64bcf98d03976bbbe9.svg":{"logical_path":"flags/4x3/bn.svg","mtime":"2022-05-27T21:42:11+02:00","size":14213,"digest":"7c5eafd90f22b14301a5784167e70326557e8732de95e702d9780afb9ba351f6","integrity":"sha256-fF6v2Q8isUMBpXhBZ+cDJlV+hzLelecC2XgK+5ujUfY="},"flags/1x1/bn-6a56361917ec344da75ebb87a3713a2eaaf4605d84b1f1e3db1a8df6685bfb3f.svg":{"logical_path":"flags/1x1/bn.svg","mtime":"2022-05-27T21:42:11+02:00","size":14359,"digest":"58930c2508f1ade40240bc93e4fad7de229e1f7b6ca3e5f8bdb97fecda54f24e","integrity":"sha256-WJMMJQjxreQCQLyT5PrX3iKeH3tso+X4vbl/7NpU8k4="},"flags/4x3/bo-4c581c015880880d328153d007fc2517a7e0b53126c1a3a676e4abbb19e4c7fb.svg":{"logical_path":"flags/4x3/bo.svg","mtime":"2022-05-27T21:42:11+02:00","size":117062,"digest":"4ab35795d73ec5cc7ce784bedbd1c72c7ab5402f3665998d998c1b6e244bf4bc","integrity":"sha256-SrNXldc+xcx854S+29HHLHq1QC82ZZmNmYwbbiRL9Lw="},"flags/1x1/bo-ec135db8db19ecafc614799d5e9e459cc5d8e9d91308f7d4511f3b95f8ee1054.svg":{"logical_path":"flags/1x1/bo.svg","mtime":"2022-05-27T21:42:11+02:00","size":118659,"digest":"2a091af9404186fae5b2a5044b061ace8ffa53a874187caf007842ca70bb4294","integrity":"sha256-Kgka+UBBhvrlsqUESwYazo/6U6h0GHyvAHhCynC7QpQ="},"flags/4x3/bq-973b8d977bde843039e96a9229d803fcbb1c29ba92272b8bc3223b28b8ccc803.svg":{"logical_path":"flags/4x3/bq.svg","mtime":"2022-05-27T21:42:11+02:00","size":224,"digest":"4f69e04ac3651b9112d1411a085bd6d632544c593fad9d20c27616d809746f07","integrity":"sha256-T2ngSsNlG5ES0UEaCFvW1jJUTFk/rZ0gwnYW2Al0bwc="},"flags/1x1/bq-78c259288833d36f4d2209a4a95ca18cd3c18820f79f49b278bf7960cf5b34e7.svg":{"logical_path":"flags/1x1/bq.svg","mtime":"2022-05-27T21:42:11+02:00","size":228,"digest":"21e4c616d5cd5c0486640b66400d9c8559cab08650e7601e291c4f5b1643a6ab","integrity":"sha256-IeTGFtXNXASGZAtmQA2chVnKsIZQ52AeKRxPWxZDpqs="},"flags/4x3/br-68ee8e029f99c31821e646aec1c8e9e8f8b1aaf26d72909ac75ff38c1f8e9201.svg":{"logical_path":"flags/4x3/br.svg","mtime":"2022-05-27T21:42:11+02:00","size":8097,"digest":"5626545274de6de8e4e2c0f800b7b664bc3521f0ee9bc98547f3cbec3effe2d8","integrity":"sha256-ViZUUnTebejk4sD4ALe2ZLw1IfDum8mFR/PL7D7/4tg="},"flags/1x1/br-746af5283e4e792a1a7f94d934cac1e45c94470c4ffd37df5d1ab10bec2fd4db.svg":{"logical_path":"flags/1x1/br.svg","mtime":"2022-05-27T21:42:11+02:00","size":7686,"digest":"38e5114c9912eb4f5f1944b4e43eeb96791ef552d855a2f16e177ce7ce145d5e","integrity":"sha256-OOURTJkS609fGUS05D7rlnke9VLYVaLxbhd8584UXV4="},"flags/4x3/bs-7b507794ee3f8d7e6b0c5739552e37cd2ab0596fab63a03f20fde4249cbf18d2.svg":{"logical_path":"flags/4x3/bs.svg","mtime":"2022-05-27T21:42:11+02:00","size":552,"digest":"d45540c1f333ad6b70ae998b317d6c545b2f608b896dc384da069459dd6f0838","integrity":"sha256-1FVAwfMzrWtwrpmLMX1sVFsvYIuJbcOE2gaUWd1vCDg="},"flags/1x1/bs-277f44ad225c320c1a44610721f5b3a457d7e3d649593b598d59e2ce5164f727.svg":{"logical_path":"flags/1x1/bs.svg","mtime":"2022-05-27T21:42:11+02:00","size":568,"digest":"f10d64856c57efee0f27b3e7960de782f38e026aa55402e801f10bd5ab505dcf","integrity":"sha256-8Q1khWxX7+4PJ7Pnlg3ngvOOAmqlVALoAfEL1atQXc8="},"flags/4x3/bt-2f99024e1cec950a6bce184bc2d8a27629efdab8178a28bad798881ac3167710.svg":{"logical_path":"flags/4x3/bt.svg","mtime":"2022-05-27T21:42:11+02:00","size":25227,"digest":"6f109e6e0465742b9a132f29d356bab77e47f8429263056d4dd77f1f6cdae063","integrity":"sha256-bxCebgRldCuaEy8p01a6t35H+EKSYwVtTdd/H2za4GM="},"flags/1x1/bt-77d4f8b9a2c3dadacce904304c524b507e2a0d4109cf6506aa8cc1c131c359ad.svg":{"logical_path":"flags/1x1/bt.svg","mtime":"2022-05-27T21:42:11+02:00","size":25045,"digest":"569e13412ede4f000d327ac29c21c49b051d6043719fdad19eabec3a04d44f36","integrity":"sha256-Vp4TQS7eTwANMnrCnCHEmwUdYENxn9rRnqvsOgTUTzY="},"flags/4x3/bv-de8bb212ed5afdf6d557928d784ed98d2e2baa7aaaf2ced7abc5cf13fa540423.svg":{"logical_path":"flags/4x3/bv.svg","mtime":"2022-05-27T21:42:11+02:00","size":585,"digest":"f251755196f171e5d7ab2684a09ce6dfef2037cc273bb14460934e1a2c1c538e","integrity":"sha256-8lF1UZbxceXXqyaEoJzm3+8gN8wnO7FEYJNOGiwcU44="},"flags/1x1/bv-4e4ae03e0878a6e689a0a2ebfe2b1b10fe58329a86acd73ee41f1a9c569f2cb3.svg":{"logical_path":"flags/1x1/bv.svg","mtime":"2022-05-27T21:42:11+02:00","size":582,"digest":"6be2ac5c2b7b353de7dd361efd3a55c228ba00ca60ade0b664d177e3182bbe8f","integrity":"sha256-a+KsXCt7NT3n3TYe/TpVwii6AMpgreC2ZNF34xgrvo8="},"flags/4x3/bw-76559252bbe0a305e9228103c5c34c39271a9d0b69f8f2b0dfbea5e18d7b37de.svg":{"logical_path":"flags/4x3/bw.svg","mtime":"2022-05-27T21:42:11+02:00","size":252,"digest":"115b2165fe0c1f881a45409a24bc3bcfd42de9a1cdad5686ed36b06c0d646262","integrity":"sha256-EVshZf4MH4gaRUCaJLw7z9Qt6aHNrVaG7TawbA1kYmI="},"flags/1x1/bw-3797276ece0055f7c569dc013b59174f613e956c714b5674c90e911615f61318.svg":{"logical_path":"flags/1x1/bw.svg","mtime":"2022-05-27T21:42:11+02:00","size":254,"digest":"df92e4d60f9cd10c1607dd60b8b10d63b10c9dbe30e0a026ad04670dc06a0e86","integrity":"sha256-35Lk1g+c0QwWB91guLENY7EMnb4w4KAmrQRnDcBqDoY="},"flags/4x3/by-7865b19bb46d15f8004699022907d7c8d07193121dac101a3724b7ca578ee3ba.svg":{"logical_path":"flags/4x3/by.svg","mtime":"2022-05-27T21:42:11+02:00","size":5962,"digest":"91b26dd7a972c1eba9a387e521bb4db94c891635bb0dd2b55238e4552ca39047","integrity":"sha256-kbJt16lyweupo4flIbtNuUyJFjW7DdK1UjjkVSyjkEc="},"flags/1x1/by-7bd37ee878e4225470de8cc284d66cf70785a0329da88b43e5f93e25c047b738.svg":{"logical_path":"flags/1x1/by.svg","mtime":"2022-05-27T21:42:11+02:00","size":6086,"digest":"b7ada8d1fb46487c83b827c16b69f51274e42c655fa537a7ffffa4b20468cafc","integrity":"sha256-t62o0ftGSHyDuCfBa2n1EnTkLGVfpTen//+ksgRoyvw="},"flags/4x3/bz-c8dfd550816ef86ff0fb82f9b31ca2467fcf50a7ba53e6163fe2bb01cccab0d5.svg":{"logical_path":"flags/4x3/bz.svg","mtime":"2022-05-27T21:42:11+02:00","size":46427,"digest":"173ecf7b1acfb23e569b7f305630bfe1a39943ebf504ad66ac3f5d613e121c9a","integrity":"sha256-Fz7PexrPsj5Wm38wVjC/4aOZQ+v1BK1mrD9dYT4SHJo="},"flags/1x1/bz-07baa0c080ae0dec236c42810db344f5b6e4209fe16bc9644cf998108b56b85c.svg":{"logical_path":"flags/1x1/bz.svg","mtime":"2022-05-27T21:42:11+02:00","size":46678,"digest":"1d05349d5a497be367155310b692e7aec42e80797378d748178b70d379da1249","integrity":"sha256-HQU0nVpJe+NnFVMQtpLnrsQugHlzeNdIF4tw03naEkk="},"flags/4x3/ca-f9229a913dece446e34e6de7245dfd3adbea059934b5beaed45654cef2f1cb1d.svg":{"logical_path":"flags/4x3/ca.svg","mtime":"2022-05-27T21:42:11+02:00","size":728,"digest":"5bda905693ffed32df95f79a8eeac1fbf062630de05f48875e109c35681e2331","integrity":"sha256-W9qQVpP/7TLflfeajurB+/BiYw3gX0iHXhCcNWgeIzE="},"flags/1x1/ca-47f58efb8689efb510291bb7b7a354c3e434e983914f0cc382e763ecccfa7a6e.svg":{"logical_path":"flags/1x1/ca.svg","mtime":"2022-05-27T21:42:11+02:00","size":708,"digest":"85ee89fa698c2efcad4817723fac44311ca520da3be63f52a10e21c3f65e8fad","integrity":"sha256-he6J+mmMLvytSBdyP6xEMRylINo75j9SoQ4hw/Zej60="},"flags/4x3/cc-acf43807923322e2e43deef84443007b75d0d21ebb8a85d0d4e2837e998798c8.svg":{"logical_path":"flags/4x3/cc.svg","mtime":"2022-05-27T21:42:11+02:00","size":3123,"digest":"d49eb3730b2cbe3eaa7028d5bd5f425caafd83154cf47523c27279c10257d3f6","integrity":"sha256-1J6zcwssvj6qcCjVvV9CXKr9gxVM9HUjwnJ5wQJX0/Y="},"flags/1x1/cc-827355b0b5c0a98cd0b479c7914c62d1de7712c643978941a97741c13ee69891.svg":{"logical_path":"flags/1x1/cc.svg","mtime":"2022-05-27T21:42:11+02:00","size":3083,"digest":"7c46b5f38449f3320ae45f9511a36e1b1c22894f84977c235208ebfb8dea9970","integrity":"sha256-fEa184RJ8zIK5F+VEaNuGxwiiU+El3wjUgjr+43qmXA="},"flags/4x3/cd-594addda580762e53242cc9e5a3885cc200d6b92c9453b65242c0038e4e22959.svg":{"logical_path":"flags/4x3/cd.svg","mtime":"2022-05-27T21:42:11+02:00","size":349,"digest":"3e5799ffef91d8cb30dc6b847867e209e82cbffe277445202c5f291d36ef0248","integrity":"sha256-PleZ/++R2Msw3GuEeGfiCegsv/4ndEUgLF8pHTbvAkg="},"flags/1x1/cd-6f390c3dac0d0d278ea6593bb615e3e23a94f7e84cc40b917e47bdce520a3a2b.svg":{"logical_path":"flags/1x1/cd.svg","mtime":"2022-05-27T21:42:11+02:00","size":507,"digest":"600e736963214a9f6701463345f91b569dab9e68f7668317df2f40def88e2d6e","integrity":"sha256-YA5zaWMhSp9nAUYzRfkbVp2rnmj3ZoMX3y9A3viOLW4="},"flags/4x3/cf-31a4f1c7e55d90551235336b339544920b01a8a4fb27efd5b18d0a68ea908f0e.svg":{"logical_path":"flags/4x3/cf.svg","mtime":"2022-05-27T21:42:11+02:00","size":691,"digest":"44e68fe825719854c92a8285944e619288d5f651fd17f874153081449c100d1f","integrity":"sha256-ROaP6CVxmFTJKoKFlE5hkojV9lH9F/h0FTCBRJwQDR8="},"flags/1x1/cf-820b63e306c3eec593028576d9ea830f24526b8e4c8a51cec04f4a1851f1f781.svg":{"logical_path":"flags/1x1/cf.svg","mtime":"2022-05-27T21:42:11+02:00","size":632,"digest":"b3a61e22f7d8bdc611d532720cf8ed292eab336063c5699036755dc160154175","integrity":"sha256-s6YeIvfYvcYR1TJyDPjtKS6rM2BjxWmQNnVdwWAVQXU="},"flags/4x3/cg-cb3b4a7be309eae587becb687690e332624b75d8a40481abd13a4d8a3c685a87.svg":{"logical_path":"flags/4x3/cg.svg","mtime":"2022-05-27T21:42:11+02:00","size":487,"digest":"7e4f9efc379203b9cc9677042de4c07bd411308c80074919035c08fe131dbca2","integrity":"sha256-fk+e/DeSA7nMlncELeTAe9QRMIyAB0kZA1wI/hMdvKI="},"flags/1x1/cg-3b7d163f2951bc21e895dbead028c79b8f97dc4a95f9d9ca76d78b398025a20b.svg":{"logical_path":"flags/1x1/cg.svg","mtime":"2022-05-27T21:42:11+02:00","size":469,"digest":"20a742a21789fc04344e90463c05b35ee2fe86a624d3b6432b4edd6bd3fe651d","integrity":"sha256-IKdCoheJ/AQ0TpBGPAWzXuL+hqYk07ZDK07da9P+ZR0="},"flags/4x3/ch-d32cf51d10ea8174a3e8725e620c5bd13511a6a6c676d3c807e6ad82017f6178.svg":{"logical_path":"flags/4x3/ch.svg","mtime":"2022-05-27T21:42:11+02:00","size":297,"digest":"4e94e5c3a524345e7c24f3807ab2ca812225ea6ccdb59ec67125b0ea3ed02cd5","integrity":"sha256-TpTlw6UkNF58JPOAerLKgSIl6mzNtZ7GcSWw6j7QLNU="},"flags/1x1/ch-ff30c29ed89a29db4cae89e8f4915e573c75dd7ad377e5ac7987c956fb68a141.svg":{"logical_path":"flags/1x1/ch.svg","mtime":"2022-05-27T21:42:11+02:00","size":295,"digest":"a0660f7371c42a1e8be299a9ff0d762ed12b578ea438df33890aae8eba431106","integrity":"sha256-oGYPc3HEKh6L4pmp/w12LtErV46kON8ziQqujrpDEQY="},"flags/4x3/ci-70e248e97c577c3ab3a85a8a76e5f20ef0bfd2c2a3c190746e625fa37edbbec9.svg":{"logical_path":"flags/4x3/ci.svg","mtime":"2022-05-27T21:42:11+02:00","size":280,"digest":"d7fd4124cb8f4d9cc2d70bd2c87543fd279750bd7082d51e5916fea65847e992","integrity":"sha256-1/1BJMuPTZzC1wvSyHVD/SeXUL1wgtUeWRb+plhH6ZI="},"flags/1x1/ci-fb50e5c5558e915f5cd4060bd75d63e43ed4a2af1cf77caf1d184d8e5b3c888b.svg":{"logical_path":"flags/1x1/ci.svg","mtime":"2022-05-27T21:42:11+02:00","size":283,"digest":"ba7f763547ca1b9243fcf644d83f3100546f7fe557f22fb380b5fcddef7e02bc","integrity":"sha256-un92NUfKG5JD/PZE2D8xAFRvf+VX8i+zgLX83e9+Arw="},"flags/4x3/ck-a86d1e54e265e2de5155595e838ec7c3db3ca23f563336885d7c5d17888c4709.svg":{"logical_path":"flags/4x3/ck.svg","mtime":"2022-05-27T21:42:11+02:00","size":2097,"digest":"95e850b027e198e275840a2c96fde8be006f7c4b50d274c2da10dcfad50d3cf8","integrity":"sha256-lehQsCfhmOJ1hAoslv3ovgBvfEtQ0nTC2hDc+tUNPPg="},"flags/1x1/ck-a0d6f5ca82965ef1838549666bef9735b619c40bcf791850f092486b1fa3831d.svg":{"logical_path":"flags/1x1/ck.svg","mtime":"2022-05-27T21:42:11+02:00","size":2020,"digest":"a60ec48dfd291bcf6e032345fdcf72edc995efaeb749534a38d192d81891b754","integrity":"sha256-pg7Ejf0pG89uAyNF/c9y7cmV7663SVNKONGS2BiRt1Q="},"flags/4x3/cl-0bec6c3cc4d36bbf245a3be22c10b8ff9c25996bb372a916e365e3274e62ccfb.svg":{"logical_path":"flags/4x3/cl.svg","mtime":"2022-05-27T21:42:11+02:00","size":563,"digest":"b0c3f433217a039247b2c7f3f8694d05237ba684726b604a33c102d10f279fde","integrity":"sha256-sMP0MyF6A5JHssfz+GlNBSN7poRya2BKM8EC0Q8nn94="},"flags/1x1/cl-8dc4289cd2cba6ac3f07519957f3cbd582f59e1153d655871a507bc0559fc93f.svg":{"logical_path":"flags/1x1/cl.svg","mtime":"2022-05-27T21:42:11+02:00","size":574,"digest":"250f409f558fe17f01f32614ebf6275c2fcce776ce50ec959642babbc67036e0","integrity":"sha256-JQ9An1WP4X8B8yYU6/YnXC/M53bOUOyVlkK6u8ZwNuA="},"flags/4x3/cm-8832f17145686399c412437f6762b4de6afb48fcc409590b7b09e593fe3b08d5.svg":{"logical_path":"flags/4x3/cm.svg","mtime":"2022-05-27T21:42:11+02:00","size":824,"digest":"1b2e52b5962f38e58da1973b23796ccefae0e82321856c61bda68bd3f277ea6f","integrity":"sha256-Gy5StZYvOOWNoZc7I3lszvrg6CMhhWxhvaaL0/J36m8="},"flags/1x1/cm-4ba39a0a5fe36564e132e7a4d0f881ca10e95b0824157253a9180b2fe0089553.svg":{"logical_path":"flags/1x1/cm.svg","mtime":"2022-05-27T21:42:11+02:00","size":824,"digest":"809ea5ab516c4e59ee5f90c4b0515365c3d41d77544ff10abb1dea88c9f377e4","integrity":"sha256-gJ6lq1FsTlnuX5DEsFFTZcPUHXdUT/EKux3qiMnzd+Q="},"flags/4x3/cn-865ae68cc9042422bae55dba123af75dfab352069aa15121385a739c57caf1aa.svg":{"logical_path":"flags/4x3/cn.svg","mtime":"2022-05-27T21:42:11+02:00","size":801,"digest":"e80d714480a795617992d733d0678e5ad5025f8852b35d20a402a78fce4ccaf8","integrity":"sha256-6A1xRICnlWF5ktcz0GeOWtUCX4hSs10gpAKnj85Myvg="},"flags/1x1/cn-cdf756a16521136b99d38c241ee5df601912f290c6bafd45f7a5f73f916ed8ed.svg":{"logical_path":"flags/1x1/cn.svg","mtime":"2022-05-27T21:42:11+02:00","size":743,"digest":"ab9a2dc6b1aaeaa7017b96904b7a760517ac9e57ee589ee6dd1238c7754bd8f6","integrity":"sha256-q5otxrGq6qcBe5aQS3p2BResnlfuWJ7m3RI4x3VL2PY="},"flags/4x3/co-48603194a139754c8c7908f4d0c8181ca6729a221de897e8e5d26c9a3f211b1d.svg":{"logical_path":"flags/4x3/co.svg","mtime":"2022-05-27T21:42:11+02:00","size":289,"digest":"bc15eabb8dc37b36d7be228c68a2f7a62957a3ba9e4d8c35db50b919c9d150da","integrity":"sha256-vBXqu43DezbXviKMaKL3pilXo7qeTYw121C5GcnRUNo="},"flags/1x1/co-0be1e3cef708f4f0f979a3c36bdcb4046a45693846dc9b9e5be2ea5f1c536667.svg":{"logical_path":"flags/1x1/co.svg","mtime":"2022-05-27T21:42:11+02:00","size":289,"digest":"cb36ae4084e1e678bed8e0a64397e0109f9afc95c241a04c8e3da36a577cfaf2","integrity":"sha256-yzauQITh5ni+2OCmQ5fgEJ+a/JXCQaBMjj2jald8+vI="},"flags/4x3/cr-127b7f2e0f6ebe8c62885fd78f6a3dc167624e8e7b5fac79d4b8f3054b798a92.svg":{"logical_path":"flags/4x3/cr.svg","mtime":"2022-05-27T21:42:11+02:00","size":293,"digest":"12fe80c814de382b53955ab5223514278f7b4985f51c32fd1f60356280e1e5cd","integrity":"sha256-Ev6AyBTeOCtTlVq1IjUUJ497SYX1HDL9H2A1YoDh5c0="},"flags/1x1/cr-80711b24354b0eedd247bbd77352db3bc9ad586c31d0a8727a4400368e56b2c4.svg":{"logical_path":"flags/1x1/cr.svg","mtime":"2022-05-27T21:42:11+02:00","size":293,"digest":"c7830f0e5b8025c1f9205b2d89ce1b7ac81ec64f6a9e9093da9a2d9e05206b49","integrity":"sha256-x4MPDluAJcH5IFstic4besgexk9qnpCT2potngUga0k="},"flags/4x3/cu-c72751747322de6b51b1dd462d04d0b533fa1e1c68f51b3c90d19ec683c2af3a.svg":{"logical_path":"flags/4x3/cu.svg","mtime":"2022-05-27T21:42:11+02:00","size":622,"digest":"0a09bdca54a5347ba1238476ea90ea7d7d99fec7163df43e762313ddbce9b145","integrity":"sha256-Cgm9ylSlNHuhI4R26pDqfX2Z/scWPfQ+diMT3bzpsUU="},"flags/1x1/cu-ec5f9adfe3639f609ebf60d933d6500a0a9a5d77f9c8d5ec6a2f0d0ec2efd5a4.svg":{"logical_path":"flags/1x1/cu.svg","mtime":"2022-05-27T21:42:11+02:00","size":573,"digest":"f5f7e6c58d9ee8046fb142f0d35f23df7e49763b35305b7fcc719db23554b404","integrity":"sha256-9ffmxY2e6ARvsULw018j335Jdjs1MFt/zHGdsjVUtAQ="},"flags/4x3/cv-029b4bd4d5c58ee3479b9a5fd3700923efa4881282225ac47690a3955472b7f1.svg":{"logical_path":"flags/4x3/cv.svg","mtime":"2022-05-27T21:42:11+02:00","size":1415,"digest":"3ab6aaaf11d9a3a6f2fba17248ea85d36967163214e98b0bb30123d0b3def532","integrity":"sha256-OraqrxHZo6by+6FySOqF02lnFjIU6YsLswEj0LPe9TI="},"flags/1x1/cv-750969622373a36a416fc64118f1cb5407764d508f99b7db720f2ab474b93ebf.svg":{"logical_path":"flags/1x1/cv.svg","mtime":"2022-05-27T21:42:11+02:00","size":1357,"digest":"698aea344d6bb9f87de513ff525d16fdb2590ad1cd7b2d1200878c1e7cd2ce64","integrity":"sha256-aYrqNE1rufh95RP/Ul0W/bJZCtHNey0SAIeMHnzSzmQ="},"flags/4x3/cw-f3c7dc011a64c13ebab21e47baaea3e0fea8d83f83fd8cc1845630a5f78ce087.svg":{"logical_path":"flags/4x3/cw.svg","mtime":"2022-05-27T21:42:11+02:00","size":681,"digest":"186b6d2347845c903689468db9a51cec41d7458461725fcdcecab27eebc3c376","integrity":"sha256-GGttI0eEXJA2iUaNuaUc7EHXRYRhcl/NzsqyfuvDw3Y="},"flags/1x1/cw-48a78eb5e8abd98b90ae7b373746bbd58851c76eb305ca0e7d8081df9180f248.svg":{"logical_path":"flags/1x1/cw.svg","mtime":"2022-05-27T21:42:11+02:00","size":682,"digest":"e1c281f45124597730be155051b4628bf25974ff4dac5f990262c5f074ab7484","integrity":"sha256-4cKB9FEkWXcwvhVQUbRii/JZdP9NrF+ZAmLF8HSrdIQ="},"flags/4x3/cx-9033ee142f06aac6b700968943103e6dba8ce3171b17f7f7d54f26c35387c022.svg":{"logical_path":"flags/4x3/cx.svg","mtime":"2022-05-27T21:42:11+02:00","size":2455,"digest":"aaf17168e49e9efc24b259929e40b7b135f78f4ee327577ab57e9a14fe8dfe9d","integrity":"sha256-qvFxaOSenvwkslmSnkC3sTX3j07jJ1d6tX6aFP6N/p0="},"flags/1x1/cx-f8356811ad67ac25c4a8c22bba7468615f8a0bcb09e4d8da09ad3806febc7d1b.svg":{"logical_path":"flags/1x1/cx.svg","mtime":"2022-05-27T21:42:11+02:00","size":2496,"digest":"8af706f9e34d7867578f025a073e033c901b05012519a65bac5d319b961f1a99","integrity":"sha256-ivcG+eNNeGdXjwJaBz4DPJAbBQElGaZbrF0xm5YfGpk="},"flags/4x3/cy-86c9999efa3399db043be615d16558ec0e40feafe9325fe1b6422ff0e089a60c.svg":{"logical_path":"flags/4x3/cy.svg","mtime":"2022-05-27T21:42:11+02:00","size":5866,"digest":"88d041c0eec06dab21e4d9c777ead616f2ab97eedef8b619f78f95dd51e74ab7","integrity":"sha256-iNBBwO7Abash5NnHd+rWFvKrl+7e+LYZ94+V3VHnSrc="},"flags/1x1/cy-67835af18d83749f0ac63e160db340d7a83b2e189e5e5b715b49c4b922fbb4ff.svg":{"logical_path":"flags/1x1/cy.svg","mtime":"2022-05-27T21:42:11+02:00","size":5955,"digest":"0e1f361ed98ca9f027657583276d0f0e404fcedc95cb314fd5122793e4cec9ba","integrity":"sha256-Dh82HtmMqfAnZXWDJ20PDkBPztyVyzFP1RInk+TOybo="},"flags/4x3/cz-e8f891c91f0889f53815958ed9c0d0472c03ecf58c5b8d3d87a864ede0e57ce0.svg":{"logical_path":"flags/4x3/cz.svg","mtime":"2022-05-27T21:42:11+02:00","size":484,"digest":"a094f93ce465415ead374aa60fb7ea55921b956683f2809d6a08b1af81ffd609","integrity":"sha256-oJT5PORlQV6tN0qmD7fqVZIblWaD8oCdagixr4H/1gk="},"flags/1x1/cz-de11cacecaee1ed952a170fa43d318b01507ae9c8b0ab16b96f53848676326c7.svg":{"logical_path":"flags/1x1/cz.svg","mtime":"2022-05-27T21:42:11+02:00","size":480,"digest":"fca144bdc4bc563cc612a0bc931738ab096a362323982a4ac1e2f74d66792c77","integrity":"sha256-/KFEvcS8VjzGEqC8kxc4qwlqNiMjmCpKweL3TWZ5LHc="},"flags/4x3/de-dcf5931120e541ce9e83e97c37cf95eeac9a152cd5e5ed9e0bf58116943d7250.svg":{"logical_path":"flags/4x3/de.svg","mtime":"2022-05-27T21:42:11+02:00","size":213,"digest":"226631a8fa9deee07022680ce0461b7a09b416b616c56ebcaf21f50e2b34ea8f","integrity":"sha256-ImYxqPqd7uBwImgM4EYbegm0FrYWxW68ryH1Dis06o8="},"flags/1x1/de-3479e75f866450220db28ef3ebb1ba0c345c059ed67de62c4176a09572da8f32.svg":{"logical_path":"flags/1x1/de.svg","mtime":"2022-05-27T21:42:11+02:00","size":221,"digest":"d7cc619b1c880981e17adba3bd44cb8addfff1d63e7cb2b4d59a88abe5ff31e0","integrity":"sha256-18xhmxyICYHhetujvUTLit3/8dY+fLK01ZqIq+X/MeA="},"flags/4x3/dj-e69892f8499ec8d780cdd20b051f936d5471eb92efd519b93be9d10f31382c77.svg":{"logical_path":"flags/4x3/dj.svg","mtime":"2022-05-27T21:42:11+02:00","size":591,"digest":"55b23581525743a29fb3602ae988dc91e8f6f5ea07d66337ea8051bf92e7c3ae","integrity":"sha256-VbI1gVJXQ6Kfs2Aq6Yjckej29eoH1mM36oBRv5Lnw64="},"flags/1x1/dj-49721ea1deeb6e17f32ee2b3617d27961ad256505849243843f0fd5697332b18.svg":{"logical_path":"flags/1x1/dj.svg","mtime":"2022-05-27T21:42:11+02:00","size":585,"digest":"ffd9ebcba08793bb8ed7e508cd1187d9e867e43ca0c9c669c6eca2a7c0e61896","integrity":"sha256-/9nry6CHk7uO1+UIzRGH2ehn5DygycZpxuyip8DmGJY="},"flags/4x3/dk-d50cdf2f88be249eb116da08c38cf119d44246ab4f5d62a94feefd37da149019.svg":{"logical_path":"flags/4x3/dk.svg","mtime":"2022-05-27T21:42:11+02:00","size":239,"digest":"c29517b4eb6b056475330a26a3f929c0523ef80268a8457ca5d44a7def3cdf44","integrity":"sha256-wpUXtOtrBWR1Mwomo/kpwFI++AJoqEV8pdRKfe8830Q="},"flags/1x1/dk-24ccaa605d1f01e33802197d416654b64fac3f3d28ba90b5f6094c17dfe95344.svg":{"logical_path":"flags/1x1/dk.svg","mtime":"2022-05-27T21:42:11+02:00","size":235,"digest":"feeb27682ce93b2e5fe14a32a67aa7141f505725daf8b6018864b0bbec103469","integrity":"sha256-/usnaCzpOy5f4UoypnqnFB9QVyXa+LYBiGSwu+wQNGk="},"flags/4x3/dm-24faadaf18d5651beccc45688ef3421d2d083b5f2e92cab50c414e487a899095.svg":{"logical_path":"flags/4x3/dm.svg","mtime":"2022-05-27T21:42:11+02:00","size":15975,"digest":"80221b928ecc38c82c3d290b36be1c6c9388a51e9533c31c197016b00e63b070","integrity":"sha256-gCIbko7MOMgsPSkLNr4cbJOIpR6VM8McGXAWsA5jsHA="},"flags/1x1/dm-4f6888ba822d1592b9751c198ae6aafd1c14630be57d7e3b4372e3df8eb4f201.svg":{"logical_path":"flags/1x1/dm.svg","mtime":"2022-05-27T21:42:11+02:00","size":16457,"digest":"e5d72576962d7a5ecd56631c5a2541c1359f15f086a3d384c563983c40fc2711","integrity":"sha256-5dcldpYtel7NVmMcWiVBwTWfFfCGo9OExWOYPED8JxE="},"flags/4x3/do-43538ca280e65a4eb8b38992290cda974a7f631ae18f3e6864dc6f61397ab514.svg":{"logical_path":"flags/4x3/do.svg","mtime":"2022-05-27T21:42:11+02:00","size":393849,"digest":"d399ea939e23c000ce12ba4f7c4d4abccdd28f783248b819ebb20b90546f619f","integrity":"sha256-05nqk54jwADOErpPfE1KvM3Sj3gySLgZ67ILkFRvYZ8="},"flags/1x1/do-1164fc19d2a5f2299e84d59627b780ff9dcba335acaa19a4acacd4781d916b78.svg":{"logical_path":"flags/1x1/do.svg","mtime":"2022-05-27T21:42:11+02:00","size":391369,"digest":"2af33aacc98dde2ca5cc2f3499370e9715b5f76b5ca7446de00490083346754c","integrity":"sha256-KvM6rMmN3iylzC80mTcOlxW192tcp0Rt4ASQCDNGdUw="},"flags/4x3/dz-1b56086fc67c067d339838fc63e8f98faea641560b14839260546c895bdf4768.svg":{"logical_path":"flags/4x3/dz.svg","mtime":"2022-05-27T21:42:11+02:00","size":294,"digest":"6a1e2abb0d8a33b0209a37123e44710b4b27b50723a5d2ab7fb8746c88447cf6","integrity":"sha256-ah4quw2KM7AgmjcSPkRxC0sntQcjpdKrf7h0bIhEfPY="},"flags/1x1/dz-b9527d30bdb9d67fba87351df4d4340fcc1c0dce368f0371359e5fcf7d445f3b.svg":{"logical_path":"flags/1x1/dz.svg","mtime":"2022-05-27T21:42:11+02:00","size":305,"digest":"75568129d430536c4a994d05f114e0b1b91e10af7350d635f2da721f73d4871c","integrity":"sha256-dVaBKdQwU2xKmU0F8RTgsbkeEK9zUNY18tpyH3PUhxw="},"flags/4x3/ec-d6df0532653f0a2a3ccdee80854ad75c4a4fe4a360fc5d5c73865253ebfc6b7f.svg":{"logical_path":"flags/4x3/ec.svg","mtime":"2022-05-27T21:42:11+02:00","size":29320,"digest":"63bf6e3ac63634199c0929715a715109f8ad229c526c08bfbe7f6a7a9f30fcde","integrity":"sha256-Y79uOsY2NBmcCSlxWnFRCfitIpxSbAi/vn9qep8w/N4="},"flags/1x1/ec-a1a0b637c3d12b488cd180746ea10e42e659907c99c0b3d9eec65415494b5321.svg":{"logical_path":"flags/1x1/ec.svg","mtime":"2022-05-27T21:42:11+02:00","size":29875,"digest":"672567f45dcd0d543af21e7518c41bf8fe74fa090141736b414697b682971f84","integrity":"sha256-ZyVn9F3NDVQ68h51GMQb+P50+gkBQXNrQUaXtoKXH4Q="},"flags/4x3/ee-2e52e01e34f175e856e120e57184ce61eccb5bff94633d3f2effcfed765f610b.svg":{"logical_path":"flags/4x3/ee.svg","mtime":"2022-05-27T21:42:11+02:00","size":321,"digest":"b4c2ebcd79e821fb8ee37e39d688560a79dee100a981402224a4f2bd9762e41e","integrity":"sha256-tMLrzXnoIfuO43451ohWCnne4QCpgUAiJKTyvZdi5B4="},"flags/1x1/ee-1058c4a95d48696c8c99608a104e756d4ac5c431a7a1f60e179769416c443420.svg":{"logical_path":"flags/1x1/ee.svg","mtime":"2022-05-27T21:42:11+02:00","size":352,"digest":"53df0c62e5835adce98e59520ae55ddb9f2a35882c5aba2ccb4021d6b0ee88fd","integrity":"sha256-U98MYuWDWtzpjllSCuVd258qNYgsWrosy0Ah1rDuiP0="},"flags/4x3/eg-2b5a88cf9ab7a59447e6a3e3cc12d350c573719d2a90810d50ed7695a1591d30.svg":{"logical_path":"flags/4x3/eg.svg","mtime":"2022-05-27T21:42:11+02:00","size":9899,"digest":"83f4a01c0e76210691d46b0cff7ec97b6ed93290c32a1e94fab96efd3d9b7d42","integrity":"sha256-g/SgHA52IQaR1GsM/37Je27ZMpDDKh6U+rlu/T2bfUI="},"flags/1x1/eg-ded55c3561ee2003ede5cc35af88959adb2398badc3c63dcc40e320d5bdb6c97.svg":{"logical_path":"flags/1x1/eg.svg","mtime":"2022-05-27T21:42:11+02:00","size":9913,"digest":"6234c7747c535705d9b6725f4a6a09158774f288cb14d7e99295822c4e561c22","integrity":"sha256-YjTHdHxTVwXZtnJfSmoJFYd08ojLFNfpkpWCLE5WHCI="},"flags/4x3/eh-250c6f7e1db483fb08f682d4917c06741614edb0a093aa80c0fe57f9bff03eba.svg":{"logical_path":"flags/4x3/eh.svg","mtime":"2022-05-27T21:42:11+02:00","size":873,"digest":"62f153a1a4ea6e8ed2f79f26ed10eccbbb295bed16ecb46f4e77a6f5f49df639","integrity":"sha256-YvFToaTqbo7S958m7RDsy7spW+0W7LRvTnem9fSd9jk="},"flags/1x1/eh-ae52d9c4377873ea1db474ef820d87e956753992097bbce93118c836f27c5598.svg":{"logical_path":"flags/1x1/eh.svg","mtime":"2022-05-27T21:42:11+02:00","size":817,"digest":"15abbba286e48ba50c4aec3b765d8c05f9b4c53ae385a7c8a38d3cebd688b03c","integrity":"sha256-Fau7oobki6UMSuw7dl2MBfm0xTrjhafIo40869aIsDw="},"flags/4x3/er-13b1d5072a285b78863f33088676ff459fc9049e403c4427d0bf149ab8a65eac.svg":{"logical_path":"flags/4x3/er.svg","mtime":"2022-05-27T21:42:11+02:00","size":3187,"digest":"4c57685960d0cd27bc4ee6cc8356f2ed8d0a5cc54a22b5b503529091705a2b04","integrity":"sha256-TFdoWWDQzSe8TubMg1by7Y0KXMVKIrW1A1KQkXBaKwQ="},"flags/1x1/er-516d763b5c3ddf087968e8e2ce10eb9f6a162e98b1c586ae90f7ebc2a9e877e6.svg":{"logical_path":"flags/1x1/er.svg","mtime":"2022-05-27T21:42:11+02:00","size":3371,"digest":"29ca0e1f31a14f5ee5674a3fcec9aec0ec652b458b66cffd60ac0839fc364729","integrity":"sha256-KcoOHzGhT17lZ0o/zsmuwOxlK0WLZs/9YKwIOfw2Ryk="},"flags/4x3/es-85290c103c538de1b8629c7a609319f01fc5a63a24655946e6003740d30f1534.svg":{"logical_path":"flags/4x3/es.svg","mtime":"2022-05-27T21:42:11+02:00","size":90819,"digest":"ab3d438837b7f1c4ebce6980cc9274cd2e6adcc8af9be6f5cfc47ef2c4c464e3","integrity":"sha256-qz1DiDe38cTrzmmAzJJ0zS5q3Mivm+b1z8R+8sTEZOM="},"flags/1x1/es-582d90241cc77269d8eeaa709ee9345c4e3935b7c20f9d3f04d707800c554896.svg":{"logical_path":"flags/1x1/es.svg","mtime":"2022-05-27T21:42:11+02:00","size":92546,"digest":"bfe2d95adf69f339badcf901e33d12c0b6146d7d16a1100b12c3abc13dc3521c","integrity":"sha256-v+LZWt9p8zm63PkB4z0SwLYUbX0WoRALEsOrwT3DUhw="},"flags/4x3/et-818e867ed44592f1c476d5abd8d9e5b60bb1e485f01076a633f5304fee7990d4.svg":{"logical_path":"flags/4x3/et.svg","mtime":"2022-05-27T21:42:11+02:00","size":1233,"digest":"e28f1f69ecf1b26e002d8c8dad55ec8af5e822b3cca7f111c399e72b4e0f9c79","integrity":"sha256-4o8faezxsm4ALYyNrVXsivXoIrPMp/ERw5nnK04PnHk="},"flags/1x1/et-7e2476975a4837f67af86aa6556d382dfd6769922a47ee9a49ef81a540c0f3b7.svg":{"logical_path":"flags/1x1/et.svg","mtime":"2022-05-27T21:42:11+02:00","size":1226,"digest":"59795d6d33015e4ec1042861541df6c2034e8e1880869d695a1fea5a951e2e71","integrity":"sha256-WXldbTMBXk7BBChhVB32wgNOjhiAhp1pWh/qWpUeLnE="},"flags/4x3/fi-262396615a680200f7709a9a998a1f346db6de48844bb0a76d8c41d0d8dfb466.svg":{"logical_path":"flags/4x3/fi.svg","mtime":"2022-05-27T21:42:11+02:00","size":237,"digest":"83783a7dc69702dfbb59833d81c309748ffb04574aab8ed1cb7589189c0f80d2","integrity":"sha256-g3g6fcaXAt+7WYM9gcMJdI/7BFdKq47Ry3WJGJwPgNI="},"flags/1x1/fi-cdfc9cc3908d4f0d534fb34853fda8db5981195204ab6219bad3aa3cf90ecfa6.svg":{"logical_path":"flags/1x1/fi.svg","mtime":"2022-05-27T21:42:11+02:00","size":240,"digest":"6c32372acfba871cdcd22614f0ebbf58ea2b88de648ee4e843a2bbda5c0a3336","integrity":"sha256-bDI3Ks+6hxzc0iYU8Ou/WOoriN5kjuToQ6K72lwKMzY="},"flags/4x3/fj-fd0cc7fe3c27f0c999ce61d40b0143ca536d9d39875c524bb20afe5ccd55e40c.svg":{"logical_path":"flags/4x3/fj.svg","mtime":"2022-05-27T21:42:11+02:00","size":27237,"digest":"4972d31a0e0d2516c08a305844e5310bf8963d7cca69cc86ed4ed2e121f41be9","integrity":"sha256-SXLTGg4NJRbAijBYROUxC/iWPXzKacyG7U7S4SH0G+k="},"flags/1x1/fj-930160f9247a73774021c9d019dfedc21ed09934db523690ca76f0a7e1a2d9d1.svg":{"logical_path":"flags/1x1/fj.svg","mtime":"2022-05-27T21:42:11+02:00","size":27518,"digest":"36ff3e628fc0bee99878cc9740e54a7b95e9599c263595b5db0c8be2c6ab8978","integrity":"sha256-Nv8+Yo/AvumYeMyXQOVKe5XpWZwmNZW12wyL4sariXg="},"flags/4x3/fk-5d5fdf224c1455f03c84d85f587463d8c511ff86dd5592f216a7470989175e42.svg":{"logical_path":"flags/4x3/fk.svg","mtime":"2022-05-27T21:42:11+02:00","size":31973,"digest":"6d11c1ecbf413d27f4068e211b7f5f46e83b9067c9fd73ea9c3f5d48c7bbb457","integrity":"sha256-bRHB7L9BPSf0Bo4hG39fRug7kGfJ/XPqnD9dSMe7tFc="},"flags/1x1/fk-b614bdecd7ba844a5885a5acfb6b658bf649dd72d095844abdd4cf14860685c4.svg":{"logical_path":"flags/1x1/fk.svg","mtime":"2022-05-27T21:42:11+02:00","size":31798,"digest":"2705e5d996f753fdd666b1d3a7c6f4085adc070be85957ba71fa1f07f17eca79","integrity":"sha256-JwXl2Zb3U/3WZrHTp8b0CFrcBwvoWVe6cfofB/F+ynk="},"flags/4x3/fm-6e665d3e05ae726fee0ced73ae84ce1d0596e80cb3dafce78d0c56dbc3018584.svg":{"logical_path":"flags/4x3/fm.svg","mtime":"2022-05-27T21:42:11+02:00","size":776,"digest":"881458469239020624b90d2601d347330d21dd7b512c011cba2bcb0c4dc4ea75","integrity":"sha256-iBRYRpI5AgYkuQ0mAdNHMw0h3XtRLAEcuivLDE3E6nU="},"flags/1x1/fm-c59efd1b95788946440a90610eac4f3222be5fbfb5748c076eabd0d4b6b8613e.svg":{"logical_path":"flags/1x1/fm.svg","mtime":"2022-05-27T21:42:11+02:00","size":759,"digest":"0b0d81c2932c2a3a114f5095a9e89e6ac274c54d0cd9e794136a339ad4df8cb4","integrity":"sha256-Cw2BwpMsKjoRT1CVqeieasJ0xU0M2eeUE2ozmtTfjLQ="},"flags/4x3/fo-e2bcddb90777676679c7d680f18bcace56143f3a6bb0618ce59e4bf863b9e58e.svg":{"logical_path":"flags/4x3/fo.svg","mtime":"2022-05-27T21:42:11+02:00","size":570,"digest":"c0b32df51365a3947ddcda18c15575c5c617b75b29330d78e606e684f3304334","integrity":"sha256-wLMt9RNlo5R93NoYwVV1xcYXt1spMw145gbmhPMwQzQ="},"flags/1x1/fo-c9e403639ac04f28b0c86fc370ac5a106213f2ecf2ffc291cb9cd0ec2c000d8b.svg":{"logical_path":"flags/1x1/fo.svg","mtime":"2022-05-27T21:42:11+02:00","size":534,"digest":"5910fc8006f125ce3c7ec5b93b86ccbe0a79e5fbc2e60a9a9b481c882d1bac7c","integrity":"sha256-WRD8gAbxJc48fsW5O4bMvgp55fvC5gqam0gciC0brHw="},"flags/4x3/fr-14bbb212b68a54751cbf4354dc9ca16bf4fd671fba4bfd0e77fb855fc55ce884.svg":{"logical_path":"flags/4x3/fr.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"63667b36ddd95d29a9f163e3ab4b9f7000dcd310350c565c19b975a0a2418117","integrity":"sha256-Y2Z7Nt3ZXSmp8WPjq0ufcADc0xA1DFZcGbl1oKJBgRc="},"flags/1x1/fr-8b9d16b144204ecd34289bf1f0e06e57ad03a889a3813463de8e1a25005da5ec.svg":{"logical_path":"flags/1x1/fr.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"5d247ee39647a05667b52e04510b76ae465c009da242ff8d98637d138ea410ff","integrity":"sha256-XSR+45ZHoFZntS4EUQt2rkZcAJ2iQv+NmGN9E46kEP8="},"flags/4x3/ga-ae7daae3629bfa925e336323a198a018ae2007a1ea2ab9ba32d4b110e0abc7d4.svg":{"logical_path":"flags/4x3/ga.svg","mtime":"2022-05-27T21:42:11+02:00","size":274,"digest":"6cf1908ef7a47d61ead3f969bb5dfb96e4b691b66291e2cd7dc71c513d1a5659","integrity":"sha256-bPGQjvekfWHq0/lpu137luS2kbZikeLNfcccUT0aVlk="},"flags/1x1/ga-1a903d6903087e08d16b56a27741cd1ea2c0685fbd325e9c4cef45d7fb00ccc3.svg":{"logical_path":"flags/1x1/ga.svg","mtime":"2022-05-27T21:42:11+02:00","size":278,"digest":"2b2ea5084b741bf0b1dd1ebc87ee72e4e9fad78046275d37becb41831d259686","integrity":"sha256-Ky6lCEt0G/Cx3R68h+5y5On614BGJ103vstBgx0lloY="},"flags/4x3/gb-14e43b4df91315b33ed5f8ad46d9e84f43f84be11c65148bca043808832cab95.svg":{"logical_path":"flags/4x3/gb.svg","mtime":"2022-05-27T21:42:11+02:00","size":538,"digest":"825310f9bcc8892559317bfc87fc28d5d7bad06c02d562b5740aafcf4b040803","integrity":"sha256-glMQ+bzIiSVZMXv8h/wo1de60GwC1WK1dAqvz0sECAM="},"flags/1x1/gb-81ec47f82b87b9398d17f1db841ea31695a24fa3e05c60fa4d59b21ae4d5bed2.svg":{"logical_path":"flags/1x1/gb.svg","mtime":"2022-05-27T21:42:11+02:00","size":541,"digest":"6ce6ebb0c16f1f4aa74a78a5db382783545d1ca28f2b6133b6228b4dff0340f0","integrity":"sha256-bObrsMFvH0qnSnil2zgng1RdHKKPK2EztiKLTf8DQPA="},"flags/4x3/gd-9a09ce17c1792c8860223020288f72ed168afebcafdc9fa8c46a7b7b1513c28a.svg":{"logical_path":"flags/4x3/gd.svg","mtime":"2022-05-27T21:42:11+02:00","size":1681,"digest":"eb435c57c240fd302400f1ecb887ec63c672b524032bd0e7c6261ae6a2f1e249","integrity":"sha256-60NcV8JA/TAkAPHsuIfsY8ZytSQDK9DnxiYa5qLx4kk="},"flags/1x1/gd-1678beac8104635c4360593bbba3e3e4b84467d8997ed538137b5a68740ba1b9.svg":{"logical_path":"flags/1x1/gd.svg","mtime":"2022-05-27T21:42:11+02:00","size":1828,"digest":"407dac34390ab8b1ed80fafa4f7ef1fe3225d1d92c5403a80264b4956177e51d","integrity":"sha256-QH2sNDkKuLHtgPr6T37x/jIl0dksVAOoAmS0lWF35R0="},"flags/4x3/ge-0ed0a003c1e169ed60bdd889c8c841b0a7931aa3e809ca4d8e5da522385f35c9.svg":{"logical_path":"flags/4x3/ge.svg","mtime":"2022-05-27T21:42:11+02:00","size":1397,"digest":"3054d4e61ec2de31e08ce51c8e1bff64fe2d4cc39f3bc6b3988a5e3aab32379c","integrity":"sha256-MFTU5h7C3jHgjOUcjhv/ZP4tTMOfO8azmIpeOqsyN5w="},"flags/1x1/ge-d90251ffc959309587136e12331f57a2db6b284a892ba1fee03927383208a760.svg":{"logical_path":"flags/1x1/ge.svg","mtime":"2022-05-27T21:42:11+02:00","size":1541,"digest":"3f7e3b7075838308212d191c4ff1ff3915a4a0c3e1b140420bc1095be16aee0a","integrity":"sha256-P347cHWDgwghLRkcT/H/ORWkoMPhsUBCC8EJW+Fq7go="},"flags/4x3/gf-d4b632e9a932eff7d4e32338d13724f58332eeb445cfa9351a052b77cd688d3d.svg":{"logical_path":"flags/4x3/gf.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"8b1d049abec1dc1e6e28247d4f649f5146e8c29a4b928f94c97741da16bcc422","integrity":"sha256-ix0Emr7B3B5uKCR9T2SfUUbowppLko+UyXdB2ha8xCI="},"flags/1x1/gf-be726fca00f77b50eec1525f3889ebf6de7f8f46e28cb63f0cbbe026cdaf564b.svg":{"logical_path":"flags/1x1/gf.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"7e25c5fdc494625ccc8390d3fb1cc6d9a423372c7f30a6c402b138b11840e59f","integrity":"sha256-fiXF/cSUYlzMg5DT+xzG2aQjNyx/MKbEArE4sRhA5Z8="},"flags/4x3/gg-ea89231f0fa42d543d008b4f2fe8a94fc253a1808b8b8f6ab49f4bd9553c498e.svg":{"logical_path":"flags/4x3/gg.svg","mtime":"2022-05-27T21:42:11+02:00","size":595,"digest":"7a521b07e2a60e914abf16a2553dd7b8f18d3ff21ece58b2c41ba5264c3117e3","integrity":"sha256-elIbB+KmDpFKvxaiVT3XuPGNP/IezliyxBulJkwxF+M="},"flags/1x1/gg-ebfebaf3102bbdfecee844b24f59ef79c78d3b573203d8058e363847b33531a0.svg":{"logical_path":"flags/1x1/gg.svg","mtime":"2022-05-27T21:42:11+02:00","size":625,"digest":"e01d6706db308999fde70ce031a660160c3234d9d6e7ba4547f10975e5a1ffcf","integrity":"sha256-4B1nBtswiZn95wzgMaZgFgwyNNnW57pFR/EJdeWh/88="},"flags/4x3/gh-90efce1b22e18fbd77cb6f13e9f72ecea1338e3fd090b3817171eb3e24ba2516.svg":{"logical_path":"flags/4x3/gh.svg","mtime":"2022-05-27T21:42:11+02:00","size":281,"digest":"120554a519bce5c340f98f8cb7bcf98ea18572d3ad137804b4b0c5d806a54016","integrity":"sha256-EgVUpRm85cNA+Y+Mt7z5jqGFctOtE3gEtLDF2AalQBY="},"flags/1x1/gh-e9286720b91098135c65f7ad83d9a796efed89e27a052aac78af57e82d003859.svg":{"logical_path":"flags/1x1/gh.svg","mtime":"2022-05-27T21:42:11+02:00","size":296,"digest":"b979935b065bbef93c1a62caedf03ae3833c055f617bdc32824fd15c59d4bf6e","integrity":"sha256-uXmTWwZbvvk8GmLK7fA644M8BV9he9wygk/RXFnUv24="},"flags/4x3/gi-03f50f9d9b262fdf822d325c5325b374661821d6fae41e20de42bc761e56df52.svg":{"logical_path":"flags/4x3/gi.svg","mtime":"2022-05-27T21:42:11+02:00","size":2938,"digest":"c84fb25bb5c8d9b9cc2d70f630a927f4ea4f4cbeb2674eb97b4b9dc2d2256c14","integrity":"sha256-yE+yW7XI2bnMLXD2MKkn9OpPTL6yZ065e0udwtIlbBQ="},"flags/1x1/gi-94700c7efeae285ce37ad883ca906c4ee65a99ede614b40eacb88d64873abb96.svg":{"logical_path":"flags/1x1/gi.svg","mtime":"2022-05-27T21:42:11+02:00","size":2930,"digest":"7283b9d6ac27b497fafd867b580d0f12fea7551a4211150087d95816c2143e21","integrity":"sha256-coO51qwntJf6/YZ7WA0PEv6nVRpCERUAh9lYFsIUPiE="},"flags/4x3/gl-3b1f2b9c26c35f87fcb4b417fff6ad3d2aada484d734382440c338d4c7dcbd00.svg":{"logical_path":"flags/4x3/gl.svg","mtime":"2022-05-27T21:42:11+02:00","size":223,"digest":"1149b6b3a90dd6f4f6ac8dd4af0ddfcb33e801858e4835c5f8c6c7346dee3288","integrity":"sha256-EUm2s6kN1vT2rI3Urw3fyzPoAYWOSDXF+MbHNG3uMog="},"flags/1x1/gl-e468d30f57d5159f92aa487c8d16f9395671e64e4dcd74ec71b40bfa96259df4.svg":{"logical_path":"flags/1x1/gl.svg","mtime":"2022-05-27T21:42:11+02:00","size":237,"digest":"5e6efacd630a7f36a1574444a9893613e5c6d03d5d569e140b592f8e7542feb8","integrity":"sha256-Xm76zWMKfzahV0REqYk2E+XG0D1dVp4UC1kvjnVC/rg="},"flags/4x3/gm-8a5011e0a99457e6dfeb53b55a90875f2d9a802fe8fec13f570de6f2a27b8639.svg":{"logical_path":"flags/4x3/gm.svg","mtime":"2022-05-27T21:42:11+02:00","size":546,"digest":"6d6da6987a4243bb9fff8138ad9e0b301098c6f963cacedf997850fb679ec28c","integrity":"sha256-bW2mmHpCQ7uf/4E4rZ4LMBCYxvljys7fmXhQ+2eewow="},"flags/1x1/gm-4200b76a4dbfbd9de052de9de778ae19d659a1d75d669757885580ef286497ec.svg":{"logical_path":"flags/1x1/gm.svg","mtime":"2022-05-27T21:42:11+02:00","size":382,"digest":"5f8874f8ab093f84c3465b3110ed400cd8eb457110f9b61e684edc867ef99b2f","integrity":"sha256-X4h0+KsJP4TDRlsxEO1ADNjrRXEQ+bYeaE7chn75my8="},"flags/4x3/gn-e990df30eba87d7036bbf6a47b64d0a6360d82fba6b5bba812e148648e56ea47.svg":{"logical_path":"flags/4x3/gn.svg","mtime":"2022-05-27T21:42:11+02:00","size":295,"digest":"735109ba23330ad9e8602b6e27e658bd12e36f2616b7ead65bd908d553b2acda","integrity":"sha256-c1EJuiMzCtnoYCtuJ+ZYvRLjbyYWt+rWW9kI1VOyrNo="},"flags/1x1/gn-4f9823b9e177c0604f8cbc1b2412ac9c39b4ffc3eda66311e787a6d9a640ebf7.svg":{"logical_path":"flags/1x1/gn.svg","mtime":"2022-05-27T21:42:11+02:00","size":295,"digest":"255e2c2930544e25827f220ebc26c6f533d291079f34f2ad6644533d3dfbd726","integrity":"sha256-JV4sKTBUTiWCfyIOvCbG9TPSkQefNPKtZkRTPT371yY="},"flags/4x3/gp-024ddd0e63a5e22c9d9f73a84b8306f2176083081825a065d99646ee123dc242.svg":{"logical_path":"flags/4x3/gp.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"b9c509941ec97521fd81904dc81a2845faa44349cc068344f4f738dad7a558b2","integrity":"sha256-ucUJlB7JdSH9gZBNyBooRfqkQ0nMBoNE9Pc42telWLI="},"flags/1x1/gp-00fab4fc916f5f267afd8e100a52098ba4aa6761cba1ecde56d506e85bd12025.svg":{"logical_path":"flags/1x1/gp.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"8bf5d31fdbb388b5bee19d19f7a7cf1e0c0378d5759c5a4254549b2542727a2c","integrity":"sha256-i/XTH9uziLW+4Z0Z96fPHgwDeNV1nFpCVFSbJUJyeiw="},"flags/4x3/gq-4e5c5e90e99f9dd14a43b597b6d370c8691ee73e8c75a8184e4a8390ff3e2bb0.svg":{"logical_path":"flags/4x3/gq.svg","mtime":"2022-05-27T21:42:11+02:00","size":5182,"digest":"52b8daea18383c355f1f6db428bcd4ebdf777734148da4403f1e93797b4dc9da","integrity":"sha256-Urja6hg4PDVfH220KLzU6993dzQUjaRAPx6TeXtNydo="},"flags/1x1/gq-0e6d55dbcfe1e727dbe9c00ac2988407c196e5c0a20a0f71f752788649ec83c0.svg":{"logical_path":"flags/1x1/gq.svg","mtime":"2022-05-27T21:42:11+02:00","size":5273,"digest":"f4a44fd2e337cfa52f199707b606891ab0bd3b68bfaeca033e70c274739a6131","integrity":"sha256-9KRP0uM3z6UvGZcHtgaJGrC9O2i/rsoDPnDCdHOaYTE="},"flags/4x3/gr-db2138fa7bb0c95282ec0ecae3b5bd6ff2b3a06e2f27c1434b5b2285d422a6e0.svg":{"logical_path":"flags/4x3/gr.svg","mtime":"2022-05-27T21:42:11+02:00","size":1096,"digest":"d22330d2af43ce22eab7d8ec9efdbe27ccd9ac1255f3bd289aa671db07fd0205","integrity":"sha256-0iMw0q9DziLqt9jsnv2+J8zZrBJV870omqZx2wf9AgU="},"flags/1x1/gr-40c78a60595b2a3f485040d93505c0128de81b60f44e18e35ce0ca9d5a95f184.svg":{"logical_path":"flags/1x1/gr.svg","mtime":"2022-05-27T21:42:11+02:00","size":1085,"digest":"565e017faa966d20d9a4051a1853c366bbd59ebaaced77fed32f850b8a9c5099","integrity":"sha256-Vl4Bf6qWbSDZpAUaGFPDZrvVnrqs7Xf+0y+FC4qcUJk="},"flags/4x3/gs-bf3e078414a68dcd77d82694f5411f67c1eb5a1503f427c8dbcace16238e359a.svg":{"logical_path":"flags/4x3/gs.svg","mtime":"2022-05-27T21:42:11+02:00","size":34568,"digest":"ad593ae4b9e8c7a4c109a15385a221464240cf3f77e607af2adba53d7b7d2a69","integrity":"sha256-rVk65Lnox6TBCaFThaIhRkJAzz935gevKtulPXt9Kmk="},"flags/1x1/gs-0130b60737c3873dd1868c70f7c3018fc276d152a398c2ce727edddb46f32513.svg":{"logical_path":"flags/1x1/gs.svg","mtime":"2022-05-27T21:42:11+02:00","size":35061,"digest":"718e0e89dee0f138fe8e45e84c64f72259b41d0f36224b9b2507bce77be21186","integrity":"sha256-cY4Oid7g8Tj+jkXoTGT3Ilm0HQ82IkubJQe853viEYY="},"flags/4x3/gt-1b63340464e9dd3363a631f74db87defe40bfc520ba41002bf094f154b579934.svg":{"logical_path":"flags/4x3/gt.svg","mtime":"2022-05-27T21:42:11+02:00","size":37255,"digest":"aa19f58abef6e0b68f7bee73452e26679a640c0fed12f9fc2cb6cde32fc04da5","integrity":"sha256-qhn1ir724LaPe+5zRS4mZ5pkDA/tEvn8LLbN4y/ATaU="},"flags/1x1/gt-7cd5c99c47d16d4fc914979ffd7b95d87247d4c6652e07562a71a323f7145d58.svg":{"logical_path":"flags/1x1/gt.svg","mtime":"2022-05-27T21:42:11+02:00","size":37255,"digest":"66d29cdd8660d4380902884c08d9be64f3d8a02536873814f2909778b6e234e0","integrity":"sha256-ZtKc3YZg1DgJAohMCNm+ZPPYoCU2hzgU8pCXeLbiNOA="},"flags/4x3/gu-4018f5c92a9dd473d226f09136e956de2570729e80d704e8cc4e8f3ca2bdc871.svg":{"logical_path":"flags/4x3/gu.svg","mtime":"2022-05-27T21:42:11+02:00","size":4840,"digest":"6d39ec648f0366b77918f779bef9619d06561d223bcb98b56813dc32e8403d2d","integrity":"sha256-bTnsZI8DZrd5GPd5vvlhnQZWHSI7y5i1aBPcMuhAPS0="},"flags/1x1/gu-bb95d4d48c1e20be2b15258d9b895f38e9df1c54b65d4ed4aab1b323576f3899.svg":{"logical_path":"flags/1x1/gu.svg","mtime":"2022-05-27T21:42:11+02:00","size":4614,"digest":"390cbafa22e9b9131e3bf37109317115684519abf87088acfa0f355c608b4729","integrity":"sha256-OQy6+iLpuRMeO/NxCTFxFWhFGav4cIis+g81XGCLRyk="},"flags/4x3/gw-0ea266c02a02d578e96bb5335244c83c2815f28ebd34ff7ab8408b16416dd88e.svg":{"logical_path":"flags/4x3/gw.svg","mtime":"2022-05-27T21:42:11+02:00","size":813,"digest":"ef2b9b0a28a50cc12689fb576cf4dc5b507b01fbb15a498298921d7a57f0fd77","integrity":"sha256-7yubCiilDMEmiftXbPTcW1B7AfuxWkmCmJIdelfw/Xc="},"flags/1x1/gw-bd83c376f118c350751de000e2a48f97772438555dc1a70a7beb15cc4caee5c7.svg":{"logical_path":"flags/1x1/gw.svg","mtime":"2022-05-27T21:42:11+02:00","size":889,"digest":"14078000daf10cc29b7167c3f9b1b239ab3708b3bad35e8ef185cb92643f88de","integrity":"sha256-FAeAANrxDMKbcWfD+bGyOas3CLO6016O8YXLkmQ/iN4="},"flags/4x3/gy-441a978efab1565daf964e822a75b8658f5879af41371b0b52e468e00eb6b095.svg":{"logical_path":"flags/4x3/gy.svg","mtime":"2022-05-27T21:42:11+02:00","size":488,"digest":"0b13a1778887768d5e7767f5e4a484444f4cf3be655142fd6d5d5acb945e7919","integrity":"sha256-CxOhd4iHdo1ed2f15KSERE9M875lUUL9bV1ay5ReeRk="},"flags/1x1/gy-d84ae82776b7142e4d9d51b1bdce601560275833b8d249e8e3d74bd3752b5aaa.svg":{"logical_path":"flags/1x1/gy.svg","mtime":"2022-05-27T21:42:11+02:00","size":481,"digest":"7562ed6db701af0658a763a1d4701c12467cd962cfd0bfd262cac16d4fc80c88","integrity":"sha256-dWLtbbcBrwZYp2Oh1HAcEkZ82WLP0L/SYsrBbU/IDIg="},"flags/4x3/hk-e5350bb4c4d63e98d802b3190247b2ce459d2695756ec62d64a995c43c4edd1e.svg":{"logical_path":"flags/4x3/hk.svg","mtime":"2022-05-27T21:42:11+02:00","size":3494,"digest":"17c1c66141f1aa0339fefc5863866d67eabcb1732bda7d5d757b2cb937c93da1","integrity":"sha256-F8HGYUHxqgM5/vxYY4ZtZ+q8sXMr2n1ddXssuTfJPaE="},"flags/1x1/hk-082835aaf3d1d61e1dd0e3b2b86231ef11b20150f98898af2e352b87c910f7da.svg":{"logical_path":"flags/1x1/hk.svg","mtime":"2022-05-27T21:42:11+02:00","size":3529,"digest":"9f59b3d68a943ed25c5e00cb3d1b97d522951d85db0f66fed087418358f88927","integrity":"sha256-n1mz1oqUPtJcXgDLPRuX1SKVHYXbD2b+0IdBg1j4iSc="},"flags/4x3/hm-1048d79fd546482c290e1a0e4c2f9ce053aa3821f17bf12487a4f3e0ac7477d4.svg":{"logical_path":"flags/4x3/hm.svg","mtime":"2022-05-27T21:42:11+02:00","size":1324,"digest":"d0e56b8208a450dc19b6e1eafaa826c439a318b33314c503ebab05d7a9d14ba3","integrity":"sha256-0OVrggikUNwZtuHq+qgmxDmjGLMzFMUD66sF16nRS6M="},"flags/1x1/hm-af2df9fe67b48ead95d7ebe32d0a28a16c0d2fb03af909ca99e3b7d3cbe1a4a3.svg":{"logical_path":"flags/1x1/hm.svg","mtime":"2022-05-27T21:42:11+02:00","size":1308,"digest":"78ed36c627b9370e2c8737226f62105718c18b2f04c62618168e43adcccc1ca6","integrity":"sha256-eO02xie5Nw4shzcib2IQVxjBiy8ExiYYFo5DrczMHKY="},"flags/4x3/hn-d0e2cededb00e5dc79c75ab95e8f93d1851844c0924e49b59a8b78f6b35a7cfb.svg":{"logical_path":"flags/4x3/hn.svg","mtime":"2022-05-27T21:42:11+02:00","size":1112,"digest":"38a5028605f6645a95c607f24db6d27d5b915580be561a365cfb9d238736b594","integrity":"sha256-OKUChgX2ZFqVxgfyTbbSfVuRVYC+Vho2XPudI4c2tZQ="},"flags/1x1/hn-45eebaaac195fd50e374926f9876eb5456a8cbcc2fb30e6a19229c409c51520b.svg":{"logical_path":"flags/1x1/hn.svg","mtime":"2022-05-27T21:42:11+02:00","size":1116,"digest":"79cc97901f534c2998d1ec6cd506a81b59eabc0a040dc66ee46ef8a7405e6641","integrity":"sha256-ecyXkB9TTCmY0exs1QaoG1nqvAoEDcZu5G74p0BeZkE="},"flags/4x3/hr-e10c8456ac0fc1946d1cb1f15e73484d03e4442368d78b230b050cadb7730b04.svg":{"logical_path":"flags/4x3/hr.svg","mtime":"2022-05-27T21:42:11+02:00","size":40615,"digest":"b0b1d075c651e2ceb10f558b33a13c9dd89310edfbe67df0f46a7b5d8d550de6","integrity":"sha256-sLHQdcZR4s6xD1WLM6E8ndiTEO375n3w9Gp7XY1VDeY="},"flags/1x1/hr-8a4ca8ec8de4fc911306e198e66086fbbbf33891c8fa3e860af482f8ac2ddb44.svg":{"logical_path":"flags/1x1/hr.svg","mtime":"2022-05-27T21:42:11+02:00","size":40852,"digest":"1041347a78192d0e7688af7adec3cd93d85fd0dd7ab792dc80fd82629708a7bf","integrity":"sha256-EEE0engZLQ52iK963sPNk9hf0N16t5LcgP2CYpcIp78="},"flags/4x3/ht-f862a9bb3b96630fc26a6fd2200b77c985b90a87ff9c52c42c3d7f42a0198b04.svg":{"logical_path":"flags/4x3/ht.svg","mtime":"2022-05-27T21:42:11+02:00","size":15005,"digest":"ba77c23de904dea8ddf2390f9e363fa96679253b425be7d4dbf0021c4a0c9911","integrity":"sha256-unfCPekE3qjd8jkPnjY/qWZ5JTtCW+fU2/ACHEoMmRE="},"flags/1x1/ht-1a12f16c45567e7b4fc2737b630345f7c7d0ac79ff31c41bc23920d0effd9adb.svg":{"logical_path":"flags/1x1/ht.svg","mtime":"2022-05-27T21:42:11+02:00","size":15094,"digest":"092fc65d74cf70aa35a8dd3a5581f5bb668aba72ddf788c4ffc22278be4ee70b","integrity":"sha256-CS/GXXTPcKo1qN06VYH1u2aKunLd94jE/8IieL5O5ws="},"flags/4x3/hu-a555e216b05645110da533dd2a5225021f70d7438e456877e77dc4522c261e41.svg":{"logical_path":"flags/4x3/hu.svg","mtime":"2022-05-27T21:42:11+02:00","size":274,"digest":"470431d1ed0dc2099f20313f78f906848acaf9efce57c543d83b3b62f8b7a448","integrity":"sha256-RwQx0e0NwgmfIDE/ePkGhIrK+e/OV8VD2Ds7Yvi3pEg="},"flags/1x1/hu-70b6438afdbc91f98b5ebfd0cafa40b6d5b0266f8d0df56cf3bcc7f777bd54c4.svg":{"logical_path":"flags/1x1/hu.svg","mtime":"2022-05-27T21:42:11+02:00","size":276,"digest":"ac2bf4284d73c0c0d607f5ec46855b982f56d2ee430306fca04da3a5cda8515b","integrity":"sha256-rCv0KE1zwMDWB/XsRoVbmC9W0u5DAwb8oE2jpc2oUVs="},"flags/4x3/id-3b48b1012b8beab850a28e27d785e92afee830444749c814a32419b8fce5dec1.svg":{"logical_path":"flags/4x3/id.svg","mtime":"2022-05-27T21:42:11+02:00","size":237,"digest":"c9871d91b6b58310831a0d78b904e44eb92a64630ac219ac43165d0ca8f0dacd","integrity":"sha256-yYcdkba1gxCDGg14uQTkTrkqZGMKwhmsQxZdDKjw2s0="},"flags/1x1/id-7d8348730949413fc7ff2587be342ff90c9ee1734d2ccdbca637a55839a894af.svg":{"logical_path":"flags/1x1/id.svg","mtime":"2022-05-27T21:42:11+02:00","size":239,"digest":"b4e3434244c27c95f6933e19a65fc273348f2edc6b695dd5dfe810d12f5459aa","integrity":"sha256-tONDQkTCfJX2kz4Zpl/CczSPLtxraV3V3+gQ0S9UWao="},"flags/4x3/ie-8758528ee7852e7ded3f03fb7bc96ef9c502b1321c3011e9aade28702c68e235.svg":{"logical_path":"flags/4x3/ie.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"4d73eedf98a4c487c352db58751ff766f05f6aa3bfac1ecc0f9384e50d019191","integrity":"sha256-TXPu35ikxIfDUttYdR/3ZvBfaqO/rB7MD5OE5Q0BkZE="},"flags/1x1/ie-1cf70c38a49b5ec8c5ec6aace1dd0f1e1ac1663b8a5339ca3a98dc7bc4978702.svg":{"logical_path":"flags/1x1/ie.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"e8a2121f51aa8eccbaab9fdc1e986418f75b6e3adf81329b1251db3a6678851d","integrity":"sha256-6KISH1Gqjsy6q5/cHphkGPdbbjrfgTKbElHbOmZ4hR0="},"flags/4x3/il-028f767bebb716e7a2e7198bfd03e698a7f19cad00385b30014a27680c101710.svg":{"logical_path":"flags/4x3/il.svg","mtime":"2022-05-27T21:42:11+02:00","size":901,"digest":"1dcc3e315cf8b00b8a9914d9ce696b05612aec294bf85e784b25c672b259c58a","integrity":"sha256-Hcw+MVz4sAuKmRTZzmlrBWEq7ClL+F54SyXGcrJZxYo="},"flags/1x1/il-395ee62ffbff4ab2ae456281a90f441e1148c0143a237f8a0e540e31d55518d5.svg":{"logical_path":"flags/1x1/il.svg","mtime":"2022-05-27T21:42:11+02:00","size":848,"digest":"343c040339a72ace51208700f40fe69bfb90e3b4f5ad62b1ed69ac404470722a","integrity":"sha256-NDwEAzmnKs5RIIcA9A/mm/uQ47T1rWKx7WmsQERwcio="},"flags/4x3/im-7dbb2dd66eda428c32edbbf2275f709df06cb1270dd69c65e214874966c30d69.svg":{"logical_path":"flags/4x3/im.svg","mtime":"2022-05-27T21:42:11+02:00","size":9870,"digest":"5b256ebd75ab1fc4d1e7af4f4306b4c6b54ae64a67eb1d968a84065a007b7cd7","integrity":"sha256-WyVuvXWrH8TR569PQwa0xrVK5kpn6x2WioQGWgB7fNc="},"flags/1x1/im-ed578fcc5e398ffdbc7a62d31b568a76b91e14ffa0afb794f3587aee8d248d67.svg":{"logical_path":"flags/1x1/im.svg","mtime":"2022-05-27T21:42:11+02:00","size":10197,"digest":"6dd9078e0d7934b575a00aa2b81effafa5b8aed1fa6c3f6824d56187ca7a63ba","integrity":"sha256-bdkHjg15NLV1oAqiuB7/r6W4rtH6bD9oJNVhh8p6Y7o="},"flags/4x3/in-63b359940156312c6ed31c2b61f005c2bc386823401773aac9aaa328d994f7bc.svg":{"logical_path":"flags/4x3/in.svg","mtime":"2022-05-27T21:42:11+02:00","size":1074,"digest":"cbc15f5fb40df22adf2b3792eb6c1d359e1a7affb44318a5a779943fc7299d45","integrity":"sha256-y8FfX7QN8irfKzeS62wdNZ4aev+0Qxilp3mUP8cpnUU="},"flags/1x1/in-3fd1bedfc697bfe677a9774d7a6f51d04115cce400b4d7a892ecf1f69526790f.svg":{"logical_path":"flags/1x1/in.svg","mtime":"2022-05-27T21:42:11+02:00","size":1088,"digest":"dd68b8ac425f8b0e1a479337e4fb6e8c647241f5042e63ba4cd9853e5e3b661b","integrity":"sha256-3Wi4rEJfiw4aR5M35PtujGRyQfUELmO6TNmFPl47Zhs="},"flags/4x3/io-67be58cb5bf7afe6099ec339235ec7ba0da153a50c651e28d4c32b2e6aa64cbc.svg":{"logical_path":"flags/4x3/io.svg","mtime":"2022-05-27T21:42:11+02:00","size":27341,"digest":"b942bddf710a42e617b2fcabb8bdfbe210b85d2ac9a60b5063d513ecc6648eec","integrity":"sha256-uUK933EKQuYXsvyruL374hC4XSrJpgtQY9UT7MZkjuw="},"flags/1x1/io-aa0702e0280d98693b3fb6350b45a7903ca25782082d3f1cee75f33f1a4d739d.svg":{"logical_path":"flags/1x1/io.svg","mtime":"2022-05-27T21:42:11+02:00","size":27357,"digest":"5b124813bf16fe4c96b606443527a5f17f6cdde9f0abf94d6884f5f81118198e","integrity":"sha256-WxJIE78W/kyWtgZENSel8X9s3enwq/lNaIT1+BEYGY4="},"flags/4x3/iq-51acd0adc48bf1cb7256aba82069573f84db0baaf49b968f7f06afe140555f7a.svg":{"logical_path":"flags/4x3/iq.svg","mtime":"2022-05-27T21:42:11+02:00","size":1470,"digest":"4b13b01690d870625d61a87bbaf4328a714626698d056dc3f56a9a37c133d77a","integrity":"sha256-SxOwFpDYcGJdYah7uvQyinFGJmmNBW3D9WqaN8Ez13o="},"flags/1x1/iq-0ec8238d4e53fd7ec06ceda47e1378ee68042666f1f7f1a91753595a2167366e.svg":{"logical_path":"flags/1x1/iq.svg","mtime":"2022-05-27T21:42:11+02:00","size":1475,"digest":"4a529e765a46ab3cea5be74d6754d6646b175cc5da0a725114e1fcd1f877734c","integrity":"sha256-SlKedlpGqzzqW+dNZ1TWZGsXXMXaCnJRFOH80fh3c0w="},"flags/4x3/ir-0d6f2bd5403ac2c3f7dfd49e3c5124817575c00b5167ef4c03cbfb63cfc10a26.svg":{"logical_path":"flags/4x3/ir.svg","mtime":"2022-05-27T21:42:11+02:00","size":15451,"digest":"2047b977f2d7e8835035e30551fe8333403452134c3164105ed30b2e6fd14a23","integrity":"sha256-IEe5d/LX6INQNeMFUf6DM0A0UhNMMWQQXtMLLm/RSiM="},"flags/1x1/ir-123d34118d6933f90a6b1191e2605c8344850c39f72644b9d91e15bfa640b623.svg":{"logical_path":"flags/1x1/ir.svg","mtime":"2022-05-27T21:42:11+02:00","size":15356,"digest":"18b8f0da914e052490e627f2dbe57a24a1448e84cfedead2d2ffa9795135afc6","integrity":"sha256-GLjw2pFOBSSQ5ify2+V6JKFEjoTP7erS0v+peVE1r8Y="},"flags/4x3/is-21543ffd547f651c7628bfe97d3c3626ea5e6999848de64efddee4656c27177b.svg":{"logical_path":"flags/4x3/is.svg","mtime":"2022-05-27T21:42:11+02:00","size":524,"digest":"89b266e3c5824fabc91b8d04a830a3f32c62484b49543bc3921e14c57ba6cb7e","integrity":"sha256-ibJm48WCT6vJG40EqDCj8yxiSEtJVDvDkh4UxXumy34="},"flags/1x1/is-d73fc857d6844a1cdab62f81ba30a1ea895557d8d8fa4eecf7fa4b9127bc0123.svg":{"logical_path":"flags/1x1/is.svg","mtime":"2022-05-27T21:42:11+02:00","size":526,"digest":"74bbf9d0f1714110da6ba438163ff7de135dd91d32b2172757a943ac7bc355a3","integrity":"sha256-dLv50PFxQRDaa6Q4Fj/33hNd2R0yshcnV6lDrHvDVaM="},"flags/4x3/it-8b46e4a9676eb92cd507acef1d7c62115e6acc4b85e58a0806a0721ac34735f6.svg":{"logical_path":"flags/4x3/it.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"2d46fd7fde3f19c3f278fe9028e6fab6fa997fbdda3e18116fb70e57cfc78598","integrity":"sha256-LUb9f94/GcPyeP6QKOb6tvqZf73aPhgRb7cOV8/HhZg="},"flags/1x1/it-2767e5c7250ec17539972ef710a8cebde73971bf0b9b3186d5baffb02f66974e.svg":{"logical_path":"flags/1x1/it.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"28a4339b1dc59c4e776f6bf07f51117de9fade0a8a749492e478764b8bd8c2f2","integrity":"sha256-KKQzmx3FnE53b2vwf1ERfen63gqKdJSS5Hh2S4vYwvI="},"flags/4x3/je-35111082a6e24dccbd512743a37ebec13094ffbed5fef2b0793037433821a7ce.svg":{"logical_path":"flags/4x3/je.svg","mtime":"2022-05-27T21:42:11+02:00","size":4700,"digest":"365f0f9dea4804f7f9a9ca052beb1b39bc0811cd5d47d013094418d5b6c53d1a","integrity":"sha256-Nl8PnepIBPf5qcoFK+sbObwIEc1dR9ATCUQY1bbFPRo="},"flags/1x1/je-87c6120456d517be72bdf28fd125176a743006be1cbe47ff5f59d54d1bf1253e.svg":{"logical_path":"flags/1x1/je.svg","mtime":"2022-05-27T21:42:11+02:00","size":4675,"digest":"0cdc51ec29101669d333d4b91b61d87f3d302473cc81bd17ff80ccbed6c7e0f6","integrity":"sha256-DNxR7CkQFmnTM9S5G2HYfz0wJHPMgb0X/4DMvtbH4PY="},"flags/4x3/jm-eb05254eb1abb6d7fcd764284581224857c980d7bad9d7e9afff3dfff49d1e73.svg":{"logical_path":"flags/4x3/jm.svg","mtime":"2022-05-27T21:42:11+02:00","size":389,"digest":"fc7c5d90b44fa5ba160c644f6c7f8918f5460a5842a517e3fd99ea94ba963594","integrity":"sha256-/HxdkLRPpboWDGRPbH+JGPVGClhCpRfj/ZnqlLqWNZQ="},"flags/1x1/jm-0af380d25aef6a7de4c545a85ea3f76d3b08e56c000980c08a681ada232ba49d.svg":{"logical_path":"flags/1x1/jm.svg","mtime":"2022-05-27T21:42:11+02:00","size":389,"digest":"1b80b0d1f940a94945335aa2683e0195890c35f5bae24a3321c7752c5cdf8416","integrity":"sha256-G4Cw0flAqUlFM1qiaD4BlYkMNfW64kozIcd1LFzfhBY="},"flags/4x3/jo-193203037e596abc063a9c30d0dd3aaa9c908557a1b57bcbcb94e1a1e8bb2402.svg":{"logical_path":"flags/4x3/jo.svg","mtime":"2022-05-27T21:42:11+02:00","size":720,"digest":"c3109f9f849f581918a4567768bd334506cb517bf8a3ed3afc8e670ae434af27","integrity":"sha256-wxCfn4SfWBkYpFZ3aL0zRQbLUXv4o+06/I5nCuQ0ryc="},"flags/1x1/jo-2b9c3f54d7e98c848cc0bd764bcd5ac2320d4f13aee8a84a207e7d0490c03516.svg":{"logical_path":"flags/1x1/jo.svg","mtime":"2022-05-27T21:42:11+02:00","size":691,"digest":"e183a9aa500d7bbef58df474d4b1a0554e4c68e187c9803a68272cbbecd45118","integrity":"sha256-4YOpqlANe771jfR01LGgVU5MaOGHyYA6aCcsu+zUURg="},"flags/4x3/jp-169d02f898d54cacbecd7b0197d32045a46c4424c10a67e78bbf488f7b44541e.svg":{"logical_path":"flags/4x3/jp.svg","mtime":"2022-05-27T21:42:11+02:00","size":474,"digest":"e759dccba5bc383814ab190daba0d12ef591ad9f161502a47222c2eacf770606","integrity":"sha256-51ncy6W8ODgUqxkNq6DRLvWRrZ8WFQKkciLC6s93BgY="},"flags/1x1/jp-20835e83e8d43872df1ef8a2b3a26379b5f6bcff854dab3c7a24dcad4a42e02d.svg":{"logical_path":"flags/1x1/jp.svg","mtime":"2022-05-27T21:42:11+02:00","size":484,"digest":"0573d020325a0795ebf2b83b6d604ecce164efc5c6e16c6fb4a48f124d2902d5","integrity":"sha256-BXPQIDJaB5Xr8rg7bWBOzOFk78XG4WxvtKSPEk0pAtU="},"flags/4x3/ke-58146180a02774a36ff2e4caf23b75c441a92dc69ffe3b9d4e9ded31e16748b5.svg":{"logical_path":"flags/4x3/ke.svg","mtime":"2022-05-27T21:42:11+02:00","size":1379,"digest":"c6390bd1dead222763be7c93e10ce8d48ce550d2083d00b907504d01f3be8da8","integrity":"sha256-xjkL0d6tIidjvnyT4Qzo1IzlUNIIPQC5B1BNAfO+jag="},"flags/1x1/ke-b3b9722930c4ecc82ed67d7c47eb751eefba3a59b24b68927c45d43a06b450a8.svg":{"logical_path":"flags/1x1/ke.svg","mtime":"2022-05-27T21:42:11+02:00","size":1485,"digest":"3cc6fb778db9f415d50e5651069719c7becdcb7cca53868586a287e024e26d8f","integrity":"sha256-PMb7d4259BXVDlZRBpcZx77Ny3zKU4aFhqKH4CTibY8="},"flags/4x3/kg-7c23eb9471af5dc5ee4391e4ec08fec7889c2d83f2712ce59310a0eb81d663f0.svg":{"logical_path":"flags/4x3/kg.svg","mtime":"2022-05-27T21:42:11+02:00","size":3374,"digest":"618432f0701371ef7260a11fde248179e49360f1acd1a0fd07c4efcd153f4721","integrity":"sha256-YYQy8HATce9yYKEf3iSBeeSTYPGs0aD9B8TvzRU/RyE="},"flags/1x1/kg-83e2a04c6199e69a1604a12610591fda15c8cf60e9fe7f682916815c5f1840bf.svg":{"logical_path":"flags/1x1/kg.svg","mtime":"2022-05-27T21:42:11+02:00","size":3316,"digest":"059ee9448b06e00eee47ca8a059e608618ddcd7e2fbb949149ee0bd46836dd35","integrity":"sha256-BZ7pRIsG4A7uR8qKBZ5ghhjdzX4vu5SRSe4L1Gg23TU="},"flags/4x3/kh-4f121b97388966312c5691244a72214a3306f87ec517c658adcaf39a131a1d8c.svg":{"logical_path":"flags/4x3/kh.svg","mtime":"2022-05-27T21:42:11+02:00","size":7261,"digest":"ec1e0984d167e8c6bfa026cfddd6048c64e9b3634a99c9a20db194f28f10b1a6","integrity":"sha256-7B4JhNFn6Ma/oCbP3dYEjGTps2NKmcmiDbGU8o8QsaY="},"flags/1x1/kh-9b9ebdb74308e4975fef2e9737cad7fe44538bf97f5c1b7b6239fc2f065d4cea.svg":{"logical_path":"flags/1x1/kh.svg","mtime":"2022-05-27T21:42:11+02:00","size":7262,"digest":"16c097cc28b308b92d65e4ad3c025160256a36838bae538c0b1357f044788da3","integrity":"sha256-FsCXzCizCLktZeStPAJRYCVqNoOLrlOMCxNX8ER4jaM="},"flags/4x3/ki-0e1a57754e3271771a154b525dfb57e20d584083b47b1ac2708b843abf11948a.svg":{"logical_path":"flags/4x3/ki.svg","mtime":"2022-05-27T21:42:11+02:00","size":5813,"digest":"591a87de7bbeb711663f6dcaad93e269108ca6ab9ccbcb653e84c9779e9d3e2d","integrity":"sha256-WRqH3nu+txFmP23KrZPiaRCMpqucy8tlPoTJd56dPi0="},"flags/1x1/ki-64df628a3c2bacf16209af95403dd7ae5402f705b2776da20ea741646e047b12.svg":{"logical_path":"flags/1x1/ki.svg","mtime":"2022-05-27T21:42:11+02:00","size":5941,"digest":"210537cc2766114f72f9f838c5dc138a18c3f49e78575f7b1d699873061b0315","integrity":"sha256-IQU3zCdmEU9y+fg4xdwTihjD9J54V197HWmYcwYbAxU="},"flags/4x3/km-2301fd16e41810016f9a58d75b8a361ffe9885ecfc89a0b3e9108bda7f5501d9.svg":{"logical_path":"flags/4x3/km.svg","mtime":"2022-05-27T21:42:11+02:00","size":1064,"digest":"f6cd3ead925661739946379d122420dfd0287b6332e25ecefc5e8a97adefdb0f","integrity":"sha256-9s0+rZJWYXOZRjedEiQg39Aoe2My4l7O/F6Kl63v2w8="},"flags/1x1/km-6f9716ac74c8ef80557e682ae6d951a6ca6993eabd049f8de81a742f77a84452.svg":{"logical_path":"flags/1x1/km.svg","mtime":"2022-05-27T21:42:11+02:00","size":1037,"digest":"a6a467329036e9963b7aca186e74b5affd615663ad9802807a64c04aa79a5f19","integrity":"sha256-pqRnMpA26ZY7esoYbnS1r/1hVmOtmAKAemTASqeaXxk="},"flags/4x3/kn-8e866a33f9952f8b29e45e8576133345446925907a2c4bcd429a34ae377bc74e.svg":{"logical_path":"flags/4x3/kn.svg","mtime":"2022-05-27T21:42:11+02:00","size":819,"digest":"d0f010da3fc35e1b9b520e8c063eaf9a650c16a0dd6507928cbf013a04508924","integrity":"sha256-0PAQ2j/DXhubUg6MBj6vmmUMFqDdZQeSjL8BOgRQiSQ="},"flags/1x1/kn-46b0fcf2a59d3f923fc5ae6c914d9ee2d886fb4ee6f9c1108133244f4093d481.svg":{"logical_path":"flags/1x1/kn.svg","mtime":"2022-05-27T21:42:11+02:00","size":817,"digest":"ae4abba1402d60d25f380c8aa7dd081e7efc1349733b36ffbc7e61b951b54363","integrity":"sha256-rkq7oUAtYNJfOAyKp90IHn78E0lzOzb/vH5huVG1Q2M="},"flags/4x3/kp-ab0a3c4310474b324bbb39f77579ac3b421c531397d31e8f38de35a681d79bc9.svg":{"logical_path":"flags/4x3/kp.svg","mtime":"2022-05-27T21:42:11+02:00","size":795,"digest":"8d34a3fd7d34c53ce01854e2b1e69c71fd6b0c65dda1b8aa90f2935a551b8f79","integrity":"sha256-jTSj/X00xTzgGFTiseaccf1rDGXdobiqkPKTWlUbj3k="},"flags/1x1/kp-3a2ce32e4b76931fd6383f9833a4764528cc89c92f23672cc8eaff26c7a31ee1.svg":{"logical_path":"flags/1x1/kp.svg","mtime":"2022-05-27T21:42:11+02:00","size":852,"digest":"d0cb440831181be36d7ea60f5adff5bb1dae7d8ab06738a920ab994ad42652cc","integrity":"sha256-0MtECDEYG+NtfqYPWt/1ux2ufYqwZzipIKuZStQmUsw="},"flags/4x3/kr-854d1521a9cb2b22c90f96d5d62277a9e1382818eefdc294d481c397c92f97c0.svg":{"logical_path":"flags/4x3/kr.svg","mtime":"2022-05-27T21:42:11+02:00","size":1822,"digest":"3162c67e01704d06fd77d78fefeb5937fee5f4ee326d369da13a5b25b75db16a","integrity":"sha256-MWLGfgFwTQb9d9eP7+tZN/7l9O4ybTadoTpbJbddsWo="},"flags/1x1/kr-343a5d08f9d0ff8c4268c77111cff9d2296c3f875b8d776c95dea1ae246d9bda.svg":{"logical_path":"flags/1x1/kr.svg","mtime":"2022-05-27T21:42:11+02:00","size":1719,"digest":"3f72f5b1c788ac2bc2d7e3680f25f55692dff661e0dc3819bb78cd711f152d76","integrity":"sha256-P3L1sceIrCvC1+NoDyX1VpLf9mHg3DgZu3jNcR8VLXY="},"flags/4x3/kw-75be6f04a24e7ddaaec57c95420ece390603961fa238245b776386890ab5627b.svg":{"logical_path":"flags/4x3/kw.svg","mtime":"2022-05-27T21:42:11+02:00","size":509,"digest":"ac538e6cbafc0a94611bb9c653df3056cfa3303faff143308aa5680178e34f71","integrity":"sha256-rFOObLr8CpRhG7nGU98wVs+jMD+v8UMwiqVoAXjjT3E="},"flags/1x1/kw-cdbf39e8dc62ffc15b7bc3c373151070377db56c0508dadf80bdd3c971d8a094.svg":{"logical_path":"flags/1x1/kw.svg","mtime":"2022-05-27T21:42:11+02:00","size":507,"digest":"c874c334dca89cb394b3534eb2eb5ed408293d32052e9179fc75832191b5759e","integrity":"sha256-yHTDNNyonLOUs1NOsute1AgpPTIFLpF5/HWDIZG1dZ4="},"flags/4x3/ky-f75f33396887f6234e7ee4fd483e57c8e35ac52d504a4a6e12fad25d855bf061.svg":{"logical_path":"flags/4x3/ky.svg","mtime":"2022-05-27T21:42:11+02:00","size":21724,"digest":"fcecffb01a890f01464e6067e5593099b9919746443d16c69c7e223e13be50ef","integrity":"sha256-/Oz/sBqJDwFGTmBn5VkwmbmRl0ZEPRbGnH4iPhO+UO8="},"flags/1x1/ky-8ed8729ad8553aa468c0d9ea196f38048770b15a1bb632fb7c3bd56fbfd5b643.svg":{"logical_path":"flags/1x1/ky.svg","mtime":"2022-05-27T21:42:11+02:00","size":22357,"digest":"707d019e77714b8dee2074bbd17aaac157d2de0991a8d4c8472a038403c5471f","integrity":"sha256-cH0BnndxS43uIHS70XqqwVfS3gmRqNTIRyoDhAPFRx8="},"flags/4x3/kz-51f42e580c605b6580aa4288d88d9c88bc6fd86af2388b0e4313bce969628743.svg":{"logical_path":"flags/4x3/kz.svg","mtime":"2022-05-27T21:42:11+02:00","size":11327,"digest":"8214283b99e5781396996fdfd84c551ea7ac15a248465ccbb9358b13373d802a","integrity":"sha256-ghQoO5nleBOWmW/f2ExVHqesFaJIRlzLuTWLEzc9gCo="},"flags/1x1/kz-38ef143eed3d03cebe2e4924d520a0d90d5e59e97a39b13cb3085415267af6f3.svg":{"logical_path":"flags/1x1/kz.svg","mtime":"2022-05-27T21:42:11+02:00","size":11415,"digest":"af4496d258a36c41ce92d7713c7206e2e92ac6037c6dcdac687ba815e74a4f49","integrity":"sha256-r0SW0lijbEHOktdxPHIG4ukqxgN8bc2saHuoFedKT0k="},"flags/4x3/la-0a762fcc7ef73f1fedb4765b718e2e96c819d4b26d5375acfa48d245fb97fcec.svg":{"logical_path":"flags/4x3/la.svg","mtime":"2022-05-27T21:42:11+02:00","size":457,"digest":"1f70bf3805542fff3addba9e2148d541cb30b125c692a8c7e0868cf4c7dea409","integrity":"sha256-H3C/OAVUL/863bqeIUjVQcswsSXGkqjH4IaM9MfepAk="},"flags/1x1/la-59d7d7dd1443e9bc557631254afa4333d1b83db314c9eb8bc170ce26f34f5dd8.svg":{"logical_path":"flags/1x1/la.svg","mtime":"2022-05-27T21:42:11+02:00","size":501,"digest":"dafd3a0212ab43c02323bd5bb6fb1b4378a96e05cd352c354f6f4863a3f43f6d","integrity":"sha256-2v06AhKrQ8AjI71btvsbQ3ipbgXNNSw1T29IY6P0P20="},"flags/4x3/lb-26ea2add2ac68a8040b027b510f29080d8407b961243c77b33b46c8957768b66.svg":{"logical_path":"flags/4x3/lb.svg","mtime":"2022-05-27T21:42:11+02:00","size":2816,"digest":"80a2aaa6b4ad4e44ad197ccdb7defba58af6ff0ab0692817804de12ff594bc8e","integrity":"sha256-gKKqprStTkStGXzNt977pYr2/wqwaSgXgE3hL/WUvI4="},"flags/1x1/lb-eb8049cb746a3913ac814f4d6e0e850d0e4b9a60b78dec5e9acd95b299bf95e4.svg":{"logical_path":"flags/1x1/lb.svg","mtime":"2022-05-27T21:42:11+02:00","size":2747,"digest":"5da3263f37d0e740a94283824f5f0ad6c3ceed6f12dbe108fce0ddd760418373","integrity":"sha256-XaMmPzfQ50CpQoOCT18K1sPO7W8S2+EI/ODd12BBg3M="},"flags/4x3/lc-444f9f77d0b09bd84fe2a5fd7194eae81341d8b7b4823070fc3e74cab481a122.svg":{"logical_path":"flags/4x3/lc.svg","mtime":"2022-05-27T21:42:11+02:00","size":370,"digest":"6f18658956e6da5c5bf468181b465a33c33045134dfb327d35a9b6ea6c56d23e","integrity":"sha256-bxhliVbm2lxb9GgYG0ZaM8MwRRNN+zJ9Nam26mxW0j4="},"flags/1x1/lc-13a572e5fcbada8bf66eb77413f04f862b0cf95d4b85c5292b3d6348ec4d8c99.svg":{"logical_path":"flags/1x1/lc.svg","mtime":"2022-05-27T21:42:11+02:00","size":370,"digest":"c4afe17342a7894f5dc7eed56716e9149378561a12c2bbd88d4c0bf740087c38","integrity":"sha256-xK/hc0KniU9dx+7VZxbpFJN4VhoSwrvYjUwL90AIfDg="},"flags/4x3/li-b2d0ccbceb7e6129a6529c98721d92fcee379ed6c225a18e1eff3c6fa092eec7.svg":{"logical_path":"flags/4x3/li.svg","mtime":"2022-05-27T21:42:11+02:00","size":8268,"digest":"c97f90de5ee09d5594f9d3154e7eae0158a8f922e394c3ad24502a9274dd68fb","integrity":"sha256-yX+Q3l7gnVWU+dMVTn6uAVio+SLjlMOtJFAqknTdaPs="},"flags/1x1/li-97814472256460b19df380ad90e5380202001a8a7ad6b4140cd2a0b92db909ac.svg":{"logical_path":"flags/1x1/li.svg","mtime":"2022-05-27T21:42:11+02:00","size":8291,"digest":"956ad50772021978069fde52a08f25b6fe310b0019ccabe8acd274099fb21ad5","integrity":"sha256-lWrVB3ICGXgGn95SoI8ltv4xCwAZzKvorNJ0CZ+yGtU="},"flags/4x3/lk-d910bd0d9ddb013c5668824d6600a842496c0a17c74f772a801f833b9eb044f8.svg":{"logical_path":"flags/4x3/lk.svg","mtime":"2022-05-27T21:42:11+02:00","size":11242,"digest":"599de52b1450460f083ac0654eb4e833c06b809903c7ce11cbe202005e3f080e","integrity":"sha256-WZ3lKxRQRg8IOsBlTrToM8BrgJkDx84Ry+ICAF4/CA4="},"flags/1x1/lk-c7fb3c2b64782519d94f0a9fd21c057e5e32b856c428b68abb11667191235270.svg":{"logical_path":"flags/1x1/lk.svg","mtime":"2022-05-27T21:42:11+02:00","size":11254,"digest":"379d62d2296d30d484a1c0469582d3a95736284bcdbc58e9d6bcb4f648836d1d","integrity":"sha256-N51i0iltMNSEocBGlYLTqVc2KEvNvFjp1ry09kiDbR0="},"flags/4x3/lr-42e8d3bdacafc05835fcd52026cb3e1717573965ce9d4f49635dbb390021a4b4.svg":{"logical_path":"flags/4x3/lr.svg","mtime":"2022-05-27T21:42:11+02:00","size":727,"digest":"66c008c2d58e2b50772ad95a30801a9b62566d5f3ac8ec1ea1ad41aaadc0f4c7","integrity":"sha256-ZsAIwtWOK1B3KtlaMIAam2JWbV86yOweoa1Bqq3A9Mc="},"flags/1x1/lr-169945e579afdf35dd158694a1679380886f8541278cbd225c7e750add25e60e.svg":{"logical_path":"flags/1x1/lr.svg","mtime":"2022-05-27T21:42:11+02:00","size":694,"digest":"371f542a58fe7e4a3c67dc92f92009757337ba428a368af4e077a4cccac652e6","integrity":"sha256-Nx9UKlj+fko8Z9yS+SAJdXM3ukKKNor04HekzMrGUuY="},"flags/4x3/ls-a4db42569c4760bffd695cbdb030c90bc203f40f75fb357cbdbef961d29cf5dd.svg":{"logical_path":"flags/4x3/ls.svg","mtime":"2022-05-27T21:42:11+02:00","size":1219,"digest":"285534456c1acd523d23e09220799faf851218c1b2d8015b0bb557910ca1b9e4","integrity":"sha256-KFU0RWwazVI9I+CSIHmfr4USGMGy2AFbC7VXkQyhueQ="},"flags/1x1/ls-1dd02208fc24c668e18430bb0500fa14c995f64cab8cde080b4256bd1b42b23f.svg":{"logical_path":"flags/1x1/ls.svg","mtime":"2022-05-27T21:42:11+02:00","size":1242,"digest":"80ad805e34b571d758604e2b1b735fe2c0f38dc1593c11c7d9a987e89f8fc6aa","integrity":"sha256-gK2AXjS1cddYYE4rG3Nf4sDzjcFZPBHH2amH6J+Pxqo="},"flags/4x3/lt-a57e003a5cbe538a4bfc2d29fd3523a87948bc8e29f731096dff9095096178c9.svg":{"logical_path":"flags/4x3/lt.svg","mtime":"2022-05-27T21:42:11+02:00","size":442,"digest":"9012691cb1689944fd0813b33b7a58fb97921944ec8988f23590fed21a1ff07c","integrity":"sha256-kBJpHLFomUT9CBOzO3pY+5eSGUTsiYjyNZD+0hof8Hw="},"flags/1x1/lt-e386ebe0482bdf999b151c3ae8c5e5e40a58037eab35b29f37682aa849edd3f0.svg":{"logical_path":"flags/1x1/lt.svg","mtime":"2022-05-27T21:42:11+02:00","size":442,"digest":"74f423c6210d7dc76867b1f620d0d15644db5c39b9e4197805ad20504d271f08","integrity":"sha256-dPQjxiENfcdoZ7H2INDRVkTbXDm55Bl4Ba0gUE0nHwg="},"flags/4x3/lu-2746295f8b0a1540d43e0c2548d4ec1341fafcffe48b919fb135a6c82535b657.svg":{"logical_path":"flags/4x3/lu.svg","mtime":"2022-05-27T21:42:11+02:00","size":228,"digest":"4622624d698a9577a3fb92bd4fa5f98f305d704bc51306b86d109c6c865d069a","integrity":"sha256-RiJiTWmKlXej+5K9T6X5jzBdcEvFEwa4bRCcbIZdBpo="},"flags/1x1/lu-9695b187733f52bae07c65e78aae8956e25360ad773c1f4703855997571a764d.svg":{"logical_path":"flags/1x1/lu.svg","mtime":"2022-05-27T21:42:11+02:00","size":232,"digest":"67ceb25fba1fc6a2c3836cef4033fad77752db08bcbc88fa7622b22a5f6ada2e","integrity":"sha256-Z86yX7ofxqLDg2zvQDP613dS2wi8vIj6diKyKl9q2i4="},"flags/4x3/lv-b51d475acf37be9accc82ddf5f60773861cf58b0e9b599460852589da88501ef.svg":{"logical_path":"flags/4x3/lv.svg","mtime":"2022-05-27T21:42:11+02:00","size":233,"digest":"dc67526a1833d2cd7c50d87f0da252e1fa2b361d7d418715535d3aa63e5a76b7","integrity":"sha256-3GdSahgz0s18UNh/DaJS4forNh19QYcVU106pj5adrc="},"flags/1x1/lv-dbf5d3fb294b518bc6373c4fc22b028fc462647fbd5032cf57513556896577bc.svg":{"logical_path":"flags/1x1/lv.svg","mtime":"2022-05-27T21:42:11+02:00","size":237,"digest":"23e2589c8a374ecf955772e01a4b6a7302133346737279eac1e8214b68bb0308","integrity":"sha256-I+JYnIo3Ts+VV3LgGktqcwITM0ZzcnnqweghS2i7Awg="},"flags/4x3/ly-7409a315d2f9aab4676558d7e97f4316ea87fc7afd93a493def4adf0b5773ca6.svg":{"logical_path":"flags/4x3/ly.svg","mtime":"2022-05-27T21:42:11+02:00","size":533,"digest":"3ad0387cfe11942e1f55114d49e6083185afde3528d2b05885160bdd043ff470","integrity":"sha256-OtA4fP4RlC4fVRFNSeYIMYWv3jUo0rBYhRYL3QQ/9HA="},"flags/1x1/ly-6457e38177d82f6c52e3f3c38328f1ac66bb5a5c7a9026229d4e3aafe3b592af.svg":{"logical_path":"flags/1x1/ly.svg","mtime":"2022-05-27T21:42:11+02:00","size":526,"digest":"5139e7519b7c833dfca645e2e7424517489927cb9facc6f0dff3d80b72d1e59d","integrity":"sha256-UTnnUZt8gz38pkXi50JFF0iZJ8ufrMbw3/PYC3LR5Z0="},"flags/4x3/ma-0628f236b2067d66c841c1190a3e8e3e9c37fbf2f3521fdb5ecba3eda75e805e.svg":{"logical_path":"flags/4x3/ma.svg","mtime":"2022-05-27T21:42:11+02:00","size":250,"digest":"f40a79d79c88c1bb927ec0e40c5d044f838f0a2c48d820b3e8449e92a71d02d6","integrity":"sha256-9Ap515yIwbuSfsDkDF0ET4OPCixI2CCz6ESekqcdAtY="},"flags/1x1/ma-5c96636ed7496b25e989cb74f202e377ec4c59b056b9d0c425ded77199b0d659.svg":{"logical_path":"flags/1x1/ma.svg","mtime":"2022-05-27T21:42:11+02:00","size":250,"digest":"3190fa17944b136ba27880e354cf385a1d7f6af076859fd8e3a25b30eaded302","integrity":"sha256-MZD6F5RLE2uieIDjVM84Wh1/avB2hZ/Y46JbMOre0wI="},"flags/4x3/mc-10a533ce437c40973f8684439f7e24da1ea624c5e5535fa4738d62ede0650242.svg":{"logical_path":"flags/4x3/mc.svg","mtime":"2022-05-27T21:42:11+02:00","size":237,"digest":"65c30fed3b3ade292a366ca3cea6155962e94a13944fd62e73706a7f872253ec","integrity":"sha256-ZcMP7Ts63ikqNmyjzqYVWWLpShOUT9Yuc3Bqf4ciU+w="},"flags/1x1/mc-6a9a8fe216f75ecdb8bddf6e6c816c1c9771ebffe3c09e83975a434ec1fb4950.svg":{"logical_path":"flags/1x1/mc.svg","mtime":"2022-05-27T21:42:11+02:00","size":237,"digest":"83f9d4ff92513bfe22f55c5df31e600c77893660b9b3c000efad29ea4f6c32ad","integrity":"sha256-g/nU/5JRO/4i9Vxd8x5gDHeJNmC5s8AA760p6k9sMq0="},"flags/4x3/md-6641e05826ea580544c1890fe3698eb2e8e3af463518fc37eea7c41eb8cbb6c0.svg":{"logical_path":"flags/4x3/md.svg","mtime":"2022-05-27T21:42:11+02:00","size":11237,"digest":"92475a7045515ebb11c2127a896010934a569a7d16adc4a702d41adf4565d440","integrity":"sha256-kkdacEVRXrsRwhJ6iWAQk0pWmn0WrcSnAtQa30Vl1EA="},"flags/1x1/md-e51dd640155b523a207eb1dc9dc909c38d9e88de04729e250e0cccd1e9d1b0b7.svg":{"logical_path":"flags/1x1/md.svg","mtime":"2022-05-27T21:42:11+02:00","size":11337,"digest":"af363b1645da518014f81a5670419b70adc6fc09b1c32def53145c26d5fc256f","integrity":"sha256-rzY7FkXaUYAU+BpWcEGbcK3G/Amxwy3vUxRcJtX8JW8="},"flags/4x3/me-c841acf1209c546dd77c18b718141ce4e21dba95a120cc3092988edaaf08f432.svg":{"logical_path":"flags/4x3/me.svg","mtime":"2022-05-27T21:42:11+02:00","size":62373,"digest":"29052367756da76b9ddcc3a71a17dc15cc39a7d387cb381fc5daad5880cd1895","integrity":"sha256-KQUjZ3Vtp2ud3MOnGhfcFcw5p9OHyzgfxdqtWIDNGJU="},"flags/1x1/me-c290031be15a14ebd1fd278774142e29f7dfe3d0fb3aba79c0d6932cb0feeb4b.svg":{"logical_path":"flags/1x1/me.svg","mtime":"2022-05-27T21:42:11+02:00","size":63354,"digest":"551e531eae9f601ce16f204217b0dea54396c8e689dd2792667e1c4fdd239367","integrity":"sha256-VR5THq6fYBzhbyBCF7DepUOWyOaJ3SeSZn4cT90jk2c="},"flags/4x3/mf-41a6043e2495b346fd700b17352150a8e43ca342a515fcb5159c39f809663ec6.svg":{"logical_path":"flags/4x3/mf.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"a07c29d68d55c8c614265e1bfc1ec179073e983f9d30a1a361310d68d2e30fa5","integrity":"sha256-oHwp1o1VyMYUJl4b/B7BeQc+mD+dMKGjYTENaNLjD6U="},"flags/1x1/mf-a3f24457b393082243eb00ea514057c09b1cf4985f6fa17d7902500fbb716317.svg":{"logical_path":"flags/1x1/mf.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"bf59a29b95c033e21fc58c30f4369db5d0312954389ab46c0e3d14b17dbd8b4e","integrity":"sha256-v1mim5XAM+IfxYww9DadtdAxKVQ4mrRsDj0UsX29i04="},"flags/4x3/mg-1baa2b12c3e79d592538d5d8e4d5a2c0e1373d3871c9d829f57b212daaf42129.svg":{"logical_path":"flags/4x3/mg.svg","mtime":"2022-05-27T21:42:11+02:00","size":302,"digest":"9e1ecee816ab8ef6441e6bb5a6d14c4238f074fcbc278a4ffa6168809669e586","integrity":"sha256-nh7O6BarjvZEHmu1ptFMQjjwdPy8J4pP+mFogJZp5YY="},"flags/1x1/mg-7e78efcc81f02f0616a11aec87bfd8dfaed1a328496301902f53375eee8f72ee.svg":{"logical_path":"flags/1x1/mg.svg","mtime":"2022-05-27T21:42:11+02:00","size":302,"digest":"e87135a47b177787871c8e7a341fe3b4f89843d33025affd16c2cf89bcfaac56","integrity":"sha256-6HE1pHsXd4eHHI56NB/jtPiYQ9MwJa/9FsLPibz6rFY="},"flags/4x3/mh-1236a730a9819f0b58ac8cd642d17482b3945a894c63663b4accf10ac8ce5ecc.svg":{"logical_path":"flags/4x3/mh.svg","mtime":"2022-05-27T21:42:11+02:00","size":741,"digest":"4785fd6418f936a2702773e3e131f282067da3d8d406c4c31d0d1bcbfc638af7","integrity":"sha256-R4X9ZBj5NqJwJ3Pj4THyggZ9o9jUBsTDHQ0by/xjivc="},"flags/1x1/mh-3ecae469e3987c59cc4b19833eb8ccfe49a9477f70aa2aa2be5e9a4a131a48d0.svg":{"logical_path":"flags/1x1/mh.svg","mtime":"2022-05-27T21:42:11+02:00","size":763,"digest":"ab6f55130abfca1e85a6818f74ea0f262e9327fb99f75868aae2bd2b83aef6aa","integrity":"sha256-q29VEwq/yh6FpoGPdOoPJi6TJ/uZ91hoquK9K4Ou9qo="},"flags/4x3/mk-2a7bfeeba74701ceba752795d02eac7a97a6139471e5bdd529f2a858f4fd1d0e.svg":{"logical_path":"flags/4x3/mk.svg","mtime":"2022-05-27T21:42:11+02:00","size":382,"digest":"3c7035086a33b244188bfc3ad050eb100aab771dfe39dd82c619ae6cd103af4c","integrity":"sha256-PHA1CGozskQYi/w60FDrEAqrdx3+Od2CxhmubNEDr0w="},"flags/1x1/mk-fe5c84d0e9bd4b7ceeed81f9564a970d7b5b39659e42f819c50950e191443720.svg":{"logical_path":"flags/1x1/mk.svg","mtime":"2022-05-27T21:42:11+02:00","size":410,"digest":"ebcd71d69e1fad32c0acbd1c9887945069b1f75ea52ef857e2e26e8927a7d98d","integrity":"sha256-681x1p4frTLArL0cmIeUUGmx916lLvhX4uJuiSen2Y0="},"flags/4x3/ml-086660fe4272a22e220c94854fe4f80dd61afadd5c0c81cc075aea91bbcaa691.svg":{"logical_path":"flags/4x3/ml.svg","mtime":"2022-05-27T21:42:11+02:00","size":276,"digest":"e8326589ad95d63b2856367db0b6343479eb591d116bc7e7a2c15e7d422e8dca","integrity":"sha256-6DJlia2V1jsoVjZ9sLY0NHnrWR0Ra8fnosFefUIujco="},"flags/1x1/ml-9ef37a44932a3af38990145042c85352b1c5c4e791221d1fd91b5a9f7a412efb.svg":{"logical_path":"flags/1x1/ml.svg","mtime":"2022-05-27T21:42:11+02:00","size":279,"digest":"0f990fac6a324676dad90acd1f8e5cf8e660bd62f978ee44acedefaccc226b7a","integrity":"sha256-D5kPrGoyRnba2QrNH45c+OZgvWL5eO5ErO3vrMwia3o="},"flags/4x3/mm-60ae7680502d9af8796fe3b3d57bbf6105a406e2e66840e9aa1f6e2470466058.svg":{"logical_path":"flags/4x3/mm.svg","mtime":"2022-05-27T21:42:11+02:00","size":848,"digest":"f7ef4a34cf98d96f557d0a7020f178154b730129be4c2b5f8425b825665875c1","integrity":"sha256-9+9KNM+Y2W9VfQpwIPF4FUtzASm+TCtfhCW4JWZYdcE="},"flags/1x1/mm-ea5bef04548342d984d8c8707333a31203a5abf015db093553f26c3a9febb251.svg":{"logical_path":"flags/1x1/mm.svg","mtime":"2022-05-27T21:42:11+02:00","size":865,"digest":"f4df9e4b3a4df8d9ee464504a1f88cdc0ea08d9923c8c7b3099ec8eabbf4258b","integrity":"sha256-9N+eSzpN+NnuRkUEofiM3A6gjZkjyMezCZ7I6rv0JYs="},"flags/4x3/mn-1309f63a0b6bfc594a1721a8af76381a1389fda64d840b256d353eb1341cb794.svg":{"logical_path":"flags/4x3/mn.svg","mtime":"2022-05-27T21:42:11+02:00","size":1245,"digest":"00649cb56bad07f8d34472e881fbe370a46879416fcba8dfc655f6eeed0056a3","integrity":"sha256-AGSctWutB/jTRHLogfvjcKRoeUFvy6jfxlX27u0AVqM="},"flags/1x1/mn-86ecb7d9fcefe13783f165d44a93c9c2b1add55481bc69a70f9bd3652c27ae74.svg":{"logical_path":"flags/1x1/mn.svg","mtime":"2022-05-27T21:42:11+02:00","size":1251,"digest":"ff5ea681d66e1a88ff8584dfc7fb20e8ed282b218bf9cc06518b1df90f3f99c7","integrity":"sha256-/16mgdZuGoj/hYTfx/sg6O0oKyGL+cwGUYsd+Q8/mcc="},"flags/4x3/mo-6c69662b2581d90527965dd2c444784ab366f0080c93f2014ca37f2f7541b898.svg":{"logical_path":"flags/4x3/mo.svg","mtime":"2022-05-27T21:42:11+02:00","size":1461,"digest":"62610131201312d4268197556e2952932ee4cde22ce876668722cc332b83989e","integrity":"sha256-YmEBMSATEtQmgZdVbilSky7kzeIs6HZmhyLMMyuDmJ4="},"flags/1x1/mo-ef906f7a8fdaccb7532359de1e5ce664ec0342975052b55a2e389f1b6338cba8.svg":{"logical_path":"flags/1x1/mo.svg","mtime":"2022-05-27T21:42:11+02:00","size":1495,"digest":"8eaad37d10c6db6035b0d4a74c33015539f2c78cd655e0ce4e1aa4b04f3ce36a","integrity":"sha256-jqrTfRDG22A1sNSnTDMBVTnyx4zWVeDOThqksE8842o="},"flags/4x3/mp-dd2fa1cf9846007f88c88143047430f3f666099875407cf36648b271b6e1400a.svg":{"logical_path":"flags/4x3/mp.svg","mtime":"2022-05-27T21:42:11+02:00","size":23398,"digest":"2e4af783bec6f474fc03275a7dc048a146d28ad3da615d65e6eb6d930c0054ef","integrity":"sha256-Lkr3g77G9HT8AydafcBIoUbSitPaYV1l5uttkwwAVO8="},"flags/1x1/mp-cd1d342862684bdb7caacb093e37d7e3b094cf49cfa5aa579d6b8201ffb4dd93.svg":{"logical_path":"flags/1x1/mp.svg","mtime":"2022-05-27T21:42:11+02:00","size":23628,"digest":"9b89316de0a803f61b8a4e842483db37436cc9e53911d6e2f59b53dfa422d563","integrity":"sha256-m4kxbeCoA/Ybik6EJIPbN0NsyeU5Edbi9ZtT36Qi1WM="},"flags/4x3/mq-be00a7c77b6aec1f86cd16bcafc7fe27b7b8c967b03632f8230cd83794833ba8.svg":{"logical_path":"flags/4x3/mq.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"297d268a5e967f7d34c91aa4513f86ec67b2efcef6df294a7846a554d73f22d9","integrity":"sha256-KX0mil6Wf300yRqkUT+G7Gey78723ylKeEalVNc/Itk="},"flags/1x1/mq-bfaccc4a61b2d7067b44d54a75ce5bb5757292bdabff5e104b547aa2435a2e5d.svg":{"logical_path":"flags/1x1/mq.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"0e466f6d604a1134afaa8fcced93845bd17be04debfd302d70964a806532f093","integrity":"sha256-DkZvbWBKETSvqo/M7ZOEW9F74E3r/TAtcJZKgGUy8JM="},"flags/4x3/mr-2293d4180eff3670e1c484d52a206efb562e8d96b9cb8c5a43aa65e1e2b1289c.svg":{"logical_path":"flags/4x3/mr.svg","mtime":"2022-05-27T21:42:11+02:00","size":442,"digest":"e41908b9de58fe9479e9a2e2a5bc0074ca1013cc247f2b1410568e8babe4ebfe","integrity":"sha256-5BkIud5Y/pR56aLipbwAdMoQE8wkfysUEFaOi6vk6/4="},"flags/1x1/mr-a3eb1a496e2c5dc86245856e18a91d71046b44d74d88274014e2d4fab41c3453.svg":{"logical_path":"flags/1x1/mr.svg","mtime":"2022-05-27T21:42:11+02:00","size":431,"digest":"fa0266040f7fa99236c10e36bd23ad92a558fdd79d250a23076733ae2aade799","integrity":"sha256-+gJmBA9/qZI2wQ42vSOtkqVY/dedJQojB2czriqt55k="},"flags/4x3/ms-913b24dbffa69bc3a57e997a806cdca5026cc5f87f83eefeef36a1aa8f5c2789.svg":{"logical_path":"flags/4x3/ms.svg","mtime":"2022-05-27T21:42:11+02:00","size":9279,"digest":"c2c0dfeea4a1f46dfb510afc8a97e99cc5a91d89851e97e4edd48f10d10eb262","integrity":"sha256-wsDf7qSh9G37UQr8ipfpnMWpHYmFHpfk7dSPENEOsmI="},"flags/1x1/ms-8be40421854193032b83670c6a91aa1f5c818578eafb85ee90dce959eb54c6db.svg":{"logical_path":"flags/1x1/ms.svg","mtime":"2022-05-27T21:42:11+02:00","size":12140,"digest":"c1ba27711118135b0d694151a37e397e71ae19470cd2fb7bb21ccb8178f4be43","integrity":"sha256-wboncREYE1sNaUFRo345fnGuGUcM0vt7shzLgXj0vkM="},"flags/4x3/mt-517b4f67a94fff5be6346cae3731f5a17290b4c56732129967c15f482199365e.svg":{"logical_path":"flags/4x3/mt.svg","mtime":"2022-05-27T21:42:11+02:00","size":8733,"digest":"fd6a6cbf958e7d3b88070ded68716b2b85bc130acf68e3b0bbab05361dbab47d","integrity":"sha256-/Wpsv5WOfTuIBw3taHFrK4W8EwrPaOOwu6sFNh26tH0="},"flags/1x1/mt-371c5673e14380308182c7ae324f54792652bf4d0cf64de30b1d1fefea8c9b5d.svg":{"logical_path":"flags/1x1/mt.svg","mtime":"2022-05-27T21:42:11+02:00","size":10422,"digest":"b841b8cd3c568b0638ab7fd12e8dcf24f09f1b6bbf7942a28c52212ac465d100","integrity":"sha256-uEG4zTxWiwY4q3/RLo3PJPCfG2u/eUKijFIhKsRl0QA="},"flags/4x3/mu-0a0d71ecace32a2948ac3eacc94927fb0ba7306236bf2a18ab5ae85bb2351664.svg":{"logical_path":"flags/4x3/mu.svg","mtime":"2022-05-27T21:42:11+02:00","size":319,"digest":"e3ce67e697fb6b33a39726379574752eef57b121d6f60d160e6bc7d7ed8f5ae6","integrity":"sha256-485n5pf7azOjlyY3lXR1Lu9XsSHW9g0WDmvH1+2PWuY="},"flags/1x1/mu-e0d4ee6c8f915eb54307ff51f57734c0bffa843060d953b9bd27f365b4a11b36.svg":{"logical_path":"flags/1x1/mu.svg","mtime":"2022-05-27T21:42:11+02:00","size":319,"digest":"9e4e19a678ac8b84eb14740be948a7dea035b5c0623639ba6e06e242359aa1bb","integrity":"sha256-nk4Zpnisi4TrFHQL6Uin3qA1tcBiNjm6bgbiQjWaobs="},"flags/4x3/mv-421f31e8be8d80695f9f4811435214e8a8ac8729e145f9d491b888d91d0ca999.svg":{"logical_path":"flags/4x3/mv.svg","mtime":"2022-05-27T21:42:11+02:00","size":289,"digest":"0f9b86efb7f8d66d28223ff592232812cfd2d2567db83ef96bf783ea3154eb8d","integrity":"sha256-D5uG77f41m0oIj/1kiMoEs/S0lZ9uD75a/eD6jFU640="},"flags/1x1/mv-c0056befcc1b506b4b498bf37dfa30642839a1beb6373f682e1214850b51cf6d.svg":{"logical_path":"flags/1x1/mv.svg","mtime":"2022-05-27T21:42:11+02:00","size":307,"digest":"57323390cdd79b28e658b6089304469012536c57101787020701ed91518848da","integrity":"sha256-VzIzkM3XmyjmWLYIkwRGkBJTbFcQF4cCBwHtkVGISNo="},"flags/4x3/mw-644750e23780e66258d7b56777be8ef47ce3ca2d9d5735eac5abbb22fae33056.svg":{"logical_path":"flags/4x3/mw.svg","mtime":"2022-05-27T21:42:11+02:00","size":3652,"digest":"c2c93e168527ec8bda2799854370dfacafcb491f39d6083900d903244c00cc4b","integrity":"sha256-wsk+FoUn7IvaJ5mFQ3DfrK/LSR851gg5ANkDJEwAzEs="},"flags/1x1/mw-70a282f17250f7fb49f8fbeb357dc492b742dd2a9c58e13281f0e900a8c63e94.svg":{"logical_path":"flags/1x1/mw.svg","mtime":"2022-05-27T21:42:11+02:00","size":3797,"digest":"5baad15595dcd8c0822e2bb9581efd027ac23ce10efa4202f3b5f566819080a0","integrity":"sha256-W6rRVZXc2MCCLiu5WB79AnrCPOEO+kIC87X1ZoGQgKA="},"flags/4x3/mx-246482013102c12a6f83dcdfe0fa40c350560ae64505f9b4d3113ea5356e2f71.svg":{"logical_path":"flags/4x3/mx.svg","mtime":"2022-05-27T21:42:11+02:00","size":94979,"digest":"8258503043a0a3b6fc68ef1af0025ef0de85fa482fb77e8ba220c3cd6a7a86a7","integrity":"sha256-glhQMEOgo7b8aO8a8AJe8N6F+kgvt36LoiDDzWp6hqc="},"flags/1x1/mx-27887b671ab9de501b6693ab60380e809962ac12222ddb580c9426e79e1360e3.svg":{"logical_path":"flags/1x1/mx.svg","mtime":"2022-05-27T21:42:11+02:00","size":90505,"digest":"b67b689c0045cb4e8a4d5a439adbbf4c471cc090cbeb7ba7b2aed0eeabdbef3e","integrity":"sha256-tntonABFy06KTVpDmtu/TEccwJDL63unsq7Q7qvb7z4="},"flags/4x3/my-00a98291486af1c01c11fe46a203dd07bee31d6b5ffb5f60d04ad337a3499775.svg":{"logical_path":"flags/4x3/my.svg","mtime":"2022-05-27T21:42:11+02:00","size":1270,"digest":"c992340a8c8284fca33fbcbcb287ace68c355a0603c471d9b09a207ab4f7390c","integrity":"sha256-yZI0CoyChPyjP7y8soes5ow1WgYDxHHZsJogerT3OQw="},"flags/1x1/my-a60a1ae968ed1ebbb60626370bd0494112b562a358c1381e6bb162268a110d8f.svg":{"logical_path":"flags/1x1/my.svg","mtime":"2022-05-27T21:42:11+02:00","size":1262,"digest":"cb10a92508324c9de2641b74ca7a0c4872548dc874fbcbe9f75d6aa46ecd28bd","integrity":"sha256-yxCpJQgyTJ3iZBt0ynoMSHJUjch0+8vp911qpG7NKL0="},"flags/4x3/mz-8281fb68c18d27bf1588de7684e67f14aeabbf8e66117eb4e640faac9762dbb4.svg":{"logical_path":"flags/4x3/mz.svg","mtime":"2022-05-27T21:42:11+02:00","size":2622,"digest":"db6310ed68179491d7d9ad03d133cd8ace0fd75dd0624f3f9f1c856eb799fdb1","integrity":"sha256-22MQ7WgXlJHX2a0D0TPNis4P113QYk8/nxyFbreZ/bE="},"flags/1x1/mz-dc805944726edfe3a8900cecd82ef15037381b81b6fab0d96d2cf93ba0d7a3ec.svg":{"logical_path":"flags/1x1/mz.svg","mtime":"2022-05-27T21:42:11+02:00","size":2597,"digest":"cbc5741e7cb4a2212dc311772b55688c4e9e2d2f11d1e2c3c42dd4f2a1464473","integrity":"sha256-y8V0Hny0oiEtwxF3K1VojE6eLS8R0eLDxC3U8qFGRHM="},"flags/4x3/na-d798d2db5bccea439f545e5e6dfa5aad6a166966cb5e223f7f2aa4d4dc73abd7.svg":{"logical_path":"flags/4x3/na.svg","mtime":"2022-05-27T21:42:11+02:00","size":1005,"digest":"7c73485829c6aee5fb2e678707883ae99de6ddc50f4393025fdadedd78944213","integrity":"sha256-fHNIWCnGruX7LmeHB4g66Z3m3cUPQ5MCX9re3XiUQhM="},"flags/1x1/na-0fceb3e900c021df14c00cab058c84cd834cb2f494a1db2fa58728a7f9445762.svg":{"logical_path":"flags/1x1/na.svg","mtime":"2022-05-27T21:42:11+02:00","size":977,"digest":"37d8c89f1f7e5e2dd7a7e2211afd542a9565533995500e5686c791a6e9f51d20","integrity":"sha256-N9jInx9+Xi3Xp+IhGv1UKpVlUzmVUA5WhseRpun1HSA="},"flags/4x3/nc-2861e50f3a0a1b1c368d913df4f4092c65bb3faa2d01e4d084fa33ed041e537a.svg":{"logical_path":"flags/4x3/nc.svg","mtime":"2022-05-27T21:42:11+02:00","size":1380,"digest":"b0c095d359e58de45a984c4d3aa73c5442e76c2b8837ae491f53284de1a15475","integrity":"sha256-sMCV01nljeRamExNOqc8VELnbCuIN65JH1MoTeGhVHU="},"flags/1x1/nc-1d65d86f9caaec75cc886c8abca3cc39b8de23c48e67b55936be3649ae67d716.svg":{"logical_path":"flags/1x1/nc.svg","mtime":"2022-05-27T21:42:11+02:00","size":1387,"digest":"d7a07223b8b040a88ea6a11662b947add62e438a993721494df88951aa9df656","integrity":"sha256-16ByI7iwQKiOpqEWYrlHrdYuQ4qZNyFJTfiJUaqd9lY="},"flags/4x3/ne-90b12ff4abee66e42d27b6c55dd602af3cc249f3492c8a449ec84a35a74ee6ed.svg":{"logical_path":"flags/4x3/ne.svg","mtime":"2022-05-27T21:42:11+02:00","size":276,"digest":"54d7076def267766d8e49d822d6b9b774e82bfe0a91269b0951148f5a19e4900","integrity":"sha256-VNcHbe8md2bY5J2CLWubd06Cv+CpEmmwlRFI9aGeSQA="},"flags/1x1/ne-ecd9bd0f027c05147c336ef396ffce7c16cf011f051860ae082ea99be34554e0.svg":{"logical_path":"flags/1x1/ne.svg","mtime":"2022-05-27T21:42:11+02:00","size":282,"digest":"bee088c42b4ce13a5dc346424f354a53a78db7db8eaa064bf534b711532f19c3","integrity":"sha256-vuCIxCtM4Tpdw0ZCTzVKU6eNt9uOqgZL9TS3EVMvGcM="},"flags/4x3/nf-3323e2cb59cb8f9282e45155b6830e4c06876bc0c24ee28e5dd4dcff28d2dc70.svg":{"logical_path":"flags/4x3/nf.svg","mtime":"2022-05-27T21:42:11+02:00","size":5837,"digest":"f0e0b96f2586ad66b367fe6490b48df8aeea0c100bf5178cd1ffbc03571fe95c","integrity":"sha256-8OC5byWGrWazZ/5kkLSN+K7qDBAL9ReM0f+8A1cf6Vw="},"flags/1x1/nf-3da2a0db99d85998154510ac50674728e4768079a57443529b18b1ed87e5c077.svg":{"logical_path":"flags/1x1/nf.svg","mtime":"2022-05-27T21:42:11+02:00","size":5591,"digest":"4880d7db266b4219bf4878fa435f9021c02d86c7309d6571c5cc6a0eba81777d","integrity":"sha256-SIDX2yZrQhm/SHj6Q1+QIcAthscwnWVxxcxqDrqBd30="},"flags/4x3/ng-387e036e728aa4c36d93fad3c90e76e3beab727783ec11da7fbce30ff52c805e.svg":{"logical_path":"flags/4x3/ng.svg","mtime":"2022-05-27T21:42:11+02:00","size":260,"digest":"f1ca02b4d2034f53a5b768674883dab4b21852dc2ae39b2d02bc281384d95e33","integrity":"sha256-8coCtNIDT1Olt2hnSIPatLIYUtwq45stArwoE4TZXjM="},"flags/1x1/ng-c4c24f43d15d5690390ea6d5a4b41911aa7cf0807167d69e95748c4439211dcb.svg":{"logical_path":"flags/1x1/ng.svg","mtime":"2022-05-27T21:42:11+02:00","size":260,"digest":"8b34a12b4b7116eb6ecc79744e0b0244cacdea5ea200940522042fa12953097a","integrity":"sha256-izShK0txFutuzHl0TgsCRMrN6l6iAJQFIgQvoSlTCXo="},"flags/4x3/ni-b83cccf0a65d0abf0398b905936ca6b6d5b1b64db8a34223225e3e4eb4f0311d.svg":{"logical_path":"flags/4x3/ni.svg","mtime":"2022-05-27T21:42:11+02:00","size":18408,"digest":"a6c8d7f7a74b93a4c42589c951ce37ea3e073daf82f2418efa6a5ff1ec2d23fb","integrity":"sha256-psjX96dLk6TEJYnJUc436j4HPa+C8kGO+mpf8ewtI/s="},"flags/1x1/ni-35731438cffa30b56cc403c5e9a59e85e661566a0d72c5310865aaf282731e0f.svg":{"logical_path":"flags/1x1/ni.svg","mtime":"2022-05-27T21:42:11+02:00","size":18463,"digest":"a9ead4b075e183ce139f9c26256dd2a8d083d4d126d85f3848d8e9ac884ab504","integrity":"sha256-qerUsHXhg84Tn5wmJW3SqNCD1NEm2F84SNjprIhKtQQ="},"flags/4x3/nl-a71cd17ec0d083d39373108c1f5e994e71491e1f7ac34119e60c859142a2d34d.svg":{"logical_path":"flags/4x3/nl.svg","mtime":"2022-05-27T21:42:11+02:00","size":224,"digest":"a91174a3cccd5ec66da2cc68e0cbf86a3ea73d2976dc303c72109198b2504b51","integrity":"sha256-qRF0o8zNXsZtosxo4Mv4aj6nPSl23DA8chCRmLJQS1E="},"flags/1x1/nl-6bfba1aa0f31f33e126e51832eddba06a92106d569f3e01dc4989a3425f45eac.svg":{"logical_path":"flags/1x1/nl.svg","mtime":"2022-05-27T21:42:11+02:00","size":228,"digest":"426beba2bc0a7ae4079c8586509f6902dc9a6082f4a0ec7c71520572ac3f86c2","integrity":"sha256-QmvrorwKeuQHnIWGUJ9pAtyaYIL0oOx8cVIFcqw/hsI="},"flags/4x3/no-d4ae9765d2dd03faef1007008bf1ccde064e36c765faef79a270e7e8fa97c23a.svg":{"logical_path":"flags/4x3/no.svg","mtime":"2022-05-27T21:42:11+02:00","size":321,"digest":"c59f156ddd70507f05267dc35e2e4f3e44467b9ef414995abb91589dc486dd6a","integrity":"sha256-xZ8Vbd1wUH8FJn3DXi5PPkRGe570FJlau5FYncSG3Wo="},"flags/1x1/no-7b3a522b5101f7bcc5c9ac05adbfbfa3dacde4fc4420d2997b1ab38af7e50dbc.svg":{"logical_path":"flags/1x1/no.svg","mtime":"2022-05-27T21:42:11+02:00","size":321,"digest":"567df11f5e12f95a4c707234127ad878db61c286cfdd034dbcab8c4222c4af25","integrity":"sha256-Vn3xH14S+VpMcHI0EnrYeNthwobP3QNNvKuMQiLEryU="},"flags/4x3/np-043dff0f7f1cd254f2c2d82367557e5f4a15579af81242e2979523700adaeaf1.svg":{"logical_path":"flags/4x3/np.svg","mtime":"2022-05-27T21:42:11+02:00","size":1061,"digest":"ddc042ba58c0842e4a1dd8ac56701dd8e22659cb04e3905d3866810d6333aaf0","integrity":"sha256-3cBCuljAhC5KHdisVnAd2OImWcsE45BdOGaBDWMzqvA="},"flags/1x1/np-976aa23f62798e1c0974a78649ff295334fc0d39f63eb19e990d2a13efe9fbe2.svg":{"logical_path":"flags/1x1/np.svg","mtime":"2022-05-27T21:42:11+02:00","size":1193,"digest":"d81adac491e4e7cef7e94ab6e94f00564b319f9a383b85e0dd753aebc1cfeea2","integrity":"sha256-2BraxJHk58736Uq26U8AVksxn5o4O4Xg3XU668HP7qI="},"flags/4x3/nr-f977239dc4f2dbb4185bcb741dc0aae4b46dd2d647444150f317e8dfb3062fd3.svg":{"logical_path":"flags/4x3/nr.svg","mtime":"2022-05-27T21:42:11+02:00","size":651,"digest":"2f19fb532598a59536ccf4bb6f4446c08eb1b9ed5ebe0ff1f00bc6fc8c36e792","integrity":"sha256-Lxn7UyWYpZU2zPS7b0RGwI6xue1evg/x8AvG/Iw255I="},"flags/1x1/nr-1899ab289aa424dfa1bb1a787a5dae3d9081b212433441fe9a7c95c1c377fc01.svg":{"logical_path":"flags/1x1/nr.svg","mtime":"2022-05-27T21:42:11+02:00","size":668,"digest":"6e66f80525a6b92920b1acd01c9bcc214b1a2f05393d65af6428567e7de0cc6c","integrity":"sha256-bmb4BSWmuSkgsazQHJvMIUsaLwU5PWWvZChWfn3gzGw="},"flags/4x3/nu-84b56f2711a6b958b9072dff3912f225c034d246341cc29c4eba6c34c70fe6f0.svg":{"logical_path":"flags/4x3/nu.svg","mtime":"2022-05-27T21:42:11+02:00","size":1745,"digest":"55390cc014e85eb56b9d08004470900d13d95ed83ddb5006bf4e0e1cf519028c","integrity":"sha256-VTkMwBToXrVrnQgARHCQDRPZXtg921AGv04OHPUZAow="},"flags/1x1/nu-60cdb57b27737dddc21980f6630e7476471ce8c1bc34b3a2632819bef23a26a5.svg":{"logical_path":"flags/1x1/nu.svg","mtime":"2022-05-27T21:42:11+02:00","size":1727,"digest":"1bfa55a93eca4ffd981f98935d6c2cab58a29be4f0d2f15a50148d695ab50f3f","integrity":"sha256-G/pVqT7KT/2YH5iTXWwsq1iim+Tw0vFaUBSNaVq1Dz8="},"flags/4x3/nz-9cca5c871f70cdd784a33836d5a07ada7f6eaa720811c70dc2306a2a5056648d.svg":{"logical_path":"flags/4x3/nz.svg","mtime":"2022-05-27T21:42:11+02:00","size":2989,"digest":"b7f4f0961f007b0cc355df85903b0af0cfd6b655e23aa56aa547dc5ed693ae7f","integrity":"sha256-t/Twlh8AewzDVd+FkDsK8M/WtlXiOqVqpUfcXtaTrn8="},"flags/1x1/nz-e5c8b6660d172e25e80f1d9530fb3e8b05fba1c4c02b95679fbcd5a0c50169f9.svg":{"logical_path":"flags/1x1/nz.svg","mtime":"2022-05-27T21:42:11+02:00","size":2999,"digest":"b93a77fe262ed1d5fbd196f2224c0fa2b3dd6d1e84c0027c5a122643fdad8d23","integrity":"sha256-uTp3/iYu0dX70ZbyIkwPorPdbR6EwAJ8WhImQ/2tjSM="},"flags/4x3/om-fbef9222761223ced04e2946ec71432c761618ad58b8a3a5af5627a1d75b48e9.svg":{"logical_path":"flags/4x3/om.svg","mtime":"2022-05-27T21:42:11+02:00","size":22636,"digest":"d66047c0f554b25250566bdbdf7d4ac03c0f708f03cd4c4159c57f16fa056967","integrity":"sha256-1mBHwPVUslJQVmvb331KwDwPcI8DzUxBWcV/FvoFaWc="},"flags/1x1/om-07148a6924f8ce843e33be4f3d9d5dd40040da366e667925985e7b247073d08e.svg":{"logical_path":"flags/1x1/om.svg","mtime":"2022-05-27T21:42:11+02:00","size":22614,"digest":"20669c3a4f181d035b5acd82a12d7354b3c5decb53383ea6b7a53d02b7138fe9","integrity":"sha256-IGacOk8YHQNbWs2CoS1zVLPF3stTOD6mt6U9ArcTj+k="},"flags/4x3/pa-50535df4995256b70ce0a7971ba95922046d445c06a567fd951d7f5a79cbe547.svg":{"logical_path":"flags/4x3/pa.svg","mtime":"2022-05-27T21:42:11+02:00","size":749,"digest":"0bd4b6709d9ca822851f2d7c57ef9fb3c098ceeea5d239bbf8f3196b062d1d11","integrity":"sha256-C9S2cJ2cqCKFHy18V++fs8CYzu6l0jm7+PMZawYtHRE="},"flags/1x1/pa-e4d955c65827104b4f898beb392af5ffed5f62a09035f42801512b5b3d7767d1.svg":{"logical_path":"flags/1x1/pa.svg","mtime":"2022-05-27T21:42:11+02:00","size":659,"digest":"6e0e27190b3c3806b6cae82d0e3708c05e02bc82479e252f4486a0eee43a58d7","integrity":"sha256-bg4nGQs8OAa2yugtDjcIwF4CvIJHniUvRIag7uQ6WNc="},"flags/4x3/pe-b518a86545125ff3c3fde029c2992233df876b663d8ec723bd4d67f90f72cb62.svg":{"logical_path":"flags/4x3/pe.svg","mtime":"2022-05-27T21:42:11+02:00","size":73609,"digest":"3fddfd9a5405daa75ae35d717219be04940fbd956b583fa9a75d0c54ec5d6da5","integrity":"sha256-P939mlQF2qda411xchm+BJQPvZVrWD+pp10MVOxdbaU="},"flags/1x1/pe-8e395c37a87d3ea212ceaf0768869f2ae38ad507761ef6b10b2077f01274d6b0.svg":{"logical_path":"flags/1x1/pe.svg","mtime":"2022-05-27T21:42:11+02:00","size":72907,"digest":"e0468f05eddaea5fb78d8d86440a580cd9cf5f27baa3e2ac4f229b4423abd7f9","integrity":"sha256-4EaPBe3a6l+3jY2GRApYDNnPXye6o+KsTyKbRCOr1/k="},"flags/4x3/pf-d1537625ade03a7fae7a5bdcfc5fe9f6449977613a38ddd258c8572f3630185b.svg":{"logical_path":"flags/4x3/pf.svg","mtime":"2022-05-27T21:42:11+02:00","size":4290,"digest":"de72e06f1af9d5d3f44995e41ec69b3669da1d59a40b4d99b03164617ab326b1","integrity":"sha256-3nLgbxr51dP0SZXkHsabNmnaHVmkC02ZsDFkYXqzJrE="},"flags/1x1/pf-c78c72a0ad139c9da31592af7c443cfef4e1e1baf208e44088ca667298324c9e.svg":{"logical_path":"flags/1x1/pf.svg","mtime":"2022-05-27T21:42:11+02:00","size":4229,"digest":"d68e024f9a826b0790679bf50cf2f004f5063aacbf99948a0aeb792c97e20c88","integrity":"sha256-1o4CT5qCaweQZ5v1DPLwBPUGOqy/mZSKCut5LJfiDIg="},"flags/4x3/pg-3190ab67d73878026d59e98e14b0cf98812c5c086d35956383c9986f7e0433a3.svg":{"logical_path":"flags/4x3/pg.svg","mtime":"2022-05-27T21:42:11+02:00","size":1661,"digest":"10ae837d9c7828178cc70a3489b719ab88a3c3dfbd58bfcf7c0ce26908efc809","integrity":"sha256-EK6DfZx4KBeMxwo0ibcZq4ijw9+9WL/PfAziaQjvyAk="},"flags/1x1/pg-fe2bbe3c6599a4bf895b9f748d5a15650a7d29c854252e3b074c780a77cd51b9.svg":{"logical_path":"flags/1x1/pg.svg","mtime":"2022-05-27T21:42:11+02:00","size":2095,"digest":"40cd64620f6af0b94340fa7c71de0e2ef541e6072d886e666ddf6acd2f5aecdb","integrity":"sha256-QM1kYg9q8LlDQPp8cd4OLvVB5gctiG5mbd9qzS9a7Ns="},"flags/4x3/ph-ec483bd752a5a0d1f063397a2c206bdd9b23451d2c262eceba6411b2769ed3b1.svg":{"logical_path":"flags/4x3/ph.svg","mtime":"2022-05-27T21:42:11+02:00","size":1565,"digest":"fd167a43304972aa43f76a0ec3f03dc89dde4f96adc654a7e0e2e1257aa9a7e5","integrity":"sha256-/RZ6QzBJcqpD92oOw/A9yJ3eT5atxlSn4OLhJXqpp+U="},"flags/1x1/ph-0d61f012185140030d9879f180b8279ab7798a9d7d062e141937ba83b51ab20e.svg":{"logical_path":"flags/1x1/ph.svg","mtime":"2022-05-27T21:42:11+02:00","size":1510,"digest":"2f9dd37f9762ce80f198b8cb9b4acab9e19c482d7cbb927f7866b1920133af3c","integrity":"sha256-L53Tf5dizoDxmLjLm0rKueGcSC18u5J/eGaxkgEzrzw="},"flags/4x3/pk-776714f751e4347341656ce5e88c6fa13316e2e36205cd8d09c73779794c2a56.svg":{"logical_path":"flags/4x3/pk.svg","mtime":"2022-05-27T21:42:11+02:00","size":739,"digest":"0c5ada4d149d7ff18ea90733cf9bfa8754981730138c20ec97b864d97fe34ef9","integrity":"sha256-DFraTRSdf/GOqQczz5v6h1SYFzATjCDsl7hk2X/jTvk="},"flags/1x1/pk-50284d5da424696f41ac4861f8eff6e5bc23a6e1812df7b444967c6e58ec6f81.svg":{"logical_path":"flags/1x1/pk.svg","mtime":"2022-05-27T21:42:11+02:00","size":684,"digest":"637994c86e94944be181dba8727a3b136191f72ebe53f043f0b7297fcced5903","integrity":"sha256-Y3mUyG6UlEvhgduocno7E2GR9y6+U/BD8Lcpf8ztWQM="},"flags/4x3/pl-9bb56d1ec91d8c843ec53b018dc861772e466bad1582a9ba42148524347adf6d.svg":{"logical_path":"flags/4x3/pl.svg","mtime":"2022-05-27T21:42:11+02:00","size":222,"digest":"bd8c588ce4c71594e5f3789b700c935e3c97e5c06e62ddb595752c805e90d851","integrity":"sha256-vYxYjOTHFZTl83ibcAyTXjyX5cBuYt21lXUsgF6Q2FE="},"flags/1x1/pl-acc73e013a67a13fde68d812b22889be9150cce57d029deab6ba5b0ba4e7b69a.svg":{"logical_path":"flags/1x1/pl.svg","mtime":"2022-05-27T21:42:11+02:00","size":222,"digest":"d7c4aadb69ef13492016a7b2995020f9d754d128f9354dd742c32d420c3340ad","integrity":"sha256-18Sq22nvE0kgFqeymVAg+ddU0Sj5NU3XQsMtQgwzQK0="},"flags/4x3/pm-5d990f5bc74366f734851ceb35046baaae3555ccff57e6cf95c7143f9b245532.svg":{"logical_path":"flags/4x3/pm.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"e1e1de44f61b53fb70041acec8426e6505526c9a29317a4fc1dbc206f0f261e6","integrity":"sha256-4eHeRPYbU/twBBrOyEJuZQVSbJopMXpPwdvCBvDyYeY="},"flags/1x1/pm-781f551a82a88b0a5e238b078310bc843950c844092d8ce1e52587feca285606.svg":{"logical_path":"flags/1x1/pm.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"4e3a65b4577055027d41ebf6441200b8e1f360a1677e2032f262b58805689641","integrity":"sha256-TjpltFdwVQJ9Qev2RBIAuOHzYKFnfiAy8mK1iAVolkE="},"flags/4x3/pn-1e347803c27d86312324a6a6712dee0bf5590971f027fffe082681dccce6c4c1.svg":{"logical_path":"flags/4x3/pn.svg","mtime":"2022-05-27T21:42:11+02:00","size":10878,"digest":"d05afc2826bdaa9121a17e9ff42d35ec4a72668a4efe0b65acd6e6de23f8268c","integrity":"sha256-0Fr8KCa9qpEhoX6f9C017EpyZopO/gtlrNbm3iP4Jow="},"flags/1x1/pn-b9762ab4fd752edc4506fd05f2810094e8de8b3cf6fffd00bafb89b6ed95359c.svg":{"logical_path":"flags/1x1/pn.svg","mtime":"2022-05-27T21:42:11+02:00","size":8517,"digest":"c2f3565f6e8282d44babe06fd25605c002f5abb3edafa843762a9ed6de06464b","integrity":"sha256-wvNWX26CgtRLq+Bv0lYFwAL1q7Ptr6hDdiqe1t4GRks="},"flags/4x3/pr-4c0359aa4277d04c3c3af8ff89d0bbea462b480334cd6974beb6c5739c42903a.svg":{"logical_path":"flags/4x3/pr.svg","mtime":"2022-05-27T21:42:11+02:00","size":637,"digest":"f87e928ea7a84ebc9c7d6e8ee6e43e9f93014adebc4604f01fe36db29e635ed8","integrity":"sha256-+H6SjqeoTrycfW6O5uQ+n5MBSt68RgTwH+Ntsp5jXtg="},"flags/1x1/pr-dc838368c71fe79aea88491ec3e419ff01c26a5af460b05a79cb6cc6fa02b6b2.svg":{"logical_path":"flags/1x1/pr.svg","mtime":"2022-05-27T21:42:11+02:00","size":619,"digest":"7a94e53dbfc93808d194a05e79f780aef0d2b231e830e4fb4b931cdde7d6da26","integrity":"sha256-epTlPb/JOAjRlKBeefeArvDSsjHoMOT7S5Mc3efW2iY="},"flags/4x3/ps-39b00800524af9e8d270c479274be2dd5459c13d67a6f308139a69adbae4997f.svg":{"logical_path":"flags/4x3/ps.svg","mtime":"2022-05-27T21:42:11+02:00","size":561,"digest":"84421fd66f9058e424da190fc8b3f6a0d35e7bb918aa6fffacd00a1a2c1b2d71","integrity":"sha256-hEIf1m+QWOQk2hkPyLP2oNNee7kYqm//rNAKGiwbLXE="},"flags/1x1/ps-9102a922196261028bd07e60d1b2ef435e123aae8bba6d49a5918123f8be18f6.svg":{"logical_path":"flags/1x1/ps.svg","mtime":"2022-05-27T21:42:11+02:00","size":541,"digest":"31a06ee8dc4500f9665b4e3654489abc6a77851c7a43c245809bc874ac6f77e9","integrity":"sha256-MaBu6NxFAPlmW042VEiavGp3hRx6Q8JFgJvIdKxvd+k="},"flags/4x3/pt-f76294ca6203778375158111051358fb535eaebb06d50951eb5326f9ede31536.svg":{"logical_path":"flags/4x3/pt.svg","mtime":"2022-05-27T21:42:11+02:00","size":8280,"digest":"62137f64b8b37b24510095926415b3120029f0d57e97817209e895f9c50b26dd","integrity":"sha256-YhN/ZLizeyRRAJWSZBWzEgAp8NV+l4FyCeiV+cULJt0="},"flags/1x1/pt-09b4548e5764d2a6c56bf9c33e8652911f91b16ab6bfa3041630506480281047.svg":{"logical_path":"flags/1x1/pt.svg","mtime":"2022-05-27T21:42:11+02:00","size":8661,"digest":"2fc8fb378410d636377385d6d007f20a41d6493fdae51a35cab5eaa5da3328fa","integrity":"sha256-L8j7N4QQ1jY3c4XW0AfyCkHWST/a5Ro1yrXqpdozKPo="},"flags/4x3/pw-029fb7bb87eec12c79cbe662fe3614698c7638186958fb6032e59a17705777cb.svg":{"logical_path":"flags/4x3/pw.svg","mtime":"2022-05-27T21:42:11+02:00","size":467,"digest":"c59cfacb984b59244f48132977b96327c880f391431a2610ec4617d1f73ee3a7","integrity":"sha256-xZz6y5hLWSRPSBMpd7ljJ8iA85FDGiYQ7EYX0fc+46c="},"flags/1x1/pw-39f82e7a0e390333a2d0f4a1396a8f710af7ec3002c5542d7d6c76d634a67e82.svg":{"logical_path":"flags/1x1/pw.svg","mtime":"2022-05-27T21:42:11+02:00","size":507,"digest":"21a677b7fa3f33a6304926ac4b0d516f2710d9d576cefb46674e3f9c2a444956","integrity":"sha256-IaZ3t/o/M6YwSSasSw1RbycQ2dV2zvtGZ04/nCpESVY="},"flags/4x3/py-6f18a4e716e9fbe7d0caf99651fee56e44ffd2a13ce77f50a8374a7fe6b0879d.svg":{"logical_path":"flags/4x3/py.svg","mtime":"2022-05-27T21:42:11+02:00","size":17097,"digest":"22570d444732336f9af31307c5b4c5809d8c028319b81c24966d0b48e441f08c","integrity":"sha256-IlcNREcyM2+a8xMHxbTFgJ2MAoMZuBwklm0LSORB8Iw="},"flags/1x1/py-0325fb333b5ea2adb996345bf2bf5df0c460c87ca97cb3c8f6e65a7f33aa1722.svg":{"logical_path":"flags/1x1/py.svg","mtime":"2022-05-27T21:42:11+02:00","size":17246,"digest":"da5901ec6f8fa93f84e42140bd923592b84084a648569d76b476e7512e3620da","integrity":"sha256-2lkB7G+PqT+E5CFAvZI1krhAhKZIVp12tHbnUS42INo="},"flags/4x3/qa-55eb7d6716998d68fe6e3345807dc410e5c5e8511bb2c78f0d08d51da707a131.svg":{"logical_path":"flags/4x3/qa.svg","mtime":"2022-05-27T21:42:11+02:00","size":359,"digest":"a5e58fc790b76e90b945a68bb4f15223254201bf006040d953092dee5ca8da31","integrity":"sha256-peWPx5C3bpC5RaaLtPFSIyVCAb8AYEDZUwkt7lyo2jE="},"flags/1x1/qa-cfff93f4c31946f7646a855521a7db667c78cb89a7c2ac339c64c14f06be0f7a.svg":{"logical_path":"flags/1x1/qa.svg","mtime":"2022-05-27T21:42:11+02:00","size":356,"digest":"ffa8cd4edd7ac169127363f8f0476ffe11279367334f1fa910320541a1a94505","integrity":"sha256-/6jNTt16wWkSc2P48Edv/hEnk2czTx+pEDIFQaGpRQU="},"flags/4x3/re-8b3124b78a7752ee288a401ae16c3cf5dafc1296e443ba941de8b338b16c2723.svg":{"logical_path":"flags/4x3/re.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"5183af67c4fa08369e9251a2a102a4ed578c24bb59092dd92f3a572d90223434","integrity":"sha256-UYOvZ8T6CDaeklGioQKk7VeMJLtZCS3ZLzpXLZAiNDQ="},"flags/1x1/re-c7173d64ef4a62237f83c7af8cb144fba8c38bd7ac8e7125eda78320931215ca.svg":{"logical_path":"flags/1x1/re.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"37be9dc3645dac4c1463068f9001cff31288ef527c2fca0d6432022858070084","integrity":"sha256-N76dw2RdrEwUYwaPkAHP8xKI71J8L8oNZDICKFgHAIQ="},"flags/4x3/ro-a10768f5227b028969ceb2bce6e3fc2ecbea0c5e40d1946c47d913d2745a8b21.svg":{"logical_path":"flags/4x3/ro.svg","mtime":"2022-05-27T21:42:11+02:00","size":305,"digest":"854593a65b29383274aabe385c4ff58794a2b5d4b89c5414a0ff11f96d016f1e","integrity":"sha256-hUWTplspODJ0qr44XE/1h5SitdS4nFQUoP8R+W0Bbx4="},"flags/1x1/ro-a4cfc4bce72dc7b034f2b84e932ba3d47f7a9404b94b1450af48263c576b62c8.svg":{"logical_path":"flags/1x1/ro.svg","mtime":"2022-05-27T21:42:11+02:00","size":305,"digest":"da9e0ce1ebd0f466ff68500173fe067212d304b8f4594f54bd61bd3e5409c7a9","integrity":"sha256-2p4M4evQ9Gb/aFABc/4GchLTBLj0WU9UvWG9PlQJx6k="},"flags/4x3/rs-9792f9ae9694c0dfa1a213ec6ceb29d7b41819a508bedc4bf89dc4c285e48712.svg":{"logical_path":"flags/4x3/rs.svg","mtime":"2022-05-27T21:42:11+02:00","size":187134,"digest":"cbb54d608b15e2bd4d422b8d83f061115c2087d070969b2e9f6112647569ce3a","integrity":"sha256-y7VNYIsV4r1NQiuNg/BhEVwgh9Bwlpsun2ESZHVpzjo="},"flags/1x1/rs-cd44c0b89c5e2c2d0afe1902a263d60648dd18e97636256eb1ffc3148e336cd7.svg":{"logical_path":"flags/1x1/rs.svg","mtime":"2022-05-27T21:42:11+02:00","size":186989,"digest":"04c759a5129437dcc03dffb362199c84fc773a185726dc2ed09f9cfd41370fdb","integrity":"sha256-BMdZpRKUN9zAPf+zYhmchPx3OhhXJtwu0J+c/UE3D9s="},"flags/4x3/ru-ce34e72a9d955c6c6860a5e552cd3902d236bbff5a714a49a1b8f8dbbce3c410.svg":{"logical_path":"flags/4x3/ru.svg","mtime":"2022-05-27T21:42:11+02:00","size":286,"digest":"5b51b57f63cf58e451abddeaee39a8c7b133cb3d58c6ef1a903883bda7c346b0","integrity":"sha256-W1G1f2PPWORRq93q7jmox7Ezyz1Yxu8akDiDvafDRrA="},"flags/1x1/ru-aa0d5e4855f92f211efad3979493956dfe01ad4a0b552814cad05fa67694de03.svg":{"logical_path":"flags/1x1/ru.svg","mtime":"2022-05-27T21:42:11+02:00","size":290,"digest":"bb2782a916b1a28eb081895afa90f4ed5dca5df320b9cc95f867bc2a26e29064","integrity":"sha256-uyeCqRaxoo6wgYla+pD07V3KXfMgucyV+Ge8KibikGQ="},"flags/4x3/rw-0f08a5e527db8287642f1aafeb397fd49ac3add8e86dbb0d9a8be7d2c43b0153.svg":{"logical_path":"flags/4x3/rw.svg","mtime":"2022-05-27T21:42:11+02:00","size":747,"digest":"aeb9bc73cd3fe25e7c1a1a7bdddc11eb3d71a3273919dd2f4247873db78fbe75","integrity":"sha256-rrm8c80/4l58Ghp73dwR6z1xoyc5Gd0vQkeHPbePvnU="},"flags/1x1/rw-297915f2fa836eba2dc1d795a4f5b1c51f8d9abdc6704b13e63cd81c81476f09.svg":{"logical_path":"flags/1x1/rw.svg","mtime":"2022-05-27T21:42:11+02:00","size":748,"digest":"8c27cde746de68484394ef6dc519583cf67e380ca5e8d48cf37fa4d99fef57ed","integrity":"sha256-jCfN50beaEhDlO9txRlYPPZ+OAyl6NSM83+k2Z/vV+0="},"flags/4x3/sa-70281c72fb6008faf5d36c401593c7c8f0c8870332e23fa3b1b53cd0f88e9ad5.svg":{"logical_path":"flags/4x3/sa.svg","mtime":"2022-05-27T21:42:11+02:00","size":10238,"digest":"d54e76d7ad9da5242aa26d5dbec120b8a4530c097ae45d0b22e539f2d9c6ad8b","integrity":"sha256-1U52162dpSQqom1dvsEguKRTDAl65F0LIuU58tnGrYs="},"flags/1x1/sa-463ab66153968c569b854793714e414ea77185758a8236364019d4e7e40582fc.svg":{"logical_path":"flags/1x1/sa.svg","mtime":"2022-05-27T21:42:11+02:00","size":10179,"digest":"639ee1c158b0b61e8789bde27ae64edb246afe63cb8999e3468ca88c344927be","integrity":"sha256-Y57hwViwth6Hib3ieuZO2yRq/mPLiZnjRoyojDRJJ74="},"flags/4x3/sb-5de262c7e2fda747ea4ac98c2ca9ce045f07de995330b1fc3bbbf39e25ae42f6.svg":{"logical_path":"flags/4x3/sb.svg","mtime":"2022-05-27T21:42:11+02:00","size":953,"digest":"651213df067f16dbdba2288928434afdd54f192b50bf15d06206ade966d54bac","integrity":"sha256-ZRIT3wZ/FtvboiiJKENK/dVPGStQvxXQYgat6WbVS6w="},"flags/1x1/sb-638ead7b9c9a42fe2318daf753a8f0ce9cea4792114d8d7475d5a5abcf697cb6.svg":{"logical_path":"flags/1x1/sb.svg","mtime":"2022-05-27T21:42:11+02:00","size":952,"digest":"19048c26004da6fe2a1dd5f3f695066b24f3096d1527edbdaac03c2817046fe3","integrity":"sha256-GQSMJgBNpv4qHdXz9pUGayTzCW0VJ+29qsA8KBcEb+M="},"flags/4x3/sc-46736983ebac2719d3e3aca36e3dbb896f612db71b72e9e5d6f3da36ae59c0ac.svg":{"logical_path":"flags/4x3/sc.svg","mtime":"2022-05-27T21:42:11+02:00","size":571,"digest":"2ed9272d5fd2fa92d29289f49f58f5f64f66977165fa1a80f9eb6aa57335517e","integrity":"sha256-LtknLV/S+pLSkon0n1j19k9ml3Fl+hqA+etqpXM1UX4="},"flags/1x1/sc-1dc9321cdeeecad7c6485b2bc3aef87a1a1ca116c18908286b5f79bdb5ee8313.svg":{"logical_path":"flags/1x1/sc.svg","mtime":"2022-05-27T21:42:11+02:00","size":570,"digest":"90424aafda9a2aa7d98030c0aa7bc604c77c1b0f7c5e6a094dffd2b803a88c71","integrity":"sha256-kEJKr9qaKqfZgDDAqnvGBMd8Gw98XmoJTf/SuAOojHE="},"flags/4x3/sd-3b49e891fcda945b02ee18ce8cee078f251d8e822201ba0f8953eb3efb0b2860.svg":{"logical_path":"flags/4x3/sd.svg","mtime":"2022-05-27T21:42:11+02:00","size":497,"digest":"b8b9d97103e668a2b043311b6453c2df25d5c3adcf62481e4c79a627c6784f4d","integrity":"sha256-uLnZcQPmaKKwQzEbZFPC3yXVw63PYkgeTHmmJ8Z4T00="},"flags/1x1/sd-993e4821f73f36e6dd12332ed727047a97c7d31b1c8f0b3312e924c5f437eb34.svg":{"logical_path":"flags/1x1/sd.svg","mtime":"2022-05-27T21:42:11+02:00","size":493,"digest":"da52cd7a173ecc0bc7e9a7c7ed4a20558a7f4cb5b6cd308790b7552a70421abc","integrity":"sha256-2lLNehc+zAvH6afH7UogVYp/TLW2zTCHkLdVKnBCGrw="},"flags/4x3/se-8e13876ab89aedc66156f36f55fefe66068c43657a803ba6b98843c171fb06c7.svg":{"logical_path":"flags/4x3/se.svg","mtime":"2022-05-27T21:42:11+02:00","size":691,"digest":"7b5be8932db6e5153d1f11ddba2d36cb4a33ddd7100e5c59cef3a2502215b062","integrity":"sha256-e1voky225RU9HxHdui02y0oz3dcQDlxZzvOiUCIVsGI="},"flags/1x1/se-8af88180b9c1ca0b24dbf5e04039a523c6f0ce975094c7fb6b38a4901b2e5c5d.svg":{"logical_path":"flags/1x1/se.svg","mtime":"2022-05-27T21:42:11+02:00","size":698,"digest":"9b0845f8163d147e4fce6e814709d5813e53f00f8f5ccb40cfa4cb9e37388837","integrity":"sha256-mwhF+BY9FH5Pzm6BRwnVgT5T8A+PXMtAz6TLnjc4iDc="},"flags/4x3/sg-da88143d134efe0c37b67471ceb24a9ced62ae9ade25530232c92435e6f46b65.svg":{"logical_path":"flags/4x3/sg.svg","mtime":"2022-05-27T21:42:11+02:00","size":887,"digest":"fa164984f038fa81540d519c5d08123ed55f31bb8aa73798af7698c69dca2226","integrity":"sha256-+hZJhPA4+oFUDVGcXQgSPtVfMbuKpzeYr3aYxp3KIiY="},"flags/1x1/sg-80e8f95951096bba14b6d6ebea036b0717617668d96f32b5a8172a06be1feb22.svg":{"logical_path":"flags/1x1/sg.svg","mtime":"2022-05-27T21:42:11+02:00","size":948,"digest":"f6f8ecdd6f0099c072886716d98098d08de334f6f307398e9922f4df40ef7b2a","integrity":"sha256-9vjs3W8AmcByiGcW2YCY0I3jNPbzBzmOmSL030Dveyo="},"flags/4x3/sh-3b36e972618f594e95974a9c551d3ba9ead3e9b175d8dac0bc30fd1910f82561.svg":{"logical_path":"flags/4x3/sh.svg","mtime":"2022-05-27T21:42:11+02:00","size":29501,"digest":"e7b5e4dc5360fd9ec2e0dd50074e82a53566a61ab88a36b6b5cc80451a2d9279","integrity":"sha256-57Xk3FNg/Z7C4N1QB06CpTVmphq4ija2tcyARRotknk="},"flags/1x1/sh-f25afcdb45a6c2d58e3984d40188a03342271f2f6312b868236b2a1c02a2e60e.svg":{"logical_path":"flags/1x1/sh.svg","mtime":"2022-05-27T21:42:11+02:00","size":30113,"digest":"c3a061079dd7f5ea785a4b4a4903ec4cefc4a26cd73371c0bfa3a0b231593947","integrity":"sha256-w6BhB53X9ep4WktKSQPsTO/EomzXM3HAv6OgsjFZOUc="},"flags/4x3/si-a9715a0c1db87762010c25b6d3bb90f73de3c893aa3bbc7412d57dfa14f28dd5.svg":{"logical_path":"flags/4x3/si.svg","mtime":"2022-05-27T21:42:11+02:00","size":2053,"digest":"25487f7aa91f115d558f031ffaf0d399924b032100d24d467c3bd1cb026d9001","integrity":"sha256-JUh/eqkfEV1VjwMf+vDTmZJLAyEA0k1GfDvRywJtkAE="},"flags/1x1/si-daa3e030c059585d235a78f228c89a32bc50df223da8efa32f85a13978524365.svg":{"logical_path":"flags/1x1/si.svg","mtime":"2022-05-27T21:42:11+02:00","size":2065,"digest":"53973e8d5c2086570023dbffbdef1a8a181cd49b33da4fde01de7a57b8346c57","integrity":"sha256-U5c+jVwghlcAI9v/ve8aihgc1Jsz2k/eAd56V7g0bFc="},"flags/4x3/sj-a2fa34115702482c2af9c7632eaeec77a26a1de129ce825bc38e27b6523e19ba.svg":{"logical_path":"flags/4x3/sj.svg","mtime":"2022-05-27T21:42:11+02:00","size":321,"digest":"e64bad4f257ee1219640dce3608270b8a4c7ebfc37f91ac9e4fa5957ea0814f5","integrity":"sha256-5kutTyV+4SGWQNzjYIJwuKTH6/w3+RrJ5PpZV+oIFPU="},"flags/1x1/sj-55f27b8e6aa75b9db244543edd19b891f3c07d59106cf08ff5c47781c480d272.svg":{"logical_path":"flags/1x1/sj.svg","mtime":"2022-05-27T21:42:11+02:00","size":321,"digest":"d764d5de8ca4a67ea323376c7c4dc48a3ec51bb043556ee07dca9e4989ba147f","integrity":"sha256-12TV3oykpn6jIzdsfE3Eij7FG7BDVW7gfcqeSYm6FH8="},"flags/4x3/sk-b285dd82884088b14db516eac76a39b29752279ac9f0f3e7c84b624edea66aa8.svg":{"logical_path":"flags/4x3/sk.svg","mtime":"2022-05-27T21:42:11+02:00","size":1202,"digest":"4ca76c921fae3345c47f1f540cdaf3716a7807ffcba532caea50090c8bbecac2","integrity":"sha256-TKdskh+uM0XEfx9UDNrzcWp4B//LpTLK6lAJDIu+ysI="},"flags/1x1/sk-cf28c14c8d736a45cbb0a31c0743373b6414974d561729d322cb7204e6a2f25b.svg":{"logical_path":"flags/1x1/sk.svg","mtime":"2022-05-27T21:42:11+02:00","size":1173,"digest":"48d976a953d0778fced47cc5d25890f3dd7befc28a85d9bddfae6b50fa98c84b","integrity":"sha256-SNl2qVPQd4/O1HzF0liQ891778KKhdm9365rUPqYyEs="},"flags/4x3/sl-571df59f51a68477e49c8bbbe397e505d30d27ed1611b37485c94198b6401a9a.svg":{"logical_path":"flags/4x3/sl.svg","mtime":"2022-05-27T21:42:11+02:00","size":275,"digest":"d8106777ab26efc28f786a1345bd411a4a0a10da738b691e3f4deea96d3c3c3a","integrity":"sha256-2BBnd6sm78KPeGoTRb1BGkoKENpzi2keP03uqW08PDo="},"flags/1x1/sl-038ea846f3362ef266345b5a7f9f0c7e94334edf697c24c5faeda27bc0396927.svg":{"logical_path":"flags/1x1/sl.svg","mtime":"2022-05-27T21:42:11+02:00","size":438,"digest":"9b4b8d18e4921e812d1fc34279d9871d7b6d5a72feb8e451b4b4aed33890bee6","integrity":"sha256-m0uNGOSSHoEtH8NCedmHHXttWnL+uORRtLSu0ziQvuY="},"flags/4x3/sm-a15cef2d34582deb77e611ac2df3580749a7faafa1bc7c5c661c906ccbdad64d.svg":{"logical_path":"flags/4x3/sm.svg","mtime":"2022-05-27T21:42:11+02:00","size":15801,"digest":"d8ebb10444ef5bef482c0b886a617d832a62629887061d916f6e3af7ee49c01c","integrity":"sha256-2OuxBETvW+9ILAuIamF9gypiYpiHBh2Rb2469+5JwBw="},"flags/1x1/sm-b9bb79651c85755c984570a106213c32d87c7fbe5737b9b6a6e5512a05d98429.svg":{"logical_path":"flags/1x1/sm.svg","mtime":"2022-05-27T21:42:11+02:00","size":15729,"digest":"2cc3fc6d4667654a4842dba27cbd3fd6cb9e8f23ad1dc1fe78cbd9621b5e7d8d","integrity":"sha256-LMP8bUZnZUpIQtuifL0/1suejyOtHcH+eMvZYhtefY0="},"flags/4x3/sn-d8a7143973e5ea3d4b58e707ac2b791b45b5c7a7e65cea521fa82e9e5920926d.svg":{"logical_path":"flags/4x3/sn.svg","mtime":"2022-05-27T21:42:11+02:00","size":424,"digest":"e8f288fc52101ac915f7321dffce4c0af0a830244791f63efea069cbbc311ffa","integrity":"sha256-6PKI/FIQGskV9zId/85MCvCoMCRHkfY+/qBpy7wxH/o="},"flags/1x1/sn-2432d592221bbdd387548cfa5069c62f75245597749ffa6e2dc8d029b76e88ae.svg":{"logical_path":"flags/1x1/sn.svg","mtime":"2022-05-27T21:42:11+02:00","size":414,"digest":"1e2477f3991b0329067f700db10898bc0761c241ecdbe5cf3c0a79998ee86748","integrity":"sha256-HiR385kbAykGf3ANsQiYvAdhwkHs2+XPPAp5mY7oZ0g="},"flags/4x3/so-c82eddc49e0c223a307286bed233a03794954ad83efd12d8e2499a728bb78f22.svg":{"logical_path":"flags/4x3/so.svg","mtime":"2022-05-27T21:42:11+02:00","size":497,"digest":"50c5153e92331af5eb0bcda9b17ed8ded87f69f94803d50315514c8d95f241dd","integrity":"sha256-UMUVPpIzGvXrC82psX7Y3th/aflIA9UDFVFMjZXyQd0="},"flags/1x1/so-52cb6599bb12bafd9e49b2661297961fe585068009eb1b1c1153023514a342a7.svg":{"logical_path":"flags/1x1/so.svg","mtime":"2022-05-27T21:42:11+02:00","size":498,"digest":"74f68a5972d287abb010860d78e9ea8158499c1187e9f30a533f14f62395aff3","integrity":"sha256-dPaKWXLSh6uwEIYNeOnqgVhJnBGH6fMKUz8U9iOVr/M="},"flags/4x3/sr-cda17a0b4748b11b3e116d4f034adf47def0faaae1e71a5bb5d5c61645be9795.svg":{"logical_path":"flags/4x3/sr.svg","mtime":"2022-05-27T21:42:11+02:00","size":315,"digest":"04f64ba6540237ec9188f9f776ea8e300ab8da9e69b0987c7f84d57e485d03fa","integrity":"sha256-BPZLplQCN+yRiPn3duqOMAq42p5psJh8f4TVfkhdA/o="},"flags/1x1/sr-fb0ff6fc7108d1b993a838bb0e9db479af4e2af4cda72c80e7456c0777cdea28.svg":{"logical_path":"flags/1x1/sr.svg","mtime":"2022-05-27T21:42:11+02:00","size":320,"digest":"e146a0ccedd75c58f6bbc1684b42662e295617bbad9fa96086b3ef3e6afe2278","integrity":"sha256-4UagzO3XXFj2u8FoS0JmLilWF7utn6lghrPvPmr+Ing="},"flags/4x3/ss-744839019f2833ed8059e53d0d6e1cde2471c6a61d51f9e09814bda42bdc1f12.svg":{"logical_path":"flags/4x3/ss.svg","mtime":"2022-05-27T21:42:11+02:00","size":386,"digest":"d0545941635094a4083da0238fec28147c845f146e122c745d0977bd0c9433d6","integrity":"sha256-0FRZQWNQlKQIPaAjj+woFHyEXxRuEix0XQl3vQyUM9Y="},"flags/1x1/ss-d77200a3fe67f1533ea642a6013667ce15bb0c8068b09db151c960593b37549a.svg":{"logical_path":"flags/1x1/ss.svg","mtime":"2022-05-27T21:42:11+02:00","size":397,"digest":"15466776e5a57ff54c2fba7cb590cd7f27298d38cbf2c1ddcde63a81d8e9c102","integrity":"sha256-FUZnduWlf/VML7p8tZDNfycpjTjL8sHdzeY6gdjpwQI="},"flags/4x3/st-b0a9259277e38c0c8e0efec1d10b40d3e9c80a9eef21c174246aad28511e976d.svg":{"logical_path":"flags/4x3/st.svg","mtime":"2022-05-27T21:42:11+02:00","size":916,"digest":"ebb813a81f4959663ce7a00f33acb9513cb0aeaacc6e6b42becf3964114b97a1","integrity":"sha256-67gTqB9JWWY856APM6y5UTywrqrMbmtCvs85ZBFLl6E="},"flags/1x1/st-02eb52348f8547d028ba692f909483c32474105aae7940731d9264027493e479.svg":{"logical_path":"flags/1x1/st.svg","mtime":"2022-05-27T21:42:11+02:00","size":920,"digest":"a866043ab37ce805b64abec78b95b6c083271c13e8e1ec7ca96449410578e89d","integrity":"sha256-qGYEOrN86AW2Sr7Hi5W2wIMnHBPo4ex8qWRJQQV46J0="},"flags/4x3/sv-b524450c407002e1cf8e85444bb4225849cae409f54f5dc87d14d65faeeb833a.svg":{"logical_path":"flags/4x3/sv.svg","mtime":"2022-05-27T21:42:11+02:00","size":82697,"digest":"4a2c02ae1c8fa104bdf722d8040868f47d1159fc774e32082e7fd1516c0c8e6d","integrity":"sha256-SiwCrhyPoQS99yLYBAho9H0RWfx3TjIILn/RUWwMjm0="},"flags/1x1/sv-e16fe96bd7f32dadd74091ee73b723c2b8dd92e791f337c54ee5bb18693ef1d2.svg":{"logical_path":"flags/1x1/sv.svg","mtime":"2022-05-27T21:42:11+02:00","size":83238,"digest":"ece5f580bf1a30a24794f29e85b851709f2ff7adc3b8d5a88634b5df5a73533e","integrity":"sha256-7OX1gL8aMKJHlPKehbhRcJ8v963DuNWohjS131pzUz4="},"flags/4x3/sx-076f4363898d1374f985352dddbfe2a618bf4e7fedd80e43956be6614ca27ec0.svg":{"logical_path":"flags/4x3/sx.svg","mtime":"2022-05-27T21:42:11+02:00","size":13209,"digest":"aa8a47e9aa8b9ba218c6875d2435df72740ab4c0b924869286b4cadb1365d49c","integrity":"sha256-qopH6aqLm6IYxoddJDXfcnQKtMC5JIaShrTK2xNl1Jw="},"flags/1x1/sx-689aabb209fec5e8fc325bbaff80aa0bf11a2d6c819fa821b82069a2e5f12911.svg":{"logical_path":"flags/1x1/sx.svg","mtime":"2022-05-27T21:42:11+02:00","size":12992,"digest":"ac716ddb83c8e34353666b6102c03688503eb97ae55ca9aeeb86c4e954ae8b06","integrity":"sha256-rHFt24PI40NTZmthAsA2iFA+uXrlXKmu64bE6VSuiwY="},"flags/4x3/sy-d99ddced9cf98e95f7086a70703cd234cc8e21e744c37a6f90820c37ebc755d2.svg":{"logical_path":"flags/4x3/sy.svg","mtime":"2022-05-27T21:42:11+02:00","size":565,"digest":"3b78773e392f046fb9b3f83bc34ce38515f72320c575d93c41c95d90ffb5d039","integrity":"sha256-O3h3PjkvBG+5s/g7w0zjhRX3IyDFddk8QcldkP+10Dk="},"flags/1x1/sy-c7f1e1422a9d941be9abd5e0f51b4c4ebdd08efd31c4ba3e378c155911cbe844.svg":{"logical_path":"flags/1x1/sy.svg","mtime":"2022-05-27T21:42:11+02:00","size":579,"digest":"fdec8ea00a33abe5dfade7864c28d9ad713c3cda3e7d828ff699647da3e74446","integrity":"sha256-/eyOoAozq+XfreeGTCjZrXE8PNo+fYKP9plkfaPnREY="},"flags/4x3/sz-b8760e27e50f7f31f0b38c2cdbcfa0121317bad064561cbcfeb8413ee8764e6d.svg":{"logical_path":"flags/4x3/sz.svg","mtime":"2022-05-27T21:42:11+02:00","size":6742,"digest":"57cefe0c71e90edba3c03594a69a3a9a33f779c0c2405efaedb8d64290e28d1f","integrity":"sha256-V87+DHHpDtujwDWUppo6mjP3ecDCQF767bjWQpDijR8="},"flags/1x1/sz-6c0e7ae75aa0fa71821d7b6230dff63e34b65221c0dc08f50226299d37716652.svg":{"logical_path":"flags/1x1/sz.svg","mtime":"2022-05-27T21:42:11+02:00","size":6689,"digest":"ad977a6b06f85ee23b3ea5ec49f83363720525a3fd37475ef79cb59591c32951","integrity":"sha256-rZd6awb4XuI7PqXsSfgzY3IFJaP9N0de95y1lZHDKVE="},"flags/4x3/tc-abf0740c371bb155066651fca91c9e27e12b3cc9c05c14494e53dac851cc78bb.svg":{"logical_path":"flags/4x3/tc.svg","mtime":"2022-05-27T21:42:11+02:00","size":14497,"digest":"c3e7a86e64d439e6b25dc833f685cd5461e9c5ce33d0f004f3570adfba65c9bc","integrity":"sha256-w+eobmTUOeayXcgz9oXNVGHpxc4z0PAE81cK37plybw="},"flags/1x1/tc-13c94ed220ff9c70284c379e33fc85891de95dce60ec053787549485bca40a36.svg":{"logical_path":"flags/1x1/tc.svg","mtime":"2022-05-27T21:42:11+02:00","size":14756,"digest":"d91ac6bce029f8aa5b760be2a62884b67e03180eb9a9c67ae6066df67c85154c","integrity":"sha256-2RrGvOAp+KpbdgvipiiEtn4DGA65qcZ65gZt9nyFFUw="},"flags/4x3/td-354d8d74597706ece28b45f28030c948596f91c04392d07307b800cb0fc6e4cd.svg":{"logical_path":"flags/4x3/td.svg","mtime":"2022-05-27T21:42:11+02:00","size":267,"digest":"b6ce40aff60feef4e8fe1417f075b57688b5cc4c32d09296d02776a797e0b0d3","integrity":"sha256-ts5Ar/YP7vTo/hQX8HW1doi1zEwy0JKW0Cd2p5fgsNM="},"flags/1x1/td-fb3c31a792ab9fffe28bfe959cacdac54daebe9f795c30515830d93773805c3e.svg":{"logical_path":"flags/1x1/td.svg","mtime":"2022-05-27T21:42:11+02:00","size":279,"digest":"ef115b3942ae5cb74b046b0a5faad35fbd6126d8c6fda489881b16494c8c632c","integrity":"sha256-7xFbOUKuXLdLBGsKX6rTX71hJtjG/aSJiBsWSUyMYyw="},"flags/4x3/tf-f4edacabdba5b4d4d898a4edd7f07976f6a01ceee97c03fdf3561f2ba369b4f3.svg":{"logical_path":"flags/4x3/tf.svg","mtime":"2022-05-27T21:42:11+02:00","size":1088,"digest":"0681ec54dffc4f628efd8b4726fc3f00c628aab4fb0c797c332c80a25d559820","integrity":"sha256-BoHsVN/8T2KO/YtHJvw/AMYoqrT7DHl8MyyAol1VmCA="},"flags/1x1/tf-fa00833e3ac96967c55c7f495a580ad5beb1fd912d32d0c9751b93c3c89be893.svg":{"logical_path":"flags/1x1/tf.svg","mtime":"2022-05-27T21:42:11+02:00","size":1196,"digest":"90ad184cfd769cdda3da9c43b4fb5a494962f3095f38f4175ce37c371e0180d6","integrity":"sha256-kK0YTP12nN2j2pxDtPtaSUli8wlfOPQXXON8Nx4BgNY="},"flags/4x3/tg-32688daf8870e048421dcbfa2777d9b5f146e588f5f604433d17143fe702dac7.svg":{"logical_path":"flags/4x3/tg.svg","mtime":"2022-05-27T21:42:11+02:00","size":728,"digest":"486dca2420c797d9a37b03d11767c9418b5e26d07c7c694d897b7d85092ea499","integrity":"sha256-SG3KJCDHl9mjewPRF2fJQYteJtB8fGlNiXt9hQkupJk="},"flags/1x1/tg-0e62ff3b4c2106e7c5fe27a6f32fb3c10f69f9cfd5dad9aeb7a8b54af7cab786.svg":{"logical_path":"flags/1x1/tg.svg","mtime":"2022-05-27T21:42:11+02:00","size":733,"digest":"830f49a57206bf654bc37aaa1668ee8840a23595b2ed440c968f81d961e820ad","integrity":"sha256-gw9JpXIGv2VLw3qqFmjuiECiNZWy7UQMlo+B2WHoIK0="},"flags/4x3/th-da4f1fda6eda5971dd52bad365bfc4aae176f0eedebf5c8bd9af25789c03993d.svg":{"logical_path":"flags/4x3/th.svg","mtime":"2022-05-27T21:42:11+02:00","size":287,"digest":"4e206b563d27b5a7a3f7cabf944d6d278e6e8640018a72ce7b7ff989f1396df9","integrity":"sha256-TiBrVj0ntaej98q/lE1tJ45uhkABinLOe3/5ifE5bfk="},"flags/1x1/th-95ac5f4463da0b9164f2fbed65ca12046370fcb1e250c6170975b77d1509b3e5.svg":{"logical_path":"flags/1x1/th.svg","mtime":"2022-05-27T21:42:11+02:00","size":288,"digest":"cb480908e2c394e816623b7fcd5b63b484f25578fd89905d6aa1453bcd041887","integrity":"sha256-y0gJCOLDlOgWYjt/zVtjtITyVXj9iZBdaqFFO80EGIc="},"flags/4x3/tj-d072d6cd4136ae97533d32ac74d20350ac794f8a79eaecd1c55142e76b93b3d9.svg":{"logical_path":"flags/4x3/tj.svg","mtime":"2022-05-27T21:42:11+02:00","size":1812,"digest":"1a8979f03a820cec54ff4a900e843afee074f3b4004e1aeeb706caaea0379ffe","integrity":"sha256-Gol58DqCDOxU/0qQDoQ6/uB087QAThrutwbKrqA3n/4="},"flags/1x1/tj-2cefbad6aee66d30fd757ea564fdbbde86aebde70720e9c961799caa6bdc8b84.svg":{"logical_path":"flags/1x1/tj.svg","mtime":"2022-05-27T21:42:11+02:00","size":1767,"digest":"a133d52c99a285aa2dd0b86739163bd5bb7a2c0eaa5a1fd522a11ec4b5b3bece","integrity":"sha256-oTPVLJmihaot0LhnORY71bt6LA6qWh/VIqEexLWzvs4="},"flags/4x3/tk-da715012efe8731020fe54063a76bffb256ea6696da290ccbb599ab36990edfe.svg":{"logical_path":"flags/4x3/tk.svg","mtime":"2022-05-27T21:42:11+02:00","size":788,"digest":"3e49a632d5d87de3ef67aca8faa159c1b69bc16669f6c8c117748dc9625d1c58","integrity":"sha256-PkmmMtXYfePvZ6yo+qFZwbabwWZp9sjBF3SNyWJdHFg="},"flags/1x1/tk-4055f5153398c294b2344880102e23847e952df1d04ad8734218fb0f6b43bf42.svg":{"logical_path":"flags/1x1/tk.svg","mtime":"2022-05-27T21:42:11+02:00","size":778,"digest":"137c7ebb28233cdc2f417bc1e29bfad502ef7dd404c35ac36188e7dd98aecb6d","integrity":"sha256-E3x+uygjPNwvQXvB4pv61QLvfdQEw1rDYYjn3Ziuy20="},"flags/4x3/tl-388fac3c65fbbc18779b88f7fcdea523ba440860923a7e1602ca1138bcd5c40b.svg":{"logical_path":"flags/4x3/tl.svg","mtime":"2022-05-27T21:42:11+02:00","size":603,"digest":"8662a8d01007fcbe0f41a694a5cd927265409d59b783b50e0bf4561302a77e40","integrity":"sha256-hmKo0BAH/L4PQaaUpc2ScmVAnVm3g7UOC/RWEwKnfkA="},"flags/1x1/tl-9fea1b22d992cd15cafd1e5824d65f1f0f84b7c89a0f5a460b82429e2f9a8e95.svg":{"logical_path":"flags/1x1/tl.svg","mtime":"2022-05-27T21:42:11+02:00","size":577,"digest":"d26071ddf754d77ea56779d817e8c62f37a38fa64102e0c864901ff3941cffbf","integrity":"sha256-0mBx3fdU136lZ3nYF+jGLzejj6ZBAuDIZJAf85Qc/78="},"flags/4x3/tm-f5d7cce194b88ed026465717ee593c35c03f76f3483d77bee2a3e05827628679.svg":{"logical_path":"flags/4x3/tm.svg","mtime":"2022-05-27T21:42:11+02:00","size":32287,"digest":"22b811ff90642de341a3e28a1775d1992d1f32088e922abddafca79157e3c2ec","integrity":"sha256-IrgR/5BkLeNBo+KKF3XRmS0fMgiOkiq92vynkVfjwuw="},"flags/1x1/tm-a3f255f0a6874a326140c9a4cad876cd386c30ac7b9e974905699ada62811042.svg":{"logical_path":"flags/1x1/tm.svg","mtime":"2022-05-27T21:42:11+02:00","size":31566,"digest":"42c8536f18d9a9878a90872649f0ec85b27ba59e1942ca5ac619f2f2f993aa38","integrity":"sha256-QshTbxjZqYeKkIcmSfDshbJ7pZ4ZQspaxhny8vmTqjg="},"flags/4x3/tn-ba48fb29a4c8511d1145b87abc10cb75e8dc9ac4e704dc9efc113cf920d4b640.svg":{"logical_path":"flags/4x3/tn.svg","mtime":"2022-05-27T21:42:11+02:00","size":751,"digest":"5d05bcd60eb3118eae45baf24be63aab68e236ec6d19124eed90548f1ec42bd5","integrity":"sha256-XQW81g6zEY6uRbryS+Y6q2jiNuxtGRJO7ZBUjx7EK9U="},"flags/1x1/tn-d9b89cb7ab0b22d5a4709eb4681d77b8f6877d572a1d2f6424f6ce2fbed2dede.svg":{"logical_path":"flags/1x1/tn.svg","mtime":"2022-05-27T21:42:11+02:00","size":733,"digest":"84116fb50ddb30d2f08991ae4e3762d7191fe4387e1cf05d55a4e3f2e95c3c57","integrity":"sha256-hBFvtQ3bMNLwiZGuTjdi1xkf5Dh+HPBdVaTj8ulcPFc="},"flags/4x3/to-9f1079a109d27abe53f17281320474ecfa6edc571502831f167471edd470773e.svg":{"logical_path":"flags/4x3/to.svg","mtime":"2022-05-27T21:42:11+02:00","size":355,"digest":"a2007667f47550dd1a6db5e83911fcc0acdf00909db626d592a9390c4e8aa1fa","integrity":"sha256-ogB2Z/R1UN0abbXoORH8wKzfAJCdtibVkqk5DE6Kofo="},"flags/1x1/to-a543262eaac18a114c5c70153895192a3e58981d4a00084473cd479bbca5783b.svg":{"logical_path":"flags/1x1/to.svg","mtime":"2022-05-27T21:42:11+02:00","size":361,"digest":"5e87ab54fa5f3124d1fc521d29259865fdd1f528e968dad12a33aff22ff788f2","integrity":"sha256-XoerVPpfMSTR/FIdKSWYZf3R9SjpaNrRKjOv8i/3iPI="},"flags/4x3/tr-04941a0f055d2ee2466b8e19532f58a2a0c4e3a83d986a601220fda2b6a3b090.svg":{"logical_path":"flags/4x3/tr.svg","mtime":"2022-05-27T21:42:11+02:00","size":554,"digest":"033a416ecc30a516c54c6a0fac2d212a38fb051e5976cda49eb9d22264814a66","integrity":"sha256-AzpBbswwpRbFTGoPrC0hKjj7BR5Zds2knrnSImSBSmY="},"flags/1x1/tr-0df7b630a61ad40f32017487e6fef02258e8b2c8709c6fc8c1d3de1e9b36b09c.svg":{"logical_path":"flags/1x1/tr.svg","mtime":"2022-05-27T21:42:11+02:00","size":575,"digest":"74e60d09369c164cc245d49d109c78ea322a117e0fe58945c380b65a71c691ae","integrity":"sha256-dOYNCTacFkzCRdSdEJx46jIqEX4P5YlFw4C2WnHGka4="},"flags/4x3/tt-9ca06051696b194f98d36ab4adb6aa7eb75275333cc0b48c9c9e1c34601013aa.svg":{"logical_path":"flags/4x3/tt.svg","mtime":"2022-05-27T21:42:11+02:00","size":315,"digest":"f6ac88577c57d12df95251c21a7adb68ced1720731d754a462d2958879b56e00","integrity":"sha256-9qyIV3xX0S35UlHCGnrbaM7Rcgcx11SkYtKViHm1bgA="},"flags/1x1/tt-b05ee6c590e5c757190226182ac72648604086a272479f91d73dc24d90162eef.svg":{"logical_path":"flags/1x1/tt.svg","mtime":"2022-05-27T21:42:11+02:00","size":320,"digest":"3d65dcbca5b7d40a1730e1c190d0c7e2874d1b3b44e0a0941ec033056044f3de","integrity":"sha256-PWXcvKW31AoXMOHBkNDH4odNGztE4KCUHsAzBWBE894="},"flags/4x3/tv-5875f68681a06f613b3f84cd6959eb9dba70524bf14b0c8aa4a823a833dd6a98.svg":{"logical_path":"flags/4x3/tv.svg","mtime":"2022-05-27T21:42:11+02:00","size":1783,"digest":"6017cefb02fcc099faa8f072149bbce7f8c155ad6ffa620a6d6258409b786ce4","integrity":"sha256-YBfO+wL8wJn6qPByFJu85/jBVa1v+mIKbWJYQJt4bOQ="},"flags/1x1/tv-d8be186cccd6335a8f85c89085ef08b19c247df4081ed61698604972fdb8fa43.svg":{"logical_path":"flags/1x1/tv.svg","mtime":"2022-05-27T21:42:11+02:00","size":1716,"digest":"add42a023b56a92f42007afb933e28e1d08d734e55ccecbfc3f9fae70701a240","integrity":"sha256-rdQqAjtWqS9CAHr7kz4o4dCNc05VzOy/w/n65wcBokA="},"flags/4x3/tw-29e639da18e668c62eb04ed3f3a02e11b0809890a2a0c82b529e50d53076e4e2.svg":{"logical_path":"flags/4x3/tw.svg","mtime":"2022-05-27T21:42:11+02:00","size":945,"digest":"44b7d1f3acc75aa8ff817b55d499dcb24770a3423b624bff829cb26729de7c16","integrity":"sha256-RLfR86zHWqj/gXtV1Jncskdwo0I7Ykv/gpyyZynefBY="},"flags/1x1/tw-2a2531772efdfcc74f70cc88f6fc15df7dc42dc344d9ed94b08e1847557976c4.svg":{"logical_path":"flags/1x1/tw.svg","mtime":"2022-05-27T21:42:11+02:00","size":954,"digest":"06af22c30adfccca9975a99fd05310568de59f039a14fd8dbabab7c17a33cb19","integrity":"sha256-Bq8iwwrfzMqZdamf0FMQVo3lnwOaFP2Nurq3wXozyxk="},"flags/4x3/tz-69ae0bf011f019428148ba9c3d793b4104be88621741beb216dfc9f43d125d6c.svg":{"logical_path":"flags/4x3/tz.svg","mtime":"2022-05-27T21:42:11+02:00","size":549,"digest":"1d5e7fb7a12497358a19b92671184b14664125a143d909abbee5615b57f7e988","integrity":"sha256-HV5/t6EklzWKGbkmcRhLFGZBJaFD2QmrvuVhW1f36Yg="},"flags/1x1/tz-581f05e20eeb5d8d77f807f2d6edaf786da8226284726841f33d9288ee84d6b7.svg":{"logical_path":"flags/1x1/tz.svg","mtime":"2022-05-27T21:42:11+02:00","size":602,"digest":"ad4c35de9f6aec57aac272de390d5730a75aa7e1a4431166a5dcea3bcbdc62f2","integrity":"sha256-rUw13p9q7FeqwnLeOQ1XMKdap+GkQxFmpdzqO8vcYvI="},"flags/4x3/ua-ddfa2a9985ed8342421c8df6fe852ec92e15d584c2565c525347bcd5f524c9da.svg":{"logical_path":"flags/4x3/ua.svg","mtime":"2022-05-27T21:42:11+02:00","size":238,"digest":"fbbf0f0e9a6d6187561f38af9b3f28e3125e406c3deea268bcb64dac7a03a6aa","integrity":"sha256-+78PDpptYYdWHzivmz8o4xJeQGw97qJovLZNrHoDpqo="},"flags/1x1/ua-86260ecf3aa1da110f92b58861d7918e3e574a79cfb4334f9c82b1a750a8a875.svg":{"logical_path":"flags/1x1/ua.svg","mtime":"2022-05-27T21:42:11+02:00","size":238,"digest":"79092de6d22db0454898a7d17f26961709256110620e67933043799fa86b2296","integrity":"sha256-eQkt5tItsEVImKfRfyaWFwklYRBiDmeTMEN5n6hrIpY="},"flags/4x3/ug-b748460c255e064ba8a2d89bb78c48fd29bdf496a7ca3c3af0ed0d83e49995cb.svg":{"logical_path":"flags/4x3/ug.svg","mtime":"2022-05-27T21:42:11+02:00","size":3951,"digest":"001fa554127aafd736752727490db9f8893164c0369d0ba5cb6d742c44370975","integrity":"sha256-AB+lVBJ6r9c2dScnSQ25+IkxZMA2nQuly210LEQ3CXU="},"flags/1x1/ug-8a8552bd983c6e2136f9eba9b4917d0e158415a24d9945f663ed56239299b44b.svg":{"logical_path":"flags/1x1/ug.svg","mtime":"2022-05-27T21:42:11+02:00","size":4024,"digest":"59bc76deefd22802e7d4ab2bd5e34f59c6bc112135c8052284410a0787954af9","integrity":"sha256-Wbx23u/SKALn1Ksr1eNPWca8ESE1yAUihEEKB4eVSvk="},"flags/4x3/um-d3a2b6a726a36d08db81fe4a5f0decd0afe5aa4ad8515304db4c3ace8f27e415.svg":{"logical_path":"flags/4x3/um.svg","mtime":"2022-05-27T21:42:11+02:00","size":4523,"digest":"d2e8ac2079a27fb6f120ab4bc4d29597450bd01a9fedf9b7f5a09ad65e8dd164","integrity":"sha256-0uisIHmif7bxIKtLxNKVl0UL0Bqf7fm39aCa1l6N0WQ="},"flags/1x1/um-0bcb31652ebcfa8c6727911e3df341b30425c3c699e6c4bf9f47c739ab9f442d.svg":{"logical_path":"flags/1x1/um.svg","mtime":"2022-05-27T21:42:11+02:00","size":3972,"digest":"9674c82888b92fbbba22f3588e7d83e8c0ce887d9ccdf3abac317f9725530ab5","integrity":"sha256-lnTIKIi5L7u6IvNYjn2D6MDOiH2czfOrrDF/lyVTCrU="},"flags/4x3/us-c10177f8d2a93643101b39e419273bdd2f43a58ff9beff88a90431b0a4aa6a00.svg":{"logical_path":"flags/4x3/us.svg","mtime":"2022-05-27T21:42:11+02:00","size":4461,"digest":"c70ba1cb67cc649da2b1f5dc4a26891437d8bba2cc098c88461e6bfc23949d9e","integrity":"sha256-xwuhy2fMZJ2isfXcSiaJFDfYu6LMCYyIRh5r/COUnZ4="},"flags/1x1/us-a46068d8032a1e3364325da9675a41ba85a40c5401981c403fb7297aea254906.svg":{"logical_path":"flags/1x1/us.svg","mtime":"2022-05-27T21:42:11+02:00","size":3921,"digest":"c4ffd0455cf50bc1683646dc77e7263d81cffad51f36d3c39b85a9848fb5a196","integrity":"sha256-xP/QRVz1C8FoNkbcd+cmPYHP+tUfNtPDm4WphI+1oZY="},"flags/4x3/uy-ab18ad511d2822414e3b4f32e3309dca27b5b559cabd89cba2b4b4072387f440.svg":{"logical_path":"flags/4x3/uy.svg","mtime":"2022-05-27T21:42:11+02:00","size":1718,"digest":"25c640333545843d345dbda694ca41c404dcaa69d3e32fbebc89d5620b5b881a","integrity":"sha256-JcZAMzVFhD00Xb2mlMpBxATcqmnT4y++vInVYgtbiBo="},"flags/1x1/uy-d94f5244cbd79f9348a048b7ec8861d37a237806dc1a6427fc9e743b86f43097.svg":{"logical_path":"flags/1x1/uy.svg","mtime":"2022-05-27T21:42:11+02:00","size":1715,"digest":"4466c6f09de93905872fe47bfc03c6e5a143cbf77cdfc93fcd450663572f3d60","integrity":"sha256-RGbG8J3pOQWHL+R7/APG5aFDy/d838k/zUUGY1cvPWA="},"flags/4x3/uz-78ae3b6ad90b0bb256102b6db50b8f9a7700fb6275e80d0c5b755e0defdcf8e5.svg":{"logical_path":"flags/4x3/uz.svg","mtime":"2022-05-27T21:42:11+02:00","size":1454,"digest":"76a3658f5f45def0750a70247d604356ff4eba996b30aa23a657ac07044caed4","integrity":"sha256-dqNlj19F3vB1CnAkfWBDVv9OuplrMKojplesBwRMrtQ="},"flags/1x1/uz-eff129a2e58e047e1daa2883f9ab0ef410bc11c42d652b9c4635bce5ab045b4f.svg":{"logical_path":"flags/1x1/uz.svg","mtime":"2022-05-27T21:42:11+02:00","size":1454,"digest":"96eba693faa2439ebee48d27072a67086b7be80001ec8c5e3f0743b37f2a42a1","integrity":"sha256-luumk/qiQ56+5I0nBypnCGt76AAB7IxePwdDs38qQqE="},"flags/4x3/va-20117c2869d005de2cc54801f2d264b2823c214276f5559de1e48108f572fc79.svg":{"logical_path":"flags/4x3/va.svg","mtime":"2022-05-27T21:42:11+02:00","size":91076,"digest":"89b12d71ce8ea74250d99da84ad4417c53eab133e4be8db99e6b8e0b26f71278","integrity":"sha256-ibEtcc6Op0JQ2Z2oStRBfFPqsTPkvo25nmuOCyb3Eng="},"flags/1x1/va-3206ffbb26fff2b3cd06959ba7f9d713efa9d133932d94ea1f1f6e3dd42687a3.svg":{"logical_path":"flags/1x1/va.svg","mtime":"2022-05-27T21:42:11+02:00","size":90711,"digest":"bcc69d5aaddda710e0c480c64f1ad9730ba45edd4692684fcca1c4f8083c5d19","integrity":"sha256-vMadWq3dpxDgxIDGTxrZcwukXt1GkmhPzKHE+Ag8XRk="},"flags/4x3/vc-dccc1c2e4dc2d36ff71f8b04ebda868a7c4ce753b9fe5ccf0bed00edd7d41abb.svg":{"logical_path":"flags/4x3/vc.svg","mtime":"2022-05-27T21:42:11+02:00","size":451,"digest":"55b7f903c7e603de7eec36bca0760a51930ae7ba90c2e758fcf3aa4d7e959ee5","integrity":"sha256-Vbf5A8fmA95+7Da8oHYKUZMK57qQwudY/POqTX6VnuU="},"flags/1x1/vc-08a544ff242da12cc3fbad36579499a0b125c4b7ee7aa0af4eff0a261ea27a13.svg":{"logical_path":"flags/1x1/vc.svg","mtime":"2022-05-27T21:42:11+02:00","size":498,"digest":"3be977d9f161a5800728de845aa7632df3263927fea4b03544400755d27e7c19","integrity":"sha256-O+l32fFhpYAHKN6EWqdjLfMmOSf+pLA1REAHVdJ+fBk="},"flags/4x3/ve-d62ba31ca157e54409e09617a264e0dd18a2c597b1ad611c34da7fe7962e05dc.svg":{"logical_path":"flags/4x3/ve.svg","mtime":"2022-05-27T21:42:11+02:00","size":1168,"digest":"3079fd19521114a5585b23e37a3d443676b52fd593b68bae5026c29de0bf5561","integrity":"sha256-MHn9GVIRFKVYWyPjej1ENna1L9WTtouuUCbCneC/VWE="},"flags/1x1/ve-f465be9b82185e94a0f84a3d8b2f536e026b8893fecfc324997ca711b9fe0097.svg":{"logical_path":"flags/1x1/ve.svg","mtime":"2022-05-27T21:42:11+02:00","size":1188,"digest":"2fe0f692a6986f2b21ebd6260b6750b29a0487b9486e70fcf789e113ad0e1192","integrity":"sha256-L+D2kqaYbysh69YmC2dQspoEh7lIbnD894nhE60OEZI="},"flags/4x3/vg-d6c3f0ef53e605acc97f33a4e0a61711b6a8207c6a2cff55b9427870053da583.svg":{"logical_path":"flags/4x3/vg.svg","mtime":"2022-05-27T21:42:11+02:00","size":24640,"digest":"509967cefab0422e7e4162aa75d3cede7620a4a17d9b2015adfa74e84051f364","integrity":"sha256-UJlnzvqwQi5+QWKqddPO3nYgpKF9myAVrfp06EBR82Q="},"flags/1x1/vg-8a2a8af88748ff501bc90aceb327488cce5f323948d59f62c960ccfb58ca7510.svg":{"logical_path":"flags/1x1/vg.svg","mtime":"2022-05-27T21:42:11+02:00","size":24814,"digest":"caec07f09c87f0ebd2843dedf7e8fd5ebe3ed795b2649c648788775c65f48b31","integrity":"sha256-yuwH8JyH8OvShD3t9+j9Xr4+15WyZJxkh4h3XGX0izE="},"flags/4x3/vi-882e3005bf905201f3ccb79736ff058aad41d99046ef58fefb2e5f7df30d4ef4.svg":{"logical_path":"flags/4x3/vi.svg","mtime":"2022-05-27T21:42:11+02:00","size":8742,"digest":"0c1811861e17033d8d2ee291edb8b710dc877fbec06ab4e4d250218724966032","integrity":"sha256-DBgRhh4XAz2NLuKR7bi3ENyHf77AarTk0lAhhySWYDI="},"flags/1x1/vi-8f89c34e92ffdc8d17724234254fadad1bbb4b2828cb5e041b4d6a21ec5c3caa.svg":{"logical_path":"flags/1x1/vi.svg","mtime":"2022-05-27T21:42:11+02:00","size":8697,"digest":"8112962dc3d3194f3bbf70018fcb5accc21d2cbd033957579427241fbd931e62","integrity":"sha256-gRKWLcPTGU87v3ABj8tazMIdLL0DOVdXlCckH72THmI="},"flags/4x3/vn-53c52e450c6e603d8b08c0170dd3bd15aaa0d4e9d250657bea188945c1252138.svg":{"logical_path":"flags/4x3/vn.svg","mtime":"2022-05-27T21:42:11+02:00","size":494,"digest":"1768f5ce4bad46f4907f598e6097e6e1340500f4d7d75a76266f3e6ab9463d5e","integrity":"sha256-F2j1zkutRvSQf1mOYJfm4TQFAPTX11p2Jm8+arlGPV4="},"flags/1x1/vn-7267ad3b33fb6d304ff414c998a2c69c6b46abc2528c2e955ff4367959cae8e1.svg":{"logical_path":"flags/1x1/vn.svg","mtime":"2022-05-27T21:42:11+02:00","size":498,"digest":"42db427a67708ab79be29119530cedf2108f7a4bcebfdf754a1d8faeedfadb77","integrity":"sha256-QttCemdwireb4pEZUwzt8hCPekvOv991Sh2Pru3623c="},"flags/4x3/vu-2dd468b3a9c89ef0bcbb155422cb38bb19e6255d2871ec2b7012055d31d13e2a.svg":{"logical_path":"flags/4x3/vu.svg","mtime":"2022-05-27T21:42:11+02:00","size":3772,"digest":"03a36a9550f9eba48a2cbe65dc4be5e00b79447fa6d0863378046cc5836a4014","integrity":"sha256-A6NqlVD566SKLL5l3Evl4At5RH+m0IYzeARsxYNqQBQ="},"flags/1x1/vu-477e1ac8d2d514517a8a6b84f917f9c43d0145d52f4b89e7205277ee3bbea422.svg":{"logical_path":"flags/1x1/vu.svg","mtime":"2022-05-27T21:42:11+02:00","size":3732,"digest":"016c68fdb5c59b9342aa68a196d73fdf6b7a867694fc406d1338b507a4d05c56","integrity":"sha256-AWxo/bXFm5NCqmihltc/32t6hnaU/EBtEzi1B6TQXFY="},"flags/4x3/wf-d2b9db8f6fa2a78507a5b4751f95e92c334673ecddd68eb33844ea91fc62d771.svg":{"logical_path":"flags/4x3/wf.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"e8360ce364de6826f01716b7d320eef87621b70101c129df459682a790267f89","integrity":"sha256-6DYM42TeaCbwFxa30yDu+HYhtwEBwSnfRZaCp5Amf4k="},"flags/1x1/wf-095484363036fafbb44da7fbbdb6bb371c92c002163fb610c29912c6027a3cb7.svg":{"logical_path":"flags/1x1/wf.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"5878874353a81033882d683151d7a94765656f867015f75985388e3817a37f8d","integrity":"sha256-WHiHQ1OoEDOILWgxUdepR2Vlb4ZwFfdZhTiOOBejf40="},"flags/4x3/ws-6a3fef801ba087404d3718c0b5b8741261d790cb2bf8b7581fea317e9689bcc7.svg":{"logical_path":"flags/4x3/ws.svg","mtime":"2022-05-27T21:42:11+02:00","size":693,"digest":"e77b5573407b1162d26d40dee59e28684aee6ebbff9961ac32242943c9e96e26","integrity":"sha256-53tVc0B7EWLSbUDe5Z4oaErubrv/mWGsMiQpQ8npbiY="},"flags/1x1/ws-a312f6f7ddd2d5694c70b935f000ccc7716aae0b207e98ca4ad6ee252d272f49.svg":{"logical_path":"flags/1x1/ws.svg","mtime":"2022-05-27T21:42:11+02:00","size":706,"digest":"7cdc90f71e92b252dc69902df2f7ea33a7033a776a00199730239aa4e8fa8b18","integrity":"sha256-fNyQ9x6SslLcaZAt8vfqM6cDOndqABmXMCOapOj6ixg="},"flags/4x3/ye-38ca92e79aeba152eee33f0d5dac55430af032a31b39d56d49c4287b0639fe72.svg":{"logical_path":"flags/4x3/ye.svg","mtime":"2022-05-27T21:42:11+02:00","size":275,"digest":"ccc0af8c1220d0583d1432c0c340c21aad14e987d7d73d2601cc35451a37cf9c","integrity":"sha256-zMCvjBIg0Fg9FDLAw0DCGq0U6YfX1z0mAcw1RRo3z5w="},"flags/1x1/ye-2d43095605cb09aeebaa7d9ec1147717dfffb26cd6a7ab66adfbf550a3bc8962.svg":{"logical_path":"flags/1x1/ye.svg","mtime":"2022-05-27T21:42:11+02:00","size":275,"digest":"d7527d589cebe8037b89e642afcca050b9da0cb4e63ed52bbf116f8461f6c60e","integrity":"sha256-11J9WJzr6AN7ieZCr8ygULnaDLTmPtUrvxFvhGH2xg4="},"flags/4x3/yt-2b54852c423d68df342c5bec300477510632be3f1046a2d9d9715a9617bc90ae.svg":{"logical_path":"flags/4x3/yt.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"b1e78ed98f7111d6a115d73d2c604f5c1ef65ba9b01713ca47d914de0d22b351","integrity":"sha256-seeO2Y9xEdahFdc9LGBPXB72W6mwFxPKR9kU3g0is1E="},"flags/1x1/yt-3ea3c372eb1f7e269abafc08882bdb99d94c18ea363b905f8422f2733a550db8.svg":{"logical_path":"flags/1x1/yt.svg","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"794597839bd5ac5c9bdc0885fe713d3d0a69e38711f9a74654a1599d7c7a7927","integrity":"sha256-eUWXg5vVrFyb3AiF/nE9PQpp44cR+adGVKFZnXx6eSc="},"flags/4x3/za-c57ff71cb91d156461c64ada7fb86779c009a9c0a53df0b6de2e87044eeefb74.svg":{"logical_path":"flags/4x3/za.svg","mtime":"2022-05-27T21:42:11+02:00","size":859,"digest":"d2d473f4e2e4707604a7caac42f9cb6415bf5e8ce35b5e72bc78775d8aae03e5","integrity":"sha256-0tRz9OLkcHYEp8qsQvnLZBW/XozjW15yvHh3XYquA+U="},"flags/1x1/za-571b8b7da7f17cd9a4ce08e5696468e86efce9be83bb776c7586184fa75e99a9.svg":{"logical_path":"flags/1x1/za.svg","mtime":"2022-05-27T21:42:11+02:00","size":872,"digest":"3985889b8382293dbb3ae27353e864661415afa0ef66d291591b447df8bf8693","integrity":"sha256-OYWIm4OCKT27OuJzU+hkZhQVr6DvZtKRWRtEffi/hpM="},"flags/4x3/zm-8a6d8f87b53dd7256d461f64cf66e2cd90df833aca8833849fbfe7445caeeae2.svg":{"logical_path":"flags/4x3/zm.svg","mtime":"2022-05-27T21:42:11+02:00","size":5497,"digest":"107a1d20ce64bbc59bdf3ef022215742bf5fd79d94636e7d4376586d2e0bb0b4","integrity":"sha256-EHodIM5ku8Wb3z7wIiFXQr9f152UY259Q3ZYbS4LsLQ="},"flags/1x1/zm-d68871c839973048d37ad325312abfc1b22b525e3f48faefedcebea29e3e9175.svg":{"logical_path":"flags/1x1/zm.svg","mtime":"2022-05-27T21:42:11+02:00","size":5401,"digest":"4b557cfd170ed4332809862db59879e1da2797deb4b24a288c525d0d72c0bb84","integrity":"sha256-S1V8/RcO1DMoCYYttZh54donl960skoojFJdDXLAu4Q="},"flags/4x3/zw-506cb345575e94583b442c3a23ded41e36cf454e797b3b2e03b4445a37395666.svg":{"logical_path":"flags/4x3/zw.svg","mtime":"2022-05-27T21:42:11+02:00","size":6641,"digest":"a357182ee43243cf7989366b10afb15296f814cba5d9a035e3d66ff401aaa115","integrity":"sha256-o1cYLuQyQ895iTZrEK+xUpb4FMul2aA149Zv9AGqoRU="},"flags/1x1/zw-f7716b45f4f267a661f85af47e95447adc282a4b9fc18bc88316cd970f8d947d.svg":{"logical_path":"flags/1x1/zw.svg","mtime":"2022-05-27T21:42:11+02:00","size":6614,"digest":"c763d38c87df2000c01e5faa5ef51823a9e076b7b9e8e52244ff35270a099401","integrity":"sha256-x2PTjIffIADAHl+qXvUYI6ngdre56OUiRP81JwoJlAE="},"flags/4x3/es-ca-884e8f11877dc43b5c29bbc00c6980cc57ee8e671b710b9f9d59e29927cd25d4.svg":{"logical_path":"flags/4x3/es-ca.svg","mtime":"2022-05-27T21:42:11+02:00","size":258,"digest":"e6d65a5eae996b410a099eadfc691c380ad0f734578ce2ac14f2d5bf31eb63db","integrity":"sha256-5tZaXq6Za0EKCZ6t/GkcOArQ9zRXjOKsFPLVvzHrY9s="},"flags/1x1/es-ca-2f61e283eeea7f76c15207644f2a8538e05a4eae39dbc8186509209773701cd9.svg":{"logical_path":"flags/1x1/es-ca.svg","mtime":"2022-05-27T21:42:11+02:00","size":257,"digest":"620053dffeefac1c5eb2f455e2cada12044e5366ffa6516a3bd611ffbbe15dcd","integrity":"sha256-YgBT3/7vrBxesvRV4sraEgROU2b/plFqO9YR/7vhXc0="},"flags/4x3/eu-dfa7f5c90f5fe9eb16c8c865e73cf7e3e8fea328bf6cfc1b07f6bc28eefd43f5.svg":{"logical_path":"flags/4x3/eu.svg","mtime":"2022-05-27T21:42:11+02:00","size":1249,"digest":"8c749adacf82b6b5d58ce51dbcfa748c6bc6a9a205e5efcb6e96f126f8953f6e","integrity":"sha256-jHSa2s+CtrXVjOUdvPp0jGvGqaIF5e/LbpbxJviVP24="},"flags/1x1/eu-c3a400ee8dc3ee4dcc2d0f2868698ce781d403a9ea249d972115c8455cfcaa9b.svg":{"logical_path":"flags/1x1/eu.svg","mtime":"2022-05-27T21:42:11+02:00","size":1250,"digest":"7085aed716bfce96bbfc2811fe55bc9855236a4216dd7c925fcb7c142578a3f9","integrity":"sha256-cIWu1xa/zpa7/CgR/lW8mFUjakIW3XySX8t8FCV4o/k="},"flags/4x3/gb-eng-65a380032580f7144bddfd4ab353bb478d523232c4303edb0095e34e98c7dcb9.svg":{"logical_path":"flags/4x3/gb-eng.svg","mtime":"2022-05-27T21:42:11+02:00","size":242,"digest":"d2de597c10f3c833fd8c7bfbe818189e6209db19882a27398b8e180884697eca","integrity":"sha256-0t5ZfBDzyDP9jHv76BgYnmIJ2xmIKic5i44YCIRpfso="},"flags/1x1/gb-eng-6fe299a85ef920693f193828362f306fbd23020d2bfc61dcf9143d85a6a5001b.svg":{"logical_path":"flags/1x1/gb-eng.svg","mtime":"2022-05-27T21:42:11+02:00","size":232,"digest":"83388730d99f674d825da4c089650366b965abd338cf15f10f5aadfe0d8276ba","integrity":"sha256-gziHMNmfZ02CXaTAiWUDZrllq9M4zxXxD1qt/g2Cdro="},"flags/4x3/gb-nir-7cdb174057442ee76cc8a3fef9df4650460b3a3a9c0634c2417c42e7383efe3f.svg":{"logical_path":"flags/4x3/gb-nir.svg","mtime":"2022-05-27T21:42:11+02:00","size":25061,"digest":"5130c70b20a02f9f6dfff69c9e55b3aa0054906318e4afc12c692dcfb7f55216","integrity":"sha256-UTDHCyCgL59t//acnlWzqgBUkGMY5K/BLGktz7f1UhY="},"flags/1x1/gb-nir-ea58e209ad11b7e21e357799a5a0d4c7cfd13b2f7407cb09933a2dc485da41ff.svg":{"logical_path":"flags/1x1/gb-nir.svg","mtime":"2022-05-27T21:42:11+02:00","size":26487,"digest":"f5c0a725da9e3e0d7321ae75c61ff5df64d065f1bdece6e2625201735177e558","integrity":"sha256-9cCnJdqePg1zIa51xh/132TQZfG97ObiYlIBc1F35Vg="},"flags/4x3/gb-sct-f7b13851e9b9de7532ef86afefb7fe2efe6149fee8ea50505771b4f7d112cf7b.svg":{"logical_path":"flags/4x3/gb-sct.svg","mtime":"2022-05-27T21:42:11+02:00","size":231,"digest":"bc44f4448f55c576b4f8e1aa1d61a8b28751dfae10cf3d26d0408befa6d0bde0","integrity":"sha256-vET0RI9VxXa0+OGqHWGosodR364Qzz0m0ECL76bQveA="},"flags/1x1/gb-sct-76e5e39a38915cf5f6020d6f58d0385f1fc0d502dbecddabf00a18cd50c88995.svg":{"logical_path":"flags/1x1/gb-sct.svg","mtime":"2022-05-27T21:42:11+02:00","size":239,"digest":"21234ce6c027716f5ea7f9b5ad128aea007534f32ee77557f7e968c82e7627a1","integrity":"sha256-ISNM5sAncW9ep/m1rRKK6gB1NPMu53VX9+loyC52J6E="},"flags/4x3/gb-wls-c6e549d37113c25f679d5ea75020ea514971a1038b3c92d6a71c316a56b542da.svg":{"logical_path":"flags/4x3/gb-wls.svg","mtime":"2022-05-27T21:42:11+02:00","size":9161,"digest":"2e24673349bd8ee843980d052d79c354f993efb345d1ef5ee0fe29807e8d19d4","integrity":"sha256-LiRnM0m9juhDmA0FLXnDVPmT77NF0e9e4P4pgH6NGdQ="},"flags/1x1/gb-wls-99a7a03c4ef2a0789d35aa1ab8b746ec72c1c8de58426afc7fa096d5a00802a7.svg":{"logical_path":"flags/1x1/gb-wls.svg","mtime":"2022-05-27T21:42:11+02:00","size":9055,"digest":"23a0c563a49267894d20b55a5bf6089a582d1ac227a7144c975a191b8f751843","integrity":"sha256-I6DFY6SSZ4lNILVaW/YImlgtGsInpxRMl1oZG491GEM="},"flags/4x3/un-3760dc125288de6c2143060b283497dfed4de7430943f5be86a67d7668ede7a3.svg":{"logical_path":"flags/4x3/un.svg","mtime":"2022-05-27T21:42:11+02:00","size":19935,"digest":"6685994fae5d4918c5b6aa20ed98c3bc736bb1bd88ad2d86b40261682766791d","integrity":"sha256-ZoWZT65dSRjFtqog7ZjDvHNrsb2IrS2GtAJhaCdmeR0="},"flags/1x1/un-aac693764e62f5d0bccf80bc53f68bb6cde75b18c3b3829a89b79555df538c71.svg":{"logical_path":"flags/1x1/un.svg","mtime":"2022-05-27T21:42:11+02:00","size":20185,"digest":"774bae01cbe6a00e4daa93396d860d2ce3d53bb6a5a1f1470e11174fd9315d79","integrity":"sha256-d0uuAcvmoA5NqpM5bYYNLOPVO7alofFHDhEXT9kxXXk="},"flags/4x3/xk-c40be9a1d1844391b275542b4a4ef7a9eecac72a93b08e7f4f2f4ebb17c7538c.svg":{"logical_path":"flags/4x3/xk.svg","mtime":"2022-05-27T21:42:11+02:00","size":9643,"digest":"201401507976e570a410ef6fea6a56db0e05749575bf61ba04a86c7724c6b5c1","integrity":"sha256-IBQBUHl25XCkEO9v6mpW2w4FdJV1v2G6BKhsdyTGtcE="},"flags/1x1/xk-c5498f241b2608496ac30b7c8570d9dcd8f88432ea739ac0ca1abd7fd8beae99.svg":{"logical_path":"flags/1x1/xk.svg","mtime":"2022-05-27T21:42:11+02:00","size":8963,"digest":"a63525c9f71527db7258c39de2e41edb404955ffb3e5d2b9dd1a7f3173e3b028","integrity":"sha256-pjUlyfcVJ9tyWMOd4uQe20BJVf+z5dK53Rp/MXPjsCg="},"leaflet/dist/images/layers-0e356f4d554162eb71f127f50460dbc55d405027189ebe90b20729ef18d13d36.png":{"logical_path":"leaflet/dist/images/layers.png","mtime":"2022-05-27T21:42:11+02:00","size":696,"digest":"1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6","integrity":"sha256-Hbvp0CjikvNvy6j4s6KNXokydU/CIVuaxp5M3s9RB8Y="},"leaflet/dist/images/layers-2x-ba8fa601e413b14db27db07285ade3951721e02244c31523284ab2d1ed53c3dc.png":{"logical_path":"leaflet/dist/images/layers-2x.png","mtime":"2022-05-27T21:42:11+02:00","size":1259,"digest":"066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf","integrity":"sha256-Bm2sqFDY/77wB68AsG6sABVyje4nnFHzy2xxbffELt8="},"leaflet/dist/images/marker-icon-3d253116ec4ba0e1f22a01cdf1ff7f120fa4d89a6cd0933d68f12951d19809b4.png":{"logical_path":"leaflet/dist/images/marker-icon.png","mtime":"2022-05-27T21:42:11+02:00","size":1466,"digest":"574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437","integrity":"sha256-V0w6XMqF9BFAhbaEFZbWLwDXyJLHsD8oy/owHesdxDc="},"markers-soft-6743c1321400ff5ed1fb4c3b0a68a7f8857956084f426b6bb8bff03cab2b724e.png":{"logical_path":"markers-soft.png","mtime":"2022-05-27T21:42:11+02:00","size":41226,"digest":"e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739","integrity":"sha256-54eE5O1wqv/d1zwxX6tZAjPMTntyOI191HoUeW/Hxzk="},"markers-shadow-883ead799be0d0437c65d6172342237e860d121f35a2d215ce4170a8da302338.png":{"logical_path":"markers-shadow.png","mtime":"2022-05-27T21:42:11+02:00","size":535,"digest":"8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20","integrity":"sha256-hwOiJicQ9ePSnmXSrN+Q1lEuFZ4RnSe4I0cx2KYgiiA="},"markers-soft@2x-dd562751740663b74ed9a16c1484444d40fb95b79b8b1b13e5e12a2f8331c5e2.png":{"logical_path":"markers-soft@2x.png","mtime":"2022-05-27T21:42:11+02:00","size":66408,"digest":"c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf","integrity":"sha256-wedyU6i/vjDOwkiF1wRvRDt267ZvTJYfdwg7A/Sly68="},"markers-shadow@2x-64fe7e2740a7d015109cd31a498357dada39f7552caac379a8d1f0c18dc3d77c.png":{"logical_path":"markers-shadow@2x.png","mtime":"2022-05-27T21:42:11+02:00","size":1469,"digest":"b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a","integrity":"sha256-shpTa+JzE/tQT2n1iZ/wsSRbJ2VxdprAjWwyw1Z25Ho="},"events-a7f5ae2e6ebc11b14f50fa3c30086a81ee334fce202abf2164a59c7506157f27.js":{"logical_path":"events.js","mtime":"2022-04-11T11:07:12+02:00","size":1220,"digest":"c283ccc78ece3a385abad9d46d63074dd20a60f1f659497508e411d2885db042","integrity":"sha256-woPMx47OOjhautnUbWMHTdIKYPH2WUl1COQR0ohdsEI="},"filter-aec6405be3a059d4c6182c2b78a7d862e5879d378af79f10c70dd70115d76c69.js":{"logical_path":"filter.js","mtime":"2022-05-27T21:42:11+02:00","size":292,"digest":"24f50dadf4acd091d2c8cfba9367a9b855f35fd9f0639da5e415849d0ed973fe","integrity":"sha256-JPUNrfSs0JHSyM+6k2epuFXzX9nwY52l5BWEnQ7Zc/4="},"flash-757c43f7bcfec72eb8c147d7e40eea4373bbc31269904db4c67a187a13fc856e.js":{"logical_path":"flash.js","mtime":"2022-04-11T11:07:12+02:00","size":82,"digest":"5f872ba614f68bb8d9a9fbfa7d9924512f3b14dc2fb1aff1d758cc3ed4b89e86","integrity":"sha256-X4crphT2i7jZqfv6fZkkUS87FNwvsa/x11jMPtS4noY="},"frTypo-e14689364c33d905e570ab98d54aa6effd3d6a32bff772ff61f4d444a677b507.js":{"logical_path":"frTypo.js","mtime":"2022-05-27T21:42:11+02:00","size":1962,"digest":"762e24c77d91a3e790f17ab5c0765fbdc59e1ad22805ca195d08cd21098ea6c0","integrity":"sha256-di4kx32Ro+eQ8Xq1wHZfvcWeGtIoBcoZXQjNIQmOpsA="},"list-4bca572230746ba29b71588069332bc93e191c4d354e70ce7f4d79d6de930b2b.js":{"logical_path":"list.js","mtime":"2022-05-27T21:42:11+02:00","size":1272,"digest":"9086a09c3f0553d0a59267d93c88cde435231384cccf335faf61b54a2f6cf1fd","integrity":"sha256-kIagnD8FU9ClkmfZPIjN5DUjE4TMzzNfr2G1Si9s8f0="},"maps-e1374da0139727945cef18b9825aac8ff8385c42bd52e4392dfb6d5b42b9d0ee.js":{"logical_path":"maps.js","mtime":"2022-05-27T21:42:11+02:00","size":3760,"digest":"c738f275fdd8c7a76e6e798139b330d1226108b0b726ec890aa6bc6f54fa4b55","integrity":"sha256-xzjydf3Yx6dubnmBObMw0SJhCLC3JuyJCqa8b1T6S1U="},"moderations-1083e9b51d8fdacde5ae79ae6e653e83ea2f97cf547b76137bc7dc870b1cca1e.js":{"logical_path":"moderations.js","mtime":"2022-05-27T21:42:11+02:00","size":377,"digest":"156e7c9ecb717059ec7307f43821293e49fe9dbff00e7975e44e00cfb5b85f00","integrity":"sha256-FW58nstxcFnscwf0OCEpPkn+nb/wDnl15E4Az7W4XwA="},"notes-27cfb9694c5e92d25d972c2b4a2d2e222ad088aef866823f772241c1db423402.js":{"logical_path":"notes.js","mtime":"2022-04-11T11:07:12+02:00","size":31,"digest":"877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05","integrity":"sha256-h3rvMK4bBAq4o6uk4+MJoR1/JhL0Td5FC1wVeqX5XAU="},"orgas-27cfb9694c5e92d25d972c2b4a2d2e222ad088aef866823f772241c1db423402.js":{"logical_path":"orgas.js","mtime":"2022-04-11T11:07:12+02:00","size":31,"digest":"877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05","integrity":"sha256-h3rvMK4bBAq4o6uk4+MJoR1/JhL0Td5FC1wVeqX5XAU="},"pages-ebefad825b6310fe638f3e10bb941230b69ee16fc9de859ce670c3e282c2ba61.js":{"logical_path":"pages.js","mtime":"2022-05-27T21:42:11+02:00","size":999,"digest":"939136186053041a66f6a49df234e428ef919bf5e38ca32b598c49936e49a331","integrity":"sha256-k5E2GGBTBBpm9qSd8jTkKO+Rm/XjjKMrWYxJk25JozE="},"stats-57831421e685bf087e5d17e18193ec7b883975e14affaefeff0b1f2ad9cf1287.js":{"logical_path":"stats.js","mtime":"2022-05-27T21:42:11+02:00","size":908,"digest":"2fad1d4e90bf37b1003fae88e99dd37699a502faf0719ad26ef82fca226bedbc","integrity":"sha256-L60dTpC/N7EAP66I6Z3TdpmlAvrwcZrSbvgvyiJr7bw="},"_variables-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css":{"logical_path":"_variables.css","mtime":"2022-05-27T21:42:11+02:00","size":0,"digest":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","integrity":"sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="},"agendadescommuns-ab1dd655c34ee2e0df5088f7736a3fbef8628a0d45a392803f090d93b0fc3df8.css":{"logical_path":"agendadescommuns.css","mtime":"2022-04-04T22:49:05+02:00","size":939,"digest":"466535f97e0e0acefc4cdf77c9e639f129c5ffafaa0e9c10d35cf352bbf0b7e1","integrity":"sha256-RmU1+X4OCs78TN93yeY58SnF/6+qDpwQ01zzUrvwt+E="},"all-961f78ee92432ef39fd4ccd99a0f2f752e1a8edfb766706ceb1a339b255958d8.css":{"logical_path":"all.css","mtime":"2022-05-27T21:42:11+02:00","size":2745,"digest":"476b12285811ba1e901faf0d586c7204587e4f6146dcbd5c18880343213148ba","integrity":"sha256-R2sSKFgRuh6QH68NWGxyBFh+T2FG3L1cGIgDQyExSLo="},"digest-104627419d74f190311b5b3cdf13e9d62090ec931cdcba30c9b4cf162f340e60.css":{"logical_path":"digest.css","mtime":"2022-05-27T21:42:11+02:00","size":304,"digest":"06bf2110a5b93d28bca1a32734b89c3c4dd3caa8e10120f38a20692bc71aa332","integrity":"sha256-Br8hEKW5PSi8oaMnNLicPE3TyqjhASDziiBpK8caozI="},"events-d9e1b532f35eb6989074796a0875e059dec3f25def65cebf9844c6a88a74a212.css":{"logical_path":"events.css","mtime":"2020-08-25T22:06:58+02:00","size":3105,"digest":"c344fcdfed8866528231502e01ee11c5d8991c0e563ef66e4e96ad6076d1ad82","integrity":"sha256-w0T83+2IZlKCMVAuAe4RxdiZHA5WPvZuTpatYHbRrYI="},"frTypo-3ac4d503c4f2ecb1b79218c06eae720b3be67dc97f345d88742d0169534c73ee.css":{"logical_path":"frTypo.css","mtime":"2022-05-27T21:42:11+02:00","size":76,"digest":"dd9a26629b927d9092b736a713f5385aa2ab7131d169b966af590efc98efc28e","integrity":"sha256-3ZomYpuSfZCStzanE/U4WqKrcTHRablmr1kO/Jjvwo4="},"list-9d2f947b86b004dad844b0af880ab8a0e69489d370d0bd1a2592d8bfcb817114.css":{"logical_path":"list.css","mtime":"2022-05-22T13:48:05+02:00","size":940,"digest":"855c0cac2596c2fa96db629780341897a59b844f736ee1d0911094f0232bb144","integrity":"sha256-hVwMrCWWwvqW22KXgDQYl6WbhE9zbuHQkRCU8CMrsUQ="},"maps-725c7d4efc62c8c339fee78c80a21b5282c666f0a86f10799ca2a9f44dea33cd.css":{"logical_path":"maps.css","mtime":"2022-05-27T21:42:11+02:00","size":524,"digest":"895f1cec08a618420ef7bde0e505b4a6b0f22afc8773292772b839454c9b7cef","integrity":"sha256-iV8c7AimGEIO973g5QW0prDyKvyHcykncrg5RUybfO8="},"mobile-f85c37d44d2b40fbcdf2ca4a3e992b55a271deb6d69e48cf302fd68c24e47e75.css":{"logical_path":"mobile.css","mtime":"2022-05-27T21:42:11+02:00","size":2414,"digest":"c133d9210649332e4a2a9ef18d1a875d5e45f4c4ed33bd87b3e397f380295b13","integrity":"sha256-wTPZIQZJMy5KKp7xjRqHXV5F9MTtM72Hs+OX84ApWxM="},"moderations-0096ff2dbaaf4cb827c0ea9595246185e8f6eb1201a95ad47383204f767cfbb7.css":{"logical_path":"moderations.css","mtime":"2022-05-27T21:42:11+02:00","size":979,"digest":"0b13066128bc39777aa2b7d5b0cad43ea41ff4b61be65391af2428f73e305713","integrity":"sha256-CxMGYSi8OXd6orfVsMrUPqQf9LYb5lORryQo9z4wVxM="},"notes-dfb4401eda9f1493c47d21bfde74b3bea884e032b8475dc754f9f1fb3689796d.css":{"logical_path":"notes.css","mtime":"2022-05-27T21:42:11+02:00","size":37,"digest":"de9e03f3da58d90b03f29332c00aac287d76eed775a23e6b567584942a7ae59b","integrity":"sha256-3p4D89pY2QsD8pMywAqsKH127td1oj5rVnWElCp65Zs="},"orgas-bf3c0aa4f00bc446c1ccfdb4cd77994db2fa465436c6420c22bebab5738409a7.css":{"logical_path":"orgas.css","mtime":"2022-05-27T21:42:11+02:00","size":672,"digest":"3531ea042e606b9fa72c1537c10e81cb2162db3ec0c666542a071d16755e3587","integrity":"sha256-NTHqBC5ga5+nLBU3wQ6ByyFi2z7AxmZUKgcdFnVeNYc="},"pages-b29917202190ced028521961bd8de890197e6987a2e5c8e871dbfaf2ea51fa9e.css":{"logical_path":"pages.css","mtime":"2022-05-27T21:42:11+02:00","size":75,"digest":"c16cf97ac164b6d264da18f962575cc3b816bd0d580b6066eb18a288c15eb262","integrity":"sha256-wWz5esFkttJk2hj5Yldcw7gWvQ1YC2Bm6xiiiMFesmI="},"region-da39e2fee3e61e44603f5248317352e5901effd4339eccb6cb8c14df81319115.css":{"logical_path":"region.css","mtime":"2022-05-27T21:42:11+02:00","size":1871,"digest":"29b0491c3dffc664d733abe92626c536ea73b776a64cc388a462734d5a622b25","integrity":"sha256-KbBJHD3/xmTXM6vpJibFNupzt3amTMOIpGJzTVpiKyU="},"scaffolds-f62d5fc6ab54601c38d8281da2a240b651784b27a628a5d6c328df499c3dbeac.css":{"logical_path":"scaffolds.css","mtime":"2022-05-27T21:42:11+02:00","size":430,"digest":"36de46ca38d276fda0d4e32b27fe03c5f01f64dfe7e5e304603e2cf8dfb8c026","integrity":"sha256-Nt5GyjjSdv2g1OMrJ/4DxfAfZN/n5eMEYD4s+N+4wCY="},"sessions-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css":{"logical_path":"sessions.css","mtime":"2022-05-27T21:42:11+02:00","size":0,"digest":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","integrity":"sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="},"stats-f9fe4057e217c7e56a4bd9cc12618d1ff98805bb494f368a6dcce15d9b9ef0c3.css":{"logical_path":"stats.css","mtime":"2022-05-27T21:42:11+02:00","size":505,"digest":"d64a7e3bf89c64a6b497f3fe7406d2dca6754bd58211919e5695a0fedb2f82ca","integrity":"sha256-1kp+O/icZKa0l/P+dAbS3KZ1S9WCEZGeVpWg/tsvgso="},"tags-fd1c7a90a96d15f57a9d27860a1192f4daf34dc715ca12e9db90efb3dac04955.css":{"logical_path":"tags.css","mtime":"2022-05-27T21:42:11+02:00","size":1377,"digest":"c12d6dffd42d48506a8b26350abb85d9a7bc55f503425ca1b385eab3f5a1b623","integrity":"sha256-wS1t/9QtSFBqiyY1CruF2ae8VfUDQlyhs4Xqs/WhtiM="},"versions-51d9b0340f6b1229364dc45dd44b1b81253212ccac013d642313f59ac833138e.css":{"logical_path":"versions.css","mtime":"2022-05-27T21:42:11+02:00","size":47,"digest":"afa71ba5e90cef6382083024b224b8e7a0a3874b916d1ada8a39e7ce104d9349","integrity":"sha256-r6cbpekM72OCCDAksiS456Cjh0uRbRraijnnzhBNk0k="},"active_admin-fa324a48fc3623783207dec8f6f2e0655c23b9fdf25b5a389fae2e2dbc8714b5.js":{"logical_path":"active_admin.js","mtime":"2022-04-04T22:49:05+02:00","size":970388,"digest":"215c32cb7b56c2d9e58917199da608688b4e7d26dd1882df4a38c51dd3b0670f","integrity":"sha256-IVwyy3tWwtnliRcZnaYIaItOfSbdGILfSjjFHdOwZw8="},"font-awesome/fa-brands-400-c7bb2b5eb0a3d70f8cae2e7c911c998f25c44edf802c42d07280f12535928d93.eot":{"logical_path":"font-awesome/fa-brands-400.eot","mtime":"2020-10-11T20:13:15+02:00","size":133034,"digest":"811e1577184066108ceca86d5a624a9012303df5206c5cb0b27d5e3fedcba5a3","integrity":"sha256-gR4VdxhAZhCM7KhtWmJKkBIwPfUgbFywsn1eP+3LpaM="},"font-awesome/fa-regular-400-044ec7e8c278316fb4733fd045a24750b1efb2840bfeeb04339cbb8880a2bd29.eot":{"logical_path":"font-awesome/fa-regular-400.eot","mtime":"2020-10-11T20:13:15+02:00","size":34390,"digest":"01f4416f5db59e2dd6b6fbd9dc32336d99db18f7eb623a49f584d04afd279473","integrity":"sha256-AfRBb121ni3WtvvZ3DIzbZnbGPfrYjpJ9YTQSv0nlHM="},"font-awesome/fa-solid-900-70f7add4456e350cd00006faed301edc96d849a348d60e2b8b2b17f154a03699.eot":{"logical_path":"font-awesome/fa-solid-900.eot","mtime":"2020-10-11T20:13:15+02:00","size":202902,"digest":"32501727bb23fc77615b1ec76b5f298ec22198c0f3d6a3e7d6fe4ac3cf315db9","integrity":"sha256-MlAXJ7sj/HdhWx7Ha18pjsIhmMDz1qPn1v5Kw88xXbk="},"font-awesome/fa-brands-400-5c6bfccd45ecb5926eb5a767f2cb7843b7df9c0dc9f1d6f4c706a0b452a9c9aa.svg":{"logical_path":"font-awesome/fa-brands-400.svg","mtime":"2020-10-11T20:13:15+02:00","size":715890,"digest":"02340ba1789d09bcc507563c89c4a847ba537bb8132082777a50519cf74bcb5b","integrity":"sha256-AjQLoXidCbzFB1Y8icSoR7pTe7gTIIJ3elBRnPdLy1s="},"font-awesome/fa-regular-400-80980990a4a1c9f37d1c8049f1124dae455adf1952a1febeaa9e75dea67f6f2c.svg":{"logical_path":"font-awesome/fa-regular-400.svg","mtime":"2020-10-11T20:13:15+02:00","size":144322,"digest":"865fd23de13b1920280e182359579e09eff7a09eb24676eceec7552838559f55","integrity":"sha256-hl/SPeE7GSAoDhgjWVeeCe/3oJ6yRnbs7sdVKDhVn1U="},"font-awesome/fa-solid-900-1a8cd60f1e07ec25f1d89d37fbee0504b3403451cac293266abbc5edcdc22f84.svg":{"logical_path":"font-awesome/fa-solid-900.svg","mtime":"2020-10-11T20:13:15+02:00","size":897426,"digest":"e768539808757f7eec20f09c9ee9b36b0e6c5636e90c9ee697995cbbc6ee0555","integrity":"sha256-52hTmAh1f37sIPCcnumzaw5sVjbpDJ7ml5lcu8buBVU="},"font-awesome/fa-brands-400-83a7ed1e0101c6ad43b92b11a7d40b8ee3340b9067bd6dda6f4945e4a222e525.ttf":{"logical_path":"font-awesome/fa-brands-400.ttf","mtime":"2020-10-11T20:13:15+02:00","size":132728,"digest":"a0c145382acfe59767d1487d6505f349665b685c2885cd91b621d141a292b0f8","integrity":"sha256-oMFFOCrP5Zdn0Uh9ZQXzSWZbaFwohc2RtiHRQaKSsPg="},"font-awesome/fa-regular-400-0d79d110605b201387bc02ab87f8c4a90214e7c8c051a36fc07841b101d89b8b.ttf":{"logical_path":"font-awesome/fa-regular-400.ttf","mtime":"2020-10-11T20:13:15+02:00","size":34092,"digest":"f32b94a29060dfec0c797a1dfe111357eb1d682f1aca4ac4b95cf0f4c3e2bfa9","integrity":"sha256-8yuUopBg3+wMeXod/hETV+sdaC8aykrEuVzw9MPiv6k="},"font-awesome/fa-brands-400-7128310d2a1108f27977e17afb15f98ca801e1a1b6dbdeff9e54e98c8174680f.woff":{"logical_path":"font-awesome/fa-brands-400.woff","mtime":"2020-10-11T20:13:15+02:00","size":89824,"digest":"e836c5d5dfc13e18170c5bddefb4fdac7c65ac0ad43a4b431acdc4a98865a260","integrity":"sha256-6DbF1d/BPhgXDFvd77T9rHxlrArUOktDGs3EqYhlomA="},"font-awesome/fa-solid-900-f18f81ea97211566a85df22d1a5ead1629af06a7dae24295ae9397305dc5ac1e.ttf":{"logical_path":"font-awesome/fa-solid-900.ttf","mtime":"2020-10-11T20:13:15+02:00","size":202616,"digest":"231d68cefbc6846fb78cafca8467401a4f371e226418662e8900e3d52adc00ab","integrity":"sha256-Ix1ozvvGhG+3jK/KhGdAGk83HiJkGGYuiQDj1SrcAKs="},"font-awesome/fa-regular-400-24780b83ab131e05f767ca0758d9dee738a2c10f3cd17329a3f5bafd59dde1ba.woff":{"logical_path":"font-awesome/fa-regular-400.woff","mtime":"2020-10-11T20:13:15+02:00","size":16800,"digest":"8e2d96198711b63752e5f2f5987b8ffc536df6156a065bdbe28cb7231cad793d","integrity":"sha256-ji2WGYcRtjdS5fL1mHuP/FNt9hVqBlvb4oy3IxyteT0="},"font-awesome/fa-solid-900-fcaef3c02b9c52f7008cea5aaebf2c55a9b4a3740ef894986a66dcd4684984da.woff":{"logical_path":"font-awesome/fa-solid-900.woff","mtime":"2020-10-11T20:13:15+02:00","size":103300,"digest":"352f8ead280419dd953d2bc7843386bb9430e8152c2dbd2c2d2494f6b9567ee7","integrity":"sha256-NS+OrSgEGd2VPSvHhDOGu5Qw6BUsLb0sLSSU9rlWfuc="},"font-awesome/fa-brands-400-72bee120684b8ed53b9010f36ee025e0342b95149c15ca8f5f58b94e2519d20e.woff2":{"logical_path":"font-awesome/fa-brands-400.woff2","mtime":"2020-10-11T20:13:15+02:00","size":76612,"digest":"5d9190292acdd48ba0fc35080f7e7448f3cdf0d79199a4d23f0f49b5341fdf29","integrity":"sha256-XZGQKSrN1Iug/DUID350SPPN8NeRmaTSPw9JtTQf3yk="},"font-awesome/fa-regular-400-95d99bc7759d6a77d81373510604b63c0ad9295fdbb1f6c9da0c923f4e221178.woff2":{"logical_path":"font-awesome/fa-regular-400.woff2","mtime":"2020-10-11T20:13:15+02:00","size":13584,"digest":"6a8c8e9e1e7f692c21af1956de163f3d026778e6449fe93a09a671847ca1ae65","integrity":"sha256-aoyOnh5/aSwhrxlW3hY/PQJneOZEn+k6CaZxhHyhrmU="},"font-awesome/fa-solid-900-eb9871633db8a4d7b8d66ceb6ef158e2f970bf4d2df6e2ee3122db7c19b285bc.woff2":{"logical_path":"font-awesome/fa-solid-900.woff2","mtime":"2020-10-11T20:13:15+02:00","size":79444,"digest":"7f4d3fd0a705dbf8403298aad91d5de6972e6b5d536068eba8b24954a5a0a8c7","integrity":"sha256-f00/0KcF2/hAMpiq2R1d5pcua11TYGjrqLJJVKWgqMc="},"tinymce/icons/default/icons-a0721895c1cc12748bd1564f906fa27587b5c76ba1598ef53ffc24ecb6b134ab.js":{"logical_path":"tinymce/icons/default/icons.js","mtime":"2022-04-04T22:49:05+02:00","size":59777,"digest":"ddd17f2284b062bccfd1e7c328a83dcba711c4e5a6d983186d57f8b3f562d1e5","integrity":"sha256-3dF/IoSwYrzP0efDKKg9y6cRxOWm2YMYbVf4s/Vi0eU="},"tinymce/jquery.tinymce-3816ed398fa3cae7cfa3778396c3080cc77f7a98cf6f76c09d5fd87ac5717060.js":{"logical_path":"tinymce/jquery.tinymce.js","mtime":"2022-04-04T22:49:05+02:00","size":6672,"digest":"53f3d77f3bb11c570f09d619c464576ff15d53fa4b873d6b3be64cf4c7d833a3","integrity":"sha256-U/PXfzuxHFcPCdYZxGRXb/FdU/pLhz1rO+ZM9MfYM6M="},"tinymce/skins/ui/oxide-dark/content-82b23fc208c58885dd3a684961bc4c4e50e700d500067ba7cdbb655ffd8a92c2.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.css","mtime":"2021-02-12T23:07:40+01:00","size":21145,"digest":"bdea9b449c26b0ab6e354272afdeef7c2132365a15e30a10b96c9af34bb34658","integrity":"sha256-veqbRJwmsKtuNUJyr97vfCEyNloV4woQuWya80uzRlg="},"tinymce/skins/ui/oxide-dark/content.inline-8ec549ee74d93d7dcbc40d60b714c30c5036ad91a0f5078a528a5c45bc95bfc3.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.css","mtime":"2021-02-12T23:07:40+01:00","size":21473,"digest":"ee41633c307dcc6ef61edc46e1700041ed97a0e00e3ea8d1f4647d577552e388","integrity":"sha256-7kFjPDB9zG72HtxG4XAAQe2XoOAOPqjR9GR9V3VS44g="},"tinymce/skins/ui/oxide-dark/content.inline.min-8ec549ee74d93d7dcbc40d60b714c30c5036ad91a0f5078a528a5c45bc95bfc3.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.min.css","mtime":"2021-02-12T23:07:40+01:00","size":21473,"digest":"ee41633c307dcc6ef61edc46e1700041ed97a0e00e3ea8d1f4647d577552e388","integrity":"sha256-7kFjPDB9zG72HtxG4XAAQe2XoOAOPqjR9GR9V3VS44g="},"tinymce/skins/ui/oxide-dark/content.min-82b23fc208c58885dd3a684961bc4c4e50e700d500067ba7cdbb655ffd8a92c2.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.min.css","mtime":"2021-02-12T23:07:40+01:00","size":21145,"digest":"bdea9b449c26b0ab6e354272afdeef7c2132365a15e30a10b96c9af34bb34658","integrity":"sha256-veqbRJwmsKtuNUJyr97vfCEyNloV4woQuWya80uzRlg="},"tinymce/skins/ui/oxide-dark/skin-d6cff5f3694e1247623976b2a5f47f5729b728074ffb7d28a4df0be06e1c2bdd.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.css","mtime":"2021-02-12T23:07:40+01:00","size":59083,"digest":"0d4ac6b5f3f3257f3f1370c3ef27a5e6851cbf540ac2f367b9802f53fd3678cd","integrity":"sha256-DUrGtfPzJX8/E3DD7yel5oUcv1QKwvNnuYAvU/02eM0="},"tinymce/skins/ui/oxide-dark/skin.min-d6cff5f3694e1247623976b2a5f47f5729b728074ffb7d28a4df0be06e1c2bdd.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.min.css","mtime":"2021-02-12T23:07:40+01:00","size":59083,"digest":"0d4ac6b5f3f3257f3f1370c3ef27a5e6851cbf540ac2f367b9802f53fd3678cd","integrity":"sha256-DUrGtfPzJX8/E3DD7yel5oUcv1QKwvNnuYAvU/02eM0="},"tinymce/skins/ui/oxide/content-1d31a6efe041f504ca2859311365c447ea1ecc576f9b55c39398a1174f9aa665.css":{"logical_path":"tinymce/skins/ui/oxide/content.css","mtime":"2021-02-12T23:07:40+01:00","size":21532,"digest":"20b832b6f829c58bd50cfc48897ba96434ebdaa89fc5ea5de81fb0195ab7ca3b","integrity":"sha256-ILgytvgpxYvVDPxIiXupZDTr2qifxepd6B+wGVq3yjs="},"tinymce/skins/ui/oxide/content.inline-8ec549ee74d93d7dcbc40d60b714c30c5036ad91a0f5078a528a5c45bc95bfc3.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.css","mtime":"2021-02-12T23:07:40+01:00","size":21473,"digest":"ee41633c307dcc6ef61edc46e1700041ed97a0e00e3ea8d1f4647d577552e388","integrity":"sha256-7kFjPDB9zG72HtxG4XAAQe2XoOAOPqjR9GR9V3VS44g="},"tinymce/skins/ui/oxide/content.inline.min-8ec549ee74d93d7dcbc40d60b714c30c5036ad91a0f5078a528a5c45bc95bfc3.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.min.css","mtime":"2021-02-12T23:07:40+01:00","size":21473,"digest":"ee41633c307dcc6ef61edc46e1700041ed97a0e00e3ea8d1f4647d577552e388","integrity":"sha256-7kFjPDB9zG72HtxG4XAAQe2XoOAOPqjR9GR9V3VS44g="},"tinymce/skins/ui/oxide/content.min-1d31a6efe041f504ca2859311365c447ea1ecc576f9b55c39398a1174f9aa665.css":{"logical_path":"tinymce/skins/ui/oxide/content.min.css","mtime":"2021-02-12T23:07:40+01:00","size":21532,"digest":"20b832b6f829c58bd50cfc48897ba96434ebdaa89fc5ea5de81fb0195ab7ca3b","integrity":"sha256-ILgytvgpxYvVDPxIiXupZDTr2qifxepd6B+wGVq3yjs="},"tinymce/skins/ui/oxide/skin-558a25b7a5da587053e6de82f63e47bd5eb343c80d4b1dfd2b6ec587b62d29ec.css":{"logical_path":"tinymce/skins/ui/oxide/skin.css","mtime":"2021-02-12T23:07:40+01:00","size":59206,"digest":"491e79784e3bce03a78d1054d67b7960c71b56588a97c537d514511b2a613ad1","integrity":"sha256-SR55eE47zgOnjRBU1nt5YMcbVliKl8U31RRRGyphOtE="},"tinymce/skins/ui/oxide/skin.min-558a25b7a5da587053e6de82f63e47bd5eb343c80d4b1dfd2b6ec587b62d29ec.css":{"logical_path":"tinymce/skins/ui/oxide/skin.min.css","mtime":"2021-02-12T23:07:40+01:00","size":59206,"digest":"491e79784e3bce03a78d1054d67b7960c71b56588a97c537d514511b2a613ad1","integrity":"sha256-SR55eE47zgOnjRBU1nt5YMcbVliKl8U31RRRGyphOtE="},"events-f6adf5fd5d2bef673919b4d5db87b539121c6c3cf5a70c1a0e0fec222c194dd3.css":{"logical_path":"events.css","mtime":"2022-05-27T21:42:11+02:00","size":3091,"digest":"d2a3722ae64a61c49d138ba3a893a394ee2eeb5a2187abf0779d0fc81853992b","integrity":"sha256-0qNyKuZKYcSdE4ujqJOjlO4u61ohh6vwd50PyBhTmSs="},"font-awesome/fa-regular-400-00c96447c535a41055597d80db75302fc04fd1c909239eada694daa76cd77a20.svg":{"logical_path":"font-awesome/fa-regular-400.svg","mtime":"2022-04-04T22:49:05+02:00","size":144714,"digest":"d42a64dc349a98075e8be12587943f2bd52065a8bb18960d7dc7390b535117e0","integrity":"sha256-1Cpk3DSamAdei+Elh5Q/K9UgZai7GJYNfcc5C1NRF+A="},"font-awesome/fa-regular-400-180eef6acca110a022bb81621c04937b3d2edf09fb7644daba7f95368e73b0bd.woff":{"logical_path":"font-awesome/fa-regular-400.woff","mtime":"2022-04-04T22:49:05+02:00","size":16772,"digest":"6799c999e422710f40f70a60a6138fc38106226c44d7bd1b1023f5bb65befef9","integrity":"sha256-Z5nJmeQicQ9A9wpgphOPw4EGImxE170bECP1u2W+/vk="},"font-awesome/fa-brands-400-8b2dc7ace7b22f70f42c11f1606d1ee82ad46445c2f05587928e239e567ff68e.woff":{"logical_path":"font-awesome/fa-brands-400.woff","mtime":"2022-04-04T22:49:05+02:00","size":92136,"digest":"a0375c054a0041bd58e2a0bf7fa3df7c3904bfc4f790fd24e32ff3ee70fd0eef","integrity":"sha256-oDdcBUoAQb1Y4qC/f6PffDkEv8T3kP0k4y/z7nD9Du8="},"font-awesome/fa-solid-900-195989f30d333ecf41e0021dbb92c690f367d2672c43199079d9be4b81dc90da.woff":{"logical_path":"font-awesome/fa-solid-900.woff","mtime":"2022-04-04T22:49:05+02:00","size":104280,"digest":"aab971ade1633ab836222074ceae0aad8a082d900908f27491b221d6e83998ca","integrity":"sha256-qrlxreFjOrg2IiB0zq4KrYoILZAJCPJ0kbIh1ug5mMo="},"font-awesome/fa-solid-900-74883516ac6bb785f2d12d162d769fa7a8fabc7794ef44fc28ffc375b2d7c27c.eot":{"logical_path":"font-awesome/fa-solid-900.eot","mtime":"2022-04-04T22:49:05+02:00","size":204814,"digest":"e0e3c4af28348d721f8af603595c15d273a56f2b03392f9a413255fe5635f536","integrity":"sha256-4OPEryg0jXIfivYDWVwV0nOlbysDOS+aQTJV/lY19TY="},"font-awesome/fa-brands-400-c40f9aba3abc6fd5b0b28b1b125daa3b7bc43063955d456ae4d529705a6c975c.woff2":{"logical_path":"font-awesome/fa-brands-400.woff2","mtime":"2022-04-04T22:49:05+02:00","size":78460,"digest":"71b3ce72680f4183d28db86b184542051fd533bb1146933233e4f6a20cf98cba","integrity":"sha256-cbPOcmgPQYPSjbhrGEVCBR/VM7sRRpMyM+T2ogz5jLo="},"font-awesome/fa-solid-900-e546fb3c56953992a5d20c52edb9e6d1b1141184b88ae19ba20a566d2ad98dbc.woff2":{"logical_path":"font-awesome/fa-solid-900.woff2","mtime":"2022-04-04T22:49:05+02:00","size":80300,"digest":"6b555920e358f8a25a422988b448615c33bcccb4f932e8331cebfc8e2a737fc7","integrity":"sha256-a1VZIONY+KJaQimItEhhXDO8zLT5MugzHOv8jipzf8c="},"font-awesome/fa-regular-400-1efbec653801e7e6a8ea0cd94afd854c3d48225b52857008fe8a1d961cdfcc51.woff2":{"logical_path":"font-awesome/fa-regular-400.woff2","mtime":"2022-04-04T22:49:05+02:00","size":13548,"digest":"ce20ed8a323117c8a718ff1ddc6dabb997373b575a8e896f2bf02b846c082c9d","integrity":"sha256-ziDtijIxF8inGP8d3G2ruZc3O1dajolvK/ArhGwILJ0="},"font-awesome/fa-brands-400-b077551ebb83f7299deaa16b45877ddd3eda20c4988ac79b6def416e7d2b6b3a.svg":{"logical_path":"font-awesome/fa-brands-400.svg","mtime":"2022-04-04T22:49:05+02:00","size":747545,"digest":"e2749cb24a77208abdd9fda35f0d14f091948c44d21f977c8048a3b13e4beccb","integrity":"sha256-4nScskp3IIq92f2jXw0U8JGUjETSH5d8gEijsT5L7Ms="},"font-awesome/fa-solid-900-aa4b725084f0ad0d2d28df4191084467663b409d7272ba2f1cb6ece2d03553ec.ttf":{"logical_path":"font-awesome/fa-solid-900.ttf","mtime":"2022-04-04T22:49:05+02:00","size":204528,"digest":"2caded242c04139761742fe0cda7f6592df1b6686857532c8a7c2e2536b976e4","integrity":"sha256-LK3tJCwEE5dhdC/gzaf2WS3xtmhoV1MsinwuJTa5duQ="},"font-awesome/fa-regular-400-aa1ea349a5a1557fdd700fa5b27df5a01e3b49761201c4d5a95c442e4f7b72c7.eot":{"logical_path":"font-awesome/fa-regular-400.eot","mtime":"2022-04-04T22:49:05+02:00","size":34350,"digest":"f9853ad337d523c0b35fe7ac306268a7035ce0ff7624710ed8b39c2b88b20a33","integrity":"sha256-+YU60zfVI8CzX+esMGJopwNc4P92JHEO2LOcK4iyCjM="},"font-awesome/fa-regular-400-6fdc7b823f89434983845ce3435fa374af7e08912068b8955bdd6c697f1d2797.ttf":{"logical_path":"font-awesome/fa-regular-400.ttf","mtime":"2022-04-04T22:49:05+02:00","size":34052,"digest":"5e811f0b32d488b9a183b77cfc7ac1ef44b3ea7aaed014e83975dfe597d221f6","integrity":"sha256-XoEfCzLUiLmhg7d8/HrB70Sz6nqu0BToOXXf5ZfSIfY="},"font-awesome/fa-brands-400-361037e19d0b6000027564e9edcad98c8a179be70c6c4e0a6ab54cd6d41685bd.eot":{"logical_path":"font-awesome/fa-brands-400.eot","mtime":"2022-04-04T22:49:05+02:00","size":136822,"digest":"6128dd44fed3a046ff8d835d677e0a837c70c64dc1c944b7edfde04eb8d8b879","integrity":"sha256-YSjdRP7ToEb/jYNdZ34Kg3xwxk3ByUS37f3gTrjYuHk="},"font-awesome/fa-solid-900-387bea778f72246fad5ea5b69f68cd059a942e3ab181eb2390ad089bc9cc5e06.svg":{"logical_path":"font-awesome/fa-solid-900.svg","mtime":"2022-04-04T22:49:05+02:00","size":917575,"digest":"1a46e780ce5beb6507d62af8b20a92b33c8f042e87c612f4bbf8330bfc353419","integrity":"sha256-GkbngM5b62UH1ir4sgqSszyPBC6HxhL0u/gzC/w1NBk="},"font-awesome/fa-brands-400-070fe2507cabb066093e6912b85147f7289f5dbb5b582d5c6aea80f9c406dcc5.ttf":{"logical_path":"font-awesome/fa-brands-400.ttf","mtime":"2022-04-04T22:49:05+02:00","size":136516,"digest":"404d6083193e569bc5c28c7b1bc0e13ece80c6e0f5a50ad8e9633f48f3c09155","integrity":"sha256-QE1ggxk+VpvFwox7G8DhPs6AxuD1pQrY6WM/SPPAkVU="},"active_admin-e0f6649ee407880d5fc6aafbd4a271a0e428557143e7bb63f7e2278f85f503cb.css":{"logical_path":"active_admin.css","mtime":"2022-04-04T22:49:05+02:00","size":110644,"digest":"a9992ff353a623ad961590bfb95cfb190b5c1459dff4c3903371383e8c6a4e65","integrity":"sha256-qZkv81OmI62WFZC/uVz7GQtcFFnf9MOQM3E4PoxqTmU="},"lef-38da607e793696b80e684feb25a45fe9afcab6d8d105a6f6a098d5ccfc17cb41.png":{"logical_path":"lef.png","mtime":"2022-05-27T21:42:11+02:00","size":15813,"digest":"ca7ff4a8b3832079dff4da7cdf4e5931718986c5350e5e9092f167f58d51e096","integrity":"sha256-yn/0qLODIHnf9Np8305ZMXGJhsU1Dl6QkvFn9Y1R4JY="},"tinymce-6dc92f373ffb41a60c165e1e1115d0660312460024ba3313132a24a8392cfb6b.js":{"logical_path":"tinymce.js","mtime":"2022-04-04T22:49:05+02:00","size":1072457,"digest":"7957c8d3a63f3daf3ba4a2d7baa9de4131c7701c1c99e84444c24cebd6070916","integrity":"sha256-eVfI06Y/Pa87pKLXuqneQTHHcBwcmehERMJM69YHCRY="},"tinymce/plugins/advlist/plugin-0830d7523521ce3db26326e0306b44ffeacc51a4600b708613d980630f6bcf67.js":{"logical_path":"tinymce/plugins/advlist/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":3834,"digest":"6eb14e5dfe896b0ff7624b523e1ac00e58043a1412e9a6aa1b62d36dd9562f46","integrity":"sha256-brFOXf6Jaw/3YktSPhrADlgEOhQS6aaqG2LTbdlWL0Y="},"tinymce/plugins/anchor/plugin-5759a6ef5b0eae09fb63b4e990b7cd3152e66da3bea15fa73a6026efef19db0b.js":{"logical_path":"tinymce/plugins/anchor/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":2785,"digest":"cad4097e1617ea555b548e7040d270f67b214bdffc29220e79fb20cc12e56bca","integrity":"sha256-ytQJfhYX6lVbVI5wQNJw9nshS9/8KSIOefsgzBLla8o="},"tinymce/plugins/autolink/plugin-62aa356eb273683f0318da0d90dd0956a7ef3c4d3550eff42a6dd8903093b69d.js":{"logical_path":"tinymce/plugins/autolink/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":2432,"digest":"54cff7f5e1f0ba619bc0953309693db256cf41566a21b8144e05980a09f3da8c","integrity":"sha256-VM/39eHwumGbwJUzCWk9slbPQVZqIbgUTgWYCgnz2ow="},"tinymce/plugins/autoresize/plugin-4b1fea682644da19d56a5531948325a242eb44ba261bcd0fe691a5d343fc9c5c.js":{"logical_path":"tinymce/plugins/autoresize/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":2207,"digest":"a029136f93be0ed73aa93572dc5de086b8d136fc141045e47573933a7e56c80a","integrity":"sha256-oCkTb5O+Dtc6qTVy3F3ghrjRNvwUEEXkdXOTOn5WyAo="},"tinymce/plugins/autosave/plugin-c809421e9832e7dc7e468c94ee43fe6d6d58f8744ddd8d9db143717328c535d6.js":{"logical_path":"tinymce/plugins/autosave/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":3000,"digest":"30edb1720706f72d548be33efb3bbb96e204bbc77efde0dcd90c2a79fb4d449d","integrity":"sha256-MO2xcgcG9y1Ui+M++zu7luIEu8d+/eDc2QwqeftNRJ0="},"tinymce/plugins/bbcode/plugin-e309740f6d264b6799abdd06120d9a84b66455e80f37062e68b5a90b15c9ec52.js":{"logical_path":"tinymce/plugins/bbcode/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":3106,"digest":"1bd9313ae3beb667ab4a8775913e5315e971f30589955384517ad1af98f46b5f","integrity":"sha256-G9kxOuO+tmerSod1kT5TFelx8wWJlVOEUXrRr5j0a18="},"tinymce/plugins/charmap/plugin-5b4d6604bea0d9f0f2524830cc53e3e83a30fba669cd02625364b98bba364819.js":{"logical_path":"tinymce/plugins/charmap/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":11995,"digest":"a56e321002c8f1eaa6f96544ad2c8dab5ca09db1d31dc89b65dfb68c19e9de44","integrity":"sha256-pW4yEALI8eqm+WVErSyNq1ygnbHTHcibZd+2jBnp3kQ="},"tinymce/plugins/code/plugin-44b740fc595ca3972eeca89621a6cab8b661afb718be3a2cd89df11a001f8d58.js":{"logical_path":"tinymce/plugins/code/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1149,"digest":"1ebe5592efa18eb728d6e03251d4bab98c9495288aca7c385b0589e93fd7b862","integrity":"sha256-Hr5Vku+hjrco1uAyUdS6uYyUlSiKynw4WwWJ6T/XuGI="},"tinymce/plugins/codesample/plugin-75290cb947814de3c8f1cb2df0c339077b7e26775cbdf7c14881f6f4e65ae433.js":{"logical_path":"tinymce/plugins/codesample/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":44694,"digest":"2e6d10bbb0bacf89f563e4db20e2c9c36b248cf7147e0b3d36ec56fe6214d348","integrity":"sha256-Lm0Qu7C6z4n1Y+TbIOLJw2skjPcUfgs9NuxW/mIU00g="},"tinymce/plugins/colorpicker/plugin-7966e073c54085e60d16e469b806b437a273a062313f5115556c8e650eaf28ef.js":{"logical_path":"tinymce/plugins/colorpicker/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":516,"digest":"922a06ef9acb5648c229ec500eb1e2a4b7a23179eb94c228eb38f8fab778866e","integrity":"sha256-kioG75rLVkjCKexQDrHipLeiMXnrlMIo6zj4+rd4hm4="},"tinymce/plugins/contextmenu/plugin-db9f636edf9d29e26b85961045d9b777f70e1ade79b1482a8beac2e47ffb584d.js":{"logical_path":"tinymce/plugins/contextmenu/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":516,"digest":"e4d00ec37016d98315cb5279ebef620ebdcb2fba96c52f2bb69353df696770df","integrity":"sha256-5NAOw3AW2YMVy1J56+9iDr3LL7qWxS8rtpNT32lncN8="},"tinymce/plugins/directionality/plugin-0b425780160e300f0cffbd7a2b76928b23279fa3116573dfc7c77246a03b74b7.js":{"logical_path":"tinymce/plugins/directionality/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":4086,"digest":"cb130ac0fa98034cb7650d7c320160cd127f065a1c936722706b38e2d6481a67","integrity":"sha256-yxMKwPqYA0y3ZQ18MgFgzRJ/Block2cicGs44tZIGmc="},"tinymce/plugins/emoticons/js/emojiimages-8d59e6cafd8ee4961cd4f31515f08ad07db747166ce3af67fa8108289e88564d.js":{"logical_path":"tinymce/plugins/emoticons/js/emojiimages.js","mtime":"2022-04-04T22:49:05+02:00","size":424469,"digest":"5ce0fe8a1253e4cc1dec73b7b0514976f230c737fa3cbbc84369bda0d29b9f63","integrity":"sha256-XOD+ihJT5Mwd7HO3sFFJdvIwxzf6PLvIQ2m9oNKbn2M="},"tinymce/plugins/emoticons/js/emojis-3006b2aae9b4d0b2df2068968cc5523af58362fbd5759350b5f217f3f20c7236.js":{"logical_path":"tinymce/plugins/emoticons/js/emojis.js","mtime":"2022-04-04T22:49:05+02:00","size":201230,"digest":"0945a609768fbab9ead69866d69cfaded544ebdeb92f0c2b478c8e6ab5c9101f","integrity":"sha256-CUWmCXaPurnq1phm1pz63tVE6965LwwrR4yOarXJEB8="},"tinymce/plugins/emoticons/plugin-129e25052d415a8f2e4ce381ad08926a4d45ceb402765824524949194a9a2b42.js":{"logical_path":"tinymce/plugins/emoticons/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":7065,"digest":"5c1b92cc5c55a255b666d449b9bffc51d99a8e0a8672dc8a816886ceec829de3","integrity":"sha256-XBuSzFxVolW2ZtRJub/8UdmajgqGctyKgWiGzuyCneM="},"tinymce/plugins/fullpage/plugin-fab5b27b87a82c8cc2075d424aae6af3db312c40709aed6b9deb40df372299c4.js":{"logical_path":"tinymce/plugins/fullpage/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":7851,"digest":"6e02a56931d6508876148e8361d17423f9d2310b53ec036136a9221976442888","integrity":"sha256-bgKlaTHWUIh2FI6DYdF0I/nSMQtT7ANhNqkiGXZEKIg="},"tinymce/plugins/fullscreen/plugin-b0e3527a37f820f4e281b38a8954b3d959938528a4faa7d56d7e75ada9a6319c.js":{"logical_path":"tinymce/plugins/fullscreen/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":12737,"digest":"effff3463446243f9b47340ee5414e3df8933f81d25f13e984608a7ddf234f39","integrity":"sha256-7//zRjRGJD+bRzQO5UFOPfiTP4HSXxPphGCKfd8jTzk="},"tinymce/plugins/help/plugin-74b305ee40489a4509af56b6ca9e0d19065a6cf483a62a41c5e0e5e2bc5f99ad.js":{"logical_path":"tinymce/plugins/help/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":13632,"digest":"75ad1b2acec0995fd3b2ec5fca60aaf07d925ca2273029a8a25484ab0af2ae64","integrity":"sha256-da0bKs7AmV/TsuxfymCq8H2SXKInMCmoolSEqwryrmQ="},"tinymce/plugins/hr/plugin-21284fe74756e333d7869fe5875100f951ce6f602980784b672ff50dbdcaae26.js":{"logical_path":"tinymce/plugins/hr/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":800,"digest":"332b19f25d2f702a5a0ee393f742558e734df9883095d680912a755f70588b5d","integrity":"sha256-MysZ8l0vcCpaDuOT90JVjnNN+YgwldaAkSp1X3BYi10="},"tinymce/plugins/image/plugin-25d75078ff2f0bdd5c319f3b1a4f0533f50aed33efc88535b35bad501fd6bf06.js":{"logical_path":"tinymce/plugins/image/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":21204,"digest":"ffe42aa42707f04ad76f0c83bd8516032e9638487c0ebd51056c6fe5a3cfa0dc","integrity":"sha256-/+QqpCcH8ErXbwyDvYUWAy6WOEh8Dr1RBWxv5aPPoNw="},"tinymce/plugins/imagetools/plugin-3a63dc0b36de408663aff44fe27234c9eeed178567bfa295908d87146d1a6fec.js":{"logical_path":"tinymce/plugins/imagetools/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":17405,"digest":"9b55834f1b43f3a39209f04fe93e68da7117ef9277ae71d6dd81757b00771756","integrity":"sha256-m1WDTxtD86OSCfBP6T5o2nEX75J3rnHW3YF1ewB3F1Y="},"tinymce/plugins/importcss/plugin-e85d346d15b6335d12e1f3c29996b3521f4334894e9f973884a1795aff156dac.js":{"logical_path":"tinymce/plugins/importcss/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":4055,"digest":"8608b23ae307894b32b086d229c09141e0bbdaee4ba1c7ae5745efcbe6cc125d","integrity":"sha256-hgiyOuMHiUsysIbSKcCRQeC72u5LoceuV0Xvy+bMEl0="},"tinymce/plugins/insertdatetime/plugin-da260c6661ccf21b41fbe0f9497685435c690381ef56b644e28324d855c9f837.js":{"logical_path":"tinymce/plugins/insertdatetime/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":2986,"digest":"eabd3f4048d9d6fae9dd090d930d15bf80730748ba3399d012e91e50f5e55b2a","integrity":"sha256-6r0/QEjZ1vrp3QkNkw0Vv4BzB0i6M5nQEukeUPXlWyo="},"tinymce/plugins/legacyoutput/plugin-009893bc6e9e3951e4bf1bd27932a255545d31fbc1399e710097a0d0e27e4bf6.js":{"logical_path":"tinymce/plugins/legacyoutput/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":3058,"digest":"b3eca131e6b577a3b4beb3f6b014dc1f0980bf619165c5d2efcb941c29f8d844","integrity":"sha256-s+yhMea1d6O0vrP2sBTcHwmAv2GRZcXS78uUHCn42EQ="},"tinymce/plugins/link/plugin-a174f0de992aa2d46a2b1bc54529adc1aae9c81abb20a75016e84c3bb47f3ca7.js":{"logical_path":"tinymce/plugins/link/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":16245,"digest":"4a0f6f4b193e01faa04f3fa51ec5cd6a6d4f94f117f8653881a504150e5abffa","integrity":"sha256-Sg9vSxk+AfqgTz+lHsXNam1PlPEX+GU4gaUEFQ5av/o="},"tinymce/plugins/lists/plugin-a409864002dceaa350a89029a4364d4604012a24e31c59ea0a7eb8f4395ee439.js":{"logical_path":"tinymce/plugins/lists/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":27392,"digest":"5fb771eb5a9a10e2289777134c0c8a932586c5468d01dca371d700bf5a2e73e9","integrity":"sha256-X7dx61qaEOIol3cTTAyKkyWGxUaNAdyjcdcAv1ouc+k="},"tinymce/plugins/media/plugin-da3484d6d06ca620685572cfadd123ab1dee104de6a315dd156d5641eccc0439.js":{"logical_path":"tinymce/plugins/media/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":18006,"digest":"211edccf3e128caa9907267630fca70fb180502674d14e5fb5f17d9d8069f7cf","integrity":"sha256-IR7czz4SjKqZByZ2MPynD7GAUCZ00U5ftfF9nYBp988="},"tinymce/plugins/nonbreaking/plugin-0a5cc039b5f41f98926d65f2cecd3bee70919347182157daa2a999de02103119.js":{"logical_path":"tinymce/plugins/nonbreaking/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1455,"digest":"763f0b46572662cfd9050caf6fe82a92c3d382ab39855feb1e250c26e520157d","integrity":"sha256-dj8LRlcmYs/ZBQyvb+gqksPTgqs5hV/rHiUMJuUgFX0="},"tinymce/plugins/noneditable/plugin-fefeec77b2ee157d5d3f03a43bd84fd29908de54f6c61442544a776629933ce8.js":{"logical_path":"tinymce/plugins/noneditable/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1759,"digest":"e2c634243ea5ee4cb7f78efe79496edd1d9d8f7aab4853026de6f4ffea75e390","integrity":"sha256-4sY0JD6l7ky3947+eUlu3R2dj3qrSFMCbeb0/+p145A="},"tinymce/plugins/pagebreak/plugin-b7824c4e0024e289f6e17f1cc1d811feafdcf319d60f437406a1b5023b8927d5.js":{"logical_path":"tinymce/plugins/pagebreak/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1706,"digest":"bd408733d7698f343399fba84590c0c4d3a57dea019558fc45da03301b7dadb2","integrity":"sha256-vUCHM9dpjzQzmfuoRZDAxNOlfeoBlVj8RdoDMBt9rbI="},"tinymce/plugins/paste/plugin-1496e7e162a97e039efe79d48e22d9927d77285f119c82244f2f4027ab56c82f.js":{"logical_path":"tinymce/plugins/paste/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":22723,"digest":"abf8bbac2da267b8d588a93881c969d3efbeea43daecf940b4e9363780e7c8f3","integrity":"sha256-q/i7rC2iZ7jViKk4gclp0+++6kPa7PlAtOk2N4DnyPM="},"tinymce/plugins/preview/plugin-5451eb22bfefe89af01a8761ac3ef92781edc1152f7417e62dcbfd57e2a94cae.js":{"logical_path":"tinymce/plugins/preview/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":2152,"digest":"1aa4151e7e85afa103d35e24943f74d8adab783ebb671e3c56708d9cff01a1b4","integrity":"sha256-GqQVHn6Fr6ED014klD902K2reD67Zx48VnCNnP8BobQ="},"tinymce/plugins/print/plugin-36da9c0617304cb0d26fcd56e03b8e6fdc60824f39d7186b68635d0c63310832.js":{"logical_path":"tinymce/plugins/print/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":848,"digest":"9b7833455faea12dbd97bc9680299c98ef25388ff1f955d2e8701630702859fa","integrity":"sha256-m3gzRV+uoS29l7yWgCmcmO8lOI/x+VXS6HAWMHAoWfo="},"tinymce/plugins/quickbars/plugin-d634db5c70899e9ac3eef171482a056de87edbcfa37a584adeef865a2d8b2f16.js":{"logical_path":"tinymce/plugins/quickbars/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":6405,"digest":"7a9d86aacad404387bb7a61ee9c04a9e6be9b0b6b93b48115cf6756ac8dabb48","integrity":"sha256-ep2GqsrUBDh7t6Ye6cBKnmvpsLa5O0gRXPZ1asjau0g="},"tinymce/plugins/save/plugin-ac8ac07ffac52b36c122175dcdb6f4a1b00932dd0497a8af2805b8e11cb8e1a2.js":{"logical_path":"tinymce/plugins/save/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1725,"digest":"50924bae8863d8f33adbd56858913151da0d7e813953fdf34c8b4c4b38ec4d3e","integrity":"sha256-UJJLrohj2PM629VoWJExUdoNfoE5U/3zTItMSzjsTT4="},"tinymce/plugins/searchreplace/plugin-61ef24ee28cea07aa2c0b170e301f65fbb0ed1582404bdf56e3c90f3e12209bc.js":{"logical_path":"tinymce/plugins/searchreplace/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":14954,"digest":"bad2065f308423d3cb33d0b04a07ac86b0af19e2df42f28072e6682223fb1036","integrity":"sha256-utIGXzCEI9PLM9CwSgeshrCvGeLfQvKAcuZoIiP7EDY="},"tinymce/plugins/spellchecker/plugin-d6db90b537c1261209e63b89f3cf8148f0570793d451ddcba73d1a921856466b.js":{"logical_path":"tinymce/plugins/spellchecker/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":9882,"digest":"2ff1f80521eb10c3cdcbc38b7c32af11b9a88185e240b0663b2e241c02f71569","integrity":"sha256-L/H4BSHrEMPNy8OLfDKvEbmogYXiQLBmOy4kHAL3FWk="},"tinymce/plugins/tabfocus/plugin-1cf227228c25bdf4208b5d545615906b468b0d9e8140c664d2a7e1bb3efcb2bd.js":{"logical_path":"tinymce/plugins/tabfocus/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1879,"digest":"7a9f48380b992f18d93d47dbc646d8c04fe0a1276a1524585687dc61cbc7620c","integrity":"sha256-ep9IOAuZLxjZPUfbxkbYwE/goSdqFSRYVofcYcvHYgw="},"tinymce/plugins/table/plugin-bc37111c23f01fc04c35672ab0d38fadaad161c4255a0cc7e1d5ee6eca60ed43.js":{"logical_path":"tinymce/plugins/table/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":137315,"digest":"60546afb72ee85ecd5979f25acf0800ad98f0fba2f5e38f460d6a578f4c62869","integrity":"sha256-YFRq+3LuhezVl58lrPCACtmPD7ovXjj0YNalePTGKGk="},"tinymce/plugins/template/plugin-2fe6dd2f648d55256fe3fabc1c73a8a7b1b8d772bcb4472c172c63eb4bb52b0d.js":{"logical_path":"tinymce/plugins/template/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":8292,"digest":"5762646191fae85ccf3196d3eee85ef1cc9a51ba8896fba90708b828da062edb","integrity":"sha256-V2JkYZH66FzPMZbT7uhe8cyaUbqIlvupBwi4KNoGLts="},"tinymce/plugins/textcolor/plugin-ba03707b036e0ecae2827e99fd96ce468c540606f89fd6c95ab9d701fae914d2.js":{"logical_path":"tinymce/plugins/textcolor/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":512,"digest":"c6c0e1b2ffb6ee3e4f610107f2e8b6be6177b6a4c5687f8ba84a36a65105ca75","integrity":"sha256-xsDhsv+27j5PYQEH8ui2vmF3tqTFaH+LqEo2plEFynU="},"tinymce/plugins/textpattern/plugin-2fb5a7c511f3e1a5aa15c19b267f88fcee0fccbda56253351fea5d653937edbb.js":{"logical_path":"tinymce/plugins/textpattern/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":18261,"digest":"c7ddbcf8b16c120cc0de3774944638285d9625fbbd1247f8640b193d9ad6e6bb","integrity":"sha256-x928+LFsEgzA3jd0lEY4KF2WJfu9Ekf4ZAsZPZrW5rs="},"tinymce/plugins/toc/plugin-6edd73d5ecedb62f2d628ef3cf207b22a3a58795c47c872dbbc86f5b6fe37a83.js":{"logical_path":"tinymce/plugins/toc/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":3367,"digest":"235ed8c6f208a36103940d7b1f5d772954abc0fa9921f3a88061e753bd9035d7","integrity":"sha256-I17YxvIIo2EDlA17H113KVSrwPqZIfOogGHnU72QNdc="},"tinymce/plugins/visualblocks/plugin-5f5bdf7d56602673edccb5d5a5e34a547eb342f1cc4bc5efcc2ba2e6a5658bb6.js":{"logical_path":"tinymce/plugins/visualblocks/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":1444,"digest":"1197952d3d3fb9de2a6baf806d70a048057ff1809d76049fb4362012971204be","integrity":"sha256-EZeVLT0/ud4qa6+AbXCgSAV/8YCddgSftDYgEpcSBL4="},"tinymce/plugins/visualchars/plugin-5c73e8f376f54c40577bafee3eb5110230e5be82af05b3ee3481bcf67330fd07.js":{"logical_path":"tinymce/plugins/visualchars/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":6214,"digest":"65198f3d6212f54ffa63f7ac913db344186568a95d8b14f49d7fcdca136b8b3d","integrity":"sha256-ZRmPPWIS9U/6Y/eskT2zRBhlaKldixT0nX/NyhNriz0="},"tinymce/plugins/wordcount/plugin-f0e5014b91a446bfcc318f06fd4de83b9080daa79e2692744240f561795da8b9.js":{"logical_path":"tinymce/plugins/wordcount/plugin.js","mtime":"2022-04-04T22:49:05+02:00","size":12268,"digest":"8545d85b0e2c74308d36a8e063270ae065a32e5b76adda47fcdb1cec600edb8c","integrity":"sha256-hUXYWw4sdDCNNqjgYycK4GWjLlt2rdpH/Nsc7GAO24w="},"tinymce/themes/mobile/theme-99507462d078fc9f849c2508b9a7afbc997eb15b02bd622bffc841e81ec85e38.js":{"logical_path":"tinymce/themes/mobile/theme.js","mtime":"2022-04-04T22:49:05+02:00","size":170866,"digest":"9e72493ce95381c2c1b4c7ac052e6206991945951784df29a08633f3c71975ac","integrity":"sha256-nnJJPOlTgcLBtMesBS5iBpkZRZUXhN8poIYz88cZdaw="},"tinymce/themes/silver/theme-4036a717c1dfba952efa2535ef36d86038de7d86a60e9538ace74eea90179f6b.js":{"logical_path":"tinymce/themes/silver/theme.js","mtime":"2022-04-04T22:49:05+02:00","size":411583,"digest":"4f830fca5046f85f3a08e761c0ecebefd1b1de0b0ebe579322586963e62c4921","integrity":"sha256-T4MPylBG+F86COdhwOzr79Gx3gsOvleTIlhpY+YsSSE="},"tinymce/tinymce-91c750bb545201450222b4e4e9691d6d98d523a343ffe9271cc5fb628a76871c.js":{"logical_path":"tinymce/tinymce.js","mtime":"2022-04-04T22:49:05+02:00","size":396678,"digest":"a9118a5615350ffef03c99b12e2fe6c8589cf44058ec7aaf6e2f5d6bed362616","integrity":"sha256-qRGKVhU1D/7wPJmxLi/myFic9EBY7Hqvbi9da+02JhY="},"tinymce/skins/ui/oxide-dark/content-05858f414d87e95ced058681161df9acb0fb5e52a3ea9d3ea5efdc22436e2131.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.css","mtime":"2022-04-04T22:49:05+02:00","size":21211,"digest":"6545b88356649713a2e9fbdc9239d5ae92073ca9d82aaad28efeb291322ae335","integrity":"sha256-ZUW4g1ZklxOi6fvckjnVrpIHPKnYKqrSjv6ykTIq4zU="},"tinymce/skins/ui/oxide-dark/content.inline-965c0ab25123fa4dc5c987969c2a6e90568c903dac8841b59c6af9664a716ca6.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.css","mtime":"2022-04-04T22:49:05+02:00","size":21538,"digest":"1442b2530b205a84c5dc12b589860a5448d55ad4e2ccabb168ddc27fa70c865b","integrity":"sha256-FEKyUwsgWoTF3BK1iYYKVEjVWtTizKuxaN3Cf6cMhls="},"tinymce/skins/ui/oxide-dark/content.inline.min-965c0ab25123fa4dc5c987969c2a6e90568c903dac8841b59c6af9664a716ca6.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.min.css","mtime":"2022-04-04T22:49:05+02:00","size":21538,"digest":"1442b2530b205a84c5dc12b589860a5448d55ad4e2ccabb168ddc27fa70c865b","integrity":"sha256-FEKyUwsgWoTF3BK1iYYKVEjVWtTizKuxaN3Cf6cMhls="},"tinymce/skins/ui/oxide-dark/content.min-05858f414d87e95ced058681161df9acb0fb5e52a3ea9d3ea5efdc22436e2131.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.min.css","mtime":"2022-04-04T22:49:05+02:00","size":21211,"digest":"6545b88356649713a2e9fbdc9239d5ae92073ca9d82aaad28efeb291322ae335","integrity":"sha256-ZUW4g1ZklxOi6fvckjnVrpIHPKnYKqrSjv6ykTIq4zU="},"tinymce/skins/ui/oxide-dark/skin-cc615cac1f1e506e5dc5a7ef61fcbf9f4d7e39f016d16aa364fff0cb9285b59b.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.css","mtime":"2022-04-04T22:49:05+02:00","size":60731,"digest":"c379ee6e27014869bd814f365ce0e2c29737dab81692336e92877e150357fb2d","integrity":"sha256-w3nubicBSGm9gU82XODiwpc32rgWkjNukod+FQNX+y0="},"tinymce/skins/ui/oxide-dark/skin.min-cc615cac1f1e506e5dc5a7ef61fcbf9f4d7e39f016d16aa364fff0cb9285b59b.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.min.css","mtime":"2022-04-04T22:49:05+02:00","size":60731,"digest":"c379ee6e27014869bd814f365ce0e2c29737dab81692336e92877e150357fb2d","integrity":"sha256-w3nubicBSGm9gU82XODiwpc32rgWkjNukod+FQNX+y0="},"tinymce/skins/ui/oxide-dark/skin.shadowdom-7607e1810029c2191d32d46dc71b443e8e5317010b2e92a9bc133da9431fa80b.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.shadowdom.css","mtime":"2022-04-04T22:49:05+02:00","size":514,"digest":"74e2442108dbc9e9e66c4ca8cc39f121aaa65d16a8c5a47b4a4455094399c7e3","integrity":"sha256-dOJEIQjbyenmbEyozDnxIaqmXRaoxaR7SkRVCUOZx+M="},"tinymce/skins/ui/oxide-dark/skin.shadowdom.min-7607e1810029c2191d32d46dc71b443e8e5317010b2e92a9bc133da9431fa80b.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css","mtime":"2022-04-04T22:49:05+02:00","size":514,"digest":"74e2442108dbc9e9e66c4ca8cc39f121aaa65d16a8c5a47b4a4455094399c7e3","integrity":"sha256-dOJEIQjbyenmbEyozDnxIaqmXRaoxaR7SkRVCUOZx+M="},"tinymce/skins/ui/oxide/content-63f8955ff68e1122175e8f46d0b760b966148873e452c1b6085f367ef3d63400.css":{"logical_path":"tinymce/skins/ui/oxide/content.css","mtime":"2022-04-04T22:49:05+02:00","size":21597,"digest":"f0b842397eead8ce94c74303a4846beb3a0aa60d34e67bed05991c5d4f04c50f","integrity":"sha256-8LhCOX7q2M6Ux0MDpIRr6zoKpg005nvtBZkcXU8ExQ8="},"tinymce/skins/ui/oxide/content.inline-965c0ab25123fa4dc5c987969c2a6e90568c903dac8841b59c6af9664a716ca6.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.css","mtime":"2022-04-04T22:49:05+02:00","size":21538,"digest":"1442b2530b205a84c5dc12b589860a5448d55ad4e2ccabb168ddc27fa70c865b","integrity":"sha256-FEKyUwsgWoTF3BK1iYYKVEjVWtTizKuxaN3Cf6cMhls="},"tinymce/skins/ui/oxide/content.inline.min-965c0ab25123fa4dc5c987969c2a6e90568c903dac8841b59c6af9664a716ca6.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.min.css","mtime":"2022-04-04T22:49:05+02:00","size":21538,"digest":"1442b2530b205a84c5dc12b589860a5448d55ad4e2ccabb168ddc27fa70c865b","integrity":"sha256-FEKyUwsgWoTF3BK1iYYKVEjVWtTizKuxaN3Cf6cMhls="},"tinymce/skins/ui/oxide/content.min-63f8955ff68e1122175e8f46d0b760b966148873e452c1b6085f367ef3d63400.css":{"logical_path":"tinymce/skins/ui/oxide/content.min.css","mtime":"2022-04-04T22:49:05+02:00","size":21597,"digest":"f0b842397eead8ce94c74303a4846beb3a0aa60d34e67bed05991c5d4f04c50f","integrity":"sha256-8LhCOX7q2M6Ux0MDpIRr6zoKpg005nvtBZkcXU8ExQ8="},"tinymce/skins/ui/oxide/skin-93571772a14fadb77679e9a87e8d69f0733d3690dfc996d6466b6b0cc5a9f473.css":{"logical_path":"tinymce/skins/ui/oxide/skin.css","mtime":"2022-04-04T22:49:05+02:00","size":60854,"digest":"517b70828058cd7f04a825a99f82194362a7542f7a04911e3eacf48e2e0d8e2c","integrity":"sha256-UXtwgoBYzX8EqCWpn4IZQ2KnVC96BJEePqz0ji4Njiw="},"tinymce/skins/ui/oxide/skin.min-93571772a14fadb77679e9a87e8d69f0733d3690dfc996d6466b6b0cc5a9f473.css":{"logical_path":"tinymce/skins/ui/oxide/skin.min.css","mtime":"2022-04-04T22:49:05+02:00","size":60854,"digest":"517b70828058cd7f04a825a99f82194362a7542f7a04911e3eacf48e2e0d8e2c","integrity":"sha256-UXtwgoBYzX8EqCWpn4IZQ2KnVC96BJEePqz0ji4Njiw="},"tinymce/skins/ui/oxide/skin.shadowdom-7607e1810029c2191d32d46dc71b443e8e5317010b2e92a9bc133da9431fa80b.css":{"logical_path":"tinymce/skins/ui/oxide/skin.shadowdom.css","mtime":"2022-04-04T22:49:05+02:00","size":514,"digest":"74e2442108dbc9e9e66c4ca8cc39f121aaa65d16a8c5a47b4a4455094399c7e3","integrity":"sha256-dOJEIQjbyenmbEyozDnxIaqmXRaoxaR7SkRVCUOZx+M="},"tinymce/skins/ui/oxide/skin.shadowdom.min-7607e1810029c2191d32d46dc71b443e8e5317010b2e92a9bc133da9431fa80b.css":{"logical_path":"tinymce/skins/ui/oxide/skin.shadowdom.min.css","mtime":"2022-04-04T22:49:05+02:00","size":514,"digest":"74e2442108dbc9e9e66c4ca8cc39f121aaa65d16a8c5a47b4a4455094399c7e3","integrity":"sha256-dOJEIQjbyenmbEyozDnxIaqmXRaoxaR7SkRVCUOZx+M="},"active_admin-524694b5b04b9864da3bc5c98c14cf8b3756af77b1fc6bb2a34daedfe1695d02.js":{"logical_path":"active_admin.js","mtime":"2021-12-16T21:38:53+01:00","size":978604,"digest":"7dde4d03f5239db18863409466552bf82e5ffdf5f551f69e5b7465ef3f025fac","integrity":"sha256-fd5NA/UjnbGIY0CUZlUr+C5f/fX1UfaeW3Rl7z8CX6w="},"tinymce/plugins/advlist/plugin-a4bb87de14ddac83e473c24958f3986aaef3e482a28285e52927a8ebfca7c898.js":{"logical_path":"tinymce/plugins/advlist/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3467,"digest":"1c905d0b712d584648bd2c510472d9a576bb648850a108e8af0aa39eff68415c","integrity":"sha256-HJBdC3EtWEZIvSxRBHLZpXa7ZIhQoQjorwqjnv9oQVw="},"tinymce/plugins/anchor/plugin-9d3a3ae4e579fb656192ac31344b8fae41b2232e3ce174e9e89fc50dee581256.js":{"logical_path":"tinymce/plugins/anchor/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":2713,"digest":"51c9a2fa6c3f3609b608b859dd5ff2108ec138da783562065395992398a36c4e","integrity":"sha256-Ucmi+mw/Ngm2CLhZ3V/yEI7BONp4NWIGU5WZI5ijbE4="},"tinymce/plugins/autolink/plugin-988c2d3be209401a075db4adb78f40b300036458a69c744c2184cc590f29958b.js":{"logical_path":"tinymce/plugins/autolink/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":2732,"digest":"7d0dd383aa1256e4bf564220155688f3200a15f67933a5d96973ab6ec1d84993","integrity":"sha256-fQ3Tg6oSVuS/VkIgFVaI8yAKFfZ5M6XZaXOrbsHYSZM="},"tinymce/plugins/autoresize/plugin-9455fc49cd87483f8c0ae22ea5141cdc65b5ce1793fb1dfa5d093e169995ae68.js":{"logical_path":"tinymce/plugins/autoresize/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":2297,"digest":"098b13cbe4c53423125f32f0234274ac8498281d9d99f76940c5aa441a9a5bf8","integrity":"sha256-CYsTy+TFNCMSXzLwI0J0rISYKB2dmfdpQMWqRBqaW/g="},"tinymce/plugins/autosave/plugin-4f8253b53fce6cfb161afbd312f445f8c05f461fa9e717c347f08af0fcf98d88.js":{"logical_path":"tinymce/plugins/autosave/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":2960,"digest":"dd14893780983a089a6a44f10e2ce88e9bf61994f6530295e0f0696a85834f3f","integrity":"sha256-3RSJN4CYOgiaakTxDizojpv2GZT2UwKV4PBpaoWDTz8="},"tinymce/plugins/bbcode/plugin-cbea101dafa8965d9e17ae21eb0d3a34361afbbf3eb2c820246dadcc1707468f.js":{"logical_path":"tinymce/plugins/bbcode/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3085,"digest":"1a5ab30bfcf7e6f2b37ad89049812887b28e4f6fd66975b3d670fe33c36a4f7c","integrity":"sha256-GlqzC/z35vKzetiQSYEoh7KOT2/WaXWz1nD+M8NqT3w="},"tinymce/plugins/charmap/plugin-19431517384979fa1b9c72eeb3e1b7181faa5667774960cbeccbebef0ebfb573.js":{"logical_path":"tinymce/plugins/charmap/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":11667,"digest":"d3dd0373caa6a2b461db80632863b7da9925acc8cd0d005010c85fc6c38885ff","integrity":"sha256-090Dc8qmorRh24BjKGO32pklrMjNDQBQEMhfxsOIhf8="},"tinymce/plugins/code/plugin-7924410803ece6df1784b5c22e0bc0ee4ec94a40af8b870cfb429b888b47ee89.js":{"logical_path":"tinymce/plugins/code/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1133,"digest":"9626629985f39906421d6f979a08fb496eb98bc246cdfaa9a7aab08cae042d42","integrity":"sha256-liZimYXzmQZCHW+Xmgj7SW65i8JGzfqpp6qwjK4ELUI="},"tinymce/plugins/codesample/plugin-f849b0b50282471b042890c2ed9a041b2376a4d3e2e83df65849695f88fb3411.js":{"logical_path":"tinymce/plugins/codesample/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":45706,"digest":"f086a828c88cb8ed9a32174e8199f553cd9ca9c5438950f8838cbafc3c6a30df","integrity":"sha256-8IaoKMiMuO2aMhdOgZn1U82cqcVDiVD4g4y6/DxqMN8="},"tinymce/plugins/colorpicker/plugin-325fc0e42593a9f0b8783101c64dd48c68a1f7975ca98eb236ee1b296af98d67.js":{"logical_path":"tinymce/plugins/colorpicker/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":398,"digest":"0004d9aec2514dabd68cc8c1dd8eea1cde20da23e867630b8f5a2e8ccb6e74d6","integrity":"sha256-AATZrsJRTavWjMjB3Y7qHN4g2iPoZ2MLj1oujMtudNY="},"tinymce/plugins/contextmenu/plugin-4f179b5a8e5f7085a248923c4a2f8894ec4c4e83ed8de24de167df6615a44cd0.js":{"logical_path":"tinymce/plugins/contextmenu/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":398,"digest":"d0eeeb1a0f7594e36cd11ae942791d612a5dd9a175b1029105b6ba183dc91e55","integrity":"sha256-0O7rGg91lONs0RrpQnkdYSpd2aF1sQKRBba6GD3JHlU="},"tinymce/plugins/directionality/plugin-56625711cdc40e44ac72fa3ffef2029eec6a4a548318f4c6ee132a7a09f74e2b.js":{"logical_path":"tinymce/plugins/directionality/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":5337,"digest":"ff8a9c457b04d2df38c5692ecb435312e227e2b38d8117009aabab9fd65650d3","integrity":"sha256-/4qcRXsE0t84xWkuy0NTEuIn4rONgRcAmqurn9ZWUNM="},"tinymce/plugins/emoticons/plugin-7ec6ec8779a198c5a67714d5b10ed64d8a4b5638b0e8c3b4429f7c31d38566b1.js":{"logical_path":"tinymce/plugins/emoticons/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":6885,"digest":"f01824197c5025e90e740a778bdff31713c0e220ce4e19b473cd8fb5ce3e4030","integrity":"sha256-8BgkGXxQJekOdAp3i9/zFxPA4iDOThm0c82Ptc4+QDA="},"tinymce/plugins/fullpage/plugin-bcde45f623fe7fc0b9e0b745180b513ae0468be51a70d4598137f729fce8528a.js":{"logical_path":"tinymce/plugins/fullpage/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":7821,"digest":"5aa789ea3efad79e063a02098b08d979f357dd33fd58f3a528d03cfe7741d8ae","integrity":"sha256-WqeJ6j76154GOgIJiwjZefNX3TP9WPOlKNA8/ndB2K4="},"tinymce/plugins/fullscreen/plugin-c24dd8914a29ff4cffb95a9120681ae7b50ea5a7f85089841de018f35ac7445c.js":{"logical_path":"tinymce/plugins/fullscreen/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":16477,"digest":"9704cd9ce62ad6a7e6f13cf84679900eae0bc2e7459b7143c1c018d64d5db181","integrity":"sha256-lwTNnOYq1qfm8Tz4RnmQDq4LwudFm3FDwcAY1k1dsYE="},"tinymce/plugins/help/plugin-4ad10afd264aa345b89c6bef8afb6d814ea1c973408155aba5b79fc3babcaf53.js":{"logical_path":"tinymce/plugins/help/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":13390,"digest":"a99eb9cc52282b4e1108a60ba8ddb95861448ce1a901d523f6584cb5cba7b7fe","integrity":"sha256-qZ65zFIoK04RCKYLqN25WGFEjOGpAdUj9lhMtcunt/4="},"tinymce/plugins/hr/plugin-931866c9993a5c88988692c7b249a96b92521d575c224824ab3e9cbc36c94844.js":{"logical_path":"tinymce/plugins/hr/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":741,"digest":"828eaede8bd2049d8872e6ebc0899e97e775730bb21d9c419917d9050c4e09e6","integrity":"sha256-go6u3ovSBJ2IcubrwImel+d1cwuyHZxBmRfZBQxOCeY="},"tinymce/plugins/image/plugin-664b7a8f375ab6c9a9f56abe0559c66f596bc0de02d04c0df17fd30d4ff343b0.js":{"logical_path":"tinymce/plugins/image/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":20153,"digest":"57310ced61b7674fd2ab3dd67bd49ce8f67b2c71ea9bcaeaefbbd187ec0b6663","integrity":"sha256-VzEM7WG3Z0/Sqz3We9Sc6PZ7LHHqm8rq77vRh+wLZmM="},"tinymce/plugins/imagetools/plugin-35bb3598b41c70e3e8d46cac2b65835fec624c8f6be8fd562463b12a53521307.js":{"logical_path":"tinymce/plugins/imagetools/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":19462,"digest":"486400fe415abf3706f02c28d261f6459fb9e51a9f4792b4f64ac64f08f33f7e","integrity":"sha256-SGQA/kFavzcG8Cwo0mH2RZ+55RqfR5K09krGTwjzP34="},"tinymce/plugins/importcss/plugin-859b0f1e66d97aa1d0eeb29e1ebcd5778fb9014424d2d0811314b4ef0b01bba7.js":{"logical_path":"tinymce/plugins/importcss/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3989,"digest":"82c720310f401779ed8f67cdb313c409a452d2bdf88e65279563841506789ccd","integrity":"sha256-gscgMQ9AF3ntj2fNsxPECaRS0r34jmUnlWOEFQZ4nM0="},"tinymce/plugins/insertdatetime/plugin-715d878fe04a44fac0aea493df5ccacd628f0b601d81b2c7e9b0fc5abfeb6611.js":{"logical_path":"tinymce/plugins/insertdatetime/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3009,"digest":"395e45c5d17eb450641bb4c2f19cbef5365afc52f4b4b727bcd207c36eccb1d5","integrity":"sha256-OV5FxdF+tFBkG7TC8Zy+9TZa/FL0tLcnvNIHw27MsdU="},"tinymce/plugins/legacyoutput/plugin-145984ce15ed80b01b4113fef30fff5365e5ab50b32017190f5d118b53d7b45e.js":{"logical_path":"tinymce/plugins/legacyoutput/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3005,"digest":"e7eb182259f6f7e99a253008b96eec8f6642a317a34ab0d38fe13e0ae97008a1","integrity":"sha256-5+sYIln29+maJTAIuW7sj2ZCoxejSrDTj+E+CulwCKE="},"tinymce/plugins/link/plugin-d2ee9669187a05a45784d9c5432a74de00871fe73d47fd70e933d6f77e4d6b7e.js":{"logical_path":"tinymce/plugins/link/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":15730,"digest":"8825f308fd84644e18b3257d117de927f8989292cd86469014f1a74cd595493a","integrity":"sha256-iCXzCP2EZE4YsyV9EX3pJ/iYkpLNhkaQFPGnTNWVSTo="},"tinymce/plugins/lists/plugin-e57b133590067d7ccd4b6a0675abc101240104431fd1e7c00181726353f68337.js":{"logical_path":"tinymce/plugins/lists/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":27942,"digest":"546635f6fab512c83ccc4d2a7e8c8a6e82c77fe2d146e430188f0a1964c4ba61","integrity":"sha256-VGY19vq1Esg8zE0qfoyKboLHf+LRRuQwGI8KGWTEumE="},"tinymce/plugins/media/plugin-c37617281c9b5553da10ebc3f23df0d78732d5aa7760af3bc7594d9fbbf2cdd9.js":{"logical_path":"tinymce/plugins/media/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":17549,"digest":"379f821c9ab0a1885515c770a2350d00b1d253033a355366d39ccea8ea358fcc","integrity":"sha256-N5+CHJqwoYhVFcdwojUNALHSUwM6NVNm05zOqOo1j8w="},"tinymce/plugins/nonbreaking/plugin-e0a559965408fd12f28207f7a452043192e3ec936c3b3f139b7cbf8b11dfbc95.js":{"logical_path":"tinymce/plugins/nonbreaking/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1390,"digest":"771a4620a4fc0785b6a389b366744a3fdc3cf15cb2a956b72a33efe13af8a849","integrity":"sha256-dxpGIKT8B4W2o4mzZnRKP9w88VyyqVa3KjPv4Tr4qEk="},"tinymce/plugins/noneditable/plugin-ad701c85ddb14ca90e5b75f989a2791a45734e94b92c6ca635810801d972fffc.js":{"logical_path":"tinymce/plugins/noneditable/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1755,"digest":"7a2701f0faa7e9253f2a83ec1a0d3af2de8b992108ff3ee9803fab962b262fec","integrity":"sha256-eicB8Pqn6SU/KoPsGg068t6LmSEI/z7pgD+rlismL+w="},"tinymce/plugins/pagebreak/plugin-5c33d8634f96e25e17437c8021f9bd011d06c36de0ca6aade8f2c2b90a6841da.js":{"logical_path":"tinymce/plugins/pagebreak/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1631,"digest":"e32b7402df76bf94d64ffe56c5fc0aac07d9bbcabda9594293e8c48c8131cfea","integrity":"sha256-4yt0At92v5TWT/5WxfwKrAfZu8q9qVlCk+jEjIExz+o="},"tinymce/plugins/paste/plugin-376e5dfa239e9fd69115b88f276a0b240aa80530d1bdb59a831a9130543fb1cf.js":{"logical_path":"tinymce/plugins/paste/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":22567,"digest":"c08f9c7465a68793a4b4486d28dd16e39297bf71338766ba0abfa12ca003e43b","integrity":"sha256-wI+cdGWmh5OktEhtKN0W45KXv3Ezh2a6Cr+hLKAD5Ds="},"tinymce/plugins/preview/plugin-3a574253c48e148c1084f850afc96bc622bafbfbcb9fe11087836080c0e9d446.js":{"logical_path":"tinymce/plugins/preview/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":2097,"digest":"3ad8da4973abb8909dffd223c0a5b6fddca0c9331e1688804cc5847d311741cc","integrity":"sha256-OtjaSXOruJCd/9IjwKW2/dygyTMeFoiATMWEfTEXQcw="},"tinymce/plugins/print/plugin-6b2cd4ff593de9e1de62356788c6cb55a19805fc69169df34718bba66e87b3c1.js":{"logical_path":"tinymce/plugins/print/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":809,"digest":"caa08a4f899cbf6cc01ad52aa9eed865f503863a29f2dffa84100ecd1f882699","integrity":"sha256-yqCKT4mcv2zAGtUqqe7YZfUDhjop8t/6hBAOzR+IJpk="},"tinymce/plugins/quickbars/plugin-170fafc6f3e8a470d0c914d13ef2ff03e70589508fbc61e4f78cf0ea6f438156.js":{"logical_path":"tinymce/plugins/quickbars/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":6059,"digest":"9960b115e15ed75bd9da804a1961ea58b23832ad62a0c23a12e89401c9489534","integrity":"sha256-mWCxFeFe11vZ2oBKGWHqWLI4Mq1ioMI6EuiUAclIlTQ="},"tinymce/plugins/save/plugin-14ed227d03749c9c195a01bb91679fad98a2004f49e7d7a8692f70bcc12f66eb.js":{"logical_path":"tinymce/plugins/save/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1717,"digest":"3416beb05f7167fb35e9c204e7c3a5bd944a5dd1c851ea587fabfe2d25ec679e","integrity":"sha256-NBa+sF9xZ/s16cIE58OlvZRKXdHIUepYf6v+LSXsZ54="},"tinymce/plugins/searchreplace/plugin-d378dd2578e974600cd4f118a9e55d717c4c5c17b6fff84687f914e252e3e4b7.js":{"logical_path":"tinymce/plugins/searchreplace/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":14606,"digest":"77b02790ed1f558be7434685323afae17300e94b5f17eb3c7d8af27c6d4787c0","integrity":"sha256-d7AnkO0fVYvnQ0aFMjr64XMA6UtfF+s8fYryfG1Hh8A="},"tinymce/plugins/spellchecker/plugin-c7b5ea71427935f6401c925fe8dc24998b693743625df8117183acbf17bd6e40.js":{"logical_path":"tinymce/plugins/spellchecker/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":9787,"digest":"d68885dfd15cca8ecd364365f0b3a6c5551164a57caac82e865f54d32b5e2cb9","integrity":"sha256-1oiF39Fcyo7NNkNl8LOmxVURZKV8qsguhl9U0yteLLk="},"tinymce/plugins/tabfocus/plugin-e9d1a8e8fdc352cd3c192c3003418b82a84b0e70b4d1d4edbebfc74036603282.js":{"logical_path":"tinymce/plugins/tabfocus/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1859,"digest":"64458f3c48e45f4af232b66c02551ef946f1f5a315505dd39992abd948e03247","integrity":"sha256-ZEWPPEjkX0ryMrZsAlUe+Ubx9aMVUF3TmZKr2UjgMkc="},"tinymce/plugins/table/plugin-6af7688e5a0b33a6654e741732b367e923c1129f3e133c2a28d6871a1de7486c.js":{"logical_path":"tinymce/plugins/table/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":143479,"digest":"458210bd02bbe59450615236f28444399b9c4bfdc37c12fe7e6fccd3935a3002","integrity":"sha256-RYIQvQK75ZRQYVI28oREOZucS/3DfBL+fm/M05NaMAI="},"tinymce/plugins/template/plugin-c3f7169fedb812ac2bdda6c2a5dbb80372e7c82cb35c9f80e55f61dc655915a9.js":{"logical_path":"tinymce/plugins/template/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":8250,"digest":"9724bc1f185bd4f216cdb157e811f2a80474461c01e71710664f97fbb399ceb5","integrity":"sha256-lyS8Hxhb1PIWzbFX6BHyqAR0RhwB5xcQZk+X+7OZzrU="},"tinymce/plugins/textcolor/plugin-3d43be08b7cd7c92164e03bc37aee70e414280032a595fc2a534b2553f5ecf09.js":{"logical_path":"tinymce/plugins/textcolor/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":396,"digest":"2637816d2d4d4aa384ee75b864398a37ad0b13b4ab2b4a758ff97ffa50386672","integrity":"sha256-JjeBbS1NSqOE7nW4ZDmKN60LE7SrK0p1j/l/+lA4ZnI="},"tinymce/plugins/textpattern/plugin-552cb3b358b6fcb6954dae76d8476245146eccb387308cd8a74c640ff23a78ee.js":{"logical_path":"tinymce/plugins/textpattern/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":17614,"digest":"91c744b0f9c0fe5b4ed583aeb7b332d6f9bbef265408075d6774b4969ab69ecb","integrity":"sha256-kcdEsPnA/ltO1YOut7My1vm77yZUCAddZ3S0lpq2nss="},"tinymce/plugins/toc/plugin-239fada39fed395fa2333c0fc2194fff22e81dfbe07b24e41b825664ccf36bcf.js":{"logical_path":"tinymce/plugins/toc/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":3283,"digest":"cb88a3ad2aa622dff508949626c2bf39560b3054a2b9dfd0849882d587e3e298","integrity":"sha256-y4ijrSqmIt/1CJSWJsK/OVYLMFSiud/QhJiC1Yfj4pg="},"tinymce/plugins/visualblocks/plugin-1a4122637221a00d282d3c63aabe244f405570c5e701d804c876d942b3e997ae.js":{"logical_path":"tinymce/plugins/visualblocks/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":1381,"digest":"403684d6646d569eb8906bec0463c73575cd47a0b2f1b12ce891362f59fd0707","integrity":"sha256-QDaE1mRtVp64kGvsBGPHNXXNR6Cy8bEs6JE2L1n9Bwc="},"tinymce/plugins/visualchars/plugin-f759e8508b9fa10e4fa244b2ecba35349548a679c76f169e9bfdc898d6b73f3d.js":{"logical_path":"tinymce/plugins/visualchars/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":5777,"digest":"a5d1ba54c2884cb6863aeb902bbff283a58e0717f8d3daa6799ca9e8acc7e991","integrity":"sha256-pdG6VMKITLaGOuuQK7/yg6WOBxf409qmeZyp6KzH6ZE="},"tinymce/plugins/wordcount/plugin-c06ada5753cfd157a354710efdd540b98104450645d6fc7e64380c0fd42915a2.js":{"logical_path":"tinymce/plugins/wordcount/plugin.js","mtime":"2021-12-16T21:38:53+01:00","size":12106,"digest":"1321f8f2014d69c9f649c913b9de252dffb08c1ac7c9ae7bb58a8d2765f3d6ce","integrity":"sha256-EyH48gFNacn2SckTud4lLf+wjBrHya57tYqNJ2Xz1s4="},"tinymce/themes/mobile/theme-5888ad3256408af5d58b69ecc8323a1cd2eb2d5232ddee631261f760dd933985.js":{"logical_path":"tinymce/themes/mobile/theme.js","mtime":"2021-12-16T21:38:53+01:00","size":159749,"digest":"f93e4080dbc008af13d75387cf0c58851a4d0766341d9a92ffd98ae8c087c79d","integrity":"sha256-+T5AgNvACK8T11OHzwxYhRpNB2Y0HZqS/9mK6MCHx50="},"tinymce/themes/silver/theme-4c7b6d39877cdf63e1dfb6418b9981f144a22af6d144cbaff6ee43f62a78d5b8.js":{"logical_path":"tinymce/themes/silver/theme.js","mtime":"2021-12-16T21:38:53+01:00","size":403179,"digest":"5d81969b354c095f652313f1b910aa24f53462a307823b6553ae24d2f322abe6","integrity":"sha256-XYGWmzVMCV9lIxPxuRCqJPU0YqMHgjtlU64k0vMiq+Y="},"tinymce/tinymce-ebd68dac70289162af9dc4eb5d8a225103bb5faf38e50c703100568b45a92166.js":{"logical_path":"tinymce/tinymce.js","mtime":"2021-12-16T21:38:53+01:00","size":391864,"digest":"261bac16489964a1251a887de4693808902f595cfc6c6fdaa89b3f0dcb4f6d53","integrity":"sha256-JhusFkiZZKElGoh95Gk4CJAvWVz8bG/aqJs/DctPbVM="},"appel-web-180x60-libre-en-fete-2022-02d051e0a863d530e6fc940a19720325cd3283c8067773f6c2802fafe81f5f79.png":{"logical_path":"appel-web-180x60-libre-en-fete-2022.png","mtime":"2022-05-27T21:42:11+02:00","size":8208,"digest":"06984911cfee3f3073015fffdf5a57d5dd20aca7419a7e4a2bfb59ea32ae4643","integrity":"sha256-BphJEc/uPzBzAV//31pX1d0grKdBmn5KK/tZ6jKuRkM="},"appel-web-486x80-libre-en-fete-2022-90f1d12c05449cbb3bae6d682438d4c5664771e267da331c1ac58e5a51bbc486.png":{"logical_path":"appel-web-486x80-libre-en-fete-2022.png","mtime":"2022-05-27T21:42:11+02:00","size":28885,"digest":"31f95f4682b2275d8a8167d2bca123d576dec03b20f16e3ee7e4daa9d034d81b","integrity":"sha256-MflfRoKyJ12KgWfSvKEj1XbewDsg8W4+5+TaqdA02Bs="},"agendadescommuns-18a01cd096b29d12a928627259ca8820b2f291b55421b3e99d8d36a557cb81f5.css":{"logical_path":"agendadescommuns.css","mtime":"2022-05-27T21:42:11+02:00","size":1012,"digest":"40930f0949da0b701fe2009bfc32cfa9cc7c1b19cfc640e2a16a0fb0fc3a43bb","integrity":"sha256-QJMPCUnaC3Af4gCb/DLPqcx8GxnPxkDioWoPsPw6Q7s="},"appel-web-1429x352-libre-en-fete-2022-merci-10eb65847b1807928109cc9c46bb764e2d91c13a0b81a5d1a8db741176d4d76b.png":{"logical_path":"appel-web-1429x352-libre-en-fete-2022-merci.png","mtime":"2022-05-27T21:42:11+02:00","size":96106,"digest":"bf8992d762980491de58bd2e3f98b2be2b2c16528c276edf34cad31ff9447d26","integrity":"sha256-v4mS12KYBJHeWL0uP5iyvissFlKMJ27fNMrTH/lEfSY="},"application-66d8f43bfb851116bc1aa6e63f2d9f8b38bf2b99eecb88b7a89a5c751f9fa523.css":{"logical_path":"application.css","mtime":"2022-04-10T23:03:15+02:00","size":324462,"digest":"1b754623d25f7ede014a358bb6828ef6227c6f50b484ef9bd9f97991fe765d8a","integrity":"sha256-G3VGI9Jfft4BSjWLtoKO9iJ8b1C0hO+b2fl5kf52XYo="},"font-awesome/fa-solid-900-addc97d14257b43232b89194f73bd3b862007d5eedcb4569362b8f26356d8db3.woff2":{"logical_path":"font-awesome/fa-solid-900.woff2","mtime":"2022-05-27T21:42:11+02:00","size":154228,"digest":"d76fb4e841748a3f6bc63efa23156e02631c283bf41f84efcbdaf339ea3e1b73","integrity":"sha256-12+06EF0ij9rxj76IxVuAmMcKDv0H4Tvy9rzOeo+G3M="},"font-awesome/fa-solid-900-a0cc38b88839387e4451bb1ebdd9ecd821b2df0f7fcd5b26df75630f4171ee32.ttf":{"logical_path":"font-awesome/fa-solid-900.ttf","mtime":"2022-05-27T21:42:11+02:00","size":388460,"digest":"03f2986c0824c68bdaf1e16947352f5fe417d03741806097fa9ea7131fe3a019","integrity":"sha256-A/KYbAgkxova8eFpRzUvX+QX0DdBgGCX+p6nEx/joBk="},"font-awesome/fa-regular-400-6919b47939790fc2ab662fd09b22907c53f32d9a817eed0782e2fb3e7af24b5b.woff2":{"logical_path":"font-awesome/fa-regular-400.woff2","mtime":"2022-05-27T21:42:11+02:00","size":23940,"digest":"6a274e7629c0d71dcf8cab1e7733687ebfe32e2c53b4ca9fad050b4f1d5471f3","integrity":"sha256-aidOdinA1x3PjKsedzNofr/jLixTtMqfrQULTx1UcfM="},"font-awesome/fa-regular-400-79a39b18a5524be800ab200fbedebf7f737a316f01b874fe42b005fda10a6f11.ttf":{"logical_path":"font-awesome/fa-regular-400.ttf","mtime":"2022-05-27T21:42:11+02:00","size":60520,"digest":"4e96a7e098e36fd493194c64e973ba5237da65760c7b746217e63c830326a9ac","integrity":"sha256-Tpan4Jjjb9STGUxk6XO6UjfaZXYMe3RiF+Y8gwMmqaw="},"font-awesome/fa-brands-400-e624f952dec1ac1e2673205a87513cab83c4a0d187b08528a5ff0c36d9b1e090.woff2":{"logical_path":"font-awesome/fa-brands-400.woff2","mtime":"2022-05-27T21:42:11+02:00","size":105536,"digest":"404c746c8f7e3f9b7611a8f23d908c1a32a5c972236b9d89bb68b05d9bf4b905","integrity":"sha256-QEx0bI9+P5t2EajyPZCMGjKlyXIja52Ju2iwXZv0uQU="},"font-awesome/fa-brands-400-d6e9a2e4cad853a5a88711678db47de7456f36b30923f8350f55c41434809ba8.ttf":{"logical_path":"font-awesome/fa-brands-400.ttf","mtime":"2022-05-27T21:42:11+02:00","size":181852,"digest":"e523f49c12b13a176014af1a46ae5a0545b136bf56d496426aa881026d0c318a","integrity":"sha256-5SP0nBKxOhdgFK8aRq5aBUWxNr9W1JZCaqiBAm0MMYo="},"form-9f90a38d35bb26c36651a72cc781dae16f0fb3db91f4667a4bcc6343be27c31e.css":{"logical_path":"form.css","mtime":"2022-04-10T23:03:15+02:00","size":112557,"digest":"82ebdbf8e7579a209a4e8c0f07d27169f45dbef285fa005e6dd727ac7acc5893","integrity":"sha256-guvb+OdXmiCaTowPB9JxafRdvvKF+gBebdcnrHrMWJM="},"actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js":{"logical_path":"actiontext.js","mtime":"2022-05-27T21:42:11+02:00","size":30457,"digest":"bcc99d511868dd8b36e6a36485cfcb08299e8d5ed60749987b16486bc7d9fec4","integrity":"sha256-vMmdURho3Ys25qNkhc/LCCmejV7WB0mYexZIa8fZ/sQ="},"trix-1563ff9c10f74e143b3ded40a8458497eaf2f87a648a5cbbfebdb7dec3447a5e.js":{"logical_path":"trix.js","mtime":"2022-05-27T21:42:11+02:00","size":331822,"digest":"f9d8ba8330bd834665c7b3190ae739b21bae1cc9131d132b9839788d648e3d61","integrity":"sha256-+di6gzC9g0Zlx7MZCuc5shuuHMkTHRMrmDl4jWSOPWE="},"trix-6fd35bb8fae1d6a795115763ca265369b9750f73a1c6283a0b0ef4b6c2d550c8.css":{"logical_path":"trix.css","mtime":"2022-05-27T21:42:11+02:00","size":14054,"digest":"e2950144e21f62655820d93219c1f76d4dff7a39565c7d847d59b6d0de3cf381","integrity":"sha256-4pUBROIfYmVYINkyGcH3bU3/ejlWXH2EfVm20N4884E="},"active_admin-ae7525b879029a3d2fee45967491fda6ffacc68c434ff7f10183bbe5249c86d7.css":{"logical_path":"active_admin.css","mtime":"2022-05-22T13:48:05+02:00","size":162473,"digest":"d891f09b0c5fc2cbf110ed1f344211d64c23fad076e9c2b33f2a4467b6a604e9","integrity":"sha256-2JHwmwxfwsvxEO0fNEIR1kwj+tB26cKzPypEZ7amBOk="},"active_admin-f992ca5d9243601d31dad73c57a4aa5a2b9170b75890935419af02778b86c258.js":{"logical_path":"active_admin.js","mtime":"2022-05-22T18:31:04+02:00","size":978871,"digest":"ef21a6edc93359ccd73b7ccfda7cd6263b24a069755ffffac0900b2a6dd2d8c5","integrity":"sha256-7yGm7ckzWczXO3zP2nzWJjskoGl1X//6wJALKm3S2MU="},"tinymce-039e939395dd032c76e34c5742fe134e3efbed2712715bd90a2d86e35769d0e8.js":{"logical_path":"tinymce.js","mtime":"2022-04-11T11:07:13+02:00","size":1082889,"digest":"ac690ebc399de6cc2213f5f4c9a408dddb3b22a1ac5e4e470588c854f899f758","integrity":"sha256-rGkOvDmd5swiE/X0yaQI3ds7IqGsXk5HBYjIVPiZ91g="},"activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js":{"logical_path":"activestorage.js","mtime":"2022-05-27T21:42:11+02:00","size":29045,"digest":"718a3b7737430511519d7175a20269953d97a1252acb0c17e9f7ffe5cac4f4a7","integrity":"sha256-cYo7dzdDBRFRnXF1ogJplT2XoSUqywwX6ff/5crE9Kc="},"activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js":{"logical_path":"activestorage.esm.js","mtime":"2022-05-27T21:42:11+02:00","size":26992,"digest":"a10bcef9e766c86260e93966fa6f2fe5efb8b03c744634d8bf0b835eca5414ca","integrity":"sha256-oQvO+edmyGJg6Tlm+m8v5e+4sDx0RjTYvwuDXspUFMo="},"actioncable-da745289dc396d1588ddfd149d68bb8e519d9e7059903aa2bb98cfc57be6d66e.js":{"logical_path":"actioncable.js","mtime":"2022-04-11T11:07:13+02:00","size":15701,"digest":"b64d2d1ee957609a8ad7a68c11fb94b76d40ec4adb4a6bdaed9f8928f3907c55","integrity":"sha256-tk0tHulXYJqK16aMEfuUt21A7ErbSmva7Z+JKPOQfFU="},"actioncable.esm-3d92de0486af7257cac807acf379cea45baf450c201e71e3e84884c0e1b5ee15.js":{"logical_path":"actioncable.esm.js","mtime":"2022-04-11T11:07:13+02:00","size":14082,"digest":"608d0f80b12a3adba120876ea0b2721e75b649556cae97fcb98fb83cc37dfa1b","integrity":"sha256-YI0PgLEqOtuhIIduoLJyHnW2SVVsrpf8uY+4PMN9+hs="},"form-eec7b128a5ad80130478cbec515e36bd4a3fbd9c5e110dc493af761efd901728.css":{"logical_path":"form.css","mtime":"2022-04-10T22:40:10+02:00","size":112841,"digest":"d8e9cfeb6fea6a007615d6ba521be3a94357e11f36dfe9434e217d0a3e3b191c","integrity":"sha256-2OnP62/qagB2Fda6UhvjqUNX4R823+lDTiF9Cj47GRw="},"application-a9c5badf4217cb52b79885bbc9de63ce27c7506889b4b652f4c960f22f2321fd.js":{"logical_path":"application.js","mtime":"2022-04-11T11:07:12+02:00","size":2021032,"digest":"d278990bfefe5775ea3a2af6430fb42d3319b176a2382666cfbc863b05822bf0","integrity":"sha256-0niZC/7+V3XqOir2Qw+0LTMZsXaiOCZmz7yGOwWCK/A="},"application-0c390af53f43f7fd5dbf6e72b1c655b940aeb0daec81afe56cdb5798d058bec4.css":{"logical_path":"application.css","mtime":"2022-05-22T13:48:05+02:00","size":324456,"digest":"6fc11420e92a93c82336d31a9fda4f646185957dfc9c25be311319eb61fedf92","integrity":"sha256-b8EUIOkqk8gjNtMan9pPZGGFlX38nCW+MRMZ62H+35I="},"setup_tinymce-bf1768a15a0295d3422afc5a0b7a6d68198ae3decad69afba6eecbcea51fc01a.js":{"logical_path":"setup_tinymce.js","mtime":"2022-04-11T11:07:12+02:00","size":1091,"digest":"5c2767c3a12edba7db5d7b64138a7ddff0965aa876723d736d6030983c22a09e","integrity":"sha256-XCdnw6Eu26fbXXtkE4p93/CWWqh2cj1zbWAwmDwioJ4="},"form-f538ad878340c212194ccc353a0413127beb91a909abf7c713cf0d59e8bdab0c.css":{"logical_path":"form.css","mtime":"2022-05-27T21:42:11+02:00","size":112551,"digest":"d0ebb1d502862fa1e3798add71d4506f2a3247a0f406eefd49f439cc5d8deb8c","integrity":"sha256-0Oux1QKGL6HjeYrdcdRQbyoyR6D0Bu79SfQ5zF2N64w="},"manifest-597b5199768f5efff6ec880a4180aec95099b04608cc46e56dfe4e0940ee4665.js":{"logical_path":"manifest.js","mtime":"2022-05-27T21:42:11+02:00","size":8,"digest":"79488488398f5f5aed236dd6e9f914599370d04dfe70fda61b8c83bf739b1088","integrity":"sha256-eUiEiDmPX1rtI23W6fkUWZNw0E3+cP2mG4yDv3ObEIg="},"application-bc8be1ca9329364a332d65400703da287de4e0022ead70f15b2284ecc00f8ba7.js":{"logical_path":"application.js","mtime":"2022-05-22T13:48:05+02:00","size":2000019,"digest":"4e437d8a115904d1919901117d29bab0ee4270adb1cac225b1610854fd2b0b41","integrity":"sha256-TkN9ihFZBNGRmQERfSm6sO5CcK2xysIlsWEIVP0rC0E="},"events-3e83b10967184ff7800176a5aae37f0d45162e4dbc6a8d101e79636eb2274842.js":{"logical_path":"events.js","mtime":"2022-05-27T21:42:11+02:00","size":2139,"digest":"df6cefd99e99c4107486c54fbad634ec43daf47bb81fdf8422264610b9726be1","integrity":"sha256-32zv2Z6ZxBB0hsVPutY07EPa9Hu4H9+EIiZGELlya+E="},"setup_tinymce-60b664f97cee4cc8468740edb342c358b980bba2fcf5704bb659052f4ab2f44f.js":{"logical_path":"setup_tinymce.js","mtime":"2022-05-22T13:48:05+02:00","size":1110,"digest":"251e4b88be43fe6cb86136013a35a29f91c12372075531cd78256c75d09ab9c0","integrity":"sha256-JR5LiL5D/my4YTYBOjWin5HBI3IHVTHNeCVsddCaucA="},"es-module-shims-98e5c1733b56bbd38eb81a6b95c76993d1549a149630db86b70b52ef7bf09f38.js":{"logical_path":"es-module-shims.js","mtime":"2022-05-22T18:31:04+02:00","size":48019,"digest":"ce8ba83112b97a45d46c45480f5e99298063aa74b861ad15be4f27e20c7b5af5","integrity":"sha256-zouoMRK5ekXUbEVID16ZKYBjqnS4Ya0Vvk8n4gx7WvU="},"es-module-shims.min-8b21b40925fc92896e87358f40a2a8aaea6bf306b34ee4a215ec09c59c6cb3ba.js":{"logical_path":"es-module-shims.min.js","mtime":"2022-05-22T18:31:04+02:00","size":32552,"digest":"6003d601047f980c11079ec149fbd98f2f4ea2d258cf1e789b7170f968100f9e","integrity":"sha256-YAPWAQR/mAwRB57BSfvZjy9OotJYzx54m3Fw+WgQD54="},"es-module-shims.js-b3dc1eaec0edc72cb130edacd5193386c67b6be171383614226d986a6b991ad4.map":{"logical_path":"es-module-shims.js.map","mtime":"2022-05-22T18:31:04+02:00","size":101725,"digest":"cd843fdbe8862e749c2a5cbb10718f5f1ae2a63ee84cb3d181dc0dfb6857919c","integrity":"sha256-zYQ/2+iGLnScKly7EHGPXxripj7oTLPRgdwN+2hXkZw="},"tinymce-0a65cd0b35e87db0a198eb30e4daa2085929a73d1ccba4d8c7531a2245443311.js":{"logical_path":"tinymce.js","mtime":"2022-05-22T18:31:04+02:00","size":1067681,"digest":"04b1c31c00e5dee834440f6c9b241c0b5896c45fa2d3f413bd8b6b8a4e51b470","integrity":"sha256-BLHDHADl3ug0RA9smyQcC1iWxF+i0/QTvYtrik5RtHA="},"actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js":{"logical_path":"actioncable.js","mtime":"2022-05-27T21:42:11+02:00","size":15699,"digest":"6b2fe44d9e4546fcc6b92f0a37b61d6b555020041ede1dd603c007b1c0904ec1","integrity":"sha256-ay/kTZ5FRvzGuS8KN7Yda1VQIAQe3h3WA8AHscCQTsE="},"actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js":{"logical_path":"actioncable.esm.js","mtime":"2022-05-27T21:42:11+02:00","size":14080,"digest":"a9e53dfa810276aa0aee8791a910c4878d48b75093398f3d6d822db41b428b7b","integrity":"sha256-qeU9+oECdqoK7oeRqRDEh41It1CTOY89bYIttBtCi3s="},"application-14e1e96bfbd100fc952a731001b2d2e04189f0702d8a6ae050503030259dd668.js":{"logical_path":"application.js","mtime":"2022-05-22T18:31:04+02:00","size":2000019,"digest":"2cd3220b1494f3a19582ffa006586cb580473625714609c01f3c3ed599fdc328","integrity":"sha256-LNMiCxSU86GVgv+gBlhstYBHNiVxRgnAHzw+1Zn9wyg="},"application-0ec4812f14f3da4405d5bea5a5aa18db9b4518953d17a2bf1198215db5a54b2b.css":{"logical_path":"application.css","mtime":"2022-05-27T21:42:11+02:00","size":324691,"digest":"cb7989173b2ed312d483ad4816af8f1864af1888c05c386df2925fb8b7a6356f","integrity":"sha256-y3mJFzsu0xLUg61IFq+PGGSvGIjAXDht8pJfuLemNW8="},"setup_tinymce-25067ac5d8f690f8eee54a28349199fcb5831ea846457867835bcf47d57952f6.js":{"logical_path":"setup_tinymce.js","mtime":"2022-05-27T21:42:11+02:00","size":1110,"digest":"e9b2843e2d4e1633044a045ada31cdcd3cbdc02dfaae336d8d109fd11a317792","integrity":"sha256-6bKEPi1OFjMESgRa2jHNzTy9wC36rjNtjRCf0Roxd5I="},"list-561b0a756f4d38ca2e80f68e71f3cf9209d36ae15c5986d05e3989860c0f30ec.css":{"logical_path":"list.css","mtime":"2022-05-27T21:42:11+02:00","size":1175,"digest":"416637826665e906c086041ec3bf0428fa185ee5634ed2782cd326b35fe785c3","integrity":"sha256-QWY3gmZl6QbAhgQew78EKPoYXuVjTtJ4LNMms1/nhcM="},"active_admin-a10a0eb4af00bea304176f8955d734e073ab869cb08fae8f15db407996577f2c.css":{"logical_path":"active_admin.css","mtime":"2022-05-27T21:42:11+02:00","size":162708,"digest":"443b345c34471f8463b184c81f41bb80f29fba1c0195f895faa7eebb0ef5728f","integrity":"sha256-RDs0XDRHH4RjsYTIH0G7gPKfuhwBlfiV+qfuuw71co8="},"application-3313ec750e3521e59e004f73503bf5ff08f41fd4f0e41d6c6a391b23e375797d.js":{"logical_path":"application.js","mtime":"2022-05-27T21:42:11+02:00","size":2001952,"digest":"3a6b629f52de0eb7a6ceabd04d6266686b65c0a6e3ebaacfaec0e794aa26713b","integrity":"sha256-Omtin1LeDremzqvQTWJmaGtlwKbj66rPrsDnlKomcTs="},"es-module-shims-cc9c89730a363e05aad0613bb8a7ee937baa2b44516176f9c19365e348032583.js":{"logical_path":"es-module-shims.js","mtime":"2022-05-27T21:42:11+02:00","size":48253,"digest":"7bd5689e02bc96d9f6a59ed67b29f4e5d8f1b1264286c104b9f91fb014cd1557","integrity":"sha256-e9VongK8ltn2pZ7Weyn05djxsSZChsEEufkfsBTNFVc="},"es-module-shims.min-606ae9c3279013fe751cee30f719a592f759e705edb66496812f3d9dbce3d850.js":{"logical_path":"es-module-shims.min.js","mtime":"2022-05-27T21:42:11+02:00","size":31610,"digest":"a1d01f1a6e5d89b26c09351cc6319a902bcfe8c297d3517f24b252e06d4e660d","integrity":"sha256-odAfGm5dibJsCTUcxjGakCvP6MKX01F/JLJS4G1OZg0="},"es-module-shims.js-d8b1db8467f1af14f3ecf729b9fb6dd6a55f3ccff4499a3f033397e46d48bf68.map":{"logical_path":"es-module-shims.js.map","mtime":"2022-05-27T21:42:11+02:00","size":99545,"digest":"a8f0f66016ddf96ce562db58f0b538ec96a52894b15c53ae4cfda2ff030df753","integrity":"sha256-qPD2YBbd+WzlYttY8LU47JalKJSxXFOuTP2i/wMN91M="},"active_admin-eb8733db747437591c1328e50a95f8ee1a686b381b1db446272df3d19f775b15.js":{"logical_path":"active_admin.js","mtime":"2022-05-27T21:42:11+02:00","size":979821,"digest":"1c87740158d44b23ad0a60a13603c0318d33396d1573bf62340944621447eb04","integrity":"sha256-HId0AVjUSyOtCmChNgPAMY0zOW0Vc79iNAlEYhRH6wQ="},"tinymce-34d3e364e1001c7d181c7a0576664e91f6f69aed7cc29209cde56a622bec6841.js":{"logical_path":"tinymce.js","mtime":"2022-05-27T21:42:11+02:00","size":1068664,"digest":"fbe718844f5a0b0befca35e715bc9c52a1a9feac8359fc510e1d219d96ac3641","integrity":"sha256-++cYhE9aCwvvyjXnFbycUqGp/qyDWfxRDh0hnZasNkE="},"tinymce/jquery.tinymce.js":{"logical_path":"tinymce/jquery.tinymce.js","mtime":"2022-04-11T11:07:13+02:00","size":6597,"digest":null,"integrity":"sha256-8g5ZQwwujnwJQ+zcQtWcBoal43dzb7WJnePsH57+hLw="},"tinymce/langs/readme.md":{"logical_path":"tinymce/langs/readme.md","mtime":"2019-12-21T20:51:18+01:00","size":151,"digest":null},"tinymce/license.txt":{"logical_path":"tinymce/license.txt","mtime":"2022-05-26T10:34:07+02:00","size":1102,"digest":null},"tinymce/plugins/advlist/plugin.js":{"logical_path":"tinymce/plugins/advlist/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":3376,"digest":null},"tinymce/plugins/anchor/plugin.js":{"logical_path":"tinymce/plugins/anchor/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":2537,"digest":null},"tinymce/plugins/autolink/plugin.js":{"logical_path":"tinymce/plugins/autolink/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":2826,"digest":null},"tinymce/plugins/autoresize/plugin.js":{"logical_path":"tinymce/plugins/autoresize/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":2074,"digest":null},"tinymce/plugins/autosave/plugin.js":{"logical_path":"tinymce/plugins/autosave/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":3257,"digest":null},"tinymce/plugins/bbcode/plugin.js":{"logical_path":"tinymce/plugins/bbcode/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":3085,"digest":null,"integrity":"sha256-23mUUjcmlbg6UrkYrZPjoTuDxCEUL7SEAxo40gAND5g="},"tinymce/plugins/charmap/plugin.js":{"logical_path":"tinymce/plugins/charmap/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":10981,"digest":null},"tinymce/plugins/code/plugin.js":{"logical_path":"tinymce/plugins/code/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":877,"digest":null},"tinymce/plugins/codesample/plugin.js":{"logical_path":"tinymce/plugins/codesample/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":46812,"digest":null},"tinymce/plugins/colorpicker/plugin.js":{"logical_path":"tinymce/plugins/colorpicker/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":398,"digest":null,"integrity":"sha256-rMnuhnYmYpWklzpHVM2CIDPhkj5iRqt0KZNyyyEQRaI="},"tinymce/plugins/contextmenu/plugin.js":{"logical_path":"tinymce/plugins/contextmenu/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":398,"digest":null,"integrity":"sha256-y86qGZ5bA/P0QNpvUB9u3lgNqldj2CuSfJ/6y6VbPAc="},"tinymce/plugins/directionality/plugin.js":{"logical_path":"tinymce/plugins/directionality/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":4360,"digest":null},"tinymce/plugins/emoticons/js/emojis.js":{"logical_path":"tinymce/plugins/emoticons/js/emojis.js","mtime":"2022-05-26T10:34:07+02:00","size":192856,"digest":null},"tinymce/plugins/emoticons/plugin.js":{"logical_path":"tinymce/plugins/emoticons/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":6325,"digest":null},"tinymce/plugins/fullpage/plugin.js":{"logical_path":"tinymce/plugins/fullpage/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":7821,"digest":null,"integrity":"sha256-77eMqpWsC4eonCzuo7OqJvgNvFj5xvqFRoIkKo0U6vk="},"tinymce/plugins/fullscreen/plugin.js":{"logical_path":"tinymce/plugins/fullscreen/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":14603,"digest":null},"tinymce/plugins/help/plugin.js":{"logical_path":"tinymce/plugins/help/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":13050,"digest":null},"tinymce/plugins/hr/plugin.js":{"logical_path":"tinymce/plugins/hr/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":741,"digest":null,"integrity":"sha256-MN1uFiHblL2k6eIC1gQBNuOEnsncEuHs/UxOSuMXnbo="},"tinymce/plugins/image/plugin.js":{"logical_path":"tinymce/plugins/image/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":19054,"digest":null},"tinymce/plugins/imagetools/plugin.js":{"logical_path":"tinymce/plugins/imagetools/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":19462,"digest":null,"integrity":"sha256-SRYgF0XPui0y7qXIEkE/ei9bppva3P2TtHzMMef1imY="},"tinymce/plugins/importcss/plugin.js":{"logical_path":"tinymce/plugins/importcss/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":4036,"digest":null},"tinymce/plugins/insertdatetime/plugin.js":{"logical_path":"tinymce/plugins/insertdatetime/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":2911,"digest":null},"tinymce/plugins/legacyoutput/plugin.js":{"logical_path":"tinymce/plugins/legacyoutput/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":3005,"digest":null,"integrity":"sha256-TXPybhgtrcIsJa1FIBZqluFbmIQnHP/6AM2Cbxvkkbw="},"tinymce/plugins/link/plugin.js":{"logical_path":"tinymce/plugins/link/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":14982,"digest":null},"tinymce/plugins/lists/plugin.js":{"logical_path":"tinymce/plugins/lists/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":21934,"digest":null},"tinymce/plugins/media/plugin.js":{"logical_path":"tinymce/plugins/media/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":16187,"digest":null},"tinymce/plugins/nonbreaking/plugin.js":{"logical_path":"tinymce/plugins/nonbreaking/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":1416,"digest":null},"tinymce/plugins/noneditable/plugin.js":{"logical_path":"tinymce/plugins/noneditable/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":1755,"digest":null,"integrity":"sha256-WfptbDe7nrAKZmqQAxTgccwqToqwcuY1Hh4GM5xN4Uk="},"tinymce/plugins/pagebreak/plugin.js":{"logical_path":"tinymce/plugins/pagebreak/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":1503,"digest":null},"tinymce/plugins/paste/plugin.js":{"logical_path":"tinymce/plugins/paste/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":22567,"digest":null,"integrity":"sha256-b0md3eoMg32NuUqFKYdyUpWfcji5FgudvWxCMYylmb4="},"tinymce/plugins/preview/plugin.js":{"logical_path":"tinymce/plugins/preview/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":1703,"digest":null},"tinymce/plugins/print/plugin.js":{"logical_path":"tinymce/plugins/print/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":809,"digest":null,"integrity":"sha256-Y43vqtp5QlHhpAx6WiGD/tZWzKQLPRhdivtL+G5UZ70="},"tinymce/plugins/quickbars/plugin.js":{"logical_path":"tinymce/plugins/quickbars/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":4908,"digest":null},"tinymce/plugins/save/plugin.js":{"logical_path":"tinymce/plugins/save/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":1592,"digest":null},"tinymce/plugins/searchreplace/plugin.js":{"logical_path":"tinymce/plugins/searchreplace/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":13265,"digest":null},"tinymce/plugins/spellchecker/plugin.js":{"logical_path":"tinymce/plugins/spellchecker/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":9787,"digest":null,"integrity":"sha256-vOzEs48MOt/kr4oHPdM6FfTpw8IL/kxJpGMRa+lwNBg="},"tinymce/plugins/tabfocus/plugin.js":{"logical_path":"tinymce/plugins/tabfocus/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":1859,"digest":null,"integrity":"sha256-vWcwoMf0XTa8srkLhWo6//2EIFhj6Hy7wUEeLf9acQQ="},"tinymce/plugins/table/plugin.js":{"logical_path":"tinymce/plugins/table/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":46810,"digest":null},"tinymce/plugins/template/plugin.js":{"logical_path":"tinymce/plugins/template/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":8063,"digest":null},"tinymce/plugins/textcolor/plugin.js":{"logical_path":"tinymce/plugins/textcolor/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":396,"digest":null,"integrity":"sha256-8DPtQxOFuybVpsU2iJsmNQHmddi29qSp1c6drk4pRgs="},"tinymce/plugins/textpattern/plugin.js":{"logical_path":"tinymce/plugins/textpattern/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":17614,"digest":null,"integrity":"sha256-f8gbbCTlliDKwWuy6b7KCfrFt1I3ZINcyHUJNzSrjho="},"tinymce/plugins/toc/plugin.js":{"logical_path":"tinymce/plugins/toc/plugin.js","mtime":"2022-04-11T11:07:13+02:00","size":3283,"digest":null,"integrity":"sha256-RJivU5OanQhkzMSyk7YTRVO/hTqD4bMgIo/DqsBL5SI="},"tinymce/plugins/visualblocks/plugin.js":{"logical_path":"tinymce/plugins/visualblocks/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":1230,"digest":null},"tinymce/plugins/visualchars/plugin.js":{"logical_path":"tinymce/plugins/visualchars/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":5172,"digest":null},"tinymce/plugins/wordcount/plugin.js":{"logical_path":"tinymce/plugins/wordcount/plugin.js","mtime":"2022-05-26T10:34:07+02:00","size":11913,"digest":null},"tinymce/skins/content/dark/content.css":{"logical_path":"tinymce/skins/content/dark/content.css","mtime":"2022-05-26T10:34:07+02:00","size":1216,"digest":null},"tinymce/skins/content/dark/content.min.css":{"logical_path":"tinymce/skins/content/dark/content.min.css","mtime":"2022-05-26T10:34:07+02:00","size":1216,"digest":null},"tinymce/skins/content/default/content.css":{"logical_path":"tinymce/skins/content/default/content.css","mtime":"2022-05-26T10:34:07+02:00","size":1149,"digest":null},"tinymce/skins/content/default/content.min.css":{"logical_path":"tinymce/skins/content/default/content.min.css","mtime":"2022-05-26T10:34:07+02:00","size":1149,"digest":null},"tinymce/skins/content/document/content.css":{"logical_path":"tinymce/skins/content/document/content.css","mtime":"2022-05-26T10:34:07+02:00","size":1248,"digest":null},"tinymce/skins/content/document/content.min.css":{"logical_path":"tinymce/skins/content/document/content.min.css","mtime":"2022-05-26T10:34:07+02:00","size":1248,"digest":null},"tinymce/skins/content/writer/content.css":{"logical_path":"tinymce/skins/content/writer/content.css","mtime":"2022-05-26T10:34:07+02:00","size":1170,"digest":null},"tinymce/skins/content/writer/content.min.css":{"logical_path":"tinymce/skins/content/writer/content.min.css","mtime":"2022-05-26T10:34:07+02:00","size":1170,"digest":null},"tinymce/skins/ui/oxide-dark/content.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.css","mtime":"2022-05-26T10:34:07+02:00","size":21341,"digest":null},"tinymce/skins/ui/oxide-dark/content.inline.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.css","mtime":"2022-05-26T10:34:07+02:00","size":21671,"digest":null},"tinymce/skins/ui/oxide-dark/content.inline.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.inline.min.css","mtime":"2022-05-26T10:34:07+02:00","size":21671,"digest":null},"tinymce/skins/ui/oxide-dark/content.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.min.css","mtime":"2022-05-26T10:34:07+02:00","size":21341,"digest":null},"tinymce/skins/ui/oxide-dark/content.mobile.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.mobile.css","mtime":"2022-04-11T11:07:13+02:00","size":294,"digest":null,"integrity":"sha256-7qF/Ddgyp8cwRME7hp57kTRuMu/iJl84uTHyxgQL6F8="},"tinymce/skins/ui/oxide-dark/content.mobile.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/content.mobile.min.css","mtime":"2022-04-11T11:07:13+02:00","size":294,"digest":null,"integrity":"sha256-7qF/Ddgyp8cwRME7hp57kTRuMu/iJl84uTHyxgQL6F8="},"tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff":{"logical_path":"tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff","mtime":"2022-04-11T11:07:13+02:00","size":4624,"digest":null,"integrity":"sha256-5kvxVqQy1j9bNLRWe1E9wNNRtJFhx/YI+4JXS/3Z0hM="},"tinymce/skins/ui/oxide-dark/skin.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.css","mtime":"2022-05-26T10:34:07+02:00","size":61737,"digest":null},"tinymce/skins/ui/oxide-dark/skin.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.min.css","mtime":"2022-05-26T10:34:07+02:00","size":61737,"digest":null},"tinymce/skins/ui/oxide-dark/skin.mobile.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.css","mtime":"2022-04-11T11:07:13+02:00","size":20784,"digest":null,"integrity":"sha256-+bvlWAAYT8UCK7hH78X2kL4bwAJ/acL7D4PNnOrZKro="},"tinymce/skins/ui/oxide-dark/skin.mobile.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.mobile.min.css","mtime":"2022-04-11T11:07:13+02:00","size":20784,"digest":null,"integrity":"sha256-+bvlWAAYT8UCK7hH78X2kL4bwAJ/acL7D4PNnOrZKro="},"tinymce/skins/ui/oxide/content.css":{"logical_path":"tinymce/skins/ui/oxide/content.css","mtime":"2022-05-26T10:34:07+02:00","size":21730,"digest":null},"tinymce/skins/ui/oxide/content.inline.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.css","mtime":"2022-05-26T10:34:07+02:00","size":21671,"digest":null},"tinymce/skins/ui/oxide/content.inline.min.css":{"logical_path":"tinymce/skins/ui/oxide/content.inline.min.css","mtime":"2022-05-26T10:34:07+02:00","size":21671,"digest":null},"tinymce/skins/ui/oxide/content.min.css":{"logical_path":"tinymce/skins/ui/oxide/content.min.css","mtime":"2022-05-26T10:34:07+02:00","size":21730,"digest":null},"tinymce/skins/ui/oxide/content.mobile.css":{"logical_path":"tinymce/skins/ui/oxide/content.mobile.css","mtime":"2022-04-11T11:07:13+02:00","size":294,"digest":null,"integrity":"sha256-7qF/Ddgyp8cwRME7hp57kTRuMu/iJl84uTHyxgQL6F8="},"tinymce/skins/ui/oxide/content.mobile.min.css":{"logical_path":"tinymce/skins/ui/oxide/content.mobile.min.css","mtime":"2022-04-11T11:07:13+02:00","size":294,"digest":null,"integrity":"sha256-7qF/Ddgyp8cwRME7hp57kTRuMu/iJl84uTHyxgQL6F8="},"tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff":{"logical_path":"tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff","mtime":"2022-04-11T11:07:13+02:00","size":4624,"digest":null,"integrity":"sha256-5kvxVqQy1j9bNLRWe1E9wNNRtJFhx/YI+4JXS/3Z0hM="},"tinymce/skins/ui/oxide/skin.css":{"logical_path":"tinymce/skins/ui/oxide/skin.css","mtime":"2022-05-26T10:34:07+02:00","size":61662,"digest":null},"tinymce/skins/ui/oxide/skin.min.css":{"logical_path":"tinymce/skins/ui/oxide/skin.min.css","mtime":"2022-05-26T10:34:07+02:00","size":61662,"digest":null},"tinymce/skins/ui/oxide/skin.mobile.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.css","mtime":"2022-04-11T11:07:13+02:00","size":20784,"digest":null,"integrity":"sha256-+bvlWAAYT8UCK7hH78X2kL4bwAJ/acL7D4PNnOrZKro="},"tinymce/skins/ui/oxide/skin.mobile.min.css":{"logical_path":"tinymce/skins/ui/oxide/skin.mobile.min.css","mtime":"2022-04-11T11:07:13+02:00","size":20784,"digest":null,"integrity":"sha256-+bvlWAAYT8UCK7hH78X2kL4bwAJ/acL7D4PNnOrZKro="},"tinymce/themes/mobile/theme.js":{"logical_path":"tinymce/themes/mobile/theme.js","mtime":"2022-04-11T11:07:13+02:00","size":159749,"digest":null,"integrity":"sha256-Si0fOE/XrsoXRFoa0MlY9uxZSwoLwkd/B//KIMpBq+Q="},"tinymce/themes/silver/theme.js":{"logical_path":"tinymce/themes/silver/theme.js","mtime":"2022-05-26T10:34:07+02:00","size":344437,"digest":null},"tinymce/tinymce.js":{"logical_path":"tinymce/tinymce.js","mtime":"2022-05-26T10:34:07+02:00","size":390912,"digest":null},"tinymce/icons/default/icons.js":{"logical_path":"tinymce/icons/default/icons.js","mtime":"2022-05-26T10:34:07+02:00","size":63894,"digest":null},"tinymce/plugins/emoticons/js/emojiimages.js":{"logical_path":"tinymce/plugins/emoticons/js/emojiimages.js","mtime":"2022-05-26T10:34:07+02:00","size":416095,"digest":null},"tinymce/skins/ui/oxide-dark/skin.shadowdom.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.shadowdom.css","mtime":"2022-05-26T10:34:07+02:00","size":508,"digest":null},"tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css":{"logical_path":"tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css","mtime":"2022-05-26T10:34:07+02:00","size":508,"digest":null},"tinymce/skins/ui/oxide/skin.shadowdom.css":{"logical_path":"tinymce/skins/ui/oxide/skin.shadowdom.css","mtime":"2022-05-26T10:34:07+02:00","size":508,"digest":null},"tinymce/skins/ui/oxide/skin.shadowdom.min.css":{"logical_path":"tinymce/skins/ui/oxide/skin.shadowdom.min.css","mtime":"2022-05-26T10:34:07+02:00","size":508,"digest":null},"tinymce/langs/README.md":{"logical_path":"tinymce/langs/README.md","mtime":"2022-05-26T10:34:07+02:00","size":151,"digest":null},"tinymce/models/dom/model.js":{"logical_path":"tinymce/models/dom/model.js","mtime":"2022-05-26T10:34:07+02:00","size":95440,"digest":null},"tinymce/skins/content/tinymce-5/content.css":{"logical_path":"tinymce/skins/content/tinymce-5/content.css","mtime":"2022-05-26T10:34:07+02:00","size":1149,"digest":null},"tinymce/skins/content/tinymce-5/content.min.css":{"logical_path":"tinymce/skins/content/tinymce-5/content.min.css","mtime":"2022-05-26T10:34:07+02:00","size":1149,"digest":null},"tinymce/skins/content/tinymce-5-dark/content.css":{"logical_path":"tinymce/skins/content/tinymce-5-dark/content.css","mtime":"2022-05-26T10:34:07+02:00","size":1219,"digest":null},"tinymce/skins/content/tinymce-5-dark/content.min.css":{"logical_path":"tinymce/skins/content/tinymce-5-dark/content.min.css","mtime":"2022-05-26T10:34:07+02:00","size":1219,"digest":null},"tinymce/skins/ui/tinymce-5/content.css":{"logical_path":"tinymce/skins/ui/tinymce-5/content.css","mtime":"2022-05-26T10:34:07+02:00","size":21730,"digest":null},"tinymce/skins/ui/tinymce-5/content.inline.css":{"logical_path":"tinymce/skins/ui/tinymce-5/content.inline.css","mtime":"2022-05-26T10:34:07+02:00","size":21671,"digest":null},"tinymce/skins/ui/tinymce-5/content.inline.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5/content.inline.min.css","mtime":"2022-05-26T10:34:07+02:00","size":21671,"digest":null},"tinymce/skins/ui/tinymce-5/content.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5/content.min.css","mtime":"2022-05-26T10:34:07+02:00","size":21730,"digest":null},"tinymce/skins/ui/tinymce-5/skin.css":{"logical_path":"tinymce/skins/ui/tinymce-5/skin.css","mtime":"2022-05-26T10:34:07+02:00","size":63833,"digest":null},"tinymce/skins/ui/tinymce-5/skin.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5/skin.min.css","mtime":"2022-05-26T10:34:07+02:00","size":63833,"digest":null},"tinymce/skins/ui/tinymce-5/skin.shadowdom.css":{"logical_path":"tinymce/skins/ui/tinymce-5/skin.shadowdom.css","mtime":"2022-05-26T10:34:07+02:00","size":508,"digest":null},"tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css","mtime":"2022-05-26T10:34:07+02:00","size":508,"digest":null},"tinymce/skins/ui/tinymce-5-dark/content.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/content.css","mtime":"2022-05-26T10:34:07+02:00","size":21341,"digest":null},"tinymce/skins/ui/tinymce-5-dark/content.inline.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/content.inline.css","mtime":"2022-05-26T10:34:07+02:00","size":21671,"digest":null},"tinymce/skins/ui/tinymce-5-dark/content.inline.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/content.inline.min.css","mtime":"2022-05-26T10:34:07+02:00","size":21671,"digest":null},"tinymce/skins/ui/tinymce-5-dark/content.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/content.min.css","mtime":"2022-05-26T10:34:07+02:00","size":21341,"digest":null},"tinymce/skins/ui/tinymce-5-dark/skin.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/skin.css","mtime":"2022-05-26T10:34:07+02:00","size":63732,"digest":null},"tinymce/skins/ui/tinymce-5-dark/skin.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/skin.min.css","mtime":"2022-05-26T10:34:07+02:00","size":63732,"digest":null},"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css","mtime":"2022-05-26T10:34:07+02:00","size":508,"digest":null},"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css":{"logical_path":"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css","mtime":"2022-05-26T10:34:07+02:00","size":508,"digest":null},"tinymce/tinymce.d.ts":{"logical_path":"tinymce/tinymce.d.ts","mtime":"2022-05-26T10:34:07+02:00","size":111492,"digest":null}},"assets":{"active_admin.js":"active_admin-eb8733db747437591c1328e50a95f8ee1a686b381b1db446272df3d19f775b15.js","tinymce.js":"tinymce-34d3e364e1001c7d181c7a0576664e91f6f69aed7cc29209cde56a622bec6841.js","modernizr.js":"modernizr-79e0181ec91aff04bb01d87cba546535ede843f75d19f5c60f66b8dd6546971f.js","font-awesome/fa-brands-400.eot":"font-awesome/fa-brands-400-361037e19d0b6000027564e9edcad98c8a179be70c6c4e0a6ab54cd6d41685bd.eot","font-awesome/fa-regular-400.eot":"font-awesome/fa-regular-400-aa1ea349a5a1557fdd700fa5b27df5a01e3b49761201c4d5a95c442e4f7b72c7.eot","font-awesome/fa-solid-900.eot":"font-awesome/fa-solid-900-74883516ac6bb785f2d12d162d769fa7a8fabc7794ef44fc28ffc375b2d7c27c.eot","font-awesome/fa-brands-400.svg":"font-awesome/fa-brands-400-b077551ebb83f7299deaa16b45877ddd3eda20c4988ac79b6def416e7d2b6b3a.svg","font-awesome/fa-regular-400.svg":"font-awesome/fa-regular-400-00c96447c535a41055597d80db75302fc04fd1c909239eada694daa76cd77a20.svg","font-awesome/fa-solid-900.svg":"font-awesome/fa-solid-900-387bea778f72246fad5ea5b69f68cd059a942e3ab181eb2390ad089bc9cc5e06.svg","font-awesome/fa-brands-400.ttf":"font-awesome/fa-brands-400-d6e9a2e4cad853a5a88711678db47de7456f36b30923f8350f55c41434809ba8.ttf","font-awesome/fa-regular-400.ttf":"font-awesome/fa-regular-400-79a39b18a5524be800ab200fbedebf7f737a316f01b874fe42b005fda10a6f11.ttf","font-awesome/fa-solid-900.ttf":"font-awesome/fa-solid-900-a0cc38b88839387e4451bb1ebdd9ecd821b2df0f7fcd5b26df75630f4171ee32.ttf","font-awesome/fa-brands-400.woff":"font-awesome/fa-brands-400-8b2dc7ace7b22f70f42c11f1606d1ee82ad46445c2f05587928e239e567ff68e.woff","font-awesome/fa-regular-400.woff":"font-awesome/fa-regular-400-180eef6acca110a022bb81621c04937b3d2edf09fb7644daba7f95368e73b0bd.woff","font-awesome/fa-solid-900.woff":"font-awesome/fa-solid-900-195989f30d333ecf41e0021dbb92c690f367d2672c43199079d9be4b81dc90da.woff","font-awesome/fa-brands-400.woff2":"font-awesome/fa-brands-400-e624f952dec1ac1e2673205a87513cab83c4a0d187b08528a5ff0c36d9b1e090.woff2","font-awesome/fa-regular-400.woff2":"font-awesome/fa-regular-400-6919b47939790fc2ab662fd09b22907c53f32d9a817eed0782e2fb3e7af24b5b.woff2","font-awesome/fa-solid-900.woff2":"font-awesome/fa-solid-900-addc97d14257b43232b89194f73bd3b862007d5eedcb4569362b8f26356d8db3.woff2","active_admin/print.css":"active_admin/print-f6ce3ffc349ca6c010940202a36b916e852d26179018d2cdc1513350bea7dcba.css","active_admin.css":"active_admin-a10a0eb4af00bea304176f8955d734e073ab869cb08fae8f15db407996577f2c.css","manifest.js":"manifest-597b5199768f5efff6ec880a4180aec95099b04608cc46e56dfe4e0940ee4665.js","agendadescommuns.png":"agendadescommuns-04172a222503a300e6ccc24863ac39c7e17aab83d4fddd47fa233b2ba10150ce.png","alert.png":"alert-4401130d700faadafe42bf322264e2689dae9ded22c1186c38ad2699d28b9715.png","baby_gnu_adl.png":"baby_gnu_adl-16fb75eef2962c69ecbbe7c41bd49c38f9c59318aacbf18c8b8fefd41cc7be12.png","baby_gnu_adl.svg":"baby_gnu_adl-70951d780455e377aa0564b263a36704960870d645900005d18eb907ac4627cb.svg","communs.png":"communs-04172a222503a300e6ccc24863ac39c7e17aab83d4fddd47fa233b2ba10150ce.png","lef-small.png":"lef-small-5d6eb3183e342c1918feba6dcbefd7efbf9f8eb6058599a7a1d2252beb0369d0.png","lef.png":"lef-38da607e793696b80e684feb25a45fe9afcab6d8d105a6f6a098d5ccfc17cb41.png","linux-presentation-day.png":"linux-presentation-day-30da5011055ef1b832234bf8fa8777b60bda3fed09a3cf7ae36a507e1fb8f272.png","osm_logo.svg":"osm_logo-d4979005d8a03d67bbf051b4e7e6ef1b26c6a34a5cd1b65908e2947c360ca391.svg","priorite-logiciel-libre-je-soutiens-april_2_m.png":"priorite-logiciel-libre-je-soutiens-april_2_m-61a1cf930cdc5b1bd39dea68ef26aad7ea086d7baaf04f96b72ffaa5a7a68bdc.png","regions/CA-QC.png":"regions/CA-QC-8d0df3da21ac158626b9aba2827b07d708e9fd1e6277414ab0d01f9a31ee5099.png","team.png":"team-810a9268a50ca2d493299c8738aa15885a4fed1dd22101844b488b0071b6c44a.png","application.js":"application-3313ec750e3521e59e004f73503bf5ff08f41fd4f0e41d6c6a391b23e375797d.js","application.css":"application-0ec4812f14f3da4405d5bea5a5aa18db9b4518953d17a2bf1198215db5a54b2b.css","flags/4x3/ad.svg":"flags/4x3/ad-04b4b65e6a104b102172258b3894a9a4e29890aa63e8edc4812033dd7387b77e.svg","flags/1x1/ad.svg":"flags/1x1/ad-847534ad5665b0bb24f766110a56922d9115cbd4c35746597e1fc5edb381b41a.svg","flags/4x3/ae.svg":"flags/4x3/ae-f6dd88c6cb3940f07ad1ee2635ec0f081d53885efea97c2f363f61c4f06129e8.svg","flags/1x1/ae.svg":"flags/1x1/ae-c5992978bbf00ada1971a746b819936eb2f73aefac7f10518995545c2ccf2c10.svg","flags/4x3/af.svg":"flags/4x3/af-745ad7e8ea956edf06641d01bf5a0374cfae6902846e62a30ed56ad80f889906.svg","flags/1x1/af.svg":"flags/1x1/af-50e587ac98a5af98e21994909aa1f9898add6842954e2ad6a709d857b39a8b55.svg","flags/4x3/ag.svg":"flags/4x3/ag-ec678db01740bd72757a7883a1dbea0c163e2b0a7a692cc8a0749c6f50428abb.svg","flags/1x1/ag.svg":"flags/1x1/ag-35c11ca3ad0581842f9c1eddc462690e6166f94a8dbb15e248398df93a276004.svg","flags/4x3/ai.svg":"flags/4x3/ai-d688814fa60d2294b79b6ffe3d2a64e55a0bc013718cbf028b5d5720e3041794.svg","flags/1x1/ai.svg":"flags/1x1/ai-850f5995f9b55ac8f30b35157cb1881d149e8257c168f39dbc8e51cae25c222d.svg","flags/4x3/al.svg":"flags/4x3/al-5631be891ba0ccdb1f2a9b3a934031ed681aaeb139acc9e3b414e2561a608495.svg","flags/1x1/al.svg":"flags/1x1/al-96787887d75cd3bd02e8eff8a75ba0856873167743205a5cbfc5439197e3070d.svg","flags/4x3/am.svg":"flags/4x3/am-fd6eb7b12b2bbd15d4e5db6949b57255849f5fecc62d9a48d848bab767f1123e.svg","flags/1x1/am.svg":"flags/1x1/am-85e618fb93d8a64fc145ce0ebfb0397e5468816476df4c43ff0419dfea72d53b.svg","flags/4x3/ao.svg":"flags/4x3/ao-09b6b18d13202b859e9e94b9a88e59701b7b2d00d88d8a749f7f0d3bb71c745c.svg","flags/1x1/ao.svg":"flags/1x1/ao-dd2f7930f4f4214707f7a311f16cae422471094601319a5b69abeb48d384855c.svg","flags/4x3/aq.svg":"flags/4x3/aq-2adcc4b28a1da2ac271675b5377a39f226fe06b135d287215c153957b2176da2.svg","flags/1x1/aq.svg":"flags/1x1/aq-8809bb8b30a063b921c866da0a83236d7dd8a17148ef4c0db3c53ccd0dc15e6f.svg","flags/4x3/ar.svg":"flags/4x3/ar-8208e0546b8e666d806ee3fc3061504a62bf6cdea5fa4385d54c3ba131e3135c.svg","flags/1x1/ar.svg":"flags/1x1/ar-2d821fddef311e29c74ce2b19bbc651a2d613aebbd88f59ad8fc6c3a81544d1b.svg","flags/4x3/as.svg":"flags/4x3/as-a7ce0712972b05287e9ddf7da0e19630d4b440f0ce59b3a50397bc29d162192e.svg","flags/1x1/as.svg":"flags/1x1/as-06505370c9bcfcad7b057757c3e892d12930db56565c0fd0bc86f4af5af5686f.svg","flags/4x3/at.svg":"flags/4x3/at-644b0cc2d91fe69f18d9992488a748efa0df7eb6ddc83ac79351ba9226956d25.svg","flags/1x1/at.svg":"flags/1x1/at-b36d3570a5102400e028dfa0b5204e9c2cd8d72b398e94bab5c51edd0954ce40.svg","flags/4x3/au.svg":"flags/4x3/au-887bb0cc0e77e15153e4c9006e785d5f68c77ca0ab9eb7f538e371a0e4f218af.svg","flags/1x1/au.svg":"flags/1x1/au-ba82260247c564d9f4735fa2eeca092ac9b5d4e32c6a6a8db1d4177b746516a5.svg","flags/4x3/aw.svg":"flags/4x3/aw-ea7eeaeec20598c43c59a2536b150a7fb5e7f6443a5bfb7e1bd72aa7186be8e1.svg","flags/1x1/aw.svg":"flags/1x1/aw-c39c9c3d5de9ece42a7e717ac3670886532dd75d50a34e1b3ae10e39487679fb.svg","flags/4x3/ax.svg":"flags/4x3/ax-4825f85b2d4669c70f360bd63f1e36215d16bace4700dffc61992911de53198a.svg","flags/1x1/ax.svg":"flags/1x1/ax-ce68def4e721fcb48feb3b2aee81ad4ba7e75642ace96f24c059ee82b906c35b.svg","flags/4x3/az.svg":"flags/4x3/az-9e3354b743219dbaf19cc54a63e1a8ed41d1f41485455330775b3b5c6dd6c9fe.svg","flags/1x1/az.svg":"flags/1x1/az-4e93f9eef0ef96515e8c152c87d4a278d725ecb20108257105c9ccd48a156ddb.svg","flags/4x3/ba.svg":"flags/4x3/ba-7e420cae1feb7be337a34f25fb8fd6421295cde2e03273efa7e880d7d5d9281e.svg","flags/1x1/ba.svg":"flags/1x1/ba-2e20ab2d7c91e67460cc9a910016a7706b0d7e5865895cce6b835b4f557cc861.svg","flags/4x3/bb.svg":"flags/4x3/bb-35373b19bd542d0382d79bbd162be7583932adbb180c8b6223614a52c31fb1a0.svg","flags/1x1/bb.svg":"flags/1x1/bb-f5d71a0072d6dbc25a4264c4ab0d997b785550f8e6581230c22bb30fec7c9841.svg","flags/4x3/bd.svg":"flags/4x3/bd-0531b5c730836d8ecfb4b9b79aad2e560dfc53a30e65f2a4030d2f275827f5ae.svg","flags/1x1/bd.svg":"flags/1x1/bd-c35883811cce9a21ef91202da7fc4648cc62b9ffee53a5ad0a88b179494e95fc.svg","flags/4x3/be.svg":"flags/4x3/be-ac7f9445060d07698cf4c4b5126b13397e12949102326caa3179eb98d4a90974.svg","flags/1x1/be.svg":"flags/1x1/be-61e1bb398ed6bf0253a21f9e32feb26395cf5aec5dc05640235d4accf43c2ee1.svg","flags/4x3/bf.svg":"flags/4x3/bf-4f19b8dfd521393da6d1f2ca95cc79d22d558c34c3d74b2718417d9df29726f3.svg","flags/1x1/bf.svg":"flags/1x1/bf-7b037b76d1915df2f978852ebc0b88e6fa9abf8d579ed85e360d081b8f95e09c.svg","flags/4x3/bg.svg":"flags/4x3/bg-1433c1cd05916af99e2db72a9e2c6d7532013a619770b66b51595fcd349cbaa6.svg","flags/1x1/bg.svg":"flags/1x1/bg-d631585f0e0981298746582b913765429bbcdd2349cc6062b8e9e790be5f31f0.svg","flags/4x3/bh.svg":"flags/4x3/bh-d677a52979c37517212e9b9b6697541a366b0104e09808d396a6d02411a983f5.svg","flags/1x1/bh.svg":"flags/1x1/bh-d408321e7282b8ee67413917d3063536197d8ceeb23abc05677d748ebb8a6378.svg","flags/4x3/bi.svg":"flags/4x3/bi-6323bc95384cf7a6ea6c91332c3054e55152b391e8f823828df3d05a3e40854a.svg","flags/1x1/bi.svg":"flags/1x1/bi-e79238de5c139c78aeb157e1b7d5646a79dc5e154f35ad49aeae21321c0a8d78.svg","flags/4x3/bj.svg":"flags/4x3/bj-951d79103aea5585768fa178923f6127f918fc01d02556174dff9f8506cf90ea.svg","flags/1x1/bj.svg":"flags/1x1/bj-7f5cc7510ece68a729788fcfbebd91dd941e0014ba3187b66bcd3da245c78460.svg","flags/4x3/bl.svg":"flags/4x3/bl-cc250a31e29ac0fe10c9e79a35920b280f6ec2731b9d5f701b2313bee631e114.svg","flags/1x1/bl.svg":"flags/1x1/bl-cfb5dd954f586d0662e09cdcbd338da8e225d481896414688262e2bd14c38c8a.svg","flags/4x3/bm.svg":"flags/4x3/bm-1e95c5f49d3f1f4a7049a82cdcd6ae326e4c37effd2249df9f7df423942b7396.svg","flags/1x1/bm.svg":"flags/1x1/bm-e0b05c8af03f5fe3728e191b24bedb2ac2429b86abfba4fa14b7d48960883d9c.svg","flags/4x3/bn.svg":"flags/4x3/bn-2e92465bcaef939fcf20029aedac6af2262eb4ee25e36d64bcf98d03976bbbe9.svg","flags/1x1/bn.svg":"flags/1x1/bn-6a56361917ec344da75ebb87a3713a2eaaf4605d84b1f1e3db1a8df6685bfb3f.svg","flags/4x3/bo.svg":"flags/4x3/bo-4c581c015880880d328153d007fc2517a7e0b53126c1a3a676e4abbb19e4c7fb.svg","flags/1x1/bo.svg":"flags/1x1/bo-ec135db8db19ecafc614799d5e9e459cc5d8e9d91308f7d4511f3b95f8ee1054.svg","flags/4x3/bq.svg":"flags/4x3/bq-973b8d977bde843039e96a9229d803fcbb1c29ba92272b8bc3223b28b8ccc803.svg","flags/1x1/bq.svg":"flags/1x1/bq-78c259288833d36f4d2209a4a95ca18cd3c18820f79f49b278bf7960cf5b34e7.svg","flags/4x3/br.svg":"flags/4x3/br-68ee8e029f99c31821e646aec1c8e9e8f8b1aaf26d72909ac75ff38c1f8e9201.svg","flags/1x1/br.svg":"flags/1x1/br-746af5283e4e792a1a7f94d934cac1e45c94470c4ffd37df5d1ab10bec2fd4db.svg","flags/4x3/bs.svg":"flags/4x3/bs-7b507794ee3f8d7e6b0c5739552e37cd2ab0596fab63a03f20fde4249cbf18d2.svg","flags/1x1/bs.svg":"flags/1x1/bs-277f44ad225c320c1a44610721f5b3a457d7e3d649593b598d59e2ce5164f727.svg","flags/4x3/bt.svg":"flags/4x3/bt-2f99024e1cec950a6bce184bc2d8a27629efdab8178a28bad798881ac3167710.svg","flags/1x1/bt.svg":"flags/1x1/bt-77d4f8b9a2c3dadacce904304c524b507e2a0d4109cf6506aa8cc1c131c359ad.svg","flags/4x3/bv.svg":"flags/4x3/bv-de8bb212ed5afdf6d557928d784ed98d2e2baa7aaaf2ced7abc5cf13fa540423.svg","flags/1x1/bv.svg":"flags/1x1/bv-4e4ae03e0878a6e689a0a2ebfe2b1b10fe58329a86acd73ee41f1a9c569f2cb3.svg","flags/4x3/bw.svg":"flags/4x3/bw-76559252bbe0a305e9228103c5c34c39271a9d0b69f8f2b0dfbea5e18d7b37de.svg","flags/1x1/bw.svg":"flags/1x1/bw-3797276ece0055f7c569dc013b59174f613e956c714b5674c90e911615f61318.svg","flags/4x3/by.svg":"flags/4x3/by-7865b19bb46d15f8004699022907d7c8d07193121dac101a3724b7ca578ee3ba.svg","flags/1x1/by.svg":"flags/1x1/by-7bd37ee878e4225470de8cc284d66cf70785a0329da88b43e5f93e25c047b738.svg","flags/4x3/bz.svg":"flags/4x3/bz-c8dfd550816ef86ff0fb82f9b31ca2467fcf50a7ba53e6163fe2bb01cccab0d5.svg","flags/1x1/bz.svg":"flags/1x1/bz-07baa0c080ae0dec236c42810db344f5b6e4209fe16bc9644cf998108b56b85c.svg","flags/4x3/ca.svg":"flags/4x3/ca-f9229a913dece446e34e6de7245dfd3adbea059934b5beaed45654cef2f1cb1d.svg","flags/1x1/ca.svg":"flags/1x1/ca-47f58efb8689efb510291bb7b7a354c3e434e983914f0cc382e763ecccfa7a6e.svg","flags/4x3/cc.svg":"flags/4x3/cc-acf43807923322e2e43deef84443007b75d0d21ebb8a85d0d4e2837e998798c8.svg","flags/1x1/cc.svg":"flags/1x1/cc-827355b0b5c0a98cd0b479c7914c62d1de7712c643978941a97741c13ee69891.svg","flags/4x3/cd.svg":"flags/4x3/cd-594addda580762e53242cc9e5a3885cc200d6b92c9453b65242c0038e4e22959.svg","flags/1x1/cd.svg":"flags/1x1/cd-6f390c3dac0d0d278ea6593bb615e3e23a94f7e84cc40b917e47bdce520a3a2b.svg","flags/4x3/cf.svg":"flags/4x3/cf-31a4f1c7e55d90551235336b339544920b01a8a4fb27efd5b18d0a68ea908f0e.svg","flags/1x1/cf.svg":"flags/1x1/cf-820b63e306c3eec593028576d9ea830f24526b8e4c8a51cec04f4a1851f1f781.svg","flags/4x3/cg.svg":"flags/4x3/cg-cb3b4a7be309eae587becb687690e332624b75d8a40481abd13a4d8a3c685a87.svg","flags/1x1/cg.svg":"flags/1x1/cg-3b7d163f2951bc21e895dbead028c79b8f97dc4a95f9d9ca76d78b398025a20b.svg","flags/4x3/ch.svg":"flags/4x3/ch-d32cf51d10ea8174a3e8725e620c5bd13511a6a6c676d3c807e6ad82017f6178.svg","flags/1x1/ch.svg":"flags/1x1/ch-ff30c29ed89a29db4cae89e8f4915e573c75dd7ad377e5ac7987c956fb68a141.svg","flags/4x3/ci.svg":"flags/4x3/ci-70e248e97c577c3ab3a85a8a76e5f20ef0bfd2c2a3c190746e625fa37edbbec9.svg","flags/1x1/ci.svg":"flags/1x1/ci-fb50e5c5558e915f5cd4060bd75d63e43ed4a2af1cf77caf1d184d8e5b3c888b.svg","flags/4x3/ck.svg":"flags/4x3/ck-a86d1e54e265e2de5155595e838ec7c3db3ca23f563336885d7c5d17888c4709.svg","flags/1x1/ck.svg":"flags/1x1/ck-a0d6f5ca82965ef1838549666bef9735b619c40bcf791850f092486b1fa3831d.svg","flags/4x3/cl.svg":"flags/4x3/cl-0bec6c3cc4d36bbf245a3be22c10b8ff9c25996bb372a916e365e3274e62ccfb.svg","flags/1x1/cl.svg":"flags/1x1/cl-8dc4289cd2cba6ac3f07519957f3cbd582f59e1153d655871a507bc0559fc93f.svg","flags/4x3/cm.svg":"flags/4x3/cm-8832f17145686399c412437f6762b4de6afb48fcc409590b7b09e593fe3b08d5.svg","flags/1x1/cm.svg":"flags/1x1/cm-4ba39a0a5fe36564e132e7a4d0f881ca10e95b0824157253a9180b2fe0089553.svg","flags/4x3/cn.svg":"flags/4x3/cn-865ae68cc9042422bae55dba123af75dfab352069aa15121385a739c57caf1aa.svg","flags/1x1/cn.svg":"flags/1x1/cn-cdf756a16521136b99d38c241ee5df601912f290c6bafd45f7a5f73f916ed8ed.svg","flags/4x3/co.svg":"flags/4x3/co-48603194a139754c8c7908f4d0c8181ca6729a221de897e8e5d26c9a3f211b1d.svg","flags/1x1/co.svg":"flags/1x1/co-0be1e3cef708f4f0f979a3c36bdcb4046a45693846dc9b9e5be2ea5f1c536667.svg","flags/4x3/cr.svg":"flags/4x3/cr-127b7f2e0f6ebe8c62885fd78f6a3dc167624e8e7b5fac79d4b8f3054b798a92.svg","flags/1x1/cr.svg":"flags/1x1/cr-80711b24354b0eedd247bbd77352db3bc9ad586c31d0a8727a4400368e56b2c4.svg","flags/4x3/cu.svg":"flags/4x3/cu-c72751747322de6b51b1dd462d04d0b533fa1e1c68f51b3c90d19ec683c2af3a.svg","flags/1x1/cu.svg":"flags/1x1/cu-ec5f9adfe3639f609ebf60d933d6500a0a9a5d77f9c8d5ec6a2f0d0ec2efd5a4.svg","flags/4x3/cv.svg":"flags/4x3/cv-029b4bd4d5c58ee3479b9a5fd3700923efa4881282225ac47690a3955472b7f1.svg","flags/1x1/cv.svg":"flags/1x1/cv-750969622373a36a416fc64118f1cb5407764d508f99b7db720f2ab474b93ebf.svg","flags/4x3/cw.svg":"flags/4x3/cw-f3c7dc011a64c13ebab21e47baaea3e0fea8d83f83fd8cc1845630a5f78ce087.svg","flags/1x1/cw.svg":"flags/1x1/cw-48a78eb5e8abd98b90ae7b373746bbd58851c76eb305ca0e7d8081df9180f248.svg","flags/4x3/cx.svg":"flags/4x3/cx-9033ee142f06aac6b700968943103e6dba8ce3171b17f7f7d54f26c35387c022.svg","flags/1x1/cx.svg":"flags/1x1/cx-f8356811ad67ac25c4a8c22bba7468615f8a0bcb09e4d8da09ad3806febc7d1b.svg","flags/4x3/cy.svg":"flags/4x3/cy-86c9999efa3399db043be615d16558ec0e40feafe9325fe1b6422ff0e089a60c.svg","flags/1x1/cy.svg":"flags/1x1/cy-67835af18d83749f0ac63e160db340d7a83b2e189e5e5b715b49c4b922fbb4ff.svg","flags/4x3/cz.svg":"flags/4x3/cz-e8f891c91f0889f53815958ed9c0d0472c03ecf58c5b8d3d87a864ede0e57ce0.svg","flags/1x1/cz.svg":"flags/1x1/cz-de11cacecaee1ed952a170fa43d318b01507ae9c8b0ab16b96f53848676326c7.svg","flags/4x3/de.svg":"flags/4x3/de-dcf5931120e541ce9e83e97c37cf95eeac9a152cd5e5ed9e0bf58116943d7250.svg","flags/1x1/de.svg":"flags/1x1/de-3479e75f866450220db28ef3ebb1ba0c345c059ed67de62c4176a09572da8f32.svg","flags/4x3/dj.svg":"flags/4x3/dj-e69892f8499ec8d780cdd20b051f936d5471eb92efd519b93be9d10f31382c77.svg","flags/1x1/dj.svg":"flags/1x1/dj-49721ea1deeb6e17f32ee2b3617d27961ad256505849243843f0fd5697332b18.svg","flags/4x3/dk.svg":"flags/4x3/dk-d50cdf2f88be249eb116da08c38cf119d44246ab4f5d62a94feefd37da149019.svg","flags/1x1/dk.svg":"flags/1x1/dk-24ccaa605d1f01e33802197d416654b64fac3f3d28ba90b5f6094c17dfe95344.svg","flags/4x3/dm.svg":"flags/4x3/dm-24faadaf18d5651beccc45688ef3421d2d083b5f2e92cab50c414e487a899095.svg","flags/1x1/dm.svg":"flags/1x1/dm-4f6888ba822d1592b9751c198ae6aafd1c14630be57d7e3b4372e3df8eb4f201.svg","flags/4x3/do.svg":"flags/4x3/do-43538ca280e65a4eb8b38992290cda974a7f631ae18f3e6864dc6f61397ab514.svg","flags/1x1/do.svg":"flags/1x1/do-1164fc19d2a5f2299e84d59627b780ff9dcba335acaa19a4acacd4781d916b78.svg","flags/4x3/dz.svg":"flags/4x3/dz-1b56086fc67c067d339838fc63e8f98faea641560b14839260546c895bdf4768.svg","flags/1x1/dz.svg":"flags/1x1/dz-b9527d30bdb9d67fba87351df4d4340fcc1c0dce368f0371359e5fcf7d445f3b.svg","flags/4x3/ec.svg":"flags/4x3/ec-d6df0532653f0a2a3ccdee80854ad75c4a4fe4a360fc5d5c73865253ebfc6b7f.svg","flags/1x1/ec.svg":"flags/1x1/ec-a1a0b637c3d12b488cd180746ea10e42e659907c99c0b3d9eec65415494b5321.svg","flags/4x3/ee.svg":"flags/4x3/ee-2e52e01e34f175e856e120e57184ce61eccb5bff94633d3f2effcfed765f610b.svg","flags/1x1/ee.svg":"flags/1x1/ee-1058c4a95d48696c8c99608a104e756d4ac5c431a7a1f60e179769416c443420.svg","flags/4x3/eg.svg":"flags/4x3/eg-2b5a88cf9ab7a59447e6a3e3cc12d350c573719d2a90810d50ed7695a1591d30.svg","flags/1x1/eg.svg":"flags/1x1/eg-ded55c3561ee2003ede5cc35af88959adb2398badc3c63dcc40e320d5bdb6c97.svg","flags/4x3/eh.svg":"flags/4x3/eh-250c6f7e1db483fb08f682d4917c06741614edb0a093aa80c0fe57f9bff03eba.svg","flags/1x1/eh.svg":"flags/1x1/eh-ae52d9c4377873ea1db474ef820d87e956753992097bbce93118c836f27c5598.svg","flags/4x3/er.svg":"flags/4x3/er-13b1d5072a285b78863f33088676ff459fc9049e403c4427d0bf149ab8a65eac.svg","flags/1x1/er.svg":"flags/1x1/er-516d763b5c3ddf087968e8e2ce10eb9f6a162e98b1c586ae90f7ebc2a9e877e6.svg","flags/4x3/es.svg":"flags/4x3/es-85290c103c538de1b8629c7a609319f01fc5a63a24655946e6003740d30f1534.svg","flags/1x1/es.svg":"flags/1x1/es-582d90241cc77269d8eeaa709ee9345c4e3935b7c20f9d3f04d707800c554896.svg","flags/4x3/et.svg":"flags/4x3/et-818e867ed44592f1c476d5abd8d9e5b60bb1e485f01076a633f5304fee7990d4.svg","flags/1x1/et.svg":"flags/1x1/et-7e2476975a4837f67af86aa6556d382dfd6769922a47ee9a49ef81a540c0f3b7.svg","flags/4x3/fi.svg":"flags/4x3/fi-262396615a680200f7709a9a998a1f346db6de48844bb0a76d8c41d0d8dfb466.svg","flags/1x1/fi.svg":"flags/1x1/fi-cdfc9cc3908d4f0d534fb34853fda8db5981195204ab6219bad3aa3cf90ecfa6.svg","flags/4x3/fj.svg":"flags/4x3/fj-fd0cc7fe3c27f0c999ce61d40b0143ca536d9d39875c524bb20afe5ccd55e40c.svg","flags/1x1/fj.svg":"flags/1x1/fj-930160f9247a73774021c9d019dfedc21ed09934db523690ca76f0a7e1a2d9d1.svg","flags/4x3/fk.svg":"flags/4x3/fk-5d5fdf224c1455f03c84d85f587463d8c511ff86dd5592f216a7470989175e42.svg","flags/1x1/fk.svg":"flags/1x1/fk-b614bdecd7ba844a5885a5acfb6b658bf649dd72d095844abdd4cf14860685c4.svg","flags/4x3/fm.svg":"flags/4x3/fm-6e665d3e05ae726fee0ced73ae84ce1d0596e80cb3dafce78d0c56dbc3018584.svg","flags/1x1/fm.svg":"flags/1x1/fm-c59efd1b95788946440a90610eac4f3222be5fbfb5748c076eabd0d4b6b8613e.svg","flags/4x3/fo.svg":"flags/4x3/fo-e2bcddb90777676679c7d680f18bcace56143f3a6bb0618ce59e4bf863b9e58e.svg","flags/1x1/fo.svg":"flags/1x1/fo-c9e403639ac04f28b0c86fc370ac5a106213f2ecf2ffc291cb9cd0ec2c000d8b.svg","flags/4x3/fr.svg":"flags/4x3/fr-14bbb212b68a54751cbf4354dc9ca16bf4fd671fba4bfd0e77fb855fc55ce884.svg","flags/1x1/fr.svg":"flags/1x1/fr-8b9d16b144204ecd34289bf1f0e06e57ad03a889a3813463de8e1a25005da5ec.svg","flags/4x3/ga.svg":"flags/4x3/ga-ae7daae3629bfa925e336323a198a018ae2007a1ea2ab9ba32d4b110e0abc7d4.svg","flags/1x1/ga.svg":"flags/1x1/ga-1a903d6903087e08d16b56a27741cd1ea2c0685fbd325e9c4cef45d7fb00ccc3.svg","flags/4x3/gb.svg":"flags/4x3/gb-14e43b4df91315b33ed5f8ad46d9e84f43f84be11c65148bca043808832cab95.svg","flags/1x1/gb.svg":"flags/1x1/gb-81ec47f82b87b9398d17f1db841ea31695a24fa3e05c60fa4d59b21ae4d5bed2.svg","flags/4x3/gd.svg":"flags/4x3/gd-9a09ce17c1792c8860223020288f72ed168afebcafdc9fa8c46a7b7b1513c28a.svg","flags/1x1/gd.svg":"flags/1x1/gd-1678beac8104635c4360593bbba3e3e4b84467d8997ed538137b5a68740ba1b9.svg","flags/4x3/ge.svg":"flags/4x3/ge-0ed0a003c1e169ed60bdd889c8c841b0a7931aa3e809ca4d8e5da522385f35c9.svg","flags/1x1/ge.svg":"flags/1x1/ge-d90251ffc959309587136e12331f57a2db6b284a892ba1fee03927383208a760.svg","flags/4x3/gf.svg":"flags/4x3/gf-d4b632e9a932eff7d4e32338d13724f58332eeb445cfa9351a052b77cd688d3d.svg","flags/1x1/gf.svg":"flags/1x1/gf-be726fca00f77b50eec1525f3889ebf6de7f8f46e28cb63f0cbbe026cdaf564b.svg","flags/4x3/gg.svg":"flags/4x3/gg-ea89231f0fa42d543d008b4f2fe8a94fc253a1808b8b8f6ab49f4bd9553c498e.svg","flags/1x1/gg.svg":"flags/1x1/gg-ebfebaf3102bbdfecee844b24f59ef79c78d3b573203d8058e363847b33531a0.svg","flags/4x3/gh.svg":"flags/4x3/gh-90efce1b22e18fbd77cb6f13e9f72ecea1338e3fd090b3817171eb3e24ba2516.svg","flags/1x1/gh.svg":"flags/1x1/gh-e9286720b91098135c65f7ad83d9a796efed89e27a052aac78af57e82d003859.svg","flags/4x3/gi.svg":"flags/4x3/gi-03f50f9d9b262fdf822d325c5325b374661821d6fae41e20de42bc761e56df52.svg","flags/1x1/gi.svg":"flags/1x1/gi-94700c7efeae285ce37ad883ca906c4ee65a99ede614b40eacb88d64873abb96.svg","flags/4x3/gl.svg":"flags/4x3/gl-3b1f2b9c26c35f87fcb4b417fff6ad3d2aada484d734382440c338d4c7dcbd00.svg","flags/1x1/gl.svg":"flags/1x1/gl-e468d30f57d5159f92aa487c8d16f9395671e64e4dcd74ec71b40bfa96259df4.svg","flags/4x3/gm.svg":"flags/4x3/gm-8a5011e0a99457e6dfeb53b55a90875f2d9a802fe8fec13f570de6f2a27b8639.svg","flags/1x1/gm.svg":"flags/1x1/gm-4200b76a4dbfbd9de052de9de778ae19d659a1d75d669757885580ef286497ec.svg","flags/4x3/gn.svg":"flags/4x3/gn-e990df30eba87d7036bbf6a47b64d0a6360d82fba6b5bba812e148648e56ea47.svg","flags/1x1/gn.svg":"flags/1x1/gn-4f9823b9e177c0604f8cbc1b2412ac9c39b4ffc3eda66311e787a6d9a640ebf7.svg","flags/4x3/gp.svg":"flags/4x3/gp-024ddd0e63a5e22c9d9f73a84b8306f2176083081825a065d99646ee123dc242.svg","flags/1x1/gp.svg":"flags/1x1/gp-00fab4fc916f5f267afd8e100a52098ba4aa6761cba1ecde56d506e85bd12025.svg","flags/4x3/gq.svg":"flags/4x3/gq-4e5c5e90e99f9dd14a43b597b6d370c8691ee73e8c75a8184e4a8390ff3e2bb0.svg","flags/1x1/gq.svg":"flags/1x1/gq-0e6d55dbcfe1e727dbe9c00ac2988407c196e5c0a20a0f71f752788649ec83c0.svg","flags/4x3/gr.svg":"flags/4x3/gr-db2138fa7bb0c95282ec0ecae3b5bd6ff2b3a06e2f27c1434b5b2285d422a6e0.svg","flags/1x1/gr.svg":"flags/1x1/gr-40c78a60595b2a3f485040d93505c0128de81b60f44e18e35ce0ca9d5a95f184.svg","flags/4x3/gs.svg":"flags/4x3/gs-bf3e078414a68dcd77d82694f5411f67c1eb5a1503f427c8dbcace16238e359a.svg","flags/1x1/gs.svg":"flags/1x1/gs-0130b60737c3873dd1868c70f7c3018fc276d152a398c2ce727edddb46f32513.svg","flags/4x3/gt.svg":"flags/4x3/gt-1b63340464e9dd3363a631f74db87defe40bfc520ba41002bf094f154b579934.svg","flags/1x1/gt.svg":"flags/1x1/gt-7cd5c99c47d16d4fc914979ffd7b95d87247d4c6652e07562a71a323f7145d58.svg","flags/4x3/gu.svg":"flags/4x3/gu-4018f5c92a9dd473d226f09136e956de2570729e80d704e8cc4e8f3ca2bdc871.svg","flags/1x1/gu.svg":"flags/1x1/gu-bb95d4d48c1e20be2b15258d9b895f38e9df1c54b65d4ed4aab1b323576f3899.svg","flags/4x3/gw.svg":"flags/4x3/gw-0ea266c02a02d578e96bb5335244c83c2815f28ebd34ff7ab8408b16416dd88e.svg","flags/1x1/gw.svg":"flags/1x1/gw-bd83c376f118c350751de000e2a48f97772438555dc1a70a7beb15cc4caee5c7.svg","flags/4x3/gy.svg":"flags/4x3/gy-441a978efab1565daf964e822a75b8658f5879af41371b0b52e468e00eb6b095.svg","flags/1x1/gy.svg":"flags/1x1/gy-d84ae82776b7142e4d9d51b1bdce601560275833b8d249e8e3d74bd3752b5aaa.svg","flags/4x3/hk.svg":"flags/4x3/hk-e5350bb4c4d63e98d802b3190247b2ce459d2695756ec62d64a995c43c4edd1e.svg","flags/1x1/hk.svg":"flags/1x1/hk-082835aaf3d1d61e1dd0e3b2b86231ef11b20150f98898af2e352b87c910f7da.svg","flags/4x3/hm.svg":"flags/4x3/hm-1048d79fd546482c290e1a0e4c2f9ce053aa3821f17bf12487a4f3e0ac7477d4.svg","flags/1x1/hm.svg":"flags/1x1/hm-af2df9fe67b48ead95d7ebe32d0a28a16c0d2fb03af909ca99e3b7d3cbe1a4a3.svg","flags/4x3/hn.svg":"flags/4x3/hn-d0e2cededb00e5dc79c75ab95e8f93d1851844c0924e49b59a8b78f6b35a7cfb.svg","flags/1x1/hn.svg":"flags/1x1/hn-45eebaaac195fd50e374926f9876eb5456a8cbcc2fb30e6a19229c409c51520b.svg","flags/4x3/hr.svg":"flags/4x3/hr-e10c8456ac0fc1946d1cb1f15e73484d03e4442368d78b230b050cadb7730b04.svg","flags/1x1/hr.svg":"flags/1x1/hr-8a4ca8ec8de4fc911306e198e66086fbbbf33891c8fa3e860af482f8ac2ddb44.svg","flags/4x3/ht.svg":"flags/4x3/ht-f862a9bb3b96630fc26a6fd2200b77c985b90a87ff9c52c42c3d7f42a0198b04.svg","flags/1x1/ht.svg":"flags/1x1/ht-1a12f16c45567e7b4fc2737b630345f7c7d0ac79ff31c41bc23920d0effd9adb.svg","flags/4x3/hu.svg":"flags/4x3/hu-a555e216b05645110da533dd2a5225021f70d7438e456877e77dc4522c261e41.svg","flags/1x1/hu.svg":"flags/1x1/hu-70b6438afdbc91f98b5ebfd0cafa40b6d5b0266f8d0df56cf3bcc7f777bd54c4.svg","flags/4x3/id.svg":"flags/4x3/id-3b48b1012b8beab850a28e27d785e92afee830444749c814a32419b8fce5dec1.svg","flags/1x1/id.svg":"flags/1x1/id-7d8348730949413fc7ff2587be342ff90c9ee1734d2ccdbca637a55839a894af.svg","flags/4x3/ie.svg":"flags/4x3/ie-8758528ee7852e7ded3f03fb7bc96ef9c502b1321c3011e9aade28702c68e235.svg","flags/1x1/ie.svg":"flags/1x1/ie-1cf70c38a49b5ec8c5ec6aace1dd0f1e1ac1663b8a5339ca3a98dc7bc4978702.svg","flags/4x3/il.svg":"flags/4x3/il-028f767bebb716e7a2e7198bfd03e698a7f19cad00385b30014a27680c101710.svg","flags/1x1/il.svg":"flags/1x1/il-395ee62ffbff4ab2ae456281a90f441e1148c0143a237f8a0e540e31d55518d5.svg","flags/4x3/im.svg":"flags/4x3/im-7dbb2dd66eda428c32edbbf2275f709df06cb1270dd69c65e214874966c30d69.svg","flags/1x1/im.svg":"flags/1x1/im-ed578fcc5e398ffdbc7a62d31b568a76b91e14ffa0afb794f3587aee8d248d67.svg","flags/4x3/in.svg":"flags/4x3/in-63b359940156312c6ed31c2b61f005c2bc386823401773aac9aaa328d994f7bc.svg","flags/1x1/in.svg":"flags/1x1/in-3fd1bedfc697bfe677a9774d7a6f51d04115cce400b4d7a892ecf1f69526790f.svg","flags/4x3/io.svg":"flags/4x3/io-67be58cb5bf7afe6099ec339235ec7ba0da153a50c651e28d4c32b2e6aa64cbc.svg","flags/1x1/io.svg":"flags/1x1/io-aa0702e0280d98693b3fb6350b45a7903ca25782082d3f1cee75f33f1a4d739d.svg","flags/4x3/iq.svg":"flags/4x3/iq-51acd0adc48bf1cb7256aba82069573f84db0baaf49b968f7f06afe140555f7a.svg","flags/1x1/iq.svg":"flags/1x1/iq-0ec8238d4e53fd7ec06ceda47e1378ee68042666f1f7f1a91753595a2167366e.svg","flags/4x3/ir.svg":"flags/4x3/ir-0d6f2bd5403ac2c3f7dfd49e3c5124817575c00b5167ef4c03cbfb63cfc10a26.svg","flags/1x1/ir.svg":"flags/1x1/ir-123d34118d6933f90a6b1191e2605c8344850c39f72644b9d91e15bfa640b623.svg","flags/4x3/is.svg":"flags/4x3/is-21543ffd547f651c7628bfe97d3c3626ea5e6999848de64efddee4656c27177b.svg","flags/1x1/is.svg":"flags/1x1/is-d73fc857d6844a1cdab62f81ba30a1ea895557d8d8fa4eecf7fa4b9127bc0123.svg","flags/4x3/it.svg":"flags/4x3/it-8b46e4a9676eb92cd507acef1d7c62115e6acc4b85e58a0806a0721ac34735f6.svg","flags/1x1/it.svg":"flags/1x1/it-2767e5c7250ec17539972ef710a8cebde73971bf0b9b3186d5baffb02f66974e.svg","flags/4x3/je.svg":"flags/4x3/je-35111082a6e24dccbd512743a37ebec13094ffbed5fef2b0793037433821a7ce.svg","flags/1x1/je.svg":"flags/1x1/je-87c6120456d517be72bdf28fd125176a743006be1cbe47ff5f59d54d1bf1253e.svg","flags/4x3/jm.svg":"flags/4x3/jm-eb05254eb1abb6d7fcd764284581224857c980d7bad9d7e9afff3dfff49d1e73.svg","flags/1x1/jm.svg":"flags/1x1/jm-0af380d25aef6a7de4c545a85ea3f76d3b08e56c000980c08a681ada232ba49d.svg","flags/4x3/jo.svg":"flags/4x3/jo-193203037e596abc063a9c30d0dd3aaa9c908557a1b57bcbcb94e1a1e8bb2402.svg","flags/1x1/jo.svg":"flags/1x1/jo-2b9c3f54d7e98c848cc0bd764bcd5ac2320d4f13aee8a84a207e7d0490c03516.svg","flags/4x3/jp.svg":"flags/4x3/jp-169d02f898d54cacbecd7b0197d32045a46c4424c10a67e78bbf488f7b44541e.svg","flags/1x1/jp.svg":"flags/1x1/jp-20835e83e8d43872df1ef8a2b3a26379b5f6bcff854dab3c7a24dcad4a42e02d.svg","flags/4x3/ke.svg":"flags/4x3/ke-58146180a02774a36ff2e4caf23b75c441a92dc69ffe3b9d4e9ded31e16748b5.svg","flags/1x1/ke.svg":"flags/1x1/ke-b3b9722930c4ecc82ed67d7c47eb751eefba3a59b24b68927c45d43a06b450a8.svg","flags/4x3/kg.svg":"flags/4x3/kg-7c23eb9471af5dc5ee4391e4ec08fec7889c2d83f2712ce59310a0eb81d663f0.svg","flags/1x1/kg.svg":"flags/1x1/kg-83e2a04c6199e69a1604a12610591fda15c8cf60e9fe7f682916815c5f1840bf.svg","flags/4x3/kh.svg":"flags/4x3/kh-4f121b97388966312c5691244a72214a3306f87ec517c658adcaf39a131a1d8c.svg","flags/1x1/kh.svg":"flags/1x1/kh-9b9ebdb74308e4975fef2e9737cad7fe44538bf97f5c1b7b6239fc2f065d4cea.svg","flags/4x3/ki.svg":"flags/4x3/ki-0e1a57754e3271771a154b525dfb57e20d584083b47b1ac2708b843abf11948a.svg","flags/1x1/ki.svg":"flags/1x1/ki-64df628a3c2bacf16209af95403dd7ae5402f705b2776da20ea741646e047b12.svg","flags/4x3/km.svg":"flags/4x3/km-2301fd16e41810016f9a58d75b8a361ffe9885ecfc89a0b3e9108bda7f5501d9.svg","flags/1x1/km.svg":"flags/1x1/km-6f9716ac74c8ef80557e682ae6d951a6ca6993eabd049f8de81a742f77a84452.svg","flags/4x3/kn.svg":"flags/4x3/kn-8e866a33f9952f8b29e45e8576133345446925907a2c4bcd429a34ae377bc74e.svg","flags/1x1/kn.svg":"flags/1x1/kn-46b0fcf2a59d3f923fc5ae6c914d9ee2d886fb4ee6f9c1108133244f4093d481.svg","flags/4x3/kp.svg":"flags/4x3/kp-ab0a3c4310474b324bbb39f77579ac3b421c531397d31e8f38de35a681d79bc9.svg","flags/1x1/kp.svg":"flags/1x1/kp-3a2ce32e4b76931fd6383f9833a4764528cc89c92f23672cc8eaff26c7a31ee1.svg","flags/4x3/kr.svg":"flags/4x3/kr-854d1521a9cb2b22c90f96d5d62277a9e1382818eefdc294d481c397c92f97c0.svg","flags/1x1/kr.svg":"flags/1x1/kr-343a5d08f9d0ff8c4268c77111cff9d2296c3f875b8d776c95dea1ae246d9bda.svg","flags/4x3/kw.svg":"flags/4x3/kw-75be6f04a24e7ddaaec57c95420ece390603961fa238245b776386890ab5627b.svg","flags/1x1/kw.svg":"flags/1x1/kw-cdbf39e8dc62ffc15b7bc3c373151070377db56c0508dadf80bdd3c971d8a094.svg","flags/4x3/ky.svg":"flags/4x3/ky-f75f33396887f6234e7ee4fd483e57c8e35ac52d504a4a6e12fad25d855bf061.svg","flags/1x1/ky.svg":"flags/1x1/ky-8ed8729ad8553aa468c0d9ea196f38048770b15a1bb632fb7c3bd56fbfd5b643.svg","flags/4x3/kz.svg":"flags/4x3/kz-51f42e580c605b6580aa4288d88d9c88bc6fd86af2388b0e4313bce969628743.svg","flags/1x1/kz.svg":"flags/1x1/kz-38ef143eed3d03cebe2e4924d520a0d90d5e59e97a39b13cb3085415267af6f3.svg","flags/4x3/la.svg":"flags/4x3/la-0a762fcc7ef73f1fedb4765b718e2e96c819d4b26d5375acfa48d245fb97fcec.svg","flags/1x1/la.svg":"flags/1x1/la-59d7d7dd1443e9bc557631254afa4333d1b83db314c9eb8bc170ce26f34f5dd8.svg","flags/4x3/lb.svg":"flags/4x3/lb-26ea2add2ac68a8040b027b510f29080d8407b961243c77b33b46c8957768b66.svg","flags/1x1/lb.svg":"flags/1x1/lb-eb8049cb746a3913ac814f4d6e0e850d0e4b9a60b78dec5e9acd95b299bf95e4.svg","flags/4x3/lc.svg":"flags/4x3/lc-444f9f77d0b09bd84fe2a5fd7194eae81341d8b7b4823070fc3e74cab481a122.svg","flags/1x1/lc.svg":"flags/1x1/lc-13a572e5fcbada8bf66eb77413f04f862b0cf95d4b85c5292b3d6348ec4d8c99.svg","flags/4x3/li.svg":"flags/4x3/li-b2d0ccbceb7e6129a6529c98721d92fcee379ed6c225a18e1eff3c6fa092eec7.svg","flags/1x1/li.svg":"flags/1x1/li-97814472256460b19df380ad90e5380202001a8a7ad6b4140cd2a0b92db909ac.svg","flags/4x3/lk.svg":"flags/4x3/lk-d910bd0d9ddb013c5668824d6600a842496c0a17c74f772a801f833b9eb044f8.svg","flags/1x1/lk.svg":"flags/1x1/lk-c7fb3c2b64782519d94f0a9fd21c057e5e32b856c428b68abb11667191235270.svg","flags/4x3/lr.svg":"flags/4x3/lr-42e8d3bdacafc05835fcd52026cb3e1717573965ce9d4f49635dbb390021a4b4.svg","flags/1x1/lr.svg":"flags/1x1/lr-169945e579afdf35dd158694a1679380886f8541278cbd225c7e750add25e60e.svg","flags/4x3/ls.svg":"flags/4x3/ls-a4db42569c4760bffd695cbdb030c90bc203f40f75fb357cbdbef961d29cf5dd.svg","flags/1x1/ls.svg":"flags/1x1/ls-1dd02208fc24c668e18430bb0500fa14c995f64cab8cde080b4256bd1b42b23f.svg","flags/4x3/lt.svg":"flags/4x3/lt-a57e003a5cbe538a4bfc2d29fd3523a87948bc8e29f731096dff9095096178c9.svg","flags/1x1/lt.svg":"flags/1x1/lt-e386ebe0482bdf999b151c3ae8c5e5e40a58037eab35b29f37682aa849edd3f0.svg","flags/4x3/lu.svg":"flags/4x3/lu-2746295f8b0a1540d43e0c2548d4ec1341fafcffe48b919fb135a6c82535b657.svg","flags/1x1/lu.svg":"flags/1x1/lu-9695b187733f52bae07c65e78aae8956e25360ad773c1f4703855997571a764d.svg","flags/4x3/lv.svg":"flags/4x3/lv-b51d475acf37be9accc82ddf5f60773861cf58b0e9b599460852589da88501ef.svg","flags/1x1/lv.svg":"flags/1x1/lv-dbf5d3fb294b518bc6373c4fc22b028fc462647fbd5032cf57513556896577bc.svg","flags/4x3/ly.svg":"flags/4x3/ly-7409a315d2f9aab4676558d7e97f4316ea87fc7afd93a493def4adf0b5773ca6.svg","flags/1x1/ly.svg":"flags/1x1/ly-6457e38177d82f6c52e3f3c38328f1ac66bb5a5c7a9026229d4e3aafe3b592af.svg","flags/4x3/ma.svg":"flags/4x3/ma-0628f236b2067d66c841c1190a3e8e3e9c37fbf2f3521fdb5ecba3eda75e805e.svg","flags/1x1/ma.svg":"flags/1x1/ma-5c96636ed7496b25e989cb74f202e377ec4c59b056b9d0c425ded77199b0d659.svg","flags/4x3/mc.svg":"flags/4x3/mc-10a533ce437c40973f8684439f7e24da1ea624c5e5535fa4738d62ede0650242.svg","flags/1x1/mc.svg":"flags/1x1/mc-6a9a8fe216f75ecdb8bddf6e6c816c1c9771ebffe3c09e83975a434ec1fb4950.svg","flags/4x3/md.svg":"flags/4x3/md-6641e05826ea580544c1890fe3698eb2e8e3af463518fc37eea7c41eb8cbb6c0.svg","flags/1x1/md.svg":"flags/1x1/md-e51dd640155b523a207eb1dc9dc909c38d9e88de04729e250e0cccd1e9d1b0b7.svg","flags/4x3/me.svg":"flags/4x3/me-c841acf1209c546dd77c18b718141ce4e21dba95a120cc3092988edaaf08f432.svg","flags/1x1/me.svg":"flags/1x1/me-c290031be15a14ebd1fd278774142e29f7dfe3d0fb3aba79c0d6932cb0feeb4b.svg","flags/4x3/mf.svg":"flags/4x3/mf-41a6043e2495b346fd700b17352150a8e43ca342a515fcb5159c39f809663ec6.svg","flags/1x1/mf.svg":"flags/1x1/mf-a3f24457b393082243eb00ea514057c09b1cf4985f6fa17d7902500fbb716317.svg","flags/4x3/mg.svg":"flags/4x3/mg-1baa2b12c3e79d592538d5d8e4d5a2c0e1373d3871c9d829f57b212daaf42129.svg","flags/1x1/mg.svg":"flags/1x1/mg-7e78efcc81f02f0616a11aec87bfd8dfaed1a328496301902f53375eee8f72ee.svg","flags/4x3/mh.svg":"flags/4x3/mh-1236a730a9819f0b58ac8cd642d17482b3945a894c63663b4accf10ac8ce5ecc.svg","flags/1x1/mh.svg":"flags/1x1/mh-3ecae469e3987c59cc4b19833eb8ccfe49a9477f70aa2aa2be5e9a4a131a48d0.svg","flags/4x3/mk.svg":"flags/4x3/mk-2a7bfeeba74701ceba752795d02eac7a97a6139471e5bdd529f2a858f4fd1d0e.svg","flags/1x1/mk.svg":"flags/1x1/mk-fe5c84d0e9bd4b7ceeed81f9564a970d7b5b39659e42f819c50950e191443720.svg","flags/4x3/ml.svg":"flags/4x3/ml-086660fe4272a22e220c94854fe4f80dd61afadd5c0c81cc075aea91bbcaa691.svg","flags/1x1/ml.svg":"flags/1x1/ml-9ef37a44932a3af38990145042c85352b1c5c4e791221d1fd91b5a9f7a412efb.svg","flags/4x3/mm.svg":"flags/4x3/mm-60ae7680502d9af8796fe3b3d57bbf6105a406e2e66840e9aa1f6e2470466058.svg","flags/1x1/mm.svg":"flags/1x1/mm-ea5bef04548342d984d8c8707333a31203a5abf015db093553f26c3a9febb251.svg","flags/4x3/mn.svg":"flags/4x3/mn-1309f63a0b6bfc594a1721a8af76381a1389fda64d840b256d353eb1341cb794.svg","flags/1x1/mn.svg":"flags/1x1/mn-86ecb7d9fcefe13783f165d44a93c9c2b1add55481bc69a70f9bd3652c27ae74.svg","flags/4x3/mo.svg":"flags/4x3/mo-6c69662b2581d90527965dd2c444784ab366f0080c93f2014ca37f2f7541b898.svg","flags/1x1/mo.svg":"flags/1x1/mo-ef906f7a8fdaccb7532359de1e5ce664ec0342975052b55a2e389f1b6338cba8.svg","flags/4x3/mp.svg":"flags/4x3/mp-dd2fa1cf9846007f88c88143047430f3f666099875407cf36648b271b6e1400a.svg","flags/1x1/mp.svg":"flags/1x1/mp-cd1d342862684bdb7caacb093e37d7e3b094cf49cfa5aa579d6b8201ffb4dd93.svg","flags/4x3/mq.svg":"flags/4x3/mq-be00a7c77b6aec1f86cd16bcafc7fe27b7b8c967b03632f8230cd83794833ba8.svg","flags/1x1/mq.svg":"flags/1x1/mq-bfaccc4a61b2d7067b44d54a75ce5bb5757292bdabff5e104b547aa2435a2e5d.svg","flags/4x3/mr.svg":"flags/4x3/mr-2293d4180eff3670e1c484d52a206efb562e8d96b9cb8c5a43aa65e1e2b1289c.svg","flags/1x1/mr.svg":"flags/1x1/mr-a3eb1a496e2c5dc86245856e18a91d71046b44d74d88274014e2d4fab41c3453.svg","flags/4x3/ms.svg":"flags/4x3/ms-913b24dbffa69bc3a57e997a806cdca5026cc5f87f83eefeef36a1aa8f5c2789.svg","flags/1x1/ms.svg":"flags/1x1/ms-8be40421854193032b83670c6a91aa1f5c818578eafb85ee90dce959eb54c6db.svg","flags/4x3/mt.svg":"flags/4x3/mt-517b4f67a94fff5be6346cae3731f5a17290b4c56732129967c15f482199365e.svg","flags/1x1/mt.svg":"flags/1x1/mt-371c5673e14380308182c7ae324f54792652bf4d0cf64de30b1d1fefea8c9b5d.svg","flags/4x3/mu.svg":"flags/4x3/mu-0a0d71ecace32a2948ac3eacc94927fb0ba7306236bf2a18ab5ae85bb2351664.svg","flags/1x1/mu.svg":"flags/1x1/mu-e0d4ee6c8f915eb54307ff51f57734c0bffa843060d953b9bd27f365b4a11b36.svg","flags/4x3/mv.svg":"flags/4x3/mv-421f31e8be8d80695f9f4811435214e8a8ac8729e145f9d491b888d91d0ca999.svg","flags/1x1/mv.svg":"flags/1x1/mv-c0056befcc1b506b4b498bf37dfa30642839a1beb6373f682e1214850b51cf6d.svg","flags/4x3/mw.svg":"flags/4x3/mw-644750e23780e66258d7b56777be8ef47ce3ca2d9d5735eac5abbb22fae33056.svg","flags/1x1/mw.svg":"flags/1x1/mw-70a282f17250f7fb49f8fbeb357dc492b742dd2a9c58e13281f0e900a8c63e94.svg","flags/4x3/mx.svg":"flags/4x3/mx-246482013102c12a6f83dcdfe0fa40c350560ae64505f9b4d3113ea5356e2f71.svg","flags/1x1/mx.svg":"flags/1x1/mx-27887b671ab9de501b6693ab60380e809962ac12222ddb580c9426e79e1360e3.svg","flags/4x3/my.svg":"flags/4x3/my-00a98291486af1c01c11fe46a203dd07bee31d6b5ffb5f60d04ad337a3499775.svg","flags/1x1/my.svg":"flags/1x1/my-a60a1ae968ed1ebbb60626370bd0494112b562a358c1381e6bb162268a110d8f.svg","flags/4x3/mz.svg":"flags/4x3/mz-8281fb68c18d27bf1588de7684e67f14aeabbf8e66117eb4e640faac9762dbb4.svg","flags/1x1/mz.svg":"flags/1x1/mz-dc805944726edfe3a8900cecd82ef15037381b81b6fab0d96d2cf93ba0d7a3ec.svg","flags/4x3/na.svg":"flags/4x3/na-d798d2db5bccea439f545e5e6dfa5aad6a166966cb5e223f7f2aa4d4dc73abd7.svg","flags/1x1/na.svg":"flags/1x1/na-0fceb3e900c021df14c00cab058c84cd834cb2f494a1db2fa58728a7f9445762.svg","flags/4x3/nc.svg":"flags/4x3/nc-2861e50f3a0a1b1c368d913df4f4092c65bb3faa2d01e4d084fa33ed041e537a.svg","flags/1x1/nc.svg":"flags/1x1/nc-1d65d86f9caaec75cc886c8abca3cc39b8de23c48e67b55936be3649ae67d716.svg","flags/4x3/ne.svg":"flags/4x3/ne-90b12ff4abee66e42d27b6c55dd602af3cc249f3492c8a449ec84a35a74ee6ed.svg","flags/1x1/ne.svg":"flags/1x1/ne-ecd9bd0f027c05147c336ef396ffce7c16cf011f051860ae082ea99be34554e0.svg","flags/4x3/nf.svg":"flags/4x3/nf-3323e2cb59cb8f9282e45155b6830e4c06876bc0c24ee28e5dd4dcff28d2dc70.svg","flags/1x1/nf.svg":"flags/1x1/nf-3da2a0db99d85998154510ac50674728e4768079a57443529b18b1ed87e5c077.svg","flags/4x3/ng.svg":"flags/4x3/ng-387e036e728aa4c36d93fad3c90e76e3beab727783ec11da7fbce30ff52c805e.svg","flags/1x1/ng.svg":"flags/1x1/ng-c4c24f43d15d5690390ea6d5a4b41911aa7cf0807167d69e95748c4439211dcb.svg","flags/4x3/ni.svg":"flags/4x3/ni-b83cccf0a65d0abf0398b905936ca6b6d5b1b64db8a34223225e3e4eb4f0311d.svg","flags/1x1/ni.svg":"flags/1x1/ni-35731438cffa30b56cc403c5e9a59e85e661566a0d72c5310865aaf282731e0f.svg","flags/4x3/nl.svg":"flags/4x3/nl-a71cd17ec0d083d39373108c1f5e994e71491e1f7ac34119e60c859142a2d34d.svg","flags/1x1/nl.svg":"flags/1x1/nl-6bfba1aa0f31f33e126e51832eddba06a92106d569f3e01dc4989a3425f45eac.svg","flags/4x3/no.svg":"flags/4x3/no-d4ae9765d2dd03faef1007008bf1ccde064e36c765faef79a270e7e8fa97c23a.svg","flags/1x1/no.svg":"flags/1x1/no-7b3a522b5101f7bcc5c9ac05adbfbfa3dacde4fc4420d2997b1ab38af7e50dbc.svg","flags/4x3/np.svg":"flags/4x3/np-043dff0f7f1cd254f2c2d82367557e5f4a15579af81242e2979523700adaeaf1.svg","flags/1x1/np.svg":"flags/1x1/np-976aa23f62798e1c0974a78649ff295334fc0d39f63eb19e990d2a13efe9fbe2.svg","flags/4x3/nr.svg":"flags/4x3/nr-f977239dc4f2dbb4185bcb741dc0aae4b46dd2d647444150f317e8dfb3062fd3.svg","flags/1x1/nr.svg":"flags/1x1/nr-1899ab289aa424dfa1bb1a787a5dae3d9081b212433441fe9a7c95c1c377fc01.svg","flags/4x3/nu.svg":"flags/4x3/nu-84b56f2711a6b958b9072dff3912f225c034d246341cc29c4eba6c34c70fe6f0.svg","flags/1x1/nu.svg":"flags/1x1/nu-60cdb57b27737dddc21980f6630e7476471ce8c1bc34b3a2632819bef23a26a5.svg","flags/4x3/nz.svg":"flags/4x3/nz-9cca5c871f70cdd784a33836d5a07ada7f6eaa720811c70dc2306a2a5056648d.svg","flags/1x1/nz.svg":"flags/1x1/nz-e5c8b6660d172e25e80f1d9530fb3e8b05fba1c4c02b95679fbcd5a0c50169f9.svg","flags/4x3/om.svg":"flags/4x3/om-fbef9222761223ced04e2946ec71432c761618ad58b8a3a5af5627a1d75b48e9.svg","flags/1x1/om.svg":"flags/1x1/om-07148a6924f8ce843e33be4f3d9d5dd40040da366e667925985e7b247073d08e.svg","flags/4x3/pa.svg":"flags/4x3/pa-50535df4995256b70ce0a7971ba95922046d445c06a567fd951d7f5a79cbe547.svg","flags/1x1/pa.svg":"flags/1x1/pa-e4d955c65827104b4f898beb392af5ffed5f62a09035f42801512b5b3d7767d1.svg","flags/4x3/pe.svg":"flags/4x3/pe-b518a86545125ff3c3fde029c2992233df876b663d8ec723bd4d67f90f72cb62.svg","flags/1x1/pe.svg":"flags/1x1/pe-8e395c37a87d3ea212ceaf0768869f2ae38ad507761ef6b10b2077f01274d6b0.svg","flags/4x3/pf.svg":"flags/4x3/pf-d1537625ade03a7fae7a5bdcfc5fe9f6449977613a38ddd258c8572f3630185b.svg","flags/1x1/pf.svg":"flags/1x1/pf-c78c72a0ad139c9da31592af7c443cfef4e1e1baf208e44088ca667298324c9e.svg","flags/4x3/pg.svg":"flags/4x3/pg-3190ab67d73878026d59e98e14b0cf98812c5c086d35956383c9986f7e0433a3.svg","flags/1x1/pg.svg":"flags/1x1/pg-fe2bbe3c6599a4bf895b9f748d5a15650a7d29c854252e3b074c780a77cd51b9.svg","flags/4x3/ph.svg":"flags/4x3/ph-ec483bd752a5a0d1f063397a2c206bdd9b23451d2c262eceba6411b2769ed3b1.svg","flags/1x1/ph.svg":"flags/1x1/ph-0d61f012185140030d9879f180b8279ab7798a9d7d062e141937ba83b51ab20e.svg","flags/4x3/pk.svg":"flags/4x3/pk-776714f751e4347341656ce5e88c6fa13316e2e36205cd8d09c73779794c2a56.svg","flags/1x1/pk.svg":"flags/1x1/pk-50284d5da424696f41ac4861f8eff6e5bc23a6e1812df7b444967c6e58ec6f81.svg","flags/4x3/pl.svg":"flags/4x3/pl-9bb56d1ec91d8c843ec53b018dc861772e466bad1582a9ba42148524347adf6d.svg","flags/1x1/pl.svg":"flags/1x1/pl-acc73e013a67a13fde68d812b22889be9150cce57d029deab6ba5b0ba4e7b69a.svg","flags/4x3/pm.svg":"flags/4x3/pm-5d990f5bc74366f734851ceb35046baaae3555ccff57e6cf95c7143f9b245532.svg","flags/1x1/pm.svg":"flags/1x1/pm-781f551a82a88b0a5e238b078310bc843950c844092d8ce1e52587feca285606.svg","flags/4x3/pn.svg":"flags/4x3/pn-1e347803c27d86312324a6a6712dee0bf5590971f027fffe082681dccce6c4c1.svg","flags/1x1/pn.svg":"flags/1x1/pn-b9762ab4fd752edc4506fd05f2810094e8de8b3cf6fffd00bafb89b6ed95359c.svg","flags/4x3/pr.svg":"flags/4x3/pr-4c0359aa4277d04c3c3af8ff89d0bbea462b480334cd6974beb6c5739c42903a.svg","flags/1x1/pr.svg":"flags/1x1/pr-dc838368c71fe79aea88491ec3e419ff01c26a5af460b05a79cb6cc6fa02b6b2.svg","flags/4x3/ps.svg":"flags/4x3/ps-39b00800524af9e8d270c479274be2dd5459c13d67a6f308139a69adbae4997f.svg","flags/1x1/ps.svg":"flags/1x1/ps-9102a922196261028bd07e60d1b2ef435e123aae8bba6d49a5918123f8be18f6.svg","flags/4x3/pt.svg":"flags/4x3/pt-f76294ca6203778375158111051358fb535eaebb06d50951eb5326f9ede31536.svg","flags/1x1/pt.svg":"flags/1x1/pt-09b4548e5764d2a6c56bf9c33e8652911f91b16ab6bfa3041630506480281047.svg","flags/4x3/pw.svg":"flags/4x3/pw-029fb7bb87eec12c79cbe662fe3614698c7638186958fb6032e59a17705777cb.svg","flags/1x1/pw.svg":"flags/1x1/pw-39f82e7a0e390333a2d0f4a1396a8f710af7ec3002c5542d7d6c76d634a67e82.svg","flags/4x3/py.svg":"flags/4x3/py-6f18a4e716e9fbe7d0caf99651fee56e44ffd2a13ce77f50a8374a7fe6b0879d.svg","flags/1x1/py.svg":"flags/1x1/py-0325fb333b5ea2adb996345bf2bf5df0c460c87ca97cb3c8f6e65a7f33aa1722.svg","flags/4x3/qa.svg":"flags/4x3/qa-55eb7d6716998d68fe6e3345807dc410e5c5e8511bb2c78f0d08d51da707a131.svg","flags/1x1/qa.svg":"flags/1x1/qa-cfff93f4c31946f7646a855521a7db667c78cb89a7c2ac339c64c14f06be0f7a.svg","flags/4x3/re.svg":"flags/4x3/re-8b3124b78a7752ee288a401ae16c3cf5dafc1296e443ba941de8b338b16c2723.svg","flags/1x1/re.svg":"flags/1x1/re-c7173d64ef4a62237f83c7af8cb144fba8c38bd7ac8e7125eda78320931215ca.svg","flags/4x3/ro.svg":"flags/4x3/ro-a10768f5227b028969ceb2bce6e3fc2ecbea0c5e40d1946c47d913d2745a8b21.svg","flags/1x1/ro.svg":"flags/1x1/ro-a4cfc4bce72dc7b034f2b84e932ba3d47f7a9404b94b1450af48263c576b62c8.svg","flags/4x3/rs.svg":"flags/4x3/rs-9792f9ae9694c0dfa1a213ec6ceb29d7b41819a508bedc4bf89dc4c285e48712.svg","flags/1x1/rs.svg":"flags/1x1/rs-cd44c0b89c5e2c2d0afe1902a263d60648dd18e97636256eb1ffc3148e336cd7.svg","flags/4x3/ru.svg":"flags/4x3/ru-ce34e72a9d955c6c6860a5e552cd3902d236bbff5a714a49a1b8f8dbbce3c410.svg","flags/1x1/ru.svg":"flags/1x1/ru-aa0d5e4855f92f211efad3979493956dfe01ad4a0b552814cad05fa67694de03.svg","flags/4x3/rw.svg":"flags/4x3/rw-0f08a5e527db8287642f1aafeb397fd49ac3add8e86dbb0d9a8be7d2c43b0153.svg","flags/1x1/rw.svg":"flags/1x1/rw-297915f2fa836eba2dc1d795a4f5b1c51f8d9abdc6704b13e63cd81c81476f09.svg","flags/4x3/sa.svg":"flags/4x3/sa-70281c72fb6008faf5d36c401593c7c8f0c8870332e23fa3b1b53cd0f88e9ad5.svg","flags/1x1/sa.svg":"flags/1x1/sa-463ab66153968c569b854793714e414ea77185758a8236364019d4e7e40582fc.svg","flags/4x3/sb.svg":"flags/4x3/sb-5de262c7e2fda747ea4ac98c2ca9ce045f07de995330b1fc3bbbf39e25ae42f6.svg","flags/1x1/sb.svg":"flags/1x1/sb-638ead7b9c9a42fe2318daf753a8f0ce9cea4792114d8d7475d5a5abcf697cb6.svg","flags/4x3/sc.svg":"flags/4x3/sc-46736983ebac2719d3e3aca36e3dbb896f612db71b72e9e5d6f3da36ae59c0ac.svg","flags/1x1/sc.svg":"flags/1x1/sc-1dc9321cdeeecad7c6485b2bc3aef87a1a1ca116c18908286b5f79bdb5ee8313.svg","flags/4x3/sd.svg":"flags/4x3/sd-3b49e891fcda945b02ee18ce8cee078f251d8e822201ba0f8953eb3efb0b2860.svg","flags/1x1/sd.svg":"flags/1x1/sd-993e4821f73f36e6dd12332ed727047a97c7d31b1c8f0b3312e924c5f437eb34.svg","flags/4x3/se.svg":"flags/4x3/se-8e13876ab89aedc66156f36f55fefe66068c43657a803ba6b98843c171fb06c7.svg","flags/1x1/se.svg":"flags/1x1/se-8af88180b9c1ca0b24dbf5e04039a523c6f0ce975094c7fb6b38a4901b2e5c5d.svg","flags/4x3/sg.svg":"flags/4x3/sg-da88143d134efe0c37b67471ceb24a9ced62ae9ade25530232c92435e6f46b65.svg","flags/1x1/sg.svg":"flags/1x1/sg-80e8f95951096bba14b6d6ebea036b0717617668d96f32b5a8172a06be1feb22.svg","flags/4x3/sh.svg":"flags/4x3/sh-3b36e972618f594e95974a9c551d3ba9ead3e9b175d8dac0bc30fd1910f82561.svg","flags/1x1/sh.svg":"flags/1x1/sh-f25afcdb45a6c2d58e3984d40188a03342271f2f6312b868236b2a1c02a2e60e.svg","flags/4x3/si.svg":"flags/4x3/si-a9715a0c1db87762010c25b6d3bb90f73de3c893aa3bbc7412d57dfa14f28dd5.svg","flags/1x1/si.svg":"flags/1x1/si-daa3e030c059585d235a78f228c89a32bc50df223da8efa32f85a13978524365.svg","flags/4x3/sj.svg":"flags/4x3/sj-a2fa34115702482c2af9c7632eaeec77a26a1de129ce825bc38e27b6523e19ba.svg","flags/1x1/sj.svg":"flags/1x1/sj-55f27b8e6aa75b9db244543edd19b891f3c07d59106cf08ff5c47781c480d272.svg","flags/4x3/sk.svg":"flags/4x3/sk-b285dd82884088b14db516eac76a39b29752279ac9f0f3e7c84b624edea66aa8.svg","flags/1x1/sk.svg":"flags/1x1/sk-cf28c14c8d736a45cbb0a31c0743373b6414974d561729d322cb7204e6a2f25b.svg","flags/4x3/sl.svg":"flags/4x3/sl-571df59f51a68477e49c8bbbe397e505d30d27ed1611b37485c94198b6401a9a.svg","flags/1x1/sl.svg":"flags/1x1/sl-038ea846f3362ef266345b5a7f9f0c7e94334edf697c24c5faeda27bc0396927.svg","flags/4x3/sm.svg":"flags/4x3/sm-a15cef2d34582deb77e611ac2df3580749a7faafa1bc7c5c661c906ccbdad64d.svg","flags/1x1/sm.svg":"flags/1x1/sm-b9bb79651c85755c984570a106213c32d87c7fbe5737b9b6a6e5512a05d98429.svg","flags/4x3/sn.svg":"flags/4x3/sn-d8a7143973e5ea3d4b58e707ac2b791b45b5c7a7e65cea521fa82e9e5920926d.svg","flags/1x1/sn.svg":"flags/1x1/sn-2432d592221bbdd387548cfa5069c62f75245597749ffa6e2dc8d029b76e88ae.svg","flags/4x3/so.svg":"flags/4x3/so-c82eddc49e0c223a307286bed233a03794954ad83efd12d8e2499a728bb78f22.svg","flags/1x1/so.svg":"flags/1x1/so-52cb6599bb12bafd9e49b2661297961fe585068009eb1b1c1153023514a342a7.svg","flags/4x3/sr.svg":"flags/4x3/sr-cda17a0b4748b11b3e116d4f034adf47def0faaae1e71a5bb5d5c61645be9795.svg","flags/1x1/sr.svg":"flags/1x1/sr-fb0ff6fc7108d1b993a838bb0e9db479af4e2af4cda72c80e7456c0777cdea28.svg","flags/4x3/ss.svg":"flags/4x3/ss-744839019f2833ed8059e53d0d6e1cde2471c6a61d51f9e09814bda42bdc1f12.svg","flags/1x1/ss.svg":"flags/1x1/ss-d77200a3fe67f1533ea642a6013667ce15bb0c8068b09db151c960593b37549a.svg","flags/4x3/st.svg":"flags/4x3/st-b0a9259277e38c0c8e0efec1d10b40d3e9c80a9eef21c174246aad28511e976d.svg","flags/1x1/st.svg":"flags/1x1/st-02eb52348f8547d028ba692f909483c32474105aae7940731d9264027493e479.svg","flags/4x3/sv.svg":"flags/4x3/sv-b524450c407002e1cf8e85444bb4225849cae409f54f5dc87d14d65faeeb833a.svg","flags/1x1/sv.svg":"flags/1x1/sv-e16fe96bd7f32dadd74091ee73b723c2b8dd92e791f337c54ee5bb18693ef1d2.svg","flags/4x3/sx.svg":"flags/4x3/sx-076f4363898d1374f985352dddbfe2a618bf4e7fedd80e43956be6614ca27ec0.svg","flags/1x1/sx.svg":"flags/1x1/sx-689aabb209fec5e8fc325bbaff80aa0bf11a2d6c819fa821b82069a2e5f12911.svg","flags/4x3/sy.svg":"flags/4x3/sy-d99ddced9cf98e95f7086a70703cd234cc8e21e744c37a6f90820c37ebc755d2.svg","flags/1x1/sy.svg":"flags/1x1/sy-c7f1e1422a9d941be9abd5e0f51b4c4ebdd08efd31c4ba3e378c155911cbe844.svg","flags/4x3/sz.svg":"flags/4x3/sz-b8760e27e50f7f31f0b38c2cdbcfa0121317bad064561cbcfeb8413ee8764e6d.svg","flags/1x1/sz.svg":"flags/1x1/sz-6c0e7ae75aa0fa71821d7b6230dff63e34b65221c0dc08f50226299d37716652.svg","flags/4x3/tc.svg":"flags/4x3/tc-abf0740c371bb155066651fca91c9e27e12b3cc9c05c14494e53dac851cc78bb.svg","flags/1x1/tc.svg":"flags/1x1/tc-13c94ed220ff9c70284c379e33fc85891de95dce60ec053787549485bca40a36.svg","flags/4x3/td.svg":"flags/4x3/td-354d8d74597706ece28b45f28030c948596f91c04392d07307b800cb0fc6e4cd.svg","flags/1x1/td.svg":"flags/1x1/td-fb3c31a792ab9fffe28bfe959cacdac54daebe9f795c30515830d93773805c3e.svg","flags/4x3/tf.svg":"flags/4x3/tf-f4edacabdba5b4d4d898a4edd7f07976f6a01ceee97c03fdf3561f2ba369b4f3.svg","flags/1x1/tf.svg":"flags/1x1/tf-fa00833e3ac96967c55c7f495a580ad5beb1fd912d32d0c9751b93c3c89be893.svg","flags/4x3/tg.svg":"flags/4x3/tg-32688daf8870e048421dcbfa2777d9b5f146e588f5f604433d17143fe702dac7.svg","flags/1x1/tg.svg":"flags/1x1/tg-0e62ff3b4c2106e7c5fe27a6f32fb3c10f69f9cfd5dad9aeb7a8b54af7cab786.svg","flags/4x3/th.svg":"flags/4x3/th-da4f1fda6eda5971dd52bad365bfc4aae176f0eedebf5c8bd9af25789c03993d.svg","flags/1x1/th.svg":"flags/1x1/th-95ac5f4463da0b9164f2fbed65ca12046370fcb1e250c6170975b77d1509b3e5.svg","flags/4x3/tj.svg":"flags/4x3/tj-d072d6cd4136ae97533d32ac74d20350ac794f8a79eaecd1c55142e76b93b3d9.svg","flags/1x1/tj.svg":"flags/1x1/tj-2cefbad6aee66d30fd757ea564fdbbde86aebde70720e9c961799caa6bdc8b84.svg","flags/4x3/tk.svg":"flags/4x3/tk-da715012efe8731020fe54063a76bffb256ea6696da290ccbb599ab36990edfe.svg","flags/1x1/tk.svg":"flags/1x1/tk-4055f5153398c294b2344880102e23847e952df1d04ad8734218fb0f6b43bf42.svg","flags/4x3/tl.svg":"flags/4x3/tl-388fac3c65fbbc18779b88f7fcdea523ba440860923a7e1602ca1138bcd5c40b.svg","flags/1x1/tl.svg":"flags/1x1/tl-9fea1b22d992cd15cafd1e5824d65f1f0f84b7c89a0f5a460b82429e2f9a8e95.svg","flags/4x3/tm.svg":"flags/4x3/tm-f5d7cce194b88ed026465717ee593c35c03f76f3483d77bee2a3e05827628679.svg","flags/1x1/tm.svg":"flags/1x1/tm-a3f255f0a6874a326140c9a4cad876cd386c30ac7b9e974905699ada62811042.svg","flags/4x3/tn.svg":"flags/4x3/tn-ba48fb29a4c8511d1145b87abc10cb75e8dc9ac4e704dc9efc113cf920d4b640.svg","flags/1x1/tn.svg":"flags/1x1/tn-d9b89cb7ab0b22d5a4709eb4681d77b8f6877d572a1d2f6424f6ce2fbed2dede.svg","flags/4x3/to.svg":"flags/4x3/to-9f1079a109d27abe53f17281320474ecfa6edc571502831f167471edd470773e.svg","flags/1x1/to.svg":"flags/1x1/to-a543262eaac18a114c5c70153895192a3e58981d4a00084473cd479bbca5783b.svg","flags/4x3/tr.svg":"flags/4x3/tr-04941a0f055d2ee2466b8e19532f58a2a0c4e3a83d986a601220fda2b6a3b090.svg","flags/1x1/tr.svg":"flags/1x1/tr-0df7b630a61ad40f32017487e6fef02258e8b2c8709c6fc8c1d3de1e9b36b09c.svg","flags/4x3/tt.svg":"flags/4x3/tt-9ca06051696b194f98d36ab4adb6aa7eb75275333cc0b48c9c9e1c34601013aa.svg","flags/1x1/tt.svg":"flags/1x1/tt-b05ee6c590e5c757190226182ac72648604086a272479f91d73dc24d90162eef.svg","flags/4x3/tv.svg":"flags/4x3/tv-5875f68681a06f613b3f84cd6959eb9dba70524bf14b0c8aa4a823a833dd6a98.svg","flags/1x1/tv.svg":"flags/1x1/tv-d8be186cccd6335a8f85c89085ef08b19c247df4081ed61698604972fdb8fa43.svg","flags/4x3/tw.svg":"flags/4x3/tw-29e639da18e668c62eb04ed3f3a02e11b0809890a2a0c82b529e50d53076e4e2.svg","flags/1x1/tw.svg":"flags/1x1/tw-2a2531772efdfcc74f70cc88f6fc15df7dc42dc344d9ed94b08e1847557976c4.svg","flags/4x3/tz.svg":"flags/4x3/tz-69ae0bf011f019428148ba9c3d793b4104be88621741beb216dfc9f43d125d6c.svg","flags/1x1/tz.svg":"flags/1x1/tz-581f05e20eeb5d8d77f807f2d6edaf786da8226284726841f33d9288ee84d6b7.svg","flags/4x3/ua.svg":"flags/4x3/ua-ddfa2a9985ed8342421c8df6fe852ec92e15d584c2565c525347bcd5f524c9da.svg","flags/1x1/ua.svg":"flags/1x1/ua-86260ecf3aa1da110f92b58861d7918e3e574a79cfb4334f9c82b1a750a8a875.svg","flags/4x3/ug.svg":"flags/4x3/ug-b748460c255e064ba8a2d89bb78c48fd29bdf496a7ca3c3af0ed0d83e49995cb.svg","flags/1x1/ug.svg":"flags/1x1/ug-8a8552bd983c6e2136f9eba9b4917d0e158415a24d9945f663ed56239299b44b.svg","flags/4x3/um.svg":"flags/4x3/um-d3a2b6a726a36d08db81fe4a5f0decd0afe5aa4ad8515304db4c3ace8f27e415.svg","flags/1x1/um.svg":"flags/1x1/um-0bcb31652ebcfa8c6727911e3df341b30425c3c699e6c4bf9f47c739ab9f442d.svg","flags/4x3/us.svg":"flags/4x3/us-c10177f8d2a93643101b39e419273bdd2f43a58ff9beff88a90431b0a4aa6a00.svg","flags/1x1/us.svg":"flags/1x1/us-a46068d8032a1e3364325da9675a41ba85a40c5401981c403fb7297aea254906.svg","flags/4x3/uy.svg":"flags/4x3/uy-ab18ad511d2822414e3b4f32e3309dca27b5b559cabd89cba2b4b4072387f440.svg","flags/1x1/uy.svg":"flags/1x1/uy-d94f5244cbd79f9348a048b7ec8861d37a237806dc1a6427fc9e743b86f43097.svg","flags/4x3/uz.svg":"flags/4x3/uz-78ae3b6ad90b0bb256102b6db50b8f9a7700fb6275e80d0c5b755e0defdcf8e5.svg","flags/1x1/uz.svg":"flags/1x1/uz-eff129a2e58e047e1daa2883f9ab0ef410bc11c42d652b9c4635bce5ab045b4f.svg","flags/4x3/va.svg":"flags/4x3/va-20117c2869d005de2cc54801f2d264b2823c214276f5559de1e48108f572fc79.svg","flags/1x1/va.svg":"flags/1x1/va-3206ffbb26fff2b3cd06959ba7f9d713efa9d133932d94ea1f1f6e3dd42687a3.svg","flags/4x3/vc.svg":"flags/4x3/vc-dccc1c2e4dc2d36ff71f8b04ebda868a7c4ce753b9fe5ccf0bed00edd7d41abb.svg","flags/1x1/vc.svg":"flags/1x1/vc-08a544ff242da12cc3fbad36579499a0b125c4b7ee7aa0af4eff0a261ea27a13.svg","flags/4x3/ve.svg":"flags/4x3/ve-d62ba31ca157e54409e09617a264e0dd18a2c597b1ad611c34da7fe7962e05dc.svg","flags/1x1/ve.svg":"flags/1x1/ve-f465be9b82185e94a0f84a3d8b2f536e026b8893fecfc324997ca711b9fe0097.svg","flags/4x3/vg.svg":"flags/4x3/vg-d6c3f0ef53e605acc97f33a4e0a61711b6a8207c6a2cff55b9427870053da583.svg","flags/1x1/vg.svg":"flags/1x1/vg-8a2a8af88748ff501bc90aceb327488cce5f323948d59f62c960ccfb58ca7510.svg","flags/4x3/vi.svg":"flags/4x3/vi-882e3005bf905201f3ccb79736ff058aad41d99046ef58fefb2e5f7df30d4ef4.svg","flags/1x1/vi.svg":"flags/1x1/vi-8f89c34e92ffdc8d17724234254fadad1bbb4b2828cb5e041b4d6a21ec5c3caa.svg","flags/4x3/vn.svg":"flags/4x3/vn-53c52e450c6e603d8b08c0170dd3bd15aaa0d4e9d250657bea188945c1252138.svg","flags/1x1/vn.svg":"flags/1x1/vn-7267ad3b33fb6d304ff414c998a2c69c6b46abc2528c2e955ff4367959cae8e1.svg","flags/4x3/vu.svg":"flags/4x3/vu-2dd468b3a9c89ef0bcbb155422cb38bb19e6255d2871ec2b7012055d31d13e2a.svg","flags/1x1/vu.svg":"flags/1x1/vu-477e1ac8d2d514517a8a6b84f917f9c43d0145d52f4b89e7205277ee3bbea422.svg","flags/4x3/wf.svg":"flags/4x3/wf-d2b9db8f6fa2a78507a5b4751f95e92c334673ecddd68eb33844ea91fc62d771.svg","flags/1x1/wf.svg":"flags/1x1/wf-095484363036fafbb44da7fbbdb6bb371c92c002163fb610c29912c6027a3cb7.svg","flags/4x3/ws.svg":"flags/4x3/ws-6a3fef801ba087404d3718c0b5b8741261d790cb2bf8b7581fea317e9689bcc7.svg","flags/1x1/ws.svg":"flags/1x1/ws-a312f6f7ddd2d5694c70b935f000ccc7716aae0b207e98ca4ad6ee252d272f49.svg","flags/4x3/ye.svg":"flags/4x3/ye-38ca92e79aeba152eee33f0d5dac55430af032a31b39d56d49c4287b0639fe72.svg","flags/1x1/ye.svg":"flags/1x1/ye-2d43095605cb09aeebaa7d9ec1147717dfffb26cd6a7ab66adfbf550a3bc8962.svg","flags/4x3/yt.svg":"flags/4x3/yt-2b54852c423d68df342c5bec300477510632be3f1046a2d9d9715a9617bc90ae.svg","flags/1x1/yt.svg":"flags/1x1/yt-3ea3c372eb1f7e269abafc08882bdb99d94c18ea363b905f8422f2733a550db8.svg","flags/4x3/za.svg":"flags/4x3/za-c57ff71cb91d156461c64ada7fb86779c009a9c0a53df0b6de2e87044eeefb74.svg","flags/1x1/za.svg":"flags/1x1/za-571b8b7da7f17cd9a4ce08e5696468e86efce9be83bb776c7586184fa75e99a9.svg","flags/4x3/zm.svg":"flags/4x3/zm-8a6d8f87b53dd7256d461f64cf66e2cd90df833aca8833849fbfe7445caeeae2.svg","flags/1x1/zm.svg":"flags/1x1/zm-d68871c839973048d37ad325312abfc1b22b525e3f48faefedcebea29e3e9175.svg","flags/4x3/zw.svg":"flags/4x3/zw-506cb345575e94583b442c3a23ded41e36cf454e797b3b2e03b4445a37395666.svg","flags/1x1/zw.svg":"flags/1x1/zw-f7716b45f4f267a661f85af47e95447adc282a4b9fc18bc88316cd970f8d947d.svg","flags/4x3/es-ct.svg":"flags/4x3/es-ct-bcbb454a50c9a647efd43dcf041445f15e8dd70654bde530bf62401d4fb7738d.svg","flags/1x1/es-ct.svg":"flags/1x1/es-ct-7f13eb2b2f5c11dccd7043286bed7540d4dad4b1a8367b0aca1b8405a351b2ef.svg","flags/4x3/eu.svg":"flags/4x3/eu-dfa7f5c90f5fe9eb16c8c865e73cf7e3e8fea328bf6cfc1b07f6bc28eefd43f5.svg","flags/1x1/eu.svg":"flags/1x1/eu-c3a400ee8dc3ee4dcc2d0f2868698ce781d403a9ea249d972115c8455cfcaa9b.svg","flags/4x3/gb-eng.svg":"flags/4x3/gb-eng-65a380032580f7144bddfd4ab353bb478d523232c4303edb0095e34e98c7dcb9.svg","flags/1x1/gb-eng.svg":"flags/1x1/gb-eng-6fe299a85ef920693f193828362f306fbd23020d2bfc61dcf9143d85a6a5001b.svg","flags/4x3/gb-nir.svg":"flags/4x3/gb-nir-7cdb174057442ee76cc8a3fef9df4650460b3a3a9c0634c2417c42e7383efe3f.svg","flags/1x1/gb-nir.svg":"flags/1x1/gb-nir-ea58e209ad11b7e21e357799a5a0d4c7cfd13b2f7407cb09933a2dc485da41ff.svg","flags/4x3/gb-sct.svg":"flags/4x3/gb-sct-f7b13851e9b9de7532ef86afefb7fe2efe6149fee8ea50505771b4f7d112cf7b.svg","flags/1x1/gb-sct.svg":"flags/1x1/gb-sct-76e5e39a38915cf5f6020d6f58d0385f1fc0d502dbecddabf00a18cd50c88995.svg","flags/4x3/gb-wls.svg":"flags/4x3/gb-wls-c6e549d37113c25f679d5ea75020ea514971a1038b3c92d6a71c316a56b542da.svg","flags/1x1/gb-wls.svg":"flags/1x1/gb-wls-99a7a03c4ef2a0789d35aa1ab8b746ec72c1c8de58426afc7fa096d5a00802a7.svg","flags/4x3/un.svg":"flags/4x3/un-3760dc125288de6c2143060b283497dfed4de7430943f5be86a67d7668ede7a3.svg","flags/1x1/un.svg":"flags/1x1/un-aac693764e62f5d0bccf80bc53f68bb6cde75b18c3b3829a89b79555df538c71.svg","leaflet/dist/images/layers.png":"leaflet/dist/images/layers-0e356f4d554162eb71f127f50460dbc55d405027189ebe90b20729ef18d13d36.png","leaflet/dist/images/layers-2x.png":"leaflet/dist/images/layers-2x-ba8fa601e413b14db27db07285ade3951721e02244c31523284ab2d1ed53c3dc.png","leaflet/dist/images/marker-icon.png":"leaflet/dist/images/marker-icon-3d253116ec4ba0e1f22a01cdf1ff7f120fa4d89a6cd0933d68f12951d19809b4.png","markers-soft.png":"markers-soft-6743c1321400ff5ed1fb4c3b0a68a7f8857956084f426b6bb8bff03cab2b724e.png","markers-shadow.png":"markers-shadow-883ead799be0d0437c65d6172342237e860d121f35a2d215ce4170a8da302338.png","markers-soft@2x.png":"markers-soft@2x-dd562751740663b74ed9a16c1484444d40fb95b79b8b1b13e5e12a2f8331c5e2.png","markers-shadow@2x.png":"markers-shadow@2x-64fe7e2740a7d015109cd31a498357dada39f7552caac379a8d1f0c18dc3d77c.png","events.js":"events-3e83b10967184ff7800176a5aae37f0d45162e4dbc6a8d101e79636eb2274842.js","filter.js":"filter-aec6405be3a059d4c6182c2b78a7d862e5879d378af79f10c70dd70115d76c69.js","flash.js":"flash-757c43f7bcfec72eb8c147d7e40eea4373bbc31269904db4c67a187a13fc856e.js","frTypo.js":"frTypo-e14689364c33d905e570ab98d54aa6effd3d6a32bff772ff61f4d444a677b507.js","list.js":"list-4bca572230746ba29b71588069332bc93e191c4d354e70ce7f4d79d6de930b2b.js","maps.js":"maps-e1374da0139727945cef18b9825aac8ff8385c42bd52e4392dfb6d5b42b9d0ee.js","moderations.js":"moderations-1083e9b51d8fdacde5ae79ae6e653e83ea2f97cf547b76137bc7dc870b1cca1e.js","notes.js":"notes-27cfb9694c5e92d25d972c2b4a2d2e222ad088aef866823f772241c1db423402.js","orgas.js":"orgas-27cfb9694c5e92d25d972c2b4a2d2e222ad088aef866823f772241c1db423402.js","pages.js":"pages-ebefad825b6310fe638f3e10bb941230b69ee16fc9de859ce670c3e282c2ba61.js","pagination.js":"pagination-ab6b8afabe3d53764287ed9d0ee9d4b7092cab98cdfb453a54471066fed05aa5.js","setup_tinymce.js":"setup_tinymce-25067ac5d8f690f8eee54a28349199fcb5831ea846457867835bcf47d57952f6.js","stats.js":"stats-57831421e685bf087e5d17e18193ec7b883975e14affaefeff0b1f2ad9cf1287.js","_variables.css":"_variables-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css","agendadescommuns.css":"agendadescommuns-18a01cd096b29d12a928627259ca8820b2f291b55421b3e99d8d36a557cb81f5.css","all.css":"all-961f78ee92432ef39fd4ccd99a0f2f752e1a8edfb766706ceb1a339b255958d8.css","digest.css":"digest-104627419d74f190311b5b3cdf13e9d62090ec931cdcba30c9b4cf162f340e60.css","events.css":"events-f6adf5fd5d2bef673919b4d5db87b539121c6c3cf5a70c1a0e0fec222c194dd3.css","form.css":"form-f538ad878340c212194ccc353a0413127beb91a909abf7c713cf0d59e8bdab0c.css","frTypo.css":"frTypo-3ac4d503c4f2ecb1b79218c06eae720b3be67dc97f345d88742d0169534c73ee.css","list.css":"list-561b0a756f4d38ca2e80f68e71f3cf9209d36ae15c5986d05e3989860c0f30ec.css","maps.css":"maps-725c7d4efc62c8c339fee78c80a21b5282c666f0a86f10799ca2a9f44dea33cd.css","mobile.css":"mobile-f85c37d44d2b40fbcdf2ca4a3e992b55a271deb6d69e48cf302fd68c24e47e75.css","moderations.css":"moderations-0096ff2dbaaf4cb827c0ea9595246185e8f6eb1201a95ad47383204f767cfbb7.css","notes.css":"notes-dfb4401eda9f1493c47d21bfde74b3bea884e032b8475dc754f9f1fb3689796d.css","orgas.css":"orgas-bf3c0aa4f00bc446c1ccfdb4cd77994db2fa465436c6420c22bebab5738409a7.css","pages.css":"pages-b29917202190ced028521961bd8de890197e6987a2e5c8e871dbfaf2ea51fa9e.css","region.css":"region-da39e2fee3e61e44603f5248317352e5901effd4339eccb6cb8c14df81319115.css","scaffolds.css":"scaffolds-f62d5fc6ab54601c38d8281da2a240b651784b27a628a5d6c328df499c3dbeac.css","sessions.css":"sessions-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css","stats.css":"stats-f9fe4057e217c7e56a4bd9cc12618d1ff98805bb494f368a6dcce15d9b9ef0c3.css","tags.css":"tags-fd1c7a90a96d15f57a9d27860a1192f4daf34dc715ca12e9db90efb3dac04955.css","versions.css":"versions-51d9b0340f6b1229364dc45dd44b1b81253212ccac013d642313f59ac833138e.css","tinymce/jquery.tinymce.js":"tinymce/jquery.tinymce.js","tinymce/langs/readme.md":"tinymce/langs/readme.md","tinymce/license.txt":"tinymce/license.txt","tinymce/plugins/advlist/plugin.js":"tinymce/plugins/advlist/plugin.js","tinymce/plugins/anchor/plugin.js":"tinymce/plugins/anchor/plugin.js","tinymce/plugins/autolink/plugin.js":"tinymce/plugins/autolink/plugin.js","tinymce/plugins/autoresize/plugin.js":"tinymce/plugins/autoresize/plugin.js","tinymce/plugins/autosave/plugin.js":"tinymce/plugins/autosave/plugin.js","tinymce/plugins/bbcode/plugin.js":"tinymce/plugins/bbcode/plugin.js","tinymce/plugins/charmap/plugin.js":"tinymce/plugins/charmap/plugin.js","tinymce/plugins/code/plugin.js":"tinymce/plugins/code/plugin.js","tinymce/plugins/codesample/plugin.js":"tinymce/plugins/codesample/plugin.js","tinymce/plugins/colorpicker/plugin.js":"tinymce/plugins/colorpicker/plugin.js","tinymce/plugins/contextmenu/plugin.js":"tinymce/plugins/contextmenu/plugin.js","tinymce/plugins/directionality/plugin.js":"tinymce/plugins/directionality/plugin.js","tinymce/plugins/emoticons/js/emojis.js":"tinymce/plugins/emoticons/js/emojis.js","tinymce/plugins/emoticons/plugin.js":"tinymce/plugins/emoticons/plugin.js","tinymce/plugins/fullpage/plugin.js":"tinymce/plugins/fullpage/plugin.js","tinymce/plugins/fullscreen/plugin.js":"tinymce/plugins/fullscreen/plugin.js","tinymce/plugins/help/plugin.js":"tinymce/plugins/help/plugin.js","tinymce/plugins/hr/plugin.js":"tinymce/plugins/hr/plugin.js","tinymce/plugins/image/plugin.js":"tinymce/plugins/image/plugin.js","tinymce/plugins/imagetools/plugin.js":"tinymce/plugins/imagetools/plugin.js","tinymce/plugins/importcss/plugin.js":"tinymce/plugins/importcss/plugin.js","tinymce/plugins/insertdatetime/plugin.js":"tinymce/plugins/insertdatetime/plugin.js","tinymce/plugins/legacyoutput/plugin.js":"tinymce/plugins/legacyoutput/plugin.js","tinymce/plugins/link/plugin.js":"tinymce/plugins/link/plugin.js","tinymce/plugins/lists/plugin.js":"tinymce/plugins/lists/plugin.js","tinymce/plugins/media/plugin.js":"tinymce/plugins/media/plugin.js","tinymce/plugins/nonbreaking/plugin.js":"tinymce/plugins/nonbreaking/plugin.js","tinymce/plugins/noneditable/plugin.js":"tinymce/plugins/noneditable/plugin.js","tinymce/plugins/pagebreak/plugin.js":"tinymce/plugins/pagebreak/plugin.js","tinymce/plugins/paste/plugin.js":"tinymce/plugins/paste/plugin.js","tinymce/plugins/preview/plugin.js":"tinymce/plugins/preview/plugin.js","tinymce/plugins/print/plugin.js":"tinymce/plugins/print/plugin.js","tinymce/plugins/quickbars/plugin.js":"tinymce/plugins/quickbars/plugin.js","tinymce/plugins/save/plugin.js":"tinymce/plugins/save/plugin.js","tinymce/plugins/searchreplace/plugin.js":"tinymce/plugins/searchreplace/plugin.js","tinymce/plugins/spellchecker/plugin.js":"tinymce/plugins/spellchecker/plugin.js","tinymce/plugins/tabfocus/plugin.js":"tinymce/plugins/tabfocus/plugin.js","tinymce/plugins/table/plugin.js":"tinymce/plugins/table/plugin.js","tinymce/plugins/template/plugin.js":"tinymce/plugins/template/plugin.js","tinymce/plugins/textcolor/plugin.js":"tinymce/plugins/textcolor/plugin.js","tinymce/plugins/textpattern/plugin.js":"tinymce/plugins/textpattern/plugin.js","tinymce/plugins/toc/plugin.js":"tinymce/plugins/toc/plugin.js","tinymce/plugins/visualblocks/plugin.js":"tinymce/plugins/visualblocks/plugin.js","tinymce/plugins/visualchars/plugin.js":"tinymce/plugins/visualchars/plugin.js","tinymce/plugins/wordcount/plugin.js":"tinymce/plugins/wordcount/plugin.js","tinymce/skins/content/dark/content.css":"tinymce/skins/content/dark/content.css","tinymce/skins/content/dark/content.min.css":"tinymce/skins/content/dark/content.min.css","tinymce/skins/content/default/content.css":"tinymce/skins/content/default/content.css","tinymce/skins/content/default/content.min.css":"tinymce/skins/content/default/content.min.css","tinymce/skins/content/document/content.css":"tinymce/skins/content/document/content.css","tinymce/skins/content/document/content.min.css":"tinymce/skins/content/document/content.min.css","tinymce/skins/content/writer/content.css":"tinymce/skins/content/writer/content.css","tinymce/skins/content/writer/content.min.css":"tinymce/skins/content/writer/content.min.css","tinymce/skins/ui/oxide-dark/content.css":"tinymce/skins/ui/oxide-dark/content.css","tinymce/skins/ui/oxide-dark/content.inline.css":"tinymce/skins/ui/oxide-dark/content.inline.css","tinymce/skins/ui/oxide-dark/content.inline.min.css":"tinymce/skins/ui/oxide-dark/content.inline.min.css","tinymce/skins/ui/oxide-dark/content.min.css":"tinymce/skins/ui/oxide-dark/content.min.css","tinymce/skins/ui/oxide-dark/content.mobile.css":"tinymce/skins/ui/oxide-dark/content.mobile.css","tinymce/skins/ui/oxide-dark/content.mobile.min.css":"tinymce/skins/ui/oxide-dark/content.mobile.min.css","tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff":"tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff","tinymce/skins/ui/oxide-dark/skin.css":"tinymce/skins/ui/oxide-dark/skin.css","tinymce/skins/ui/oxide-dark/skin.min.css":"tinymce/skins/ui/oxide-dark/skin.min.css","tinymce/skins/ui/oxide-dark/skin.mobile.css":"tinymce/skins/ui/oxide-dark/skin.mobile.css","tinymce/skins/ui/oxide-dark/skin.mobile.min.css":"tinymce/skins/ui/oxide-dark/skin.mobile.min.css","tinymce/skins/ui/oxide/content.css":"tinymce/skins/ui/oxide/content.css","tinymce/skins/ui/oxide/content.inline.css":"tinymce/skins/ui/oxide/content.inline.css","tinymce/skins/ui/oxide/content.inline.min.css":"tinymce/skins/ui/oxide/content.inline.min.css","tinymce/skins/ui/oxide/content.min.css":"tinymce/skins/ui/oxide/content.min.css","tinymce/skins/ui/oxide/content.mobile.css":"tinymce/skins/ui/oxide/content.mobile.css","tinymce/skins/ui/oxide/content.mobile.min.css":"tinymce/skins/ui/oxide/content.mobile.min.css","tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff":"tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff","tinymce/skins/ui/oxide/skin.css":"tinymce/skins/ui/oxide/skin.css","tinymce/skins/ui/oxide/skin.min.css":"tinymce/skins/ui/oxide/skin.min.css","tinymce/skins/ui/oxide/skin.mobile.css":"tinymce/skins/ui/oxide/skin.mobile.css","tinymce/skins/ui/oxide/skin.mobile.min.css":"tinymce/skins/ui/oxide/skin.mobile.min.css","tinymce/themes/mobile/theme.js":"tinymce/themes/mobile/theme.js","tinymce/themes/silver/theme.js":"tinymce/themes/silver/theme.js","tinymce/tinymce.js":"tinymce/tinymce.js","tinymce-rails.manifest.js":"tinymce-rails.manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js","flags/4x3/es-ca.svg":"flags/4x3/es-ca-884e8f11877dc43b5c29bbc00c6980cc57ee8e671b710b9f9d59e29927cd25d4.svg","flags/1x1/es-ca.svg":"flags/1x1/es-ca-2f61e283eeea7f76c15207644f2a8538e05a4eae39dbc8186509209773701cd9.svg","flags/4x3/xk.svg":"flags/4x3/xk-c40be9a1d1844391b275542b4a4ef7a9eecac72a93b08e7f4f2f4ebb17c7538c.svg","flags/1x1/xk.svg":"flags/1x1/xk-c5498f241b2608496ac30b7c8570d9dcd8f88432ea739ac0ca1abd7fd8beae99.svg","tinymce/icons/default/icons.js":"tinymce/icons/default/icons.js","tinymce/plugins/emoticons/js/emojiimages.js":"tinymce/plugins/emoticons/js/emojiimages.js","tinymce/skins/ui/oxide-dark/skin.shadowdom.css":"tinymce/skins/ui/oxide-dark/skin.shadowdom.css","tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css":"tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css","tinymce/skins/ui/oxide/skin.shadowdom.css":"tinymce/skins/ui/oxide/skin.shadowdom.css","tinymce/skins/ui/oxide/skin.shadowdom.min.css":"tinymce/skins/ui/oxide/skin.shadowdom.min.css","appel-web-180x60-libre-en-fete-2022.png":"appel-web-180x60-libre-en-fete-2022-02d051e0a863d530e6fc940a19720325cd3283c8067773f6c2802fafe81f5f79.png","appel-web-486x80-libre-en-fete-2022.png":"appel-web-486x80-libre-en-fete-2022-90f1d12c05449cbb3bae6d682438d4c5664771e267da331c1ac58e5a51bbc486.png","appel-web-1429x352-libre-en-fete-2022-merci.png":"appel-web-1429x352-libre-en-fete-2022-merci-10eb65847b1807928109cc9c46bb764e2d91c13a0b81a5d1a8db741176d4d76b.png","actiontext.js":"actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js","trix.js":"trix-1563ff9c10f74e143b3ded40a8458497eaf2f87a648a5cbbfebdb7dec3447a5e.js","trix.css":"trix-6fd35bb8fae1d6a795115763ca265369b9750f73a1c6283a0b0ef4b6c2d550c8.css","activestorage.js":"activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js","activestorage.esm.js":"activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js","actioncable.js":"actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js","actioncable.esm.js":"actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js","es-module-shims.js":"es-module-shims-cc9c89730a363e05aad0613bb8a7ee937baa2b44516176f9c19365e348032583.js","es-module-shims.min.js":"es-module-shims.min-606ae9c3279013fe751cee30f719a592f759e705edb66496812f3d9dbce3d850.js","es-module-shims.js.map":"es-module-shims.js-d8b1db8467f1af14f3ecf729b9fb6dd6a55f3ccff4499a3f033397e46d48bf68.map","tinymce/langs/README.md":"tinymce/langs/README.md","tinymce/models/dom/model.js":"tinymce/models/dom/model.js","tinymce/skins/content/tinymce-5/content.css":"tinymce/skins/content/tinymce-5/content.css","tinymce/skins/content/tinymce-5/content.min.css":"tinymce/skins/content/tinymce-5/content.min.css","tinymce/skins/content/tinymce-5-dark/content.css":"tinymce/skins/content/tinymce-5-dark/content.css","tinymce/skins/content/tinymce-5-dark/content.min.css":"tinymce/skins/content/tinymce-5-dark/content.min.css","tinymce/skins/ui/tinymce-5/content.css":"tinymce/skins/ui/tinymce-5/content.css","tinymce/skins/ui/tinymce-5/content.inline.css":"tinymce/skins/ui/tinymce-5/content.inline.css","tinymce/skins/ui/tinymce-5/content.inline.min.css":"tinymce/skins/ui/tinymce-5/content.inline.min.css","tinymce/skins/ui/tinymce-5/content.min.css":"tinymce/skins/ui/tinymce-5/content.min.css","tinymce/skins/ui/tinymce-5/skin.css":"tinymce/skins/ui/tinymce-5/skin.css","tinymce/skins/ui/tinymce-5/skin.min.css":"tinymce/skins/ui/tinymce-5/skin.min.css","tinymce/skins/ui/tinymce-5/skin.shadowdom.css":"tinymce/skins/ui/tinymce-5/skin.shadowdom.css","tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css":"tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css","tinymce/skins/ui/tinymce-5-dark/content.css":"tinymce/skins/ui/tinymce-5-dark/content.css","tinymce/skins/ui/tinymce-5-dark/content.inline.css":"tinymce/skins/ui/tinymce-5-dark/content.inline.css","tinymce/skins/ui/tinymce-5-dark/content.inline.min.css":"tinymce/skins/ui/tinymce-5-dark/content.inline.min.css","tinymce/skins/ui/tinymce-5-dark/content.min.css":"tinymce/skins/ui/tinymce-5-dark/content.min.css","tinymce/skins/ui/tinymce-5-dark/skin.css":"tinymce/skins/ui/tinymce-5-dark/skin.css","tinymce/skins/ui/tinymce-5-dark/skin.min.css":"tinymce/skins/ui/tinymce-5-dark/skin.min.css","tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css":"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css","tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css":"tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css","tinymce/tinymce.d.ts":"tinymce/tinymce.d.ts"}}
\ No newline at end of file
diff --git a/public/assets/active_admin-eb8733db747437591c1328e50a95f8ee1a686b381b1db446272df3d19f775b15.js b/public/assets/active_admin-eb8733db747437591c1328e50a95f8ee1a686b381b1db446272df3d19f775b15.js
new file mode 100644
index 0000000000000000000000000000000000000000..095f04e86ecb59829ee12206c7fa59bd98116025
--- /dev/null
+++ b/public/assets/active_admin-eb8733db747437591c1328e50a95f8ee1a686b381b1db446272df3d19f775b15.js
@@ -0,0 +1,34062 @@
+/*!
+ * jQuery JavaScript Library v3.6.0
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright OpenJS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2021-03-02T17:08Z
+ */
+( function( global, factory ) {
+
+	"use strict";
+
+	if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+		// For CommonJS and CommonJS-like environments where a proper `window`
+		// is present, execute the factory and get jQuery.
+		// For environments that do not have a `window` with a `document`
+		// (such as Node.js), expose a factory as module.exports.
+		// This accentuates the need for the creation of a real `window`.
+		// e.g. var jQuery = require("jquery")(window);
+		// See ticket #14549 for more info.
+		module.exports = global.document ?
+			factory( global, true ) :
+			function( w ) {
+				if ( !w.document ) {
+					throw new Error( "jQuery requires a window with a document" );
+				}
+				return factory( w );
+			};
+	} else {
+		factory( global );
+	}
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var flat = arr.flat ? function( array ) {
+	return arr.flat.call( array );
+} : function( array ) {
+	return arr.concat.apply( [], array );
+};
+
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+		// Support: Chrome <=57, Firefox <=52
+		// In some browsers, typeof returns "function" for HTML <object> elements
+		// (i.e., `typeof document.createElement( "object" ) === "function"`).
+		// We don't want to classify *any* DOM node as a function.
+		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+		// Plus for old WebKit, typeof returns "function" for HTML collections
+		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+			typeof obj.item !== "function";
+	};
+
+
+var isWindow = function isWindow( obj ) {
+		return obj != null && obj === obj.window;
+	};
+
+
+var document = window.document;
+
+
+
+	var preservedScriptAttributes = {
+		type: true,
+		src: true,
+		nonce: true,
+		noModule: true
+	};
+
+	function DOMEval( code, node, doc ) {
+		doc = doc || document;
+
+		var i, val,
+			script = doc.createElement( "script" );
+
+		script.text = code;
+		if ( node ) {
+			for ( i in preservedScriptAttributes ) {
+
+				// Support: Firefox 64+, Edge 18+
+				// Some browsers don't support the "nonce" property on scripts.
+				// On the other hand, just using `getAttribute` is not enough as
+				// the `nonce` attribute is reset to an empty string whenever it
+				// becomes browsing-context connected.
+				// See https://github.com/whatwg/html/issues/2369
+				// See https://html.spec.whatwg.org/#nonce-attributes
+				// The `node.getAttribute` check was added for the sake of
+				// `jQuery.globalEval` so that it can fake a nonce-containing node
+				// via an object.
+				val = node[ i ] || node.getAttribute && node.getAttribute( i );
+				if ( val ) {
+					script.setAttribute( i, val );
+				}
+			}
+		}
+		doc.head.appendChild( script ).parentNode.removeChild( script );
+	}
+
+
+function toType( obj ) {
+	if ( obj == null ) {
+		return obj + "";
+	}
+
+	// Support: Android <=2.3 only (functionish RegExp)
+	return typeof obj === "object" || typeof obj === "function" ?
+		class2type[ toString.call( obj ) ] || "object" :
+		typeof obj;
+}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+	version = "3.6.0",
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+
+		// The jQuery object is actually just the init constructor 'enhanced'
+		// Need init if jQuery is called (just allow error to be thrown if not included)
+		return new jQuery.fn.init( selector, context );
+	};
+
+jQuery.fn = jQuery.prototype = {
+
+	// The current version of jQuery being used
+	jquery: version,
+
+	constructor: jQuery,
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+
+		// Return all the elements in a clean array
+		if ( num == null ) {
+			return slice.call( this );
+		}
+
+		// Return just the one element from the set
+		return num < 0 ? this[ num + this.length ] : this[ num ];
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	each: function( callback ) {
+		return jQuery.each( this, callback );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map( this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		} ) );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	even: function() {
+		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+			return ( i + 1 ) % 2;
+		} ) );
+	},
+
+	odd: function() {
+		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+			return i % 2;
+		} ) );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor();
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: arr.sort,
+	splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[ 0 ] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+
+		// Skip the boolean and the target
+		target = arguments[ i ] || {};
+		i++;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !isFunction( target ) ) {
+		target = {};
+	}
+
+	// Extend jQuery itself if only one argument is passed
+	if ( i === length ) {
+		target = this;
+		i--;
+	}
+
+	for ( ; i < length; i++ ) {
+
+		// Only deal with non-null/undefined values
+		if ( ( options = arguments[ i ] ) != null ) {
+
+			// Extend the base object
+			for ( name in options ) {
+				copy = options[ name ];
+
+				// Prevent Object.prototype pollution
+				// Prevent never-ending loop
+				if ( name === "__proto__" || target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+					( copyIsArray = Array.isArray( copy ) ) ) ) {
+					src = target[ name ];
+
+					// Ensure proper type for the source value
+					if ( copyIsArray && !Array.isArray( src ) ) {
+						clone = [];
+					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
+						clone = {};
+					} else {
+						clone = src;
+					}
+					copyIsArray = false;
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend( {
+
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+	// Assume jQuery is ready without the ready module
+	isReady: true,
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	noop: function() {},
+
+	isPlainObject: function( obj ) {
+		var proto, Ctor;
+
+		// Detect obvious negatives
+		// Use toString instead of jQuery.type to catch host objects
+		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+			return false;
+		}
+
+		proto = getProto( obj );
+
+		// Objects with no prototype (e.g., `Object.create( null )`) are plain
+		if ( !proto ) {
+			return true;
+		}
+
+		// Objects with prototype are plain iff they were constructed by a global Object function
+		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	// Evaluates a script in a provided context; falls back to the global one
+	// if not specified.
+	globalEval: function( code, options, doc ) {
+		DOMEval( code, { nonce: options && options.nonce }, doc );
+	},
+
+	each: function( obj, callback ) {
+		var length, i = 0;
+
+		if ( isArrayLike( obj ) ) {
+			length = obj.length;
+			for ( ; i < length; i++ ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		} else {
+			for ( i in obj ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArrayLike( Object( arr ) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+						[ arr ] : arr
+				);
+			} else {
+				push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		return arr == null ? -1 : indexOf.call( arr, elem, i );
+	},
+
+	// Support: Android <=4.0 only, PhantomJS 1 only
+	// push.apply(_, arraylike) throws on ancient WebKit
+	merge: function( first, second ) {
+		var len = +second.length,
+			j = 0,
+			i = first.length;
+
+		for ( ; j < len; j++ ) {
+			first[ i++ ] = second[ j ];
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, invert ) {
+		var callbackInverse,
+			matches = [],
+			i = 0,
+			length = elems.length,
+			callbackExpect = !invert;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			callbackInverse = !callback( elems[ i ], i );
+			if ( callbackInverse !== callbackExpect ) {
+				matches.push( elems[ i ] );
+			}
+		}
+
+		return matches;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var length, value,
+			i = 0,
+			ret = [];
+
+		// Go through the array, translating each of the items to their new values
+		if ( isArrayLike( elems ) ) {
+			length = elems.length;
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return flat( ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// jQuery.support is not used in Core but other projects attach their
+	// properties to it so it needs to exist.
+	support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+	function( _i, name ) {
+		class2type[ "[object " + name + "]" ] = name.toLowerCase();
+	} );
+
+function isArrayLike( obj ) {
+
+	// Support: real iOS 8.2 only (not reproducible in simulator)
+	// `in` check used to prevent JIT error (gh-2145)
+	// hasOwn isn't used here due to false negatives
+	// regarding Nodelist length in IE
+	var length = !!obj && "length" in obj && obj.length,
+		type = toType( obj );
+
+	if ( isFunction( obj ) || isWindow( obj ) ) {
+		return false;
+	}
+
+	return type === "array" || length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.6
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://js.foundation/
+ *
+ * Date: 2021-02-16
+ */
+( function( window ) {
+var i,
+	support,
+	Expr,
+	getText,
+	isXML,
+	tokenize,
+	compile,
+	select,
+	outermostContext,
+	sortInput,
+	hasDuplicate,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + 1 * new Date(),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	nonnativeSelectorCache = createCache(),
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+		}
+		return 0;
+	},
+
+	// Instance methods
+	hasOwn = ( {} ).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	pushNative = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+
+	// Use a stripped-down indexOf as it's faster than native
+	// https://jsperf.com/thor-indexof-vs-for/5
+	indexOf = function( list, elem ) {
+		var i = 0,
+			len = list.length;
+		for ( ; i < len; i++ ) {
+			if ( list[ i ] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
+		"ismap|loop|multiple|open|readonly|required|scoped",
+
+	// Regular expressions
+
+	// http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+
+	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
+	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
+		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
+
+	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+
+		// Operator (capture 2)
+		"*([*^$|!~]?=)" + whitespace +
+
+		// "Attribute values must be CSS identifiers [capture 5]
+		// or strings [capture 3 or capture 4]"
+		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
+		whitespace + "*\\]",
+
+	pseudos = ":(" + identifier + ")(?:\\((" +
+
+		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+		// 1. quoted (capture 3; capture 4 or capture 5)
+		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+
+		// 2. simple (capture 6)
+		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+
+		// 3. anything else (capture 2)
+		".*" +
+		")\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rwhitespace = new RegExp( whitespace + "+", "g" ),
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
+		whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
+		"*" ),
+	rdescend = new RegExp( whitespace + "|>" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + identifier + ")" ),
+		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
+			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
+			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace +
+			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rhtml = /HTML$/i,
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rsibling = /[+~]/,
+
+	// CSS escapes
+	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
+	funescape = function( escape, nonHex ) {
+		var high = "0x" + escape.slice( 1 ) - 0x10000;
+
+		return nonHex ?
+
+			// Strip the backslash prefix from a non-hex escape sequence
+			nonHex :
+
+			// Replace a hexadecimal escape sequence with the encoded Unicode code point
+			// Support: IE <=11+
+			// For values outside the Basic Multilingual Plane (BMP), manually construct a
+			// surrogate pair
+			high < 0 ?
+				String.fromCharCode( high + 0x10000 ) :
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	},
+
+	// CSS string/identifier serialization
+	// https://drafts.csswg.org/cssom/#common-serializing-idioms
+	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+	fcssescape = function( ch, asCodePoint ) {
+		if ( asCodePoint ) {
+
+			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+			if ( ch === "\0" ) {
+				return "\uFFFD";
+			}
+
+			// Control characters and (dependent upon position) numbers get escaped as code points
+			return ch.slice( 0, -1 ) + "\\" +
+				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+		}
+
+		// Other potentially-special ASCII characters get backslash-escaped
+		return "\\" + ch;
+	},
+
+	// Used for iframes
+	// See setDocument()
+	// Removing the function wrapper causes a "Permission Denied"
+	// error in IE
+	unloadHandler = function() {
+		setDocument();
+	},
+
+	inDisabledFieldset = addCombinator(
+		function( elem ) {
+			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
+		},
+		{ dir: "parentNode", next: "legend" }
+	);
+
+// Optimize for push.apply( _, NodeList )
+try {
+	push.apply(
+		( arr = slice.call( preferredDoc.childNodes ) ),
+		preferredDoc.childNodes
+	);
+
+	// Support: Android<4.0
+	// Detect silently failing push.apply
+	// eslint-disable-next-line no-unused-expressions
+	arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+	push = { apply: arr.length ?
+
+		// Leverage slice if possible
+		function( target, els ) {
+			pushNative.apply( target, slice.call( els ) );
+		} :
+
+		// Support: IE<9
+		// Otherwise append directly
+		function( target, els ) {
+			var j = target.length,
+				i = 0;
+
+			// Can't trust NodeList.length
+			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
+			target.length = j - 1;
+		}
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var m, i, elem, nid, match, groups, newSelector,
+		newContext = context && context.ownerDocument,
+
+		// nodeType defaults to 9, since context defaults to document
+		nodeType = context ? context.nodeType : 9;
+
+	results = results || [];
+
+	// Return early from calls with invalid selector or context
+	if ( typeof selector !== "string" || !selector ||
+		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+		return results;
+	}
+
+	// Try to shortcut find operations (as opposed to filters) in HTML documents
+	if ( !seed ) {
+		setDocument( context );
+		context = context || document;
+
+		if ( documentIsHTML ) {
+
+			// If the selector is sufficiently simple, try using a "get*By*" DOM method
+			// (excepting DocumentFragment context, where the methods don't exist)
+			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
+
+				// ID selector
+				if ( ( m = match[ 1 ] ) ) {
+
+					// Document context
+					if ( nodeType === 9 ) {
+						if ( ( elem = context.getElementById( m ) ) ) {
+
+							// Support: IE, Opera, Webkit
+							// TODO: identify versions
+							// getElementById can match elements by name instead of ID
+							if ( elem.id === m ) {
+								results.push( elem );
+								return results;
+							}
+						} else {
+							return results;
+						}
+
+					// Element context
+					} else {
+
+						// Support: IE, Opera, Webkit
+						// TODO: identify versions
+						// getElementById can match elements by name instead of ID
+						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
+							contains( context, elem ) &&
+							elem.id === m ) {
+
+							results.push( elem );
+							return results;
+						}
+					}
+
+				// Type selector
+				} else if ( match[ 2 ] ) {
+					push.apply( results, context.getElementsByTagName( selector ) );
+					return results;
+
+				// Class selector
+				} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
+					context.getElementsByClassName ) {
+
+					push.apply( results, context.getElementsByClassName( m ) );
+					return results;
+				}
+			}
+
+			// Take advantage of querySelectorAll
+			if ( support.qsa &&
+				!nonnativeSelectorCache[ selector + " " ] &&
+				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
+
+				// Support: IE 8 only
+				// Exclude object elements
+				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
+
+				newSelector = selector;
+				newContext = context;
+
+				// qSA considers elements outside a scoping root when evaluating child or
+				// descendant combinators, which is not what we want.
+				// In such cases, we work around the behavior by prefixing every selector in the
+				// list with an ID selector referencing the scope context.
+				// The technique has to be used as well when a leading combinator is used
+				// as such selectors are not recognized by querySelectorAll.
+				// Thanks to Andrew Dupont for this technique.
+				if ( nodeType === 1 &&
+					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
+
+					// Expand context for sibling selectors
+					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+						context;
+
+					// We can use :scope instead of the ID hack if the browser
+					// supports it & if we're not changing the context.
+					if ( newContext !== context || !support.scope ) {
+
+						// Capture the context ID, setting it first if necessary
+						if ( ( nid = context.getAttribute( "id" ) ) ) {
+							nid = nid.replace( rcssescape, fcssescape );
+						} else {
+							context.setAttribute( "id", ( nid = expando ) );
+						}
+					}
+
+					// Prefix every selector in the list
+					groups = tokenize( selector );
+					i = groups.length;
+					while ( i-- ) {
+						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
+							toSelector( groups[ i ] );
+					}
+					newSelector = groups.join( "," );
+				}
+
+				try {
+					push.apply( results,
+						newContext.querySelectorAll( newSelector )
+					);
+					return results;
+				} catch ( qsaError ) {
+					nonnativeSelectorCache( selector, true );
+				} finally {
+					if ( nid === expando ) {
+						context.removeAttribute( "id" );
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var keys = [];
+
+	function cache( key, value ) {
+
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key + " " ) > Expr.cacheLength ) {
+
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return ( cache[ key + " " ] = value );
+	}
+	return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+	var el = document.createElement( "fieldset" );
+
+	try {
+		return !!fn( el );
+	} catch ( e ) {
+		return false;
+	} finally {
+
+		// Remove from its parent by default
+		if ( el.parentNode ) {
+			el.parentNode.removeChild( el );
+		}
+
+		// release memory in IE
+		el = null;
+	}
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+	var arr = attrs.split( "|" ),
+		i = arr.length;
+
+	while ( i-- ) {
+		Expr.attrHandle[ arr[ i ] ] = handler;
+	}
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+			a.sourceIndex - b.sourceIndex;
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( ( cur = cur.nextSibling ) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return ( name === "input" || name === "button" ) && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+	return function( elem ) {
+
+		// Only certain elements can match :enabled or :disabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+		if ( "form" in elem ) {
+
+			// Check for inherited disabledness on relevant non-disabled elements:
+			// * listed form-associated elements in a disabled fieldset
+			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+			// * option elements in a disabled optgroup
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+			// All such elements have a "form" property.
+			if ( elem.parentNode && elem.disabled === false ) {
+
+				// Option elements defer to a parent optgroup if present
+				if ( "label" in elem ) {
+					if ( "label" in elem.parentNode ) {
+						return elem.parentNode.disabled === disabled;
+					} else {
+						return elem.disabled === disabled;
+					}
+				}
+
+				// Support: IE 6 - 11
+				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
+				return elem.isDisabled === disabled ||
+
+					// Where there is no isDisabled, check manually
+					/* jshint -W018 */
+					elem.isDisabled !== !disabled &&
+					inDisabledFieldset( elem ) === disabled;
+			}
+
+			return elem.disabled === disabled;
+
+		// Try to winnow out elements that can't be disabled before trusting the disabled property.
+		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+		// even exist on them, let alone have a boolean value.
+		} else if ( "label" in elem ) {
+			return elem.disabled === disabled;
+		}
+
+		// Remaining elements are neither :enabled nor :disabled
+		return false;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+	return markFunction( function( argument ) {
+		argument = +argument;
+		return markFunction( function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
+					seed[ j ] = !( matches[ j ] = seed[ j ] );
+				}
+			}
+		} );
+	} );
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+	return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	var namespace = elem && elem.namespaceURI,
+		docElem = elem && ( elem.ownerDocument || elem ).documentElement;
+
+	// Support: IE <=8
+	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
+	// https://bugs.jquery.com/ticket/4833
+	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var hasCompare, subWindow,
+		doc = node ? node.ownerDocument || node : preferredDoc;
+
+	// Return early if doc is invalid or already selected
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Update global variables
+	document = doc;
+	docElem = document.documentElement;
+	documentIsHTML = !isXML( document );
+
+	// Support: IE 9 - 11+, Edge 12 - 18+
+	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( preferredDoc != document &&
+		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
+
+		// Support: IE 11, Edge
+		if ( subWindow.addEventListener ) {
+			subWindow.addEventListener( "unload", unloadHandler, false );
+
+		// Support: IE 9 - 10 only
+		} else if ( subWindow.attachEvent ) {
+			subWindow.attachEvent( "onunload", unloadHandler );
+		}
+	}
+
+	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
+	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
+	// IE/Edge & older browsers don't support the :scope pseudo-class.
+	// Support: Safari 6.0 only
+	// Safari 6.0 supports :scope but it's an alias of :root there.
+	support.scope = assert( function( el ) {
+		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
+		return typeof el.querySelectorAll !== "undefined" &&
+			!el.querySelectorAll( ":scope fieldset div" ).length;
+	} );
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties
+	// (excepting IE8 booleans)
+	support.attributes = assert( function( el ) {
+		el.className = "i";
+		return !el.getAttribute( "className" );
+	} );
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert( function( el ) {
+		el.appendChild( document.createComment( "" ) );
+		return !el.getElementsByTagName( "*" ).length;
+	} );
+
+	// Support: IE<9
+	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programmatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert( function( el ) {
+		docElem.appendChild( el ).id = expando;
+		return !document.getElementsByName || !document.getElementsByName( expando ).length;
+	} );
+
+	// ID filter and find
+	if ( support.getById ) {
+		Expr.filter[ "ID" ] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute( "id" ) === attrId;
+			};
+		};
+		Expr.find[ "ID" ] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var elem = context.getElementById( id );
+				return elem ? [ elem ] : [];
+			}
+		};
+	} else {
+		Expr.filter[ "ID" ] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== "undefined" &&
+					elem.getAttributeNode( "id" );
+				return node && node.value === attrId;
+			};
+		};
+
+		// Support: IE 6 - 7 only
+		// getElementById is not reliable as a find shortcut
+		Expr.find[ "ID" ] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var node, i, elems,
+					elem = context.getElementById( id );
+
+				if ( elem ) {
+
+					// Verify the id attribute
+					node = elem.getAttributeNode( "id" );
+					if ( node && node.value === id ) {
+						return [ elem ];
+					}
+
+					// Fall back on getElementsByName
+					elems = context.getElementsByName( id );
+					i = 0;
+					while ( ( elem = elems[ i++ ] ) ) {
+						node = elem.getAttributeNode( "id" );
+						if ( node && node.value === id ) {
+							return [ elem ];
+						}
+					}
+				}
+
+				return [];
+			}
+		};
+	}
+
+	// Tag
+	Expr.find[ "TAG" ] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( tag );
+
+			// DocumentFragment nodes don't have gEBTN
+			} else if ( support.qsa ) {
+				return context.querySelectorAll( tag );
+			}
+		} :
+
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+
+				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( ( elem = results[ i++ ] ) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Class
+	Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	/* QSA/matchesSelector
+	---------------------------------------------------------------------- */
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21)
+	// We allow this because of a bug in IE8/9 that throws an error
+	// whenever `document.activeElement` is accessed on an iframe
+	// So, we allow :focus to pass through QSA all the time to avoid the IE error
+	// See https://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
+
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert( function( el ) {
+
+			var input;
+
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explicitly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// https://bugs.jquery.com/ticket/12359
+			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
+				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
+				"<option selected=''></option></select>";
+
+			// Support: IE8, Opera 11-12.16
+			// Nothing should be selected when empty strings follow ^= or $= or *=
+			// The test attribute must be unknown in Opera but "safe" for WinRT
+			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+			if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+			}
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !el.querySelectorAll( "[selected]" ).length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+				rbuggyQSA.push( "~=" );
+			}
+
+			// Support: IE 11+, Edge 15 - 18+
+			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
+			// Adding a temporary attribute to the document before the selection works
+			// around the issue.
+			// Interestingly, IE 10 & older don't seem to have the issue.
+			input = document.createElement( "input" );
+			input.setAttribute( "name", "" );
+			el.appendChild( input );
+			if ( !el.querySelectorAll( "[name='']" ).length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
+					whitespace + "*(?:''|\"\")" );
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !el.querySelectorAll( ":checked" ).length ) {
+				rbuggyQSA.push( ":checked" );
+			}
+
+			// Support: Safari 8+, iOS 8+
+			// https://bugs.webkit.org/show_bug.cgi?id=136851
+			// In-page `selector#id sibling-combinator selector` fails
+			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+				rbuggyQSA.push( ".#.+[+~]" );
+			}
+
+			// Support: Firefox <=3.6 - 5 only
+			// Old Firefox doesn't throw on a badly-escaped identifier.
+			el.querySelectorAll( "\\\f" );
+			rbuggyQSA.push( "[\\r\\n\\f]" );
+		} );
+
+		assert( function( el ) {
+			el.innerHTML = "<a href='' disabled='disabled'></a>" +
+				"<select disabled='disabled'><option/></select>";
+
+			// Support: Windows 8 Native Apps
+			// The type and name attributes are restricted during .innerHTML assignment
+			var input = document.createElement( "input" );
+			input.setAttribute( "type", "hidden" );
+			el.appendChild( input ).setAttribute( "name", "D" );
+
+			// Support: IE8
+			// Enforce case-sensitivity of name attribute
+			if ( el.querySelectorAll( "[name=d]" ).length ) {
+				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Support: IE9-11+
+			// IE's :disabled selector does not pick up the children of disabled fieldsets
+			docElem.appendChild( el ).disabled = true;
+			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Support: Opera 10 - 11 only
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			el.querySelectorAll( "*,:x" );
+			rbuggyQSA.push( ",.*:" );
+		} );
+	}
+
+	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
+		docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector ) ) ) ) {
+
+		assert( function( el ) {
+
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( el, "*" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( el, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		} );
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+	hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+	// Element contains another
+	// Purposefully self-exclusive
+	// As in, an element does not contain itself
+	contains = hasCompare || rnative.test( docElem.contains ) ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			) );
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( ( b = b.parentNode ) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	/* Sorting
+	---------------------------------------------------------------------- */
+
+	// Document order sorting
+	sortOrder = hasCompare ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		// Sort on method existence if only one input has compareDocumentPosition
+		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+		if ( compare ) {
+			return compare;
+		}
+
+		// Calculate position if both inputs belong to the same document
+		// Support: IE 11+, Edge 17 - 18+
+		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+		// two documents; shallow comparisons work.
+		// eslint-disable-next-line eqeqeq
+		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
+			a.compareDocumentPosition( b ) :
+
+			// Otherwise we know they are disconnected
+			1;
+
+		// Disconnected nodes
+		if ( compare & 1 ||
+			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
+
+			// Choose the first element that is related to our preferred document
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			// eslint-disable-next-line eqeqeq
+			if ( a == document || a.ownerDocument == preferredDoc &&
+				contains( preferredDoc, a ) ) {
+				return -1;
+			}
+
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			// eslint-disable-next-line eqeqeq
+			if ( b == document || b.ownerDocument == preferredDoc &&
+				contains( preferredDoc, b ) ) {
+				return 1;
+			}
+
+			// Maintain original order
+			return sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+		}
+
+		return compare & 4 ? -1 : 1;
+	} :
+	function( a, b ) {
+
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Parentless nodes are either documents or disconnected
+		if ( !aup || !bup ) {
+
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			/* eslint-disable eqeqeq */
+			return a == document ? -1 :
+				b == document ? 1 :
+				/* eslint-enable eqeqeq */
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( ( cur = cur.parentNode ) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( ( cur = cur.parentNode ) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[ i ] === bp[ i ] ) {
+			i++;
+		}
+
+		return i ?
+
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[ i ], bp[ i ] ) :
+
+			// Otherwise nodes in our document sort first
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			/* eslint-disable eqeqeq */
+			ap[ i ] == preferredDoc ? -1 :
+			bp[ i ] == preferredDoc ? 1 :
+			/* eslint-enable eqeqeq */
+			0;
+	};
+
+	return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	setDocument( elem );
+
+	if ( support.matchesSelector && documentIsHTML &&
+		!nonnativeSelectorCache[ expr + " " ] &&
+		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+
+				// As well, disconnected nodes are said to be in a document
+				// fragment in IE 9
+				elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch ( e ) {
+			nonnativeSelectorCache( expr, true );
+		}
+	}
+
+	return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+
+	// Set document vars if needed
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( ( context.ownerDocument || context ) != document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+
+	// Set document vars if needed
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( ( elem.ownerDocument || elem ) != document ) {
+		setDocument( elem );
+	}
+
+	var fn = Expr.attrHandle[ name.toLowerCase() ],
+
+		// Don't get fooled by Object.prototype properties (jQuery #13807)
+		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+			fn( elem, name, !documentIsHTML ) :
+			undefined;
+
+	return val !== undefined ?
+		val :
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			( val = elem.getAttributeNode( name ) ) && val.specified ?
+				val.value :
+				null;
+};
+
+Sizzle.escape = function( sel ) {
+	return ( sel + "" ).replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		j = 0,
+		i = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	sortInput = !support.sortStable && results.slice( 0 );
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		while ( ( elem = results[ i++ ] ) ) {
+			if ( elem === results[ i ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	// Clear input after sorting to release objects
+	// See https://github.com/jquery/sizzle/pull/225
+	sortInput = null;
+
+	return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+
+		// If no nodeType, this is expected to be an array
+		while ( ( node = elem[ i++ ] ) ) {
+
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (jQuery #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	attrHandle: {},
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
+				match[ 5 ] || "" ).replace( runescape, funescape );
+
+			if ( match[ 2 ] === "~=" ) {
+				match[ 3 ] = " " + match[ 3 ] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[ 1 ] = match[ 1 ].toLowerCase();
+
+			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
+
+				// nth-* requires argument
+				if ( !match[ 3 ] ) {
+					Sizzle.error( match[ 0 ] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[ 4 ] = +( match[ 4 ] ?
+					match[ 5 ] + ( match[ 6 ] || 1 ) :
+					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
+				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
+
+				// other types prohibit arguments
+			} else if ( match[ 3 ] ) {
+				Sizzle.error( match[ 0 ] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[ 6 ] && match[ 2 ];
+
+			if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[ 3 ] ) {
+				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+
+				// Get excess from tokenize (recursively)
+				( excess = tokenize( unquoted, true ) ) &&
+
+				// advance to the next closing parenthesis
+				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
+
+				// excess is a negative index
+				match[ 0 ] = match[ 0 ].slice( 0, excess );
+				match[ 2 ] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeNameSelector ) {
+			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+			return nodeNameSelector === "*" ?
+				function() {
+					return true;
+				} :
+				function( elem ) {
+					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+				};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				( pattern = new RegExp( "(^|" + whitespace +
+					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
+						className, function( elem ) {
+							return pattern.test(
+								typeof elem.className === "string" && elem.className ||
+								typeof elem.getAttribute !== "undefined" &&
+									elem.getAttribute( "class" ) ||
+								""
+							);
+				} );
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				/* eslint-disable max-len */
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+				/* eslint-enable max-len */
+
+			};
+		},
+
+		"CHILD": function( type, what, _argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, _context, xml ) {
+					var cache, uniqueCache, outerCache, node, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType,
+						diff = false;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( ( node = node[ dir ] ) ) {
+									if ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) {
+
+										return false;
+									}
+								}
+
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+
+							// Seek `elem` from a previously-cached index
+
+							// ...in a gzip-friendly way
+							node = parent;
+							outerCache = node[ expando ] || ( node[ expando ] = {} );
+
+							// Support: IE <9 only
+							// Defend against cloned attroperties (jQuery gh-1709)
+							uniqueCache = outerCache[ node.uniqueID ] ||
+								( outerCache[ node.uniqueID ] = {} );
+
+							cache = uniqueCache[ type ] || [];
+							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+							diff = nodeIndex && cache[ 2 ];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( ( node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								( diff = nodeIndex = 0 ) || start.pop() ) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						} else {
+
+							// Use previously-cached element index if available
+							if ( useCache ) {
+
+								// ...in a gzip-friendly way
+								node = elem;
+								outerCache = node[ expando ] || ( node[ expando ] = {} );
+
+								// Support: IE <9 only
+								// Defend against cloned attroperties (jQuery gh-1709)
+								uniqueCache = outerCache[ node.uniqueID ] ||
+									( outerCache[ node.uniqueID ] = {} );
+
+								cache = uniqueCache[ type ] || [];
+								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+								diff = nodeIndex;
+							}
+
+							// xml :nth-child(...)
+							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
+							if ( diff === false ) {
+
+								// Use the same loop as above to seek `elem` from the start
+								while ( ( node = ++nodeIndex && node && node[ dir ] ||
+									( diff = nodeIndex = 0 ) || start.pop() ) ) {
+
+									if ( ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) &&
+										++diff ) {
+
+										// Cache the index of each encountered element
+										if ( useCache ) {
+											outerCache = node[ expando ] ||
+												( node[ expando ] = {} );
+
+											// Support: IE <9 only
+											// Defend against cloned attroperties (jQuery gh-1709)
+											uniqueCache = outerCache[ node.uniqueID ] ||
+												( outerCache[ node.uniqueID ] = {} );
+
+											uniqueCache[ type ] = [ dirruns, diff ];
+										}
+
+										if ( node === elem ) {
+											break;
+										}
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction( function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf( seed, matched[ i ] );
+							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
+						}
+					} ) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+
+		// Potentially complex pseudos
+		"not": markFunction( function( selector ) {
+
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction( function( seed, matches, _context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( ( elem = unmatched[ i ] ) ) {
+							seed[ i ] = !( matches[ i ] = elem );
+						}
+					}
+				} ) :
+				function( elem, _context, xml ) {
+					input[ 0 ] = elem;
+					matcher( input, null, xml, results );
+
+					// Don't keep the element (issue #299)
+					input[ 0 ] = null;
+					return !results.pop();
+				};
+		} ),
+
+		"has": markFunction( function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		} ),
+
+		"contains": markFunction( function( text ) {
+			text = text.replace( runescape, funescape );
+			return function( elem ) {
+				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
+			};
+		} ),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+
+			// lang value must be a valid identifier
+			if ( !ridentifier.test( lang || "" ) ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( ( elemLang = documentIsHTML ?
+						elem.lang :
+						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
+				return false;
+			};
+		} ),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement &&
+				( !document.hasFocus || document.hasFocus() ) &&
+				!!( elem.type || elem.href || ~elem.tabIndex );
+		},
+
+		// Boolean properties
+		"enabled": createDisabledPseudo( false ),
+		"disabled": createDisabledPseudo( true ),
+
+		"checked": function( elem ) {
+
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return ( nodeName === "input" && !!elem.checked ) ||
+				( nodeName === "option" && !!elem.selected );
+		},
+
+		"selected": function( elem ) {
+
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				// eslint-disable-next-line no-unused-expressions
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+			//   but not by others (comment: 8; processing instruction: 7; etc.)
+			// nodeType < 6 works because attributes (2) do not appear as children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeType < 6 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos[ "empty" ]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+
+				// Support: IE<8
+				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+				( ( attr = elem.getAttribute( "type" ) ) == null ||
+					attr.toLowerCase() === "text" );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo( function() {
+			return [ 0 ];
+		} ),
+
+		"last": createPositionalPseudo( function( _matchIndexes, length ) {
+			return [ length - 1 ];
+		} ),
+
+		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		} ),
+
+		"even": createPositionalPseudo( function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} ),
+
+		"odd": createPositionalPseudo( function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} ),
+
+		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
+			var i = argument < 0 ?
+				argument + length :
+				argument > length ?
+					length :
+					argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} ),
+
+		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} )
+	}
+};
+
+Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
+			if ( match ) {
+
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[ 0 ].length ) || soFar;
+			}
+			groups.push( ( tokens = [] ) );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( ( match = rcombinators.exec( soFar ) ) ) {
+			matched = match.shift();
+			tokens.push( {
+				value: matched,
+
+				// Cast descendant combinators to space
+				type: match[ 0 ].replace( rtrim, " " )
+			} );
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
+				( match = preFilters[ type ]( match ) ) ) ) {
+				matched = match.shift();
+				tokens.push( {
+					value: matched,
+					type: type,
+					matches: match
+				} );
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[ i ].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		skip = combinator.next,
+		key = skip || dir,
+		checkNonElements = base && key === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( ( elem = elem[ dir ] ) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+			return false;
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var oldCache, uniqueCache, outerCache,
+				newCache = [ dirruns, doneName ];
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+			if ( xml ) {
+				while ( ( elem = elem[ dir ] ) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( ( elem = elem[ dir ] ) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
+
+						// Support: IE <9 only
+						// Defend against cloned attroperties (jQuery gh-1709)
+						uniqueCache = outerCache[ elem.uniqueID ] ||
+							( outerCache[ elem.uniqueID ] = {} );
+
+						if ( skip && skip === elem.nodeName.toLowerCase() ) {
+							elem = elem[ dir ] || elem;
+						} else if ( ( oldCache = uniqueCache[ key ] ) &&
+							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+							// Assign to newCache so results back-propagate to previous elements
+							return ( newCache[ 2 ] = oldCache[ 2 ] );
+						} else {
+
+							// Reuse newcache so results back-propagate to previous elements
+							uniqueCache[ key ] = newCache;
+
+							// A match means we're done; a fail means we have to keep checking
+							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+			return false;
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[ i ]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[ 0 ];
+}
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[ i ], results );
+	}
+	return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( ( elem = unmatched[ i ] ) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction( function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts(
+				selector || "*",
+				context.nodeType ? [ context ] : context,
+				[]
+			),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( ( elem = temp[ i ] ) ) {
+					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( ( elem = matcherOut[ i ] ) ) {
+
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( ( matcherIn[ i ] = elem ) );
+						}
+					}
+					postFinder( null, ( matcherOut = [] ), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( ( elem = matcherOut[ i ] ) &&
+						( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
+
+						seed[ temp ] = !( results[ temp ] = elem );
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	} );
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
+		implicitRelative = leadingRelative || Expr.relative[ " " ],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				( checkContext = context ).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+
+			// Avoid hanging onto element (issue #299)
+			checkContext = null;
+			return ret;
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
+			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+		} else {
+			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[ j ].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector(
+
+					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
+					tokens
+						.slice( 0, i - 1 )
+						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
+					).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, outermost ) {
+			var elem, j, matcher,
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				setMatched = [],
+				contextBackup = outermostContext,
+
+				// We must always have either seed elements or outermost context
+				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
+
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
+				len = elems.length;
+
+			if ( outermost ) {
+
+				// Support: IE 11+, Edge 17 - 18+
+				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+				// two documents; shallow comparisons work.
+				// eslint-disable-next-line eqeqeq
+				outermostContext = context == document || context || outermost;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Support: IE<9, Safari
+			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+
+					// Support: IE 11+, Edge 17 - 18+
+					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+					// two documents; shallow comparisons work.
+					// eslint-disable-next-line eqeqeq
+					if ( !context && elem.ownerDocument != document ) {
+						setDocument( elem );
+						xml = !documentIsHTML;
+					}
+					while ( ( matcher = elementMatchers[ j++ ] ) ) {
+						if ( matcher( elem, context || document, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+
+					// They will have gone through all possible matchers
+					if ( ( elem = !matcher && elem ) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// `i` is now the count of elements visited above, and adding it to `matchedCount`
+			// makes the latter nonnegative.
+			matchedCount += i;
+
+			// Apply set filters to unmatched elements
+			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+			// no element matchers and no seed.
+			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
+			// numerically zero.
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( ( matcher = setMatchers[ j++ ] ) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
+								setMatched[ i ] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !match ) {
+			match = tokenize( selector );
+		}
+		i = match.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( match[ i ] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache(
+			selector,
+			matcherFromGroupMatchers( elementMatchers, setMatchers )
+		);
+
+		// Save selector and tokenization
+		cached.selector = selector;
+	}
+	return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		compiled = typeof selector === "function" && selector,
+		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
+
+	results = results || [];
+
+	// Try to minimize operations if there is only one selector in the list and no seed
+	// (the latter of which guarantees us context)
+	if ( match.length === 1 ) {
+
+		// Reduce context if the leading compound selector is an ID
+		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
+		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
+			context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
+
+			context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
+				.replace( runescape, funescape ), context ) || [] )[ 0 ];
+			if ( !context ) {
+				return results;
+
+			// Precompiled matchers will still verify ancestry, so step up a level
+			} else if ( compiled ) {
+				context = context.parentNode;
+			}
+
+			selector = selector.slice( tokens.shift().value.length );
+		}
+
+		// Fetch a seed set for right-to-left matching
+		i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
+		while ( i-- ) {
+			token = tokens[ i ];
+
+			// Abort if we hit a combinator
+			if ( Expr.relative[ ( type = token.type ) ] ) {
+				break;
+			}
+			if ( ( find = Expr.find[ type ] ) ) {
+
+				// Search, expanding context for leading sibling combinators
+				if ( ( seed = find(
+					token.matches[ 0 ].replace( runescape, funescape ),
+					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
+						context
+				) ) ) {
+
+					// If seed is empty or no tokens remain, we can return early
+					tokens.splice( i, 1 );
+					selector = seed.length && toSelector( tokens );
+					if ( !selector ) {
+						push.apply( results, seed );
+						return results;
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function if one is not provided
+	// Provide `match` to avoid retokenization if we modified the selector above
+	( compiled || compile( selector, match ) )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+	);
+	return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert( function( el ) {
+
+	// Should return 1, but returns 4 (following)
+	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
+} );
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert( function( el ) {
+	el.innerHTML = "<a href='#'></a>";
+	return el.firstChild.getAttribute( "href" ) === "#";
+} ) ) {
+	addHandle( "type|href|height|width", function( elem, name, isXML ) {
+		if ( !isXML ) {
+			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+		}
+	} );
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert( function( el ) {
+	el.innerHTML = "<input/>";
+	el.firstChild.setAttribute( "value", "" );
+	return el.firstChild.getAttribute( "value" ) === "";
+} ) ) {
+	addHandle( "value", function( elem, _name, isXML ) {
+		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+			return elem.defaultValue;
+		}
+	} );
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert( function( el ) {
+	return el.getAttribute( "disabled" ) == null;
+} ) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return elem[ name ] === true ? name.toLowerCase() :
+				( val = elem.getAttributeNode( name ) ) && val.specified ?
+					val.value :
+					null;
+		}
+	} );
+}
+
+return Sizzle;
+
+} )( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+	var matched = [],
+		truncate = until !== undefined;
+
+	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+		if ( elem.nodeType === 1 ) {
+			if ( truncate && jQuery( elem ).is( until ) ) {
+				break;
+			}
+			matched.push( elem );
+		}
+	}
+	return matched;
+};
+
+
+var siblings = function( n, elem ) {
+	var matched = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType === 1 && n !== elem ) {
+			matched.push( n );
+		}
+	}
+
+	return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+}
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			return !!qualifier.call( elem, i, elem ) !== not;
+		} );
+	}
+
+	// Single element
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		} );
+	}
+
+	// Arraylike of elements (jQuery, arguments, Array)
+	if ( typeof qualifier !== "string" ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+		} );
+	}
+
+	// Filtered directly for both simple and complex selectors
+	return jQuery.filter( qualifier, elements, not );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+	var elem = elems[ 0 ];
+
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	if ( elems.length === 1 && elem.nodeType === 1 ) {
+		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+	}
+
+	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+		return elem.nodeType === 1;
+	} ) );
+};
+
+jQuery.fn.extend( {
+	find: function( selector ) {
+		var i, ret,
+			len = this.length,
+			self = this;
+
+		if ( typeof selector !== "string" ) {
+			return this.pushStack( jQuery( selector ).filter( function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			} ) );
+		}
+
+		ret = this.pushStack( [] );
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+	},
+	filter: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], false ) );
+	},
+	not: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], true ) );
+	},
+	is: function( selector ) {
+		return !!winnow(
+			this,
+
+			// If this is a positional/relative selector, check membership in the returned set
+			// so $("p:first").is("p:last") won't return true for a doc with two "p".
+			typeof selector === "string" && rneedsContext.test( selector ) ?
+				jQuery( selector ) :
+				selector || [],
+			false
+		).length;
+	}
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	// Shortcut simple #id case for speed
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+	init = jQuery.fn.init = function( selector, context, root ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Method init() accepts an alternate rootjQuery
+		// so migrate can support jQuery.sub (gh-2101)
+		root = root || rootjQuery;
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector[ 0 ] === "<" &&
+				selector[ selector.length - 1 ] === ">" &&
+				selector.length >= 3 ) {
+
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && ( match[ 1 ] || !context ) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[ 1 ] ) {
+					context = context instanceof jQuery ? context[ 0 ] : context;
+
+					// Option to run scripts is true for back-compat
+					// Intentionally let the error be thrown if parseHTML is not present
+					jQuery.merge( this, jQuery.parseHTML(
+						match[ 1 ],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+
+							// Properties of context are called as methods if possible
+							if ( isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[ 2 ] );
+
+					if ( elem ) {
+
+						// Inject the element directly into the jQuery object
+						this[ 0 ] = elem;
+						this.length = 1;
+					}
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || root ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this[ 0 ] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( isFunction( selector ) ) {
+			return root.ready !== undefined ?
+				root.ready( selector ) :
+
+				// Execute immediately if ready is not present
+				selector( jQuery );
+		}
+
+		return jQuery.makeArray( selector, this );
+	};
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+	// Methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend( {
+	has: function( target ) {
+		var targets = jQuery( target, this ),
+			l = targets.length;
+
+		return this.filter( function() {
+			var i = 0;
+			for ( ; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[ i ] ) ) {
+					return true;
+				}
+			}
+		} );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			matched = [],
+			targets = typeof selectors !== "string" && jQuery( selectors );
+
+		// Positional selectors never match, since there's no _selection_ context
+		if ( !rneedsContext.test( selectors ) ) {
+			for ( ; i < l; i++ ) {
+				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+					// Always skip document fragments
+					if ( cur.nodeType < 11 && ( targets ?
+						targets.index( cur ) > -1 :
+
+						// Don't pass non-elements to Sizzle
+						cur.nodeType === 1 &&
+							jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+						matched.push( cur );
+						break;
+					}
+				}
+			}
+		}
+
+		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+	},
+
+	// Determine the position of an element within the set
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// Index in selector
+		if ( typeof elem === "string" ) {
+			return indexOf.call( jQuery( elem ), this[ 0 ] );
+		}
+
+		// Locate the position of the desired element
+		return indexOf.call( this,
+
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[ 0 ] : elem
+		);
+	},
+
+	add: function( selector, context ) {
+		return this.pushStack(
+			jQuery.uniqueSort(
+				jQuery.merge( this.get(), jQuery( selector, context ) )
+			)
+		);
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	}
+} );
+
+function sibling( cur, dir ) {
+	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+	return cur;
+}
+
+jQuery.each( {
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, _i, until ) {
+		return dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, _i, until ) {
+		return dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, _i, until ) {
+		return dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return siblings( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return siblings( elem.firstChild );
+	},
+	contents: function( elem ) {
+		if ( elem.contentDocument != null &&
+
+			// Support: IE 11+
+			// <object> elements with no `data` attribute has an object
+			// `contentDocument` with a `null` prototype.
+			getProto( elem.contentDocument ) ) {
+
+			return elem.contentDocument;
+		}
+
+		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+		// Treat the template element as a regular one in browsers that
+		// don't support it.
+		if ( nodeName( elem, "template" ) ) {
+			elem = elem.content || elem;
+		}
+
+		return jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var matched = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			matched = jQuery.filter( selector, matched );
+		}
+
+		if ( this.length > 1 ) {
+
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				jQuery.uniqueSort( matched );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				matched.reverse();
+			}
+		}
+
+		return this.pushStack( matched );
+	};
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+	var object = {};
+	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	} );
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		createOptions( options ) :
+		jQuery.extend( {}, options );
+
+	var // Flag to know if list is currently firing
+		firing,
+
+		// Last fire value for non-forgettable lists
+		memory,
+
+		// Flag to know if list was already fired
+		fired,
+
+		// Flag to prevent firing
+		locked,
+
+		// Actual callback list
+		list = [],
+
+		// Queue of execution data for repeatable lists
+		queue = [],
+
+		// Index of currently firing callback (modified by add/remove as needed)
+		firingIndex = -1,
+
+		// Fire callbacks
+		fire = function() {
+
+			// Enforce single-firing
+			locked = locked || options.once;
+
+			// Execute callbacks for all pending executions,
+			// respecting firingIndex overrides and runtime changes
+			fired = firing = true;
+			for ( ; queue.length; firingIndex = -1 ) {
+				memory = queue.shift();
+				while ( ++firingIndex < list.length ) {
+
+					// Run callback and check for early termination
+					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+						options.stopOnFalse ) {
+
+						// Jump to end and forget the data so .add doesn't re-fire
+						firingIndex = list.length;
+						memory = false;
+					}
+				}
+			}
+
+			// Forget the data if we're done with it
+			if ( !options.memory ) {
+				memory = false;
+			}
+
+			firing = false;
+
+			// Clean up if we're done firing for good
+			if ( locked ) {
+
+				// Keep an empty list if we have data for future add calls
+				if ( memory ) {
+					list = [];
+
+				// Otherwise, this object is spent
+				} else {
+					list = "";
+				}
+			}
+		},
+
+		// Actual Callbacks object
+		self = {
+
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+
+					// If we have memory from a past run, we should fire after adding
+					if ( memory && !firing ) {
+						firingIndex = list.length - 1;
+						queue.push( memory );
+					}
+
+					( function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							if ( isFunction( arg ) ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
+
+								// Inspect recursively
+								add( arg );
+							}
+						} );
+					} )( arguments );
+
+					if ( memory && !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Remove a callback from the list
+			remove: function() {
+				jQuery.each( arguments, function( _, arg ) {
+					var index;
+					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+						list.splice( index, 1 );
+
+						// Handle firing indexes
+						if ( index <= firingIndex ) {
+							firingIndex--;
+						}
+					}
+				} );
+				return this;
+			},
+
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ?
+					jQuery.inArray( fn, list ) > -1 :
+					list.length > 0;
+			},
+
+			// Remove all callbacks from the list
+			empty: function() {
+				if ( list ) {
+					list = [];
+				}
+				return this;
+			},
+
+			// Disable .fire and .add
+			// Abort any current/pending executions
+			// Clear all callbacks and values
+			disable: function() {
+				locked = queue = [];
+				list = memory = "";
+				return this;
+			},
+			disabled: function() {
+				return !list;
+			},
+
+			// Disable .fire
+			// Also disable .add unless we have memory (since it would have no effect)
+			// Abort any pending executions
+			lock: function() {
+				locked = queue = [];
+				if ( !memory && !firing ) {
+					list = memory = "";
+				}
+				return this;
+			},
+			locked: function() {
+				return !!locked;
+			},
+
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( !locked ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					queue.push( args );
+					if ( !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+function Identity( v ) {
+	return v;
+}
+function Thrower( ex ) {
+	throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+	var method;
+
+	try {
+
+		// Check for promise aspect first to privilege synchronous behavior
+		if ( value && isFunction( ( method = value.promise ) ) ) {
+			method.call( value ).done( resolve ).fail( reject );
+
+		// Other thenables
+		} else if ( value && isFunction( ( method = value.then ) ) ) {
+			method.call( value, resolve, reject );
+
+		// Other non-thenables
+		} else {
+
+			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+			// * false: [ value ].slice( 0 ) => resolve( value )
+			// * true: [ value ].slice( 1 ) => resolve()
+			resolve.apply( undefined, [ value ].slice( noValue ) );
+		}
+
+	// For Promises/A+, convert exceptions into rejections
+	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+	// Deferred#then to conditionally suppress rejection.
+	} catch ( value ) {
+
+		// Support: Android 4.0 only
+		// Strict mode functions invoked without .call/.apply get global-object context
+		reject.apply( undefined, [ value ] );
+	}
+}
+
+jQuery.extend( {
+
+	Deferred: function( func ) {
+		var tuples = [
+
+				// action, add listener, callbacks,
+				// ... .then handlers, argument index, [final state]
+				[ "notify", "progress", jQuery.Callbacks( "memory" ),
+					jQuery.Callbacks( "memory" ), 2 ],
+				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				"catch": function( fn ) {
+					return promise.then( null, fn );
+				},
+
+				// Keep pipe for back-compat
+				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+
+					return jQuery.Deferred( function( newDefer ) {
+						jQuery.each( tuples, function( _i, tuple ) {
+
+							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
+							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+							// deferred.progress(function() { bind to newDefer or newDefer.notify })
+							// deferred.done(function() { bind to newDefer or newDefer.resolve })
+							// deferred.fail(function() { bind to newDefer or newDefer.reject })
+							deferred[ tuple[ 1 ] ]( function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && isFunction( returned.promise ) ) {
+									returned.promise()
+										.progress( newDefer.notify )
+										.done( newDefer.resolve )
+										.fail( newDefer.reject );
+								} else {
+									newDefer[ tuple[ 0 ] + "With" ](
+										this,
+										fn ? [ returned ] : arguments
+									);
+								}
+							} );
+						} );
+						fns = null;
+					} ).promise();
+				},
+				then: function( onFulfilled, onRejected, onProgress ) {
+					var maxDepth = 0;
+					function resolve( depth, deferred, handler, special ) {
+						return function() {
+							var that = this,
+								args = arguments,
+								mightThrow = function() {
+									var returned, then;
+
+									// Support: Promises/A+ section 2.3.3.3.3
+									// https://promisesaplus.com/#point-59
+									// Ignore double-resolution attempts
+									if ( depth < maxDepth ) {
+										return;
+									}
+
+									returned = handler.apply( that, args );
+
+									// Support: Promises/A+ section 2.3.1
+									// https://promisesaplus.com/#point-48
+									if ( returned === deferred.promise() ) {
+										throw new TypeError( "Thenable self-resolution" );
+									}
+
+									// Support: Promises/A+ sections 2.3.3.1, 3.5
+									// https://promisesaplus.com/#point-54
+									// https://promisesaplus.com/#point-75
+									// Retrieve `then` only once
+									then = returned &&
+
+										// Support: Promises/A+ section 2.3.4
+										// https://promisesaplus.com/#point-64
+										// Only check objects and functions for thenability
+										( typeof returned === "object" ||
+											typeof returned === "function" ) &&
+										returned.then;
+
+									// Handle a returned thenable
+									if ( isFunction( then ) ) {
+
+										// Special processors (notify) just wait for resolution
+										if ( special ) {
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special )
+											);
+
+										// Normal processors (resolve) also hook into progress
+										} else {
+
+											// ...and disregard older resolution values
+											maxDepth++;
+
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special ),
+												resolve( maxDepth, deferred, Identity,
+													deferred.notifyWith )
+											);
+										}
+
+									// Handle all other returned values
+									} else {
+
+										// Only substitute handlers pass on context
+										// and multiple values (non-spec behavior)
+										if ( handler !== Identity ) {
+											that = undefined;
+											args = [ returned ];
+										}
+
+										// Process the value(s)
+										// Default process is resolve
+										( special || deferred.resolveWith )( that, args );
+									}
+								},
+
+								// Only normal processors (resolve) catch and reject exceptions
+								process = special ?
+									mightThrow :
+									function() {
+										try {
+											mightThrow();
+										} catch ( e ) {
+
+											if ( jQuery.Deferred.exceptionHook ) {
+												jQuery.Deferred.exceptionHook( e,
+													process.stackTrace );
+											}
+
+											// Support: Promises/A+ section 2.3.3.3.4.1
+											// https://promisesaplus.com/#point-61
+											// Ignore post-resolution exceptions
+											if ( depth + 1 >= maxDepth ) {
+
+												// Only substitute handlers pass on context
+												// and multiple values (non-spec behavior)
+												if ( handler !== Thrower ) {
+													that = undefined;
+													args = [ e ];
+												}
+
+												deferred.rejectWith( that, args );
+											}
+										}
+									};
+
+							// Support: Promises/A+ section 2.3.3.3.1
+							// https://promisesaplus.com/#point-57
+							// Re-resolve promises immediately to dodge false rejection from
+							// subsequent errors
+							if ( depth ) {
+								process();
+							} else {
+
+								// Call an optional hook to record the stack, in case of exception
+								// since it's otherwise lost when execution goes async
+								if ( jQuery.Deferred.getStackHook ) {
+									process.stackTrace = jQuery.Deferred.getStackHook();
+								}
+								window.setTimeout( process );
+							}
+						};
+					}
+
+					return jQuery.Deferred( function( newDefer ) {
+
+						// progress_handlers.add( ... )
+						tuples[ 0 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onProgress ) ?
+									onProgress :
+									Identity,
+								newDefer.notifyWith
+							)
+						);
+
+						// fulfilled_handlers.add( ... )
+						tuples[ 1 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onFulfilled ) ?
+									onFulfilled :
+									Identity
+							)
+						);
+
+						// rejected_handlers.add( ... )
+						tuples[ 2 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onRejected ) ?
+									onRejected :
+									Thrower
+							)
+						);
+					} ).promise();
+				},
+
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 5 ];
+
+			// promise.progress = list.add
+			// promise.done = list.add
+			// promise.fail = list.add
+			promise[ tuple[ 1 ] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(
+					function() {
+
+						// state = "resolved" (i.e., fulfilled)
+						// state = "rejected"
+						state = stateString;
+					},
+
+					// rejected_callbacks.disable
+					// fulfilled_callbacks.disable
+					tuples[ 3 - i ][ 2 ].disable,
+
+					// rejected_handlers.disable
+					// fulfilled_handlers.disable
+					tuples[ 3 - i ][ 3 ].disable,
+
+					// progress_callbacks.lock
+					tuples[ 0 ][ 2 ].lock,
+
+					// progress_handlers.lock
+					tuples[ 0 ][ 3 ].lock
+				);
+			}
+
+			// progress_handlers.fire
+			// fulfilled_handlers.fire
+			// rejected_handlers.fire
+			list.add( tuple[ 3 ].fire );
+
+			// deferred.notify = function() { deferred.notifyWith(...) }
+			// deferred.resolve = function() { deferred.resolveWith(...) }
+			// deferred.reject = function() { deferred.rejectWith(...) }
+			deferred[ tuple[ 0 ] ] = function() {
+				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+				return this;
+			};
+
+			// deferred.notifyWith = list.fireWith
+			// deferred.resolveWith = list.fireWith
+			// deferred.rejectWith = list.fireWith
+			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+		} );
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( singleValue ) {
+		var
+
+			// count of uncompleted subordinates
+			remaining = arguments.length,
+
+			// count of unprocessed arguments
+			i = remaining,
+
+			// subordinate fulfillment data
+			resolveContexts = Array( i ),
+			resolveValues = slice.call( arguments ),
+
+			// the primary Deferred
+			primary = jQuery.Deferred(),
+
+			// subordinate callback factory
+			updateFunc = function( i ) {
+				return function( value ) {
+					resolveContexts[ i ] = this;
+					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+					if ( !( --remaining ) ) {
+						primary.resolveWith( resolveContexts, resolveValues );
+					}
+				};
+			};
+
+		// Single- and empty arguments are adopted like Promise.resolve
+		if ( remaining <= 1 ) {
+			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
+				!remaining );
+
+			// Use .then() to unwrap secondary thenables (cf. gh-3000)
+			if ( primary.state() === "pending" ||
+				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+				return primary.then();
+			}
+		}
+
+		// Multiple arguments are aggregated like Promise.all array elements
+		while ( i-- ) {
+			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
+		}
+
+		return primary.promise();
+	}
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+	// Support: IE 8 - 9 only
+	// Console exists when dev tools are open, which can happen at any time
+	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+	}
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+	window.setTimeout( function() {
+		throw error;
+	} );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+	readyList
+		.then( fn )
+
+		// Wrap jQuery.readyException in a function so that the lookup
+		// happens at the time of error handling instead of callback
+		// registration.
+		.catch( function( error ) {
+			jQuery.readyException( error );
+		} );
+
+	return this;
+};
+
+jQuery.extend( {
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+	}
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+	document.removeEventListener( "DOMContentLoaded", completed );
+	window.removeEventListener( "load", completed );
+	jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+	// Handle it asynchronously to allow scripts the opportunity to delay ready
+	window.setTimeout( jQuery.ready );
+
+} else {
+
+	// Use the handy event callback
+	document.addEventListener( "DOMContentLoaded", completed );
+
+	// A fallback to window.onload, that will always work
+	window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+	var i = 0,
+		len = elems.length,
+		bulk = key == null;
+
+	// Sets many values
+	if ( toType( key ) === "object" ) {
+		chainable = true;
+		for ( i in key ) {
+			access( elems, fn, i, key[ i ], true, emptyGet, raw );
+		}
+
+	// Sets one value
+	} else if ( value !== undefined ) {
+		chainable = true;
+
+		if ( !isFunction( value ) ) {
+			raw = true;
+		}
+
+		if ( bulk ) {
+
+			// Bulk operations run against the entire set
+			if ( raw ) {
+				fn.call( elems, value );
+				fn = null;
+
+			// ...except when executing function values
+			} else {
+				bulk = fn;
+				fn = function( elem, _key, value ) {
+					return bulk.call( jQuery( elem ), value );
+				};
+			}
+		}
+
+		if ( fn ) {
+			for ( ; i < len; i++ ) {
+				fn(
+					elems[ i ], key, raw ?
+						value :
+						value.call( elems[ i ], i, fn( elems[ i ], key ) )
+				);
+			}
+		}
+	}
+
+	if ( chainable ) {
+		return elems;
+	}
+
+	// Gets
+	if ( bulk ) {
+		return fn.call( elems );
+	}
+
+	return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+
+
+// Matches dashed string for camelizing
+var rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([a-z])/g;
+
+// Used by camelCase as callback to replace()
+function fcamelCase( _all, letter ) {
+	return letter.toUpperCase();
+}
+
+// Convert dashed to camelCase; used by the css and data modules
+// Support: IE <=9 - 11, Edge 12 - 15
+// Microsoft forgot to hump their vendor prefix (#9572)
+function camelCase( string ) {
+	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+}
+var acceptData = function( owner ) {
+
+	// Accepts only:
+	//  - Node
+	//    - Node.ELEMENT_NODE
+	//    - Node.DOCUMENT_NODE
+	//  - Object
+	//    - Any
+	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+	this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+	cache: function( owner ) {
+
+		// Check if the owner object already has a cache
+		var value = owner[ this.expando ];
+
+		// If not, create one
+		if ( !value ) {
+			value = {};
+
+			// We can accept data for non-element nodes in modern browsers,
+			// but we should not, see #8335.
+			// Always return an empty object.
+			if ( acceptData( owner ) ) {
+
+				// If it is a node unlikely to be stringify-ed or looped over
+				// use plain assignment
+				if ( owner.nodeType ) {
+					owner[ this.expando ] = value;
+
+				// Otherwise secure it in a non-enumerable property
+				// configurable must be true to allow the property to be
+				// deleted when data is removed
+				} else {
+					Object.defineProperty( owner, this.expando, {
+						value: value,
+						configurable: true
+					} );
+				}
+			}
+		}
+
+		return value;
+	},
+	set: function( owner, data, value ) {
+		var prop,
+			cache = this.cache( owner );
+
+		// Handle: [ owner, key, value ] args
+		// Always use camelCase key (gh-2257)
+		if ( typeof data === "string" ) {
+			cache[ camelCase( data ) ] = value;
+
+		// Handle: [ owner, { properties } ] args
+		} else {
+
+			// Copy the properties one-by-one to the cache object
+			for ( prop in data ) {
+				cache[ camelCase( prop ) ] = data[ prop ];
+			}
+		}
+		return cache;
+	},
+	get: function( owner, key ) {
+		return key === undefined ?
+			this.cache( owner ) :
+
+			// Always use camelCase key (gh-2257)
+			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
+	},
+	access: function( owner, key, value ) {
+
+		// In cases where either:
+		//
+		//   1. No key was specified
+		//   2. A string key was specified, but no value provided
+		//
+		// Take the "read" path and allow the get method to determine
+		// which value to return, respectively either:
+		//
+		//   1. The entire cache object
+		//   2. The data stored at the key
+		//
+		if ( key === undefined ||
+				( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+			return this.get( owner, key );
+		}
+
+		// When the key is not a string, or both a key and value
+		// are specified, set or extend (existing objects) with either:
+		//
+		//   1. An object of properties
+		//   2. A key and value
+		//
+		this.set( owner, key, value );
+
+		// Since the "set" path can have two possible entry points
+		// return the expected data based on which path was taken[*]
+		return value !== undefined ? value : key;
+	},
+	remove: function( owner, key ) {
+		var i,
+			cache = owner[ this.expando ];
+
+		if ( cache === undefined ) {
+			return;
+		}
+
+		if ( key !== undefined ) {
+
+			// Support array or space separated string of keys
+			if ( Array.isArray( key ) ) {
+
+				// If key is an array of keys...
+				// We always set camelCase keys, so remove that.
+				key = key.map( camelCase );
+			} else {
+				key = camelCase( key );
+
+				// If a key with the spaces exists, use it.
+				// Otherwise, create an array by matching non-whitespace
+				key = key in cache ?
+					[ key ] :
+					( key.match( rnothtmlwhite ) || [] );
+			}
+
+			i = key.length;
+
+			while ( i-- ) {
+				delete cache[ key[ i ] ];
+			}
+		}
+
+		// Remove the expando if there's no more data
+		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+			// Support: Chrome <=35 - 45
+			// Webkit & Blink performance suffers when deleting properties
+			// from DOM nodes, so set to undefined instead
+			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+			if ( owner.nodeType ) {
+				owner[ this.expando ] = undefined;
+			} else {
+				delete owner[ this.expando ];
+			}
+		}
+	},
+	hasData: function( owner ) {
+		var cache = owner[ this.expando ];
+		return cache !== undefined && !jQuery.isEmptyObject( cache );
+	}
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+//	Implementation Summary
+//
+//	1. Enforce API surface and semantic compatibility with 1.9.x branch
+//	2. Improve the module's maintainability by reducing the storage
+//		paths to a single mechanism.
+//	3. Use the same single mechanism to support "private" and "user" data.
+//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+//	5. Avoid exposing implementation details on user objects (eg. expando properties)
+//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+	rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+	if ( data === "true" ) {
+		return true;
+	}
+
+	if ( data === "false" ) {
+		return false;
+	}
+
+	if ( data === "null" ) {
+		return null;
+	}
+
+	// Only convert to a number if it doesn't change the string
+	if ( data === +data + "" ) {
+		return +data;
+	}
+
+	if ( rbrace.test( data ) ) {
+		return JSON.parse( data );
+	}
+
+	return data;
+}
+
+function dataAttr( elem, key, data ) {
+	var name;
+
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = getData( data );
+			} catch ( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			dataUser.set( elem, key, data );
+		} else {
+			data = undefined;
+		}
+	}
+	return data;
+}
+
+jQuery.extend( {
+	hasData: function( elem ) {
+		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return dataUser.access( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		dataUser.remove( elem, name );
+	},
+
+	// TODO: Now that all calls to _data and _removeData have been replaced
+	// with direct calls to dataPriv methods, these can be deprecated.
+	_data: function( elem, name, data ) {
+		return dataPriv.access( elem, name, data );
+	},
+
+	_removeData: function( elem, name ) {
+		dataPriv.remove( elem, name );
+	}
+} );
+
+jQuery.fn.extend( {
+	data: function( key, value ) {
+		var i, name, data,
+			elem = this[ 0 ],
+			attrs = elem && elem.attributes;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = dataUser.get( elem );
+
+				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+					i = attrs.length;
+					while ( i-- ) {
+
+						// Support: IE 11 only
+						// The attrs elements can be null (#14894)
+						if ( attrs[ i ] ) {
+							name = attrs[ i ].name;
+							if ( name.indexOf( "data-" ) === 0 ) {
+								name = camelCase( name.slice( 5 ) );
+								dataAttr( elem, name, data[ name ] );
+							}
+						}
+					}
+					dataPriv.set( elem, "hasDataAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each( function() {
+				dataUser.set( this, key );
+			} );
+		}
+
+		return access( this, function( value ) {
+			var data;
+
+			// The calling jQuery object (element matches) is not empty
+			// (and therefore has an element appears at this[ 0 ]) and the
+			// `value` parameter was not undefined. An empty jQuery object
+			// will result in `undefined` for elem = this[ 0 ] which will
+			// throw an exception if an attempt to read a data cache is made.
+			if ( elem && value === undefined ) {
+
+				// Attempt to get data from the cache
+				// The key will always be camelCased in Data
+				data = dataUser.get( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// Attempt to "discover" the data in
+				// HTML5 custom data-* attrs
+				data = dataAttr( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// We tried really hard, but the data doesn't exist.
+				return;
+			}
+
+			// Set the data...
+			this.each( function() {
+
+				// We always store the camelCased key
+				dataUser.set( this, key, value );
+			} );
+		}, null, value, arguments.length > 1, null, true );
+	},
+
+	removeData: function( key ) {
+		return this.each( function() {
+			dataUser.remove( this, key );
+		} );
+	}
+} );
+
+
+jQuery.extend( {
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = dataPriv.get( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || Array.isArray( data ) ) {
+					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// Clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// Not public - generate a queueHooks object, or return the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+			empty: jQuery.Callbacks( "once memory" ).add( function() {
+				dataPriv.remove( elem, [ type + "queue", key ] );
+			} )
+		} );
+	}
+} );
+
+jQuery.fn.extend( {
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[ 0 ], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each( function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// Ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			} );
+	},
+	dequeue: function( type ) {
+		return this.each( function() {
+			jQuery.dequeue( this, type );
+		} );
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while ( i-- ) {
+			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var documentElement = document.documentElement;
+
+
+
+	var isAttached = function( elem ) {
+			return jQuery.contains( elem.ownerDocument, elem );
+		},
+		composed = { composed: true };
+
+	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
+	// Check attachment across shadow DOM boundaries when possible (gh-3504)
+	// Support: iOS 10.0-10.2 only
+	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
+	// leading to errors. We need to check for `getRootNode`.
+	if ( documentElement.getRootNode ) {
+		isAttached = function( elem ) {
+			return jQuery.contains( elem.ownerDocument, elem ) ||
+				elem.getRootNode( composed ) === elem.ownerDocument;
+		};
+	}
+var isHiddenWithinTree = function( elem, el ) {
+
+		// isHiddenWithinTree might be called from jQuery#filter function;
+		// in that case, element will be second argument
+		elem = el || elem;
+
+		// Inline style trumps all
+		return elem.style.display === "none" ||
+			elem.style.display === "" &&
+
+			// Otherwise, check computed style
+			// Support: Firefox <=43 - 45
+			// Disconnected elements can have computed display: none, so first confirm that elem is
+			// in the document.
+			isAttached( elem ) &&
+
+			jQuery.css( elem, "display" ) === "none";
+	};
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+	var adjusted, scale,
+		maxIterations = 20,
+		currentValue = tween ?
+			function() {
+				return tween.cur();
+			} :
+			function() {
+				return jQuery.css( elem, prop, "" );
+			},
+		initial = currentValue(),
+		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+		// Starting value computation is required for potential unit mismatches
+		initialInUnit = elem.nodeType &&
+			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+			rcssNum.exec( jQuery.css( elem, prop ) );
+
+	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+		// Support: Firefox <=54
+		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+		initial = initial / 2;
+
+		// Trust units reported by jQuery.css
+		unit = unit || initialInUnit[ 3 ];
+
+		// Iteratively approximate from a nonzero starting point
+		initialInUnit = +initial || 1;
+
+		while ( maxIterations-- ) {
+
+			// Evaluate and update our best guess (doubling guesses that zero out).
+			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
+			jQuery.style( elem, prop, initialInUnit + unit );
+			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
+				maxIterations = 0;
+			}
+			initialInUnit = initialInUnit / scale;
+
+		}
+
+		initialInUnit = initialInUnit * 2;
+		jQuery.style( elem, prop, initialInUnit + unit );
+
+		// Make sure we update the tween properties later on
+		valueParts = valueParts || [];
+	}
+
+	if ( valueParts ) {
+		initialInUnit = +initialInUnit || +initial || 0;
+
+		// Apply relative offset (+=/-=) if specified
+		adjusted = valueParts[ 1 ] ?
+			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+			+valueParts[ 2 ];
+		if ( tween ) {
+			tween.unit = unit;
+			tween.start = initialInUnit;
+			tween.end = adjusted;
+		}
+	}
+	return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+	var temp,
+		doc = elem.ownerDocument,
+		nodeName = elem.nodeName,
+		display = defaultDisplayMap[ nodeName ];
+
+	if ( display ) {
+		return display;
+	}
+
+	temp = doc.body.appendChild( doc.createElement( nodeName ) );
+	display = jQuery.css( temp, "display" );
+
+	temp.parentNode.removeChild( temp );
+
+	if ( display === "none" ) {
+		display = "block";
+	}
+	defaultDisplayMap[ nodeName ] = display;
+
+	return display;
+}
+
+function showHide( elements, show ) {
+	var display, elem,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	// Determine new display value for elements that need to change
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		display = elem.style.display;
+		if ( show ) {
+
+			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+			// check is required in this first loop unless we have a nonempty display value (either
+			// inline or about-to-be-restored)
+			if ( display === "none" ) {
+				values[ index ] = dataPriv.get( elem, "display" ) || null;
+				if ( !values[ index ] ) {
+					elem.style.display = "";
+				}
+			}
+			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+				values[ index ] = getDefaultDisplay( elem );
+			}
+		} else {
+			if ( display !== "none" ) {
+				values[ index ] = "none";
+
+				// Remember what we're overwriting
+				dataPriv.set( elem, "display", display );
+			}
+		}
+	}
+
+	// Set the display of the elements in a second loop to avoid constant reflow
+	for ( index = 0; index < length; index++ ) {
+		if ( values[ index ] != null ) {
+			elements[ index ].style.display = values[ index ];
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend( {
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		if ( typeof state === "boolean" ) {
+			return state ? this.show() : this.hide();
+		}
+
+		return this.each( function() {
+			if ( isHiddenWithinTree( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		} );
+	}
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
+
+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
+
+
+
+( function() {
+	var fragment = document.createDocumentFragment(),
+		div = fragment.appendChild( document.createElement( "div" ) ),
+		input = document.createElement( "input" );
+
+	// Support: Android 4.0 - 4.3 only
+	// Check state lost if the name is set (#11217)
+	// Support: Windows Web Apps (WWA)
+	// `name` and `type` must use .setAttribute for WWA (#14901)
+	input.setAttribute( "type", "radio" );
+	input.setAttribute( "checked", "checked" );
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+
+	// Support: Android <=4.1 only
+	// Older WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE <=11 only
+	// Make sure textarea (and checkbox) defaultValue is properly cloned
+	div.innerHTML = "<textarea>x</textarea>";
+	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+
+	// Support: IE <=9 only
+	// IE <=9 replaces <option> tags with their contents when inserted outside of
+	// the select element.
+	div.innerHTML = "<option></option>";
+	support.option = !!div.lastChild;
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+	// XHTML parsers do not magically insert elements in the
+	// same way that tag soup parsers do. So we cannot shorten
+	// this by omitting <tbody> or other required elements.
+	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, "", "" ]
+};
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: IE <=9 only
+if ( !support.option ) {
+	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
+}
+
+
+function getAll( context, tag ) {
+
+	// Support: IE <=9 - 11 only
+	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
+	var ret;
+
+	if ( typeof context.getElementsByTagName !== "undefined" ) {
+		ret = context.getElementsByTagName( tag || "*" );
+
+	} else if ( typeof context.querySelectorAll !== "undefined" ) {
+		ret = context.querySelectorAll( tag || "*" );
+
+	} else {
+		ret = [];
+	}
+
+	if ( tag === undefined || tag && nodeName( context, tag ) ) {
+		return jQuery.merge( [ context ], ret );
+	}
+
+	return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		dataPriv.set(
+			elems[ i ],
+			"globalEval",
+			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
+		);
+	}
+}
+
+
+var rhtml = /<|&#?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+	var elem, tmp, tag, wrap, attached, j,
+		fragment = context.createDocumentFragment(),
+		nodes = [],
+		i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		elem = elems[ i ];
+
+		if ( elem || elem === 0 ) {
+
+			// Add nodes directly
+			if ( toType( elem ) === "object" ) {
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+			// Convert non-html into a text node
+			} else if ( !rhtml.test( elem ) ) {
+				nodes.push( context.createTextNode( elem ) );
+
+			// Convert html into DOM nodes
+			} else {
+				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+				// Deserialize a standard representation
+				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+				wrap = wrapMap[ tag ] || wrapMap._default;
+				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+				// Descend through wrappers to the right content
+				j = wrap[ 0 ];
+				while ( j-- ) {
+					tmp = tmp.lastChild;
+				}
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, tmp.childNodes );
+
+				// Remember the top-level container
+				tmp = fragment.firstChild;
+
+				// Ensure the created nodes are orphaned (#12392)
+				tmp.textContent = "";
+			}
+		}
+	}
+
+	// Remove wrapper from fragment
+	fragment.textContent = "";
+
+	i = 0;
+	while ( ( elem = nodes[ i++ ] ) ) {
+
+		// Skip elements already in the context collection (trac-4087)
+		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+			if ( ignored ) {
+				ignored.push( elem );
+			}
+			continue;
+		}
+
+		attached = isAttached( elem );
+
+		// Append to fragment
+		tmp = getAll( fragment.appendChild( elem ), "script" );
+
+		// Preserve script evaluation history
+		if ( attached ) {
+			setGlobalEval( tmp );
+		}
+
+		// Capture executables
+		if ( scripts ) {
+			j = 0;
+			while ( ( elem = tmp[ j++ ] ) ) {
+				if ( rscriptType.test( elem.type || "" ) ) {
+					scripts.push( elem );
+				}
+			}
+		}
+	}
+
+	return fragment;
+}
+
+
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+// Support: IE <=9 - 11+
+// focus() and blur() are asynchronous, except when they are no-op.
+// So expect focus to be synchronous when the element is already active,
+// and blur to be synchronous when the element is not already active.
+// (focus and blur are always synchronous in other supported browsers,
+// this just defines when we can count on it).
+function expectSync( elem, type ) {
+	return ( elem === safeActiveElement() ) === ( type === "focus" );
+}
+
+// Support: IE <=9 only
+// Accessing document.activeElement can throw unexpectedly
+// https://bugs.jquery.com/ticket/13393
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+	var origFn, type;
+
+	// Types can be a map of types/handlers
+	if ( typeof types === "object" ) {
+
+		// ( types-Object, selector, data )
+		if ( typeof selector !== "string" ) {
+
+			// ( types-Object, data )
+			data = data || selector;
+			selector = undefined;
+		}
+		for ( type in types ) {
+			on( elem, type, selector, data, types[ type ], one );
+		}
+		return elem;
+	}
+
+	if ( data == null && fn == null ) {
+
+		// ( types, fn )
+		fn = selector;
+		data = selector = undefined;
+	} else if ( fn == null ) {
+		if ( typeof selector === "string" ) {
+
+			// ( types, selector, fn )
+			fn = data;
+			data = undefined;
+		} else {
+
+			// ( types, data, fn )
+			fn = data;
+			data = selector;
+			selector = undefined;
+		}
+	}
+	if ( fn === false ) {
+		fn = returnFalse;
+	} else if ( !fn ) {
+		return elem;
+	}
+
+	if ( one === 1 ) {
+		origFn = fn;
+		fn = function( event ) {
+
+			// Can use an empty set, since event contains the info
+			jQuery().off( event );
+			return origFn.apply( this, arguments );
+		};
+
+		// Use same guid so caller can remove using origFn
+		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+	}
+	return elem.each( function() {
+		jQuery.event.add( this, types, fn, data, selector );
+	} );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var handleObjIn, eventHandle, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.get( elem );
+
+		// Only attach events to objects that accept data
+		if ( !acceptData( elem ) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Ensure that invalid selectors throw exceptions at attach time
+		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
+		if ( selector ) {
+			jQuery.find.matchesSelector( documentElement, selector );
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !( events = elemData.events ) ) {
+			events = elemData.events = Object.create( null );
+		}
+		if ( !( eventHandle = elemData.handle ) ) {
+			eventHandle = elemData.handle = function( e ) {
+
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+			};
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// There *must* be a type, no attaching namespace-only handlers
+			if ( !type ) {
+				continue;
+			}
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend( {
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join( "." )
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !( handlers = events[ type ] ) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener if the special events handler returns false
+				if ( !special.setup ||
+					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var j, origCount, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+		if ( !elemData || !( events = elemData.events ) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[ 2 ] &&
+				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector ||
+						selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown ||
+					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove data and the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			dataPriv.remove( elem, "handle events" );
+		}
+	},
+
+	dispatch: function( nativeEvent ) {
+
+		var i, j, ret, matched, handleObj, handlerQueue,
+			args = new Array( arguments.length ),
+
+			// Make a writable jQuery.Event from the native event object
+			event = jQuery.event.fix( nativeEvent ),
+
+			handlers = (
+				dataPriv.get( this, "events" ) || Object.create( null )
+			)[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[ 0 ] = event;
+
+		for ( i = 1; i < arguments.length; i++ ) {
+			args[ i ] = arguments[ i ];
+		}
+
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( ( handleObj = matched.handlers[ j++ ] ) &&
+				!event.isImmediatePropagationStopped() ) {
+
+				// If the event is namespaced, then each handler is only invoked if it is
+				// specially universal or its namespaces are a superset of the event's.
+				if ( !event.rnamespace || handleObj.namespace === false ||
+					event.rnamespace.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+						handleObj.handler ).apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( ( event.result = ret ) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var i, handleObj, sel, matchedHandlers, matchedSelectors,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		if ( delegateCount &&
+
+			// Support: IE <=9
+			// Black-hole SVG <use> instance trees (trac-13180)
+			cur.nodeType &&
+
+			// Support: Firefox <=42
+			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+			// Support: IE 11 only
+			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+			!( event.type === "click" && event.button >= 1 ) ) {
+
+			for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+					matchedHandlers = [];
+					matchedSelectors = {};
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matchedSelectors[ sel ] === undefined ) {
+							matchedSelectors[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) > -1 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matchedSelectors[ sel ] ) {
+							matchedHandlers.push( handleObj );
+						}
+					}
+					if ( matchedHandlers.length ) {
+						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		cur = this;
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+		}
+
+		return handlerQueue;
+	},
+
+	addProp: function( name, hook ) {
+		Object.defineProperty( jQuery.Event.prototype, name, {
+			enumerable: true,
+			configurable: true,
+
+			get: isFunction( hook ) ?
+				function() {
+					if ( this.originalEvent ) {
+						return hook( this.originalEvent );
+					}
+				} :
+				function() {
+					if ( this.originalEvent ) {
+						return this.originalEvent[ name ];
+					}
+				},
+
+			set: function( value ) {
+				Object.defineProperty( this, name, {
+					enumerable: true,
+					configurable: true,
+					writable: true,
+					value: value
+				} );
+			}
+		} );
+	},
+
+	fix: function( originalEvent ) {
+		return originalEvent[ jQuery.expando ] ?
+			originalEvent :
+			new jQuery.Event( originalEvent );
+	},
+
+	special: {
+		load: {
+
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		click: {
+
+			// Utilize native event to ensure correct state for checkable inputs
+			setup: function( data ) {
+
+				// For mutual compressibility with _default, replace `this` access with a local var.
+				// `|| data` is dead code meant only to preserve the variable through minification.
+				var el = this || data;
+
+				// Claim the first handler
+				if ( rcheckableType.test( el.type ) &&
+					el.click && nodeName( el, "input" ) ) {
+
+					// dataPriv.set( el, "click", ... )
+					leverageNative( el, "click", returnTrue );
+				}
+
+				// Return false to allow normal processing in the caller
+				return false;
+			},
+			trigger: function( data ) {
+
+				// For mutual compressibility with _default, replace `this` access with a local var.
+				// `|| data` is dead code meant only to preserve the variable through minification.
+				var el = this || data;
+
+				// Force setup before triggering a click
+				if ( rcheckableType.test( el.type ) &&
+					el.click && nodeName( el, "input" ) ) {
+
+					leverageNative( el, "click" );
+				}
+
+				// Return non-false to allow normal event-path propagation
+				return true;
+			},
+
+			// For cross-browser consistency, suppress native .click() on links
+			// Also prevent it if we're currently inside a leveraged native-event stack
+			_default: function( event ) {
+				var target = event.target;
+				return rcheckableType.test( target.type ) &&
+					target.click && nodeName( target, "input" ) &&
+					dataPriv.get( target, "click" ) ||
+					nodeName( target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Support: Firefox 20+
+				// Firefox doesn't alert if the returnValue field is not set.
+				if ( event.result !== undefined && event.originalEvent ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	}
+};
+
+// Ensure the presence of an event listener that handles manually-triggered
+// synthetic events by interrupting progress until reinvoked in response to
+// *native* events that it fires directly, ensuring that state changes have
+// already occurred before other listeners are invoked.
+function leverageNative( el, type, expectSync ) {
+
+	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
+	if ( !expectSync ) {
+		if ( dataPriv.get( el, type ) === undefined ) {
+			jQuery.event.add( el, type, returnTrue );
+		}
+		return;
+	}
+
+	// Register the controller as a special universal handler for all event namespaces
+	dataPriv.set( el, type, false );
+	jQuery.event.add( el, type, {
+		namespace: false,
+		handler: function( event ) {
+			var notAsync, result,
+				saved = dataPriv.get( this, type );
+
+			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
+
+				// Interrupt processing of the outer synthetic .trigger()ed event
+				// Saved data should be false in such cases, but might be a leftover capture object
+				// from an async native handler (gh-4350)
+				if ( !saved.length ) {
+
+					// Store arguments for use when handling the inner native event
+					// There will always be at least one argument (an event object), so this array
+					// will not be confused with a leftover capture object.
+					saved = slice.call( arguments );
+					dataPriv.set( this, type, saved );
+
+					// Trigger the native event and capture its result
+					// Support: IE <=9 - 11+
+					// focus() and blur() are asynchronous
+					notAsync = expectSync( this, type );
+					this[ type ]();
+					result = dataPriv.get( this, type );
+					if ( saved !== result || notAsync ) {
+						dataPriv.set( this, type, false );
+					} else {
+						result = {};
+					}
+					if ( saved !== result ) {
+
+						// Cancel the outer synthetic event
+						event.stopImmediatePropagation();
+						event.preventDefault();
+
+						// Support: Chrome 86+
+						// In Chrome, if an element having a focusout handler is blurred by
+						// clicking outside of it, it invokes the handler synchronously. If
+						// that handler calls `.remove()` on the element, the data is cleared,
+						// leaving `result` undefined. We need to guard against this.
+						return result && result.value;
+					}
+
+				// If this is an inner synthetic event for an event with a bubbling surrogate
+				// (focus or blur), assume that the surrogate already propagated from triggering the
+				// native event and prevent that from happening again here.
+				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
+				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
+				// less bad than duplication.
+				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
+					event.stopPropagation();
+				}
+
+			// If this is a native event triggered above, everything is now in order
+			// Fire an inner synthetic event with the original arguments
+			} else if ( saved.length ) {
+
+				// ...and capture the result
+				dataPriv.set( this, type, {
+					value: jQuery.event.trigger(
+
+						// Support: IE <=9 - 11+
+						// Extend with the prototype to reset the above stopImmediatePropagation()
+						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
+						saved.slice( 1 ),
+						this
+					)
+				} );
+
+				// Abort handling of the native event
+				event.stopImmediatePropagation();
+			}
+		}
+	} );
+}
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+	// This "if" is needed for plain objects
+	if ( elem.removeEventListener ) {
+		elem.removeEventListener( type, handle );
+	}
+};
+
+jQuery.Event = function( src, props ) {
+
+	// Allow instantiation without the 'new' keyword
+	if ( !( this instanceof jQuery.Event ) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = src.defaultPrevented ||
+				src.defaultPrevented === undefined &&
+
+				// Support: Android <=2.3 only
+				src.returnValue === false ?
+			returnTrue :
+			returnFalse;
+
+		// Create target properties
+		// Support: Safari <=6 - 7 only
+		// Target should not be a text node (#504, #13143)
+		this.target = ( src.target && src.target.nodeType === 3 ) ?
+			src.target.parentNode :
+			src.target;
+
+		this.currentTarget = src.currentTarget;
+		this.relatedTarget = src.relatedTarget;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || Date.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	constructor: jQuery.Event,
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+	isSimulated: false,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.preventDefault();
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopPropagation();
+		}
+	},
+	stopImmediatePropagation: function() {
+		var e = this.originalEvent;
+
+		this.isImmediatePropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopImmediatePropagation();
+		}
+
+		this.stopPropagation();
+	}
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+	altKey: true,
+	bubbles: true,
+	cancelable: true,
+	changedTouches: true,
+	ctrlKey: true,
+	detail: true,
+	eventPhase: true,
+	metaKey: true,
+	pageX: true,
+	pageY: true,
+	shiftKey: true,
+	view: true,
+	"char": true,
+	code: true,
+	charCode: true,
+	key: true,
+	keyCode: true,
+	button: true,
+	buttons: true,
+	clientX: true,
+	clientY: true,
+	offsetX: true,
+	offsetY: true,
+	pointerId: true,
+	pointerType: true,
+	screenX: true,
+	screenY: true,
+	targetTouches: true,
+	toElement: true,
+	touches: true,
+	which: true
+}, jQuery.event.addProp );
+
+jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
+	jQuery.event.special[ type ] = {
+
+		// Utilize native event if possible so blur/focus sequence is correct
+		setup: function() {
+
+			// Claim the first handler
+			// dataPriv.set( this, "focus", ... )
+			// dataPriv.set( this, "blur", ... )
+			leverageNative( this, type, expectSync );
+
+			// Return false to allow normal processing in the caller
+			return false;
+		},
+		trigger: function() {
+
+			// Force setup before trigger
+			leverageNative( this, type );
+
+			// Return non-false to allow normal event-path propagation
+			return true;
+		},
+
+		// Suppress native focus or blur as it's already being fired
+		// in leverageNative.
+		_default: function() {
+			return true;
+		},
+
+		delegateType: delegateType
+	};
+} );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+	mouseenter: "mouseover",
+	mouseleave: "mouseout",
+	pointerenter: "pointerover",
+	pointerleave: "pointerout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mouseenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+} );
+
+jQuery.fn.extend( {
+
+	on: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn );
+	},
+	one: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ?
+					handleObj.origType + "." + handleObj.namespace :
+					handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each( function() {
+			jQuery.event.remove( this, types, fn, selector );
+		} );
+	}
+} );
+
+
+var
+
+	// Support: IE <=10 - 11, Edge 12 - 13 only
+	// In IE/Edge using regex groups here causes severe slowdowns.
+	// See https://connect.microsoft.com/IE/feedback/details/1736512/
+	rnoInnerhtml = /<script|<style|<link/i,
+
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+// Prefer a tbody over its parent table for containing new rows
+function manipulationTarget( elem, content ) {
+	if ( nodeName( elem, "table" ) &&
+		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+
+		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
+	}
+
+	return elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
+		elem.type = elem.type.slice( 5 );
+	} else {
+		elem.removeAttribute( "type" );
+	}
+
+	return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+	var i, l, type, pdataOld, udataOld, udataCur, events;
+
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// 1. Copy private data: events, handlers, etc.
+	if ( dataPriv.hasData( src ) ) {
+		pdataOld = dataPriv.get( src );
+		events = pdataOld.events;
+
+		if ( events ) {
+			dataPriv.remove( dest, "handle events" );
+
+			for ( type in events ) {
+				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type, events[ type ][ i ] );
+				}
+			}
+		}
+	}
+
+	// 2. Copy user data
+	if ( dataUser.hasData( src ) ) {
+		udataOld = dataUser.access( src );
+		udataCur = jQuery.extend( {}, udataOld );
+
+		dataUser.set( dest, udataCur );
+	}
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+	var nodeName = dest.nodeName.toLowerCase();
+
+	// Fails to persist the checked state of a cloned checkbox or radio button.
+	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		dest.checked = src.checked;
+
+	// Fails to return the selected option to the default selected state when cloning options
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+	// Flatten any nested arrays
+	args = flat( args );
+
+	var fragment, first, scripts, hasScripts, node, doc,
+		i = 0,
+		l = collection.length,
+		iNoClone = l - 1,
+		value = args[ 0 ],
+		valueIsFunction = isFunction( value );
+
+	// We can't cloneNode fragments that contain checked, in WebKit
+	if ( valueIsFunction ||
+			( l > 1 && typeof value === "string" &&
+				!support.checkClone && rchecked.test( value ) ) ) {
+		return collection.each( function( index ) {
+			var self = collection.eq( index );
+			if ( valueIsFunction ) {
+				args[ 0 ] = value.call( this, index, self.html() );
+			}
+			domManip( self, args, callback, ignored );
+		} );
+	}
+
+	if ( l ) {
+		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+		first = fragment.firstChild;
+
+		if ( fragment.childNodes.length === 1 ) {
+			fragment = first;
+		}
+
+		// Require either new content or an interest in ignored elements to invoke the callback
+		if ( first || ignored ) {
+			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+			hasScripts = scripts.length;
+
+			// Use the original fragment for the last item
+			// instead of the first because it can end up
+			// being emptied incorrectly in certain situations (#8070).
+			for ( ; i < l; i++ ) {
+				node = fragment;
+
+				if ( i !== iNoClone ) {
+					node = jQuery.clone( node, true, true );
+
+					// Keep references to cloned scripts for later restoration
+					if ( hasScripts ) {
+
+						// Support: Android <=4.0 only, PhantomJS 1 only
+						// push.apply(_, arraylike) throws on ancient WebKit
+						jQuery.merge( scripts, getAll( node, "script" ) );
+					}
+				}
+
+				callback.call( collection[ i ], node, i );
+			}
+
+			if ( hasScripts ) {
+				doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+				// Reenable scripts
+				jQuery.map( scripts, restoreScript );
+
+				// Evaluate executable scripts on first document insertion
+				for ( i = 0; i < hasScripts; i++ ) {
+					node = scripts[ i ];
+					if ( rscriptType.test( node.type || "" ) &&
+						!dataPriv.access( node, "globalEval" ) &&
+						jQuery.contains( doc, node ) ) {
+
+						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
+
+							// Optional AJAX dependency, but won't run scripts if not present
+							if ( jQuery._evalUrl && !node.noModule ) {
+								jQuery._evalUrl( node.src, {
+									nonce: node.nonce || node.getAttribute( "nonce" )
+								}, doc );
+							}
+						} else {
+							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return collection;
+}
+
+function remove( elem, selector, keepData ) {
+	var node,
+		nodes = selector ? jQuery.filter( selector, elem ) : elem,
+		i = 0;
+
+	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
+		if ( !keepData && node.nodeType === 1 ) {
+			jQuery.cleanData( getAll( node ) );
+		}
+
+		if ( node.parentNode ) {
+			if ( keepData && isAttached( node ) ) {
+				setGlobalEval( getAll( node, "script" ) );
+			}
+			node.parentNode.removeChild( node );
+		}
+	}
+
+	return elem;
+}
+
+jQuery.extend( {
+	htmlPrefilter: function( html ) {
+		return html;
+	},
+
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var i, l, srcElements, destElements,
+			clone = elem.cloneNode( true ),
+			inPage = isAttached( elem );
+
+		// Fix IE cloning issues
+		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+				!jQuery.isXMLDoc( elem ) ) {
+
+			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			for ( i = 0, l = srcElements.length; i < l; i++ ) {
+				fixInput( srcElements[ i ], destElements[ i ] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0, l = srcElements.length; i < l; i++ ) {
+					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		// Return the cloned set
+		return clone;
+	},
+
+	cleanData: function( elems ) {
+		var data, elem, type,
+			special = jQuery.event.special,
+			i = 0;
+
+		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
+			if ( acceptData( elem ) ) {
+				if ( ( data = elem[ dataPriv.expando ] ) ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataPriv.expando ] = undefined;
+				}
+				if ( elem[ dataUser.expando ] ) {
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataUser.expando ] = undefined;
+				}
+			}
+		}
+	}
+} );
+
+jQuery.fn.extend( {
+	detach: function( selector ) {
+		return remove( this, selector, true );
+	},
+
+	remove: function( selector ) {
+		return remove( this, selector );
+	},
+
+	text: function( value ) {
+		return access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().each( function() {
+					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+						this.textContent = value;
+					}
+				} );
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		} );
+	},
+
+	prepend: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.insertBefore( elem, target.firstChild );
+			}
+		} );
+	},
+
+	before: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		} );
+	},
+
+	after: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		} );
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; ( elem = this[ i ] ) != null; i++ ) {
+			if ( elem.nodeType === 1 ) {
+
+				// Prevent memory leaks
+				jQuery.cleanData( getAll( elem, false ) );
+
+				// Remove any remaining nodes
+				elem.textContent = "";
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function() {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		} );
+	},
+
+	html: function( value ) {
+		return access( this, function( value ) {
+			var elem = this[ 0 ] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined && elem.nodeType === 1 ) {
+				return elem.innerHTML;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+				value = jQuery.htmlPrefilter( value );
+
+				try {
+					for ( ; i < l; i++ ) {
+						elem = this[ i ] || {};
+
+						// Remove element nodes and prevent memory leaks
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch ( e ) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function() {
+		var ignored = [];
+
+		// Make the changes, replacing each non-ignored context element with the new content
+		return domManip( this, arguments, function( elem ) {
+			var parent = this.parentNode;
+
+			if ( jQuery.inArray( this, ignored ) < 0 ) {
+				jQuery.cleanData( getAll( this ) );
+				if ( parent ) {
+					parent.replaceChild( elem, this );
+				}
+			}
+
+		// Force callback invocation
+		}, ignored );
+	}
+} );
+
+jQuery.each( {
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1,
+			i = 0;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone( true );
+			jQuery( insert[ i ] )[ original ]( elems );
+
+			// Support: Android <=4.0 only, PhantomJS 1 only
+			// .get() because push.apply(_, arraylike) throws on ancient WebKit
+			push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+} );
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+
+		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+		// IE throws on elements created in popups
+		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+		var view = elem.ownerDocument.defaultView;
+
+		if ( !view || !view.opener ) {
+			view = window;
+		}
+
+		return view.getComputedStyle( elem );
+	};
+
+var swap = function( elem, options, callback ) {
+	var ret, name,
+		old = {};
+
+	// Remember the old values, and insert the new ones
+	for ( name in options ) {
+		old[ name ] = elem.style[ name ];
+		elem.style[ name ] = options[ name ];
+	}
+
+	ret = callback.call( elem );
+
+	// Revert the old values
+	for ( name in options ) {
+		elem.style[ name ] = old[ name ];
+	}
+
+	return ret;
+};
+
+
+var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
+
+
+
+( function() {
+
+	// Executing both pixelPosition & boxSizingReliable tests require only one layout
+	// so they're executed at the same time to save the second computation.
+	function computeStyleTests() {
+
+		// This is a singleton, we need to execute it only once
+		if ( !div ) {
+			return;
+		}
+
+		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
+			"margin-top:1px;padding:0;border:0";
+		div.style.cssText =
+			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
+			"margin:auto;border:1px;padding:1px;" +
+			"width:60%;top:1%";
+		documentElement.appendChild( container ).appendChild( div );
+
+		var divStyle = window.getComputedStyle( div );
+		pixelPositionVal = divStyle.top !== "1%";
+
+		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
+
+		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
+		// Some styles come back with percentage values, even though they shouldn't
+		div.style.right = "60%";
+		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
+
+		// Support: IE 9 - 11 only
+		// Detect misreporting of content dimensions for box-sizing:border-box elements
+		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
+
+		// Support: IE 9 only
+		// Detect overflow:scroll screwiness (gh-3699)
+		// Support: Chrome <=64
+		// Don't get tricked when zoom affects offsetWidth (gh-4029)
+		div.style.position = "absolute";
+		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
+
+		documentElement.removeChild( container );
+
+		// Nullify the div so it wouldn't be stored in the memory and
+		// it will also be a sign that checks already performed
+		div = null;
+	}
+
+	function roundPixelMeasures( measure ) {
+		return Math.round( parseFloat( measure ) );
+	}
+
+	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
+		reliableTrDimensionsVal, reliableMarginLeftVal,
+		container = document.createElement( "div" ),
+		div = document.createElement( "div" );
+
+	// Finish early in limited (non-browser) environments
+	if ( !div.style ) {
+		return;
+	}
+
+	// Support: IE <=9 - 11 only
+	// Style of cloned element affects source element cloned (#8908)
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	jQuery.extend( support, {
+		boxSizingReliable: function() {
+			computeStyleTests();
+			return boxSizingReliableVal;
+		},
+		pixelBoxStyles: function() {
+			computeStyleTests();
+			return pixelBoxStylesVal;
+		},
+		pixelPosition: function() {
+			computeStyleTests();
+			return pixelPositionVal;
+		},
+		reliableMarginLeft: function() {
+			computeStyleTests();
+			return reliableMarginLeftVal;
+		},
+		scrollboxSize: function() {
+			computeStyleTests();
+			return scrollboxSizeVal;
+		},
+
+		// Support: IE 9 - 11+, Edge 15 - 18+
+		// IE/Edge misreport `getComputedStyle` of table rows with width/height
+		// set in CSS while `offset*` properties report correct values.
+		// Behavior in IE 9 is more subtle than in newer versions & it passes
+		// some versions of this test; make sure not to make it pass there!
+		//
+		// Support: Firefox 70+
+		// Only Firefox includes border widths
+		// in computed dimensions. (gh-4529)
+		reliableTrDimensions: function() {
+			var table, tr, trChild, trStyle;
+			if ( reliableTrDimensionsVal == null ) {
+				table = document.createElement( "table" );
+				tr = document.createElement( "tr" );
+				trChild = document.createElement( "div" );
+
+				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+				tr.style.cssText = "border:1px solid";
+
+				// Support: Chrome 86+
+				// Height set through cssText does not get applied.
+				// Computed height then comes back as 0.
+				tr.style.height = "1px";
+				trChild.style.height = "9px";
+
+				// Support: Android 8 Chrome 86+
+				// In our bodyBackground.html iframe,
+				// display for all div elements is set to "inline",
+				// which causes a problem only in Android 8 Chrome 86.
+				// Ensuring the div is display: block
+				// gets around this issue.
+				trChild.style.display = "block";
+
+				documentElement
+					.appendChild( table )
+					.appendChild( tr )
+					.appendChild( trChild );
+
+				trStyle = window.getComputedStyle( tr );
+				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+					parseInt( trStyle.borderTopWidth, 10 ) +
+					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
+
+				documentElement.removeChild( table );
+			}
+			return reliableTrDimensionsVal;
+		}
+	} );
+} )();
+
+
+function curCSS( elem, name, computed ) {
+	var width, minWidth, maxWidth, ret,
+
+		// Support: Firefox 51+
+		// Retrieving style before computed somehow
+		// fixes an issue with getting wrong values
+		// on detached elements
+		style = elem.style;
+
+	computed = computed || getStyles( elem );
+
+	// getPropertyValue is needed for:
+	//   .css('filter') (IE 9 only, #12537)
+	//   .css('--customProperty) (#3144)
+	if ( computed ) {
+		ret = computed.getPropertyValue( name ) || computed[ name ];
+
+		if ( ret === "" && !isAttached( elem ) ) {
+			ret = jQuery.style( elem, name );
+		}
+
+		// A tribute to the "awesome hack by Dean Edwards"
+		// Android Browser returns percentage for some values,
+		// but width seems to be reliably pixels.
+		// This is against the CSSOM draft spec:
+		// https://drafts.csswg.org/cssom/#resolved-values
+		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
+
+			// Remember the original values
+			width = style.width;
+			minWidth = style.minWidth;
+			maxWidth = style.maxWidth;
+
+			// Put in the new values to get a computed value out
+			style.minWidth = style.maxWidth = style.width = ret;
+			ret = computed.width;
+
+			// Revert the changed values
+			style.width = width;
+			style.minWidth = minWidth;
+			style.maxWidth = maxWidth;
+		}
+	}
+
+	return ret !== undefined ?
+
+		// Support: IE <=9 - 11 only
+		// IE returns zIndex value as an integer.
+		ret + "" :
+		ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+	// Define the hook, we'll check on the first run if it's really needed.
+	return {
+		get: function() {
+			if ( conditionFn() ) {
+
+				// Hook not needed (or it's not possible to use it due
+				// to missing dependency), remove it.
+				delete this.get;
+				return;
+			}
+
+			// Hook needed; redefine it so that the support test is not executed again.
+			return ( this.get = hookFn ).apply( this, arguments );
+		}
+	};
+}
+
+
+var cssPrefixes = [ "Webkit", "Moz", "ms" ],
+	emptyStyle = document.createElement( "div" ).style,
+	vendorProps = {};
+
+// Return a vendor-prefixed property or undefined
+function vendorPropName( name ) {
+
+	// Check for vendor prefixed names
+	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in emptyStyle ) {
+			return name;
+		}
+	}
+}
+
+// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
+function finalPropName( name ) {
+	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
+
+	if ( final ) {
+		return final;
+	}
+	if ( name in emptyStyle ) {
+		return name;
+	}
+	return vendorProps[ name ] = vendorPropName( name ) || name;
+}
+
+
+var
+
+	// Swappable if display is none or starts with table
+	// except "table", "table-cell", or "table-caption"
+	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rcustomProp = /^--/,
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: "0",
+		fontWeight: "400"
+	};
+
+function setPositiveNumber( _elem, value, subtract ) {
+
+	// Any relative (+/-) values have already been
+	// normalized at this point
+	var matches = rcssNum.exec( value );
+	return matches ?
+
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
+		value;
+}
+
+function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
+	var i = dimension === "width" ? 1 : 0,
+		extra = 0,
+		delta = 0;
+
+	// Adjustment may not be necessary
+	if ( box === ( isBorderBox ? "border" : "content" ) ) {
+		return 0;
+	}
+
+	for ( ; i < 4; i += 2 ) {
+
+		// Both box models exclude margin
+		if ( box === "margin" ) {
+			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
+		}
+
+		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
+		if ( !isBorderBox ) {
+
+			// Add padding
+			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// For "border" or "margin", add border
+			if ( box !== "padding" ) {
+				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+
+			// But still keep track of it otherwise
+			} else {
+				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+
+		// If we get here with a border-box (content + padding + border), we're seeking "content" or
+		// "padding" or "margin"
+		} else {
+
+			// For "content", subtract padding
+			if ( box === "content" ) {
+				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// For "content" or "padding", subtract border
+			if ( box !== "margin" ) {
+				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	// Account for positive content-box scroll gutter when requested by providing computedVal
+	if ( !isBorderBox && computedVal >= 0 ) {
+
+		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
+		// Assuming integer scroll gutter, subtract the rest and round down
+		delta += Math.max( 0, Math.ceil(
+			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+			computedVal -
+			delta -
+			extra -
+			0.5
+
+		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
+		// Use an explicit zero to avoid NaN (gh-3964)
+		) ) || 0;
+	}
+
+	return delta;
+}
+
+function getWidthOrHeight( elem, dimension, extra ) {
+
+	// Start with computed style
+	var styles = getStyles( elem ),
+
+		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
+		// Fake content-box until we know it's needed to know the true value.
+		boxSizingNeeded = !support.boxSizingReliable() || extra,
+		isBorderBox = boxSizingNeeded &&
+			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+		valueIsBorderBox = isBorderBox,
+
+		val = curCSS( elem, dimension, styles ),
+		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
+
+	// Support: Firefox <=54
+	// Return a confounding non-pixel value or feign ignorance, as appropriate.
+	if ( rnumnonpx.test( val ) ) {
+		if ( !extra ) {
+			return val;
+		}
+		val = "auto";
+	}
+
+
+	// Support: IE 9 - 11 only
+	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
+	// In those cases, the computed value can be trusted to be border-box.
+	if ( ( !support.boxSizingReliable() && isBorderBox ||
+
+		// Support: IE 10 - 11+, Edge 15 - 18+
+		// IE/Edge misreport `getComputedStyle` of table rows with width/height
+		// set in CSS while `offset*` properties report correct values.
+		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
+		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
+
+		// Fall back to offsetWidth/offsetHeight when value is "auto"
+		// This happens for inline elements with no explicit setting (gh-3571)
+		val === "auto" ||
+
+		// Support: Android <=4.1 - 4.3 only
+		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
+		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
+
+		// Make sure the element is visible & connected
+		elem.getClientRects().length ) {
+
+		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
+		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
+		// retrieved value as a content box dimension.
+		valueIsBorderBox = offsetProp in elem;
+		if ( valueIsBorderBox ) {
+			val = elem[ offsetProp ];
+		}
+	}
+
+	// Normalize "" and auto
+	val = parseFloat( val ) || 0;
+
+	// Adjust for the element's box model
+	return ( val +
+		boxModelAdjustment(
+			elem,
+			dimension,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles,
+
+			// Provide the current computed size to request scroll gutter calculation (gh-3589)
+			val
+		)
+	) + "px";
+}
+
+jQuery.extend( {
+
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Don't automatically add "px" to these possibly-unitless properties
+	cssNumber: {
+		"animationIterationCount": true,
+		"columnCount": true,
+		"fillOpacity": true,
+		"flexGrow": true,
+		"flexShrink": true,
+		"fontWeight": true,
+		"gridArea": true,
+		"gridColumn": true,
+		"gridColumnEnd": true,
+		"gridColumnStart": true,
+		"gridRow": true,
+		"gridRowEnd": true,
+		"gridRowStart": true,
+		"lineHeight": true,
+		"opacity": true,
+		"order": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = camelCase( name ),
+			isCustomProp = rcustomProp.test( name ),
+			style = elem.style;
+
+		// Make sure that we're working with the right name. We don't
+		// want to query the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Gets hook for the prefixed version, then unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// Convert "+=" or "-=" to relative numbers (#7345)
+			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+				value = adjustCSS( elem, name, ret );
+
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that null and NaN values aren't set (#7116)
+			if ( value == null || value !== value ) {
+				return;
+			}
+
+			// If a number was passed in, add the unit (except for certain CSS properties)
+			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
+			// "px" to a few hardcoded values.
+			if ( type === "number" && !isCustomProp ) {
+				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+			}
+
+			// background-* props affect original clone's values
+			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !( "set" in hooks ) ||
+				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+				if ( isCustomProp ) {
+					style.setProperty( name, value );
+				} else {
+					style[ name ] = value;
+				}
+			}
+
+		} else {
+
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks &&
+				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var val, num, hooks,
+			origName = camelCase( name ),
+			isCustomProp = rcustomProp.test( name );
+
+		// Make sure that we're working with the right name. We don't
+		// want to modify the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Try prefixed name followed by the unprefixed name
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		// Convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Make numeric if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || isFinite( num ) ? num || 0 : val;
+		}
+
+		return val;
+	}
+} );
+
+jQuery.each( [ "height", "width" ], function( _i, dimension ) {
+	jQuery.cssHooks[ dimension ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+
+				// Certain elements can have dimension info if we invisibly show them
+				// but it must have a current display style that would benefit
+				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+
+					// Support: Safari 8+
+					// Table columns in Safari have non-zero offsetWidth & zero
+					// getBoundingClientRect().width unless display is changed.
+					// Support: IE <=11 only
+					// Running getBoundingClientRect on a disconnected node
+					// in IE throws an error.
+					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
+					swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, dimension, extra );
+					} ) :
+					getWidthOrHeight( elem, dimension, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var matches,
+				styles = getStyles( elem ),
+
+				// Only read styles.position if the test has a chance to fail
+				// to avoid forcing a reflow.
+				scrollboxSizeBuggy = !support.scrollboxSize() &&
+					styles.position === "absolute",
+
+				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
+				boxSizingNeeded = scrollboxSizeBuggy || extra,
+				isBorderBox = boxSizingNeeded &&
+					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+				subtract = extra ?
+					boxModelAdjustment(
+						elem,
+						dimension,
+						extra,
+						isBorderBox,
+						styles
+					) :
+					0;
+
+			// Account for unreliable border-box dimensions by comparing offset* to computed and
+			// faking a content-box to get border and padding (gh-3699)
+			if ( isBorderBox && scrollboxSizeBuggy ) {
+				subtract -= Math.ceil(
+					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+					parseFloat( styles[ dimension ] ) -
+					boxModelAdjustment( elem, dimension, "border", false, styles ) -
+					0.5
+				);
+			}
+
+			// Convert to pixels if value adjustment is needed
+			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
+				( matches[ 3 ] || "px" ) !== "px" ) {
+
+				elem.style[ dimension ] = value;
+				value = jQuery.css( elem, dimension );
+			}
+
+			return setPositiveNumber( elem, value, subtract );
+		}
+	};
+} );
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+	function( elem, computed ) {
+		if ( computed ) {
+			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
+				elem.getBoundingClientRect().left -
+					swap( elem, { marginLeft: 0 }, function() {
+						return elem.getBoundingClientRect().left;
+					} )
+			) + "px";
+		}
+	}
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// Assumes a single number if not a string
+				parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( prefix !== "margin" ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+} );
+
+jQuery.fn.extend( {
+	css: function( name, value ) {
+		return access( this, function( elem, name, value ) {
+			var styles, len,
+				map = {},
+				i = 0;
+
+			if ( Array.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	}
+} );
+
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || jQuery.easing._default;
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			// Use a property on the element directly when it is not a DOM element,
+			// or when there is no matching style property that exists.
+			if ( tween.elem.nodeType !== 1 ||
+				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// Passing an empty string as a 3rd parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails.
+			// Simple values such as "10px" are parsed to Float;
+			// complex values such as "rotate(1rad)" are returned as-is.
+			result = jQuery.css( tween.elem, tween.prop, "" );
+
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+
+			// Use step hook for back compat.
+			// Use cssHook if its there.
+			// Use .style if available and use plain properties where available.
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.nodeType === 1 && (
+				jQuery.cssHooks[ tween.prop ] ||
+					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Support: IE <=9 only
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p * Math.PI ) / 2;
+	},
+	_default: "swing"
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+	fxNow, inProgress,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rrun = /queueHooks$/;
+
+function schedule() {
+	if ( inProgress ) {
+		if ( document.hidden === false && window.requestAnimationFrame ) {
+			window.requestAnimationFrame( schedule );
+		} else {
+			window.setTimeout( schedule, jQuery.fx.interval );
+		}
+
+		jQuery.fx.tick();
+	}
+}
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	window.setTimeout( function() {
+		fxNow = undefined;
+	} );
+	return ( fxNow = Date.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		i = 0,
+		attrs = { height: type };
+
+	// If we include width, step value is 1 to do all cssExpand values,
+	// otherwise step value is 2 to skip over Left and Right
+	includeWidth = includeWidth ? 1 : 0;
+	for ( ; i < 4; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
+		index = 0,
+		length = collection.length;
+	for ( ; index < length; index++ ) {
+		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
+
+			// We're done with this property
+			return tween;
+		}
+	}
+}
+
+function defaultPrefilter( elem, props, opts ) {
+	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
+		isBox = "width" in props || "height" in props,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHiddenWithinTree( elem ),
+		dataShow = dataPriv.get( elem, "fxshow" );
+
+	// Queue-skipping animations hijack the fx hooks
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always( function() {
+
+			// Ensure the complete handler is called before this completes
+			anim.always( function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			} );
+		} );
+	}
+
+	// Detect show/hide animations
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.test( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+
+				// Pretend to be hidden if this is a "show" and
+				// there is still data from a stopped show/hide
+				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+					hidden = true;
+
+				// Ignore all other no-op show/hide data
+				} else {
+					continue;
+				}
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+		}
+	}
+
+	// Bail out if this is a no-op like .hide().hide()
+	propTween = !jQuery.isEmptyObject( props );
+	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
+		return;
+	}
+
+	// Restrict "overflow" and "display" styles during box animations
+	if ( isBox && elem.nodeType === 1 ) {
+
+		// Support: IE <=9 - 11, Edge 12 - 15
+		// Record all 3 overflow attributes because IE does not infer the shorthand
+		// from identically-valued overflowX and overflowY and Edge just mirrors
+		// the overflowX value there.
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Identify a display type, preferring old show/hide data over the CSS cascade
+		restoreDisplay = dataShow && dataShow.display;
+		if ( restoreDisplay == null ) {
+			restoreDisplay = dataPriv.get( elem, "display" );
+		}
+		display = jQuery.css( elem, "display" );
+		if ( display === "none" ) {
+			if ( restoreDisplay ) {
+				display = restoreDisplay;
+			} else {
+
+				// Get nonempty value(s) by temporarily forcing visibility
+				showHide( [ elem ], true );
+				restoreDisplay = elem.style.display || restoreDisplay;
+				display = jQuery.css( elem, "display" );
+				showHide( [ elem ] );
+			}
+		}
+
+		// Animate inline elements as inline-block
+		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
+			if ( jQuery.css( elem, "float" ) === "none" ) {
+
+				// Restore the original display value at the end of pure show/hide animations
+				if ( !propTween ) {
+					anim.done( function() {
+						style.display = restoreDisplay;
+					} );
+					if ( restoreDisplay == null ) {
+						display = style.display;
+						restoreDisplay = display === "none" ? "" : display;
+					}
+				}
+				style.display = "inline-block";
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		anim.always( function() {
+			style.overflow = opts.overflow[ 0 ];
+			style.overflowX = opts.overflow[ 1 ];
+			style.overflowY = opts.overflow[ 2 ];
+		} );
+	}
+
+	// Implement show/hide animations
+	propTween = false;
+	for ( prop in orig ) {
+
+		// General show/hide setup for this element animation
+		if ( !propTween ) {
+			if ( dataShow ) {
+				if ( "hidden" in dataShow ) {
+					hidden = dataShow.hidden;
+				}
+			} else {
+				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
+			}
+
+			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
+			if ( toggle ) {
+				dataShow.hidden = !hidden;
+			}
+
+			// Show elements before animating them
+			if ( hidden ) {
+				showHide( [ elem ], true );
+			}
+
+			/* eslint-disable no-loop-func */
+
+			anim.done( function() {
+
+				/* eslint-enable no-loop-func */
+
+				// The final step of a "hide" animation is actually hiding the element
+				if ( !hidden ) {
+					showHide( [ elem ] );
+				}
+				dataPriv.remove( elem, "fxshow" );
+				for ( prop in orig ) {
+					jQuery.style( elem, prop, orig[ prop ] );
+				}
+			} );
+		}
+
+		// Per-property setup
+		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+		if ( !( prop in dataShow ) ) {
+			dataShow[ prop ] = propTween.start;
+			if ( hidden ) {
+				propTween.end = propTween.start;
+				propTween.start = 0;
+			}
+		}
+	}
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( Array.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// Not quite $.extend, this won't overwrite existing keys.
+			// Reusing 'index' because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = Animation.prefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+
+			// Don't match elem in the :animated selector
+			delete tick.elem;
+		} ),
+		tick = function() {
+			if ( stopped ) {
+				return false;
+			}
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+
+				// Support: Android 2.3 only
+				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ] );
+
+			// If there's more to do, yield
+			if ( percent < 1 && length ) {
+				return remaining;
+			}
+
+			// If this was an empty animation, synthesize a final progress notification
+			if ( !length ) {
+				deferred.notifyWith( elem, [ animation, 1, 0 ] );
+			}
+
+			// Resolve the animation and report its conclusion
+			deferred.resolveWith( elem, [ animation ] );
+			return false;
+		},
+		animation = deferred.promise( {
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, {
+				specialEasing: {},
+				easing: jQuery.easing._default
+			}, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+					animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+
+					// If we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+				if ( stopped ) {
+					return this;
+				}
+				stopped = true;
+				for ( ; index < length; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// Resolve when we played the last frame; otherwise, reject
+				if ( gotoEnd ) {
+					deferred.notifyWith( elem, [ animation, 1, 0 ] );
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		} ),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length; index++ ) {
+		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			if ( isFunction( result.stop ) ) {
+				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
+					result.stop.bind( result );
+			}
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	// Attach callbacks from options
+	animation
+		.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		} )
+	);
+
+	return animation;
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweeners: {
+		"*": [ function( prop, value ) {
+			var tween = this.createTween( prop, value );
+			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
+			return tween;
+		} ]
+	},
+
+	tweener: function( props, callback ) {
+		if ( isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.match( rnothtmlwhite );
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length; index++ ) {
+			prop = props[ index ];
+			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
+			Animation.tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilters: [ defaultPrefilter ],
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			Animation.prefilters.unshift( callback );
+		} else {
+			Animation.prefilters.push( callback );
+		}
+	}
+} );
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !isFunction( easing ) && easing
+	};
+
+	// Go to the end state if fx are off
+	if ( jQuery.fx.off ) {
+		opt.duration = 0;
+
+	} else {
+		if ( typeof opt.duration !== "number" ) {
+			if ( opt.duration in jQuery.fx.speeds ) {
+				opt.duration = jQuery.fx.speeds[ opt.duration ];
+
+			} else {
+				opt.duration = jQuery.fx.speeds._default;
+			}
+		}
+	}
+
+	// Normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.fn.extend( {
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// Show any hidden elements after setting opacity to 0
+		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
+
+			// Animate to the value specified
+			.end().animate( { opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations, or finishing resolves immediately
+				if ( empty || dataPriv.get( this, "finish" ) ) {
+					anim.stop( true );
+				}
+			};
+
+		doAnimation.finish = doAnimation;
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each( function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = dataPriv.get( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this &&
+					( type == null || timers[ index ].queue === type ) ) {
+
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// Start the next in the queue if the last step wasn't forced.
+			// Timers currently will call their complete callbacks, which
+			// will dequeue but only if they were gotoEnd.
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		} );
+	},
+	finish: function( type ) {
+		if ( type !== false ) {
+			type = type || "fx";
+		}
+		return this.each( function() {
+			var index,
+				data = dataPriv.get( this ),
+				queue = data[ type + "queue" ],
+				hooks = data[ type + "queueHooks" ],
+				timers = jQuery.timers,
+				length = queue ? queue.length : 0;
+
+			// Enable finishing flag on private data
+			data.finish = true;
+
+			// Empty the queue first
+			jQuery.queue( this, type, [] );
+
+			if ( hooks && hooks.stop ) {
+				hooks.stop.call( this, true );
+			}
+
+			// Look for any active animations, and finish them
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+					timers[ index ].anim.stop( true );
+					timers.splice( index, 1 );
+				}
+			}
+
+			// Look for any animations in the old queue and finish them
+			for ( index = 0; index < length; index++ ) {
+				if ( queue[ index ] && queue[ index ].finish ) {
+					queue[ index ].finish.call( this );
+				}
+			}
+
+			// Turn off finishing flag
+			delete data.finish;
+		} );
+	}
+} );
+
+jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+} );
+
+// Generate shortcuts for custom animations
+jQuery.each( {
+	slideDown: genFx( "show" ),
+	slideUp: genFx( "hide" ),
+	slideToggle: genFx( "toggle" ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+} );
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+	var timer,
+		i = 0,
+		timers = jQuery.timers;
+
+	fxNow = Date.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+
+		// Run the timer and safely remove it when done (allowing for external removal)
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	jQuery.timers.push( timer );
+	jQuery.fx.start();
+};
+
+jQuery.fx.interval = 13;
+jQuery.fx.start = function() {
+	if ( inProgress ) {
+		return;
+	}
+
+	inProgress = true;
+	schedule();
+};
+
+jQuery.fx.stop = function() {
+	inProgress = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+
+	// Default speed
+	_default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+	type = type || "fx";
+
+	return this.queue( type, function( next, hooks ) {
+		var timeout = window.setTimeout( next, time );
+		hooks.stop = function() {
+			window.clearTimeout( timeout );
+		};
+	} );
+};
+
+
+( function() {
+	var input = document.createElement( "input" ),
+		select = document.createElement( "select" ),
+		opt = select.appendChild( document.createElement( "option" ) );
+
+	input.type = "checkbox";
+
+	// Support: Android <=4.3 only
+	// Default value for a checkbox should be "on"
+	support.checkOn = input.value !== "";
+
+	// Support: IE <=11 only
+	// Must access selectedIndex to make default options select
+	support.optSelected = opt.selected;
+
+	// Support: IE <=11 only
+	// An input loses its value after becoming a radio
+	input = document.createElement( "input" );
+	input.value = "t";
+	input.type = "radio";
+	support.radioValue = input.value === "t";
+} )();
+
+
+var boolHook,
+	attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend( {
+	attr: function( name, value ) {
+		return access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each( function() {
+			jQuery.removeAttr( this, name );
+		} );
+	}
+} );
+
+jQuery.extend( {
+	attr: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set attributes on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// Attribute hooks are determined by the lowercase version
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
+		}
+
+		if ( value !== undefined ) {
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+			}
+
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			elem.setAttribute( name, value + "" );
+			return value;
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		ret = jQuery.find.attr( elem, name );
+
+		// Non-existent attributes return null, we normalize to undefined
+		return ret == null ? undefined : ret;
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !support.radioValue && value === "radio" &&
+					nodeName( elem, "input" ) ) {
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name,
+			i = 0,
+
+			// Attribute names can contain non-HTML whitespace characters
+			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+			attrNames = value && value.match( rnothtmlwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( ( name = attrNames[ i++ ] ) ) {
+				elem.removeAttribute( name );
+			}
+		}
+	}
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			elem.setAttribute( name, name );
+		}
+		return name;
+	}
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
+	var getter = attrHandle[ name ] || jQuery.find.attr;
+
+	attrHandle[ name ] = function( elem, name, isXML ) {
+		var ret, handle,
+			lowercaseName = name.toLowerCase();
+
+		if ( !isXML ) {
+
+			// Avoid an infinite loop by temporarily removing this function from the getter
+			handle = attrHandle[ lowercaseName ];
+			attrHandle[ lowercaseName ] = ret;
+			ret = getter( elem, name, isXML ) != null ?
+				lowercaseName :
+				null;
+			attrHandle[ lowercaseName ] = handle;
+		}
+		return ret;
+	};
+} );
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i,
+	rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+	prop: function( name, value ) {
+		return access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		return this.each( function() {
+			delete this[ jQuery.propFix[ name ] || name ];
+		} );
+	}
+} );
+
+jQuery.extend( {
+	prop: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set properties on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			return ( elem[ name ] = value );
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		return elem[ name ];
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+
+				// Support: IE <=9 - 11 only
+				// elem.tabIndex doesn't always return the
+				// correct value when it hasn't been explicitly set
+				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				// Use proper attribute retrieval(#12072)
+				var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+				if ( tabindex ) {
+					return parseInt( tabindex, 10 );
+				}
+
+				if (
+					rfocusable.test( elem.nodeName ) ||
+					rclickable.test( elem.nodeName ) &&
+					elem.href
+				) {
+					return 0;
+				}
+
+				return -1;
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	}
+} );
+
+// Support: IE <=11 only
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
+if ( !support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent && parent.parentNode ) {
+				parent.parentNode.selectedIndex;
+			}
+			return null;
+		},
+		set: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent ) {
+				parent.selectedIndex;
+
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+		}
+	};
+}
+
+jQuery.each( [
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+
+
+
+	// Strip and collapse whitespace according to HTML spec
+	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
+	function stripAndCollapse( value ) {
+		var tokens = value.match( rnothtmlwhite ) || [];
+		return tokens.join( " " );
+	}
+
+
+function getClass( elem ) {
+	return elem.getAttribute && elem.getAttribute( "class" ) || "";
+}
+
+function classesToArray( value ) {
+	if ( Array.isArray( value ) ) {
+		return value;
+	}
+	if ( typeof value === "string" ) {
+		return value.match( rnothtmlwhite ) || [];
+	}
+	return [];
+}
+
+jQuery.fn.extend( {
+	addClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		classes = classesToArray( value );
+
+		if ( classes.length ) {
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( !arguments.length ) {
+			return this.attr( "class", "" );
+		}
+
+		classes = classesToArray( value );
+
+		if ( classes.length ) {
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isValidValue = type === "string" || Array.isArray( value );
+
+		if ( typeof stateVal === "boolean" && isValidValue ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( isFunction( value ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).toggleClass(
+					value.call( this, i, getClass( this ), stateVal ),
+					stateVal
+				);
+			} );
+		}
+
+		return this.each( function() {
+			var className, i, self, classNames;
+
+			if ( isValidValue ) {
+
+				// Toggle individual class names
+				i = 0;
+				self = jQuery( this );
+				classNames = classesToArray( value );
+
+				while ( ( className = classNames[ i++ ] ) ) {
+
+					// Check each className given, space separated list
+					if ( self.hasClass( className ) ) {
+						self.removeClass( className );
+					} else {
+						self.addClass( className );
+					}
+				}
+
+			// Toggle whole class name
+			} else if ( value === undefined || type === "boolean" ) {
+				className = getClass( this );
+				if ( className ) {
+
+					// Store className if set
+					dataPriv.set( this, "__className__", className );
+				}
+
+				// If the element has a class name or if we're passed `false`,
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				if ( this.setAttribute ) {
+					this.setAttribute( "class",
+						className || value === false ?
+							"" :
+							dataPriv.get( this, "__className__" ) || ""
+					);
+				}
+			}
+		} );
+	},
+
+	hasClass: function( selector ) {
+		var className, elem,
+			i = 0;
+
+		className = " " + selector + " ";
+		while ( ( elem = this[ i++ ] ) ) {
+			if ( elem.nodeType === 1 &&
+				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+} );
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend( {
+	val: function( value ) {
+		var hooks, ret, valueIsFunction,
+			elem = this[ 0 ];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] ||
+					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks &&
+					"get" in hooks &&
+					( ret = hooks.get( elem, "value" ) ) !== undefined
+				) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				// Handle most common string cases
+				if ( typeof ret === "string" ) {
+					return ret.replace( rreturn, "" );
+				}
+
+				// Handle cases where value is null/undef or number
+				return ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		valueIsFunction = isFunction( value );
+
+		return this.each( function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( valueIsFunction ) {
+				val = value.call( this, i, jQuery( this ).val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+
+			} else if ( typeof val === "number" ) {
+				val += "";
+
+			} else if ( Array.isArray( val ) ) {
+				val = jQuery.map( val, function( value ) {
+					return value == null ? "" : value + "";
+				} );
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		} );
+	}
+} );
+
+jQuery.extend( {
+	valHooks: {
+		option: {
+			get: function( elem ) {
+
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+
+					// Support: IE <=10 - 11 only
+					// option.text throws exceptions (#14686, #14858)
+					// Strip and collapse whitespace
+					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+					stripAndCollapse( jQuery.text( elem ) );
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option, i,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one",
+					values = one ? null : [],
+					max = one ? index + 1 : options.length;
+
+				if ( index < 0 ) {
+					i = max;
+
+				} else {
+					i = one ? index : 0;
+				}
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Support: IE <=9 only
+					// IE8-9 doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+
+							// Don't return options that are disabled or in a disabled optgroup
+							!option.disabled &&
+							( !option.parentNode.disabled ||
+								!nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var optionSet, option,
+					options = elem.options,
+					values = jQuery.makeArray( value ),
+					i = options.length;
+
+				while ( i-- ) {
+					option = options[ i ];
+
+					/* eslint-disable no-cond-assign */
+
+					if ( option.selected =
+						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+					) {
+						optionSet = true;
+					}
+
+					/* eslint-enable no-cond-assign */
+				}
+
+				// Force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	}
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( Array.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+			}
+		}
+	};
+	if ( !support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+		};
+	}
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+support.focusin = "onfocusin" in window;
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	stopPropagationCallback = function( e ) {
+		e.stopPropagation();
+	};
+
+jQuery.extend( jQuery.event, {
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+
+		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
+			eventPath = [ elem || document ],
+			type = hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+		cur = lastElement = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "." ) > -1 ) {
+
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split( "." );
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+		event.isTrigger = onlyHandlers ? 2 : 3;
+		event.namespace = namespaces.join( "." );
+		event.rnamespace = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === ( elem.ownerDocument || document ) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+			lastElement = cur;
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
+				dataPriv.get( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && handle.apply && acceptData( cur ) ) {
+				event.result = handle.apply( cur, data );
+				if ( event.result === false ) {
+					event.preventDefault();
+				}
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( ( !special._default ||
+				special._default.apply( eventPath.pop(), data ) === false ) &&
+				acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name as the event.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+
+					if ( event.isPropagationStopped() ) {
+						lastElement.addEventListener( type, stopPropagationCallback );
+					}
+
+					elem[ type ]();
+
+					if ( event.isPropagationStopped() ) {
+						lastElement.removeEventListener( type, stopPropagationCallback );
+					}
+
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Piggyback on a donor event to simulate a different one
+	// Used only for `focus(in | out)` events
+	simulate: function( type, elem, event ) {
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true
+			}
+		);
+
+		jQuery.event.trigger( e, null, elem );
+	}
+
+} );
+
+jQuery.fn.extend( {
+
+	trigger: function( type, data ) {
+		return this.each( function() {
+			jQuery.event.trigger( type, data, this );
+		} );
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[ 0 ];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+} );
+
+
+// Support: Firefox <=44
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler on the document while someone wants focusin/focusout
+		var handler = function( event ) {
+			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+		};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+
+				// Handle: regular nodes (via `this.ownerDocument`), window
+				// (via `this.document`) & document (via `this`).
+				var doc = this.ownerDocument || this.document || this,
+					attaches = dataPriv.access( doc, fix );
+
+				if ( !attaches ) {
+					doc.addEventListener( orig, handler, true );
+				}
+				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
+			},
+			teardown: function() {
+				var doc = this.ownerDocument || this.document || this,
+					attaches = dataPriv.access( doc, fix ) - 1;
+
+				if ( !attaches ) {
+					doc.removeEventListener( orig, handler, true );
+					dataPriv.remove( doc, fix );
+
+				} else {
+					dataPriv.access( doc, fix, attaches );
+				}
+			}
+		};
+	} );
+}
+var location = window.location;
+
+var nonce = { guid: Date.now() };
+
+var rquery = ( /\?/ );
+
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+	var xml, parserErrorElem;
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+
+	// Support: IE 9 - 11 only
+	// IE throws on parseFromString with invalid input.
+	try {
+		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
+	} catch ( e ) {}
+
+	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+	if ( !xml || parserErrorElem ) {
+		jQuery.error( "Invalid XML: " + (
+			parserErrorElem ?
+				jQuery.map( parserErrorElem.childNodes, function( el ) {
+					return el.textContent;
+				} ).join( "\n" ) :
+				data
+		) );
+	}
+	return xml;
+};
+
+
+var
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( Array.isArray( obj ) ) {
+
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams(
+					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+					v,
+					traditional,
+					add
+				);
+			}
+		} );
+
+	} else if ( !traditional && toType( obj ) === "object" ) {
+
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, valueOrFunction ) {
+
+			// If value is a function, invoke it and use its return value
+			var value = isFunction( valueOrFunction ) ?
+				valueOrFunction() :
+				valueOrFunction;
+
+			s[ s.length ] = encodeURIComponent( key ) + "=" +
+				encodeURIComponent( value == null ? "" : value );
+		};
+
+	if ( a == null ) {
+		return "";
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		} );
+
+	} else {
+
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" );
+};
+
+jQuery.fn.extend( {
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map( function() {
+
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		} ).filter( function() {
+			var type = this.type;
+
+			// Use .is( ":disabled" ) so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !rcheckableType.test( type ) );
+		} ).map( function( _i, elem ) {
+			var val = jQuery( this ).val();
+
+			if ( val == null ) {
+				return null;
+			}
+
+			if ( Array.isArray( val ) ) {
+				return jQuery.map( val, function( val ) {
+					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+				} );
+			}
+
+			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		} ).get();
+	}
+} );
+
+
+var
+	r20 = /%20/g,
+	rhash = /#.*$/,
+	rantiCache = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat( "*" ),
+
+	// Anchor tag for parsing the document origin
+	originAnchor = document.createElement( "a" );
+
+originAnchor.href = location.href;
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
+
+		if ( isFunction( func ) ) {
+
+			// For each dataType in the dataTypeExpression
+			while ( ( dataType = dataTypes[ i++ ] ) ) {
+
+				// Prepend if requested
+				if ( dataType[ 0 ] === "+" ) {
+					dataType = dataType.slice( 1 ) || "*";
+					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
+
+				// Otherwise append
+				} else {
+					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
+				}
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+	var inspected = {},
+		seekingTransport = ( structure === transports );
+
+	function inspect( dataType ) {
+		var selected;
+		inspected[ dataType ] = true;
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+			if ( typeof dataTypeOrTransport === "string" &&
+				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+
+				options.dataTypes.unshift( dataTypeOrTransport );
+				inspect( dataTypeOrTransport );
+				return false;
+			} else if ( seekingTransport ) {
+				return !( selected = dataTypeOrTransport );
+			}
+		} );
+		return selected;
+	}
+
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+
+	return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes;
+
+	// Remove auto dataType and get content-type in the process
+	while ( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+	var conv2, current, conv, tmp, prev,
+		converters = {},
+
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice();
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	current = dataTypes.shift();
+
+	// Convert to each sequential dataType
+	while ( current ) {
+
+		if ( s.responseFields[ current ] ) {
+			jqXHR[ s.responseFields[ current ] ] = response;
+		}
+
+		// Apply the dataFilter if provided
+		if ( !prev && isSuccess && s.dataFilter ) {
+			response = s.dataFilter( response, s.dataType );
+		}
+
+		prev = current;
+		current = dataTypes.shift();
+
+		if ( current ) {
+
+			// There's only work to do if current dataType is non-auto
+			if ( current === "*" ) {
+
+				current = prev;
+
+			// Convert response if prev dataType is non-auto and differs from current
+			} else if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split( " " );
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.unshift( tmp[ 1 ] );
+								}
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s.throws ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return {
+								state: "parsererror",
+								error: conv ? e : "No conversion from " + prev + " to " + current
+							};
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return { state: "success", data: response };
+}
+
+jQuery.extend( {
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: location.href,
+		type: "GET",
+		isLocal: rlocalProtocol.test( location.protocol ),
+		global: true,
+		processData: true,
+		async: true,
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			"*": allTypes,
+			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"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": JSON.parse,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			url: true,
+			context: true
+		}
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		return settings ?
+
+			// Building a settings object
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+			// Extending ajaxSettings
+			ajaxExtend( jQuery.ajaxSettings, target );
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var transport,
+
+			// URL without anti-cache param
+			cacheURL,
+
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+
+			// timeout handle
+			timeoutTimer,
+
+			// Url cleanup var
+			urlAnchor,
+
+			// Request state (becomes false upon send and true upon completion)
+			completed,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			// Loop variable
+			i,
+
+			// uncached part of the url
+			uncached,
+
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+
+			// Callbacks context
+			callbackContext = s.context || s,
+
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
+			globalEventContext = s.context &&
+				( callbackContext.nodeType || callbackContext.jquery ) ?
+				jQuery( callbackContext ) :
+				jQuery.event,
+
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+
+			// Default abort message
+			strAbort = "canceled",
+
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( completed ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
+									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
+										.concat( match[ 2 ] );
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() + " " ];
+					}
+					return match == null ? null : match.join( ", " );
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return completed ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( completed == null ) {
+						name = requestHeadersNames[ name.toLowerCase() ] =
+							requestHeadersNames[ name.toLowerCase() ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( completed == null ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( completed ) {
+
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						} else {
+
+							// Lazy-add the new callbacks in a way that preserves old ones
+							for ( code in map ) {
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						}
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					var finalText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( finalText );
+					}
+					done( 0, finalText );
+					return this;
+				}
+			};
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+
+		// Add protocol if not provided (prefilters might expect it)
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url || location.href ) + "" )
+			.replace( rprotocol, location.protocol + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
+
+		// A cross-domain request is in order when the origin doesn't match the current origin.
+		if ( s.crossDomain == null ) {
+			urlAnchor = document.createElement( "a" );
+
+			// Support: IE <=8 - 11, Edge 12 - 15
+			// IE throws exception on accessing the href property if url is malformed,
+			// e.g. http://example.com:80x/
+			try {
+				urlAnchor.href = s.url;
+
+				// Support: IE <=8 - 11 only
+				// Anchor's host property isn't correctly set when s.url is relative
+				urlAnchor.href = urlAnchor.href;
+				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
+					urlAnchor.protocol + "//" + urlAnchor.host;
+			} catch ( e ) {
+
+				// If there is an error parsing the URL, assume it is crossDomain,
+				// it can be rejected by the transport if it is invalid
+				s.crossDomain = true;
+			}
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( completed ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+		fireGlobals = jQuery.event && s.global;
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Save the URL in case we're toying with the If-Modified-Since
+		// and/or If-None-Match header later on
+		// Remove hash to simplify url manipulation
+		cacheURL = s.url.replace( rhash, "" );
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// Remember the hash so we can put it back
+			uncached = s.url.slice( cacheURL.length );
+
+			// If data is available and should be processed, append data to url
+			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
+				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
+
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add or update anti-cache param if needed
+			if ( s.cache === false ) {
+				cacheURL = cacheURL.replace( rantiCache, "$1" );
+				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
+					uncached;
+			}
+
+			// Put hash and anti-cache on the URL that will be requested (gh-1732)
+			s.url = cacheURL + uncached;
+
+		// Change '%20' to '+' if this is encoded form body content (gh-2658)
+		} else if ( s.data && s.processData &&
+			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
+			s.data = s.data.replace( r20, "+" );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			if ( jQuery.lastModified[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+			}
+			if ( jQuery.etag[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
+				s.accepts[ s.dataTypes[ 0 ] ] +
+					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend &&
+			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
+
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// Aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		completeDeferred.add( s.complete );
+		jqXHR.done( s.success );
+		jqXHR.fail( s.error );
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+
+			// If request was aborted inside ajaxSend, stop there
+			if ( completed ) {
+				return jqXHR;
+			}
+
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = window.setTimeout( function() {
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				completed = false;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+
+				// Rethrow post-completion exceptions
+				if ( completed ) {
+					throw e;
+				}
+
+				// Propagate others as results
+				done( -1, e );
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Ignore repeat invocations
+			if ( completed ) {
+				return;
+			}
+
+			completed = true;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				window.clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Determine if successful
+			isSuccess = status >= 200 && status < 300 || status === 304;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// Use a noop converter for missing script but not if jsonp
+			if ( !isSuccess &&
+				jQuery.inArray( "script", s.dataTypes ) > -1 &&
+				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
+				s.converters[ "text script" ] = function() {};
+			}
+
+			// Convert no matter what (that way responseXXX fields are always set)
+			response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+			// If successful, handle type chaining
+			if ( isSuccess ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+					modified = jqXHR.getResponseHeader( "Last-Modified" );
+					if ( modified ) {
+						jQuery.lastModified[ cacheURL ] = modified;
+					}
+					modified = jqXHR.getResponseHeader( "etag" );
+					if ( modified ) {
+						jQuery.etag[ cacheURL ] = modified;
+					}
+				}
+
+				// if no content
+				if ( status === 204 || s.type === "HEAD" ) {
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					statusText = response.state;
+					success = response.data;
+					error = response.error;
+					isSuccess = !error;
+				}
+			} else {
+
+				// Extract error from statusText and normalize for non-aborts
+				error = statusText;
+				if ( status || !statusText ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+					[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	}
+} );
+
+jQuery.each( [ "get", "post" ], function( _i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+
+		// Shift arguments if data argument was omitted
+		if ( isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		// The url can be an options object (which then must have .url)
+		return jQuery.ajax( jQuery.extend( {
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		}, jQuery.isPlainObject( url ) && url ) );
+	};
+} );
+
+jQuery.ajaxPrefilter( function( s ) {
+	var i;
+	for ( i in s.headers ) {
+		if ( i.toLowerCase() === "content-type" ) {
+			s.contentType = s.headers[ i ] || "";
+		}
+	}
+} );
+
+
+jQuery._evalUrl = function( url, options, doc ) {
+	return jQuery.ajax( {
+		url: url,
+
+		// Make this explicit, since user can override this through ajaxSetup (#11264)
+		type: "GET",
+		dataType: "script",
+		cache: true,
+		async: false,
+		global: false,
+
+		// Only evaluate the response if it is successful (gh-4126)
+		// dataFilter is not invoked for failure responses, so using it instead
+		// of the default converter is kludgy but it works.
+		converters: {
+			"text script": function() {}
+		},
+		dataFilter: function( response ) {
+			jQuery.globalEval( response, options, doc );
+		}
+	} );
+};
+
+
+jQuery.fn.extend( {
+	wrapAll: function( html ) {
+		var wrap;
+
+		if ( this[ 0 ] ) {
+			if ( isFunction( html ) ) {
+				html = html.call( this[ 0 ] );
+			}
+
+			// The elements to wrap the target around
+			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+			if ( this[ 0 ].parentNode ) {
+				wrap.insertBefore( this[ 0 ] );
+			}
+
+			wrap.map( function() {
+				var elem = this;
+
+				while ( elem.firstElementChild ) {
+					elem = elem.firstElementChild;
+				}
+
+				return elem;
+			} ).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( isFunction( html ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).wrapInner( html.call( this, i ) );
+			} );
+		}
+
+		return this.each( function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		} );
+	},
+
+	wrap: function( html ) {
+		var htmlIsFunction = isFunction( html );
+
+		return this.each( function( i ) {
+			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
+		} );
+	},
+
+	unwrap: function( selector ) {
+		this.parent( selector ).not( "body" ).each( function() {
+			jQuery( this ).replaceWith( this.childNodes );
+		} );
+		return this;
+	}
+} );
+
+
+jQuery.expr.pseudos.hidden = function( elem ) {
+	return !jQuery.expr.pseudos.visible( elem );
+};
+jQuery.expr.pseudos.visible = function( elem ) {
+	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
+};
+
+
+
+
+jQuery.ajaxSettings.xhr = function() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch ( e ) {}
+};
+
+var xhrSuccessStatus = {
+
+		// File protocol always yields status code 0, assume 200
+		0: 200,
+
+		// Support: IE <=9 only
+		// #1450: sometimes IE returns 1223 when it should be 204
+		1223: 204
+	},
+	xhrSupported = jQuery.ajaxSettings.xhr();
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport( function( options ) {
+	var callback, errorCallback;
+
+	// Cross domain only allowed if supported through XMLHttpRequest
+	if ( support.cors || xhrSupported && !options.crossDomain ) {
+		return {
+			send: function( headers, complete ) {
+				var i,
+					xhr = options.xhr();
+
+				xhr.open(
+					options.type,
+					options.url,
+					options.async,
+					options.username,
+					options.password
+				);
+
+				// Apply custom fields if provided
+				if ( options.xhrFields ) {
+					for ( i in options.xhrFields ) {
+						xhr[ i ] = options.xhrFields[ i ];
+					}
+				}
+
+				// Override mime type if needed
+				if ( options.mimeType && xhr.overrideMimeType ) {
+					xhr.overrideMimeType( options.mimeType );
+				}
+
+				// X-Requested-With header
+				// For cross-domain requests, seeing as conditions for a preflight are
+				// akin to a jigsaw puzzle, we simply never set it to be sure.
+				// (it can always be set on a per-request basis or even using ajaxSetup)
+				// For same-domain requests, won't change header if already provided.
+				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
+					headers[ "X-Requested-With" ] = "XMLHttpRequest";
+				}
+
+				// Set headers
+				for ( i in headers ) {
+					xhr.setRequestHeader( i, headers[ i ] );
+				}
+
+				// Callback
+				callback = function( type ) {
+					return function() {
+						if ( callback ) {
+							callback = errorCallback = xhr.onload =
+								xhr.onerror = xhr.onabort = xhr.ontimeout =
+									xhr.onreadystatechange = null;
+
+							if ( type === "abort" ) {
+								xhr.abort();
+							} else if ( type === "error" ) {
+
+								// Support: IE <=9 only
+								// On a manual native abort, IE9 throws
+								// errors on any property access that is not readyState
+								if ( typeof xhr.status !== "number" ) {
+									complete( 0, "error" );
+								} else {
+									complete(
+
+										// File: protocol always yields status 0; see #8605, #14207
+										xhr.status,
+										xhr.statusText
+									);
+								}
+							} else {
+								complete(
+									xhrSuccessStatus[ xhr.status ] || xhr.status,
+									xhr.statusText,
+
+									// Support: IE <=9 only
+									// IE9 has no XHR2 but throws on binary (trac-11426)
+									// For XHR2 non-text, let the caller handle it (gh-2498)
+									( xhr.responseType || "text" ) !== "text"  ||
+									typeof xhr.responseText !== "string" ?
+										{ binary: xhr.response } :
+										{ text: xhr.responseText },
+									xhr.getAllResponseHeaders()
+								);
+							}
+						}
+					};
+				};
+
+				// Listen to events
+				xhr.onload = callback();
+				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
+
+				// Support: IE 9 only
+				// Use onreadystatechange to replace onabort
+				// to handle uncaught aborts
+				if ( xhr.onabort !== undefined ) {
+					xhr.onabort = errorCallback;
+				} else {
+					xhr.onreadystatechange = function() {
+
+						// Check readyState before timeout as it changes
+						if ( xhr.readyState === 4 ) {
+
+							// Allow onerror to be called first,
+							// but that will not handle a native abort
+							// Also, save errorCallback to a variable
+							// as xhr.onerror cannot be accessed
+							window.setTimeout( function() {
+								if ( callback ) {
+									errorCallback();
+								}
+							} );
+						}
+					};
+				}
+
+				// Create the abort callback
+				callback = callback( "abort" );
+
+				try {
+
+					// Do send the request (this may raise an exception)
+					xhr.send( options.hasContent && options.data || null );
+				} catch ( e ) {
+
+					// #14683: Only rethrow if this hasn't been notified as an error yet
+					if ( callback ) {
+						throw e;
+					}
+				}
+			},
+
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
+jQuery.ajaxPrefilter( function( s ) {
+	if ( s.crossDomain ) {
+		s.contents.script = false;
+	}
+} );
+
+// Install script dataType
+jQuery.ajaxSetup( {
+	accepts: {
+		script: "text/javascript, application/javascript, " +
+			"application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /\b(?:java|ecma)script\b/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+} );
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+	}
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+
+	// This transport only deals with cross domain or forced-by-attrs requests
+	if ( s.crossDomain || s.scriptAttrs ) {
+		var script, callback;
+		return {
+			send: function( _, complete ) {
+				script = jQuery( "<script>" )
+					.attr( s.scriptAttrs || {} )
+					.prop( { charset: s.scriptCharset, src: s.url } )
+					.on( "load error", callback = function( evt ) {
+						script.remove();
+						callback = null;
+						if ( evt ) {
+							complete( evt.type === "error" ? 404 : 200, evt.type );
+						}
+					} );
+
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				document.head.appendChild( script[ 0 ] );
+			},
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup( {
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+} );
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" &&
+				( s.contentType || "" )
+					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+				rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters[ "script json" ] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// Force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always( function() {
+
+			// If previous value didn't exist - remove it
+			if ( overwritten === undefined ) {
+				jQuery( window ).removeProp( callbackName );
+
+			// Otherwise restore preexisting value
+			} else {
+				window[ callbackName ] = overwritten;
+			}
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+
+				// Make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// Save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		} );
+
+		// Delegate to script
+		return "script";
+	}
+} );
+
+
+
+
+// Support: Safari 8 only
+// In Safari 8 documents created via document.implementation.createHTMLDocument
+// collapse sibling forms: the second one becomes a child of the first one.
+// Because of that, this security measure has to be disabled in Safari 8.
+// https://bugs.webkit.org/show_bug.cgi?id=137337
+support.createHTMLDocument = ( function() {
+	var body = document.implementation.createHTMLDocument( "" ).body;
+	body.innerHTML = "<form></form><form></form>";
+	return body.childNodes.length === 2;
+} )();
+
+
+// Argument "data" should be string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+	if ( typeof data !== "string" ) {
+		return [];
+	}
+	if ( typeof context === "boolean" ) {
+		keepScripts = context;
+		context = false;
+	}
+
+	var base, parsed, scripts;
+
+	if ( !context ) {
+
+		// Stop scripts or inline event handlers from being executed immediately
+		// by using document.implementation
+		if ( support.createHTMLDocument ) {
+			context = document.implementation.createHTMLDocument( "" );
+
+			// Set the base href for the created document
+			// so any parsed elements with URLs
+			// are based on the document's URL (gh-2965)
+			base = context.createElement( "base" );
+			base.href = document.location.href;
+			context.head.appendChild( base );
+		} else {
+			context = document;
+		}
+	}
+
+	parsed = rsingleTag.exec( data );
+	scripts = !keepScripts && [];
+
+	// Single tag
+	if ( parsed ) {
+		return [ context.createElement( parsed[ 1 ] ) ];
+	}
+
+	parsed = buildFragment( [ data ], context, scripts );
+
+	if ( scripts && scripts.length ) {
+		jQuery( scripts ).remove();
+	}
+
+	return jQuery.merge( [], parsed.childNodes );
+};
+
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+	var selector, type, response,
+		self = this,
+		off = url.indexOf( " " );
+
+	if ( off > -1 ) {
+		selector = stripAndCollapse( url.slice( off ) );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax( {
+			url: url,
+
+			// If "type" variable is undefined, then "GET" method will be used.
+			// Make value of this field explicit since
+			// user can override it through ajaxSetup method
+			type: type || "GET",
+			dataType: "html",
+			data: params
+		} ).done( function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		// If the request succeeds, this function gets "data", "status", "jqXHR"
+		// but they are ignored because response was set above.
+		// If it fails, this function gets "jqXHR", "status", "error"
+		} ).always( callback && function( jqXHR, status ) {
+			self.each( function() {
+				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+			} );
+		} );
+	}
+
+	return this;
+};
+
+
+
+
+jQuery.expr.pseudos.animated = function( elem ) {
+	return jQuery.grep( jQuery.timers, function( fn ) {
+		return elem === fn.elem;
+	} ).length;
+};
+
+
+
+
+jQuery.offset = {
+	setOffset: function( elem, options, i ) {
+		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+			position = jQuery.css( elem, "position" ),
+			curElem = jQuery( elem ),
+			props = {};
+
+		// Set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		curOffset = curElem.offset();
+		curCSSTop = jQuery.css( elem, "top" );
+		curCSSLeft = jQuery.css( elem, "left" );
+		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
+
+		// Need to be able to calculate position if either
+		// top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( isFunction( options ) ) {
+
+			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+jQuery.fn.extend( {
+
+	// offset() relates an element's border box to the document origin
+	offset: function( options ) {
+
+		// Preserve chaining for setter
+		if ( arguments.length ) {
+			return options === undefined ?
+				this :
+				this.each( function( i ) {
+					jQuery.offset.setOffset( this, options, i );
+				} );
+		}
+
+		var rect, win,
+			elem = this[ 0 ];
+
+		if ( !elem ) {
+			return;
+		}
+
+		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+		// Support: IE <=11 only
+		// Running getBoundingClientRect on a
+		// disconnected node in IE throws an error
+		if ( !elem.getClientRects().length ) {
+			return { top: 0, left: 0 };
+		}
+
+		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
+		rect = elem.getBoundingClientRect();
+		win = elem.ownerDocument.defaultView;
+		return {
+			top: rect.top + win.pageYOffset,
+			left: rect.left + win.pageXOffset
+		};
+	},
+
+	// position() relates an element's margin box to its offset parent's padding box
+	// This corresponds to the behavior of CSS absolute positioning
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset, doc,
+			elem = this[ 0 ],
+			parentOffset = { top: 0, left: 0 };
+
+		// position:fixed elements are offset from the viewport, which itself always has zero offset
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+			// Assume position:fixed implies availability of getBoundingClientRect
+			offset = elem.getBoundingClientRect();
+
+		} else {
+			offset = this.offset();
+
+			// Account for the *real* offset parent, which can be the document or its root element
+			// when a statically positioned element is identified
+			doc = elem.ownerDocument;
+			offsetParent = elem.offsetParent || doc.documentElement;
+			while ( offsetParent &&
+				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
+				jQuery.css( offsetParent, "position" ) === "static" ) {
+
+				offsetParent = offsetParent.parentNode;
+			}
+			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
+
+				// Incorporate borders into its offset, since they are outside its content origin
+				parentOffset = jQuery( offsetParent ).offset();
+				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
+				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
+			}
+		}
+
+		// Subtract parent offsets and element margins
+		return {
+			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+		};
+	},
+
+	// This method will return documentElement in the following cases:
+	// 1) For the element inside the iframe without offsetParent, this method will return
+	//    documentElement of the parent window
+	// 2) For the hidden or detached element
+	// 3) For body or html element, i.e. in case of the html node - it will return itself
+	//
+	// but those exceptions were never presented as a real life use-cases
+	// and might be considered as more preferable results.
+	//
+	// This logic, however, is not guaranteed and can change at any point in the future
+	offsetParent: function() {
+		return this.map( function() {
+			var offsetParent = this.offsetParent;
+
+			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+
+			return offsetParent || documentElement;
+		} );
+	}
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+	var top = "pageYOffset" === prop;
+
+	jQuery.fn[ method ] = function( val ) {
+		return access( this, function( elem, method, val ) {
+
+			// Coalesce documents and windows
+			var win;
+			if ( isWindow( elem ) ) {
+				win = elem;
+			} else if ( elem.nodeType === 9 ) {
+				win = elem.defaultView;
+			}
+
+			if ( val === undefined ) {
+				return win ? win[ prop ] : elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : win.pageXOffset,
+					top ? val : win.pageYOffset
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length );
+	};
+} );
+
+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( _i, prop ) {
+	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+		function( elem, computed ) {
+			if ( computed ) {
+				computed = curCSS( elem, prop );
+
+				// If curCSS returns percentage, fallback to offset
+				return rnumnonpx.test( computed ) ?
+					jQuery( elem ).position()[ prop ] + "px" :
+					computed;
+			}
+		}
+	);
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( {
+		padding: "inner" + name,
+		content: type,
+		"": "outer" + name
+	}, function( defaultExtra, funcName ) {
+
+		// Margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( isWindow( elem ) ) {
+
+					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+					return funcName.indexOf( "outer" ) === 0 ?
+						elem[ "inner" + name ] :
+						elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+					// whichever is greatest
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable );
+		};
+	} );
+} );
+
+
+jQuery.each( [
+	"ajaxStart",
+	"ajaxStop",
+	"ajaxComplete",
+	"ajaxError",
+	"ajaxSuccess",
+	"ajaxSend"
+], function( _i, type ) {
+	jQuery.fn[ type ] = function( fn ) {
+		return this.on( type, fn );
+	};
+} );
+
+
+
+
+jQuery.fn.extend( {
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ?
+			this.off( selector, "**" ) :
+			this.off( types, selector || "**", fn );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+} );
+
+jQuery.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( _i, name ) {
+
+		// Handle event binding
+		jQuery.fn[ name ] = function( data, fn ) {
+			return arguments.length > 0 ?
+				this.on( name, null, data, fn ) :
+				this.trigger( name );
+		};
+	}
+);
+
+
+
+
+// Support: Android <=4.0 only
+// Make sure we trim BOM and NBSP
+var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+// Bind a function to a context, optionally partially applying any
+// arguments.
+// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
+// However, it is not slated for removal any time soon
+jQuery.proxy = function( fn, context ) {
+	var tmp, args, proxy;
+
+	if ( typeof context === "string" ) {
+		tmp = fn[ context ];
+		context = fn;
+		fn = tmp;
+	}
+
+	// Quick check to determine if target is callable, in the spec
+	// this throws a TypeError, but we will just return undefined.
+	if ( !isFunction( fn ) ) {
+		return undefined;
+	}
+
+	// Simulated bind
+	args = slice.call( arguments, 2 );
+	proxy = function() {
+		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+	};
+
+	// Set the guid of unique handler to the same of original handler, so it can be removed
+	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+	return proxy;
+};
+
+jQuery.holdReady = function( hold ) {
+	if ( hold ) {
+		jQuery.readyWait++;
+	} else {
+		jQuery.ready( true );
+	}
+};
+jQuery.isArray = Array.isArray;
+jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
+jQuery.isFunction = isFunction;
+jQuery.isWindow = isWindow;
+jQuery.camelCase = camelCase;
+jQuery.type = toType;
+
+jQuery.now = Date.now;
+
+jQuery.isNumeric = function( obj ) {
+
+	// As of jQuery 3.0, isNumeric is limited to
+	// strings and numbers (primitives or objects)
+	// that can be coerced to finite numbers (gh-2662)
+	var type = jQuery.type( obj );
+	return ( type === "number" || type === "string" ) &&
+
+		// parseFloat NaNs numeric-cast false positives ("")
+		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+		// subtraction forces infinities to NaN
+		!isNaN( obj - parseFloat( obj ) );
+};
+
+jQuery.trim = function( text ) {
+	return text == null ?
+		"" :
+		( text + "" ).replace( rtrim, "" );
+};
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+	define( "jquery", [], function() {
+		return jQuery;
+	} );
+}
+
+
+
+
+var
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+	if ( window.$ === jQuery ) {
+		window.$ = _$;
+	}
+
+	if ( deep && window.jQuery === jQuery ) {
+		window.jQuery = _jQuery;
+	}
+
+	return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === "undefined" ) {
+	window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+} );
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+$.ui = $.ui || {};
+
+return $.ui.version = "1.12.1";
+
+} ) );
+
+
+/*!
+ * jQuery UI Keycode 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Keycode
+//>>group: Core
+//>>description: Provide keycodes as keynames
+//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+return $.ui.keyCode = {
+	BACKSPACE: 8,
+	COMMA: 188,
+	DELETE: 46,
+	DOWN: 40,
+	END: 35,
+	ENTER: 13,
+	ESCAPE: 27,
+	HOME: 36,
+	LEFT: 37,
+	PAGE_DOWN: 34,
+	PAGE_UP: 33,
+	PERIOD: 190,
+	RIGHT: 39,
+	SPACE: 32,
+	TAB: 9,
+	UP: 38
+};
+
+} ) );
+
+
+
+// jscs:disable maximumLineLength
+/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
+/*!
+ * jQuery UI Datepicker 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Datepicker
+//>>group: Widgets
+//>>description: Displays a calendar from an input or inline for selecting dates.
+//>>docs: http://api.jqueryui.com/datepicker/
+//>>demos: http://jqueryui.com/datepicker/
+//>>css.structure: ../../themes/base/core.css
+//>>css.structure: ../../themes/base/datepicker.css
+//>>css.theme: ../../themes/base/theme.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"../version",
+			"../keycode"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+$.extend( $.ui, { datepicker: { version: "1.12.1" } } );
+
+var datepicker_instActive;
+
+function datepicker_getZindex( elem ) {
+	var position, value;
+	while ( elem.length && elem[ 0 ] !== document ) {
+
+		// Ignore z-index if position is set to a value where z-index is ignored by the browser
+		// This makes behavior of this function consistent across browsers
+		// WebKit always returns auto if the element is positioned
+		position = elem.css( "position" );
+		if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+
+			// IE returns 0 when zIndex is not specified
+			// other browsers return a string
+			// we ignore the case of nested elements with an explicit value of 0
+			// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+			value = parseInt( elem.css( "zIndex" ), 10 );
+			if ( !isNaN( value ) && value !== 0 ) {
+				return value;
+			}
+		}
+		elem = elem.parent();
+	}
+
+	return 0;
+}
+/* Date picker manager.
+   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
+   Settings for (groups of) date pickers are maintained in an instance object,
+   allowing multiple different settings on the same page. */
+
+function Datepicker() {
+	this._curInst = null; // The current instance in use
+	this._keyEvent = false; // If the last event was a key event
+	this._disabledInputs = []; // List of date picker inputs that have been disabled
+	this._datepickerShowing = false; // True if the popup picker is showing , false if not
+	this._inDialog = false; // True if showing within a "dialog", false if not
+	this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
+	this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
+	this._appendClass = "ui-datepicker-append"; // The name of the append marker class
+	this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
+	this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
+	this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
+	this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
+	this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
+	this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
+	this.regional = []; // Available regional settings, indexed by language code
+	this.regional[ "" ] = { // Default regional settings
+		closeText: "Done", // Display text for close link
+		prevText: "Prev", // Display text for previous month link
+		nextText: "Next", // Display text for next month link
+		currentText: "Today", // Display text for current month link
+		monthNames: [ "January","February","March","April","May","June",
+			"July","August","September","October","November","December" ], // Names of months for drop-down and formatting
+		monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting
+		dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting
+		dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting
+		dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ], // Column headings for days starting at Sunday
+		weekHeader: "Wk", // Column header for week of the year
+		dateFormat: "mm/dd/yy", // See format options on parseDate
+		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+		isRTL: false, // True if right-to-left language, false if left-to-right
+		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
+		yearSuffix: "" // Additional text to append to the year in the month headers
+	};
+	this._defaults = { // Global defaults for all the date picker instances
+		showOn: "focus", // "focus" for popup on focus,
+			// "button" for trigger button, or "both" for either
+		showAnim: "fadeIn", // Name of jQuery animation for popup
+		showOptions: {}, // Options for enhanced animations
+		defaultDate: null, // Used when field is blank: actual date,
+			// +/-number for offset from today, null for today
+		appendText: "", // Display text following the input box, e.g. showing the format
+		buttonText: "...", // Text for trigger button
+		buttonImage: "", // URL for trigger button image
+		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+		hideIfNoPrevNext: false, // True to hide next/previous month links
+			// if not applicable, false to just disable them
+		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
+		gotoCurrent: false, // True if today link goes back to current selection instead
+		changeMonth: false, // True if month can be selected directly, false if only prev/next
+		changeYear: false, // True if year can be selected directly, false if only prev/next
+		yearRange: "c-10:c+10", // Range of years to display in drop-down,
+			// either relative to today's year (-nn:+nn), relative to currently displayed year
+			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+		showOtherMonths: false, // True to show dates in other months, false to leave blank
+		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
+		showWeek: false, // True to show week of the year, false to not show it
+		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+			// takes a Date and returns the number of the week for it
+		shortYearCutoff: "+10", // Short year values < this are in the current century,
+			// > this are in the previous century,
+			// string value starting with "+" for current year + value
+		minDate: null, // The earliest selectable date, or null for no limit
+		maxDate: null, // The latest selectable date, or null for no limit
+		duration: "fast", // Duration of display/closure
+		beforeShowDay: null, // Function that takes a date and returns an array with
+			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
+			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
+		beforeShow: null, // Function that takes an input field and
+			// returns a set of custom settings for the date picker
+		onSelect: null, // Define a callback function when a date is selected
+		onChangeMonthYear: null, // Define a callback function when the month or year is changed
+		onClose: null, // Define a callback function when the datepicker is closed
+		numberOfMonths: 1, // Number of months to show at a time
+		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
+		stepMonths: 1, // Number of months to step back/forward
+		stepBigMonths: 12, // Number of months to step back/forward for the big links
+		altField: "", // Selector for an alternate field to store selected dates into
+		altFormat: "", // The date format to use for the alternate field
+		constrainInput: true, // The input is constrained by the current date format
+		showButtonPanel: false, // True to show button panel, false to not show it
+		autoSize: false, // True to size the input for the date format, false to leave as is
+		disabled: false // The initial disabled state
+	};
+	$.extend( this._defaults, this.regional[ "" ] );
+	this.regional.en = $.extend( true, {}, this.regional[ "" ] );
+	this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
+	this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
+}
+
+$.extend( Datepicker.prototype, {
+	/* Class name added to elements to indicate already configured with a date picker. */
+	markerClassName: "hasDatepicker",
+
+	//Keep track of the maximum number of rows displayed (see #7043)
+	maxRows: 4,
+
+	// TODO rename to "widget" when switching to widget factory
+	_widgetDatepicker: function() {
+		return this.dpDiv;
+	},
+
+	/* Override the default settings for all instances of the date picker.
+	 * @param  settings  object - the new settings to use as defaults (anonymous object)
+	 * @return the manager object
+	 */
+	setDefaults: function( settings ) {
+		datepicker_extendRemove( this._defaults, settings || {} );
+		return this;
+	},
+
+	/* Attach the date picker to a jQuery selection.
+	 * @param  target	element - the target input field or division or span
+	 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
+	 */
+	_attachDatepicker: function( target, settings ) {
+		var nodeName, inline, inst;
+		nodeName = target.nodeName.toLowerCase();
+		inline = ( nodeName === "div" || nodeName === "span" );
+		if ( !target.id ) {
+			this.uuid += 1;
+			target.id = "dp" + this.uuid;
+		}
+		inst = this._newInst( $( target ), inline );
+		inst.settings = $.extend( {}, settings || {} );
+		if ( nodeName === "input" ) {
+			this._connectDatepicker( target, inst );
+		} else if ( inline ) {
+			this._inlineDatepicker( target, inst );
+		}
+	},
+
+	/* Create a new instance object. */
+	_newInst: function( target, inline ) {
+		var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars
+		return { id: id, input: target, // associated target
+			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+			drawMonth: 0, drawYear: 0, // month being drawn
+			inline: inline, // is datepicker inline or not
+			dpDiv: ( !inline ? this.dpDiv : // presentation div
+			datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
+	},
+
+	/* Attach the date picker to an input field. */
+	_connectDatepicker: function( target, inst ) {
+		var input = $( target );
+		inst.append = $( [] );
+		inst.trigger = $( [] );
+		if ( input.hasClass( this.markerClassName ) ) {
+			return;
+		}
+		this._attachments( input, inst );
+		input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
+			on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
+		this._autoSize( inst );
+		$.data( target, "datepicker", inst );
+
+		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
+		if ( inst.settings.disabled ) {
+			this._disableDatepicker( target );
+		}
+	},
+
+	/* Make attachments based on settings. */
+	_attachments: function( input, inst ) {
+		var showOn, buttonText, buttonImage,
+			appendText = this._get( inst, "appendText" ),
+			isRTL = this._get( inst, "isRTL" );
+
+		if ( inst.append ) {
+			inst.append.remove();
+		}
+		if ( appendText ) {
+			inst.append = $( "<span class='" + this._appendClass + "'>" + appendText + "</span>" );
+			input[ isRTL ? "before" : "after" ]( inst.append );
+		}
+
+		input.off( "focus", this._showDatepicker );
+
+		if ( inst.trigger ) {
+			inst.trigger.remove();
+		}
+
+		showOn = this._get( inst, "showOn" );
+		if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field
+			input.on( "focus", this._showDatepicker );
+		}
+		if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked
+			buttonText = this._get( inst, "buttonText" );
+			buttonImage = this._get( inst, "buttonImage" );
+			inst.trigger = $( this._get( inst, "buttonImageOnly" ) ?
+				$( "<img/>" ).addClass( this._triggerClass ).
+					attr( { src: buttonImage, alt: buttonText, title: buttonText } ) :
+				$( "<button type='button'></button>" ).addClass( this._triggerClass ).
+					html( !buttonImage ? buttonText : $( "<img/>" ).attr(
+					{ src:buttonImage, alt:buttonText, title:buttonText } ) ) );
+			input[ isRTL ? "before" : "after" ]( inst.trigger );
+			inst.trigger.on( "click", function() {
+				if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {
+					$.datepicker._hideDatepicker();
+				} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {
+					$.datepicker._hideDatepicker();
+					$.datepicker._showDatepicker( input[ 0 ] );
+				} else {
+					$.datepicker._showDatepicker( input[ 0 ] );
+				}
+				return false;
+			} );
+		}
+	},
+
+	/* Apply the maximum length for the date format. */
+	_autoSize: function( inst ) {
+		if ( this._get( inst, "autoSize" ) && !inst.inline ) {
+			var findMax, max, maxI, i,
+				date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits
+				dateFormat = this._get( inst, "dateFormat" );
+
+			if ( dateFormat.match( /[DM]/ ) ) {
+				findMax = function( names ) {
+					max = 0;
+					maxI = 0;
+					for ( i = 0; i < names.length; i++ ) {
+						if ( names[ i ].length > max ) {
+							max = names[ i ].length;
+							maxI = i;
+						}
+					}
+					return maxI;
+				};
+				date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?
+					"monthNames" : "monthNamesShort" ) ) ) );
+				date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?
+					"dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() );
+			}
+			inst.input.attr( "size", this._formatDate( inst, date ).length );
+		}
+	},
+
+	/* Attach an inline date picker to a div. */
+	_inlineDatepicker: function( target, inst ) {
+		var divSpan = $( target );
+		if ( divSpan.hasClass( this.markerClassName ) ) {
+			return;
+		}
+		divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
+		$.data( target, "datepicker", inst );
+		this._setDate( inst, this._getDefaultDate( inst ), true );
+		this._updateDatepicker( inst );
+		this._updateAlternate( inst );
+
+		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
+		if ( inst.settings.disabled ) {
+			this._disableDatepicker( target );
+		}
+
+		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
+		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
+		inst.dpDiv.css( "display", "block" );
+	},
+
+	/* Pop-up the date picker in a "dialog" box.
+	 * @param  input element - ignored
+	 * @param  date	string or Date - the initial date to display
+	 * @param  onSelect  function - the function to call when a date is selected
+	 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
+	 * @param  pos int[2] - coordinates for the dialog's position within the screen or
+	 *					event - with x/y coordinates or
+	 *					leave empty for default (screen centre)
+	 * @return the manager object
+	 */
+	_dialogDatepicker: function( input, date, onSelect, settings, pos ) {
+		var id, browserWidth, browserHeight, scrollX, scrollY,
+			inst = this._dialogInst; // internal instance
+
+		if ( !inst ) {
+			this.uuid += 1;
+			id = "dp" + this.uuid;
+			this._dialogInput = $( "<input type='text' id='" + id +
+				"' style='position: absolute; top: -100px; width: 0px;'/>" );
+			this._dialogInput.on( "keydown", this._doKeyDown );
+			$( "body" ).append( this._dialogInput );
+			inst = this._dialogInst = this._newInst( this._dialogInput, false );
+			inst.settings = {};
+			$.data( this._dialogInput[ 0 ], "datepicker", inst );
+		}
+		datepicker_extendRemove( inst.settings, settings || {} );
+		date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );
+		this._dialogInput.val( date );
+
+		this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );
+		if ( !this._pos ) {
+			browserWidth = document.documentElement.clientWidth;
+			browserHeight = document.documentElement.clientHeight;
+			scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+			scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+			this._pos = // should use actual width/height below
+				[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
+		}
+
+		// Move input on screen for focus, but hidden behind dialog
+		this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" );
+		inst.settings.onSelect = onSelect;
+		this._inDialog = true;
+		this.dpDiv.addClass( this._dialogClass );
+		this._showDatepicker( this._dialogInput[ 0 ] );
+		if ( $.blockUI ) {
+			$.blockUI( this.dpDiv );
+		}
+		$.data( this._dialogInput[ 0 ], "datepicker", inst );
+		return this;
+	},
+
+	/* Detach a datepicker from its control.
+	 * @param  target	element - the target input field or division or span
+	 */
+	_destroyDatepicker: function( target ) {
+		var nodeName,
+			$target = $( target ),
+			inst = $.data( target, "datepicker" );
+
+		if ( !$target.hasClass( this.markerClassName ) ) {
+			return;
+		}
+
+		nodeName = target.nodeName.toLowerCase();
+		$.removeData( target, "datepicker" );
+		if ( nodeName === "input" ) {
+			inst.append.remove();
+			inst.trigger.remove();
+			$target.removeClass( this.markerClassName ).
+				off( "focus", this._showDatepicker ).
+				off( "keydown", this._doKeyDown ).
+				off( "keypress", this._doKeyPress ).
+				off( "keyup", this._doKeyUp );
+		} else if ( nodeName === "div" || nodeName === "span" ) {
+			$target.removeClass( this.markerClassName ).empty();
+		}
+
+		if ( datepicker_instActive === inst ) {
+			datepicker_instActive = null;
+		}
+	},
+
+	/* Enable the date picker to a jQuery selection.
+	 * @param  target	element - the target input field or division or span
+	 */
+	_enableDatepicker: function( target ) {
+		var nodeName, inline,
+			$target = $( target ),
+			inst = $.data( target, "datepicker" );
+
+		if ( !$target.hasClass( this.markerClassName ) ) {
+			return;
+		}
+
+		nodeName = target.nodeName.toLowerCase();
+		if ( nodeName === "input" ) {
+			target.disabled = false;
+			inst.trigger.filter( "button" ).
+				each( function() { this.disabled = false; } ).end().
+				filter( "img" ).css( { opacity: "1.0", cursor: "" } );
+		} else if ( nodeName === "div" || nodeName === "span" ) {
+			inline = $target.children( "." + this._inlineClass );
+			inline.children().removeClass( "ui-state-disabled" );
+			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
+				prop( "disabled", false );
+		}
+		this._disabledInputs = $.map( this._disabledInputs,
+			function( value ) { return ( value === target ? null : value ); } ); // delete entry
+	},
+
+	/* Disable the date picker to a jQuery selection.
+	 * @param  target	element - the target input field or division or span
+	 */
+	_disableDatepicker: function( target ) {
+		var nodeName, inline,
+			$target = $( target ),
+			inst = $.data( target, "datepicker" );
+
+		if ( !$target.hasClass( this.markerClassName ) ) {
+			return;
+		}
+
+		nodeName = target.nodeName.toLowerCase();
+		if ( nodeName === "input" ) {
+			target.disabled = true;
+			inst.trigger.filter( "button" ).
+				each( function() { this.disabled = true; } ).end().
+				filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
+		} else if ( nodeName === "div" || nodeName === "span" ) {
+			inline = $target.children( "." + this._inlineClass );
+			inline.children().addClass( "ui-state-disabled" );
+			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
+				prop( "disabled", true );
+		}
+		this._disabledInputs = $.map( this._disabledInputs,
+			function( value ) { return ( value === target ? null : value ); } ); // delete entry
+		this._disabledInputs[ this._disabledInputs.length ] = target;
+	},
+
+	/* Is the first field in a jQuery collection disabled as a datepicker?
+	 * @param  target	element - the target input field or division or span
+	 * @return boolean - true if disabled, false if enabled
+	 */
+	_isDisabledDatepicker: function( target ) {
+		if ( !target ) {
+			return false;
+		}
+		for ( var i = 0; i < this._disabledInputs.length; i++ ) {
+			if ( this._disabledInputs[ i ] === target ) {
+				return true;
+			}
+		}
+		return false;
+	},
+
+	/* Retrieve the instance data for the target control.
+	 * @param  target  element - the target input field or division or span
+	 * @return  object - the associated instance data
+	 * @throws  error if a jQuery problem getting data
+	 */
+	_getInst: function( target ) {
+		try {
+			return $.data( target, "datepicker" );
+		}
+		catch ( err ) {
+			throw "Missing instance data for this datepicker";
+		}
+	},
+
+	/* Update or retrieve the settings for a date picker attached to an input field or division.
+	 * @param  target  element - the target input field or division or span
+	 * @param  name	object - the new settings to update or
+	 *				string - the name of the setting to change or retrieve,
+	 *				when retrieving also "all" for all instance settings or
+	 *				"defaults" for all global defaults
+	 * @param  value   any - the new value for the setting
+	 *				(omit if above is an object or to retrieve a value)
+	 */
+	_optionDatepicker: function( target, name, value ) {
+		var settings, date, minDate, maxDate,
+			inst = this._getInst( target );
+
+		if ( arguments.length === 2 && typeof name === "string" ) {
+			return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
+				( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
+				this._get( inst, name ) ) : null ) );
+		}
+
+		settings = name || {};
+		if ( typeof name === "string" ) {
+			settings = {};
+			settings[ name ] = value;
+		}
+
+		if ( inst ) {
+			if ( this._curInst === inst ) {
+				this._hideDatepicker();
+			}
+
+			date = this._getDateDatepicker( target, true );
+			minDate = this._getMinMaxDate( inst, "min" );
+			maxDate = this._getMinMaxDate( inst, "max" );
+			datepicker_extendRemove( inst.settings, settings );
+
+			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
+			if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
+				inst.settings.minDate = this._formatDate( inst, minDate );
+			}
+			if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
+				inst.settings.maxDate = this._formatDate( inst, maxDate );
+			}
+			if ( "disabled" in settings ) {
+				if ( settings.disabled ) {
+					this._disableDatepicker( target );
+				} else {
+					this._enableDatepicker( target );
+				}
+			}
+			this._attachments( $( target ), inst );
+			this._autoSize( inst );
+			this._setDate( inst, date );
+			this._updateAlternate( inst );
+			this._updateDatepicker( inst );
+		}
+	},
+
+	// Change method deprecated
+	_changeDatepicker: function( target, name, value ) {
+		this._optionDatepicker( target, name, value );
+	},
+
+	/* Redraw the date picker attached to an input field or division.
+	 * @param  target  element - the target input field or division or span
+	 */
+	_refreshDatepicker: function( target ) {
+		var inst = this._getInst( target );
+		if ( inst ) {
+			this._updateDatepicker( inst );
+		}
+	},
+
+	/* Set the dates for a jQuery selection.
+	 * @param  target element - the target input field or division or span
+	 * @param  date	Date - the new date
+	 */
+	_setDateDatepicker: function( target, date ) {
+		var inst = this._getInst( target );
+		if ( inst ) {
+			this._setDate( inst, date );
+			this._updateDatepicker( inst );
+			this._updateAlternate( inst );
+		}
+	},
+
+	/* Get the date(s) for the first entry in a jQuery selection.
+	 * @param  target element - the target input field or division or span
+	 * @param  noDefault boolean - true if no default date is to be used
+	 * @return Date - the current date
+	 */
+	_getDateDatepicker: function( target, noDefault ) {
+		var inst = this._getInst( target );
+		if ( inst && !inst.inline ) {
+			this._setDateFromField( inst, noDefault );
+		}
+		return ( inst ? this._getDate( inst ) : null );
+	},
+
+	/* Handle keystrokes. */
+	_doKeyDown: function( event ) {
+		var onSelect, dateStr, sel,
+			inst = $.datepicker._getInst( event.target ),
+			handled = true,
+			isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" );
+
+		inst._keyEvent = true;
+		if ( $.datepicker._datepickerShowing ) {
+			switch ( event.keyCode ) {
+				case 9: $.datepicker._hideDatepicker();
+						handled = false;
+						break; // hide on tab out
+				case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
+									$.datepicker._currentClass + ")", inst.dpDiv );
+						if ( sel[ 0 ] ) {
+							$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
+						}
+
+						onSelect = $.datepicker._get( inst, "onSelect" );
+						if ( onSelect ) {
+							dateStr = $.datepicker._formatDate( inst );
+
+							// Trigger custom callback
+							onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
+						} else {
+							$.datepicker._hideDatepicker();
+						}
+
+						return false; // don't submit the form
+				case 27: $.datepicker._hideDatepicker();
+						break; // hide on escape
+				case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
+							-$.datepicker._get( inst, "stepBigMonths" ) :
+							-$.datepicker._get( inst, "stepMonths" ) ), "M" );
+						break; // previous month/year on page up/+ ctrl
+				case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
+							+$.datepicker._get( inst, "stepBigMonths" ) :
+							+$.datepicker._get( inst, "stepMonths" ) ), "M" );
+						break; // next month/year on page down/+ ctrl
+				case 35: if ( event.ctrlKey || event.metaKey ) {
+							$.datepicker._clearDate( event.target );
+						}
+						handled = event.ctrlKey || event.metaKey;
+						break; // clear on ctrl or command +end
+				case 36: if ( event.ctrlKey || event.metaKey ) {
+							$.datepicker._gotoToday( event.target );
+						}
+						handled = event.ctrlKey || event.metaKey;
+						break; // current on ctrl or command +home
+				case 37: if ( event.ctrlKey || event.metaKey ) {
+							$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
+						}
+						handled = event.ctrlKey || event.metaKey;
+
+						// -1 day on ctrl or command +left
+						if ( event.originalEvent.altKey ) {
+							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
+								-$.datepicker._get( inst, "stepBigMonths" ) :
+								-$.datepicker._get( inst, "stepMonths" ) ), "M" );
+						}
+
+						// next month/year on alt +left on Mac
+						break;
+				case 38: if ( event.ctrlKey || event.metaKey ) {
+							$.datepicker._adjustDate( event.target, -7, "D" );
+						}
+						handled = event.ctrlKey || event.metaKey;
+						break; // -1 week on ctrl or command +up
+				case 39: if ( event.ctrlKey || event.metaKey ) {
+							$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
+						}
+						handled = event.ctrlKey || event.metaKey;
+
+						// +1 day on ctrl or command +right
+						if ( event.originalEvent.altKey ) {
+							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
+								+$.datepicker._get( inst, "stepBigMonths" ) :
+								+$.datepicker._get( inst, "stepMonths" ) ), "M" );
+						}
+
+						// next month/year on alt +right
+						break;
+				case 40: if ( event.ctrlKey || event.metaKey ) {
+							$.datepicker._adjustDate( event.target, +7, "D" );
+						}
+						handled = event.ctrlKey || event.metaKey;
+						break; // +1 week on ctrl or command +down
+				default: handled = false;
+			}
+		} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
+			$.datepicker._showDatepicker( this );
+		} else {
+			handled = false;
+		}
+
+		if ( handled ) {
+			event.preventDefault();
+			event.stopPropagation();
+		}
+	},
+
+	/* Filter entered characters - based on date format. */
+	_doKeyPress: function( event ) {
+		var chars, chr,
+			inst = $.datepicker._getInst( event.target );
+
+		if ( $.datepicker._get( inst, "constrainInput" ) ) {
+			chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) );
+			chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );
+			return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 );
+		}
+	},
+
+	/* Synchronise manual entry and field/alternate field. */
+	_doKeyUp: function( event ) {
+		var date,
+			inst = $.datepicker._getInst( event.target );
+
+		if ( inst.input.val() !== inst.lastVal ) {
+			try {
+				date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
+					( inst.input ? inst.input.val() : null ),
+					$.datepicker._getFormatConfig( inst ) );
+
+				if ( date ) { // only if valid
+					$.datepicker._setDateFromField( inst );
+					$.datepicker._updateAlternate( inst );
+					$.datepicker._updateDatepicker( inst );
+				}
+			}
+			catch ( err ) {
+			}
+		}
+		return true;
+	},
+
+	/* Pop-up the date picker for a given input field.
+	 * If false returned from beforeShow event handler do not show.
+	 * @param  input  element - the input field attached to the date picker or
+	 *					event - if triggered by focus
+	 */
+	_showDatepicker: function( input ) {
+		input = input.target || input;
+		if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger
+			input = $( "input", input.parentNode )[ 0 ];
+		}
+
+		if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here
+			return;
+		}
+
+		var inst, beforeShow, beforeShowSettings, isFixed,
+			offset, showAnim, duration;
+
+		inst = $.datepicker._getInst( input );
+		if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {
+			$.datepicker._curInst.dpDiv.stop( true, true );
+			if ( inst && $.datepicker._datepickerShowing ) {
+				$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );
+			}
+		}
+
+		beforeShow = $.datepicker._get( inst, "beforeShow" );
+		beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
+		if ( beforeShowSettings === false ) {
+			return;
+		}
+		datepicker_extendRemove( inst.settings, beforeShowSettings );
+
+		inst.lastVal = null;
+		$.datepicker._lastInput = input;
+		$.datepicker._setDateFromField( inst );
+
+		if ( $.datepicker._inDialog ) { // hide cursor
+			input.value = "";
+		}
+		if ( !$.datepicker._pos ) { // position below input
+			$.datepicker._pos = $.datepicker._findPos( input );
+			$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height
+		}
+
+		isFixed = false;
+		$( input ).parents().each( function() {
+			isFixed |= $( this ).css( "position" ) === "fixed";
+			return !isFixed;
+		} );
+
+		offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };
+		$.datepicker._pos = null;
+
+		//to avoid flashes on Firefox
+		inst.dpDiv.empty();
+
+		// determine sizing offscreen
+		inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } );
+		$.datepicker._updateDatepicker( inst );
+
+		// fix width for dynamic number of date pickers
+		// and adjust position before showing
+		offset = $.datepicker._checkOffset( inst, offset, isFixed );
+		inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
+			"static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
+			left: offset.left + "px", top: offset.top + "px" } );
+
+		if ( !inst.inline ) {
+			showAnim = $.datepicker._get( inst, "showAnim" );
+			duration = $.datepicker._get( inst, "duration" );
+			inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
+			$.datepicker._datepickerShowing = true;
+
+			if ( $.effects && $.effects.effect[ showAnim ] ) {
+				inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration );
+			} else {
+				inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null );
+			}
+
+			if ( $.datepicker._shouldFocusInput( inst ) ) {
+				inst.input.trigger( "focus" );
+			}
+
+			$.datepicker._curInst = inst;
+		}
+	},
+
+	/* Generate the date picker content. */
+	_updateDatepicker: function( inst ) {
+		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+		datepicker_instActive = inst; // for delegate hover events
+		inst.dpDiv.empty().append( this._generateHTML( inst ) );
+		this._attachHandlers( inst );
+
+		var origyearshtml,
+			numMonths = this._getNumberOfMonths( inst ),
+			cols = numMonths[ 1 ],
+			width = 17,
+			activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
+
+		if ( activeCell.length > 0 ) {
+			datepicker_handleMouseover.apply( activeCell.get( 0 ) );
+		}
+
+		inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
+		if ( cols > 1 ) {
+			inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
+		}
+		inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
+			"Class" ]( "ui-datepicker-multi" );
+		inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
+			"Class" ]( "ui-datepicker-rtl" );
+
+		if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
+			inst.input.trigger( "focus" );
+		}
+
+		// Deffered render of the years select (to avoid flashes on Firefox)
+		if ( inst.yearshtml ) {
+			origyearshtml = inst.yearshtml;
+			setTimeout( function() {
+
+				//assure that inst.yearshtml didn't change.
+				if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
+					inst.dpDiv.find( "select.ui-datepicker-year:first" ).replaceWith( inst.yearshtml );
+				}
+				origyearshtml = inst.yearshtml = null;
+			}, 0 );
+		}
+	},
+
+	// #6694 - don't focus the input if it's already focused
+	// this breaks the change event in IE
+	// Support: IE and jQuery <1.9
+	_shouldFocusInput: function( inst ) {
+		return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
+	},
+
+	/* Check positioning to remain on screen. */
+	_checkOffset: function( inst, offset, isFixed ) {
+		var dpWidth = inst.dpDiv.outerWidth(),
+			dpHeight = inst.dpDiv.outerHeight(),
+			inputWidth = inst.input ? inst.input.outerWidth() : 0,
+			inputHeight = inst.input ? inst.input.outerHeight() : 0,
+			viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
+			viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );
+
+		offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 );
+		offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;
+		offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;
+
+		// Now check if datepicker is showing outside window viewport - move to a better place if so.
+		offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?
+			Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
+		offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?
+			Math.abs( dpHeight + inputHeight ) : 0 );
+
+		return offset;
+	},
+
+	/* Find an object's position on the screen. */
+	_findPos: function( obj ) {
+		var position,
+			inst = this._getInst( obj ),
+			isRTL = this._get( inst, "isRTL" );
+
+		while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden( obj ) ) ) {
+			obj = obj[ isRTL ? "previousSibling" : "nextSibling" ];
+		}
+
+		position = $( obj ).offset();
+		return [ position.left, position.top ];
+	},
+
+	/* Hide the date picker from view.
+	 * @param  input  element - the input field attached to the date picker
+	 */
+	_hideDatepicker: function( input ) {
+		var showAnim, duration, postProcess, onClose,
+			inst = this._curInst;
+
+		if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) {
+			return;
+		}
+
+		if ( this._datepickerShowing ) {
+			showAnim = this._get( inst, "showAnim" );
+			duration = this._get( inst, "duration" );
+			postProcess = function() {
+				$.datepicker._tidyDialog( inst );
+			};
+
+			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
+			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
+				inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess );
+			} else {
+				inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" :
+					( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess );
+			}
+
+			if ( !showAnim ) {
+				postProcess();
+			}
+			this._datepickerShowing = false;
+
+			onClose = this._get( inst, "onClose" );
+			if ( onClose ) {
+				onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] );
+			}
+
+			this._lastInput = null;
+			if ( this._inDialog ) {
+				this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } );
+				if ( $.blockUI ) {
+					$.unblockUI();
+					$( "body" ).append( this.dpDiv );
+				}
+			}
+			this._inDialog = false;
+		}
+	},
+
+	/* Tidy up after a dialog display. */
+	_tidyDialog: function( inst ) {
+		inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" );
+	},
+
+	/* Close date picker if clicked elsewhere. */
+	_checkExternalClick: function( event ) {
+		if ( !$.datepicker._curInst ) {
+			return;
+		}
+
+		var $target = $( event.target ),
+			inst = $.datepicker._getInst( $target[ 0 ] );
+
+		if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&
+				$target.parents( "#" + $.datepicker._mainDivId ).length === 0 &&
+				!$target.hasClass( $.datepicker.markerClassName ) &&
+				!$target.closest( "." + $.datepicker._triggerClass ).length &&
+				$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
+			( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
+				$.datepicker._hideDatepicker();
+		}
+	},
+
+	/* Adjust one of the date sub-fields. */
+	_adjustDate: function( id, offset, period ) {
+		var target = $( id ),
+			inst = this._getInst( target[ 0 ] );
+
+		if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
+			return;
+		}
+		this._adjustInstDate( inst, offset +
+			( period === "M" ? this._get( inst, "showCurrentAtPos" ) : 0 ), // undo positioning
+			period );
+		this._updateDatepicker( inst );
+	},
+
+	/* Action for current link. */
+	_gotoToday: function( id ) {
+		var date,
+			target = $( id ),
+			inst = this._getInst( target[ 0 ] );
+
+		if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) {
+			inst.selectedDay = inst.currentDay;
+			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+			inst.drawYear = inst.selectedYear = inst.currentYear;
+		} else {
+			date = new Date();
+			inst.selectedDay = date.getDate();
+			inst.drawMonth = inst.selectedMonth = date.getMonth();
+			inst.drawYear = inst.selectedYear = date.getFullYear();
+		}
+		this._notifyChange( inst );
+		this._adjustDate( target );
+	},
+
+	/* Action for selecting a new month/year. */
+	_selectMonthYear: function( id, select, period ) {
+		var target = $( id ),
+			inst = this._getInst( target[ 0 ] );
+
+		inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
+		inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
+			parseInt( select.options[ select.selectedIndex ].value, 10 );
+
+		this._notifyChange( inst );
+		this._adjustDate( target );
+	},
+
+	/* Action for selecting a day. */
+	_selectDay: function( id, month, year, td ) {
+		var inst,
+			target = $( id );
+
+		if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
+			return;
+		}
+
+		inst = this._getInst( target[ 0 ] );
+		inst.selectedDay = inst.currentDay = $( "a", td ).html();
+		inst.selectedMonth = inst.currentMonth = month;
+		inst.selectedYear = inst.currentYear = year;
+		this._selectDate( id, this._formatDate( inst,
+			inst.currentDay, inst.currentMonth, inst.currentYear ) );
+	},
+
+	/* Erase the input field and hide the date picker. */
+	_clearDate: function( id ) {
+		var target = $( id );
+		this._selectDate( target, "" );
+	},
+
+	/* Update the input field with the selected date. */
+	_selectDate: function( id, dateStr ) {
+		var onSelect,
+			target = $( id ),
+			inst = this._getInst( target[ 0 ] );
+
+		dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );
+		if ( inst.input ) {
+			inst.input.val( dateStr );
+		}
+		this._updateAlternate( inst );
+
+		onSelect = this._get( inst, "onSelect" );
+		if ( onSelect ) {
+			onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback
+		} else if ( inst.input ) {
+			inst.input.trigger( "change" ); // fire the change event
+		}
+
+		if ( inst.inline ) {
+			this._updateDatepicker( inst );
+		} else {
+			this._hideDatepicker();
+			this._lastInput = inst.input[ 0 ];
+			if ( typeof( inst.input[ 0 ] ) !== "object" ) {
+				inst.input.trigger( "focus" ); // restore focus
+			}
+			this._lastInput = null;
+		}
+	},
+
+	/* Update any alternate field to synchronise with the main field. */
+	_updateAlternate: function( inst ) {
+		var altFormat, date, dateStr,
+			altField = this._get( inst, "altField" );
+
+		if ( altField ) { // update alternate field too
+			altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" );
+			date = this._getDate( inst );
+			dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
+			$( altField ).val( dateStr );
+		}
+	},
+
+	/* Set as beforeShowDay function to prevent selection of weekends.
+	 * @param  date  Date - the date to customise
+	 * @return [boolean, string] - is this date selectable?, what is its CSS class?
+	 */
+	noWeekends: function( date ) {
+		var day = date.getDay();
+		return [ ( day > 0 && day < 6 ), "" ];
+	},
+
+	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+	 * @param  date  Date - the date to get the week for
+	 * @return  number - the number of the week within the year that contains this date
+	 */
+	iso8601Week: function( date ) {
+		var time,
+			checkDate = new Date( date.getTime() );
+
+		// Find Thursday of this week starting on Monday
+		checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
+
+		time = checkDate.getTime();
+		checkDate.setMonth( 0 ); // Compare with Jan 1
+		checkDate.setDate( 1 );
+		return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
+	},
+
+	/* Parse a string value into a date object.
+	 * See formatDate below for the possible formats.
+	 *
+	 * @param  format string - the expected format of the date
+	 * @param  value string - the date in the above format
+	 * @param  settings Object - attributes include:
+	 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
+	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
+	 *					dayNames		string[7] - names of the days from Sunday (optional)
+	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
+	 *					monthNames		string[12] - names of the months (optional)
+	 * @return  Date - the extracted date value or null if value is blank
+	 */
+	parseDate: function( format, value, settings ) {
+		if ( format == null || value == null ) {
+			throw "Invalid arguments";
+		}
+
+		value = ( typeof value === "object" ? value.toString() : value + "" );
+		if ( value === "" ) {
+			return null;
+		}
+
+		var iFormat, dim, extra,
+			iValue = 0,
+			shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,
+			shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
+				new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),
+			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
+			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
+			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
+			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
+			year = -1,
+			month = -1,
+			day = -1,
+			doy = -1,
+			literal = false,
+			date,
+
+			// Check whether a format character is doubled
+			lookAhead = function( match ) {
+				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
+				if ( matches ) {
+					iFormat++;
+				}
+				return matches;
+			},
+
+			// Extract a number from the string value
+			getNumber = function( match ) {
+				var isDoubled = lookAhead( match ),
+					size = ( match === "@" ? 14 : ( match === "!" ? 20 :
+					( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
+					minSize = ( match === "y" ? size : 1 ),
+					digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
+					num = value.substring( iValue ).match( digits );
+				if ( !num ) {
+					throw "Missing number at position " + iValue;
+				}
+				iValue += num[ 0 ].length;
+				return parseInt( num[ 0 ], 10 );
+			},
+
+			// Extract a name from the string value and convert to an index
+			getName = function( match, shortNames, longNames ) {
+				var index = -1,
+					names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
+						return [ [ k, v ] ];
+					} ).sort( function( a, b ) {
+						return -( a[ 1 ].length - b[ 1 ].length );
+					} );
+
+				$.each( names, function( i, pair ) {
+					var name = pair[ 1 ];
+					if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {
+						index = pair[ 0 ];
+						iValue += name.length;
+						return false;
+					}
+				} );
+				if ( index !== -1 ) {
+					return index + 1;
+				} else {
+					throw "Unknown name at position " + iValue;
+				}
+			},
+
+			// Confirm that a literal character matches the string value
+			checkLiteral = function() {
+				if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
+					throw "Unexpected literal at position " + iValue;
+				}
+				iValue++;
+			};
+
+		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
+			if ( literal ) {
+				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
+					literal = false;
+				} else {
+					checkLiteral();
+				}
+			} else {
+				switch ( format.charAt( iFormat ) ) {
+					case "d":
+						day = getNumber( "d" );
+						break;
+					case "D":
+						getName( "D", dayNamesShort, dayNames );
+						break;
+					case "o":
+						doy = getNumber( "o" );
+						break;
+					case "m":
+						month = getNumber( "m" );
+						break;
+					case "M":
+						month = getName( "M", monthNamesShort, monthNames );
+						break;
+					case "y":
+						year = getNumber( "y" );
+						break;
+					case "@":
+						date = new Date( getNumber( "@" ) );
+						year = date.getFullYear();
+						month = date.getMonth() + 1;
+						day = date.getDate();
+						break;
+					case "!":
+						date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
+						year = date.getFullYear();
+						month = date.getMonth() + 1;
+						day = date.getDate();
+						break;
+					case "'":
+						if ( lookAhead( "'" ) ) {
+							checkLiteral();
+						} else {
+							literal = true;
+						}
+						break;
+					default:
+						checkLiteral();
+				}
+			}
+		}
+
+		if ( iValue < value.length ) {
+			extra = value.substr( iValue );
+			if ( !/^\s+/.test( extra ) ) {
+				throw "Extra/unparsed characters found in date: " + extra;
+			}
+		}
+
+		if ( year === -1 ) {
+			year = new Date().getFullYear();
+		} else if ( year < 100 ) {
+			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+				( year <= shortYearCutoff ? 0 : -100 );
+		}
+
+		if ( doy > -1 ) {
+			month = 1;
+			day = doy;
+			do {
+				dim = this._getDaysInMonth( year, month - 1 );
+				if ( day <= dim ) {
+					break;
+				}
+				month++;
+				day -= dim;
+			} while ( true );
+		}
+
+		date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
+		if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
+			throw "Invalid date"; // E.g. 31/02/00
+		}
+		return date;
+	},
+
+	/* Standard date formats. */
+	ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
+	COOKIE: "D, dd M yy",
+	ISO_8601: "yy-mm-dd",
+	RFC_822: "D, d M y",
+	RFC_850: "DD, dd-M-y",
+	RFC_1036: "D, d M y",
+	RFC_1123: "D, d M yy",
+	RFC_2822: "D, d M yy",
+	RSS: "D, d M y", // RFC 822
+	TICKS: "!",
+	TIMESTAMP: "@",
+	W3C: "yy-mm-dd", // ISO 8601
+
+	_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +
+		Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),
+
+	/* Format a date object into a string value.
+	 * The format can be combinations of the following:
+	 * d  - day of month (no leading zero)
+	 * dd - day of month (two digit)
+	 * o  - day of year (no leading zeros)
+	 * oo - day of year (three digit)
+	 * D  - day name short
+	 * DD - day name long
+	 * m  - month of year (no leading zero)
+	 * mm - month of year (two digit)
+	 * M  - month name short
+	 * MM - month name long
+	 * y  - year (two digit)
+	 * yy - year (four digit)
+	 * @ - Unix timestamp (ms since 01/01/1970)
+	 * ! - Windows ticks (100ns since 01/01/0001)
+	 * "..." - literal text
+	 * '' - single quote
+	 *
+	 * @param  format string - the desired format of the date
+	 * @param  date Date - the date value to format
+	 * @param  settings Object - attributes include:
+	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
+	 *					dayNames		string[7] - names of the days from Sunday (optional)
+	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
+	 *					monthNames		string[12] - names of the months (optional)
+	 * @return  string - the date in the above format
+	 */
+	formatDate: function( format, date, settings ) {
+		if ( !date ) {
+			return "";
+		}
+
+		var iFormat,
+			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
+			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
+			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
+			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
+
+			// Check whether a format character is doubled
+			lookAhead = function( match ) {
+				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
+				if ( matches ) {
+					iFormat++;
+				}
+				return matches;
+			},
+
+			// Format a number, with leading zero if necessary
+			formatNumber = function( match, value, len ) {
+				var num = "" + value;
+				if ( lookAhead( match ) ) {
+					while ( num.length < len ) {
+						num = "0" + num;
+					}
+				}
+				return num;
+			},
+
+			// Format a name, short or long as requested
+			formatName = function( match, value, shortNames, longNames ) {
+				return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );
+			},
+			output = "",
+			literal = false;
+
+		if ( date ) {
+			for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
+				if ( literal ) {
+					if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
+						literal = false;
+					} else {
+						output += format.charAt( iFormat );
+					}
+				} else {
+					switch ( format.charAt( iFormat ) ) {
+						case "d":
+							output += formatNumber( "d", date.getDate(), 2 );
+							break;
+						case "D":
+							output += formatName( "D", date.getDay(), dayNamesShort, dayNames );
+							break;
+						case "o":
+							output += formatNumber( "o",
+								Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
+							break;
+						case "m":
+							output += formatNumber( "m", date.getMonth() + 1, 2 );
+							break;
+						case "M":
+							output += formatName( "M", date.getMonth(), monthNamesShort, monthNames );
+							break;
+						case "y":
+							output += ( lookAhead( "y" ) ? date.getFullYear() :
+								( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 );
+							break;
+						case "@":
+							output += date.getTime();
+							break;
+						case "!":
+							output += date.getTime() * 10000 + this._ticksTo1970;
+							break;
+						case "'":
+							if ( lookAhead( "'" ) ) {
+								output += "'";
+							} else {
+								literal = true;
+							}
+							break;
+						default:
+							output += format.charAt( iFormat );
+					}
+				}
+			}
+		}
+		return output;
+	},
+
+	/* Extract all possible characters from the date format. */
+	_possibleChars: function( format ) {
+		var iFormat,
+			chars = "",
+			literal = false,
+
+			// Check whether a format character is doubled
+			lookAhead = function( match ) {
+				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
+				if ( matches ) {
+					iFormat++;
+				}
+				return matches;
+			};
+
+		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
+			if ( literal ) {
+				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
+					literal = false;
+				} else {
+					chars += format.charAt( iFormat );
+				}
+			} else {
+				switch ( format.charAt( iFormat ) ) {
+					case "d": case "m": case "y": case "@":
+						chars += "0123456789";
+						break;
+					case "D": case "M":
+						return null; // Accept anything
+					case "'":
+						if ( lookAhead( "'" ) ) {
+							chars += "'";
+						} else {
+							literal = true;
+						}
+						break;
+					default:
+						chars += format.charAt( iFormat );
+				}
+			}
+		}
+		return chars;
+	},
+
+	/* Get a setting value, defaulting if necessary. */
+	_get: function( inst, name ) {
+		return inst.settings[ name ] !== undefined ?
+			inst.settings[ name ] : this._defaults[ name ];
+	},
+
+	/* Parse existing date and initialise date picker. */
+	_setDateFromField: function( inst, noDefault ) {
+		if ( inst.input.val() === inst.lastVal ) {
+			return;
+		}
+
+		var dateFormat = this._get( inst, "dateFormat" ),
+			dates = inst.lastVal = inst.input ? inst.input.val() : null,
+			defaultDate = this._getDefaultDate( inst ),
+			date = defaultDate,
+			settings = this._getFormatConfig( inst );
+
+		try {
+			date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
+		} catch ( event ) {
+			dates = ( noDefault ? "" : dates );
+		}
+		inst.selectedDay = date.getDate();
+		inst.drawMonth = inst.selectedMonth = date.getMonth();
+		inst.drawYear = inst.selectedYear = date.getFullYear();
+		inst.currentDay = ( dates ? date.getDate() : 0 );
+		inst.currentMonth = ( dates ? date.getMonth() : 0 );
+		inst.currentYear = ( dates ? date.getFullYear() : 0 );
+		this._adjustInstDate( inst );
+	},
+
+	/* Retrieve the default date shown on opening. */
+	_getDefaultDate: function( inst ) {
+		return this._restrictMinMax( inst,
+			this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) );
+	},
+
+	/* A date may be specified as an exact value or a relative one. */
+	_determineDate: function( inst, date, defaultDate ) {
+		var offsetNumeric = function( offset ) {
+				var date = new Date();
+				date.setDate( date.getDate() + offset );
+				return date;
+			},
+			offsetString = function( offset ) {
+				try {
+					return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
+						offset, $.datepicker._getFormatConfig( inst ) );
+				}
+				catch ( e ) {
+
+					// Ignore
+				}
+
+				var date = ( offset.toLowerCase().match( /^c/ ) ?
+					$.datepicker._getDate( inst ) : null ) || new Date(),
+					year = date.getFullYear(),
+					month = date.getMonth(),
+					day = date.getDate(),
+					pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
+					matches = pattern.exec( offset );
+
+				while ( matches ) {
+					switch ( matches[ 2 ] || "d" ) {
+						case "d" : case "D" :
+							day += parseInt( matches[ 1 ], 10 ); break;
+						case "w" : case "W" :
+							day += parseInt( matches[ 1 ], 10 ) * 7; break;
+						case "m" : case "M" :
+							month += parseInt( matches[ 1 ], 10 );
+							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
+							break;
+						case "y": case "Y" :
+							year += parseInt( matches[ 1 ], 10 );
+							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
+							break;
+					}
+					matches = pattern.exec( offset );
+				}
+				return new Date( year, month, day );
+			},
+			newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) :
+				( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );
+
+		newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate );
+		if ( newDate ) {
+			newDate.setHours( 0 );
+			newDate.setMinutes( 0 );
+			newDate.setSeconds( 0 );
+			newDate.setMilliseconds( 0 );
+		}
+		return this._daylightSavingAdjust( newDate );
+	},
+
+	/* Handle switch to/from daylight saving.
+	 * Hours may be non-zero on daylight saving cut-over:
+	 * > 12 when midnight changeover, but then cannot generate
+	 * midnight datetime, so jump to 1AM, otherwise reset.
+	 * @param  date  (Date) the date to check
+	 * @return  (Date) the corrected date
+	 */
+	_daylightSavingAdjust: function( date ) {
+		if ( !date ) {
+			return null;
+		}
+		date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
+		return date;
+	},
+
+	/* Set the date(s) directly. */
+	_setDate: function( inst, date, noChange ) {
+		var clear = !date,
+			origMonth = inst.selectedMonth,
+			origYear = inst.selectedYear,
+			newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );
+
+		inst.selectedDay = inst.currentDay = newDate.getDate();
+		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+		if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {
+			this._notifyChange( inst );
+		}
+		this._adjustInstDate( inst );
+		if ( inst.input ) {
+			inst.input.val( clear ? "" : this._formatDate( inst ) );
+		}
+	},
+
+	/* Retrieve the date(s) directly. */
+	_getDate: function( inst ) {
+		var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
+			this._daylightSavingAdjust( new Date(
+			inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
+			return startDate;
+	},
+
+	/* Attach the onxxx handlers.  These are declared statically so
+	 * they work with static code transformers like Caja.
+	 */
+	_attachHandlers: function( inst ) {
+		var stepMonths = this._get( inst, "stepMonths" ),
+			id = "#" + inst.id.replace( /\\\\/g, "\\" );
+		inst.dpDiv.find( "[data-handler]" ).map( function() {
+			var handler = {
+				prev: function() {
+					$.datepicker._adjustDate( id, -stepMonths, "M" );
+				},
+				next: function() {
+					$.datepicker._adjustDate( id, +stepMonths, "M" );
+				},
+				hide: function() {
+					$.datepicker._hideDatepicker();
+				},
+				today: function() {
+					$.datepicker._gotoToday( id );
+				},
+				selectDay: function() {
+					$.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this );
+					return false;
+				},
+				selectMonth: function() {
+					$.datepicker._selectMonthYear( id, this, "M" );
+					return false;
+				},
+				selectYear: function() {
+					$.datepicker._selectMonthYear( id, this, "Y" );
+					return false;
+				}
+			};
+			$( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] );
+		} );
+	},
+
+	/* Generate the HTML for the current state of the date picker. */
+	_generateHTML: function( inst ) {
+		var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
+			controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
+			monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
+			selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
+			cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
+			printDate, dRow, tbody, daySettings, otherMonth, unselectable,
+			tempDate = new Date(),
+			today = this._daylightSavingAdjust(
+				new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
+			isRTL = this._get( inst, "isRTL" ),
+			showButtonPanel = this._get( inst, "showButtonPanel" ),
+			hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ),
+			navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ),
+			numMonths = this._getNumberOfMonths( inst ),
+			showCurrentAtPos = this._get( inst, "showCurrentAtPos" ),
+			stepMonths = this._get( inst, "stepMonths" ),
+			isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),
+			currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :
+				new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),
+			minDate = this._getMinMaxDate( inst, "min" ),
+			maxDate = this._getMinMaxDate( inst, "max" ),
+			drawMonth = inst.drawMonth - showCurrentAtPos,
+			drawYear = inst.drawYear;
+
+		if ( drawMonth < 0 ) {
+			drawMonth += 12;
+			drawYear--;
+		}
+		if ( maxDate ) {
+			maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),
+				maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
+			maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );
+			while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
+				drawMonth--;
+				if ( drawMonth < 0 ) {
+					drawMonth = 11;
+					drawYear--;
+				}
+			}
+		}
+		inst.drawMonth = drawMonth;
+		inst.drawYear = drawYear;
+
+		prevText = this._get( inst, "prevText" );
+		prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,
+			this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),
+			this._getFormatConfig( inst ) ) );
+
+		prev = ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ?
+			"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
+			" title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" :
+			( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" ) );
+
+		nextText = this._get( inst, "nextText" );
+		nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,
+			this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),
+			this._getFormatConfig( inst ) ) );
+
+		next = ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ?
+			"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
+			" title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" :
+			( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" ) );
+
+		currentText = this._get( inst, "currentText" );
+		gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today );
+		currentText = ( !navigationAsDateFormat ? currentText :
+			this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );
+
+		controls = ( !inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
+			this._get( inst, "closeText" ) + "</button>" : "" );
+
+		buttonPanel = ( showButtonPanel ) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + ( isRTL ? controls : "" ) +
+			( this._isInRange( inst, gotoDate ) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
+			">" + currentText + "</button>" : "" ) + ( isRTL ? "" : controls ) + "</div>" : "";
+
+		firstDay = parseInt( this._get( inst, "firstDay" ), 10 );
+		firstDay = ( isNaN( firstDay ) ? 0 : firstDay );
+
+		showWeek = this._get( inst, "showWeek" );
+		dayNames = this._get( inst, "dayNames" );
+		dayNamesMin = this._get( inst, "dayNamesMin" );
+		monthNames = this._get( inst, "monthNames" );
+		monthNamesShort = this._get( inst, "monthNamesShort" );
+		beforeShowDay = this._get( inst, "beforeShowDay" );
+		showOtherMonths = this._get( inst, "showOtherMonths" );
+		selectOtherMonths = this._get( inst, "selectOtherMonths" );
+		defaultDate = this._getDefaultDate( inst );
+		html = "";
+
+		for ( row = 0; row < numMonths[ 0 ]; row++ ) {
+			group = "";
+			this.maxRows = 4;
+			for ( col = 0; col < numMonths[ 1 ]; col++ ) {
+				selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
+				cornerClass = " ui-corner-all";
+				calender = "";
+				if ( isMultiMonth ) {
+					calender += "<div class='ui-datepicker-group";
+					if ( numMonths[ 1 ] > 1 ) {
+						switch ( col ) {
+							case 0: calender += " ui-datepicker-group-first";
+								cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break;
+							case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last";
+								cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break;
+							default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
+						}
+					}
+					calender += "'>";
+				}
+				calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
+					( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
+					( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
+					this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
+					row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
+					"</div><table class='ui-datepicker-calendar'><thead>" +
+					"<tr>";
+				thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
+				for ( dow = 0; dow < 7; dow++ ) { // days of the week
+					day = ( dow + firstDay ) % 7;
+					thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" +
+						"<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>";
+				}
+				calender += thead + "</tr></thead><tbody>";
+				daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
+				if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
+					inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
+				}
+				leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
+				curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate
+				numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)
+				this.maxRows = numRows;
+				printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
+				for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows
+					calender += "<tr>";
+					tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
+						this._get( inst, "calculateWeek" )( printDate ) + "</td>" );
+					for ( dow = 0; dow < 7; dow++ ) { // create date picker days
+						daySettings = ( beforeShowDay ?
+							beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] );
+						otherMonth = ( printDate.getMonth() !== drawMonth );
+						unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||
+							( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );
+						tbody += "<td class='" +
+							( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends
+							( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months
+							( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
+							( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
+
+							// or defaultDate is current printedDate and defaultDate is selectedDate
+							" " + this._dayOverClass : "" ) + // highlight selected day
+							( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) +  // highlight unselectable days
+							( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
+							( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
+							( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
+							( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
+							( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
+							( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
+							( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
+							( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
+							( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
+							( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
+							"' href='#'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
+						printDate.setDate( printDate.getDate() + 1 );
+						printDate = this._daylightSavingAdjust( printDate );
+					}
+					calender += tbody + "</tr>";
+				}
+				drawMonth++;
+				if ( drawMonth > 11 ) {
+					drawMonth = 0;
+					drawYear++;
+				}
+				calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
+							( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
+				group += calender;
+			}
+			html += group;
+		}
+		html += buttonPanel;
+		inst._keyEvent = false;
+		return html;
+	},
+
+	/* Generate the month and year header. */
+	_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
+			secondary, monthNames, monthNamesShort ) {
+
+		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
+			changeMonth = this._get( inst, "changeMonth" ),
+			changeYear = this._get( inst, "changeYear" ),
+			showMonthAfterYear = this._get( inst, "showMonthAfterYear" ),
+			html = "<div class='ui-datepicker-title'>",
+			monthHtml = "";
+
+		// Month selection
+		if ( secondary || !changeMonth ) {
+			monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>";
+		} else {
+			inMinYear = ( minDate && minDate.getFullYear() === drawYear );
+			inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );
+			monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
+			for ( month = 0; month < 12; month++ ) {
+				if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {
+					monthHtml += "<option value='" + month + "'" +
+						( month === drawMonth ? " selected='selected'" : "" ) +
+						">" + monthNamesShort[ month ] + "</option>";
+				}
+			}
+			monthHtml += "</select>";
+		}
+
+		if ( !showMonthAfterYear ) {
+			html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" );
+		}
+
+		// Year selection
+		if ( !inst.yearshtml ) {
+			inst.yearshtml = "";
+			if ( secondary || !changeYear ) {
+				html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
+			} else {
+
+				// determine range of years to display
+				years = this._get( inst, "yearRange" ).split( ":" );
+				thisYear = new Date().getFullYear();
+				determineYear = function( value ) {
+					var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
+						( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
+						parseInt( value, 10 ) ) );
+					return ( isNaN( year ) ? thisYear : year );
+				};
+				year = determineYear( years[ 0 ] );
+				endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
+				year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
+				endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
+				inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
+				for ( ; year <= endYear; year++ ) {
+					inst.yearshtml += "<option value='" + year + "'" +
+						( year === drawYear ? " selected='selected'" : "" ) +
+						">" + year + "</option>";
+				}
+				inst.yearshtml += "</select>";
+
+				html += inst.yearshtml;
+				inst.yearshtml = null;
+			}
+		}
+
+		html += this._get( inst, "yearSuffix" );
+		if ( showMonthAfterYear ) {
+			html += ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" ) + monthHtml;
+		}
+		html += "</div>"; // Close datepicker_header
+		return html;
+	},
+
+	/* Adjust one of the date sub-fields. */
+	_adjustInstDate: function( inst, offset, period ) {
+		var year = inst.selectedYear + ( period === "Y" ? offset : 0 ),
+			month = inst.selectedMonth + ( period === "M" ? offset : 0 ),
+			day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ),
+			date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );
+
+		inst.selectedDay = date.getDate();
+		inst.drawMonth = inst.selectedMonth = date.getMonth();
+		inst.drawYear = inst.selectedYear = date.getFullYear();
+		if ( period === "M" || period === "Y" ) {
+			this._notifyChange( inst );
+		}
+	},
+
+	/* Ensure a date is within any min/max bounds. */
+	_restrictMinMax: function( inst, date ) {
+		var minDate = this._getMinMaxDate( inst, "min" ),
+			maxDate = this._getMinMaxDate( inst, "max" ),
+			newDate = ( minDate && date < minDate ? minDate : date );
+		return ( maxDate && newDate > maxDate ? maxDate : newDate );
+	},
+
+	/* Notify change of month/year. */
+	_notifyChange: function( inst ) {
+		var onChange = this._get( inst, "onChangeMonthYear" );
+		if ( onChange ) {
+			onChange.apply( ( inst.input ? inst.input[ 0 ] : null ),
+				[ inst.selectedYear, inst.selectedMonth + 1, inst ] );
+		}
+	},
+
+	/* Determine the number of months to show. */
+	_getNumberOfMonths: function( inst ) {
+		var numMonths = this._get( inst, "numberOfMonths" );
+		return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) );
+	},
+
+	/* Determine the current maximum date - ensure no time components are set. */
+	_getMinMaxDate: function( inst, minMax ) {
+		return this._determineDate( inst, this._get( inst, minMax + "Date" ), null );
+	},
+
+	/* Find the number of days in a given month. */
+	_getDaysInMonth: function( year, month ) {
+		return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
+	},
+
+	/* Find the day of the week of the first of a month. */
+	_getFirstDayOfMonth: function( year, month ) {
+		return new Date( year, month, 1 ).getDay();
+	},
+
+	/* Determines if we should allow a "next/prev" month display change. */
+	_canAdjustMonth: function( inst, offset, curYear, curMonth ) {
+		var numMonths = this._getNumberOfMonths( inst ),
+			date = this._daylightSavingAdjust( new Date( curYear,
+			curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
+
+		if ( offset < 0 ) {
+			date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
+		}
+		return this._isInRange( inst, date );
+	},
+
+	/* Is the given date in the accepted range? */
+	_isInRange: function( inst, date ) {
+		var yearSplit, currentYear,
+			minDate = this._getMinMaxDate( inst, "min" ),
+			maxDate = this._getMinMaxDate( inst, "max" ),
+			minYear = null,
+			maxYear = null,
+			years = this._get( inst, "yearRange" );
+			if ( years ) {
+				yearSplit = years.split( ":" );
+				currentYear = new Date().getFullYear();
+				minYear = parseInt( yearSplit[ 0 ], 10 );
+				maxYear = parseInt( yearSplit[ 1 ], 10 );
+				if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
+					minYear += currentYear;
+				}
+				if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
+					maxYear += currentYear;
+				}
+			}
+
+		return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
+			( !maxDate || date.getTime() <= maxDate.getTime() ) &&
+			( !minYear || date.getFullYear() >= minYear ) &&
+			( !maxYear || date.getFullYear() <= maxYear ) );
+	},
+
+	/* Provide the configuration settings for formatting/parsing. */
+	_getFormatConfig: function( inst ) {
+		var shortYearCutoff = this._get( inst, "shortYearCutoff" );
+		shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff :
+			new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );
+		return { shortYearCutoff: shortYearCutoff,
+			dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ),
+			monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) };
+	},
+
+	/* Format the given date for display. */
+	_formatDate: function( inst, day, month, year ) {
+		if ( !day ) {
+			inst.currentDay = inst.selectedDay;
+			inst.currentMonth = inst.selectedMonth;
+			inst.currentYear = inst.selectedYear;
+		}
+		var date = ( day ? ( typeof day === "object" ? day :
+			this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
+			this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
+		return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
+	}
+} );
+
+/*
+ * Bind hover events for datepicker elements.
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
+ * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
+ */
+function datepicker_bindHover( dpDiv ) {
+	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
+	return dpDiv.on( "mouseout", selector, function() {
+			$( this ).removeClass( "ui-state-hover" );
+			if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
+				$( this ).removeClass( "ui-datepicker-prev-hover" );
+			}
+			if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
+				$( this ).removeClass( "ui-datepicker-next-hover" );
+			}
+		} )
+		.on( "mouseover", selector, datepicker_handleMouseover );
+}
+
+function datepicker_handleMouseover() {
+	if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
+		$( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
+		$( this ).addClass( "ui-state-hover" );
+		if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
+			$( this ).addClass( "ui-datepicker-prev-hover" );
+		}
+		if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
+			$( this ).addClass( "ui-datepicker-next-hover" );
+		}
+	}
+}
+
+/* jQuery extend now ignores nulls! */
+function datepicker_extendRemove( target, props ) {
+	$.extend( target, props );
+	for ( var name in props ) {
+		if ( props[ name ] == null ) {
+			target[ name ] = props[ name ];
+		}
+	}
+	return target;
+}
+
+/* Invoke the datepicker functionality.
+   @param  options  string - a command, optionally followed by additional parameters or
+					Object - settings for attaching new datepicker functionality
+   @return  jQuery object */
+$.fn.datepicker = function( options ) {
+
+	/* Verify an empty collection wasn't passed - Fixes #6976 */
+	if ( !this.length ) {
+		return this;
+	}
+
+	/* Initialise the date picker. */
+	if ( !$.datepicker.initialized ) {
+		$( document ).on( "mousedown", $.datepicker._checkExternalClick );
+		$.datepicker.initialized = true;
+	}
+
+	/* Append datepicker main container to body if not exist. */
+	if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) {
+		$( "body" ).append( $.datepicker.dpDiv );
+	}
+
+	var otherArgs = Array.prototype.slice.call( arguments, 1 );
+	if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
+		return $.datepicker[ "_" + options + "Datepicker" ].
+			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
+	}
+	if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
+		return $.datepicker[ "_" + options + "Datepicker" ].
+			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
+	}
+	return this.each( function() {
+		typeof options === "string" ?
+			$.datepicker[ "_" + options + "Datepicker" ].
+				apply( $.datepicker, [ this ].concat( otherArgs ) ) :
+			$.datepicker._attachDatepicker( this, options );
+	} );
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.12.1";
+
+return $.datepicker;
+
+} ) );
+
+
+/*!
+ * jQuery UI Widget 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Widget
+//>>group: Core
+//>>description: Provides a factory for creating stateful widgets with a common API.
+//>>docs: http://api.jqueryui.com/jQuery.widget/
+//>>demos: http://jqueryui.com/widget/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+var widgetUuid = 0;
+var widgetSlice = Array.prototype.slice;
+
+$.cleanData = ( function( orig ) {
+	return function( elems ) {
+		var events, elem, i;
+		for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
+			try {
+
+				// Only trigger remove when necessary to save time
+				events = $._data( elem, "events" );
+				if ( events && events.remove ) {
+					$( elem ).triggerHandler( "remove" );
+				}
+
+			// Http://bugs.jquery.com/ticket/8235
+			} catch ( e ) {}
+		}
+		orig( elems );
+	};
+} )( $.cleanData );
+
+$.widget = function( name, base, prototype ) {
+	var existingConstructor, constructor, basePrototype;
+
+	// ProxiedPrototype allows the provided prototype to remain unmodified
+	// so that it can be used as a mixin for multiple widgets (#8876)
+	var proxiedPrototype = {};
+
+	var namespace = name.split( "." )[ 0 ];
+	name = name.split( "." )[ 1 ];
+	var fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	if ( $.isArray( prototype ) ) {
+		prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
+	}
+
+	// Create selector for plugin
+	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+		return !!$.data( elem, fullName );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	existingConstructor = $[ namespace ][ name ];
+	constructor = $[ namespace ][ name ] = function( options, element ) {
+
+		// Allow instantiation without "new" keyword
+		if ( !this._createWidget ) {
+			return new constructor( options, element );
+		}
+
+		// Allow instantiation without initializing for simple inheritance
+		// must use "new" keyword (the code above always passes args)
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+
+	// Extend with the existing constructor to carry over any static properties
+	$.extend( constructor, existingConstructor, {
+		version: prototype.version,
+
+		// Copy the object used to create the prototype in case we need to
+		// redefine the widget later
+		_proto: $.extend( {}, prototype ),
+
+		// Track widgets that inherit from this widget in case this widget is
+		// redefined after a widget inherits from it
+		_childConstructors: []
+	} );
+
+	basePrototype = new base();
+
+	// We need to make the options hash a property directly on the new instance
+	// otherwise we'll modify the options hash on the prototype that we're
+	// inheriting from
+	basePrototype.options = $.widget.extend( {}, basePrototype.options );
+	$.each( prototype, function( prop, value ) {
+		if ( !$.isFunction( value ) ) {
+			proxiedPrototype[ prop ] = value;
+			return;
+		}
+		proxiedPrototype[ prop ] = ( function() {
+			function _super() {
+				return base.prototype[ prop ].apply( this, arguments );
+			}
+
+			function _superApply( args ) {
+				return base.prototype[ prop ].apply( this, args );
+			}
+
+			return function() {
+				var __super = this._super;
+				var __superApply = this._superApply;
+				var returnValue;
+
+				this._super = _super;
+				this._superApply = _superApply;
+
+				returnValue = value.apply( this, arguments );
+
+				this._super = __super;
+				this._superApply = __superApply;
+
+				return returnValue;
+			};
+		} )();
+	} );
+	constructor.prototype = $.widget.extend( basePrototype, {
+
+		// TODO: remove support for widgetEventPrefix
+		// always use the name + a colon as the prefix, e.g., draggable:start
+		// don't prefix for widgets that aren't DOM-based
+		widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
+	}, proxiedPrototype, {
+		constructor: constructor,
+		namespace: namespace,
+		widgetName: name,
+		widgetFullName: fullName
+	} );
+
+	// If this widget is being redefined then we need to find all widgets that
+	// are inheriting from it and redefine all of them so that they inherit from
+	// the new version of this widget. We're essentially trying to replace one
+	// level in the prototype chain.
+	if ( existingConstructor ) {
+		$.each( existingConstructor._childConstructors, function( i, child ) {
+			var childPrototype = child.prototype;
+
+			// Redefine the child widget using the same prototype that was
+			// originally used, but inherit from the new version of the base
+			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
+				child._proto );
+		} );
+
+		// Remove the list of existing child constructors from the old constructor
+		// so the old child constructors can be garbage collected
+		delete existingConstructor._childConstructors;
+	} else {
+		base._childConstructors.push( constructor );
+	}
+
+	$.widget.bridge( name, constructor );
+
+	return constructor;
+};
+
+$.widget.extend = function( target ) {
+	var input = widgetSlice.call( arguments, 1 );
+	var inputIndex = 0;
+	var inputLength = input.length;
+	var key;
+	var value;
+
+	for ( ; inputIndex < inputLength; inputIndex++ ) {
+		for ( key in input[ inputIndex ] ) {
+			value = input[ inputIndex ][ key ];
+			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+
+				// Clone objects
+				if ( $.isPlainObject( value ) ) {
+					target[ key ] = $.isPlainObject( target[ key ] ) ?
+						$.widget.extend( {}, target[ key ], value ) :
+
+						// Don't extend strings, arrays, etc. with objects
+						$.widget.extend( {}, value );
+
+				// Copy everything else by reference
+				} else {
+					target[ key ] = value;
+				}
+			}
+		}
+	}
+	return target;
+};
+
+$.widget.bridge = function( name, object ) {
+	var fullName = object.prototype.widgetFullName || name;
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string";
+		var args = widgetSlice.call( arguments, 1 );
+		var returnValue = this;
+
+		if ( isMethodCall ) {
+
+			// If this is an empty collection, we need to have the instance method
+			// return undefined instead of the jQuery instance
+			if ( !this.length && options === "instance" ) {
+				returnValue = undefined;
+			} else {
+				this.each( function() {
+					var methodValue;
+					var instance = $.data( this, fullName );
+
+					if ( options === "instance" ) {
+						returnValue = instance;
+						return false;
+					}
+
+					if ( !instance ) {
+						return $.error( "cannot call methods on " + name +
+							" prior to initialization; " +
+							"attempted to call method '" + options + "'" );
+					}
+
+					if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) {
+						return $.error( "no such method '" + options + "' for " + name +
+							" widget instance" );
+					}
+
+					methodValue = instance[ options ].apply( instance, args );
+
+					if ( methodValue !== instance && methodValue !== undefined ) {
+						returnValue = methodValue && methodValue.jquery ?
+							returnValue.pushStack( methodValue.get() ) :
+							methodValue;
+						return false;
+					}
+				} );
+			}
+		} else {
+
+			// Allow multiple hashes to be passed on init
+			if ( args.length ) {
+				options = $.widget.extend.apply( null, [ options ].concat( args ) );
+			}
+
+			this.each( function() {
+				var instance = $.data( this, fullName );
+				if ( instance ) {
+					instance.option( options || {} );
+					if ( instance._init ) {
+						instance._init();
+					}
+				} else {
+					$.data( this, fullName, new object( options, this ) );
+				}
+			} );
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( /* options, element */ ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	defaultElement: "<div>",
+
+	options: {
+		classes: {},
+		disabled: false,
+
+		// Callbacks
+		create: null
+	},
+
+	_createWidget: function( options, element ) {
+		element = $( element || this.defaultElement || this )[ 0 ];
+		this.element = $( element );
+		this.uuid = widgetUuid++;
+		this.eventNamespace = "." + this.widgetName + this.uuid;
+
+		this.bindings = $();
+		this.hoverable = $();
+		this.focusable = $();
+		this.classesElementLookup = {};
+
+		if ( element !== this ) {
+			$.data( element, this.widgetFullName, this );
+			this._on( true, this.element, {
+				remove: function( event ) {
+					if ( event.target === element ) {
+						this.destroy();
+					}
+				}
+			} );
+			this.document = $( element.style ?
+
+				// Element within the document
+				element.ownerDocument :
+
+				// Element is window or document
+				element.document || element );
+			this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
+		}
+
+		this.options = $.widget.extend( {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		this._create();
+
+		if ( this.options.disabled ) {
+			this._setOptionDisabled( this.options.disabled );
+		}
+
+		this._trigger( "create", null, this._getCreateEventData() );
+		this._init();
+	},
+
+	_getCreateOptions: function() {
+		return {};
+	},
+
+	_getCreateEventData: $.noop,
+
+	_create: $.noop,
+
+	_init: $.noop,
+
+	destroy: function() {
+		var that = this;
+
+		this._destroy();
+		$.each( this.classesElementLookup, function( key, value ) {
+			that._removeClass( value, key );
+		} );
+
+		// We can probably remove the unbind calls in 2.0
+		// all event bindings should go through this._on()
+		this.element
+			.off( this.eventNamespace )
+			.removeData( this.widgetFullName );
+		this.widget()
+			.off( this.eventNamespace )
+			.removeAttr( "aria-disabled" );
+
+		// Clean up events and states
+		this.bindings.off( this.eventNamespace );
+	},
+
+	_destroy: $.noop,
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key;
+		var parts;
+		var curOption;
+		var i;
+
+		if ( arguments.length === 0 ) {
+
+			// Don't return a reference to the internal hash
+			return $.widget.extend( {}, this.options );
+		}
+
+		if ( typeof key === "string" ) {
+
+			// Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+			options = {};
+			parts = key.split( "." );
+			key = parts.shift();
+			if ( parts.length ) {
+				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+				for ( i = 0; i < parts.length - 1; i++ ) {
+					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+					curOption = curOption[ parts[ i ] ];
+				}
+				key = parts.pop();
+				if ( arguments.length === 1 ) {
+					return curOption[ key ] === undefined ? null : curOption[ key ];
+				}
+				curOption[ key ] = value;
+			} else {
+				if ( arguments.length === 1 ) {
+					return this.options[ key ] === undefined ? null : this.options[ key ];
+				}
+				options[ key ] = value;
+			}
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+
+	_setOptions: function( options ) {
+		var key;
+
+		for ( key in options ) {
+			this._setOption( key, options[ key ] );
+		}
+
+		return this;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "classes" ) {
+			this._setOptionClasses( value );
+		}
+
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this._setOptionDisabled( value );
+		}
+
+		return this;
+	},
+
+	_setOptionClasses: function( value ) {
+		var classKey, elements, currentElements;
+
+		for ( classKey in value ) {
+			currentElements = this.classesElementLookup[ classKey ];
+			if ( value[ classKey ] === this.options.classes[ classKey ] ||
+					!currentElements ||
+					!currentElements.length ) {
+				continue;
+			}
+
+			// We are doing this to create a new jQuery object because the _removeClass() call
+			// on the next line is going to destroy the reference to the current elements being
+			// tracked. We need to save a copy of this collection so that we can add the new classes
+			// below.
+			elements = $( currentElements.get() );
+			this._removeClass( currentElements, classKey );
+
+			// We don't use _addClass() here, because that uses this.options.classes
+			// for generating the string of classes. We want to use the value passed in from
+			// _setOption(), this is the new value of the classes option which was passed to
+			// _setOption(). We pass this value directly to _classes().
+			elements.addClass( this._classes( {
+				element: elements,
+				keys: classKey,
+				classes: value,
+				add: true
+			} ) );
+		}
+	},
+
+	_setOptionDisabled: function( value ) {
+		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
+
+		// If the widget is becoming disabled, then nothing is interactive
+		if ( value ) {
+			this._removeClass( this.hoverable, null, "ui-state-hover" );
+			this._removeClass( this.focusable, null, "ui-state-focus" );
+		}
+	},
+
+	enable: function() {
+		return this._setOptions( { disabled: false } );
+	},
+
+	disable: function() {
+		return this._setOptions( { disabled: true } );
+	},
+
+	_classes: function( options ) {
+		var full = [];
+		var that = this;
+
+		options = $.extend( {
+			element: this.element,
+			classes: this.options.classes || {}
+		}, options );
+
+		function processClassString( classes, checkOption ) {
+			var current, i;
+			for ( i = 0; i < classes.length; i++ ) {
+				current = that.classesElementLookup[ classes[ i ] ] || $();
+				if ( options.add ) {
+					current = $( $.unique( current.get().concat( options.element.get() ) ) );
+				} else {
+					current = $( current.not( options.element ).get() );
+				}
+				that.classesElementLookup[ classes[ i ] ] = current;
+				full.push( classes[ i ] );
+				if ( checkOption && options.classes[ classes[ i ] ] ) {
+					full.push( options.classes[ classes[ i ] ] );
+				}
+			}
+		}
+
+		this._on( options.element, {
+			"remove": "_untrackClassesElement"
+		} );
+
+		if ( options.keys ) {
+			processClassString( options.keys.match( /\S+/g ) || [], true );
+		}
+		if ( options.extra ) {
+			processClassString( options.extra.match( /\S+/g ) || [] );
+		}
+
+		return full.join( " " );
+	},
+
+	_untrackClassesElement: function( event ) {
+		var that = this;
+		$.each( that.classesElementLookup, function( key, value ) {
+			if ( $.inArray( event.target, value ) !== -1 ) {
+				that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
+			}
+		} );
+	},
+
+	_removeClass: function( element, keys, extra ) {
+		return this._toggleClass( element, keys, extra, false );
+	},
+
+	_addClass: function( element, keys, extra ) {
+		return this._toggleClass( element, keys, extra, true );
+	},
+
+	_toggleClass: function( element, keys, extra, add ) {
+		add = ( typeof add === "boolean" ) ? add : extra;
+		var shift = ( typeof element === "string" || element === null ),
+			options = {
+				extra: shift ? keys : extra,
+				keys: shift ? element : keys,
+				element: shift ? this.element : element,
+				add: add
+			};
+		options.element.toggleClass( this._classes( options ), add );
+		return this;
+	},
+
+	_on: function( suppressDisabledCheck, element, handlers ) {
+		var delegateElement;
+		var instance = this;
+
+		// No suppressDisabledCheck flag, shuffle arguments
+		if ( typeof suppressDisabledCheck !== "boolean" ) {
+			handlers = element;
+			element = suppressDisabledCheck;
+			suppressDisabledCheck = false;
+		}
+
+		// No element argument, shuffle and use this.element
+		if ( !handlers ) {
+			handlers = element;
+			element = this.element;
+			delegateElement = this.widget();
+		} else {
+			element = delegateElement = $( element );
+			this.bindings = this.bindings.add( element );
+		}
+
+		$.each( handlers, function( event, handler ) {
+			function handlerProxy() {
+
+				// Allow widgets to customize the disabled handling
+				// - disabled as an array instead of boolean
+				// - disabled class as method for disabling individual parts
+				if ( !suppressDisabledCheck &&
+						( instance.options.disabled === true ||
+						$( this ).hasClass( "ui-state-disabled" ) ) ) {
+					return;
+				}
+				return ( typeof handler === "string" ? instance[ handler ] : handler )
+					.apply( instance, arguments );
+			}
+
+			// Copy the guid so direct unbinding works
+			if ( typeof handler !== "string" ) {
+				handlerProxy.guid = handler.guid =
+					handler.guid || handlerProxy.guid || $.guid++;
+			}
+
+			var match = event.match( /^([\w:-]*)\s*(.*)$/ );
+			var eventName = match[ 1 ] + instance.eventNamespace;
+			var selector = match[ 2 ];
+
+			if ( selector ) {
+				delegateElement.on( eventName, selector, handlerProxy );
+			} else {
+				element.on( eventName, handlerProxy );
+			}
+		} );
+	},
+
+	_off: function( element, eventName ) {
+		eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
+			this.eventNamespace;
+		element.off( eventName ).off( eventName );
+
+		// Clear the stack to avoid memory leaks (#10056)
+		this.bindings = $( this.bindings.not( element ).get() );
+		this.focusable = $( this.focusable.not( element ).get() );
+		this.hoverable = $( this.hoverable.not( element ).get() );
+	},
+
+	_delay: function( handler, delay ) {
+		function handlerProxy() {
+			return ( typeof handler === "string" ? instance[ handler ] : handler )
+				.apply( instance, arguments );
+		}
+		var instance = this;
+		return setTimeout( handlerProxy, delay || 0 );
+	},
+
+	_hoverable: function( element ) {
+		this.hoverable = this.hoverable.add( element );
+		this._on( element, {
+			mouseenter: function( event ) {
+				this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
+			},
+			mouseleave: function( event ) {
+				this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
+			}
+		} );
+	},
+
+	_focusable: function( element ) {
+		this.focusable = this.focusable.add( element );
+		this._on( element, {
+			focusin: function( event ) {
+				this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
+			},
+			focusout: function( event ) {
+				this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
+			}
+		} );
+	},
+
+	_trigger: function( type, event, data ) {
+		var prop, orig;
+		var callback = this.options[ type ];
+
+		data = data || {};
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+
+		// The original event may come from any element
+		// so we need to reset the target on the new event
+		event.target = this.element[ 0 ];
+
+		// Copy original event properties over to the new event
+		orig = event.originalEvent;
+		if ( orig ) {
+			for ( prop in orig ) {
+				if ( !( prop in event ) ) {
+					event[ prop ] = orig[ prop ];
+				}
+			}
+		}
+
+		this.element.trigger( event, data );
+		return !( $.isFunction( callback ) &&
+			callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+		if ( typeof options === "string" ) {
+			options = { effect: options };
+		}
+
+		var hasOptions;
+		var effectName = !options ?
+			method :
+			options === true || typeof options === "number" ?
+				defaultEffect :
+				options.effect || defaultEffect;
+
+		options = options || {};
+		if ( typeof options === "number" ) {
+			options = { duration: options };
+		}
+
+		hasOptions = !$.isEmptyObject( options );
+		options.complete = callback;
+
+		if ( options.delay ) {
+			element.delay( options.delay );
+		}
+
+		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
+			element[ method ]( options );
+		} else if ( effectName !== method && element[ effectName ] ) {
+			element[ effectName ]( options.duration, options.easing, callback );
+		} else {
+			element.queue( function( next ) {
+				$( this )[ method ]();
+				if ( callback ) {
+					callback.call( element[ 0 ] );
+				}
+				next();
+			} );
+		}
+	};
+} );
+
+return $.widget;
+
+} ) );
+
+
+/*!
+ * jQuery UI Controlgroup 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Controlgroup
+//>>group: Widgets
+//>>description: Visually groups form control widgets
+//>>docs: http://api.jqueryui.com/controlgroup/
+//>>demos: http://jqueryui.com/controlgroup/
+//>>css.structure: ../../themes/base/core.css
+//>>css.structure: ../../themes/base/controlgroup.css
+//>>css.theme: ../../themes/base/theme.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
+
+return $.widget( "ui.controlgroup", {
+	version: "1.12.1",
+	defaultElement: "<div>",
+	options: {
+		direction: "horizontal",
+		disabled: null,
+		onlyVisible: true,
+		items: {
+			"button": "input[type=button], input[type=submit], input[type=reset], button, a",
+			"controlgroupLabel": ".ui-controlgroup-label",
+			"checkboxradio": "input[type='checkbox'], input[type='radio']",
+			"selectmenu": "select",
+			"spinner": ".ui-spinner-input"
+		}
+	},
+
+	_create: function() {
+		this._enhance();
+	},
+
+	// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
+	_enhance: function() {
+		this.element.attr( "role", "toolbar" );
+		this.refresh();
+	},
+
+	_destroy: function() {
+		this._callChildMethod( "destroy" );
+		this.childWidgets.removeData( "ui-controlgroup-data" );
+		this.element.removeAttr( "role" );
+		if ( this.options.items.controlgroupLabel ) {
+			this.element
+				.find( this.options.items.controlgroupLabel )
+				.find( ".ui-controlgroup-label-contents" )
+				.contents().unwrap();
+		}
+	},
+
+	_initWidgets: function() {
+		var that = this,
+			childWidgets = [];
+
+		// First we iterate over each of the items options
+		$.each( this.options.items, function( widget, selector ) {
+			var labels;
+			var options = {};
+
+			// Make sure the widget has a selector set
+			if ( !selector ) {
+				return;
+			}
+
+			if ( widget === "controlgroupLabel" ) {
+				labels = that.element.find( selector );
+				labels.each( function() {
+					var element = $( this );
+
+					if ( element.children( ".ui-controlgroup-label-contents" ).length ) {
+						return;
+					}
+					element.contents()
+						.wrapAll( "<span class='ui-controlgroup-label-contents'></span>" );
+				} );
+				that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" );
+				childWidgets = childWidgets.concat( labels.get() );
+				return;
+			}
+
+			// Make sure the widget actually exists
+			if ( !$.fn[ widget ] ) {
+				return;
+			}
+
+			// We assume everything is in the middle to start because we can't determine
+			// first / last elements until all enhancments are done.
+			if ( that[ "_" + widget + "Options" ] ) {
+				options = that[ "_" + widget + "Options" ]( "middle" );
+			} else {
+				options = { classes: {} };
+			}
+
+			// Find instances of this widget inside controlgroup and init them
+			that.element
+				.find( selector )
+				.each( function() {
+					var element = $( this );
+					var instance = element[ widget ]( "instance" );
+
+					// We need to clone the default options for this type of widget to avoid
+					// polluting the variable options which has a wider scope than a single widget.
+					var instanceOptions = $.widget.extend( {}, options );
+
+					// If the button is the child of a spinner ignore it
+					// TODO: Find a more generic solution
+					if ( widget === "button" && element.parent( ".ui-spinner" ).length ) {
+						return;
+					}
+
+					// Create the widget if it doesn't exist
+					if ( !instance ) {
+						instance = element[ widget ]()[ widget ]( "instance" );
+					}
+					if ( instance ) {
+						instanceOptions.classes =
+							that._resolveClassesValues( instanceOptions.classes, instance );
+					}
+					element[ widget ]( instanceOptions );
+
+					// Store an instance of the controlgroup to be able to reference
+					// from the outermost element for changing options and refresh
+					var widgetElement = element[ widget ]( "widget" );
+					$.data( widgetElement[ 0 ], "ui-controlgroup-data",
+						instance ? instance : element[ widget ]( "instance" ) );
+
+					childWidgets.push( widgetElement[ 0 ] );
+				} );
+		} );
+
+		this.childWidgets = $( $.unique( childWidgets ) );
+		this._addClass( this.childWidgets, "ui-controlgroup-item" );
+	},
+
+	_callChildMethod: function( method ) {
+		this.childWidgets.each( function() {
+			var element = $( this ),
+				data = element.data( "ui-controlgroup-data" );
+			if ( data && data[ method ] ) {
+				data[ method ]();
+			}
+		} );
+	},
+
+	_updateCornerClass: function( element, position ) {
+		var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
+		var add = this._buildSimpleOptions( position, "label" ).classes.label;
+
+		this._removeClass( element, null, remove );
+		this._addClass( element, null, add );
+	},
+
+	_buildSimpleOptions: function( position, key ) {
+		var direction = this.options.direction === "vertical";
+		var result = {
+			classes: {}
+		};
+		result.classes[ key ] = {
+			"middle": "",
+			"first": "ui-corner-" + ( direction ? "top" : "left" ),
+			"last": "ui-corner-" + ( direction ? "bottom" : "right" ),
+			"only": "ui-corner-all"
+		}[ position ];
+
+		return result;
+	},
+
+	_spinnerOptions: function( position ) {
+		var options = this._buildSimpleOptions( position, "ui-spinner" );
+
+		options.classes[ "ui-spinner-up" ] = "";
+		options.classes[ "ui-spinner-down" ] = "";
+
+		return options;
+	},
+
+	_buttonOptions: function( position ) {
+		return this._buildSimpleOptions( position, "ui-button" );
+	},
+
+	_checkboxradioOptions: function( position ) {
+		return this._buildSimpleOptions( position, "ui-checkboxradio-label" );
+	},
+
+	_selectmenuOptions: function( position ) {
+		var direction = this.options.direction === "vertical";
+		return {
+			width: direction ? "auto" : false,
+			classes: {
+				middle: {
+					"ui-selectmenu-button-open": "",
+					"ui-selectmenu-button-closed": ""
+				},
+				first: {
+					"ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
+					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
+				},
+				last: {
+					"ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
+					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
+				},
+				only: {
+					"ui-selectmenu-button-open": "ui-corner-top",
+					"ui-selectmenu-button-closed": "ui-corner-all"
+				}
+
+			}[ position ]
+		};
+	},
+
+	_resolveClassesValues: function( classes, instance ) {
+		var result = {};
+		$.each( classes, function( key ) {
+			var current = instance.options.classes[ key ] || "";
+			current = $.trim( current.replace( controlgroupCornerRegex, "" ) );
+			result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " );
+		} );
+		return result;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "direction" ) {
+			this._removeClass( "ui-controlgroup-" + this.options.direction );
+		}
+
+		this._super( key, value );
+		if ( key === "disabled" ) {
+			this._callChildMethod( value ? "disable" : "enable" );
+			return;
+		}
+
+		this.refresh();
+	},
+
+	refresh: function() {
+		var children,
+			that = this;
+
+		this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
+
+		if ( this.options.direction === "horizontal" ) {
+			this._addClass( null, "ui-helper-clearfix" );
+		}
+		this._initWidgets();
+
+		children = this.childWidgets;
+
+		// We filter here because we need to track all childWidgets not just the visible ones
+		if ( this.options.onlyVisible ) {
+			children = children.filter( ":visible" );
+		}
+
+		if ( children.length ) {
+
+			// We do this last because we need to make sure all enhancment is done
+			// before determining first and last
+			$.each( [ "first", "last" ], function( index, value ) {
+				var instance = children[ value ]().data( "ui-controlgroup-data" );
+
+				if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
+					var options = that[ "_" + instance.widgetName + "Options" ](
+						children.length === 1 ? "only" : value
+					);
+					options.classes = that._resolveClassesValues( options.classes, instance );
+					instance.element[ instance.widgetName ]( options );
+				} else {
+					that._updateCornerClass( children[ value ](), value );
+				}
+			} );
+
+			// Finally call the refresh method on each of the child widgets.
+			this._callChildMethod( "refresh" );
+		}
+	}
+} );
+} ) );
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+// Internal use only
+return $.ui.escapeSelector = ( function() {
+	var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;
+	return function( selector ) {
+		return selector.replace( selectorEscape, "\\$1" );
+	};
+} )();
+
+} ) );
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+// Support: IE8 Only
+// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
+// with a string, so we need to find the proper form.
+return $.fn.form = function() {
+	return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
+};
+
+} ) );
+
+
+
+/*!
+ * jQuery UI Form Reset Mixin 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Form Reset Mixin
+//>>group: Core
+//>>description: Refresh input widgets when their form is reset
+//>>docs: http://api.jqueryui.com/form-reset-mixin/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"./form",
+			"./version"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+return $.ui.formResetMixin = {
+	_formResetHandler: function() {
+		var form = $( this );
+
+		// Wait for the form reset to actually happen before refreshing
+		setTimeout( function() {
+			var instances = form.data( "ui-form-reset-instances" );
+			$.each( instances, function() {
+				this.refresh();
+			} );
+		} );
+	},
+
+	_bindFormResetHandler: function() {
+		this.form = this.element.form();
+		if ( !this.form.length ) {
+			return;
+		}
+
+		var instances = this.form.data( "ui-form-reset-instances" ) || [];
+		if ( !instances.length ) {
+
+			// We don't use _on() here because we use a single event handler per form
+			this.form.on( "reset.ui-form-reset", this._formResetHandler );
+		}
+		instances.push( this );
+		this.form.data( "ui-form-reset-instances", instances );
+	},
+
+	_unbindFormResetHandler: function() {
+		if ( !this.form.length ) {
+			return;
+		}
+
+		var instances = this.form.data( "ui-form-reset-instances" );
+		instances.splice( $.inArray( this, instances ), 1 );
+		if ( instances.length ) {
+			this.form.data( "ui-form-reset-instances", instances );
+		} else {
+			this.form
+				.removeData( "ui-form-reset-instances" )
+				.off( "reset.ui-form-reset" );
+		}
+	}
+};
+
+} ) );
+
+
+
+/*!
+ * jQuery UI Labels 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: labels
+//>>group: Core
+//>>description: Find all the labels associated with a given input
+//>>docs: http://api.jqueryui.com/labels/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version", "./escape-selector" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+return $.fn.labels = function() {
+	var ancestor, selector, id, labels, ancestors;
+
+	// Check control.labels first
+	if ( this[ 0 ].labels && this[ 0 ].labels.length ) {
+		return this.pushStack( this[ 0 ].labels );
+	}
+
+	// Support: IE <= 11, FF <= 37, Android <= 2.3 only
+	// Above browsers do not support control.labels. Everything below is to support them
+	// as well as document fragments. control.labels does not work on document fragments
+	labels = this.eq( 0 ).parents( "label" );
+
+	// Look for the label based on the id
+	id = this.attr( "id" );
+	if ( id ) {
+
+		// We don't search against the document in case the element
+		// is disconnected from the DOM
+		ancestor = this.eq( 0 ).parents().last();
+
+		// Get a full set of top level ancestors
+		ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );
+
+		// Create a selector for the label based on the id
+		selector = "label[for='" + $.ui.escapeSelector( id ) + "']";
+
+		labels = labels.add( ancestors.find( selector ).addBack( selector ) );
+
+	}
+
+	// Return whatever we have found for labels
+	return this.pushStack( labels );
+};
+
+} ) );
+
+
+
+
+
+/*!
+ * jQuery UI Checkboxradio 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Checkboxradio
+//>>group: Widgets
+//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
+//>>docs: http://api.jqueryui.com/checkboxradio/
+//>>demos: http://jqueryui.com/checkboxradio/
+//>>css.structure: ../../themes/base/core.css
+//>>css.structure: ../../themes/base/button.css
+//>>css.structure: ../../themes/base/checkboxradio.css
+//>>css.theme: ../../themes/base/theme.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"../escape-selector",
+			"../form-reset-mixin",
+			"../labels",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
+	version: "1.12.1",
+	options: {
+		disabled: null,
+		label: null,
+		icon: true,
+		classes: {
+			"ui-checkboxradio-label": "ui-corner-all",
+			"ui-checkboxradio-icon": "ui-corner-all"
+		}
+	},
+
+	_getCreateOptions: function() {
+		var disabled, labels;
+		var that = this;
+		var options = this._super() || {};
+
+		// We read the type here, because it makes more sense to throw a element type error first,
+		// rather then the error for lack of a label. Often if its the wrong type, it
+		// won't have a label (e.g. calling on a div, btn, etc)
+		this._readType();
+
+		labels = this.element.labels();
+
+		// If there are multiple labels, use the last one
+		this.label = $( labels[ labels.length - 1 ] );
+		if ( !this.label.length ) {
+			$.error( "No label found for checkboxradio widget" );
+		}
+
+		this.originalLabel = "";
+
+		// We need to get the label text but this may also need to make sure it does not contain the
+		// input itself.
+		this.label.contents().not( this.element[ 0 ] ).each( function() {
+
+			// The label contents could be text, html, or a mix. We concat each element to get a
+			// string representation of the label, without the input as part of it.
+			that.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;
+		} );
+
+		// Set the label option if we found label text
+		if ( this.originalLabel ) {
+			options.label = this.originalLabel;
+		}
+
+		disabled = this.element[ 0 ].disabled;
+		if ( disabled != null ) {
+			options.disabled = disabled;
+		}
+		return options;
+	},
+
+	_create: function() {
+		var checked = this.element[ 0 ].checked;
+
+		this._bindFormResetHandler();
+
+		if ( this.options.disabled == null ) {
+			this.options.disabled = this.element[ 0 ].disabled;
+		}
+
+		this._setOption( "disabled", this.options.disabled );
+		this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" );
+		this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" );
+
+		if ( this.type === "radio" ) {
+			this._addClass( this.label, "ui-checkboxradio-radio-label" );
+		}
+
+		if ( this.options.label && this.options.label !== this.originalLabel ) {
+			this._updateLabel();
+		} else if ( this.originalLabel ) {
+			this.options.label = this.originalLabel;
+		}
+
+		this._enhance();
+
+		if ( checked ) {
+			this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" );
+			if ( this.icon ) {
+				this._addClass( this.icon, null, "ui-state-hover" );
+			}
+		}
+
+		this._on( {
+			change: "_toggleClasses",
+			focus: function() {
+				this._addClass( this.label, null, "ui-state-focus ui-visual-focus" );
+			},
+			blur: function() {
+				this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" );
+			}
+		} );
+	},
+
+	_readType: function() {
+		var nodeName = this.element[ 0 ].nodeName.toLowerCase();
+		this.type = this.element[ 0 ].type;
+		if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) {
+			$.error( "Can't create checkboxradio on element.nodeName=" + nodeName +
+				" and element.type=" + this.type );
+		}
+	},
+
+	// Support jQuery Mobile enhanced option
+	_enhance: function() {
+		this._updateIcon( this.element[ 0 ].checked );
+	},
+
+	widget: function() {
+		return this.label;
+	},
+
+	_getRadioGroup: function() {
+		var group;
+		var name = this.element[ 0 ].name;
+		var nameSelector = "input[name='" + $.ui.escapeSelector( name ) + "']";
+
+		if ( !name ) {
+			return $( [] );
+		}
+
+		if ( this.form.length ) {
+			group = $( this.form[ 0 ].elements ).filter( nameSelector );
+		} else {
+
+			// Not inside a form, check all inputs that also are not inside a form
+			group = $( nameSelector ).filter( function() {
+				return $( this ).form().length === 0;
+			} );
+		}
+
+		return group.not( this.element );
+	},
+
+	_toggleClasses: function() {
+		var checked = this.element[ 0 ].checked;
+		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
+
+		if ( this.options.icon && this.type === "checkbox" ) {
+			this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked )
+				._toggleClass( this.icon, null, "ui-icon-blank", !checked );
+		}
+
+		if ( this.type === "radio" ) {
+			this._getRadioGroup()
+				.each( function() {
+					var instance = $( this ).checkboxradio( "instance" );
+
+					if ( instance ) {
+						instance._removeClass( instance.label,
+							"ui-checkboxradio-checked", "ui-state-active" );
+					}
+				} );
+		}
+	},
+
+	_destroy: function() {
+		this._unbindFormResetHandler();
+
+		if ( this.icon ) {
+			this.icon.remove();
+			this.iconSpace.remove();
+		}
+	},
+
+	_setOption: function( key, value ) {
+
+		// We don't allow the value to be set to nothing
+		if ( key === "label" && !value ) {
+			return;
+		}
+
+		this._super( key, value );
+
+		if ( key === "disabled" ) {
+			this._toggleClass( this.label, null, "ui-state-disabled", value );
+			this.element[ 0 ].disabled = value;
+
+			// Don't refresh when setting disabled
+			return;
+		}
+		this.refresh();
+	},
+
+	_updateIcon: function( checked ) {
+		var toAdd = "ui-icon ui-icon-background ";
+
+		if ( this.options.icon ) {
+			if ( !this.icon ) {
+				this.icon = $( "<span>" );
+				this.iconSpace = $( "<span> </span>" );
+				this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" );
+			}
+
+			if ( this.type === "checkbox" ) {
+				toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
+				this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" );
+			} else {
+				toAdd += "ui-icon-blank";
+			}
+			this._addClass( this.icon, "ui-checkboxradio-icon", toAdd );
+			if ( !checked ) {
+				this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" );
+			}
+			this.icon.prependTo( this.label ).after( this.iconSpace );
+		} else if ( this.icon !== undefined ) {
+			this.icon.remove();
+			this.iconSpace.remove();
+			delete this.icon;
+		}
+	},
+
+	_updateLabel: function() {
+
+		// Remove the contents of the label ( minus the icon, icon space, and input )
+		var contents = this.label.contents().not( this.element[ 0 ] );
+		if ( this.icon ) {
+			contents = contents.not( this.icon[ 0 ] );
+		}
+		if ( this.iconSpace ) {
+			contents = contents.not( this.iconSpace[ 0 ] );
+		}
+		contents.remove();
+
+		this.label.append( this.options.label );
+	},
+
+	refresh: function() {
+		var checked = this.element[ 0 ].checked,
+			isDisabled = this.element[ 0 ].disabled;
+
+		this._updateIcon( checked );
+		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
+		if ( this.options.label !== null ) {
+			this._updateLabel();
+		}
+
+		if ( isDisabled !== this.options.disabled ) {
+			this._setOptions( { "disabled": isDisabled } );
+		}
+	}
+
+} ] );
+
+return $.ui.checkboxradio;
+
+} ) );
+
+
+
+
+
+/*!
+ * jQuery UI Button 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Button
+//>>group: Widgets
+//>>description: Enhances a form with themeable buttons.
+//>>docs: http://api.jqueryui.com/button/
+//>>demos: http://jqueryui.com/button/
+//>>css.structure: ../../themes/base/core.css
+//>>css.structure: ../../themes/base/button.css
+//>>css.theme: ../../themes/base/theme.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+
+			// These are only for backcompat
+			// TODO: Remove after 1.12
+			"./controlgroup",
+			"./checkboxradio",
+
+			"../keycode",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+$.widget( "ui.button", {
+	version: "1.12.1",
+	defaultElement: "<button>",
+	options: {
+		classes: {
+			"ui-button": "ui-corner-all"
+		},
+		disabled: null,
+		icon: null,
+		iconPosition: "beginning",
+		label: null,
+		showLabel: true
+	},
+
+	_getCreateOptions: function() {
+		var disabled,
+
+			// This is to support cases like in jQuery Mobile where the base widget does have
+			// an implementation of _getCreateOptions
+			options = this._super() || {};
+
+		this.isInput = this.element.is( "input" );
+
+		disabled = this.element[ 0 ].disabled;
+		if ( disabled != null ) {
+			options.disabled = disabled;
+		}
+
+		this.originalLabel = this.isInput ? this.element.val() : this.element.html();
+		if ( this.originalLabel ) {
+			options.label = this.originalLabel;
+		}
+
+		return options;
+	},
+
+	_create: function() {
+		if ( !this.option.showLabel & !this.options.icon ) {
+			this.options.showLabel = true;
+		}
+
+		// We have to check the option again here even though we did in _getCreateOptions,
+		// because null may have been passed on init which would override what was set in
+		// _getCreateOptions
+		if ( this.options.disabled == null ) {
+			this.options.disabled = this.element[ 0 ].disabled || false;
+		}
+
+		this.hasTitle = !!this.element.attr( "title" );
+
+		// Check to see if the label needs to be set or if its already correct
+		if ( this.options.label && this.options.label !== this.originalLabel ) {
+			if ( this.isInput ) {
+				this.element.val( this.options.label );
+			} else {
+				this.element.html( this.options.label );
+			}
+		}
+		this._addClass( "ui-button", "ui-widget" );
+		this._setOption( "disabled", this.options.disabled );
+		this._enhance();
+
+		if ( this.element.is( "a" ) ) {
+			this._on( {
+				"keyup": function( event ) {
+					if ( event.keyCode === $.ui.keyCode.SPACE ) {
+						event.preventDefault();
+
+						// Support: PhantomJS <= 1.9, IE 8 Only
+						// If a native click is available use it so we actually cause navigation
+						// otherwise just trigger a click event
+						if ( this.element[ 0 ].click ) {
+							this.element[ 0 ].click();
+						} else {
+							this.element.trigger( "click" );
+						}
+					}
+				}
+			} );
+		}
+	},
+
+	_enhance: function() {
+		if ( !this.element.is( "button" ) ) {
+			this.element.attr( "role", "button" );
+		}
+
+		if ( this.options.icon ) {
+			this._updateIcon( "icon", this.options.icon );
+			this._updateTooltip();
+		}
+	},
+
+	_updateTooltip: function() {
+		this.title = this.element.attr( "title" );
+
+		if ( !this.options.showLabel && !this.title ) {
+			this.element.attr( "title", this.options.label );
+		}
+	},
+
+	_updateIcon: function( option, value ) {
+		var icon = option !== "iconPosition",
+			position = icon ? this.options.iconPosition : value,
+			displayBlock = position === "top" || position === "bottom";
+
+		// Create icon
+		if ( !this.icon ) {
+			this.icon = $( "<span>" );
+
+			this._addClass( this.icon, "ui-button-icon", "ui-icon" );
+
+			if ( !this.options.showLabel ) {
+				this._addClass( "ui-button-icon-only" );
+			}
+		} else if ( icon ) {
+
+			// If we are updating the icon remove the old icon class
+			this._removeClass( this.icon, null, this.options.icon );
+		}
+
+		// If we are updating the icon add the new icon class
+		if ( icon ) {
+			this._addClass( this.icon, null, value );
+		}
+
+		this._attachIcon( position );
+
+		// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
+		// the iconSpace if there is one.
+		if ( displayBlock ) {
+			this._addClass( this.icon, null, "ui-widget-icon-block" );
+			if ( this.iconSpace ) {
+				this.iconSpace.remove();
+			}
+		} else {
+
+			// Position is beginning or end so remove the ui-widget-icon-block class and add the
+			// space if it does not exist
+			if ( !this.iconSpace ) {
+				this.iconSpace = $( "<span> </span>" );
+				this._addClass( this.iconSpace, "ui-button-icon-space" );
+			}
+			this._removeClass( this.icon, null, "ui-wiget-icon-block" );
+			this._attachIconSpace( position );
+		}
+	},
+
+	_destroy: function() {
+		this.element.removeAttr( "role" );
+
+		if ( this.icon ) {
+			this.icon.remove();
+		}
+		if ( this.iconSpace ) {
+			this.iconSpace.remove();
+		}
+		if ( !this.hasTitle ) {
+			this.element.removeAttr( "title" );
+		}
+	},
+
+	_attachIconSpace: function( iconPosition ) {
+		this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace );
+	},
+
+	_attachIcon: function( iconPosition ) {
+		this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon );
+	},
+
+	_setOptions: function( options ) {
+		var newShowLabel = options.showLabel === undefined ?
+				this.options.showLabel :
+				options.showLabel,
+			newIcon = options.icon === undefined ? this.options.icon : options.icon;
+
+		if ( !newShowLabel && !newIcon ) {
+			options.showLabel = true;
+		}
+		this._super( options );
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "icon" ) {
+			if ( value ) {
+				this._updateIcon( key, value );
+			} else if ( this.icon ) {
+				this.icon.remove();
+				if ( this.iconSpace ) {
+					this.iconSpace.remove();
+				}
+			}
+		}
+
+		if ( key === "iconPosition" ) {
+			this._updateIcon( key, value );
+		}
+
+		// Make sure we can't end up with a button that has neither text nor icon
+		if ( key === "showLabel" ) {
+				this._toggleClass( "ui-button-icon-only", null, !value );
+				this._updateTooltip();
+		}
+
+		if ( key === "label" ) {
+			if ( this.isInput ) {
+				this.element.val( value );
+			} else {
+
+				// If there is an icon, append it, else nothing then append the value
+				// this avoids removal of the icon when setting label text
+				this.element.html( value );
+				if ( this.icon ) {
+					this._attachIcon( this.options.iconPosition );
+					this._attachIconSpace( this.options.iconPosition );
+				}
+			}
+		}
+
+		this._super( key, value );
+
+		if ( key === "disabled" ) {
+			this._toggleClass( null, "ui-state-disabled", value );
+			this.element[ 0 ].disabled = value;
+			if ( value ) {
+				this.element.blur();
+			}
+		}
+	},
+
+	refresh: function() {
+
+		// Make sure to only check disabled if its an element that supports this otherwise
+		// check for the disabled class to determine state
+		var isDisabled = this.element.is( "input, button" ) ?
+			this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" );
+
+		if ( isDisabled !== this.options.disabled ) {
+			this._setOptions( { disabled: isDisabled } );
+		}
+
+		this._updateTooltip();
+	}
+} );
+
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+
+	// Text and Icons options
+	$.widget( "ui.button", $.ui.button, {
+		options: {
+			text: true,
+			icons: {
+				primary: null,
+				secondary: null
+			}
+		},
+
+		_create: function() {
+			if ( this.options.showLabel && !this.options.text ) {
+				this.options.showLabel = this.options.text;
+			}
+			if ( !this.options.showLabel && this.options.text ) {
+				this.options.text = this.options.showLabel;
+			}
+			if ( !this.options.icon && ( this.options.icons.primary ||
+					this.options.icons.secondary ) ) {
+				if ( this.options.icons.primary ) {
+					this.options.icon = this.options.icons.primary;
+				} else {
+					this.options.icon = this.options.icons.secondary;
+					this.options.iconPosition = "end";
+				}
+			} else if ( this.options.icon ) {
+				this.options.icons.primary = this.options.icon;
+			}
+			this._super();
+		},
+
+		_setOption: function( key, value ) {
+			if ( key === "text" ) {
+				this._super( "showLabel", value );
+				return;
+			}
+			if ( key === "showLabel" ) {
+				this.options.text = value;
+			}
+			if ( key === "icon" ) {
+				this.options.icons.primary = value;
+			}
+			if ( key === "icons" ) {
+				if ( value.primary ) {
+					this._super( "icon", value.primary );
+					this._super( "iconPosition", "beginning" );
+				} else if ( value.secondary ) {
+					this._super( "icon", value.secondary );
+					this._super( "iconPosition", "end" );
+				}
+			}
+			this._superApply( arguments );
+		}
+	} );
+
+	$.fn.button = ( function( orig ) {
+		return function() {
+			if ( !this.length || ( this.length && this[ 0 ].tagName !== "INPUT" ) ||
+					( this.length && this[ 0 ].tagName === "INPUT" && (
+						this.attr( "type" ) !== "checkbox" && this.attr( "type" ) !== "radio"
+					) ) ) {
+				return orig.apply( this, arguments );
+			}
+			if ( !$.ui.checkboxradio ) {
+				$.error( "Checkboxradio widget missing" );
+			}
+			if ( arguments.length === 0 ) {
+				return this.checkboxradio( {
+					"icon": false
+				} );
+			}
+			return this.checkboxradio.apply( this, arguments );
+		};
+	} )( $.fn.button );
+
+	$.fn.buttonset = function() {
+		if ( !$.ui.controlgroup ) {
+			$.error( "Controlgroup widget missing" );
+		}
+		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) {
+			return this.controlgroup.apply( this,
+				[ arguments[ 0 ], "items.button", arguments[ 2 ] ] );
+		}
+		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) {
+			return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] );
+		}
+		if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) {
+			arguments[ 0 ].items = {
+				button: arguments[ 0 ].items
+			};
+		}
+		return this.controlgroup.apply( this, arguments );
+	};
+}
+
+return $.ui.button;
+
+} ) );
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+// This file is deprecated
+return $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
+} ) );
+
+
+
+
+/*!
+ * jQuery UI Mouse 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Mouse
+//>>group: Widgets
+//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
+//>>docs: http://api.jqueryui.com/mouse/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"../ie",
+			"../version",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+var mouseHandled = false;
+$( document ).on( "mouseup", function() {
+	mouseHandled = false;
+} );
+
+return $.widget( "ui.mouse", {
+	version: "1.12.1",
+	options: {
+		cancel: "input, textarea, button, select, option",
+		distance: 1,
+		delay: 0
+	},
+	_mouseInit: function() {
+		var that = this;
+
+		this.element
+			.on( "mousedown." + this.widgetName, function( event ) {
+				return that._mouseDown( event );
+			} )
+			.on( "click." + this.widgetName, function( event ) {
+				if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
+					$.removeData( event.target, that.widgetName + ".preventClickEvent" );
+					event.stopImmediatePropagation();
+					return false;
+				}
+			} );
+
+		this.started = false;
+	},
+
+	// TODO: make sure destroying one instance of mouse doesn't mess with
+	// other instances of mouse
+	_mouseDestroy: function() {
+		this.element.off( "." + this.widgetName );
+		if ( this._mouseMoveDelegate ) {
+			this.document
+				.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+				.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
+		}
+	},
+
+	_mouseDown: function( event ) {
+
+		// don't let more than one widget handle mouseStart
+		if ( mouseHandled ) {
+			return;
+		}
+
+		this._mouseMoved = false;
+
+		// We may have missed mouseup (out of window)
+		( this._mouseStarted && this._mouseUp( event ) );
+
+		this._mouseDownEvent = event;
+
+		var that = this,
+			btnIsLeft = ( event.which === 1 ),
+
+			// event.target.nodeName works around a bug in IE 8 with
+			// disabled inputs (#7620)
+			elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
+				$( event.target ).closest( this.options.cancel ).length : false );
+		if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
+			return true;
+		}
+
+		this.mouseDelayMet = !this.options.delay;
+		if ( !this.mouseDelayMet ) {
+			this._mouseDelayTimer = setTimeout( function() {
+				that.mouseDelayMet = true;
+			}, this.options.delay );
+		}
+
+		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
+			this._mouseStarted = ( this._mouseStart( event ) !== false );
+			if ( !this._mouseStarted ) {
+				event.preventDefault();
+				return true;
+			}
+		}
+
+		// Click event may never have fired (Gecko & Opera)
+		if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
+			$.removeData( event.target, this.widgetName + ".preventClickEvent" );
+		}
+
+		// These delegates are required to keep context
+		this._mouseMoveDelegate = function( event ) {
+			return that._mouseMove( event );
+		};
+		this._mouseUpDelegate = function( event ) {
+			return that._mouseUp( event );
+		};
+
+		this.document
+			.on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+			.on( "mouseup." + this.widgetName, this._mouseUpDelegate );
+
+		event.preventDefault();
+
+		mouseHandled = true;
+		return true;
+	},
+
+	_mouseMove: function( event ) {
+
+		// Only check for mouseups outside the document if you've moved inside the document
+		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
+		// fire a mousemove event if content is placed under the cursor. See #7778
+		// Support: IE <9
+		if ( this._mouseMoved ) {
+
+			// IE mouseup check - mouseup happened when mouse was out of window
+			if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
+					!event.button ) {
+				return this._mouseUp( event );
+
+			// Iframe mouseup check - mouseup occurred in another document
+			} else if ( !event.which ) {
+
+				// Support: Safari <=8 - 9
+				// Safari sets which to 0 if you press any of the following keys
+				// during a drag (#14461)
+				if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
+						event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
+					this.ignoreMissingWhich = true;
+				} else if ( !this.ignoreMissingWhich ) {
+					return this._mouseUp( event );
+				}
+			}
+		}
+
+		if ( event.which || event.button ) {
+			this._mouseMoved = true;
+		}
+
+		if ( this._mouseStarted ) {
+			this._mouseDrag( event );
+			return event.preventDefault();
+		}
+
+		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
+			this._mouseStarted =
+				( this._mouseStart( this._mouseDownEvent, event ) !== false );
+			( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );
+		}
+
+		return !this._mouseStarted;
+	},
+
+	_mouseUp: function( event ) {
+		this.document
+			.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+			.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
+
+		if ( this._mouseStarted ) {
+			this._mouseStarted = false;
+
+			if ( event.target === this._mouseDownEvent.target ) {
+				$.data( event.target, this.widgetName + ".preventClickEvent", true );
+			}
+
+			this._mouseStop( event );
+		}
+
+		if ( this._mouseDelayTimer ) {
+			clearTimeout( this._mouseDelayTimer );
+			delete this._mouseDelayTimer;
+		}
+
+		this.ignoreMissingWhich = false;
+		mouseHandled = false;
+		event.preventDefault();
+	},
+
+	_mouseDistanceMet: function( event ) {
+		return ( Math.max(
+				Math.abs( this._mouseDownEvent.pageX - event.pageX ),
+				Math.abs( this._mouseDownEvent.pageY - event.pageY )
+			) >= this.options.distance
+		);
+	},
+
+	_mouseDelayMet: function( /* event */ ) {
+		return this.mouseDelayMet;
+	},
+
+	// These are placeholder methods, to be overriden by extending plugin
+	_mouseStart: function( /* event */ ) {},
+	_mouseDrag: function( /* event */ ) {},
+	_mouseStop: function( /* event */ ) {},
+	_mouseCapture: function( /* event */ ) { return true; }
+} );
+
+} ) );
+
+
+/*!
+ * jQuery UI :data 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: :data Selector
+//>>group: Core
+//>>description: Selects elements which have data stored under the specified key.
+//>>docs: http://api.jqueryui.com/data-selector/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+return $.extend( $.expr[ ":" ], {
+	data: $.expr.createPseudo ?
+		$.expr.createPseudo( function( dataName ) {
+			return function( elem ) {
+				return !!$.data( elem, dataName );
+			};
+		} ) :
+
+		// Support: jQuery <1.8
+		function( elem, i, match ) {
+			return !!$.data( elem, match[ 3 ] );
+		}
+} );
+} ) );
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+// $.ui.plugin is deprecated. Use $.widget() extensions instead.
+return $.ui.plugin = {
+	add: function( module, option, set ) {
+		var i,
+			proto = $.ui[ module ].prototype;
+		for ( i in set ) {
+			proto.plugins[ i ] = proto.plugins[ i ] || [];
+			proto.plugins[ i ].push( [ option, set[ i ] ] );
+		}
+	},
+	call: function( instance, name, args, allowDisconnected ) {
+		var i,
+			set = instance.plugins[ name ];
+
+		if ( !set ) {
+			return;
+		}
+
+		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
+				instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
+			return;
+		}
+
+		for ( i = 0; i < set.length; i++ ) {
+			if ( instance.options[ set[ i ][ 0 ] ] ) {
+				set[ i ][ 1 ].apply( instance.element, args );
+			}
+		}
+	}
+};
+
+} ) );
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+return $.ui.safeActiveElement = function( document ) {
+	var activeElement;
+
+	// Support: IE 9 only
+	// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
+	try {
+		activeElement = document.activeElement;
+	} catch ( error ) {
+		activeElement = document.body;
+	}
+
+	// Support: IE 9 - 11 only
+	// IE may return null instead of an element
+	// Interestingly, this only seems to occur when NOT in an iframe
+	if ( !activeElement ) {
+		activeElement = document.body;
+	}
+
+	// Support: IE 11 only
+	// IE11 returns a seemingly empty object in some cases when accessing
+	// document.activeElement from an <iframe>
+	if ( !activeElement.nodeName ) {
+		activeElement = document.body;
+	}
+
+	return activeElement;
+};
+
+} ) );
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+return $.ui.safeBlur = function( element ) {
+
+	// Support: IE9 - 10 only
+	// If the <body> is blurred, IE will switch windows, see #9420
+	if ( element && element.nodeName.toLowerCase() !== "body" ) {
+		$( element ).trigger( "blur" );
+	}
+};
+
+} ) );
+
+
+/*!
+ * jQuery UI Scroll Parent 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: scrollParent
+//>>group: Core
+//>>description: Get the closest ancestor element that is scrollable.
+//>>docs: http://api.jqueryui.com/scrollParent/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+return $.fn.scrollParent = function( includeHidden ) {
+	var position = this.css( "position" ),
+		excludeStaticParent = position === "absolute",
+		overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
+		scrollParent = this.parents().filter( function() {
+			var parent = $( this );
+			if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
+				return false;
+			}
+			return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
+				parent.css( "overflow-x" ) );
+		} ).eq( 0 );
+
+	return position === "fixed" || !scrollParent.length ?
+		$( this[ 0 ].ownerDocument || document ) :
+		scrollParent;
+};
+
+} ) );
+
+
+
+
+
+
+
+
+
+/*!
+ * jQuery UI Draggable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Draggable
+//>>group: Interactions
+//>>description: Enables dragging functionality for any element.
+//>>docs: http://api.jqueryui.com/draggable/
+//>>demos: http://jqueryui.com/draggable/
+//>>css.structure: ../../themes/base/draggable.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"./mouse",
+			"../data",
+			"../plugin",
+			"../safe-active-element",
+			"../safe-blur",
+			"../scroll-parent",
+			"../version",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+$.widget( "ui.draggable", $.ui.mouse, {
+	version: "1.12.1",
+	widgetEventPrefix: "drag",
+	options: {
+		addClasses: true,
+		appendTo: "parent",
+		axis: false,
+		connectToSortable: false,
+		containment: false,
+		cursor: "auto",
+		cursorAt: false,
+		grid: false,
+		handle: false,
+		helper: "original",
+		iframeFix: false,
+		opacity: false,
+		refreshPositions: false,
+		revert: false,
+		revertDuration: 500,
+		scope: "default",
+		scroll: true,
+		scrollSensitivity: 20,
+		scrollSpeed: 20,
+		snap: false,
+		snapMode: "both",
+		snapTolerance: 20,
+		stack: false,
+		zIndex: false,
+
+		// Callbacks
+		drag: null,
+		start: null,
+		stop: null
+	},
+	_create: function() {
+
+		if ( this.options.helper === "original" ) {
+			this._setPositionRelative();
+		}
+		if ( this.options.addClasses ) {
+			this._addClass( "ui-draggable" );
+		}
+		this._setHandleClassName();
+
+		this._mouseInit();
+	},
+
+	_setOption: function( key, value ) {
+		this._super( key, value );
+		if ( key === "handle" ) {
+			this._removeHandleClassName();
+			this._setHandleClassName();
+		}
+	},
+
+	_destroy: function() {
+		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
+			this.destroyOnClear = true;
+			return;
+		}
+		this._removeHandleClassName();
+		this._mouseDestroy();
+	},
+
+	_mouseCapture: function( event ) {
+		var o = this.options;
+
+		// Among others, prevent a drag on a resizable-handle
+		if ( this.helper || o.disabled ||
+				$( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
+			return false;
+		}
+
+		//Quit if we're not on a valid handle
+		this.handle = this._getHandle( event );
+		if ( !this.handle ) {
+			return false;
+		}
+
+		this._blurActiveElement( event );
+
+		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
+
+		return true;
+
+	},
+
+	_blockFrames: function( selector ) {
+		this.iframeBlocks = this.document.find( selector ).map( function() {
+			var iframe = $( this );
+
+			return $( "<div>" )
+				.css( "position", "absolute" )
+				.appendTo( iframe.parent() )
+				.outerWidth( iframe.outerWidth() )
+				.outerHeight( iframe.outerHeight() )
+				.offset( iframe.offset() )[ 0 ];
+		} );
+	},
+
+	_unblockFrames: function() {
+		if ( this.iframeBlocks ) {
+			this.iframeBlocks.remove();
+			delete this.iframeBlocks;
+		}
+	},
+
+	_blurActiveElement: function( event ) {
+		var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
+			target = $( event.target );
+
+		// Don't blur if the event occurred on an element that is within
+		// the currently focused element
+		// See #10527, #12472
+		if ( target.closest( activeElement ).length ) {
+			return;
+		}
+
+		// Blur any element that currently has focus, see #4261
+		$.ui.safeBlur( activeElement );
+	},
+
+	_mouseStart: function( event ) {
+
+		var o = this.options;
+
+		//Create and append the visible helper
+		this.helper = this._createHelper( event );
+
+		this._addClass( this.helper, "ui-draggable-dragging" );
+
+		//Cache the helper size
+		this._cacheHelperProportions();
+
+		//If ddmanager is used for droppables, set the global draggable
+		if ( $.ui.ddmanager ) {
+			$.ui.ddmanager.current = this;
+		}
+
+		/*
+		 * - Position generation -
+		 * This block generates everything position related - it's the core of draggables.
+		 */
+
+		//Cache the margins of the original element
+		this._cacheMargins();
+
+		//Store the helper's css position
+		this.cssPosition = this.helper.css( "position" );
+		this.scrollParent = this.helper.scrollParent( true );
+		this.offsetParent = this.helper.offsetParent();
+		this.hasFixedAncestor = this.helper.parents().filter( function() {
+				return $( this ).css( "position" ) === "fixed";
+			} ).length > 0;
+
+		//The element's absolute position on the page minus margins
+		this.positionAbs = this.element.offset();
+		this._refreshOffsets( event );
+
+		//Generate the original position
+		this.originalPosition = this.position = this._generatePosition( event, false );
+		this.originalPageX = event.pageX;
+		this.originalPageY = event.pageY;
+
+		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
+		( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
+
+		//Set a containment if given in the options
+		this._setContainment();
+
+		//Trigger event + callbacks
+		if ( this._trigger( "start", event ) === false ) {
+			this._clear();
+			return false;
+		}
+
+		//Recache the helper size
+		this._cacheHelperProportions();
+
+		//Prepare the droppable offsets
+		if ( $.ui.ddmanager && !o.dropBehaviour ) {
+			$.ui.ddmanager.prepareOffsets( this, event );
+		}
+
+		// Execute the drag once - this causes the helper not to be visible before getting its
+		// correct position
+		this._mouseDrag( event, true );
+
+		// If the ddmanager is used for droppables, inform the manager that dragging has started
+		// (see #5003)
+		if ( $.ui.ddmanager ) {
+			$.ui.ddmanager.dragStart( this, event );
+		}
+
+		return true;
+	},
+
+	_refreshOffsets: function( event ) {
+		this.offset = {
+			top: this.positionAbs.top - this.margins.top,
+			left: this.positionAbs.left - this.margins.left,
+			scroll: false,
+			parent: this._getParentOffset(),
+			relative: this._getRelativeOffset()
+		};
+
+		this.offset.click = {
+			left: event.pageX - this.offset.left,
+			top: event.pageY - this.offset.top
+		};
+	},
+
+	_mouseDrag: function( event, noPropagation ) {
+
+		// reset any necessary cached properties (see #5009)
+		if ( this.hasFixedAncestor ) {
+			this.offset.parent = this._getParentOffset();
+		}
+
+		//Compute the helpers position
+		this.position = this._generatePosition( event, true );
+		this.positionAbs = this._convertPositionTo( "absolute" );
+
+		//Call plugins and callbacks and use the resulting position if something is returned
+		if ( !noPropagation ) {
+			var ui = this._uiHash();
+			if ( this._trigger( "drag", event, ui ) === false ) {
+				this._mouseUp( new $.Event( "mouseup", event ) );
+				return false;
+			}
+			this.position = ui.position;
+		}
+
+		this.helper[ 0 ].style.left = this.position.left + "px";
+		this.helper[ 0 ].style.top = this.position.top + "px";
+
+		if ( $.ui.ddmanager ) {
+			$.ui.ddmanager.drag( this, event );
+		}
+
+		return false;
+	},
+
+	_mouseStop: function( event ) {
+
+		//If we are using droppables, inform the manager about the drop
+		var that = this,
+			dropped = false;
+		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
+			dropped = $.ui.ddmanager.drop( this, event );
+		}
+
+		//if a drop comes from outside (a sortable)
+		if ( this.dropped ) {
+			dropped = this.dropped;
+			this.dropped = false;
+		}
+
+		if ( ( this.options.revert === "invalid" && !dropped ) ||
+				( this.options.revert === "valid" && dropped ) ||
+				this.options.revert === true || ( $.isFunction( this.options.revert ) &&
+				this.options.revert.call( this.element, dropped ) )
+		) {
+			$( this.helper ).animate(
+				this.originalPosition,
+				parseInt( this.options.revertDuration, 10 ),
+				function() {
+					if ( that._trigger( "stop", event ) !== false ) {
+						that._clear();
+					}
+				}
+			);
+		} else {
+			if ( this._trigger( "stop", event ) !== false ) {
+				this._clear();
+			}
+		}
+
+		return false;
+	},
+
+	_mouseUp: function( event ) {
+		this._unblockFrames();
+
+		// If the ddmanager is used for droppables, inform the manager that dragging has stopped
+		// (see #5003)
+		if ( $.ui.ddmanager ) {
+			$.ui.ddmanager.dragStop( this, event );
+		}
+
+		// Only need to focus if the event occurred on the draggable itself, see #10527
+		if ( this.handleElement.is( event.target ) ) {
+
+			// The interaction is over; whether or not the click resulted in a drag,
+			// focus the element
+			this.element.trigger( "focus" );
+		}
+
+		return $.ui.mouse.prototype._mouseUp.call( this, event );
+	},
+
+	cancel: function() {
+
+		if ( this.helper.is( ".ui-draggable-dragging" ) ) {
+			this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
+		} else {
+			this._clear();
+		}
+
+		return this;
+
+	},
+
+	_getHandle: function( event ) {
+		return this.options.handle ?
+			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
+			true;
+	},
+
+	_setHandleClassName: function() {
+		this.handleElement = this.options.handle ?
+			this.element.find( this.options.handle ) : this.element;
+		this._addClass( this.handleElement, "ui-draggable-handle" );
+	},
+
+	_removeHandleClassName: function() {
+		this._removeClass( this.handleElement, "ui-draggable-handle" );
+	},
+
+	_createHelper: function( event ) {
+
+		var o = this.options,
+			helperIsFunction = $.isFunction( o.helper ),
+			helper = helperIsFunction ?
+				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
+				( o.helper === "clone" ?
+					this.element.clone().removeAttr( "id" ) :
+					this.element );
+
+		if ( !helper.parents( "body" ).length ) {
+			helper.appendTo( ( o.appendTo === "parent" ?
+				this.element[ 0 ].parentNode :
+				o.appendTo ) );
+		}
+
+		// Http://bugs.jqueryui.com/ticket/9446
+		// a helper function can return the original element
+		// which wouldn't have been set to relative in _create
+		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
+			this._setPositionRelative();
+		}
+
+		if ( helper[ 0 ] !== this.element[ 0 ] &&
+				!( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
+			helper.css( "position", "absolute" );
+		}
+
+		return helper;
+
+	},
+
+	_setPositionRelative: function() {
+		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
+			this.element[ 0 ].style.position = "relative";
+		}
+	},
+
+	_adjustOffsetFromHelper: function( obj ) {
+		if ( typeof obj === "string" ) {
+			obj = obj.split( " " );
+		}
+		if ( $.isArray( obj ) ) {
+			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
+		}
+		if ( "left" in obj ) {
+			this.offset.click.left = obj.left + this.margins.left;
+		}
+		if ( "right" in obj ) {
+			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+		}
+		if ( "top" in obj ) {
+			this.offset.click.top = obj.top + this.margins.top;
+		}
+		if ( "bottom" in obj ) {
+			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+		}
+	},
+
+	_isRootNode: function( element ) {
+		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
+	},
+
+	_getParentOffset: function() {
+
+		//Get the offsetParent and cache its position
+		var po = this.offsetParent.offset(),
+			document = this.document[ 0 ];
+
+		// This is a special case where we need to modify a offset calculated on start, since the
+		// following happened:
+		// 1. The position of the helper is absolute, so it's position is calculated based on the
+		// next positioned parent
+		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
+		// the document, which means that the scroll is included in the initial calculation of the
+		// offset of the parent, and never recalculated upon drag
+		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
+				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
+			po.left += this.scrollParent.scrollLeft();
+			po.top += this.scrollParent.scrollTop();
+		}
+
+		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
+			po = { top: 0, left: 0 };
+		}
+
+		return {
+			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
+			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
+		};
+
+	},
+
+	_getRelativeOffset: function() {
+		if ( this.cssPosition !== "relative" ) {
+			return { top: 0, left: 0 };
+		}
+
+		var p = this.element.position(),
+			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
+
+		return {
+			top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
+				( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
+			left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
+				( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
+		};
+
+	},
+
+	_cacheMargins: function() {
+		this.margins = {
+			left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
+			top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
+			right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
+			bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
+		};
+	},
+
+	_cacheHelperProportions: function() {
+		this.helperProportions = {
+			width: this.helper.outerWidth(),
+			height: this.helper.outerHeight()
+		};
+	},
+
+	_setContainment: function() {
+
+		var isUserScrollable, c, ce,
+			o = this.options,
+			document = this.document[ 0 ];
+
+		this.relativeContainer = null;
+
+		if ( !o.containment ) {
+			this.containment = null;
+			return;
+		}
+
+		if ( o.containment === "window" ) {
+			this.containment = [
+				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
+				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
+				$( window ).scrollLeft() + $( window ).width() -
+					this.helperProportions.width - this.margins.left,
+				$( window ).scrollTop() +
+					( $( window ).height() || document.body.parentNode.scrollHeight ) -
+					this.helperProportions.height - this.margins.top
+			];
+			return;
+		}
+
+		if ( o.containment === "document" ) {
+			this.containment = [
+				0,
+				0,
+				$( document ).width() - this.helperProportions.width - this.margins.left,
+				( $( document ).height() || document.body.parentNode.scrollHeight ) -
+					this.helperProportions.height - this.margins.top
+			];
+			return;
+		}
+
+		if ( o.containment.constructor === Array ) {
+			this.containment = o.containment;
+			return;
+		}
+
+		if ( o.containment === "parent" ) {
+			o.containment = this.helper[ 0 ].parentNode;
+		}
+
+		c = $( o.containment );
+		ce = c[ 0 ];
+
+		if ( !ce ) {
+			return;
+		}
+
+		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
+
+		this.containment = [
+			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
+				( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
+			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
+				( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
+			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
+				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
+				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
+				this.helperProportions.width -
+				this.margins.left -
+				this.margins.right,
+			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
+				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
+				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
+				this.helperProportions.height -
+				this.margins.top -
+				this.margins.bottom
+		];
+		this.relativeContainer = c;
+	},
+
+	_convertPositionTo: function( d, pos ) {
+
+		if ( !pos ) {
+			pos = this.position;
+		}
+
+		var mod = d === "absolute" ? 1 : -1,
+			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
+
+		return {
+			top: (
+
+				// The absolute mouse position
+				pos.top	+
+
+				// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.relative.top * mod +
+
+				// The offsetParent's offset without borders (offset + border)
+				this.offset.parent.top * mod -
+				( ( this.cssPosition === "fixed" ?
+					-this.offset.scroll.top :
+					( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
+			),
+			left: (
+
+				// The absolute mouse position
+				pos.left +
+
+				// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.relative.left * mod +
+
+				// The offsetParent's offset without borders (offset + border)
+				this.offset.parent.left * mod	-
+				( ( this.cssPosition === "fixed" ?
+					-this.offset.scroll.left :
+					( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
+			)
+		};
+
+	},
+
+	_generatePosition: function( event, constrainPosition ) {
+
+		var containment, co, top, left,
+			o = this.options,
+			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
+			pageX = event.pageX,
+			pageY = event.pageY;
+
+		// Cache the scroll
+		if ( !scrollIsRootNode || !this.offset.scroll ) {
+			this.offset.scroll = {
+				top: this.scrollParent.scrollTop(),
+				left: this.scrollParent.scrollLeft()
+			};
+		}
+
+		/*
+		 * - Position constraining -
+		 * Constrain the position to a mix of grid, containment.
+		 */
+
+		// If we are not dragging yet, we won't check for options
+		if ( constrainPosition ) {
+			if ( this.containment ) {
+				if ( this.relativeContainer ) {
+					co = this.relativeContainer.offset();
+					containment = [
+						this.containment[ 0 ] + co.left,
+						this.containment[ 1 ] + co.top,
+						this.containment[ 2 ] + co.left,
+						this.containment[ 3 ] + co.top
+					];
+				} else {
+					containment = this.containment;
+				}
+
+				if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
+					pageX = containment[ 0 ] + this.offset.click.left;
+				}
+				if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
+					pageY = containment[ 1 ] + this.offset.click.top;
+				}
+				if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
+					pageX = containment[ 2 ] + this.offset.click.left;
+				}
+				if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
+					pageY = containment[ 3 ] + this.offset.click.top;
+				}
+			}
+
+			if ( o.grid ) {
+
+				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid
+				// argument errors in IE (see ticket #6950)
+				top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
+					this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
+				pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
+					top - this.offset.click.top > containment[ 3 ] ) ?
+						top :
+						( ( top - this.offset.click.top >= containment[ 1 ] ) ?
+							top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
+
+				left = o.grid[ 0 ] ? this.originalPageX +
+					Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
+					this.originalPageX;
+				pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
+					left - this.offset.click.left > containment[ 2 ] ) ?
+						left :
+						( ( left - this.offset.click.left >= containment[ 0 ] ) ?
+							left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
+			}
+
+			if ( o.axis === "y" ) {
+				pageX = this.originalPageX;
+			}
+
+			if ( o.axis === "x" ) {
+				pageY = this.originalPageY;
+			}
+		}
+
+		return {
+			top: (
+
+				// The absolute mouse position
+				pageY -
+
+				// Click offset (relative to the element)
+				this.offset.click.top -
+
+				// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.relative.top -
+
+				// The offsetParent's offset without borders (offset + border)
+				this.offset.parent.top +
+				( this.cssPosition === "fixed" ?
+					-this.offset.scroll.top :
+					( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
+			),
+			left: (
+
+				// The absolute mouse position
+				pageX -
+
+				// Click offset (relative to the element)
+				this.offset.click.left -
+
+				// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.relative.left -
+
+				// The offsetParent's offset without borders (offset + border)
+				this.offset.parent.left +
+				( this.cssPosition === "fixed" ?
+					-this.offset.scroll.left :
+					( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
+			)
+		};
+
+	},
+
+	_clear: function() {
+		this._removeClass( this.helper, "ui-draggable-dragging" );
+		if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
+			this.helper.remove();
+		}
+		this.helper = null;
+		this.cancelHelperRemoval = false;
+		if ( this.destroyOnClear ) {
+			this.destroy();
+		}
+	},
+
+	// From now on bulk stuff - mainly helpers
+
+	_trigger: function( type, event, ui ) {
+		ui = ui || this._uiHash();
+		$.ui.plugin.call( this, type, [ event, ui, this ], true );
+
+		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
+		if ( /^(drag|start|stop)/.test( type ) ) {
+			this.positionAbs = this._convertPositionTo( "absolute" );
+			ui.offset = this.positionAbs;
+		}
+		return $.Widget.prototype._trigger.call( this, type, event, ui );
+	},
+
+	plugins: {},
+
+	_uiHash: function() {
+		return {
+			helper: this.helper,
+			position: this.position,
+			originalPosition: this.originalPosition,
+			offset: this.positionAbs
+		};
+	}
+
+} );
+
+$.ui.plugin.add( "draggable", "connectToSortable", {
+	start: function( event, ui, draggable ) {
+		var uiSortable = $.extend( {}, ui, {
+			item: draggable.element
+		} );
+
+		draggable.sortables = [];
+		$( draggable.options.connectToSortable ).each( function() {
+			var sortable = $( this ).sortable( "instance" );
+
+			if ( sortable && !sortable.options.disabled ) {
+				draggable.sortables.push( sortable );
+
+				// RefreshPositions is called at drag start to refresh the containerCache
+				// which is used in drag. This ensures it's initialized and synchronized
+				// with any changes that might have happened on the page since initialization.
+				sortable.refreshPositions();
+				sortable._trigger( "activate", event, uiSortable );
+			}
+		} );
+	},
+	stop: function( event, ui, draggable ) {
+		var uiSortable = $.extend( {}, ui, {
+			item: draggable.element
+		} );
+
+		draggable.cancelHelperRemoval = false;
+
+		$.each( draggable.sortables, function() {
+			var sortable = this;
+
+			if ( sortable.isOver ) {
+				sortable.isOver = 0;
+
+				// Allow this sortable to handle removing the helper
+				draggable.cancelHelperRemoval = true;
+				sortable.cancelHelperRemoval = false;
+
+				// Use _storedCSS To restore properties in the sortable,
+				// as this also handles revert (#9675) since the draggable
+				// may have modified them in unexpected ways (#8809)
+				sortable._storedCSS = {
+					position: sortable.placeholder.css( "position" ),
+					top: sortable.placeholder.css( "top" ),
+					left: sortable.placeholder.css( "left" )
+				};
+
+				sortable._mouseStop( event );
+
+				// Once drag has ended, the sortable should return to using
+				// its original helper, not the shared helper from draggable
+				sortable.options.helper = sortable.options._helper;
+			} else {
+
+				// Prevent this Sortable from removing the helper.
+				// However, don't set the draggable to remove the helper
+				// either as another connected Sortable may yet handle the removal.
+				sortable.cancelHelperRemoval = true;
+
+				sortable._trigger( "deactivate", event, uiSortable );
+			}
+		} );
+	},
+	drag: function( event, ui, draggable ) {
+		$.each( draggable.sortables, function() {
+			var innermostIntersecting = false,
+				sortable = this;
+
+			// Copy over variables that sortable's _intersectsWith uses
+			sortable.positionAbs = draggable.positionAbs;
+			sortable.helperProportions = draggable.helperProportions;
+			sortable.offset.click = draggable.offset.click;
+
+			if ( sortable._intersectsWith( sortable.containerCache ) ) {
+				innermostIntersecting = true;
+
+				$.each( draggable.sortables, function() {
+
+					// Copy over variables that sortable's _intersectsWith uses
+					this.positionAbs = draggable.positionAbs;
+					this.helperProportions = draggable.helperProportions;
+					this.offset.click = draggable.offset.click;
+
+					if ( this !== sortable &&
+							this._intersectsWith( this.containerCache ) &&
+							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
+						innermostIntersecting = false;
+					}
+
+					return innermostIntersecting;
+				} );
+			}
+
+			if ( innermostIntersecting ) {
+
+				// If it intersects, we use a little isOver variable and set it once,
+				// so that the move-in stuff gets fired only once.
+				if ( !sortable.isOver ) {
+					sortable.isOver = 1;
+
+					// Store draggable's parent in case we need to reappend to it later.
+					draggable._parent = ui.helper.parent();
+
+					sortable.currentItem = ui.helper
+						.appendTo( sortable.element )
+						.data( "ui-sortable-item", true );
+
+					// Store helper option to later restore it
+					sortable.options._helper = sortable.options.helper;
+
+					sortable.options.helper = function() {
+						return ui.helper[ 0 ];
+					};
+
+					// Fire the start events of the sortable with our passed browser event,
+					// and our own helper (so it doesn't create a new one)
+					event.target = sortable.currentItem[ 0 ];
+					sortable._mouseCapture( event, true );
+					sortable._mouseStart( event, true, true );
+
+					// Because the browser event is way off the new appended portlet,
+					// modify necessary variables to reflect the changes
+					sortable.offset.click.top = draggable.offset.click.top;
+					sortable.offset.click.left = draggable.offset.click.left;
+					sortable.offset.parent.left -= draggable.offset.parent.left -
+						sortable.offset.parent.left;
+					sortable.offset.parent.top -= draggable.offset.parent.top -
+						sortable.offset.parent.top;
+
+					draggable._trigger( "toSortable", event );
+
+					// Inform draggable that the helper is in a valid drop zone,
+					// used solely in the revert option to handle "valid/invalid".
+					draggable.dropped = sortable.element;
+
+					// Need to refreshPositions of all sortables in the case that
+					// adding to one sortable changes the location of the other sortables (#9675)
+					$.each( draggable.sortables, function() {
+						this.refreshPositions();
+					} );
+
+					// Hack so receive/update callbacks work (mostly)
+					draggable.currentItem = draggable.element;
+					sortable.fromOutside = draggable;
+				}
+
+				if ( sortable.currentItem ) {
+					sortable._mouseDrag( event );
+
+					// Copy the sortable's position because the draggable's can potentially reflect
+					// a relative position, while sortable is always absolute, which the dragged
+					// element has now become. (#8809)
+					ui.position = sortable.position;
+				}
+			} else {
+
+				// If it doesn't intersect with the sortable, and it intersected before,
+				// we fake the drag stop of the sortable, but make sure it doesn't remove
+				// the helper by using cancelHelperRemoval.
+				if ( sortable.isOver ) {
+
+					sortable.isOver = 0;
+					sortable.cancelHelperRemoval = true;
+
+					// Calling sortable's mouseStop would trigger a revert,
+					// so revert must be temporarily false until after mouseStop is called.
+					sortable.options._revert = sortable.options.revert;
+					sortable.options.revert = false;
+
+					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
+					sortable._mouseStop( event, true );
+
+					// Restore sortable behaviors that were modfied
+					// when the draggable entered the sortable area (#9481)
+					sortable.options.revert = sortable.options._revert;
+					sortable.options.helper = sortable.options._helper;
+
+					if ( sortable.placeholder ) {
+						sortable.placeholder.remove();
+					}
+
+					// Restore and recalculate the draggable's offset considering the sortable
+					// may have modified them in unexpected ways. (#8809, #10669)
+					ui.helper.appendTo( draggable._parent );
+					draggable._refreshOffsets( event );
+					ui.position = draggable._generatePosition( event, true );
+
+					draggable._trigger( "fromSortable", event );
+
+					// Inform draggable that the helper is no longer in a valid drop zone
+					draggable.dropped = false;
+
+					// Need to refreshPositions of all sortables just in case removing
+					// from one sortable changes the location of other sortables (#9675)
+					$.each( draggable.sortables, function() {
+						this.refreshPositions();
+					} );
+				}
+			}
+		} );
+	}
+} );
+
+$.ui.plugin.add( "draggable", "cursor", {
+	start: function( event, ui, instance ) {
+		var t = $( "body" ),
+			o = instance.options;
+
+		if ( t.css( "cursor" ) ) {
+			o._cursor = t.css( "cursor" );
+		}
+		t.css( "cursor", o.cursor );
+	},
+	stop: function( event, ui, instance ) {
+		var o = instance.options;
+		if ( o._cursor ) {
+			$( "body" ).css( "cursor", o._cursor );
+		}
+	}
+} );
+
+$.ui.plugin.add( "draggable", "opacity", {
+	start: function( event, ui, instance ) {
+		var t = $( ui.helper ),
+			o = instance.options;
+		if ( t.css( "opacity" ) ) {
+			o._opacity = t.css( "opacity" );
+		}
+		t.css( "opacity", o.opacity );
+	},
+	stop: function( event, ui, instance ) {
+		var o = instance.options;
+		if ( o._opacity ) {
+			$( ui.helper ).css( "opacity", o._opacity );
+		}
+	}
+} );
+
+$.ui.plugin.add( "draggable", "scroll", {
+	start: function( event, ui, i ) {
+		if ( !i.scrollParentNotHidden ) {
+			i.scrollParentNotHidden = i.helper.scrollParent( false );
+		}
+
+		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
+				i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
+			i.overflowOffset = i.scrollParentNotHidden.offset();
+		}
+	},
+	drag: function( event, ui, i  ) {
+
+		var o = i.options,
+			scrolled = false,
+			scrollParent = i.scrollParentNotHidden[ 0 ],
+			document = i.document[ 0 ];
+
+		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
+			if ( !o.axis || o.axis !== "x" ) {
+				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
+						o.scrollSensitivity ) {
+					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
+				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
+					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
+				}
+			}
+
+			if ( !o.axis || o.axis !== "y" ) {
+				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
+						o.scrollSensitivity ) {
+					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
+				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
+					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
+				}
+			}
+
+		} else {
+
+			if ( !o.axis || o.axis !== "x" ) {
+				if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
+					scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
+				} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
+						o.scrollSensitivity ) {
+					scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
+				}
+			}
+
+			if ( !o.axis || o.axis !== "y" ) {
+				if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
+					scrolled = $( document ).scrollLeft(
+						$( document ).scrollLeft() - o.scrollSpeed
+					);
+				} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
+						o.scrollSensitivity ) {
+					scrolled = $( document ).scrollLeft(
+						$( document ).scrollLeft() + o.scrollSpeed
+					);
+				}
+			}
+
+		}
+
+		if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
+			$.ui.ddmanager.prepareOffsets( i, event );
+		}
+
+	}
+} );
+
+$.ui.plugin.add( "draggable", "snap", {
+	start: function( event, ui, i ) {
+
+		var o = i.options;
+
+		i.snapElements = [];
+
+		$( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
+			.each( function() {
+				var $t = $( this ),
+					$o = $t.offset();
+				if ( this !== i.element[ 0 ] ) {
+					i.snapElements.push( {
+						item: this,
+						width: $t.outerWidth(), height: $t.outerHeight(),
+						top: $o.top, left: $o.left
+					} );
+				}
+			} );
+
+	},
+	drag: function( event, ui, inst ) {
+
+		var ts, bs, ls, rs, l, r, t, b, i, first,
+			o = inst.options,
+			d = o.snapTolerance,
+			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+		for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
+
+			l = inst.snapElements[ i ].left - inst.margins.left;
+			r = l + inst.snapElements[ i ].width;
+			t = inst.snapElements[ i ].top - inst.margins.top;
+			b = t + inst.snapElements[ i ].height;
+
+			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
+					!$.contains( inst.snapElements[ i ].item.ownerDocument,
+					inst.snapElements[ i ].item ) ) {
+				if ( inst.snapElements[ i ].snapping ) {
+					( inst.options.snap.release &&
+						inst.options.snap.release.call(
+							inst.element,
+							event,
+							$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
+						) );
+				}
+				inst.snapElements[ i ].snapping = false;
+				continue;
+			}
+
+			if ( o.snapMode !== "inner" ) {
+				ts = Math.abs( t - y2 ) <= d;
+				bs = Math.abs( b - y1 ) <= d;
+				ls = Math.abs( l - x2 ) <= d;
+				rs = Math.abs( r - x1 ) <= d;
+				if ( ts ) {
+					ui.position.top = inst._convertPositionTo( "relative", {
+						top: t - inst.helperProportions.height,
+						left: 0
+					} ).top;
+				}
+				if ( bs ) {
+					ui.position.top = inst._convertPositionTo( "relative", {
+						top: b,
+						left: 0
+					} ).top;
+				}
+				if ( ls ) {
+					ui.position.left = inst._convertPositionTo( "relative", {
+						top: 0,
+						left: l - inst.helperProportions.width
+					} ).left;
+				}
+				if ( rs ) {
+					ui.position.left = inst._convertPositionTo( "relative", {
+						top: 0,
+						left: r
+					} ).left;
+				}
+			}
+
+			first = ( ts || bs || ls || rs );
+
+			if ( o.snapMode !== "outer" ) {
+				ts = Math.abs( t - y1 ) <= d;
+				bs = Math.abs( b - y2 ) <= d;
+				ls = Math.abs( l - x1 ) <= d;
+				rs = Math.abs( r - x2 ) <= d;
+				if ( ts ) {
+					ui.position.top = inst._convertPositionTo( "relative", {
+						top: t,
+						left: 0
+					} ).top;
+				}
+				if ( bs ) {
+					ui.position.top = inst._convertPositionTo( "relative", {
+						top: b - inst.helperProportions.height,
+						left: 0
+					} ).top;
+				}
+				if ( ls ) {
+					ui.position.left = inst._convertPositionTo( "relative", {
+						top: 0,
+						left: l
+					} ).left;
+				}
+				if ( rs ) {
+					ui.position.left = inst._convertPositionTo( "relative", {
+						top: 0,
+						left: r - inst.helperProportions.width
+					} ).left;
+				}
+			}
+
+			if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
+				( inst.options.snap.snap &&
+					inst.options.snap.snap.call(
+						inst.element,
+						event,
+						$.extend( inst._uiHash(), {
+							snapItem: inst.snapElements[ i ].item
+						} ) ) );
+			}
+			inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
+
+		}
+
+	}
+} );
+
+$.ui.plugin.add( "draggable", "stack", {
+	start: function( event, ui, instance ) {
+		var min,
+			o = instance.options,
+			group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
+				return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
+					( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
+			} );
+
+		if ( !group.length ) { return; }
+
+		min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
+		$( group ).each( function( i ) {
+			$( this ).css( "zIndex", min + i );
+		} );
+		this.css( "zIndex", ( min + group.length ) );
+	}
+} );
+
+$.ui.plugin.add( "draggable", "zIndex", {
+	start: function( event, ui, instance ) {
+		var t = $( ui.helper ),
+			o = instance.options;
+
+		if ( t.css( "zIndex" ) ) {
+			o._zIndex = t.css( "zIndex" );
+		}
+		t.css( "zIndex", o.zIndex );
+	},
+	stop: function( event, ui, instance ) {
+		var o = instance.options;
+
+		if ( o._zIndex ) {
+			$( ui.helper ).css( "zIndex", o._zIndex );
+		}
+	}
+} );
+
+return $.ui.draggable;
+
+} ) );
+
+
+/*!
+ * jQuery UI Disable Selection 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: disableSelection
+//>>group: Core
+//>>description: Disable selection of text content within the set of matched elements.
+//>>docs: http://api.jqueryui.com/disableSelection/
+
+// This file is deprecated
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+return $.fn.extend( {
+	disableSelection: ( function() {
+		var eventType = "onselectstart" in document.createElement( "div" ) ?
+			"selectstart" :
+			"mousedown";
+
+		return function() {
+			return this.on( eventType + ".ui-disableSelection", function( event ) {
+				event.preventDefault();
+			} );
+		};
+	} )(),
+
+	enableSelection: function() {
+		return this.off( ".ui-disableSelection" );
+	}
+} );
+
+} ) );
+
+
+
+
+
+
+/*!
+ * jQuery UI Resizable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Resizable
+//>>group: Interactions
+//>>description: Enables resize functionality for any element.
+//>>docs: http://api.jqueryui.com/resizable/
+//>>demos: http://jqueryui.com/resizable/
+//>>css.structure: ../../themes/base/core.css
+//>>css.structure: ../../themes/base/resizable.css
+//>>css.theme: ../../themes/base/theme.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"./mouse",
+			"../disable-selection",
+			"../plugin",
+			"../version",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+$.widget( "ui.resizable", $.ui.mouse, {
+	version: "1.12.1",
+	widgetEventPrefix: "resize",
+	options: {
+		alsoResize: false,
+		animate: false,
+		animateDuration: "slow",
+		animateEasing: "swing",
+		aspectRatio: false,
+		autoHide: false,
+		classes: {
+			"ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se"
+		},
+		containment: false,
+		ghost: false,
+		grid: false,
+		handles: "e,s,se",
+		helper: false,
+		maxHeight: null,
+		maxWidth: null,
+		minHeight: 10,
+		minWidth: 10,
+
+		// See #7960
+		zIndex: 90,
+
+		// Callbacks
+		resize: null,
+		start: null,
+		stop: null
+	},
+
+	_num: function( value ) {
+		return parseFloat( value ) || 0;
+	},
+
+	_isNumber: function( value ) {
+		return !isNaN( parseFloat( value ) );
+	},
+
+	_hasScroll: function( el, a ) {
+
+		if ( $( el ).css( "overflow" ) === "hidden" ) {
+			return false;
+		}
+
+		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
+			has = false;
+
+		if ( el[ scroll ] > 0 ) {
+			return true;
+		}
+
+		// TODO: determine which cases actually cause this to happen
+		// if the element doesn't have the scroll set, see if it's possible to
+		// set the scroll
+		el[ scroll ] = 1;
+		has = ( el[ scroll ] > 0 );
+		el[ scroll ] = 0;
+		return has;
+	},
+
+	_create: function() {
+
+		var margins,
+			o = this.options,
+			that = this;
+		this._addClass( "ui-resizable" );
+
+		$.extend( this, {
+			_aspectRatio: !!( o.aspectRatio ),
+			aspectRatio: o.aspectRatio,
+			originalElement: this.element,
+			_proportionallyResizeElements: [],
+			_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
+		} );
+
+		// Wrap the element if it cannot hold child nodes
+		if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {
+
+			this.element.wrap(
+				$( "<div class='ui-wrapper' style='overflow: hidden;'></div>" ).css( {
+					position: this.element.css( "position" ),
+					width: this.element.outerWidth(),
+					height: this.element.outerHeight(),
+					top: this.element.css( "top" ),
+					left: this.element.css( "left" )
+				} )
+			);
+
+			this.element = this.element.parent().data(
+				"ui-resizable", this.element.resizable( "instance" )
+			);
+
+			this.elementIsWrapper = true;
+
+			margins = {
+				marginTop: this.originalElement.css( "marginTop" ),
+				marginRight: this.originalElement.css( "marginRight" ),
+				marginBottom: this.originalElement.css( "marginBottom" ),
+				marginLeft: this.originalElement.css( "marginLeft" )
+			};
+
+			this.element.css( margins );
+			this.originalElement.css( "margin", 0 );
+
+			// support: Safari
+			// Prevent Safari textarea resize
+			this.originalResizeStyle = this.originalElement.css( "resize" );
+			this.originalElement.css( "resize", "none" );
+
+			this._proportionallyResizeElements.push( this.originalElement.css( {
+				position: "static",
+				zoom: 1,
+				display: "block"
+			} ) );
+
+			// Support: IE9
+			// avoid IE jump (hard set the margin)
+			this.originalElement.css( margins );
+
+			this._proportionallyResize();
+		}
+
+		this._setupHandles();
+
+		if ( o.autoHide ) {
+			$( this.element )
+				.on( "mouseenter", function() {
+					if ( o.disabled ) {
+						return;
+					}
+					that._removeClass( "ui-resizable-autohide" );
+					that._handles.show();
+				} )
+				.on( "mouseleave", function() {
+					if ( o.disabled ) {
+						return;
+					}
+					if ( !that.resizing ) {
+						that._addClass( "ui-resizable-autohide" );
+						that._handles.hide();
+					}
+				} );
+		}
+
+		this._mouseInit();
+	},
+
+	_destroy: function() {
+
+		this._mouseDestroy();
+
+		var wrapper,
+			_destroy = function( exp ) {
+				$( exp )
+					.removeData( "resizable" )
+					.removeData( "ui-resizable" )
+					.off( ".resizable" )
+					.find( ".ui-resizable-handle" )
+						.remove();
+			};
+
+		// TODO: Unwrap at same DOM position
+		if ( this.elementIsWrapper ) {
+			_destroy( this.element );
+			wrapper = this.element;
+			this.originalElement.css( {
+				position: wrapper.css( "position" ),
+				width: wrapper.outerWidth(),
+				height: wrapper.outerHeight(),
+				top: wrapper.css( "top" ),
+				left: wrapper.css( "left" )
+			} ).insertAfter( wrapper );
+			wrapper.remove();
+		}
+
+		this.originalElement.css( "resize", this.originalResizeStyle );
+		_destroy( this.originalElement );
+
+		return this;
+	},
+
+	_setOption: function( key, value ) {
+		this._super( key, value );
+
+		switch ( key ) {
+		case "handles":
+			this._removeHandles();
+			this._setupHandles();
+			break;
+		default:
+			break;
+		}
+	},
+
+	_setupHandles: function() {
+		var o = this.options, handle, i, n, hname, axis, that = this;
+		this.handles = o.handles ||
+			( !$( ".ui-resizable-handle", this.element ).length ?
+				"e,s,se" : {
+					n: ".ui-resizable-n",
+					e: ".ui-resizable-e",
+					s: ".ui-resizable-s",
+					w: ".ui-resizable-w",
+					se: ".ui-resizable-se",
+					sw: ".ui-resizable-sw",
+					ne: ".ui-resizable-ne",
+					nw: ".ui-resizable-nw"
+				} );
+
+		this._handles = $();
+		if ( this.handles.constructor === String ) {
+
+			if ( this.handles === "all" ) {
+				this.handles = "n,e,s,w,se,sw,ne,nw";
+			}
+
+			n = this.handles.split( "," );
+			this.handles = {};
+
+			for ( i = 0; i < n.length; i++ ) {
+
+				handle = $.trim( n[ i ] );
+				hname = "ui-resizable-" + handle;
+				axis = $( "<div>" );
+				this._addClass( axis, "ui-resizable-handle " + hname );
+
+				axis.css( { zIndex: o.zIndex } );
+
+				this.handles[ handle ] = ".ui-resizable-" + handle;
+				this.element.append( axis );
+			}
+
+		}
+
+		this._renderAxis = function( target ) {
+
+			var i, axis, padPos, padWrapper;
+
+			target = target || this.element;
+
+			for ( i in this.handles ) {
+
+				if ( this.handles[ i ].constructor === String ) {
+					this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();
+				} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
+					this.handles[ i ] = $( this.handles[ i ] );
+					this._on( this.handles[ i ], { "mousedown": that._mouseDown } );
+				}
+
+				if ( this.elementIsWrapper &&
+						this.originalElement[ 0 ]
+							.nodeName
+							.match( /^(textarea|input|select|button)$/i ) ) {
+					axis = $( this.handles[ i ], this.element );
+
+					padWrapper = /sw|ne|nw|se|n|s/.test( i ) ?
+						axis.outerHeight() :
+						axis.outerWidth();
+
+					padPos = [ "padding",
+						/ne|nw|n/.test( i ) ? "Top" :
+						/se|sw|s/.test( i ) ? "Bottom" :
+						/^e$/.test( i ) ? "Right" : "Left" ].join( "" );
+
+					target.css( padPos, padWrapper );
+
+					this._proportionallyResize();
+				}
+
+				this._handles = this._handles.add( this.handles[ i ] );
+			}
+		};
+
+		// TODO: make renderAxis a prototype function
+		this._renderAxis( this.element );
+
+		this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
+		this._handles.disableSelection();
+
+		this._handles.on( "mouseover", function() {
+			if ( !that.resizing ) {
+				if ( this.className ) {
+					axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );
+				}
+				that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se";
+			}
+		} );
+
+		if ( o.autoHide ) {
+			this._handles.hide();
+			this._addClass( "ui-resizable-autohide" );
+		}
+	},
+
+	_removeHandles: function() {
+		this._handles.remove();
+	},
+
+	_mouseCapture: function( event ) {
+		var i, handle,
+			capture = false;
+
+		for ( i in this.handles ) {
+			handle = $( this.handles[ i ] )[ 0 ];
+			if ( handle === event.target || $.contains( handle, event.target ) ) {
+				capture = true;
+			}
+		}
+
+		return !this.options.disabled && capture;
+	},
+
+	_mouseStart: function( event ) {
+
+		var curleft, curtop, cursor,
+			o = this.options,
+			el = this.element;
+
+		this.resizing = true;
+
+		this._renderProxy();
+
+		curleft = this._num( this.helper.css( "left" ) );
+		curtop = this._num( this.helper.css( "top" ) );
+
+		if ( o.containment ) {
+			curleft += $( o.containment ).scrollLeft() || 0;
+			curtop += $( o.containment ).scrollTop() || 0;
+		}
+
+		this.offset = this.helper.offset();
+		this.position = { left: curleft, top: curtop };
+
+		this.size = this._helper ? {
+				width: this.helper.width(),
+				height: this.helper.height()
+			} : {
+				width: el.width(),
+				height: el.height()
+			};
+
+		this.originalSize = this._helper ? {
+				width: el.outerWidth(),
+				height: el.outerHeight()
+			} : {
+				width: el.width(),
+				height: el.height()
+			};
+
+		this.sizeDiff = {
+			width: el.outerWidth() - el.width(),
+			height: el.outerHeight() - el.height()
+		};
+
+		this.originalPosition = { left: curleft, top: curtop };
+		this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+		this.aspectRatio = ( typeof o.aspectRatio === "number" ) ?
+			o.aspectRatio :
+			( ( this.originalSize.width / this.originalSize.height ) || 1 );
+
+		cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" );
+		$( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor );
+
+		this._addClass( "ui-resizable-resizing" );
+		this._propagate( "start", event );
+		return true;
+	},
+
+	_mouseDrag: function( event ) {
+
+		var data, props,
+			smp = this.originalMousePosition,
+			a = this.axis,
+			dx = ( event.pageX - smp.left ) || 0,
+			dy = ( event.pageY - smp.top ) || 0,
+			trigger = this._change[ a ];
+
+		this._updatePrevProperties();
+
+		if ( !trigger ) {
+			return false;
+		}
+
+		data = trigger.apply( this, [ event, dx, dy ] );
+
+		this._updateVirtualBoundaries( event.shiftKey );
+		if ( this._aspectRatio || event.shiftKey ) {
+			data = this._updateRatio( data, event );
+		}
+
+		data = this._respectSize( data, event );
+
+		this._updateCache( data );
+
+		this._propagate( "resize", event );
+
+		props = this._applyChanges();
+
+		if ( !this._helper && this._proportionallyResizeElements.length ) {
+			this._proportionallyResize();
+		}
+
+		if ( !$.isEmptyObject( props ) ) {
+			this._updatePrevProperties();
+			this._trigger( "resize", event, this.ui() );
+			this._applyChanges();
+		}
+
+		return false;
+	},
+
+	_mouseStop: function( event ) {
+
+		this.resizing = false;
+		var pr, ista, soffseth, soffsetw, s, left, top,
+			o = this.options, that = this;
+
+		if ( this._helper ) {
+
+			pr = this._proportionallyResizeElements;
+			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );
+			soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height;
+			soffsetw = ista ? 0 : that.sizeDiff.width;
+
+			s = {
+				width: ( that.helper.width()  - soffsetw ),
+				height: ( that.helper.height() - soffseth )
+			};
+			left = ( parseFloat( that.element.css( "left" ) ) +
+				( that.position.left - that.originalPosition.left ) ) || null;
+			top = ( parseFloat( that.element.css( "top" ) ) +
+				( that.position.top - that.originalPosition.top ) ) || null;
+
+			if ( !o.animate ) {
+				this.element.css( $.extend( s, { top: top, left: left } ) );
+			}
+
+			that.helper.height( that.size.height );
+			that.helper.width( that.size.width );
+
+			if ( this._helper && !o.animate ) {
+				this._proportionallyResize();
+			}
+		}
+
+		$( "body" ).css( "cursor", "auto" );
+
+		this._removeClass( "ui-resizable-resizing" );
+
+		this._propagate( "stop", event );
+
+		if ( this._helper ) {
+			this.helper.remove();
+		}
+
+		return false;
+
+	},
+
+	_updatePrevProperties: function() {
+		this.prevPosition = {
+			top: this.position.top,
+			left: this.position.left
+		};
+		this.prevSize = {
+			width: this.size.width,
+			height: this.size.height
+		};
+	},
+
+	_applyChanges: function() {
+		var props = {};
+
+		if ( this.position.top !== this.prevPosition.top ) {
+			props.top = this.position.top + "px";
+		}
+		if ( this.position.left !== this.prevPosition.left ) {
+			props.left = this.position.left + "px";
+		}
+		if ( this.size.width !== this.prevSize.width ) {
+			props.width = this.size.width + "px";
+		}
+		if ( this.size.height !== this.prevSize.height ) {
+			props.height = this.size.height + "px";
+		}
+
+		this.helper.css( props );
+
+		return props;
+	},
+
+	_updateVirtualBoundaries: function( forceAspectRatio ) {
+		var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
+			o = this.options;
+
+		b = {
+			minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,
+			maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,
+			minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,
+			maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity
+		};
+
+		if ( this._aspectRatio || forceAspectRatio ) {
+			pMinWidth = b.minHeight * this.aspectRatio;
+			pMinHeight = b.minWidth / this.aspectRatio;
+			pMaxWidth = b.maxHeight * this.aspectRatio;
+			pMaxHeight = b.maxWidth / this.aspectRatio;
+
+			if ( pMinWidth > b.minWidth ) {
+				b.minWidth = pMinWidth;
+			}
+			if ( pMinHeight > b.minHeight ) {
+				b.minHeight = pMinHeight;
+			}
+			if ( pMaxWidth < b.maxWidth ) {
+				b.maxWidth = pMaxWidth;
+			}
+			if ( pMaxHeight < b.maxHeight ) {
+				b.maxHeight = pMaxHeight;
+			}
+		}
+		this._vBoundaries = b;
+	},
+
+	_updateCache: function( data ) {
+		this.offset = this.helper.offset();
+		if ( this._isNumber( data.left ) ) {
+			this.position.left = data.left;
+		}
+		if ( this._isNumber( data.top ) ) {
+			this.position.top = data.top;
+		}
+		if ( this._isNumber( data.height ) ) {
+			this.size.height = data.height;
+		}
+		if ( this._isNumber( data.width ) ) {
+			this.size.width = data.width;
+		}
+	},
+
+	_updateRatio: function( data ) {
+
+		var cpos = this.position,
+			csize = this.size,
+			a = this.axis;
+
+		if ( this._isNumber( data.height ) ) {
+			data.width = ( data.height * this.aspectRatio );
+		} else if ( this._isNumber( data.width ) ) {
+			data.height = ( data.width / this.aspectRatio );
+		}
+
+		if ( a === "sw" ) {
+			data.left = cpos.left + ( csize.width - data.width );
+			data.top = null;
+		}
+		if ( a === "nw" ) {
+			data.top = cpos.top + ( csize.height - data.height );
+			data.left = cpos.left + ( csize.width - data.width );
+		}
+
+		return data;
+	},
+
+	_respectSize: function( data ) {
+
+		var o = this._vBoundaries,
+			a = this.axis,
+			ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),
+			ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),
+			isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),
+			isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),
+			dw = this.originalPosition.left + this.originalSize.width,
+			dh = this.originalPosition.top + this.originalSize.height,
+			cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );
+		if ( isminw ) {
+			data.width = o.minWidth;
+		}
+		if ( isminh ) {
+			data.height = o.minHeight;
+		}
+		if ( ismaxw ) {
+			data.width = o.maxWidth;
+		}
+		if ( ismaxh ) {
+			data.height = o.maxHeight;
+		}
+
+		if ( isminw && cw ) {
+			data.left = dw - o.minWidth;
+		}
+		if ( ismaxw && cw ) {
+			data.left = dw - o.maxWidth;
+		}
+		if ( isminh && ch ) {
+			data.top = dh - o.minHeight;
+		}
+		if ( ismaxh && ch ) {
+			data.top = dh - o.maxHeight;
+		}
+
+		// Fixing jump error on top/left - bug #2330
+		if ( !data.width && !data.height && !data.left && data.top ) {
+			data.top = null;
+		} else if ( !data.width && !data.height && !data.top && data.left ) {
+			data.left = null;
+		}
+
+		return data;
+	},
+
+	_getPaddingPlusBorderDimensions: function( element ) {
+		var i = 0,
+			widths = [],
+			borders = [
+				element.css( "borderTopWidth" ),
+				element.css( "borderRightWidth" ),
+				element.css( "borderBottomWidth" ),
+				element.css( "borderLeftWidth" )
+			],
+			paddings = [
+				element.css( "paddingTop" ),
+				element.css( "paddingRight" ),
+				element.css( "paddingBottom" ),
+				element.css( "paddingLeft" )
+			];
+
+		for ( ; i < 4; i++ ) {
+			widths[ i ] = ( parseFloat( borders[ i ] ) || 0 );
+			widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );
+		}
+
+		return {
+			height: widths[ 0 ] + widths[ 2 ],
+			width: widths[ 1 ] + widths[ 3 ]
+		};
+	},
+
+	_proportionallyResize: function() {
+
+		if ( !this._proportionallyResizeElements.length ) {
+			return;
+		}
+
+		var prel,
+			i = 0,
+			element = this.helper || this.element;
+
+		for ( ; i < this._proportionallyResizeElements.length; i++ ) {
+
+			prel = this._proportionallyResizeElements[ i ];
+
+			// TODO: Seems like a bug to cache this.outerDimensions
+			// considering that we are in a loop.
+			if ( !this.outerDimensions ) {
+				this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
+			}
+
+			prel.css( {
+				height: ( element.height() - this.outerDimensions.height ) || 0,
+				width: ( element.width() - this.outerDimensions.width ) || 0
+			} );
+
+		}
+
+	},
+
+	_renderProxy: function() {
+
+		var el = this.element, o = this.options;
+		this.elementOffset = el.offset();
+
+		if ( this._helper ) {
+
+			this.helper = this.helper || $( "<div style='overflow:hidden;'></div>" );
+
+			this._addClass( this.helper, this._helper );
+			this.helper.css( {
+				width: this.element.outerWidth(),
+				height: this.element.outerHeight(),
+				position: "absolute",
+				left: this.elementOffset.left + "px",
+				top: this.elementOffset.top + "px",
+				zIndex: ++o.zIndex //TODO: Don't modify option
+			} );
+
+			this.helper
+				.appendTo( "body" )
+				.disableSelection();
+
+		} else {
+			this.helper = this.element;
+		}
+
+	},
+
+	_change: {
+		e: function( event, dx ) {
+			return { width: this.originalSize.width + dx };
+		},
+		w: function( event, dx ) {
+			var cs = this.originalSize, sp = this.originalPosition;
+			return { left: sp.left + dx, width: cs.width - dx };
+		},
+		n: function( event, dx, dy ) {
+			var cs = this.originalSize, sp = this.originalPosition;
+			return { top: sp.top + dy, height: cs.height - dy };
+		},
+		s: function( event, dx, dy ) {
+			return { height: this.originalSize.height + dy };
+		},
+		se: function( event, dx, dy ) {
+			return $.extend( this._change.s.apply( this, arguments ),
+				this._change.e.apply( this, [ event, dx, dy ] ) );
+		},
+		sw: function( event, dx, dy ) {
+			return $.extend( this._change.s.apply( this, arguments ),
+				this._change.w.apply( this, [ event, dx, dy ] ) );
+		},
+		ne: function( event, dx, dy ) {
+			return $.extend( this._change.n.apply( this, arguments ),
+				this._change.e.apply( this, [ event, dx, dy ] ) );
+		},
+		nw: function( event, dx, dy ) {
+			return $.extend( this._change.n.apply( this, arguments ),
+				this._change.w.apply( this, [ event, dx, dy ] ) );
+		}
+	},
+
+	_propagate: function( n, event ) {
+		$.ui.plugin.call( this, n, [ event, this.ui() ] );
+		( n !== "resize" && this._trigger( n, event, this.ui() ) );
+	},
+
+	plugins: {},
+
+	ui: function() {
+		return {
+			originalElement: this.originalElement,
+			element: this.element,
+			helper: this.helper,
+			position: this.position,
+			size: this.size,
+			originalSize: this.originalSize,
+			originalPosition: this.originalPosition
+		};
+	}
+
+} );
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add( "resizable", "animate", {
+
+	stop: function( event ) {
+		var that = $( this ).resizable( "instance" ),
+			o = that.options,
+			pr = that._proportionallyResizeElements,
+			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),
+			soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height,
+			soffsetw = ista ? 0 : that.sizeDiff.width,
+			style = {
+				width: ( that.size.width - soffsetw ),
+				height: ( that.size.height - soffseth )
+			},
+			left = ( parseFloat( that.element.css( "left" ) ) +
+				( that.position.left - that.originalPosition.left ) ) || null,
+			top = ( parseFloat( that.element.css( "top" ) ) +
+				( that.position.top - that.originalPosition.top ) ) || null;
+
+		that.element.animate(
+			$.extend( style, top && left ? { top: top, left: left } : {} ), {
+				duration: o.animateDuration,
+				easing: o.animateEasing,
+				step: function() {
+
+					var data = {
+						width: parseFloat( that.element.css( "width" ) ),
+						height: parseFloat( that.element.css( "height" ) ),
+						top: parseFloat( that.element.css( "top" ) ),
+						left: parseFloat( that.element.css( "left" ) )
+					};
+
+					if ( pr && pr.length ) {
+						$( pr[ 0 ] ).css( { width: data.width, height: data.height } );
+					}
+
+					// Propagating resize, and updating values for each animation step
+					that._updateCache( data );
+					that._propagate( "resize", event );
+
+				}
+			}
+		);
+	}
+
+} );
+
+$.ui.plugin.add( "resizable", "containment", {
+
+	start: function() {
+		var element, p, co, ch, cw, width, height,
+			that = $( this ).resizable( "instance" ),
+			o = that.options,
+			el = that.element,
+			oc = o.containment,
+			ce = ( oc instanceof $ ) ?
+				oc.get( 0 ) :
+				( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
+
+		if ( !ce ) {
+			return;
+		}
+
+		that.containerElement = $( ce );
+
+		if ( /document/.test( oc ) || oc === document ) {
+			that.containerOffset = {
+				left: 0,
+				top: 0
+			};
+			that.containerPosition = {
+				left: 0,
+				top: 0
+			};
+
+			that.parentData = {
+				element: $( document ),
+				left: 0,
+				top: 0,
+				width: $( document ).width(),
+				height: $( document ).height() || document.body.parentNode.scrollHeight
+			};
+		} else {
+			element = $( ce );
+			p = [];
+			$( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) {
+				p[ i ] = that._num( element.css( "padding" + name ) );
+			} );
+
+			that.containerOffset = element.offset();
+			that.containerPosition = element.position();
+			that.containerSize = {
+				height: ( element.innerHeight() - p[ 3 ] ),
+				width: ( element.innerWidth() - p[ 1 ] )
+			};
+
+			co = that.containerOffset;
+			ch = that.containerSize.height;
+			cw = that.containerSize.width;
+			width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
+			height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
+
+			that.parentData = {
+				element: ce,
+				left: co.left,
+				top: co.top,
+				width: width,
+				height: height
+			};
+		}
+	},
+
+	resize: function( event ) {
+		var woset, hoset, isParent, isOffsetRelative,
+			that = $( this ).resizable( "instance" ),
+			o = that.options,
+			co = that.containerOffset,
+			cp = that.position,
+			pRatio = that._aspectRatio || event.shiftKey,
+			cop = {
+				top: 0,
+				left: 0
+			},
+			ce = that.containerElement,
+			continueResize = true;
+
+		if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
+			cop = co;
+		}
+
+		if ( cp.left < ( that._helper ? co.left : 0 ) ) {
+			that.size.width = that.size.width +
+				( that._helper ?
+					( that.position.left - co.left ) :
+					( that.position.left - cop.left ) );
+
+			if ( pRatio ) {
+				that.size.height = that.size.width / that.aspectRatio;
+				continueResize = false;
+			}
+			that.position.left = o.helper ? co.left : 0;
+		}
+
+		if ( cp.top < ( that._helper ? co.top : 0 ) ) {
+			that.size.height = that.size.height +
+				( that._helper ?
+					( that.position.top - co.top ) :
+					that.position.top );
+
+			if ( pRatio ) {
+				that.size.width = that.size.height * that.aspectRatio;
+				continueResize = false;
+			}
+			that.position.top = that._helper ? co.top : 0;
+		}
+
+		isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
+		isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
+
+		if ( isParent && isOffsetRelative ) {
+			that.offset.left = that.parentData.left + that.position.left;
+			that.offset.top = that.parentData.top + that.position.top;
+		} else {
+			that.offset.left = that.element.offset().left;
+			that.offset.top = that.element.offset().top;
+		}
+
+		woset = Math.abs( that.sizeDiff.width +
+			( that._helper ?
+				that.offset.left - cop.left :
+				( that.offset.left - co.left ) ) );
+
+		hoset = Math.abs( that.sizeDiff.height +
+			( that._helper ?
+				that.offset.top - cop.top :
+				( that.offset.top - co.top ) ) );
+
+		if ( woset + that.size.width >= that.parentData.width ) {
+			that.size.width = that.parentData.width - woset;
+			if ( pRatio ) {
+				that.size.height = that.size.width / that.aspectRatio;
+				continueResize = false;
+			}
+		}
+
+		if ( hoset + that.size.height >= that.parentData.height ) {
+			that.size.height = that.parentData.height - hoset;
+			if ( pRatio ) {
+				that.size.width = that.size.height * that.aspectRatio;
+				continueResize = false;
+			}
+		}
+
+		if ( !continueResize ) {
+			that.position.left = that.prevPosition.left;
+			that.position.top = that.prevPosition.top;
+			that.size.width = that.prevSize.width;
+			that.size.height = that.prevSize.height;
+		}
+	},
+
+	stop: function() {
+		var that = $( this ).resizable( "instance" ),
+			o = that.options,
+			co = that.containerOffset,
+			cop = that.containerPosition,
+			ce = that.containerElement,
+			helper = $( that.helper ),
+			ho = helper.offset(),
+			w = helper.outerWidth() - that.sizeDiff.width,
+			h = helper.outerHeight() - that.sizeDiff.height;
+
+		if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
+			$( this ).css( {
+				left: ho.left - cop.left - co.left,
+				width: w,
+				height: h
+			} );
+		}
+
+		if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
+			$( this ).css( {
+				left: ho.left - cop.left - co.left,
+				width: w,
+				height: h
+			} );
+		}
+	}
+} );
+
+$.ui.plugin.add( "resizable", "alsoResize", {
+
+	start: function() {
+		var that = $( this ).resizable( "instance" ),
+			o = that.options;
+
+		$( o.alsoResize ).each( function() {
+			var el = $( this );
+			el.data( "ui-resizable-alsoresize", {
+				width: parseFloat( el.width() ), height: parseFloat( el.height() ),
+				left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) )
+			} );
+		} );
+	},
+
+	resize: function( event, ui ) {
+		var that = $( this ).resizable( "instance" ),
+			o = that.options,
+			os = that.originalSize,
+			op = that.originalPosition,
+			delta = {
+				height: ( that.size.height - os.height ) || 0,
+				width: ( that.size.width - os.width ) || 0,
+				top: ( that.position.top - op.top ) || 0,
+				left: ( that.position.left - op.left ) || 0
+			};
+
+			$( o.alsoResize ).each( function() {
+				var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
+					css = el.parents( ui.originalElement[ 0 ] ).length ?
+							[ "width", "height" ] :
+							[ "width", "height", "top", "left" ];
+
+				$.each( css, function( i, prop ) {
+					var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
+					if ( sum && sum >= 0 ) {
+						style[ prop ] = sum || null;
+					}
+				} );
+
+				el.css( style );
+			} );
+	},
+
+	stop: function() {
+		$( this ).removeData( "ui-resizable-alsoresize" );
+	}
+} );
+
+$.ui.plugin.add( "resizable", "ghost", {
+
+	start: function() {
+
+		var that = $( this ).resizable( "instance" ), cs = that.size;
+
+		that.ghost = that.originalElement.clone();
+		that.ghost.css( {
+			opacity: 0.25,
+			display: "block",
+			position: "relative",
+			height: cs.height,
+			width: cs.width,
+			margin: 0,
+			left: 0,
+			top: 0
+		} );
+
+		that._addClass( that.ghost, "ui-resizable-ghost" );
+
+		// DEPRECATED
+		// TODO: remove after 1.12
+		if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) {
+
+			// Ghost option
+			that.ghost.addClass( this.options.ghost );
+		}
+
+		that.ghost.appendTo( that.helper );
+
+	},
+
+	resize: function() {
+		var that = $( this ).resizable( "instance" );
+		if ( that.ghost ) {
+			that.ghost.css( {
+				position: "relative",
+				height: that.size.height,
+				width: that.size.width
+			} );
+		}
+	},
+
+	stop: function() {
+		var that = $( this ).resizable( "instance" );
+		if ( that.ghost && that.helper ) {
+			that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );
+		}
+	}
+
+} );
+
+$.ui.plugin.add( "resizable", "grid", {
+
+	resize: function() {
+		var outerDimensions,
+			that = $( this ).resizable( "instance" ),
+			o = that.options,
+			cs = that.size,
+			os = that.originalSize,
+			op = that.originalPosition,
+			a = that.axis,
+			grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
+			gridX = ( grid[ 0 ] || 1 ),
+			gridY = ( grid[ 1 ] || 1 ),
+			ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,
+			oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,
+			newWidth = os.width + ox,
+			newHeight = os.height + oy,
+			isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),
+			isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),
+			isMinWidth = o.minWidth && ( o.minWidth > newWidth ),
+			isMinHeight = o.minHeight && ( o.minHeight > newHeight );
+
+		o.grid = grid;
+
+		if ( isMinWidth ) {
+			newWidth += gridX;
+		}
+		if ( isMinHeight ) {
+			newHeight += gridY;
+		}
+		if ( isMaxWidth ) {
+			newWidth -= gridX;
+		}
+		if ( isMaxHeight ) {
+			newHeight -= gridY;
+		}
+
+		if ( /^(se|s|e)$/.test( a ) ) {
+			that.size.width = newWidth;
+			that.size.height = newHeight;
+		} else if ( /^(ne)$/.test( a ) ) {
+			that.size.width = newWidth;
+			that.size.height = newHeight;
+			that.position.top = op.top - oy;
+		} else if ( /^(sw)$/.test( a ) ) {
+			that.size.width = newWidth;
+			that.size.height = newHeight;
+			that.position.left = op.left - ox;
+		} else {
+			if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {
+				outerDimensions = that._getPaddingPlusBorderDimensions( this );
+			}
+
+			if ( newHeight - gridY > 0 ) {
+				that.size.height = newHeight;
+				that.position.top = op.top - oy;
+			} else {
+				newHeight = gridY - outerDimensions.height;
+				that.size.height = newHeight;
+				that.position.top = op.top + os.height - newHeight;
+			}
+			if ( newWidth - gridX > 0 ) {
+				that.size.width = newWidth;
+				that.position.left = op.left - ox;
+			} else {
+				newWidth = gridX - outerDimensions.width;
+				that.size.width = newWidth;
+				that.position.left = op.left + os.width - newWidth;
+			}
+		}
+	}
+
+} );
+
+return $.ui.resizable;
+
+} ) );
+
+
+/*!
+ * jQuery UI Focusable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: :focusable Selector
+//>>group: Core
+//>>description: Selects elements which can be focused.
+//>>docs: http://api.jqueryui.com/focusable-selector/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+// Selectors
+$.ui.focusable = function( element, hasTabindex ) {
+	var map, mapName, img, focusableIfVisible, fieldset,
+		nodeName = element.nodeName.toLowerCase();
+
+	if ( "area" === nodeName ) {
+		map = element.parentNode;
+		mapName = map.name;
+		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+			return false;
+		}
+		img = $( "img[usemap='#" + mapName + "']" );
+		return img.length > 0 && img.is( ":visible" );
+	}
+
+	if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {
+		focusableIfVisible = !element.disabled;
+
+		if ( focusableIfVisible ) {
+
+			// Form controls within a disabled fieldset are disabled.
+			// However, controls within the fieldset's legend do not get disabled.
+			// Since controls generally aren't placed inside legends, we skip
+			// this portion of the check.
+			fieldset = $( element ).closest( "fieldset" )[ 0 ];
+			if ( fieldset ) {
+				focusableIfVisible = !fieldset.disabled;
+			}
+		}
+	} else if ( "a" === nodeName ) {
+		focusableIfVisible = element.href || hasTabindex;
+	} else {
+		focusableIfVisible = hasTabindex;
+	}
+
+	return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) );
+};
+
+// Support: IE 8 only
+// IE 8 doesn't resolve inherit to visible/hidden for computed values
+function visible( element ) {
+	var visibility = element.css( "visibility" );
+	while ( visibility === "inherit" ) {
+		element = element.parent();
+		visibility = element.css( "visibility" );
+	}
+	return visibility !== "hidden";
+}
+
+$.extend( $.expr[ ":" ], {
+	focusable: function( element ) {
+		return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );
+	}
+} );
+
+return $.ui.focusable;
+
+} ) );
+
+
+/*!
+ * jQuery UI Position 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/position/
+ */
+
+//>>label: Position
+//>>group: Core
+//>>description: Positions elements relative to other elements.
+//>>docs: http://api.jqueryui.com/position/
+//>>demos: http://jqueryui.com/position/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+( function() {
+var cachedScrollbarWidth,
+	max = Math.max,
+	abs = Math.abs,
+	rhorizontal = /left|center|right/,
+	rvertical = /top|center|bottom/,
+	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
+	rposition = /^\w+/,
+	rpercent = /%$/,
+	_position = $.fn.position;
+
+function getOffsets( offsets, width, height ) {
+	return [
+		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
+		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
+	];
+}
+
+function parseCss( element, property ) {
+	return parseInt( $.css( element, property ), 10 ) || 0;
+}
+
+function getDimensions( elem ) {
+	var raw = elem[ 0 ];
+	if ( raw.nodeType === 9 ) {
+		return {
+			width: elem.width(),
+			height: elem.height(),
+			offset: { top: 0, left: 0 }
+		};
+	}
+	if ( $.isWindow( raw ) ) {
+		return {
+			width: elem.width(),
+			height: elem.height(),
+			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
+		};
+	}
+	if ( raw.preventDefault ) {
+		return {
+			width: 0,
+			height: 0,
+			offset: { top: raw.pageY, left: raw.pageX }
+		};
+	}
+	return {
+		width: elem.outerWidth(),
+		height: elem.outerHeight(),
+		offset: elem.offset()
+	};
+}
+
+$.position = {
+	scrollbarWidth: function() {
+		if ( cachedScrollbarWidth !== undefined ) {
+			return cachedScrollbarWidth;
+		}
+		var w1, w2,
+			div = $( "<div " +
+				"style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>" +
+				"<div style='height:100px;width:auto;'></div></div>" ),
+			innerDiv = div.children()[ 0 ];
+
+		$( "body" ).append( div );
+		w1 = innerDiv.offsetWidth;
+		div.css( "overflow", "scroll" );
+
+		w2 = innerDiv.offsetWidth;
+
+		if ( w1 === w2 ) {
+			w2 = div[ 0 ].clientWidth;
+		}
+
+		div.remove();
+
+		return ( cachedScrollbarWidth = w1 - w2 );
+	},
+	getScrollInfo: function( within ) {
+		var overflowX = within.isWindow || within.isDocument ? "" :
+				within.element.css( "overflow-x" ),
+			overflowY = within.isWindow || within.isDocument ? "" :
+				within.element.css( "overflow-y" ),
+			hasOverflowX = overflowX === "scroll" ||
+				( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
+			hasOverflowY = overflowY === "scroll" ||
+				( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
+		return {
+			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
+			height: hasOverflowX ? $.position.scrollbarWidth() : 0
+		};
+	},
+	getWithinInfo: function( element ) {
+		var withinElement = $( element || window ),
+			isWindow = $.isWindow( withinElement[ 0 ] ),
+			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
+			hasOffset = !isWindow && !isDocument;
+		return {
+			element: withinElement,
+			isWindow: isWindow,
+			isDocument: isDocument,
+			offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
+			scrollLeft: withinElement.scrollLeft(),
+			scrollTop: withinElement.scrollTop(),
+			width: withinElement.outerWidth(),
+			height: withinElement.outerHeight()
+		};
+	}
+};
+
+$.fn.position = function( options ) {
+	if ( !options || !options.of ) {
+		return _position.apply( this, arguments );
+	}
+
+	// Make a copy, we don't want to modify arguments
+	options = $.extend( {}, options );
+
+	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
+		target = $( options.of ),
+		within = $.position.getWithinInfo( options.within ),
+		scrollInfo = $.position.getScrollInfo( within ),
+		collision = ( options.collision || "flip" ).split( " " ),
+		offsets = {};
+
+	dimensions = getDimensions( target );
+	if ( target[ 0 ].preventDefault ) {
+
+		// Force left top to allow flipping
+		options.at = "left top";
+	}
+	targetWidth = dimensions.width;
+	targetHeight = dimensions.height;
+	targetOffset = dimensions.offset;
+
+	// Clone to reuse original targetOffset later
+	basePosition = $.extend( {}, targetOffset );
+
+	// Force my and at to have valid horizontal and vertical positions
+	// if a value is missing or invalid, it will be converted to center
+	$.each( [ "my", "at" ], function() {
+		var pos = ( options[ this ] || "" ).split( " " ),
+			horizontalOffset,
+			verticalOffset;
+
+		if ( pos.length === 1 ) {
+			pos = rhorizontal.test( pos[ 0 ] ) ?
+				pos.concat( [ "center" ] ) :
+				rvertical.test( pos[ 0 ] ) ?
+					[ "center" ].concat( pos ) :
+					[ "center", "center" ];
+		}
+		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
+		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
+
+		// Calculate offsets
+		horizontalOffset = roffset.exec( pos[ 0 ] );
+		verticalOffset = roffset.exec( pos[ 1 ] );
+		offsets[ this ] = [
+			horizontalOffset ? horizontalOffset[ 0 ] : 0,
+			verticalOffset ? verticalOffset[ 0 ] : 0
+		];
+
+		// Reduce to just the positions without the offsets
+		options[ this ] = [
+			rposition.exec( pos[ 0 ] )[ 0 ],
+			rposition.exec( pos[ 1 ] )[ 0 ]
+		];
+	} );
+
+	// Normalize collision option
+	if ( collision.length === 1 ) {
+		collision[ 1 ] = collision[ 0 ];
+	}
+
+	if ( options.at[ 0 ] === "right" ) {
+		basePosition.left += targetWidth;
+	} else if ( options.at[ 0 ] === "center" ) {
+		basePosition.left += targetWidth / 2;
+	}
+
+	if ( options.at[ 1 ] === "bottom" ) {
+		basePosition.top += targetHeight;
+	} else if ( options.at[ 1 ] === "center" ) {
+		basePosition.top += targetHeight / 2;
+	}
+
+	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
+	basePosition.left += atOffset[ 0 ];
+	basePosition.top += atOffset[ 1 ];
+
+	return this.each( function() {
+		var collisionPosition, using,
+			elem = $( this ),
+			elemWidth = elem.outerWidth(),
+			elemHeight = elem.outerHeight(),
+			marginLeft = parseCss( this, "marginLeft" ),
+			marginTop = parseCss( this, "marginTop" ),
+			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
+				scrollInfo.width,
+			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
+				scrollInfo.height,
+			position = $.extend( {}, basePosition ),
+			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
+
+		if ( options.my[ 0 ] === "right" ) {
+			position.left -= elemWidth;
+		} else if ( options.my[ 0 ] === "center" ) {
+			position.left -= elemWidth / 2;
+		}
+
+		if ( options.my[ 1 ] === "bottom" ) {
+			position.top -= elemHeight;
+		} else if ( options.my[ 1 ] === "center" ) {
+			position.top -= elemHeight / 2;
+		}
+
+		position.left += myOffset[ 0 ];
+		position.top += myOffset[ 1 ];
+
+		collisionPosition = {
+			marginLeft: marginLeft,
+			marginTop: marginTop
+		};
+
+		$.each( [ "left", "top" ], function( i, dir ) {
+			if ( $.ui.position[ collision[ i ] ] ) {
+				$.ui.position[ collision[ i ] ][ dir ]( position, {
+					targetWidth: targetWidth,
+					targetHeight: targetHeight,
+					elemWidth: elemWidth,
+					elemHeight: elemHeight,
+					collisionPosition: collisionPosition,
+					collisionWidth: collisionWidth,
+					collisionHeight: collisionHeight,
+					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
+					my: options.my,
+					at: options.at,
+					within: within,
+					elem: elem
+				} );
+			}
+		} );
+
+		if ( options.using ) {
+
+			// Adds feedback as second argument to using callback, if present
+			using = function( props ) {
+				var left = targetOffset.left - position.left,
+					right = left + targetWidth - elemWidth,
+					top = targetOffset.top - position.top,
+					bottom = top + targetHeight - elemHeight,
+					feedback = {
+						target: {
+							element: target,
+							left: targetOffset.left,
+							top: targetOffset.top,
+							width: targetWidth,
+							height: targetHeight
+						},
+						element: {
+							element: elem,
+							left: position.left,
+							top: position.top,
+							width: elemWidth,
+							height: elemHeight
+						},
+						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
+						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
+					};
+				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
+					feedback.horizontal = "center";
+				}
+				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
+					feedback.vertical = "middle";
+				}
+				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
+					feedback.important = "horizontal";
+				} else {
+					feedback.important = "vertical";
+				}
+				options.using.call( this, props, feedback );
+			};
+		}
+
+		elem.offset( $.extend( position, { using: using } ) );
+	} );
+};
+
+$.ui.position = {
+	fit: {
+		left: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
+				outerWidth = within.width,
+				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+				overLeft = withinOffset - collisionPosLeft,
+				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
+				newOverRight;
+
+			// Element is wider than within
+			if ( data.collisionWidth > outerWidth ) {
+
+				// Element is initially over the left side of within
+				if ( overLeft > 0 && overRight <= 0 ) {
+					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
+						withinOffset;
+					position.left += overLeft - newOverRight;
+
+				// Element is initially over right side of within
+				} else if ( overRight > 0 && overLeft <= 0 ) {
+					position.left = withinOffset;
+
+				// Element is initially over both left and right sides of within
+				} else {
+					if ( overLeft > overRight ) {
+						position.left = withinOffset + outerWidth - data.collisionWidth;
+					} else {
+						position.left = withinOffset;
+					}
+				}
+
+			// Too far left -> align with left edge
+			} else if ( overLeft > 0 ) {
+				position.left += overLeft;
+
+			// Too far right -> align with right edge
+			} else if ( overRight > 0 ) {
+				position.left -= overRight;
+
+			// Adjust based on position and margin
+			} else {
+				position.left = max( position.left - collisionPosLeft, position.left );
+			}
+		},
+		top: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
+				outerHeight = data.within.height,
+				collisionPosTop = position.top - data.collisionPosition.marginTop,
+				overTop = withinOffset - collisionPosTop,
+				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
+				newOverBottom;
+
+			// Element is taller than within
+			if ( data.collisionHeight > outerHeight ) {
+
+				// Element is initially over the top of within
+				if ( overTop > 0 && overBottom <= 0 ) {
+					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
+						withinOffset;
+					position.top += overTop - newOverBottom;
+
+				// Element is initially over bottom of within
+				} else if ( overBottom > 0 && overTop <= 0 ) {
+					position.top = withinOffset;
+
+				// Element is initially over both top and bottom of within
+				} else {
+					if ( overTop > overBottom ) {
+						position.top = withinOffset + outerHeight - data.collisionHeight;
+					} else {
+						position.top = withinOffset;
+					}
+				}
+
+			// Too far up -> align with top
+			} else if ( overTop > 0 ) {
+				position.top += overTop;
+
+			// Too far down -> align with bottom edge
+			} else if ( overBottom > 0 ) {
+				position.top -= overBottom;
+
+			// Adjust based on position and margin
+			} else {
+				position.top = max( position.top - collisionPosTop, position.top );
+			}
+		}
+	},
+	flip: {
+		left: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.offset.left + within.scrollLeft,
+				outerWidth = within.width,
+				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
+				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+				overLeft = collisionPosLeft - offsetLeft,
+				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
+				myOffset = data.my[ 0 ] === "left" ?
+					-data.elemWidth :
+					data.my[ 0 ] === "right" ?
+						data.elemWidth :
+						0,
+				atOffset = data.at[ 0 ] === "left" ?
+					data.targetWidth :
+					data.at[ 0 ] === "right" ?
+						-data.targetWidth :
+						0,
+				offset = -2 * data.offset[ 0 ],
+				newOverRight,
+				newOverLeft;
+
+			if ( overLeft < 0 ) {
+				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
+					outerWidth - withinOffset;
+				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
+					position.left += myOffset + atOffset + offset;
+				}
+			} else if ( overRight > 0 ) {
+				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
+					atOffset + offset - offsetLeft;
+				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
+					position.left += myOffset + atOffset + offset;
+				}
+			}
+		},
+		top: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.offset.top + within.scrollTop,
+				outerHeight = within.height,
+				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
+				collisionPosTop = position.top - data.collisionPosition.marginTop,
+				overTop = collisionPosTop - offsetTop,
+				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
+				top = data.my[ 1 ] === "top",
+				myOffset = top ?
+					-data.elemHeight :
+					data.my[ 1 ] === "bottom" ?
+						data.elemHeight :
+						0,
+				atOffset = data.at[ 1 ] === "top" ?
+					data.targetHeight :
+					data.at[ 1 ] === "bottom" ?
+						-data.targetHeight :
+						0,
+				offset = -2 * data.offset[ 1 ],
+				newOverTop,
+				newOverBottom;
+			if ( overTop < 0 ) {
+				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
+					outerHeight - withinOffset;
+				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
+					position.top += myOffset + atOffset + offset;
+				}
+			} else if ( overBottom > 0 ) {
+				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
+					offset - offsetTop;
+				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
+					position.top += myOffset + atOffset + offset;
+				}
+			}
+		}
+	},
+	flipfit: {
+		left: function() {
+			$.ui.position.flip.left.apply( this, arguments );
+			$.ui.position.fit.left.apply( this, arguments );
+		},
+		top: function() {
+			$.ui.position.flip.top.apply( this, arguments );
+			$.ui.position.fit.top.apply( this, arguments );
+		}
+	}
+};
+
+} )();
+
+return $.ui.position;
+
+} ) );
+
+
+
+/*!
+ * jQuery UI Tabbable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: :tabbable Selector
+//>>group: Core
+//>>description: Selects elements which can be tabbed to.
+//>>docs: http://api.jqueryui.com/tabbable-selector/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version", "./focusable" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+return $.extend( $.expr[ ":" ], {
+	tabbable: function( element ) {
+		var tabIndex = $.attr( element, "tabindex" ),
+			hasTabindex = tabIndex != null;
+		return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );
+	}
+} );
+
+} ) );
+
+
+/*!
+ * jQuery UI Unique ID 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: uniqueId
+//>>group: Core
+//>>description: Functions to generate and remove uniqueId's
+//>>docs: http://api.jqueryui.com/uniqueId/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+return $.fn.extend( {
+	uniqueId: ( function() {
+		var uuid = 0;
+
+		return function() {
+			return this.each( function() {
+				if ( !this.id ) {
+					this.id = "ui-id-" + ( ++uuid );
+				}
+			} );
+		};
+	} )(),
+
+	removeUniqueId: function() {
+		return this.each( function() {
+			if ( /^ui-id-\d+$/.test( this.id ) ) {
+				$( this ).removeAttr( "id" );
+			}
+		} );
+	}
+} );
+
+} ) );
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*!
+ * jQuery UI Dialog 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Dialog
+//>>group: Widgets
+//>>description: Displays customizable dialog windows.
+//>>docs: http://api.jqueryui.com/dialog/
+//>>demos: http://jqueryui.com/dialog/
+//>>css.structure: ../../themes/base/core.css
+//>>css.structure: ../../themes/base/dialog.css
+//>>css.theme: ../../themes/base/theme.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"./button",
+			"./draggable",
+			"./mouse",
+			"./resizable",
+			"../focusable",
+			"../keycode",
+			"../position",
+			"../safe-active-element",
+			"../safe-blur",
+			"../tabbable",
+			"../unique-id",
+			"../version",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+$.widget( "ui.dialog", {
+	version: "1.12.1",
+	options: {
+		appendTo: "body",
+		autoOpen: true,
+		buttons: [],
+		classes: {
+			"ui-dialog": "ui-corner-all",
+			"ui-dialog-titlebar": "ui-corner-all"
+		},
+		closeOnEscape: true,
+		closeText: "Close",
+		draggable: true,
+		hide: null,
+		height: "auto",
+		maxHeight: null,
+		maxWidth: null,
+		minHeight: 150,
+		minWidth: 150,
+		modal: false,
+		position: {
+			my: "center",
+			at: "center",
+			of: window,
+			collision: "fit",
+
+			// Ensure the titlebar is always visible
+			using: function( pos ) {
+				var topOffset = $( this ).css( pos ).offset().top;
+				if ( topOffset < 0 ) {
+					$( this ).css( "top", pos.top - topOffset );
+				}
+			}
+		},
+		resizable: true,
+		show: null,
+		title: null,
+		width: 300,
+
+		// Callbacks
+		beforeClose: null,
+		close: null,
+		drag: null,
+		dragStart: null,
+		dragStop: null,
+		focus: null,
+		open: null,
+		resize: null,
+		resizeStart: null,
+		resizeStop: null
+	},
+
+	sizeRelatedOptions: {
+		buttons: true,
+		height: true,
+		maxHeight: true,
+		maxWidth: true,
+		minHeight: true,
+		minWidth: true,
+		width: true
+	},
+
+	resizableRelatedOptions: {
+		maxHeight: true,
+		maxWidth: true,
+		minHeight: true,
+		minWidth: true
+	},
+
+	_create: function() {
+		this.originalCss = {
+			display: this.element[ 0 ].style.display,
+			width: this.element[ 0 ].style.width,
+			minHeight: this.element[ 0 ].style.minHeight,
+			maxHeight: this.element[ 0 ].style.maxHeight,
+			height: this.element[ 0 ].style.height
+		};
+		this.originalPosition = {
+			parent: this.element.parent(),
+			index: this.element.parent().children().index( this.element )
+		};
+		this.originalTitle = this.element.attr( "title" );
+		if ( this.options.title == null && this.originalTitle != null ) {
+			this.options.title = this.originalTitle;
+		}
+
+		// Dialogs can't be disabled
+		if ( this.options.disabled ) {
+			this.options.disabled = false;
+		}
+
+		this._createWrapper();
+
+		this.element
+			.show()
+			.removeAttr( "title" )
+			.appendTo( this.uiDialog );
+
+		this._addClass( "ui-dialog-content", "ui-widget-content" );
+
+		this._createTitlebar();
+		this._createButtonPane();
+
+		if ( this.options.draggable && $.fn.draggable ) {
+			this._makeDraggable();
+		}
+		if ( this.options.resizable && $.fn.resizable ) {
+			this._makeResizable();
+		}
+
+		this._isOpen = false;
+
+		this._trackFocus();
+	},
+
+	_init: function() {
+		if ( this.options.autoOpen ) {
+			this.open();
+		}
+	},
+
+	_appendTo: function() {
+		var element = this.options.appendTo;
+		if ( element && ( element.jquery || element.nodeType ) ) {
+			return $( element );
+		}
+		return this.document.find( element || "body" ).eq( 0 );
+	},
+
+	_destroy: function() {
+		var next,
+			originalPosition = this.originalPosition;
+
+		this._untrackInstance();
+		this._destroyOverlay();
+
+		this.element
+			.removeUniqueId()
+			.css( this.originalCss )
+
+			// Without detaching first, the following becomes really slow
+			.detach();
+
+		this.uiDialog.remove();
+
+		if ( this.originalTitle ) {
+			this.element.attr( "title", this.originalTitle );
+		}
+
+		next = originalPosition.parent.children().eq( originalPosition.index );
+
+		// Don't try to place the dialog next to itself (#8613)
+		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
+			next.before( this.element );
+		} else {
+			originalPosition.parent.append( this.element );
+		}
+	},
+
+	widget: function() {
+		return this.uiDialog;
+	},
+
+	disable: $.noop,
+	enable: $.noop,
+
+	close: function( event ) {
+		var that = this;
+
+		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
+			return;
+		}
+
+		this._isOpen = false;
+		this._focusedElement = null;
+		this._destroyOverlay();
+		this._untrackInstance();
+
+		if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) {
+
+			// Hiding a focused element doesn't trigger blur in WebKit
+			// so in case we have nothing to focus on, explicitly blur the active element
+			// https://bugs.webkit.org/show_bug.cgi?id=47182
+			$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
+		}
+
+		this._hide( this.uiDialog, this.options.hide, function() {
+			that._trigger( "close", event );
+		} );
+	},
+
+	isOpen: function() {
+		return this._isOpen;
+	},
+
+	moveToTop: function() {
+		this._moveToTop();
+	},
+
+	_moveToTop: function( event, silent ) {
+		var moved = false,
+			zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() {
+				return +$( this ).css( "z-index" );
+			} ).get(),
+			zIndexMax = Math.max.apply( null, zIndices );
+
+		if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
+			this.uiDialog.css( "z-index", zIndexMax + 1 );
+			moved = true;
+		}
+
+		if ( moved && !silent ) {
+			this._trigger( "focus", event );
+		}
+		return moved;
+	},
+
+	open: function() {
+		var that = this;
+		if ( this._isOpen ) {
+			if ( this._moveToTop() ) {
+				this._focusTabbable();
+			}
+			return;
+		}
+
+		this._isOpen = true;
+		this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
+
+		this._size();
+		this._position();
+		this._createOverlay();
+		this._moveToTop( null, true );
+
+		// Ensure the overlay is moved to the top with the dialog, but only when
+		// opening. The overlay shouldn't move after the dialog is open so that
+		// modeless dialogs opened after the modal dialog stack properly.
+		if ( this.overlay ) {
+			this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
+		}
+
+		this._show( this.uiDialog, this.options.show, function() {
+			that._focusTabbable();
+			that._trigger( "focus" );
+		} );
+
+		// Track the dialog immediately upon openening in case a focus event
+		// somehow occurs outside of the dialog before an element inside the
+		// dialog is focused (#10152)
+		this._makeFocusTarget();
+
+		this._trigger( "open" );
+	},
+
+	_focusTabbable: function() {
+
+		// Set focus to the first match:
+		// 1. An element that was focused previously
+		// 2. First element inside the dialog matching [autofocus]
+		// 3. Tabbable element inside the content element
+		// 4. Tabbable element inside the buttonpane
+		// 5. The close button
+		// 6. The dialog itself
+		var hasFocus = this._focusedElement;
+		if ( !hasFocus ) {
+			hasFocus = this.element.find( "[autofocus]" );
+		}
+		if ( !hasFocus.length ) {
+			hasFocus = this.element.find( ":tabbable" );
+		}
+		if ( !hasFocus.length ) {
+			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
+		}
+		if ( !hasFocus.length ) {
+			hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
+		}
+		if ( !hasFocus.length ) {
+			hasFocus = this.uiDialog;
+		}
+		hasFocus.eq( 0 ).trigger( "focus" );
+	},
+
+	_keepFocus: function( event ) {
+		function checkFocus() {
+			var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
+				isActive = this.uiDialog[ 0 ] === activeElement ||
+					$.contains( this.uiDialog[ 0 ], activeElement );
+			if ( !isActive ) {
+				this._focusTabbable();
+			}
+		}
+		event.preventDefault();
+		checkFocus.call( this );
+
+		// support: IE
+		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
+		// so we check again later
+		this._delay( checkFocus );
+	},
+
+	_createWrapper: function() {
+		this.uiDialog = $( "<div>" )
+			.hide()
+			.attr( {
+
+				// Setting tabIndex makes the div focusable
+				tabIndex: -1,
+				role: "dialog"
+			} )
+			.appendTo( this._appendTo() );
+
+		this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" );
+		this._on( this.uiDialog, {
+			keydown: function( event ) {
+				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+						event.keyCode === $.ui.keyCode.ESCAPE ) {
+					event.preventDefault();
+					this.close( event );
+					return;
+				}
+
+				// Prevent tabbing out of dialogs
+				if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
+					return;
+				}
+				var tabbables = this.uiDialog.find( ":tabbable" ),
+					first = tabbables.filter( ":first" ),
+					last = tabbables.filter( ":last" );
+
+				if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
+						!event.shiftKey ) {
+					this._delay( function() {
+						first.trigger( "focus" );
+					} );
+					event.preventDefault();
+				} else if ( ( event.target === first[ 0 ] ||
+						event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
+					this._delay( function() {
+						last.trigger( "focus" );
+					} );
+					event.preventDefault();
+				}
+			},
+			mousedown: function( event ) {
+				if ( this._moveToTop( event ) ) {
+					this._focusTabbable();
+				}
+			}
+		} );
+
+		// We assume that any existing aria-describedby attribute means
+		// that the dialog content is marked up properly
+		// otherwise we brute force the content as the description
+		if ( !this.element.find( "[aria-describedby]" ).length ) {
+			this.uiDialog.attr( {
+				"aria-describedby": this.element.uniqueId().attr( "id" )
+			} );
+		}
+	},
+
+	_createTitlebar: function() {
+		var uiDialogTitle;
+
+		this.uiDialogTitlebar = $( "<div>" );
+		this._addClass( this.uiDialogTitlebar,
+			"ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" );
+		this._on( this.uiDialogTitlebar, {
+			mousedown: function( event ) {
+
+				// Don't prevent click on close button (#8838)
+				// Focusing a dialog that is partially scrolled out of view
+				// causes the browser to scroll it into view, preventing the click event
+				if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
+
+					// Dialog isn't getting focus when dragging (#8063)
+					this.uiDialog.trigger( "focus" );
+				}
+			}
+		} );
+
+		// Support: IE
+		// Use type="button" to prevent enter keypresses in textboxes from closing the
+		// dialog in IE (#9312)
+		this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
+			.button( {
+				label: $( "<a>" ).text( this.options.closeText ).html(),
+				icon: "ui-icon-closethick",
+				showLabel: false
+			} )
+			.appendTo( this.uiDialogTitlebar );
+
+		this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" );
+		this._on( this.uiDialogTitlebarClose, {
+			click: function( event ) {
+				event.preventDefault();
+				this.close( event );
+			}
+		} );
+
+		uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar );
+		this._addClass( uiDialogTitle, "ui-dialog-title" );
+		this._title( uiDialogTitle );
+
+		this.uiDialogTitlebar.prependTo( this.uiDialog );
+
+		this.uiDialog.attr( {
+			"aria-labelledby": uiDialogTitle.attr( "id" )
+		} );
+	},
+
+	_title: function( title ) {
+		if ( this.options.title ) {
+			title.text( this.options.title );
+		} else {
+			title.html( "&#160;" );
+		}
+	},
+
+	_createButtonPane: function() {
+		this.uiDialogButtonPane = $( "<div>" );
+		this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane",
+			"ui-widget-content ui-helper-clearfix" );
+
+		this.uiButtonSet = $( "<div>" )
+			.appendTo( this.uiDialogButtonPane );
+		this._addClass( this.uiButtonSet, "ui-dialog-buttonset" );
+
+		this._createButtons();
+	},
+
+	_createButtons: function() {
+		var that = this,
+			buttons = this.options.buttons;
+
+		// If we already have a button pane, remove it
+		this.uiDialogButtonPane.remove();
+		this.uiButtonSet.empty();
+
+		if ( $.isEmptyObject( buttons ) || ( $.isArray( buttons ) && !buttons.length ) ) {
+			this._removeClass( this.uiDialog, "ui-dialog-buttons" );
+			return;
+		}
+
+		$.each( buttons, function( name, props ) {
+			var click, buttonOptions;
+			props = $.isFunction( props ) ?
+				{ click: props, text: name } :
+				props;
+
+			// Default to a non-submitting button
+			props = $.extend( { type: "button" }, props );
+
+			// Change the context for the click callback to be the main element
+			click = props.click;
+			buttonOptions = {
+				icon: props.icon,
+				iconPosition: props.iconPosition,
+				showLabel: props.showLabel,
+
+				// Deprecated options
+				icons: props.icons,
+				text: props.text
+			};
+
+			delete props.click;
+			delete props.icon;
+			delete props.iconPosition;
+			delete props.showLabel;
+
+			// Deprecated options
+			delete props.icons;
+			if ( typeof props.text === "boolean" ) {
+				delete props.text;
+			}
+
+			$( "<button></button>", props )
+				.button( buttonOptions )
+				.appendTo( that.uiButtonSet )
+				.on( "click", function() {
+					click.apply( that.element[ 0 ], arguments );
+				} );
+		} );
+		this._addClass( this.uiDialog, "ui-dialog-buttons" );
+		this.uiDialogButtonPane.appendTo( this.uiDialog );
+	},
+
+	_makeDraggable: function() {
+		var that = this,
+			options = this.options;
+
+		function filteredUi( ui ) {
+			return {
+				position: ui.position,
+				offset: ui.offset
+			};
+		}
+
+		this.uiDialog.draggable( {
+			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
+			handle: ".ui-dialog-titlebar",
+			containment: "document",
+			start: function( event, ui ) {
+				that._addClass( $( this ), "ui-dialog-dragging" );
+				that._blockFrames();
+				that._trigger( "dragStart", event, filteredUi( ui ) );
+			},
+			drag: function( event, ui ) {
+				that._trigger( "drag", event, filteredUi( ui ) );
+			},
+			stop: function( event, ui ) {
+				var left = ui.offset.left - that.document.scrollLeft(),
+					top = ui.offset.top - that.document.scrollTop();
+
+				options.position = {
+					my: "left top",
+					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
+						"top" + ( top >= 0 ? "+" : "" ) + top,
+					of: that.window
+				};
+				that._removeClass( $( this ), "ui-dialog-dragging" );
+				that._unblockFrames();
+				that._trigger( "dragStop", event, filteredUi( ui ) );
+			}
+		} );
+	},
+
+	_makeResizable: function() {
+		var that = this,
+			options = this.options,
+			handles = options.resizable,
+
+			// .ui-resizable has position: relative defined in the stylesheet
+			// but dialogs have to use absolute or fixed positioning
+			position = this.uiDialog.css( "position" ),
+			resizeHandles = typeof handles === "string" ?
+				handles :
+				"n,e,s,w,se,sw,ne,nw";
+
+		function filteredUi( ui ) {
+			return {
+				originalPosition: ui.originalPosition,
+				originalSize: ui.originalSize,
+				position: ui.position,
+				size: ui.size
+			};
+		}
+
+		this.uiDialog.resizable( {
+			cancel: ".ui-dialog-content",
+			containment: "document",
+			alsoResize: this.element,
+			maxWidth: options.maxWidth,
+			maxHeight: options.maxHeight,
+			minWidth: options.minWidth,
+			minHeight: this._minHeight(),
+			handles: resizeHandles,
+			start: function( event, ui ) {
+				that._addClass( $( this ), "ui-dialog-resizing" );
+				that._blockFrames();
+				that._trigger( "resizeStart", event, filteredUi( ui ) );
+			},
+			resize: function( event, ui ) {
+				that._trigger( "resize", event, filteredUi( ui ) );
+			},
+			stop: function( event, ui ) {
+				var offset = that.uiDialog.offset(),
+					left = offset.left - that.document.scrollLeft(),
+					top = offset.top - that.document.scrollTop();
+
+				options.height = that.uiDialog.height();
+				options.width = that.uiDialog.width();
+				options.position = {
+					my: "left top",
+					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
+						"top" + ( top >= 0 ? "+" : "" ) + top,
+					of: that.window
+				};
+				that._removeClass( $( this ), "ui-dialog-resizing" );
+				that._unblockFrames();
+				that._trigger( "resizeStop", event, filteredUi( ui ) );
+			}
+		} )
+			.css( "position", position );
+	},
+
+	_trackFocus: function() {
+		this._on( this.widget(), {
+			focusin: function( event ) {
+				this._makeFocusTarget();
+				this._focusedElement = $( event.target );
+			}
+		} );
+	},
+
+	_makeFocusTarget: function() {
+		this._untrackInstance();
+		this._trackingInstances().unshift( this );
+	},
+
+	_untrackInstance: function() {
+		var instances = this._trackingInstances(),
+			exists = $.inArray( this, instances );
+		if ( exists !== -1 ) {
+			instances.splice( exists, 1 );
+		}
+	},
+
+	_trackingInstances: function() {
+		var instances = this.document.data( "ui-dialog-instances" );
+		if ( !instances ) {
+			instances = [];
+			this.document.data( "ui-dialog-instances", instances );
+		}
+		return instances;
+	},
+
+	_minHeight: function() {
+		var options = this.options;
+
+		return options.height === "auto" ?
+			options.minHeight :
+			Math.min( options.minHeight, options.height );
+	},
+
+	_position: function() {
+
+		// Need to show the dialog to get the actual offset in the position plugin
+		var isVisible = this.uiDialog.is( ":visible" );
+		if ( !isVisible ) {
+			this.uiDialog.show();
+		}
+		this.uiDialog.position( this.options.position );
+		if ( !isVisible ) {
+			this.uiDialog.hide();
+		}
+	},
+
+	_setOptions: function( options ) {
+		var that = this,
+			resize = false,
+			resizableOptions = {};
+
+		$.each( options, function( key, value ) {
+			that._setOption( key, value );
+
+			if ( key in that.sizeRelatedOptions ) {
+				resize = true;
+			}
+			if ( key in that.resizableRelatedOptions ) {
+				resizableOptions[ key ] = value;
+			}
+		} );
+
+		if ( resize ) {
+			this._size();
+			this._position();
+		}
+		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
+			this.uiDialog.resizable( "option", resizableOptions );
+		}
+	},
+
+	_setOption: function( key, value ) {
+		var isDraggable, isResizable,
+			uiDialog = this.uiDialog;
+
+		if ( key === "disabled" ) {
+			return;
+		}
+
+		this._super( key, value );
+
+		if ( key === "appendTo" ) {
+			this.uiDialog.appendTo( this._appendTo() );
+		}
+
+		if ( key === "buttons" ) {
+			this._createButtons();
+		}
+
+		if ( key === "closeText" ) {
+			this.uiDialogTitlebarClose.button( {
+
+				// Ensure that we always pass a string
+				label: $( "<a>" ).text( "" + this.options.closeText ).html()
+			} );
+		}
+
+		if ( key === "draggable" ) {
+			isDraggable = uiDialog.is( ":data(ui-draggable)" );
+			if ( isDraggable && !value ) {
+				uiDialog.draggable( "destroy" );
+			}
+
+			if ( !isDraggable && value ) {
+				this._makeDraggable();
+			}
+		}
+
+		if ( key === "position" ) {
+			this._position();
+		}
+
+		if ( key === "resizable" ) {
+
+			// currently resizable, becoming non-resizable
+			isResizable = uiDialog.is( ":data(ui-resizable)" );
+			if ( isResizable && !value ) {
+				uiDialog.resizable( "destroy" );
+			}
+
+			// Currently resizable, changing handles
+			if ( isResizable && typeof value === "string" ) {
+				uiDialog.resizable( "option", "handles", value );
+			}
+
+			// Currently non-resizable, becoming resizable
+			if ( !isResizable && value !== false ) {
+				this._makeResizable();
+			}
+		}
+
+		if ( key === "title" ) {
+			this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
+		}
+	},
+
+	_size: function() {
+
+		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+		// divs will both have width and height set, so we need to reset them
+		var nonContentHeight, minContentHeight, maxContentHeight,
+			options = this.options;
+
+		// Reset content sizing
+		this.element.show().css( {
+			width: "auto",
+			minHeight: 0,
+			maxHeight: "none",
+			height: 0
+		} );
+
+		if ( options.minWidth > options.width ) {
+			options.width = options.minWidth;
+		}
+
+		// Reset wrapper sizing
+		// determine the height of all the non-content elements
+		nonContentHeight = this.uiDialog.css( {
+			height: "auto",
+			width: options.width
+		} )
+			.outerHeight();
+		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+		maxContentHeight = typeof options.maxHeight === "number" ?
+			Math.max( 0, options.maxHeight - nonContentHeight ) :
+			"none";
+
+		if ( options.height === "auto" ) {
+			this.element.css( {
+				minHeight: minContentHeight,
+				maxHeight: maxContentHeight,
+				height: "auto"
+			} );
+		} else {
+			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
+		}
+
+		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
+			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
+		}
+	},
+
+	_blockFrames: function() {
+		this.iframeBlocks = this.document.find( "iframe" ).map( function() {
+			var iframe = $( this );
+
+			return $( "<div>" )
+				.css( {
+					position: "absolute",
+					width: iframe.outerWidth(),
+					height: iframe.outerHeight()
+				} )
+				.appendTo( iframe.parent() )
+				.offset( iframe.offset() )[ 0 ];
+		} );
+	},
+
+	_unblockFrames: function() {
+		if ( this.iframeBlocks ) {
+			this.iframeBlocks.remove();
+			delete this.iframeBlocks;
+		}
+	},
+
+	_allowInteraction: function( event ) {
+		if ( $( event.target ).closest( ".ui-dialog" ).length ) {
+			return true;
+		}
+
+		// TODO: Remove hack when datepicker implements
+		// the .ui-front logic (#8989)
+		return !!$( event.target ).closest( ".ui-datepicker" ).length;
+	},
+
+	_createOverlay: function() {
+		if ( !this.options.modal ) {
+			return;
+		}
+
+		// We use a delay in case the overlay is created from an
+		// event that we're going to be cancelling (#2804)
+		var isOpening = true;
+		this._delay( function() {
+			isOpening = false;
+		} );
+
+		if ( !this.document.data( "ui-dialog-overlays" ) ) {
+
+			// Prevent use of anchors and inputs
+			// Using _on() for an event handler shared across many instances is
+			// safe because the dialogs stack and must be closed in reverse order
+			this._on( this.document, {
+				focusin: function( event ) {
+					if ( isOpening ) {
+						return;
+					}
+
+					if ( !this._allowInteraction( event ) ) {
+						event.preventDefault();
+						this._trackingInstances()[ 0 ]._focusTabbable();
+					}
+				}
+			} );
+		}
+
+		this.overlay = $( "<div>" )
+			.appendTo( this._appendTo() );
+
+		this._addClass( this.overlay, null, "ui-widget-overlay ui-front" );
+		this._on( this.overlay, {
+			mousedown: "_keepFocus"
+		} );
+		this.document.data( "ui-dialog-overlays",
+			( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 );
+	},
+
+	_destroyOverlay: function() {
+		if ( !this.options.modal ) {
+			return;
+		}
+
+		if ( this.overlay ) {
+			var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
+
+			if ( !overlays ) {
+				this._off( this.document, "focusin" );
+				this.document.removeData( "ui-dialog-overlays" );
+			} else {
+				this.document.data( "ui-dialog-overlays", overlays );
+			}
+
+			this.overlay.remove();
+			this.overlay = null;
+		}
+	}
+} );
+
+// DEPRECATED
+// TODO: switch return back to widget declaration at top of file when this is removed
+if ( $.uiBackCompat !== false ) {
+
+	// Backcompat for dialogClass option
+	$.widget( "ui.dialog", $.ui.dialog, {
+		options: {
+			dialogClass: ""
+		},
+		_createWrapper: function() {
+			this._super();
+			this.uiDialog.addClass( this.options.dialogClass );
+		},
+		_setOption: function( key, value ) {
+			if ( key === "dialogClass" ) {
+				this.uiDialog
+					.removeClass( this.options.dialogClass )
+					.addClass( value );
+			}
+			this._superApply( arguments );
+		}
+	} );
+}
+
+return $.ui.dialog;
+
+} ) );
+
+
+
+
+
+
+
+/*!
+ * jQuery UI Sortable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Sortable
+//>>group: Interactions
+//>>description: Enables items in a list to be sorted using the mouse.
+//>>docs: http://api.jqueryui.com/sortable/
+//>>demos: http://jqueryui.com/sortable/
+//>>css.structure: ../../themes/base/sortable.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"./mouse",
+			"../data",
+			"../ie",
+			"../scroll-parent",
+			"../version",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+return $.widget( "ui.sortable", $.ui.mouse, {
+	version: "1.12.1",
+	widgetEventPrefix: "sort",
+	ready: false,
+	options: {
+		appendTo: "parent",
+		axis: false,
+		connectWith: false,
+		containment: false,
+		cursor: "auto",
+		cursorAt: false,
+		dropOnEmpty: true,
+		forcePlaceholderSize: false,
+		forceHelperSize: false,
+		grid: false,
+		handle: false,
+		helper: "original",
+		items: "> *",
+		opacity: false,
+		placeholder: false,
+		revert: false,
+		scroll: true,
+		scrollSensitivity: 20,
+		scrollSpeed: 20,
+		scope: "default",
+		tolerance: "intersect",
+		zIndex: 1000,
+
+		// Callbacks
+		activate: null,
+		beforeStop: null,
+		change: null,
+		deactivate: null,
+		out: null,
+		over: null,
+		receive: null,
+		remove: null,
+		sort: null,
+		start: null,
+		stop: null,
+		update: null
+	},
+
+	_isOverAxis: function( x, reference, size ) {
+		return ( x >= reference ) && ( x < ( reference + size ) );
+	},
+
+	_isFloating: function( item ) {
+		return ( /left|right/ ).test( item.css( "float" ) ) ||
+			( /inline|table-cell/ ).test( item.css( "display" ) );
+	},
+
+	_create: function() {
+		this.containerCache = {};
+		this._addClass( "ui-sortable" );
+
+		//Get the items
+		this.refresh();
+
+		//Let's determine the parent's offset
+		this.offset = this.element.offset();
+
+		//Initialize mouse events for interaction
+		this._mouseInit();
+
+		this._setHandleClassName();
+
+		//We're ready to go
+		this.ready = true;
+
+	},
+
+	_setOption: function( key, value ) {
+		this._super( key, value );
+
+		if ( key === "handle" ) {
+			this._setHandleClassName();
+		}
+	},
+
+	_setHandleClassName: function() {
+		var that = this;
+		this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" );
+		$.each( this.items, function() {
+			that._addClass(
+				this.instance.options.handle ?
+					this.item.find( this.instance.options.handle ) :
+					this.item,
+				"ui-sortable-handle"
+			);
+		} );
+	},
+
+	_destroy: function() {
+		this._mouseDestroy();
+
+		for ( var i = this.items.length - 1; i >= 0; i-- ) {
+			this.items[ i ].item.removeData( this.widgetName + "-item" );
+		}
+
+		return this;
+	},
+
+	_mouseCapture: function( event, overrideHandle ) {
+		var currentItem = null,
+			validHandle = false,
+			that = this;
+
+		if ( this.reverting ) {
+			return false;
+		}
+
+		if ( this.options.disabled || this.options.type === "static" ) {
+			return false;
+		}
+
+		//We have to refresh the items data once first
+		this._refreshItems( event );
+
+		//Find out if the clicked node (or one of its parents) is a actual item in this.items
+		$( event.target ).parents().each( function() {
+			if ( $.data( this, that.widgetName + "-item" ) === that ) {
+				currentItem = $( this );
+				return false;
+			}
+		} );
+		if ( $.data( event.target, that.widgetName + "-item" ) === that ) {
+			currentItem = $( event.target );
+		}
+
+		if ( !currentItem ) {
+			return false;
+		}
+		if ( this.options.handle && !overrideHandle ) {
+			$( this.options.handle, currentItem ).find( "*" ).addBack().each( function() {
+				if ( this === event.target ) {
+					validHandle = true;
+				}
+			} );
+			if ( !validHandle ) {
+				return false;
+			}
+		}
+
+		this.currentItem = currentItem;
+		this._removeCurrentsFromItems();
+		return true;
+
+	},
+
+	_mouseStart: function( event, overrideHandle, noActivation ) {
+
+		var i, body,
+			o = this.options;
+
+		this.currentContainer = this;
+
+		//We only need to call refreshPositions, because the refreshItems call has been moved to
+		// mouseCapture
+		this.refreshPositions();
+
+		//Create and append the visible helper
+		this.helper = this._createHelper( event );
+
+		//Cache the helper size
+		this._cacheHelperProportions();
+
+		/*
+		 * - Position generation -
+		 * This block generates everything position related - it's the core of draggables.
+		 */
+
+		//Cache the margins of the original element
+		this._cacheMargins();
+
+		//Get the next scrolling parent
+		this.scrollParent = this.helper.scrollParent();
+
+		//The element's absolute position on the page minus margins
+		this.offset = this.currentItem.offset();
+		this.offset = {
+			top: this.offset.top - this.margins.top,
+			left: this.offset.left - this.margins.left
+		};
+
+		$.extend( this.offset, {
+			click: { //Where the click happened, relative to the element
+				left: event.pageX - this.offset.left,
+				top: event.pageY - this.offset.top
+			},
+			parent: this._getParentOffset(),
+
+			// This is a relative to absolute position minus the actual position calculation -
+			// only used for relative positioned helper
+			relative: this._getRelativeOffset()
+		} );
+
+		// Only after we got the offset, we can change the helper's position to absolute
+		// TODO: Still need to figure out a way to make relative sorting possible
+		this.helper.css( "position", "absolute" );
+		this.cssPosition = this.helper.css( "position" );
+
+		//Generate the original position
+		this.originalPosition = this._generatePosition( event );
+		this.originalPageX = event.pageX;
+		this.originalPageY = event.pageY;
+
+		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
+		( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
+
+		//Cache the former DOM position
+		this.domPosition = {
+			prev: this.currentItem.prev()[ 0 ],
+			parent: this.currentItem.parent()[ 0 ]
+		};
+
+		// If the helper is not the original, hide the original so it's not playing any role during
+		// the drag, won't cause anything bad this way
+		if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
+			this.currentItem.hide();
+		}
+
+		//Create the placeholder
+		this._createPlaceholder();
+
+		//Set a containment if given in the options
+		if ( o.containment ) {
+			this._setContainment();
+		}
+
+		if ( o.cursor && o.cursor !== "auto" ) { // cursor option
+			body = this.document.find( "body" );
+
+			// Support: IE
+			this.storedCursor = body.css( "cursor" );
+			body.css( "cursor", o.cursor );
+
+			this.storedStylesheet =
+				$( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body );
+		}
+
+		if ( o.opacity ) { // opacity option
+			if ( this.helper.css( "opacity" ) ) {
+				this._storedOpacity = this.helper.css( "opacity" );
+			}
+			this.helper.css( "opacity", o.opacity );
+		}
+
+		if ( o.zIndex ) { // zIndex option
+			if ( this.helper.css( "zIndex" ) ) {
+				this._storedZIndex = this.helper.css( "zIndex" );
+			}
+			this.helper.css( "zIndex", o.zIndex );
+		}
+
+		//Prepare scrolling
+		if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+				this.scrollParent[ 0 ].tagName !== "HTML" ) {
+			this.overflowOffset = this.scrollParent.offset();
+		}
+
+		//Call callbacks
+		this._trigger( "start", event, this._uiHash() );
+
+		//Recache the helper size
+		if ( !this._preserveHelperProportions ) {
+			this._cacheHelperProportions();
+		}
+
+		//Post "activate" events to possible containers
+		if ( !noActivation ) {
+			for ( i = this.containers.length - 1; i >= 0; i-- ) {
+				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
+			}
+		}
+
+		//Prepare possible droppables
+		if ( $.ui.ddmanager ) {
+			$.ui.ddmanager.current = this;
+		}
+
+		if ( $.ui.ddmanager && !o.dropBehaviour ) {
+			$.ui.ddmanager.prepareOffsets( this, event );
+		}
+
+		this.dragging = true;
+
+		this._addClass( this.helper, "ui-sortable-helper" );
+
+		// Execute the drag once - this causes the helper not to be visiblebefore getting its
+		// correct position
+		this._mouseDrag( event );
+		return true;
+
+	},
+
+	_mouseDrag: function( event ) {
+		var i, item, itemElement, intersection,
+			o = this.options,
+			scrolled = false;
+
+		//Compute the helpers position
+		this.position = this._generatePosition( event );
+		this.positionAbs = this._convertPositionTo( "absolute" );
+
+		if ( !this.lastPositionAbs ) {
+			this.lastPositionAbs = this.positionAbs;
+		}
+
+		//Do scrolling
+		if ( this.options.scroll ) {
+			if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+					this.scrollParent[ 0 ].tagName !== "HTML" ) {
+
+				if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
+						event.pageY < o.scrollSensitivity ) {
+					this.scrollParent[ 0 ].scrollTop =
+						scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
+				} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
+					this.scrollParent[ 0 ].scrollTop =
+						scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;
+				}
+
+				if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
+						event.pageX < o.scrollSensitivity ) {
+					this.scrollParent[ 0 ].scrollLeft = scrolled =
+						this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
+				} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
+					this.scrollParent[ 0 ].scrollLeft = scrolled =
+						this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;
+				}
+
+			} else {
+
+				if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
+					scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
+				} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
+						o.scrollSensitivity ) {
+					scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
+				}
+
+				if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {
+					scrolled = this.document.scrollLeft(
+						this.document.scrollLeft() - o.scrollSpeed
+					);
+				} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
+						o.scrollSensitivity ) {
+					scrolled = this.document.scrollLeft(
+						this.document.scrollLeft() + o.scrollSpeed
+					);
+				}
+
+			}
+
+			if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
+				$.ui.ddmanager.prepareOffsets( this, event );
+			}
+		}
+
+		//Regenerate the absolute position used for position checks
+		this.positionAbs = this._convertPositionTo( "absolute" );
+
+		//Set the helper position
+		if ( !this.options.axis || this.options.axis !== "y" ) {
+			this.helper[ 0 ].style.left = this.position.left + "px";
+		}
+		if ( !this.options.axis || this.options.axis !== "x" ) {
+			this.helper[ 0 ].style.top = this.position.top + "px";
+		}
+
+		//Rearrange
+		for ( i = this.items.length - 1; i >= 0; i-- ) {
+
+			//Cache variables and intersection, continue if no intersection
+			item = this.items[ i ];
+			itemElement = item.item[ 0 ];
+			intersection = this._intersectsWithPointer( item );
+			if ( !intersection ) {
+				continue;
+			}
+
+			// Only put the placeholder inside the current Container, skip all
+			// items from other containers. This works because when moving
+			// an item from one container to another the
+			// currentContainer is switched before the placeholder is moved.
+			//
+			// Without this, moving items in "sub-sortables" can cause
+			// the placeholder to jitter between the outer and inner container.
+			if ( item.instance !== this.currentContainer ) {
+				continue;
+			}
+
+			// Cannot intersect with itself
+			// no useless actions that have been done before
+			// no action if the item moved is the parent of the item checked
+			if ( itemElement !== this.currentItem[ 0 ] &&
+				this.placeholder[ intersection === 1 ? "next" : "prev" ]()[ 0 ] !== itemElement &&
+				!$.contains( this.placeholder[ 0 ], itemElement ) &&
+				( this.options.type === "semi-dynamic" ?
+					!$.contains( this.element[ 0 ], itemElement ) :
+					true
+				)
+			) {
+
+				this.direction = intersection === 1 ? "down" : "up";
+
+				if ( this.options.tolerance === "pointer" || this._intersectsWithSides( item ) ) {
+					this._rearrange( event, item );
+				} else {
+					break;
+				}
+
+				this._trigger( "change", event, this._uiHash() );
+				break;
+			}
+		}
+
+		//Post events to containers
+		this._contactContainers( event );
+
+		//Interconnect with droppables
+		if ( $.ui.ddmanager ) {
+			$.ui.ddmanager.drag( this, event );
+		}
+
+		//Call callbacks
+		this._trigger( "sort", event, this._uiHash() );
+
+		this.lastPositionAbs = this.positionAbs;
+		return false;
+
+	},
+
+	_mouseStop: function( event, noPropagation ) {
+
+		if ( !event ) {
+			return;
+		}
+
+		//If we are using droppables, inform the manager about the drop
+		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
+			$.ui.ddmanager.drop( this, event );
+		}
+
+		if ( this.options.revert ) {
+			var that = this,
+				cur = this.placeholder.offset(),
+				axis = this.options.axis,
+				animation = {};
+
+			if ( !axis || axis === "x" ) {
+				animation.left = cur.left - this.offset.parent.left - this.margins.left +
+					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
+						0 :
+						this.offsetParent[ 0 ].scrollLeft
+					);
+			}
+			if ( !axis || axis === "y" ) {
+				animation.top = cur.top - this.offset.parent.top - this.margins.top +
+					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
+						0 :
+						this.offsetParent[ 0 ].scrollTop
+					);
+			}
+			this.reverting = true;
+			$( this.helper ).animate(
+				animation,
+				parseInt( this.options.revert, 10 ) || 500,
+				function() {
+					that._clear( event );
+				}
+			);
+		} else {
+			this._clear( event, noPropagation );
+		}
+
+		return false;
+
+	},
+
+	cancel: function() {
+
+		if ( this.dragging ) {
+
+			this._mouseUp( new $.Event( "mouseup", { target: null } ) );
+
+			if ( this.options.helper === "original" ) {
+				this.currentItem.css( this._storedCSS );
+				this._removeClass( this.currentItem, "ui-sortable-helper" );
+			} else {
+				this.currentItem.show();
+			}
+
+			//Post deactivating events to containers
+			for ( var i = this.containers.length - 1; i >= 0; i-- ) {
+				this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) );
+				if ( this.containers[ i ].containerCache.over ) {
+					this.containers[ i ]._trigger( "out", null, this._uiHash( this ) );
+					this.containers[ i ].containerCache.over = 0;
+				}
+			}
+
+		}
+
+		if ( this.placeholder ) {
+
+			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
+			// it unbinds ALL events from the original node!
+			if ( this.placeholder[ 0 ].parentNode ) {
+				this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
+			}
+			if ( this.options.helper !== "original" && this.helper &&
+					this.helper[ 0 ].parentNode ) {
+				this.helper.remove();
+			}
+
+			$.extend( this, {
+				helper: null,
+				dragging: false,
+				reverting: false,
+				_noFinalSort: null
+			} );
+
+			if ( this.domPosition.prev ) {
+				$( this.domPosition.prev ).after( this.currentItem );
+			} else {
+				$( this.domPosition.parent ).prepend( this.currentItem );
+			}
+		}
+
+		return this;
+
+	},
+
+	serialize: function( o ) {
+
+		var items = this._getItemsAsjQuery( o && o.connected ),
+			str = [];
+		o = o || {};
+
+		$( items ).each( function() {
+			var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" )
+				.match( o.expression || ( /(.+)[\-=_](.+)/ ) );
+			if ( res ) {
+				str.push(
+					( o.key || res[ 1 ] + "[]" ) +
+					"=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );
+			}
+		} );
+
+		if ( !str.length && o.key ) {
+			str.push( o.key + "=" );
+		}
+
+		return str.join( "&" );
+
+	},
+
+	toArray: function( o ) {
+
+		var items = this._getItemsAsjQuery( o && o.connected ),
+			ret = [];
+
+		o = o || {};
+
+		items.each( function() {
+			ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" );
+		} );
+		return ret;
+
+	},
+
+	/* Be careful with the following core functions */
+	_intersectsWith: function( item ) {
+
+		var x1 = this.positionAbs.left,
+			x2 = x1 + this.helperProportions.width,
+			y1 = this.positionAbs.top,
+			y2 = y1 + this.helperProportions.height,
+			l = item.left,
+			r = l + item.width,
+			t = item.top,
+			b = t + item.height,
+			dyClick = this.offset.click.top,
+			dxClick = this.offset.click.left,
+			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t &&
+				( y1 + dyClick ) < b ),
+			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l &&
+				( x1 + dxClick ) < r ),
+			isOverElement = isOverElementHeight && isOverElementWidth;
+
+		if ( this.options.tolerance === "pointer" ||
+			this.options.forcePointerForContainers ||
+			( this.options.tolerance !== "pointer" &&
+				this.helperProportions[ this.floating ? "width" : "height" ] >
+				item[ this.floating ? "width" : "height" ] )
+		) {
+			return isOverElement;
+		} else {
+
+			return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half
+				x2 - ( this.helperProportions.width / 2 ) < r && // Left Half
+				t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half
+				y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half
+
+		}
+	},
+
+	_intersectsWithPointer: function( item ) {
+		var verticalDirection, horizontalDirection,
+			isOverElementHeight = ( this.options.axis === "x" ) ||
+				this._isOverAxis(
+					this.positionAbs.top + this.offset.click.top, item.top, item.height ),
+			isOverElementWidth = ( this.options.axis === "y" ) ||
+				this._isOverAxis(
+					this.positionAbs.left + this.offset.click.left, item.left, item.width ),
+			isOverElement = isOverElementHeight && isOverElementWidth;
+
+		if ( !isOverElement ) {
+			return false;
+		}
+
+		verticalDirection = this._getDragVerticalDirection();
+		horizontalDirection = this._getDragHorizontalDirection();
+
+		return this.floating ?
+			( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 )
+			: ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) );
+
+	},
+
+	_intersectsWithSides: function( item ) {
+
+		var isOverBottomHalf = this._isOverAxis( this.positionAbs.top +
+				this.offset.click.top, item.top + ( item.height / 2 ), item.height ),
+			isOverRightHalf = this._isOverAxis( this.positionAbs.left +
+				this.offset.click.left, item.left + ( item.width / 2 ), item.width ),
+			verticalDirection = this._getDragVerticalDirection(),
+			horizontalDirection = this._getDragHorizontalDirection();
+
+		if ( this.floating && horizontalDirection ) {
+			return ( ( horizontalDirection === "right" && isOverRightHalf ) ||
+				( horizontalDirection === "left" && !isOverRightHalf ) );
+		} else {
+			return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) ||
+				( verticalDirection === "up" && !isOverBottomHalf ) );
+		}
+
+	},
+
+	_getDragVerticalDirection: function() {
+		var delta = this.positionAbs.top - this.lastPositionAbs.top;
+		return delta !== 0 && ( delta > 0 ? "down" : "up" );
+	},
+
+	_getDragHorizontalDirection: function() {
+		var delta = this.positionAbs.left - this.lastPositionAbs.left;
+		return delta !== 0 && ( delta > 0 ? "right" : "left" );
+	},
+
+	refresh: function( event ) {
+		this._refreshItems( event );
+		this._setHandleClassName();
+		this.refreshPositions();
+		return this;
+	},
+
+	_connectWith: function() {
+		var options = this.options;
+		return options.connectWith.constructor === String ?
+			[ options.connectWith ] :
+			options.connectWith;
+	},
+
+	_getItemsAsjQuery: function( connected ) {
+
+		var i, j, cur, inst,
+			items = [],
+			queries = [],
+			connectWith = this._connectWith();
+
+		if ( connectWith && connected ) {
+			for ( i = connectWith.length - 1; i >= 0; i-- ) {
+				cur = $( connectWith[ i ], this.document[ 0 ] );
+				for ( j = cur.length - 1; j >= 0; j-- ) {
+					inst = $.data( cur[ j ], this.widgetFullName );
+					if ( inst && inst !== this && !inst.options.disabled ) {
+						queries.push( [ $.isFunction( inst.options.items ) ?
+							inst.options.items.call( inst.element ) :
+							$( inst.options.items, inst.element )
+								.not( ".ui-sortable-helper" )
+								.not( ".ui-sortable-placeholder" ), inst ] );
+					}
+				}
+			}
+		}
+
+		queries.push( [ $.isFunction( this.options.items ) ?
+			this.options.items
+				.call( this.element, null, { options: this.options, item: this.currentItem } ) :
+			$( this.options.items, this.element )
+				.not( ".ui-sortable-helper" )
+				.not( ".ui-sortable-placeholder" ), this ] );
+
+		function addItems() {
+			items.push( this );
+		}
+		for ( i = queries.length - 1; i >= 0; i-- ) {
+			queries[ i ][ 0 ].each( addItems );
+		}
+
+		return $( items );
+
+	},
+
+	_removeCurrentsFromItems: function() {
+
+		var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" );
+
+		this.items = $.grep( this.items, function( item ) {
+			for ( var j = 0; j < list.length; j++ ) {
+				if ( list[ j ] === item.item[ 0 ] ) {
+					return false;
+				}
+			}
+			return true;
+		} );
+
+	},
+
+	_refreshItems: function( event ) {
+
+		this.items = [];
+		this.containers = [ this ];
+
+		var i, j, cur, inst, targetData, _queries, item, queriesLength,
+			items = this.items,
+			queries = [ [ $.isFunction( this.options.items ) ?
+				this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :
+				$( this.options.items, this.element ), this ] ],
+			connectWith = this._connectWith();
+
+		//Shouldn't be run the first time through due to massive slow-down
+		if ( connectWith && this.ready ) {
+			for ( i = connectWith.length - 1; i >= 0; i-- ) {
+				cur = $( connectWith[ i ], this.document[ 0 ] );
+				for ( j = cur.length - 1; j >= 0; j-- ) {
+					inst = $.data( cur[ j ], this.widgetFullName );
+					if ( inst && inst !== this && !inst.options.disabled ) {
+						queries.push( [ $.isFunction( inst.options.items ) ?
+							inst.options.items
+								.call( inst.element[ 0 ], event, { item: this.currentItem } ) :
+							$( inst.options.items, inst.element ), inst ] );
+						this.containers.push( inst );
+					}
+				}
+			}
+		}
+
+		for ( i = queries.length - 1; i >= 0; i-- ) {
+			targetData = queries[ i ][ 1 ];
+			_queries = queries[ i ][ 0 ];
+
+			for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {
+				item = $( _queries[ j ] );
+
+				// Data for target checking (mouse manager)
+				item.data( this.widgetName + "-item", targetData );
+
+				items.push( {
+					item: item,
+					instance: targetData,
+					width: 0, height: 0,
+					left: 0, top: 0
+				} );
+			}
+		}
+
+	},
+
+	refreshPositions: function( fast ) {
+
+		// Determine whether items are being displayed horizontally
+		this.floating = this.items.length ?
+			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
+			false;
+
+		//This has to be redone because due to the item being moved out/into the offsetParent,
+		// the offsetParent's position will change
+		if ( this.offsetParent && this.helper ) {
+			this.offset.parent = this._getParentOffset();
+		}
+
+		var i, item, t, p;
+
+		for ( i = this.items.length - 1; i >= 0; i-- ) {
+			item = this.items[ i ];
+
+			//We ignore calculating positions of all connected containers when we're not over them
+			if ( item.instance !== this.currentContainer && this.currentContainer &&
+					item.item[ 0 ] !== this.currentItem[ 0 ] ) {
+				continue;
+			}
+
+			t = this.options.toleranceElement ?
+				$( this.options.toleranceElement, item.item ) :
+				item.item;
+
+			if ( !fast ) {
+				item.width = t.outerWidth();
+				item.height = t.outerHeight();
+			}
+
+			p = t.offset();
+			item.left = p.left;
+			item.top = p.top;
+		}
+
+		if ( this.options.custom && this.options.custom.refreshContainers ) {
+			this.options.custom.refreshContainers.call( this );
+		} else {
+			for ( i = this.containers.length - 1; i >= 0; i-- ) {
+				p = this.containers[ i ].element.offset();
+				this.containers[ i ].containerCache.left = p.left;
+				this.containers[ i ].containerCache.top = p.top;
+				this.containers[ i ].containerCache.width =
+					this.containers[ i ].element.outerWidth();
+				this.containers[ i ].containerCache.height =
+					this.containers[ i ].element.outerHeight();
+			}
+		}
+
+		return this;
+	},
+
+	_createPlaceholder: function( that ) {
+		that = that || this;
+		var className,
+			o = that.options;
+
+		if ( !o.placeholder || o.placeholder.constructor === String ) {
+			className = o.placeholder;
+			o.placeholder = {
+				element: function() {
+
+					var nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),
+						element = $( "<" + nodeName + ">", that.document[ 0 ] );
+
+						that._addClass( element, "ui-sortable-placeholder",
+								className || that.currentItem[ 0 ].className )
+							._removeClass( element, "ui-sortable-helper" );
+
+					if ( nodeName === "tbody" ) {
+						that._createTrPlaceholder(
+							that.currentItem.find( "tr" ).eq( 0 ),
+							$( "<tr>", that.document[ 0 ] ).appendTo( element )
+						);
+					} else if ( nodeName === "tr" ) {
+						that._createTrPlaceholder( that.currentItem, element );
+					} else if ( nodeName === "img" ) {
+						element.attr( "src", that.currentItem.attr( "src" ) );
+					}
+
+					if ( !className ) {
+						element.css( "visibility", "hidden" );
+					}
+
+					return element;
+				},
+				update: function( container, p ) {
+
+					// 1. If a className is set as 'placeholder option, we don't force sizes -
+					// the class is responsible for that
+					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a
+					// class name is specified
+					if ( className && !o.forcePlaceholderSize ) {
+						return;
+					}
+
+					//If the element doesn't have a actual height by itself (without styles coming
+					// from a stylesheet), it receives the inline height from the dragged item
+					if ( !p.height() ) {
+						p.height(
+							that.currentItem.innerHeight() -
+							parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
+							parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) );
+					}
+					if ( !p.width() ) {
+						p.width(
+							that.currentItem.innerWidth() -
+							parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) -
+							parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) );
+					}
+				}
+			};
+		}
+
+		//Create the placeholder
+		that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );
+
+		//Append it after the actual current item
+		that.currentItem.after( that.placeholder );
+
+		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+		o.placeholder.update( that, that.placeholder );
+
+	},
+
+	_createTrPlaceholder: function( sourceTr, targetTr ) {
+		var that = this;
+
+		sourceTr.children().each( function() {
+			$( "<td>&#160;</td>", that.document[ 0 ] )
+				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
+				.appendTo( targetTr );
+		} );
+	},
+
+	_contactContainers: function( event ) {
+		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
+			floating, axis,
+			innermostContainer = null,
+			innermostIndex = null;
+
+		// Get innermost container that intersects with item
+		for ( i = this.containers.length - 1; i >= 0; i-- ) {
+
+			// Never consider a container that's located within the item itself
+			if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {
+				continue;
+			}
+
+			if ( this._intersectsWith( this.containers[ i ].containerCache ) ) {
+
+				// If we've already found a container and it's more "inner" than this, then continue
+				if ( innermostContainer &&
+						$.contains(
+							this.containers[ i ].element[ 0 ],
+							innermostContainer.element[ 0 ] ) ) {
+					continue;
+				}
+
+				innermostContainer = this.containers[ i ];
+				innermostIndex = i;
+
+			} else {
+
+				// container doesn't intersect. trigger "out" event if necessary
+				if ( this.containers[ i ].containerCache.over ) {
+					this.containers[ i ]._trigger( "out", event, this._uiHash( this ) );
+					this.containers[ i ].containerCache.over = 0;
+				}
+			}
+
+		}
+
+		// If no intersecting containers found, return
+		if ( !innermostContainer ) {
+			return;
+		}
+
+		// Move the item into the container if it's not there already
+		if ( this.containers.length === 1 ) {
+			if ( !this.containers[ innermostIndex ].containerCache.over ) {
+				this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
+				this.containers[ innermostIndex ].containerCache.over = 1;
+			}
+		} else {
+
+			// When entering a new container, we will find the item with the least distance and
+			// append our item near it
+			dist = 10000;
+			itemWithLeastDistance = null;
+			floating = innermostContainer.floating || this._isFloating( this.currentItem );
+			posProperty = floating ? "left" : "top";
+			sizeProperty = floating ? "width" : "height";
+			axis = floating ? "pageX" : "pageY";
+
+			for ( j = this.items.length - 1; j >= 0; j-- ) {
+				if ( !$.contains(
+						this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
+				) {
+					continue;
+				}
+				if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {
+					continue;
+				}
+
+				cur = this.items[ j ].item.offset()[ posProperty ];
+				nearBottom = false;
+				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
+					nearBottom = true;
+				}
+
+				if ( Math.abs( event[ axis ] - cur ) < dist ) {
+					dist = Math.abs( event[ axis ] - cur );
+					itemWithLeastDistance = this.items[ j ];
+					this.direction = nearBottom ? "up" : "down";
+				}
+			}
+
+			//Check if dropOnEmpty is enabled
+			if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {
+				return;
+			}
+
+			if ( this.currentContainer === this.containers[ innermostIndex ] ) {
+				if ( !this.currentContainer.containerCache.over ) {
+					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
+					this.currentContainer.containerCache.over = 1;
+				}
+				return;
+			}
+
+			itemWithLeastDistance ?
+				this._rearrange( event, itemWithLeastDistance, null, true ) :
+				this._rearrange( event, null, this.containers[ innermostIndex ].element, true );
+			this._trigger( "change", event, this._uiHash() );
+			this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) );
+			this.currentContainer = this.containers[ innermostIndex ];
+
+			//Update the placeholder
+			this.options.placeholder.update( this.currentContainer, this.placeholder );
+
+			this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
+			this.containers[ innermostIndex ].containerCache.over = 1;
+		}
+
+	},
+
+	_createHelper: function( event ) {
+
+		var o = this.options,
+			helper = $.isFunction( o.helper ) ?
+				$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :
+				( o.helper === "clone" ? this.currentItem.clone() : this.currentItem );
+
+		//Add the helper to the DOM if that didn't happen already
+		if ( !helper.parents( "body" ).length ) {
+			$( o.appendTo !== "parent" ?
+				o.appendTo :
+				this.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );
+		}
+
+		if ( helper[ 0 ] === this.currentItem[ 0 ] ) {
+			this._storedCSS = {
+				width: this.currentItem[ 0 ].style.width,
+				height: this.currentItem[ 0 ].style.height,
+				position: this.currentItem.css( "position" ),
+				top: this.currentItem.css( "top" ),
+				left: this.currentItem.css( "left" )
+			};
+		}
+
+		if ( !helper[ 0 ].style.width || o.forceHelperSize ) {
+			helper.width( this.currentItem.width() );
+		}
+		if ( !helper[ 0 ].style.height || o.forceHelperSize ) {
+			helper.height( this.currentItem.height() );
+		}
+
+		return helper;
+
+	},
+
+	_adjustOffsetFromHelper: function( obj ) {
+		if ( typeof obj === "string" ) {
+			obj = obj.split( " " );
+		}
+		if ( $.isArray( obj ) ) {
+			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
+		}
+		if ( "left" in obj ) {
+			this.offset.click.left = obj.left + this.margins.left;
+		}
+		if ( "right" in obj ) {
+			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+		}
+		if ( "top" in obj ) {
+			this.offset.click.top = obj.top + this.margins.top;
+		}
+		if ( "bottom" in obj ) {
+			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+		}
+	},
+
+	_getParentOffset: function() {
+
+		//Get the offsetParent and cache its position
+		this.offsetParent = this.helper.offsetParent();
+		var po = this.offsetParent.offset();
+
+		// This is a special case where we need to modify a offset calculated on start, since the
+		// following happened:
+		// 1. The position of the helper is absolute, so it's position is calculated based on the
+		// next positioned parent
+		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
+		// the document, which means that the scroll is included in the initial calculation of the
+		// offset of the parent, and never recalculated upon drag
+		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
+			po.left += this.scrollParent.scrollLeft();
+			po.top += this.scrollParent.scrollTop();
+		}
+
+		// This needs to be actually done for all browsers, since pageX/pageY includes this
+		// information with an ugly IE fix
+		if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
+				( this.offsetParent[ 0 ].tagName &&
+				this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
+			po = { top: 0, left: 0 };
+		}
+
+		return {
+			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
+			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
+		};
+
+	},
+
+	_getRelativeOffset: function() {
+
+		if ( this.cssPosition === "relative" ) {
+			var p = this.currentItem.position();
+			return {
+				top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
+					this.scrollParent.scrollTop(),
+				left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
+					this.scrollParent.scrollLeft()
+			};
+		} else {
+			return { top: 0, left: 0 };
+		}
+
+	},
+
+	_cacheMargins: function() {
+		this.margins = {
+			left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ),
+			top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 )
+		};
+	},
+
+	_cacheHelperProportions: function() {
+		this.helperProportions = {
+			width: this.helper.outerWidth(),
+			height: this.helper.outerHeight()
+		};
+	},
+
+	_setContainment: function() {
+
+		var ce, co, over,
+			o = this.options;
+		if ( o.containment === "parent" ) {
+			o.containment = this.helper[ 0 ].parentNode;
+		}
+		if ( o.containment === "document" || o.containment === "window" ) {
+			this.containment = [
+				0 - this.offset.relative.left - this.offset.parent.left,
+				0 - this.offset.relative.top - this.offset.parent.top,
+				o.containment === "document" ?
+					this.document.width() :
+					this.window.width() - this.helperProportions.width - this.margins.left,
+				( o.containment === "document" ?
+					( this.document.height() || document.body.parentNode.scrollHeight ) :
+					this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
+				) - this.helperProportions.height - this.margins.top
+			];
+		}
+
+		if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {
+			ce = $( o.containment )[ 0 ];
+			co = $( o.containment ).offset();
+			over = ( $( ce ).css( "overflow" ) !== "hidden" );
+
+			this.containment = [
+				co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
+					( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
+				co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
+					( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
+				co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
+					( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
+					( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
+					this.helperProportions.width - this.margins.left,
+				co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
+					( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
+					( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
+					this.helperProportions.height - this.margins.top
+			];
+		}
+
+	},
+
+	_convertPositionTo: function( d, pos ) {
+
+		if ( !pos ) {
+			pos = this.position;
+		}
+		var mod = d === "absolute" ? 1 : -1,
+			scroll = this.cssPosition === "absolute" &&
+				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
+					this.offsetParent :
+					this.scrollParent,
+			scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
+
+		return {
+			top: (
+
+				// The absolute mouse position
+				pos.top	+
+
+				// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.relative.top * mod +
+
+				// The offsetParent's offset without borders (offset + border)
+				this.offset.parent.top * mod -
+				( ( this.cssPosition === "fixed" ?
+					-this.scrollParent.scrollTop() :
+					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )
+			),
+			left: (
+
+				// The absolute mouse position
+				pos.left +
+
+				// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.relative.left * mod +
+
+				// The offsetParent's offset without borders (offset + border)
+				this.offset.parent.left * mod	-
+				( ( this.cssPosition === "fixed" ?
+					-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
+					scroll.scrollLeft() ) * mod )
+			)
+		};
+
+	},
+
+	_generatePosition: function( event ) {
+
+		var top, left,
+			o = this.options,
+			pageX = event.pageX,
+			pageY = event.pageY,
+			scroll = this.cssPosition === "absolute" &&
+				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
+					this.offsetParent :
+					this.scrollParent,
+				scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
+
+		// This is another very weird special case that only happens for relative elements:
+		// 1. If the css position is relative
+		// 2. and the scroll parent is the document or similar to the offset parent
+		// we have to refresh the relative offset during the scroll so there are no jumps
+		if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+				this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
+			this.offset.relative = this._getRelativeOffset();
+		}
+
+		/*
+		 * - Position constraining -
+		 * Constrain the position to a mix of grid, containment.
+		 */
+
+		if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options
+
+			if ( this.containment ) {
+				if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {
+					pageX = this.containment[ 0 ] + this.offset.click.left;
+				}
+				if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {
+					pageY = this.containment[ 1 ] + this.offset.click.top;
+				}
+				if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {
+					pageX = this.containment[ 2 ] + this.offset.click.left;
+				}
+				if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {
+					pageY = this.containment[ 3 ] + this.offset.click.top;
+				}
+			}
+
+			if ( o.grid ) {
+				top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /
+					o.grid[ 1 ] ) * o.grid[ 1 ];
+				pageY = this.containment ?
+					( ( top - this.offset.click.top >= this.containment[ 1 ] &&
+						top - this.offset.click.top <= this.containment[ 3 ] ) ?
+							top :
+							( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
+								top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
+								top;
+
+				left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
+					o.grid[ 0 ] ) * o.grid[ 0 ];
+				pageX = this.containment ?
+					( ( left - this.offset.click.left >= this.containment[ 0 ] &&
+						left - this.offset.click.left <= this.containment[ 2 ] ) ?
+							left :
+							( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
+								left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
+								left;
+			}
+
+		}
+
+		return {
+			top: (
+
+				// The absolute mouse position
+				pageY -
+
+				// Click offset (relative to the element)
+				this.offset.click.top -
+
+				// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.relative.top -
+
+				// The offsetParent's offset without borders (offset + border)
+				this.offset.parent.top +
+				( ( this.cssPosition === "fixed" ?
+					-this.scrollParent.scrollTop() :
+					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )
+			),
+			left: (
+
+				// The absolute mouse position
+				pageX -
+
+				// Click offset (relative to the element)
+				this.offset.click.left -
+
+				// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.relative.left -
+
+				// The offsetParent's offset without borders (offset + border)
+				this.offset.parent.left +
+				( ( this.cssPosition === "fixed" ?
+					-this.scrollParent.scrollLeft() :
+					scrollIsRootNode ? 0 : scroll.scrollLeft() ) )
+			)
+		};
+
+	},
+
+	_rearrange: function( event, i, a, hardRefresh ) {
+
+		a ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :
+			i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],
+				( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );
+
+		//Various things done here to improve the performance:
+		// 1. we create a setTimeout, that calls refreshPositions
+		// 2. on the instance, we have a counter variable, that get's higher after every append
+		// 3. on the local scope, we copy the counter variable, and check in the timeout,
+		// if it's still the same
+		// 4. this lets only the last addition to the timeout stack through
+		this.counter = this.counter ? ++this.counter : 1;
+		var counter = this.counter;
+
+		this._delay( function() {
+			if ( counter === this.counter ) {
+
+				//Precompute after each DOM insertion, NOT on mousemove
+				this.refreshPositions( !hardRefresh );
+			}
+		} );
+
+	},
+
+	_clear: function( event, noPropagation ) {
+
+		this.reverting = false;
+
+		// We delay all events that have to be triggered to after the point where the placeholder
+		// has been removed and everything else normalized again
+		var i,
+			delayedTriggers = [];
+
+		// We first have to update the dom position of the actual currentItem
+		// Note: don't do it if the current item is already removed (by a user), or it gets
+		// reappended (see #4088)
+		if ( !this._noFinalSort && this.currentItem.parent().length ) {
+			this.placeholder.before( this.currentItem );
+		}
+		this._noFinalSort = null;
+
+		if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {
+			for ( i in this._storedCSS ) {
+				if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) {
+					this._storedCSS[ i ] = "";
+				}
+			}
+			this.currentItem.css( this._storedCSS );
+			this._removeClass( this.currentItem, "ui-sortable-helper" );
+		} else {
+			this.currentItem.show();
+		}
+
+		if ( this.fromOutside && !noPropagation ) {
+			delayedTriggers.push( function( event ) {
+				this._trigger( "receive", event, this._uiHash( this.fromOutside ) );
+			} );
+		}
+		if ( ( this.fromOutside ||
+				this.domPosition.prev !==
+				this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
+				this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
+
+			// Trigger update callback if the DOM position has changed
+			delayedTriggers.push( function( event ) {
+				this._trigger( "update", event, this._uiHash() );
+			} );
+		}
+
+		// Check if the items Container has Changed and trigger appropriate
+		// events.
+		if ( this !== this.currentContainer ) {
+			if ( !noPropagation ) {
+				delayedTriggers.push( function( event ) {
+					this._trigger( "remove", event, this._uiHash() );
+				} );
+				delayedTriggers.push( ( function( c ) {
+					return function( event ) {
+						c._trigger( "receive", event, this._uiHash( this ) );
+					};
+				} ).call( this, this.currentContainer ) );
+				delayedTriggers.push( ( function( c ) {
+					return function( event ) {
+						c._trigger( "update", event, this._uiHash( this ) );
+					};
+				} ).call( this, this.currentContainer ) );
+			}
+		}
+
+		//Post events to containers
+		function delayEvent( type, instance, container ) {
+			return function( event ) {
+				container._trigger( type, event, instance._uiHash( instance ) );
+			};
+		}
+		for ( i = this.containers.length - 1; i >= 0; i-- ) {
+			if ( !noPropagation ) {
+				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
+			}
+			if ( this.containers[ i ].containerCache.over ) {
+				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
+				this.containers[ i ].containerCache.over = 0;
+			}
+		}
+
+		//Do what was originally in plugins
+		if ( this.storedCursor ) {
+			this.document.find( "body" ).css( "cursor", this.storedCursor );
+			this.storedStylesheet.remove();
+		}
+		if ( this._storedOpacity ) {
+			this.helper.css( "opacity", this._storedOpacity );
+		}
+		if ( this._storedZIndex ) {
+			this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex );
+		}
+
+		this.dragging = false;
+
+		if ( !noPropagation ) {
+			this._trigger( "beforeStop", event, this._uiHash() );
+		}
+
+		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
+		// it unbinds ALL events from the original node!
+		this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
+
+		if ( !this.cancelHelperRemoval ) {
+			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
+				this.helper.remove();
+			}
+			this.helper = null;
+		}
+
+		if ( !noPropagation ) {
+			for ( i = 0; i < delayedTriggers.length; i++ ) {
+
+				// Trigger all delayed events
+				delayedTriggers[ i ].call( this, event );
+			}
+			this._trigger( "stop", event, this._uiHash() );
+		}
+
+		this.fromOutside = false;
+		return !this.cancelHelperRemoval;
+
+	},
+
+	_trigger: function() {
+		if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {
+			this.cancel();
+		}
+	},
+
+	_uiHash: function( _inst ) {
+		var inst = _inst || this;
+		return {
+			helper: inst.helper,
+			placeholder: inst.placeholder || $( [] ),
+			position: inst.position,
+			originalPosition: inst.originalPosition,
+			offset: inst.positionAbs,
+			item: inst.currentItem,
+			sender: _inst ? _inst.element : null
+		};
+	}
+
+} );
+
+} ) );
+
+
+
+
+
+
+
+/*!
+ * jQuery UI Tabs 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Tabs
+//>>group: Widgets
+//>>description: Transforms a set of container elements into a tab structure.
+//>>docs: http://api.jqueryui.com/tabs/
+//>>demos: http://jqueryui.com/tabs/
+//>>css.structure: ../../themes/base/core.css
+//>>css.structure: ../../themes/base/tabs.css
+//>>css.theme: ../../themes/base/theme.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"../escape-selector",
+			"../keycode",
+			"../safe-active-element",
+			"../unique-id",
+			"../version",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+$.widget( "ui.tabs", {
+	version: "1.12.1",
+	delay: 300,
+	options: {
+		active: null,
+		classes: {
+			"ui-tabs": "ui-corner-all",
+			"ui-tabs-nav": "ui-corner-all",
+			"ui-tabs-panel": "ui-corner-bottom",
+			"ui-tabs-tab": "ui-corner-top"
+		},
+		collapsible: false,
+		event: "click",
+		heightStyle: "content",
+		hide: null,
+		show: null,
+
+		// Callbacks
+		activate: null,
+		beforeActivate: null,
+		beforeLoad: null,
+		load: null
+	},
+
+	_isLocal: ( function() {
+		var rhash = /#.*$/;
+
+		return function( anchor ) {
+			var anchorUrl, locationUrl;
+
+			anchorUrl = anchor.href.replace( rhash, "" );
+			locationUrl = location.href.replace( rhash, "" );
+
+			// Decoding may throw an error if the URL isn't UTF-8 (#9518)
+			try {
+				anchorUrl = decodeURIComponent( anchorUrl );
+			} catch ( error ) {}
+			try {
+				locationUrl = decodeURIComponent( locationUrl );
+			} catch ( error ) {}
+
+			return anchor.hash.length > 1 && anchorUrl === locationUrl;
+		};
+	} )(),
+
+	_create: function() {
+		var that = this,
+			options = this.options;
+
+		this.running = false;
+
+		this._addClass( "ui-tabs", "ui-widget ui-widget-content" );
+		this._toggleClass( "ui-tabs-collapsible", null, options.collapsible );
+
+		this._processTabs();
+		options.active = this._initialActive();
+
+		// Take disabling tabs via class attribute from HTML
+		// into account and update option properly.
+		if ( $.isArray( options.disabled ) ) {
+			options.disabled = $.unique( options.disabled.concat(
+				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
+					return that.tabs.index( li );
+				} )
+			) ).sort();
+		}
+
+		// Check for length avoids error when initializing empty list
+		if ( this.options.active !== false && this.anchors.length ) {
+			this.active = this._findActive( options.active );
+		} else {
+			this.active = $();
+		}
+
+		this._refresh();
+
+		if ( this.active.length ) {
+			this.load( options.active );
+		}
+	},
+
+	_initialActive: function() {
+		var active = this.options.active,
+			collapsible = this.options.collapsible,
+			locationHash = location.hash.substring( 1 );
+
+		if ( active === null ) {
+
+			// check the fragment identifier in the URL
+			if ( locationHash ) {
+				this.tabs.each( function( i, tab ) {
+					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
+						active = i;
+						return false;
+					}
+				} );
+			}
+
+			// Check for a tab marked active via a class
+			if ( active === null ) {
+				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
+			}
+
+			// No active tab, set to false
+			if ( active === null || active === -1 ) {
+				active = this.tabs.length ? 0 : false;
+			}
+		}
+
+		// Handle numbers: negative, out of range
+		if ( active !== false ) {
+			active = this.tabs.index( this.tabs.eq( active ) );
+			if ( active === -1 ) {
+				active = collapsible ? false : 0;
+			}
+		}
+
+		// Don't allow collapsible: false and active: false
+		if ( !collapsible && active === false && this.anchors.length ) {
+			active = 0;
+		}
+
+		return active;
+	},
+
+	_getCreateEventData: function() {
+		return {
+			tab: this.active,
+			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
+		};
+	},
+
+	_tabKeydown: function( event ) {
+		var focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( "li" ),
+			selectedIndex = this.tabs.index( focusedTab ),
+			goingForward = true;
+
+		if ( this._handlePageNav( event ) ) {
+			return;
+		}
+
+		switch ( event.keyCode ) {
+		case $.ui.keyCode.RIGHT:
+		case $.ui.keyCode.DOWN:
+			selectedIndex++;
+			break;
+		case $.ui.keyCode.UP:
+		case $.ui.keyCode.LEFT:
+			goingForward = false;
+			selectedIndex--;
+			break;
+		case $.ui.keyCode.END:
+			selectedIndex = this.anchors.length - 1;
+			break;
+		case $.ui.keyCode.HOME:
+			selectedIndex = 0;
+			break;
+		case $.ui.keyCode.SPACE:
+
+			// Activate only, no collapsing
+			event.preventDefault();
+			clearTimeout( this.activating );
+			this._activate( selectedIndex );
+			return;
+		case $.ui.keyCode.ENTER:
+
+			// Toggle (cancel delayed activation, allow collapsing)
+			event.preventDefault();
+			clearTimeout( this.activating );
+
+			// Determine if we should collapse or activate
+			this._activate( selectedIndex === this.options.active ? false : selectedIndex );
+			return;
+		default:
+			return;
+		}
+
+		// Focus the appropriate tab, based on which key was pressed
+		event.preventDefault();
+		clearTimeout( this.activating );
+		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
+
+		// Navigating with control/command key will prevent automatic activation
+		if ( !event.ctrlKey && !event.metaKey ) {
+
+			// Update aria-selected immediately so that AT think the tab is already selected.
+			// Otherwise AT may confuse the user by stating that they need to activate the tab,
+			// but the tab will already be activated by the time the announcement finishes.
+			focusedTab.attr( "aria-selected", "false" );
+			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
+
+			this.activating = this._delay( function() {
+				this.option( "active", selectedIndex );
+			}, this.delay );
+		}
+	},
+
+	_panelKeydown: function( event ) {
+		if ( this._handlePageNav( event ) ) {
+			return;
+		}
+
+		// Ctrl+up moves focus to the current tab
+		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
+			event.preventDefault();
+			this.active.trigger( "focus" );
+		}
+	},
+
+	// Alt+page up/down moves focus to the previous/next tab (and activates)
+	_handlePageNav: function( event ) {
+		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
+			this._activate( this._focusNextTab( this.options.active - 1, false ) );
+			return true;
+		}
+		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
+			this._activate( this._focusNextTab( this.options.active + 1, true ) );
+			return true;
+		}
+	},
+
+	_findNextTab: function( index, goingForward ) {
+		var lastTabIndex = this.tabs.length - 1;
+
+		function constrain() {
+			if ( index > lastTabIndex ) {
+				index = 0;
+			}
+			if ( index < 0 ) {
+				index = lastTabIndex;
+			}
+			return index;
+		}
+
+		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
+			index = goingForward ? index + 1 : index - 1;
+		}
+
+		return index;
+	},
+
+	_focusNextTab: function( index, goingForward ) {
+		index = this._findNextTab( index, goingForward );
+		this.tabs.eq( index ).trigger( "focus" );
+		return index;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "active" ) {
+
+			// _activate() will handle invalid values and update this.options
+			this._activate( value );
+			return;
+		}
+
+		this._super( key, value );
+
+		if ( key === "collapsible" ) {
+			this._toggleClass( "ui-tabs-collapsible", null, value );
+
+			// Setting collapsible: false while collapsed; open first panel
+			if ( !value && this.options.active === false ) {
+				this._activate( 0 );
+			}
+		}
+
+		if ( key === "event" ) {
+			this._setupEvents( value );
+		}
+
+		if ( key === "heightStyle" ) {
+			this._setupHeightStyle( value );
+		}
+	},
+
+	_sanitizeSelector: function( hash ) {
+		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
+	},
+
+	refresh: function() {
+		var options = this.options,
+			lis = this.tablist.children( ":has(a[href])" );
+
+		// Get disabled tabs from class attribute from HTML
+		// this will get converted to a boolean if needed in _refresh()
+		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
+			return lis.index( tab );
+		} );
+
+		this._processTabs();
+
+		// Was collapsed or no tabs
+		if ( options.active === false || !this.anchors.length ) {
+			options.active = false;
+			this.active = $();
+
+		// was active, but active tab is gone
+		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
+
+			// all remaining tabs are disabled
+			if ( this.tabs.length === options.disabled.length ) {
+				options.active = false;
+				this.active = $();
+
+			// activate previous tab
+			} else {
+				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
+			}
+
+		// was active, active tab still exists
+		} else {
+
+			// make sure active index is correct
+			options.active = this.tabs.index( this.active );
+		}
+
+		this._refresh();
+	},
+
+	_refresh: function() {
+		this._setOptionDisabled( this.options.disabled );
+		this._setupEvents( this.options.event );
+		this._setupHeightStyle( this.options.heightStyle );
+
+		this.tabs.not( this.active ).attr( {
+			"aria-selected": "false",
+			"aria-expanded": "false",
+			tabIndex: -1
+		} );
+		this.panels.not( this._getPanelForTab( this.active ) )
+			.hide()
+			.attr( {
+				"aria-hidden": "true"
+			} );
+
+		// Make sure one tab is in the tab order
+		if ( !this.active.length ) {
+			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
+		} else {
+			this.active
+				.attr( {
+					"aria-selected": "true",
+					"aria-expanded": "true",
+					tabIndex: 0
+				} );
+			this._addClass( this.active, "ui-tabs-active", "ui-state-active" );
+			this._getPanelForTab( this.active )
+				.show()
+				.attr( {
+					"aria-hidden": "false"
+				} );
+		}
+	},
+
+	_processTabs: function() {
+		var that = this,
+			prevTabs = this.tabs,
+			prevAnchors = this.anchors,
+			prevPanels = this.panels;
+
+		this.tablist = this._getList().attr( "role", "tablist" );
+		this._addClass( this.tablist, "ui-tabs-nav",
+			"ui-helper-reset ui-helper-clearfix ui-widget-header" );
+
+		// Prevent users from focusing disabled tabs via click
+		this.tablist
+			.on( "mousedown" + this.eventNamespace, "> li", function( event ) {
+				if ( $( this ).is( ".ui-state-disabled" ) ) {
+					event.preventDefault();
+				}
+			} )
+
+			// Support: IE <9
+			// Preventing the default action in mousedown doesn't prevent IE
+			// from focusing the element, so if the anchor gets focused, blur.
+			// We don't have to worry about focusing the previously focused
+			// element since clicking on a non-focusable element should focus
+			// the body anyway.
+			.on( "focus" + this.eventNamespace, ".ui-tabs-anchor", function() {
+				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
+					this.blur();
+				}
+			} );
+
+		this.tabs = this.tablist.find( "> li:has(a[href])" )
+			.attr( {
+				role: "tab",
+				tabIndex: -1
+			} );
+		this._addClass( this.tabs, "ui-tabs-tab", "ui-state-default" );
+
+		this.anchors = this.tabs.map( function() {
+			return $( "a", this )[ 0 ];
+		} )
+			.attr( {
+				role: "presentation",
+				tabIndex: -1
+			} );
+		this._addClass( this.anchors, "ui-tabs-anchor" );
+
+		this.panels = $();
+
+		this.anchors.each( function( i, anchor ) {
+			var selector, panel, panelId,
+				anchorId = $( anchor ).uniqueId().attr( "id" ),
+				tab = $( anchor ).closest( "li" ),
+				originalAriaControls = tab.attr( "aria-controls" );
+
+			// Inline tab
+			if ( that._isLocal( anchor ) ) {
+				selector = anchor.hash;
+				panelId = selector.substring( 1 );
+				panel = that.element.find( that._sanitizeSelector( selector ) );
+
+			// remote tab
+			} else {
+
+				// If the tab doesn't already have aria-controls,
+				// generate an id by using a throw-away element
+				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
+				selector = "#" + panelId;
+				panel = that.element.find( selector );
+				if ( !panel.length ) {
+					panel = that._createPanel( panelId );
+					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
+				}
+				panel.attr( "aria-live", "polite" );
+			}
+
+			if ( panel.length ) {
+				that.panels = that.panels.add( panel );
+			}
+			if ( originalAriaControls ) {
+				tab.data( "ui-tabs-aria-controls", originalAriaControls );
+			}
+			tab.attr( {
+				"aria-controls": panelId,
+				"aria-labelledby": anchorId
+			} );
+			panel.attr( "aria-labelledby", anchorId );
+		} );
+
+		this.panels.attr( "role", "tabpanel" );
+		this._addClass( this.panels, "ui-tabs-panel", "ui-widget-content" );
+
+		// Avoid memory leaks (#10056)
+		if ( prevTabs ) {
+			this._off( prevTabs.not( this.tabs ) );
+			this._off( prevAnchors.not( this.anchors ) );
+			this._off( prevPanels.not( this.panels ) );
+		}
+	},
+
+	// Allow overriding how to find the list for rare usage scenarios (#7715)
+	_getList: function() {
+		return this.tablist || this.element.find( "ol, ul" ).eq( 0 );
+	},
+
+	_createPanel: function( id ) {
+		return $( "<div>" )
+			.attr( "id", id )
+			.data( "ui-tabs-destroy", true );
+	},
+
+	_setOptionDisabled: function( disabled ) {
+		var currentItem, li, i;
+
+		if ( $.isArray( disabled ) ) {
+			if ( !disabled.length ) {
+				disabled = false;
+			} else if ( disabled.length === this.anchors.length ) {
+				disabled = true;
+			}
+		}
+
+		// Disable tabs
+		for ( i = 0; ( li = this.tabs[ i ] ); i++ ) {
+			currentItem = $( li );
+			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
+				currentItem.attr( "aria-disabled", "true" );
+				this._addClass( currentItem, null, "ui-state-disabled" );
+			} else {
+				currentItem.removeAttr( "aria-disabled" );
+				this._removeClass( currentItem, null, "ui-state-disabled" );
+			}
+		}
+
+		this.options.disabled = disabled;
+
+		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null,
+			disabled === true );
+	},
+
+	_setupEvents: function( event ) {
+		var events = {};
+		if ( event ) {
+			$.each( event.split( " " ), function( index, eventName ) {
+				events[ eventName ] = "_eventHandler";
+			} );
+		}
+
+		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
+
+		// Always prevent the default action, even when disabled
+		this._on( true, this.anchors, {
+			click: function( event ) {
+				event.preventDefault();
+			}
+		} );
+		this._on( this.anchors, events );
+		this._on( this.tabs, { keydown: "_tabKeydown" } );
+		this._on( this.panels, { keydown: "_panelKeydown" } );
+
+		this._focusable( this.tabs );
+		this._hoverable( this.tabs );
+	},
+
+	_setupHeightStyle: function( heightStyle ) {
+		var maxHeight,
+			parent = this.element.parent();
+
+		if ( heightStyle === "fill" ) {
+			maxHeight = parent.height();
+			maxHeight -= this.element.outerHeight() - this.element.height();
+
+			this.element.siblings( ":visible" ).each( function() {
+				var elem = $( this ),
+					position = elem.css( "position" );
+
+				if ( position === "absolute" || position === "fixed" ) {
+					return;
+				}
+				maxHeight -= elem.outerHeight( true );
+			} );
+
+			this.element.children().not( this.panels ).each( function() {
+				maxHeight -= $( this ).outerHeight( true );
+			} );
+
+			this.panels.each( function() {
+				$( this ).height( Math.max( 0, maxHeight -
+					$( this ).innerHeight() + $( this ).height() ) );
+			} )
+				.css( "overflow", "auto" );
+		} else if ( heightStyle === "auto" ) {
+			maxHeight = 0;
+			this.panels.each( function() {
+				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+			} ).height( maxHeight );
+		}
+	},
+
+	_eventHandler: function( event ) {
+		var options = this.options,
+			active = this.active,
+			anchor = $( event.currentTarget ),
+			tab = anchor.closest( "li" ),
+			clickedIsActive = tab[ 0 ] === active[ 0 ],
+			collapsing = clickedIsActive && options.collapsible,
+			toShow = collapsing ? $() : this._getPanelForTab( tab ),
+			toHide = !active.length ? $() : this._getPanelForTab( active ),
+			eventData = {
+				oldTab: active,
+				oldPanel: toHide,
+				newTab: collapsing ? $() : tab,
+				newPanel: toShow
+			};
+
+		event.preventDefault();
+
+		if ( tab.hasClass( "ui-state-disabled" ) ||
+
+				// tab is already loading
+				tab.hasClass( "ui-tabs-loading" ) ||
+
+				// can't switch durning an animation
+				this.running ||
+
+				// click on active header, but not collapsible
+				( clickedIsActive && !options.collapsible ) ||
+
+				// allow canceling activation
+				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+			return;
+		}
+
+		options.active = collapsing ? false : this.tabs.index( tab );
+
+		this.active = clickedIsActive ? $() : tab;
+		if ( this.xhr ) {
+			this.xhr.abort();
+		}
+
+		if ( !toHide.length && !toShow.length ) {
+			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
+		}
+
+		if ( toShow.length ) {
+			this.load( this.tabs.index( tab ), event );
+		}
+		this._toggle( event, eventData );
+	},
+
+	// Handles show/hide for selecting tabs
+	_toggle: function( event, eventData ) {
+		var that = this,
+			toShow = eventData.newPanel,
+			toHide = eventData.oldPanel;
+
+		this.running = true;
+
+		function complete() {
+			that.running = false;
+			that._trigger( "activate", event, eventData );
+		}
+
+		function show() {
+			that._addClass( eventData.newTab.closest( "li" ), "ui-tabs-active", "ui-state-active" );
+
+			if ( toShow.length && that.options.show ) {
+				that._show( toShow, that.options.show, complete );
+			} else {
+				toShow.show();
+				complete();
+			}
+		}
+
+		// Start out by hiding, then showing, then completing
+		if ( toHide.length && this.options.hide ) {
+			this._hide( toHide, this.options.hide, function() {
+				that._removeClass( eventData.oldTab.closest( "li" ),
+					"ui-tabs-active", "ui-state-active" );
+				show();
+			} );
+		} else {
+			this._removeClass( eventData.oldTab.closest( "li" ),
+				"ui-tabs-active", "ui-state-active" );
+			toHide.hide();
+			show();
+		}
+
+		toHide.attr( "aria-hidden", "true" );
+		eventData.oldTab.attr( {
+			"aria-selected": "false",
+			"aria-expanded": "false"
+		} );
+
+		// If we're switching tabs, remove the old tab from the tab order.
+		// If we're opening from collapsed state, remove the previous tab from the tab order.
+		// If we're collapsing, then keep the collapsing tab in the tab order.
+		if ( toShow.length && toHide.length ) {
+			eventData.oldTab.attr( "tabIndex", -1 );
+		} else if ( toShow.length ) {
+			this.tabs.filter( function() {
+				return $( this ).attr( "tabIndex" ) === 0;
+			} )
+				.attr( "tabIndex", -1 );
+		}
+
+		toShow.attr( "aria-hidden", "false" );
+		eventData.newTab.attr( {
+			"aria-selected": "true",
+			"aria-expanded": "true",
+			tabIndex: 0
+		} );
+	},
+
+	_activate: function( index ) {
+		var anchor,
+			active = this._findActive( index );
+
+		// Trying to activate the already active panel
+		if ( active[ 0 ] === this.active[ 0 ] ) {
+			return;
+		}
+
+		// Trying to collapse, simulate a click on the current active header
+		if ( !active.length ) {
+			active = this.active;
+		}
+
+		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
+		this._eventHandler( {
+			target: anchor,
+			currentTarget: anchor,
+			preventDefault: $.noop
+		} );
+	},
+
+	_findActive: function( index ) {
+		return index === false ? $() : this.tabs.eq( index );
+	},
+
+	_getIndex: function( index ) {
+
+		// meta-function to give users option to provide a href string instead of a numerical index.
+		if ( typeof index === "string" ) {
+			index = this.anchors.index( this.anchors.filter( "[href$='" +
+				$.ui.escapeSelector( index ) + "']" ) );
+		}
+
+		return index;
+	},
+
+	_destroy: function() {
+		if ( this.xhr ) {
+			this.xhr.abort();
+		}
+
+		this.tablist
+			.removeAttr( "role" )
+			.off( this.eventNamespace );
+
+		this.anchors
+			.removeAttr( "role tabIndex" )
+			.removeUniqueId();
+
+		this.tabs.add( this.panels ).each( function() {
+			if ( $.data( this, "ui-tabs-destroy" ) ) {
+				$( this ).remove();
+			} else {
+				$( this ).removeAttr( "role tabIndex " +
+					"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded" );
+			}
+		} );
+
+		this.tabs.each( function() {
+			var li = $( this ),
+				prev = li.data( "ui-tabs-aria-controls" );
+			if ( prev ) {
+				li
+					.attr( "aria-controls", prev )
+					.removeData( "ui-tabs-aria-controls" );
+			} else {
+				li.removeAttr( "aria-controls" );
+			}
+		} );
+
+		this.panels.show();
+
+		if ( this.options.heightStyle !== "content" ) {
+			this.panels.css( "height", "" );
+		}
+	},
+
+	enable: function( index ) {
+		var disabled = this.options.disabled;
+		if ( disabled === false ) {
+			return;
+		}
+
+		if ( index === undefined ) {
+			disabled = false;
+		} else {
+			index = this._getIndex( index );
+			if ( $.isArray( disabled ) ) {
+				disabled = $.map( disabled, function( num ) {
+					return num !== index ? num : null;
+				} );
+			} else {
+				disabled = $.map( this.tabs, function( li, num ) {
+					return num !== index ? num : null;
+				} );
+			}
+		}
+		this._setOptionDisabled( disabled );
+	},
+
+	disable: function( index ) {
+		var disabled = this.options.disabled;
+		if ( disabled === true ) {
+			return;
+		}
+
+		if ( index === undefined ) {
+			disabled = true;
+		} else {
+			index = this._getIndex( index );
+			if ( $.inArray( index, disabled ) !== -1 ) {
+				return;
+			}
+			if ( $.isArray( disabled ) ) {
+				disabled = $.merge( [ index ], disabled ).sort();
+			} else {
+				disabled = [ index ];
+			}
+		}
+		this._setOptionDisabled( disabled );
+	},
+
+	load: function( index, event ) {
+		index = this._getIndex( index );
+		var that = this,
+			tab = this.tabs.eq( index ),
+			anchor = tab.find( ".ui-tabs-anchor" ),
+			panel = this._getPanelForTab( tab ),
+			eventData = {
+				tab: tab,
+				panel: panel
+			},
+			complete = function( jqXHR, status ) {
+				if ( status === "abort" ) {
+					that.panels.stop( false, true );
+				}
+
+				that._removeClass( tab, "ui-tabs-loading" );
+				panel.removeAttr( "aria-busy" );
+
+				if ( jqXHR === that.xhr ) {
+					delete that.xhr;
+				}
+			};
+
+		// Not remote
+		if ( this._isLocal( anchor[ 0 ] ) ) {
+			return;
+		}
+
+		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
+
+		// Support: jQuery <1.8
+		// jQuery <1.8 returns false if the request is canceled in beforeSend,
+		// but as of 1.8, $.ajax() always returns a jqXHR object.
+		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
+			this._addClass( tab, "ui-tabs-loading" );
+			panel.attr( "aria-busy", "true" );
+
+			this.xhr
+				.done( function( response, status, jqXHR ) {
+
+					// support: jQuery <1.8
+					// http://bugs.jquery.com/ticket/11778
+					setTimeout( function() {
+						panel.html( response );
+						that._trigger( "load", event, eventData );
+
+						complete( jqXHR, status );
+					}, 1 );
+				} )
+				.fail( function( jqXHR, status ) {
+
+					// support: jQuery <1.8
+					// http://bugs.jquery.com/ticket/11778
+					setTimeout( function() {
+						complete( jqXHR, status );
+					}, 1 );
+				} );
+		}
+	},
+
+	_ajaxSettings: function( anchor, event, eventData ) {
+		var that = this;
+		return {
+
+			// Support: IE <11 only
+			// Strip any hash that exists to prevent errors with the Ajax request
+			url: anchor.attr( "href" ).replace( /#.*$/, "" ),
+			beforeSend: function( jqXHR, settings ) {
+				return that._trigger( "beforeLoad", event,
+					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
+			}
+		};
+	},
+
+	_getPanelForTab: function( tab ) {
+		var id = $( tab ).attr( "aria-controls" );
+		return this.element.find( this._sanitizeSelector( "#" + id ) );
+	}
+} );
+
+// DEPRECATED
+// TODO: Switch return back to widget declaration at top of file when this is removed
+if ( $.uiBackCompat !== false ) {
+
+	// Backcompat for ui-tab class (now ui-tabs-tab)
+	$.widget( "ui.tabs", $.ui.tabs, {
+		_processTabs: function() {
+			this._superApply( arguments );
+			this._addClass( this.tabs, "ui-tab" );
+		}
+	} );
+}
+
+return $.ui.tabs;
+
+} ) );
+(function($, undefined) {
+
+/**
+ * Unobtrusive scripting adapter for jQuery
+ * https://github.com/rails/jquery-ujs
+ *
+ * Requires jQuery 1.8.0 or later.
+ *
+ * Released under the MIT license
+ *
+ */
+
+  // Cut down on the number of issues from people inadvertently including jquery_ujs twice
+  // by detecting and raising an error when it happens.
+  'use strict';
+
+  if ( $.rails !== undefined ) {
+    $.error('jquery-ujs has already been loaded!');
+  }
+
+  // Shorthand to make it a little easier to call public rails functions from within rails.js
+  var rails;
+  var $document = $(document);
+
+  $.rails = rails = {
+    // Link elements bound by jquery-ujs
+    linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote]:not([disabled]), a[data-disable-with], a[data-disable]',
+
+    // Button elements bound by jquery-ujs
+    buttonClickSelector: 'button[data-remote]:not([form]):not(form button), button[data-confirm]:not([form]):not(form button)',
+
+    // Select elements bound by jquery-ujs
+    inputChangeSelector: 'select[data-remote], input[data-remote], textarea[data-remote]',
+
+    // Form elements bound by jquery-ujs
+    formSubmitSelector: 'form',
+
+    // Form input elements bound by jquery-ujs
+    formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type]), input[type=submit][form], input[type=image][form], button[type=submit][form], button[form]:not([type])',
+
+    // Form input elements disabled during form submission
+    disableSelector: 'input[data-disable-with]:enabled, button[data-disable-with]:enabled, textarea[data-disable-with]:enabled, input[data-disable]:enabled, button[data-disable]:enabled, textarea[data-disable]:enabled',
+
+    // Form input elements re-enabled after form submission
+    enableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled, input[data-disable]:disabled, button[data-disable]:disabled, textarea[data-disable]:disabled',
+
+    // Form required input elements
+    requiredInputSelector: 'input[name][required]:not([disabled]), textarea[name][required]:not([disabled])',
+
+    // Form file input elements
+    fileInputSelector: 'input[name][type=file]:not([disabled])',
+
+    // Link onClick disable selector with possible reenable after remote submission
+    linkDisableSelector: 'a[data-disable-with], a[data-disable]',
+
+    // Button onClick disable selector with possible reenable after remote submission
+    buttonDisableSelector: 'button[data-remote][data-disable-with], button[data-remote][data-disable]',
+
+    // Up-to-date Cross-Site Request Forgery token
+    csrfToken: function() {
+     return $('meta[name=csrf-token]').attr('content');
+    },
+
+    // URL param that must contain the CSRF token
+    csrfParam: function() {
+     return $('meta[name=csrf-param]').attr('content');
+    },
+
+    // Make sure that every Ajax request sends the CSRF token
+    CSRFProtection: function(xhr) {
+      var token = rails.csrfToken();
+      if (token) xhr.setRequestHeader('X-CSRF-Token', token);
+    },
+
+    // Make sure that all forms have actual up-to-date tokens (cached forms contain old ones)
+    refreshCSRFTokens: function(){
+      $('form input[name="' + rails.csrfParam() + '"]').val(rails.csrfToken());
+    },
+
+    // Triggers an event on an element and returns false if the event result is false
+    fire: function(obj, name, data) {
+      var event = $.Event(name);
+      obj.trigger(event, data);
+      return event.result !== false;
+    },
+
+    // Default confirm dialog, may be overridden with custom confirm dialog in $.rails.confirm
+    confirm: function(message) {
+      return confirm(message);
+    },
+
+    // Default ajax function, may be overridden with custom function in $.rails.ajax
+    ajax: function(options) {
+      return $.ajax(options);
+    },
+
+    // Default way to get an element's href. May be overridden at $.rails.href.
+    href: function(element) {
+      return element[0].href;
+    },
+
+    // Checks "data-remote" if true to handle the request through a XHR request.
+    isRemote: function(element) {
+      return element.data('remote') !== undefined && element.data('remote') !== false;
+    },
+
+    // Submits "remote" forms and links with ajax
+    handleRemote: function(element) {
+      var method, url, data, withCredentials, dataType, options;
+
+      if (rails.fire(element, 'ajax:before')) {
+        withCredentials = element.data('with-credentials') || null;
+        dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);
+
+        if (element.is('form')) {
+          method = element.data('ujs:submit-button-formmethod') || element.attr('method');
+          url = element.data('ujs:submit-button-formaction') || element.attr('action');
+          data = $(element[0]).serializeArray();
+          // memoized value from clicked submit button
+          var button = element.data('ujs:submit-button');
+          if (button) {
+            data.push(button);
+            element.data('ujs:submit-button', null);
+          }
+          element.data('ujs:submit-button-formmethod', null);
+          element.data('ujs:submit-button-formaction', null);
+        } else if (element.is(rails.inputChangeSelector)) {
+          method = element.data('method');
+          url = element.data('url');
+          data = element.serialize();
+          if (element.data('params')) data = data + '&' + element.data('params');
+        } else if (element.is(rails.buttonClickSelector)) {
+          method = element.data('method') || 'get';
+          url = element.data('url');
+          data = element.serialize();
+          if (element.data('params')) data = data + '&' + element.data('params');
+        } else {
+          method = element.data('method');
+          url = rails.href(element);
+          data = element.data('params') || null;
+        }
+
+        options = {
+          type: method || 'GET', data: data, dataType: dataType,
+          // stopping the "ajax:beforeSend" event will cancel the ajax request
+          beforeSend: function(xhr, settings) {
+            if (settings.dataType === undefined) {
+              xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
+            }
+            if (rails.fire(element, 'ajax:beforeSend', [xhr, settings])) {
+              element.trigger('ajax:send', xhr);
+            } else {
+              return false;
+            }
+          },
+          success: function(data, status, xhr) {
+            element.trigger('ajax:success', [data, status, xhr]);
+          },
+          complete: function(xhr, status) {
+            element.trigger('ajax:complete', [xhr, status]);
+          },
+          error: function(xhr, status, error) {
+            element.trigger('ajax:error', [xhr, status, error]);
+          },
+          crossDomain: rails.isCrossDomain(url)
+        };
+
+        // There is no withCredentials for IE6-8 when
+        // "Enable native XMLHTTP support" is disabled
+        if (withCredentials) {
+          options.xhrFields = {
+            withCredentials: withCredentials
+          };
+        }
+
+        // Only pass url to `ajax` options if not blank
+        if (url) { options.url = url; }
+
+        return rails.ajax(options);
+      } else {
+        return false;
+      }
+    },
+
+    // Determines if the request is a cross domain request.
+    isCrossDomain: function(url) {
+      var originAnchor = document.createElement('a');
+      originAnchor.href = location.href;
+      var urlAnchor = document.createElement('a');
+
+      try {
+        urlAnchor.href = url;
+        // This is a workaround to a IE bug.
+        urlAnchor.href = urlAnchor.href;
+
+        // If URL protocol is false or is a string containing a single colon
+        // *and* host are false, assume it is not a cross-domain request
+        // (should only be the case for IE7 and IE compatibility mode).
+        // Otherwise, evaluate protocol and host of the URL against the origin
+        // protocol and host.
+        return !(((!urlAnchor.protocol || urlAnchor.protocol === ':') && !urlAnchor.host) ||
+          (originAnchor.protocol + '//' + originAnchor.host ===
+            urlAnchor.protocol + '//' + urlAnchor.host));
+      } catch (e) {
+        // If there is an error parsing the URL, assume it is crossDomain.
+        return true;
+      }
+    },
+
+    // Handles "data-method" on links such as:
+    // <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>
+    handleMethod: function(link) {
+      var href = rails.href(link),
+        method = link.data('method'),
+        target = link.attr('target'),
+        csrfToken = rails.csrfToken(),
+        csrfParam = rails.csrfParam(),
+        form = $('<form method="post" action="' + href + '"></form>'),
+        metadataInput = '<input name="_method" value="' + method + '" type="hidden" />';
+
+      if (csrfParam !== undefined && csrfToken !== undefined && !rails.isCrossDomain(href)) {
+        metadataInput += '<input name="' + csrfParam + '" value="' + csrfToken + '" type="hidden" />';
+      }
+
+      if (target) { form.attr('target', target); }
+
+      form.hide().append(metadataInput).appendTo('body');
+      form.submit();
+    },
+
+    // Helper function that returns form elements that match the specified CSS selector
+    // If form is actually a "form" element this will return associated elements outside the from that have
+    // the html form attribute set
+    formElements: function(form, selector) {
+      return form.is('form') ? $(form[0].elements).filter(selector) : form.find(selector);
+    },
+
+    /* Disables form elements:
+      - Caches element value in 'ujs:enable-with' data store
+      - Replaces element text with value of 'data-disable-with' attribute
+      - Sets disabled property to true
+    */
+    disableFormElements: function(form) {
+      rails.formElements(form, rails.disableSelector).each(function() {
+        rails.disableFormElement($(this));
+      });
+    },
+
+    disableFormElement: function(element) {
+      var method, replacement;
+
+      method = element.is('button') ? 'html' : 'val';
+      replacement = element.data('disable-with');
+
+      if (replacement !== undefined) {
+        element.data('ujs:enable-with', element[method]());
+        element[method](replacement);
+      }
+
+      element.prop('disabled', true);
+      element.data('ujs:disabled', true);
+    },
+
+    /* Re-enables disabled form elements:
+      - Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`)
+      - Sets disabled property to false
+    */
+    enableFormElements: function(form) {
+      rails.formElements(form, rails.enableSelector).each(function() {
+        rails.enableFormElement($(this));
+      });
+    },
+
+    enableFormElement: function(element) {
+      var method = element.is('button') ? 'html' : 'val';
+      if (element.data('ujs:enable-with') !== undefined) {
+        element[method](element.data('ujs:enable-with'));
+        element.removeData('ujs:enable-with'); // clean up cache
+      }
+      element.prop('disabled', false);
+      element.removeData('ujs:disabled');
+    },
+
+   /* For 'data-confirm' attribute:
+      - Fires `confirm` event
+      - Shows the confirmation dialog
+      - Fires the `confirm:complete` event
+
+      Returns `true` if no function stops the chain and user chose yes; `false` otherwise.
+      Attaching a handler to the element's `confirm` event that returns a `falsy` value cancels the confirmation dialog.
+      Attaching a handler to the element's `confirm:complete` event that returns a `falsy` value makes this function
+      return false. The `confirm:complete` event is fired whether or not the user answered true or false to the dialog.
+   */
+    allowAction: function(element) {
+      var message = element.data('confirm'),
+          answer = false, callback;
+      if (!message) { return true; }
+
+      if (rails.fire(element, 'confirm')) {
+        try {
+          answer = rails.confirm(message);
+        } catch (e) {
+          (console.error || console.log).call(console, e.stack || e);
+        }
+        callback = rails.fire(element, 'confirm:complete', [answer]);
+      }
+      return answer && callback;
+    },
+
+    // Helper function which checks for blank inputs in a form that match the specified CSS selector
+    blankInputs: function(form, specifiedSelector, nonBlank) {
+      var foundInputs = $(),
+        input,
+        valueToCheck,
+        radiosForNameWithNoneSelected,
+        radioName,
+        selector = specifiedSelector || 'input,textarea',
+        requiredInputs = form.find(selector),
+        checkedRadioButtonNames = {};
+
+      requiredInputs.each(function() {
+        input = $(this);
+        if (input.is('input[type=radio]')) {
+
+          // Don't count unchecked required radio as blank if other radio with same name is checked,
+          // regardless of whether same-name radio input has required attribute or not. The spec
+          // states https://www.w3.org/TR/html5/forms.html#the-required-attribute
+          radioName = input.attr('name');
+
+          // Skip if we've already seen the radio with this name.
+          if (!checkedRadioButtonNames[radioName]) {
+
+            // If none checked
+            if (form.find('input[type=radio]:checked[name="' + radioName + '"]').length === 0) {
+              radiosForNameWithNoneSelected = form.find(
+                'input[type=radio][name="' + radioName + '"]');
+              foundInputs = foundInputs.add(radiosForNameWithNoneSelected);
+            }
+
+            // We only need to check each name once.
+            checkedRadioButtonNames[radioName] = radioName;
+          }
+        } else {
+          valueToCheck = input.is('input[type=checkbox],input[type=radio]') ? input.is(':checked') : !!input.val();
+          if (valueToCheck === nonBlank) {
+            foundInputs = foundInputs.add(input);
+          }
+        }
+      });
+      return foundInputs.length ? foundInputs : false;
+    },
+
+    // Helper function which checks for non-blank inputs in a form that match the specified CSS selector
+    nonBlankInputs: function(form, specifiedSelector) {
+      return rails.blankInputs(form, specifiedSelector, true); // true specifies nonBlank
+    },
+
+    // Helper function, needed to provide consistent behavior in IE
+    stopEverything: function(e) {
+      $(e.target).trigger('ujs:everythingStopped');
+      e.stopImmediatePropagation();
+      return false;
+    },
+
+    //  Replace element's html with the 'data-disable-with' after storing original html
+    //  and prevent clicking on it
+    disableElement: function(element) {
+      var replacement = element.data('disable-with');
+
+      if (replacement !== undefined) {
+        element.data('ujs:enable-with', element.html()); // store enabled state
+        element.html(replacement);
+      }
+
+      element.bind('click.railsDisable', function(e) { // prevent further clicking
+        return rails.stopEverything(e);
+      });
+      element.data('ujs:disabled', true);
+    },
+
+    // Restore element to its original state which was disabled by 'disableElement' above
+    enableElement: function(element) {
+      if (element.data('ujs:enable-with') !== undefined) {
+        element.html(element.data('ujs:enable-with')); // set to old enabled state
+        element.removeData('ujs:enable-with'); // clean up cache
+      }
+      element.unbind('click.railsDisable'); // enable element
+      element.removeData('ujs:disabled');
+    }
+  };
+
+  if (rails.fire($document, 'rails:attachBindings')) {
+
+    $.ajaxPrefilter(function(options, originalOptions, xhr){ if ( !options.crossDomain ) { rails.CSRFProtection(xhr); }});
+
+    // This event works the same as the load event, except that it fires every
+    // time the page is loaded.
+    //
+    // See https://github.com/rails/jquery-ujs/issues/357
+    // See https://developer.mozilla.org/en-US/docs/Using_Firefox_1.5_caching
+    $(window).on('pageshow.rails', function () {
+      $($.rails.enableSelector).each(function () {
+        var element = $(this);
+
+        if (element.data('ujs:disabled')) {
+          $.rails.enableFormElement(element);
+        }
+      });
+
+      $($.rails.linkDisableSelector).each(function () {
+        var element = $(this);
+
+        if (element.data('ujs:disabled')) {
+          $.rails.enableElement(element);
+        }
+      });
+    });
+
+    $document.on('ajax:complete', rails.linkDisableSelector, function() {
+        rails.enableElement($(this));
+    });
+
+    $document.on('ajax:complete', rails.buttonDisableSelector, function() {
+        rails.enableFormElement($(this));
+    });
+
+    $document.on('click.rails', rails.linkClickSelector, function(e) {
+      var link = $(this), method = link.data('method'), data = link.data('params'), metaClick = e.metaKey || e.ctrlKey;
+      if (!rails.allowAction(link)) return rails.stopEverything(e);
+
+      if (!metaClick && link.is(rails.linkDisableSelector)) rails.disableElement(link);
+
+      if (rails.isRemote(link)) {
+        if (metaClick && (!method || method === 'GET') && !data) { return true; }
+
+        var handleRemote = rails.handleRemote(link);
+        // Response from rails.handleRemote() will either be false or a deferred object promise.
+        if (handleRemote === false) {
+          rails.enableElement(link);
+        } else {
+          handleRemote.fail( function() { rails.enableElement(link); } );
+        }
+        return false;
+
+      } else if (method) {
+        rails.handleMethod(link);
+        return false;
+      }
+    });
+
+    $document.on('click.rails', rails.buttonClickSelector, function(e) {
+      var button = $(this);
+
+      if (!rails.allowAction(button) || !rails.isRemote(button)) return rails.stopEverything(e);
+
+      if (button.is(rails.buttonDisableSelector)) rails.disableFormElement(button);
+
+      var handleRemote = rails.handleRemote(button);
+      // Response from rails.handleRemote() will either be false or a deferred object promise.
+      if (handleRemote === false) {
+        rails.enableFormElement(button);
+      } else {
+        handleRemote.fail( function() { rails.enableFormElement(button); } );
+      }
+      return false;
+    });
+
+    $document.on('change.rails', rails.inputChangeSelector, function(e) {
+      var link = $(this);
+      if (!rails.allowAction(link) || !rails.isRemote(link)) return rails.stopEverything(e);
+
+      rails.handleRemote(link);
+      return false;
+    });
+
+    $document.on('submit.rails', rails.formSubmitSelector, function(e) {
+      var form = $(this),
+        remote = rails.isRemote(form),
+        blankRequiredInputs,
+        nonBlankFileInputs;
+
+      if (!rails.allowAction(form)) return rails.stopEverything(e);
+
+      // Skip other logic when required values are missing or file upload is present
+      if (form.attr('novalidate') === undefined) {
+        if (form.data('ujs:formnovalidate-button') === undefined) {
+          blankRequiredInputs = rails.blankInputs(form, rails.requiredInputSelector, false);
+          if (blankRequiredInputs && rails.fire(form, 'ajax:aborted:required', [blankRequiredInputs])) {
+            return rails.stopEverything(e);
+          }
+        } else {
+          // Clear the formnovalidate in case the next button click is not on a formnovalidate button
+          // Not strictly necessary to do here, since it is also reset on each button click, but just to be certain
+          form.data('ujs:formnovalidate-button', undefined);
+        }
+      }
+
+      if (remote) {
+        nonBlankFileInputs = rails.nonBlankInputs(form, rails.fileInputSelector);
+        if (nonBlankFileInputs) {
+          // Slight timeout so that the submit button gets properly serialized
+          // (make it easy for event handler to serialize form without disabled values)
+          setTimeout(function(){ rails.disableFormElements(form); }, 13);
+          var aborted = rails.fire(form, 'ajax:aborted:file', [nonBlankFileInputs]);
+
+          // Re-enable form elements if event bindings return false (canceling normal form submission)
+          if (!aborted) { setTimeout(function(){ rails.enableFormElements(form); }, 13); }
+
+          return aborted;
+        }
+
+        rails.handleRemote(form);
+        return false;
+
+      } else {
+        // Slight timeout so that the submit button gets properly serialized
+        setTimeout(function(){ rails.disableFormElements(form); }, 13);
+      }
+    });
+
+    $document.on('click.rails', rails.formInputClickSelector, function(event) {
+      var button = $(this);
+
+      if (!rails.allowAction(button)) return rails.stopEverything(event);
+
+      // Register the pressed submit button
+      var name = button.attr('name'),
+        data = name ? {name:name, value:button.val()} : null;
+
+      var form = button.closest('form');
+      if (form.length === 0) {
+        form = $('#' + button.attr('form'));
+      }
+      form.data('ujs:submit-button', data);
+
+      // Save attributes from button
+      form.data('ujs:formnovalidate-button', button.attr('formnovalidate'));
+      form.data('ujs:submit-button-formaction', button.attr('formaction'));
+      form.data('ujs:submit-button-formmethod', button.attr('formmethod'));
+    });
+
+    $document.on('ajax:send.rails', rails.formSubmitSelector, function(event) {
+      if (this === event.target) rails.disableFormElements($(this));
+    });
+
+    $document.on('ajax:complete.rails', rails.formSubmitSelector, function(event) {
+      if (this === event.target) rails.enableFormElements($(this));
+    });
+
+    $(function(){
+      rails.refreshCSRFTokens();
+    });
+  }
+
+})( jQuery );
+/**
+ * Warning: This file is auto-generated, do not modify. Instead, make your changes in 'app/javascript/active_admin/' and run `yarn build`
+ */
+
+
+
+
+
+
+
+
+
+(function(global, factory) {
+  typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("jquery"), require("jquery-ui/ui/widgets/datepicker"), require("jquery-ui/ui/widgets/dialog"), require("jquery-ui/ui/widgets/sortable"), require("jquery-ui/ui/widgets/tabs"), require("jquery-ui/ui/widget"), require("jquery-ujs")) : typeof define === "function" && define.amd ? define([ "exports", "jquery", "jquery-ui/ui/widgets/datepicker", "jquery-ui/ui/widgets/dialog", "jquery-ui/ui/widgets/sortable", "jquery-ui/ui/widgets/tabs", "jquery-ui/ui/widget", "jquery-ujs" ], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, 
+  factory(global.ActiveAdmin = {}));
+})(this, function(exports) {
+  "use strict";
+  $.fn.serializeObject = function() {
+    return this.serializeArray().reduce(function(obj, item) {
+      obj[item.name] = item.value;
+      return obj;
+    }, {});
+  };
+  $.ui.dialog.prototype._focusTabbable = function() {
+    this.uiDialog.focus();
+  };
+  function ModalDialog(message, inputs, callback) {
+    var html = '<form id="dialog_confirm" title="' + message + '"><ul>';
+    for (var name in inputs) {
+      var opts, wrapper;
+      var type = inputs[name];
+      if (/^(datepicker|checkbox|text|number)$/.test(type)) {
+        wrapper = "input";
+      } else if (type === "textarea") {
+        wrapper = "textarea";
+      } else if ($.isArray(type)) {
+        var _ref = [ "select", type, "" ];
+        wrapper = _ref[0];
+        opts = _ref[1];
+        type = _ref[2];
+      } else {
+        throw new Error("Unsupported input type: {" + name + ": " + type + "}");
+      }
+      var klass = type === "datepicker" ? type : "";
+      html += "<li>\n      <label>" + (name.charAt(0).toUpperCase() + name.slice(1)) + "</label>\n      <" + wrapper + ' name="' + name + '" class="' + klass + '" type="' + type + '">' + (opts ? function() {
+        var result = [];
+        opts.forEach(function(v) {
+          var $elem = $("<option></option>");
+          if ($.isArray(v)) {
+            $elem.text(v[0]).val(v[1]);
+          } else {
+            $elem.text(v);
+          }
+          result.push($elem.wrap("<div></div>").parent().html());
+        });
+        return result;
+      }().join("") : "") + ("</" + wrapper + ">") + "</li>";
+      var _ref2 = [];
+      wrapper = _ref2[0];
+      opts = _ref2[1];
+      type = _ref2[2];
+      klass = _ref2[3];
+    }
+    html += "</ul></form>";
+    var form = $(html).appendTo("body");
+    $("body").trigger("modal_dialog:before_open", [ form ]);
+    form.dialog({
+      modal: true,
+      open: function open(_event, _ui) {
+        $("body").trigger("modal_dialog:after_open", [ form ]);
+      },
+      dialogClass: "active_admin_dialog",
+      buttons: {
+        OK: function OK() {
+          callback($(this).serializeObject());
+          $(this).dialog("close");
+        },
+        Cancel: function Cancel() {
+          $(this).dialog("close").remove();
+        }
+      }
+    });
+  }
+  var onDOMReady$2 = function onDOMReady() {
+    $(".batch_actions_selector li a").off("click confirm:complete");
+    $(".batch_actions_selector li a").on("click", function(event) {
+      var _this = this;
+      var message;
+      event.stopPropagation();
+      event.preventDefault();
+      if (message = $(this).data("confirm")) {
+        ModalDialog(message, $(this).data("inputs"), function(inputs) {
+          $(_this).trigger("confirm:complete", inputs);
+        });
+      } else {
+        $(this).trigger("confirm:complete");
+      }
+    });
+    $(".batch_actions_selector li a").on("confirm:complete", function(event, inputs) {
+      var val;
+      if (val = JSON.stringify(inputs)) {
+        $("#batch_action_inputs").removeAttr("disabled").val(val);
+      } else {
+        $("#batch_action_inputs").attr("disabled", "disabled");
+      }
+      $("#batch_action").val($(this).data("action"));
+      $("#collection_selection").submit();
+    });
+    if ($(".batch_actions_selector").length && $(":checkbox.toggle_all").length) {
+      if ($(".paginated_collection table.index_table").length) {
+        $(".paginated_collection table.index_table").tableCheckboxToggler();
+      } else {
+        $(".paginated_collection").checkboxToggler();
+      }
+      $(document).on("change", ".paginated_collection :checkbox", function() {
+        if ($(".paginated_collection :checkbox:checked").length && $(".dropdown_menu_list").children().length) {
+          $(".batch_actions_selector").each(function() {
+            $(this).aaDropdownMenu("enable");
+          });
+        } else {
+          $(".batch_actions_selector").each(function() {
+            $(this).aaDropdownMenu("disable");
+          });
+        }
+      });
+    }
+  };
+  $(document).ready(onDOMReady$2).on("page:load turbolinks:load", onDOMReady$2);
+  var CheckboxToggler = function() {
+    function CheckboxToggler(options, container) {
+      this.options = options;
+      this.container = container;
+      this._init();
+      this._bind();
+    }
+    var _proto = CheckboxToggler.prototype;
+    _proto.option = function option(_key, _value) {};
+    _proto._init = function _init() {
+      if (!this.container) {
+        throw new Error("Container element not found");
+      } else {
+        this.$container = $(this.container);
+      }
+      if (!this.$container.find(".toggle_all").length) {
+        throw new Error('"toggle all" checkbox not found');
+      } else {
+        this.toggle_all_checkbox = this.$container.find(".toggle_all");
+      }
+      this.checkboxes = this.$container.find(":checkbox").not(this.toggle_all_checkbox);
+    };
+    _proto._bind = function _bind() {
+      var _this = this;
+      this.checkboxes.change(function(event) {
+        return _this._didChangeCheckbox(event.target);
+      });
+      this.toggle_all_checkbox.change(function() {
+        return _this._didChangeToggleAllCheckbox();
+      });
+    };
+    _proto._didChangeCheckbox = function _didChangeCheckbox(_checkbox) {
+      var numChecked = this.checkboxes.filter(":checked").length;
+      var allChecked = numChecked === this.checkboxes.length;
+      var someChecked = numChecked > 0 && numChecked < this.checkboxes.length;
+      this.toggle_all_checkbox.prop({
+        checked: allChecked,
+        indeterminate: someChecked
+      });
+    };
+    _proto._didChangeToggleAllCheckbox = function _didChangeToggleAllCheckbox() {
+      var setting = this.toggle_all_checkbox.prop("checked");
+      this.checkboxes.prop({
+        checked: setting
+      });
+      return setting;
+    };
+    return CheckboxToggler;
+  }();
+  $.widget.bridge("checkboxToggler", CheckboxToggler);
+  (function($) {
+    $(document).on("focus", "input.datepicker:not(.hasDatepicker)", function() {
+      var input = $(this);
+      if (input[0].type === "date") {
+        return;
+      }
+      var defaults = {
+        dateFormat: "yy-mm-dd"
+      };
+      var options = input.data("datepicker-options");
+      input.datepicker($.extend(defaults, options));
+    });
+  })(jQuery);
+  var DropdownMenu = function() {
+    function DropdownMenu(options, element) {
+      this.options = options;
+      this.element = element;
+      this.$element = $(this.element);
+      var defaults = {
+        fadeInDuration: 20,
+        fadeOutDuration: 100,
+        onClickActionItemCallback: null
+      };
+      this.options = $.extend(defaults, this.options);
+      this.isOpen = false;
+      this.$menuButton = this.$element.find(".dropdown_menu_button");
+      this.$menuList = this.$element.find(".dropdown_menu_list_wrapper");
+      this._buildMenuList();
+      this._bind();
+    }
+    var _proto = DropdownMenu.prototype;
+    _proto.open = function open() {
+      this.isOpen = true;
+      this.$menuList.fadeIn(this.options.fadeInDuration);
+      this._position();
+      return this;
+    };
+    _proto.close = function close() {
+      this.isOpen = false;
+      this.$menuList.fadeOut(this.options.fadeOutDuration);
+      return this;
+    };
+    _proto.destroy = function destroy() {
+      this.$element = null;
+      return this;
+    };
+    _proto.isDisabled = function isDisabled() {
+      return this.$menuButton.hasClass("disabled");
+    };
+    _proto.disable = function disable() {
+      this.$menuButton.addClass("disabled");
+    };
+    _proto.enable = function enable() {
+      this.$menuButton.removeClass("disabled");
+    };
+    _proto.option = function option(key, value) {
+      if ($.isPlainObject(key)) {
+        return this.options = $.extend(true, this.options, key);
+      } else if (key != null) {
+        return this.options[key];
+      } else {
+        return this.options[key] = value;
+      }
+    };
+    _proto._buildMenuList = function _buildMenuList() {
+      this.$nipple = $('<div class="dropdown_menu_nipple"></div>');
+      this.$menuList.prepend(this.$nipple);
+      this.$menuList.hide();
+    };
+    _proto._bind = function _bind() {
+      var _this = this;
+      $("body").click(function() {
+        if (_this.isOpen) {
+          _this.close();
+        }
+      });
+      this.$menuButton.click(function() {
+        if (!_this.isDisabled()) {
+          if (_this.isOpen) {
+            _this.close();
+          } else {
+            _this.open();
+          }
+        }
+        return false;
+      });
+    };
+    _proto._position = function _position() {
+      this.$menuList.css("top", this.$menuButton.position().top + this.$menuButton.outerHeight() + 10);
+      var button_left = this.$menuButton.position().left;
+      var button_center = this.$menuButton.outerWidth() / 2;
+      var button_right = button_left + button_center * 2;
+      var menu_center = this.$menuList.outerWidth() / 2;
+      var nipple_center = this.$nipple.outerWidth() / 2;
+      var window_right = $(window).width();
+      var centered_menu_left = button_left + button_center - menu_center;
+      var centered_menu_right = button_left + button_center + menu_center;
+      if (centered_menu_left < 0) {
+        this.$menuList.css("left", button_left);
+        this.$nipple.css("left", button_center - nipple_center);
+      } else if (centered_menu_right > window_right) {
+        this.$menuList.css("right", window_right - button_right);
+        this.$nipple.css("right", button_center - nipple_center);
+      } else {
+        this.$menuList.css("left", centered_menu_left);
+        this.$nipple.css("left", menu_center - nipple_center);
+      }
+    };
+    return DropdownMenu;
+  }();
+  $.widget.bridge("aaDropdownMenu", DropdownMenu);
+  var onDOMReady$1 = function onDOMReady() {
+    return $(".dropdown_menu").aaDropdownMenu();
+  };
+  $(document).ready(onDOMReady$1).on("page:load turbolinks:load", onDOMReady$1);
+  function hasTurbolinks() {
+    return typeof Turbolinks !== "undefined" && Turbolinks.supported;
+  }
+  function turbolinksVisit(params) {
+    var path = [ window.location.pathname, "?", toQueryString(params) ].join("");
+    Turbolinks.visit(path);
+  }
+  function queryString() {
+    return (window.location.search || "").replace(/^\?/, "");
+  }
+  function queryStringToParams() {
+    var decode = function decode(value) {
+      return decodeURIComponent((value || "").replace(/\+/g, "%20"));
+    };
+    return queryString().split("&").map(function(pair) {
+      return pair.split("=");
+    }).map(function(_ref) {
+      var key = _ref[0], value = _ref[1];
+      return {
+        name: decode(key),
+        value: decode(value)
+      };
+    });
+  }
+  function toQueryString(params) {
+    var encode = function encode(value) {
+      return encodeURIComponent(value || "");
+    };
+    return params.map(function(_ref2) {
+      var name = _ref2.name, value = _ref2.value;
+      return [ encode(name), encode(value) ];
+    }).map(function(pair) {
+      return pair.join("=");
+    }).join("&");
+  }
+  var Filters = function() {
+    function Filters() {}
+    Filters._clearForm = function _clearForm(event) {
+      var regex = /^(q\[|q%5B|q%5b|page|utf8|commit)/;
+      var params = queryStringToParams().filter(function(_ref) {
+        var name = _ref.name;
+        return !name.match(regex);
+      });
+      event.preventDefault();
+      if (hasTurbolinks()) {
+        turbolinksVisit(params);
+      } else {
+        window.location.search = toQueryString(params);
+      }
+    };
+    Filters._disableEmptyInputFields = function _disableEmptyInputFields(event) {
+      var params = $(this).find(":input").filter(function(i, input) {
+        return input.value === "";
+      }).prop({
+        disabled: true
+      }).end().serializeArray();
+      if (hasTurbolinks()) {
+        event.preventDefault();
+        turbolinksVisit(params);
+      }
+    };
+    Filters._setSearchType = function _setSearchType() {
+      $(this).siblings("input").prop({
+        name: "q[" + this.value + "]"
+      });
+    };
+    return Filters;
+  }();
+  (function($) {
+    $(document).on("click", ".clear_filters_btn", Filters._clearForm).on("submit", ".filter_form", Filters._disableEmptyInputFields).on("change", ".filter_form_field.select_and_search select", Filters._setSearchType);
+  })(jQuery);
+  $(function() {
+    $(document).on("click", "a.button.has_many_remove", function(event) {
+      event.preventDefault();
+      var parent = $(this).closest(".has_many_container");
+      var to_remove = $(this).closest("fieldset");
+      recompute_positions(parent);
+      parent.trigger("has_many_remove:before", [ to_remove, parent ]);
+      to_remove.remove();
+      return parent.trigger("has_many_remove:after", [ to_remove, parent ]);
+    });
+    $(document).on("click", "a.button.has_many_add", function(event) {
+      var before_add;
+      event.preventDefault();
+      var parent = $(this).closest(".has_many_container");
+      parent.trigger(before_add = $.Event("has_many_add:before"), [ parent ]);
+      if (!before_add.isDefaultPrevented()) {
+        var index = parent.data("has_many_index") || parent.children("fieldset").length - 1;
+        parent.data({
+          has_many_index: ++index
+        });
+        var regex = new RegExp($(this).data("placeholder"), "g");
+        var html = $(this).data("html").replace(regex, index);
+        var fieldset = $(html).insertBefore(this);
+        recompute_positions(parent);
+        return parent.trigger("has_many_add:after", [ fieldset, parent ]);
+      }
+    });
+    $(document).on("change", '.has_many_container[data-sortable] :input[name$="[_destroy]"]', function() {
+      recompute_positions($(this).closest(".has_many"));
+    });
+    $(document).on("has_many_add:after", ".has_many_container", init_sortable);
+  });
+  var init_sortable = function init_sortable() {
+    var elems = $(".has_many_container[data-sortable]:not(.ui-sortable)");
+    elems.sortable({
+      items: "> fieldset",
+      handle: "> ol > .handle",
+      start: function start(ev, ui) {
+        ui.item.css({
+          opacity: .3
+        });
+      },
+      stop: function stop(ev, ui) {
+        ui.item.css({
+          opacity: 1
+        });
+        recompute_positions($(this));
+      }
+    });
+    elems.each(recompute_positions);
+  };
+  var recompute_positions = function recompute_positions(parent) {
+    parent = parent instanceof jQuery ? parent : $(this);
+    var input_name = parent.data("sortable");
+    var position = parseInt(parent.data("sortable-start") || 0, 10);
+    parent.children("fieldset").each(function() {
+      var destroy_input = $(this).find("> ol > .input > :input[name$='[_destroy]']");
+      var sortable_input = $(this).find("> ol > .input > :input[name$='[" + input_name + "]']");
+      if (sortable_input.length) {
+        sortable_input.val(destroy_input.is(":checked") ? "" : position++);
+      }
+    });
+  };
+  $(document).ready(init_sortable).on("page:load turbolinks:load", init_sortable);
+  var PerPage = function() {
+    function PerPage(element) {
+      this.element = element;
+    }
+    var _proto = PerPage.prototype;
+    _proto.update = function update() {
+      var params = queryStringToParams().filter(function(_ref) {
+        var name = _ref.name;
+        return name != "per_page" || name != "page";
+      });
+      params.push({
+        name: "per_page",
+        value: this.element.value
+      });
+      if (hasTurbolinks()) {
+        turbolinksVisit(params);
+      } else {
+        window.location.search = toQueryString(params);
+      }
+    };
+    PerPage._jQueryInterface = function _jQueryInterface(config) {
+      return this.each(function() {
+        var $this = $(this);
+        var data = $this.data("perPage");
+        if (!data) {
+          data = new PerPage(this);
+          $this.data("perPage", data);
+        }
+        if (config === "update") {
+          data[config]();
+        }
+      });
+    };
+    return PerPage;
+  }();
+  (function($) {
+    $(document).on("change", ".pagination_per_page > select", function(_event) {
+      PerPage._jQueryInterface.call($(this), "update");
+    });
+    $.fn["perPage"] = PerPage._jQueryInterface;
+    $.fn["perPage"].Constructor = PerPage;
+  })(jQuery);
+  function _inheritsLoose(subClass, superClass) {
+    subClass.prototype = Object.create(superClass.prototype);
+    subClass.prototype.constructor = subClass;
+    _setPrototypeOf(subClass, superClass);
+  }
+  function _setPrototypeOf(o, p) {
+    _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+      o.__proto__ = p;
+      return o;
+    };
+    return _setPrototypeOf(o, p);
+  }
+  var TableCheckboxToggler = function(_CheckboxToggler) {
+    _inheritsLoose(TableCheckboxToggler, _CheckboxToggler);
+    function TableCheckboxToggler() {
+      return _CheckboxToggler.apply(this, arguments) || this;
+    }
+    var _proto = TableCheckboxToggler.prototype;
+    _proto._bind = function _bind() {
+      var _this = this;
+      _CheckboxToggler.prototype._bind.apply(this, arguments);
+      this.$container.find("tbody td").click(function(event) {
+        if (event.target.type !== "checkbox") {
+          _this._didClickCell(event.target);
+        }
+      });
+    };
+    _proto._didChangeCheckbox = function _didChangeCheckbox(checkbox) {
+      _CheckboxToggler.prototype._didChangeCheckbox.apply(this, arguments);
+      $(checkbox).parents("tr").toggleClass("selected", checkbox.checked);
+    };
+    _proto._didChangeToggleAllCheckbox = function _didChangeToggleAllCheckbox() {
+      this.$container.find("tbody tr").toggleClass("selected", _CheckboxToggler.prototype._didChangeToggleAllCheckbox.apply(this, arguments));
+    };
+    _proto._didClickCell = function _didClickCell(cell) {
+      $(cell).parent("tr").find(":checkbox").click();
+    };
+    return TableCheckboxToggler;
+  }(CheckboxToggler);
+  $.widget.bridge("tableCheckboxToggler", TableCheckboxToggler);
+  var onDOMReady = function onDOMReady() {
+    return $("#active_admin_content .tabs").tabs();
+  };
+  $(document).ready(onDOMReady).on("page:load turbolinks:load", onDOMReady);
+  function modal_dialog(message, inputs, callback) {
+    console.warn("ActiveAdmin.modal_dialog is deprecated in favor of ActiveAdmin.ModalDialog, please update usage.");
+    return ModalDialog(message, inputs, callback);
+  }
+  exports.ModalDialog = ModalDialog;
+  exports.modal_dialog = modal_dialog;
+  Object.defineProperty(exports, "__esModule", {
+    value: true
+  });
+});
+/*!
+ * jQuery JavaScript Library v3.6.0
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright OpenJS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2021-03-02T17:08Z
+ */
+( function( global, factory ) {
+
+	"use strict";
+
+	if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+		// For CommonJS and CommonJS-like environments where a proper `window`
+		// is present, execute the factory and get jQuery.
+		// For environments that do not have a `window` with a `document`
+		// (such as Node.js), expose a factory as module.exports.
+		// This accentuates the need for the creation of a real `window`.
+		// e.g. var jQuery = require("jquery")(window);
+		// See ticket #14549 for more info.
+		module.exports = global.document ?
+			factory( global, true ) :
+			function( w ) {
+				if ( !w.document ) {
+					throw new Error( "jQuery requires a window with a document" );
+				}
+				return factory( w );
+			};
+	} else {
+		factory( global );
+	}
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var flat = arr.flat ? function( array ) {
+	return arr.flat.call( array );
+} : function( array ) {
+	return arr.concat.apply( [], array );
+};
+
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+		// Support: Chrome <=57, Firefox <=52
+		// In some browsers, typeof returns "function" for HTML <object> elements
+		// (i.e., `typeof document.createElement( "object" ) === "function"`).
+		// We don't want to classify *any* DOM node as a function.
+		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+		// Plus for old WebKit, typeof returns "function" for HTML collections
+		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+			typeof obj.item !== "function";
+	};
+
+
+var isWindow = function isWindow( obj ) {
+		return obj != null && obj === obj.window;
+	};
+
+
+var document = window.document;
+
+
+
+	var preservedScriptAttributes = {
+		type: true,
+		src: true,
+		nonce: true,
+		noModule: true
+	};
+
+	function DOMEval( code, node, doc ) {
+		doc = doc || document;
+
+		var i, val,
+			script = doc.createElement( "script" );
+
+		script.text = code;
+		if ( node ) {
+			for ( i in preservedScriptAttributes ) {
+
+				// Support: Firefox 64+, Edge 18+
+				// Some browsers don't support the "nonce" property on scripts.
+				// On the other hand, just using `getAttribute` is not enough as
+				// the `nonce` attribute is reset to an empty string whenever it
+				// becomes browsing-context connected.
+				// See https://github.com/whatwg/html/issues/2369
+				// See https://html.spec.whatwg.org/#nonce-attributes
+				// The `node.getAttribute` check was added for the sake of
+				// `jQuery.globalEval` so that it can fake a nonce-containing node
+				// via an object.
+				val = node[ i ] || node.getAttribute && node.getAttribute( i );
+				if ( val ) {
+					script.setAttribute( i, val );
+				}
+			}
+		}
+		doc.head.appendChild( script ).parentNode.removeChild( script );
+	}
+
+
+function toType( obj ) {
+	if ( obj == null ) {
+		return obj + "";
+	}
+
+	// Support: Android <=2.3 only (functionish RegExp)
+	return typeof obj === "object" || typeof obj === "function" ?
+		class2type[ toString.call( obj ) ] || "object" :
+		typeof obj;
+}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+	version = "3.6.0",
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+
+		// The jQuery object is actually just the init constructor 'enhanced'
+		// Need init if jQuery is called (just allow error to be thrown if not included)
+		return new jQuery.fn.init( selector, context );
+	};
+
+jQuery.fn = jQuery.prototype = {
+
+	// The current version of jQuery being used
+	jquery: version,
+
+	constructor: jQuery,
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+
+		// Return all the elements in a clean array
+		if ( num == null ) {
+			return slice.call( this );
+		}
+
+		// Return just the one element from the set
+		return num < 0 ? this[ num + this.length ] : this[ num ];
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	each: function( callback ) {
+		return jQuery.each( this, callback );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map( this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		} ) );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	even: function() {
+		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+			return ( i + 1 ) % 2;
+		} ) );
+	},
+
+	odd: function() {
+		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+			return i % 2;
+		} ) );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor();
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: arr.sort,
+	splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[ 0 ] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+
+		// Skip the boolean and the target
+		target = arguments[ i ] || {};
+		i++;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !isFunction( target ) ) {
+		target = {};
+	}
+
+	// Extend jQuery itself if only one argument is passed
+	if ( i === length ) {
+		target = this;
+		i--;
+	}
+
+	for ( ; i < length; i++ ) {
+
+		// Only deal with non-null/undefined values
+		if ( ( options = arguments[ i ] ) != null ) {
+
+			// Extend the base object
+			for ( name in options ) {
+				copy = options[ name ];
+
+				// Prevent Object.prototype pollution
+				// Prevent never-ending loop
+				if ( name === "__proto__" || target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+					( copyIsArray = Array.isArray( copy ) ) ) ) {
+					src = target[ name ];
+
+					// Ensure proper type for the source value
+					if ( copyIsArray && !Array.isArray( src ) ) {
+						clone = [];
+					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
+						clone = {};
+					} else {
+						clone = src;
+					}
+					copyIsArray = false;
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend( {
+
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+	// Assume jQuery is ready without the ready module
+	isReady: true,
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	noop: function() {},
+
+	isPlainObject: function( obj ) {
+		var proto, Ctor;
+
+		// Detect obvious negatives
+		// Use toString instead of jQuery.type to catch host objects
+		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+			return false;
+		}
+
+		proto = getProto( obj );
+
+		// Objects with no prototype (e.g., `Object.create( null )`) are plain
+		if ( !proto ) {
+			return true;
+		}
+
+		// Objects with prototype are plain iff they were constructed by a global Object function
+		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	// Evaluates a script in a provided context; falls back to the global one
+	// if not specified.
+	globalEval: function( code, options, doc ) {
+		DOMEval( code, { nonce: options && options.nonce }, doc );
+	},
+
+	each: function( obj, callback ) {
+		var length, i = 0;
+
+		if ( isArrayLike( obj ) ) {
+			length = obj.length;
+			for ( ; i < length; i++ ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		} else {
+			for ( i in obj ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArrayLike( Object( arr ) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+						[ arr ] : arr
+				);
+			} else {
+				push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		return arr == null ? -1 : indexOf.call( arr, elem, i );
+	},
+
+	// Support: Android <=4.0 only, PhantomJS 1 only
+	// push.apply(_, arraylike) throws on ancient WebKit
+	merge: function( first, second ) {
+		var len = +second.length,
+			j = 0,
+			i = first.length;
+
+		for ( ; j < len; j++ ) {
+			first[ i++ ] = second[ j ];
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, invert ) {
+		var callbackInverse,
+			matches = [],
+			i = 0,
+			length = elems.length,
+			callbackExpect = !invert;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			callbackInverse = !callback( elems[ i ], i );
+			if ( callbackInverse !== callbackExpect ) {
+				matches.push( elems[ i ] );
+			}
+		}
+
+		return matches;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var length, value,
+			i = 0,
+			ret = [];
+
+		// Go through the array, translating each of the items to their new values
+		if ( isArrayLike( elems ) ) {
+			length = elems.length;
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return flat( ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// jQuery.support is not used in Core but other projects attach their
+	// properties to it so it needs to exist.
+	support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+	function( _i, name ) {
+		class2type[ "[object " + name + "]" ] = name.toLowerCase();
+	} );
+
+function isArrayLike( obj ) {
+
+	// Support: real iOS 8.2 only (not reproducible in simulator)
+	// `in` check used to prevent JIT error (gh-2145)
+	// hasOwn isn't used here due to false negatives
+	// regarding Nodelist length in IE
+	var length = !!obj && "length" in obj && obj.length,
+		type = toType( obj );
+
+	if ( isFunction( obj ) || isWindow( obj ) ) {
+		return false;
+	}
+
+	return type === "array" || length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.6
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://js.foundation/
+ *
+ * Date: 2021-02-16
+ */
+( function( window ) {
+var i,
+	support,
+	Expr,
+	getText,
+	isXML,
+	tokenize,
+	compile,
+	select,
+	outermostContext,
+	sortInput,
+	hasDuplicate,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + 1 * new Date(),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	nonnativeSelectorCache = createCache(),
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+		}
+		return 0;
+	},
+
+	// Instance methods
+	hasOwn = ( {} ).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	pushNative = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+
+	// Use a stripped-down indexOf as it's faster than native
+	// https://jsperf.com/thor-indexof-vs-for/5
+	indexOf = function( list, elem ) {
+		var i = 0,
+			len = list.length;
+		for ( ; i < len; i++ ) {
+			if ( list[ i ] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
+		"ismap|loop|multiple|open|readonly|required|scoped",
+
+	// Regular expressions
+
+	// http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+
+	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
+	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
+		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
+
+	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+
+		// Operator (capture 2)
+		"*([*^$|!~]?=)" + whitespace +
+
+		// "Attribute values must be CSS identifiers [capture 5]
+		// or strings [capture 3 or capture 4]"
+		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
+		whitespace + "*\\]",
+
+	pseudos = ":(" + identifier + ")(?:\\((" +
+
+		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+		// 1. quoted (capture 3; capture 4 or capture 5)
+		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+
+		// 2. simple (capture 6)
+		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+
+		// 3. anything else (capture 2)
+		".*" +
+		")\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rwhitespace = new RegExp( whitespace + "+", "g" ),
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
+		whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
+		"*" ),
+	rdescend = new RegExp( whitespace + "|>" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + identifier + ")" ),
+		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
+			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
+			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace +
+			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rhtml = /HTML$/i,
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rsibling = /[+~]/,
+
+	// CSS escapes
+	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
+	funescape = function( escape, nonHex ) {
+		var high = "0x" + escape.slice( 1 ) - 0x10000;
+
+		return nonHex ?
+
+			// Strip the backslash prefix from a non-hex escape sequence
+			nonHex :
+
+			// Replace a hexadecimal escape sequence with the encoded Unicode code point
+			// Support: IE <=11+
+			// For values outside the Basic Multilingual Plane (BMP), manually construct a
+			// surrogate pair
+			high < 0 ?
+				String.fromCharCode( high + 0x10000 ) :
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	},
+
+	// CSS string/identifier serialization
+	// https://drafts.csswg.org/cssom/#common-serializing-idioms
+	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+	fcssescape = function( ch, asCodePoint ) {
+		if ( asCodePoint ) {
+
+			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+			if ( ch === "\0" ) {
+				return "\uFFFD";
+			}
+
+			// Control characters and (dependent upon position) numbers get escaped as code points
+			return ch.slice( 0, -1 ) + "\\" +
+				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+		}
+
+		// Other potentially-special ASCII characters get backslash-escaped
+		return "\\" + ch;
+	},
+
+	// Used for iframes
+	// See setDocument()
+	// Removing the function wrapper causes a "Permission Denied"
+	// error in IE
+	unloadHandler = function() {
+		setDocument();
+	},
+
+	inDisabledFieldset = addCombinator(
+		function( elem ) {
+			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
+		},
+		{ dir: "parentNode", next: "legend" }
+	);
+
+// Optimize for push.apply( _, NodeList )
+try {
+	push.apply(
+		( arr = slice.call( preferredDoc.childNodes ) ),
+		preferredDoc.childNodes
+	);
+
+	// Support: Android<4.0
+	// Detect silently failing push.apply
+	// eslint-disable-next-line no-unused-expressions
+	arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+	push = { apply: arr.length ?
+
+		// Leverage slice if possible
+		function( target, els ) {
+			pushNative.apply( target, slice.call( els ) );
+		} :
+
+		// Support: IE<9
+		// Otherwise append directly
+		function( target, els ) {
+			var j = target.length,
+				i = 0;
+
+			// Can't trust NodeList.length
+			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
+			target.length = j - 1;
+		}
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var m, i, elem, nid, match, groups, newSelector,
+		newContext = context && context.ownerDocument,
+
+		// nodeType defaults to 9, since context defaults to document
+		nodeType = context ? context.nodeType : 9;
+
+	results = results || [];
+
+	// Return early from calls with invalid selector or context
+	if ( typeof selector !== "string" || !selector ||
+		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+		return results;
+	}
+
+	// Try to shortcut find operations (as opposed to filters) in HTML documents
+	if ( !seed ) {
+		setDocument( context );
+		context = context || document;
+
+		if ( documentIsHTML ) {
+
+			// If the selector is sufficiently simple, try using a "get*By*" DOM method
+			// (excepting DocumentFragment context, where the methods don't exist)
+			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
+
+				// ID selector
+				if ( ( m = match[ 1 ] ) ) {
+
+					// Document context
+					if ( nodeType === 9 ) {
+						if ( ( elem = context.getElementById( m ) ) ) {
+
+							// Support: IE, Opera, Webkit
+							// TODO: identify versions
+							// getElementById can match elements by name instead of ID
+							if ( elem.id === m ) {
+								results.push( elem );
+								return results;
+							}
+						} else {
+							return results;
+						}
+
+					// Element context
+					} else {
+
+						// Support: IE, Opera, Webkit
+						// TODO: identify versions
+						// getElementById can match elements by name instead of ID
+						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
+							contains( context, elem ) &&
+							elem.id === m ) {
+
+							results.push( elem );
+							return results;
+						}
+					}
+
+				// Type selector
+				} else if ( match[ 2 ] ) {
+					push.apply( results, context.getElementsByTagName( selector ) );
+					return results;
+
+				// Class selector
+				} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
+					context.getElementsByClassName ) {
+
+					push.apply( results, context.getElementsByClassName( m ) );
+					return results;
+				}
+			}
+
+			// Take advantage of querySelectorAll
+			if ( support.qsa &&
+				!nonnativeSelectorCache[ selector + " " ] &&
+				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
+
+				// Support: IE 8 only
+				// Exclude object elements
+				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
+
+				newSelector = selector;
+				newContext = context;
+
+				// qSA considers elements outside a scoping root when evaluating child or
+				// descendant combinators, which is not what we want.
+				// In such cases, we work around the behavior by prefixing every selector in the
+				// list with an ID selector referencing the scope context.
+				// The technique has to be used as well when a leading combinator is used
+				// as such selectors are not recognized by querySelectorAll.
+				// Thanks to Andrew Dupont for this technique.
+				if ( nodeType === 1 &&
+					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
+
+					// Expand context for sibling selectors
+					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+						context;
+
+					// We can use :scope instead of the ID hack if the browser
+					// supports it & if we're not changing the context.
+					if ( newContext !== context || !support.scope ) {
+
+						// Capture the context ID, setting it first if necessary
+						if ( ( nid = context.getAttribute( "id" ) ) ) {
+							nid = nid.replace( rcssescape, fcssescape );
+						} else {
+							context.setAttribute( "id", ( nid = expando ) );
+						}
+					}
+
+					// Prefix every selector in the list
+					groups = tokenize( selector );
+					i = groups.length;
+					while ( i-- ) {
+						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
+							toSelector( groups[ i ] );
+					}
+					newSelector = groups.join( "," );
+				}
+
+				try {
+					push.apply( results,
+						newContext.querySelectorAll( newSelector )
+					);
+					return results;
+				} catch ( qsaError ) {
+					nonnativeSelectorCache( selector, true );
+				} finally {
+					if ( nid === expando ) {
+						context.removeAttribute( "id" );
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var keys = [];
+
+	function cache( key, value ) {
+
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key + " " ) > Expr.cacheLength ) {
+
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return ( cache[ key + " " ] = value );
+	}
+	return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+	var el = document.createElement( "fieldset" );
+
+	try {
+		return !!fn( el );
+	} catch ( e ) {
+		return false;
+	} finally {
+
+		// Remove from its parent by default
+		if ( el.parentNode ) {
+			el.parentNode.removeChild( el );
+		}
+
+		// release memory in IE
+		el = null;
+	}
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+	var arr = attrs.split( "|" ),
+		i = arr.length;
+
+	while ( i-- ) {
+		Expr.attrHandle[ arr[ i ] ] = handler;
+	}
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+			a.sourceIndex - b.sourceIndex;
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( ( cur = cur.nextSibling ) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return ( name === "input" || name === "button" ) && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+	return function( elem ) {
+
+		// Only certain elements can match :enabled or :disabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+		if ( "form" in elem ) {
+
+			// Check for inherited disabledness on relevant non-disabled elements:
+			// * listed form-associated elements in a disabled fieldset
+			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+			// * option elements in a disabled optgroup
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+			// All such elements have a "form" property.
+			if ( elem.parentNode && elem.disabled === false ) {
+
+				// Option elements defer to a parent optgroup if present
+				if ( "label" in elem ) {
+					if ( "label" in elem.parentNode ) {
+						return elem.parentNode.disabled === disabled;
+					} else {
+						return elem.disabled === disabled;
+					}
+				}
+
+				// Support: IE 6 - 11
+				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
+				return elem.isDisabled === disabled ||
+
+					// Where there is no isDisabled, check manually
+					/* jshint -W018 */
+					elem.isDisabled !== !disabled &&
+					inDisabledFieldset( elem ) === disabled;
+			}
+
+			return elem.disabled === disabled;
+
+		// Try to winnow out elements that can't be disabled before trusting the disabled property.
+		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+		// even exist on them, let alone have a boolean value.
+		} else if ( "label" in elem ) {
+			return elem.disabled === disabled;
+		}
+
+		// Remaining elements are neither :enabled nor :disabled
+		return false;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+	return markFunction( function( argument ) {
+		argument = +argument;
+		return markFunction( function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
+					seed[ j ] = !( matches[ j ] = seed[ j ] );
+				}
+			}
+		} );
+	} );
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+	return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	var namespace = elem && elem.namespaceURI,
+		docElem = elem && ( elem.ownerDocument || elem ).documentElement;
+
+	// Support: IE <=8
+	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
+	// https://bugs.jquery.com/ticket/4833
+	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var hasCompare, subWindow,
+		doc = node ? node.ownerDocument || node : preferredDoc;
+
+	// Return early if doc is invalid or already selected
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Update global variables
+	document = doc;
+	docElem = document.documentElement;
+	documentIsHTML = !isXML( document );
+
+	// Support: IE 9 - 11+, Edge 12 - 18+
+	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( preferredDoc != document &&
+		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
+
+		// Support: IE 11, Edge
+		if ( subWindow.addEventListener ) {
+			subWindow.addEventListener( "unload", unloadHandler, false );
+
+		// Support: IE 9 - 10 only
+		} else if ( subWindow.attachEvent ) {
+			subWindow.attachEvent( "onunload", unloadHandler );
+		}
+	}
+
+	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
+	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
+	// IE/Edge & older browsers don't support the :scope pseudo-class.
+	// Support: Safari 6.0 only
+	// Safari 6.0 supports :scope but it's an alias of :root there.
+	support.scope = assert( function( el ) {
+		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
+		return typeof el.querySelectorAll !== "undefined" &&
+			!el.querySelectorAll( ":scope fieldset div" ).length;
+	} );
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties
+	// (excepting IE8 booleans)
+	support.attributes = assert( function( el ) {
+		el.className = "i";
+		return !el.getAttribute( "className" );
+	} );
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert( function( el ) {
+		el.appendChild( document.createComment( "" ) );
+		return !el.getElementsByTagName( "*" ).length;
+	} );
+
+	// Support: IE<9
+	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programmatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert( function( el ) {
+		docElem.appendChild( el ).id = expando;
+		return !document.getElementsByName || !document.getElementsByName( expando ).length;
+	} );
+
+	// ID filter and find
+	if ( support.getById ) {
+		Expr.filter[ "ID" ] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute( "id" ) === attrId;
+			};
+		};
+		Expr.find[ "ID" ] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var elem = context.getElementById( id );
+				return elem ? [ elem ] : [];
+			}
+		};
+	} else {
+		Expr.filter[ "ID" ] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== "undefined" &&
+					elem.getAttributeNode( "id" );
+				return node && node.value === attrId;
+			};
+		};
+
+		// Support: IE 6 - 7 only
+		// getElementById is not reliable as a find shortcut
+		Expr.find[ "ID" ] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var node, i, elems,
+					elem = context.getElementById( id );
+
+				if ( elem ) {
+
+					// Verify the id attribute
+					node = elem.getAttributeNode( "id" );
+					if ( node && node.value === id ) {
+						return [ elem ];
+					}
+
+					// Fall back on getElementsByName
+					elems = context.getElementsByName( id );
+					i = 0;
+					while ( ( elem = elems[ i++ ] ) ) {
+						node = elem.getAttributeNode( "id" );
+						if ( node && node.value === id ) {
+							return [ elem ];
+						}
+					}
+				}
+
+				return [];
+			}
+		};
+	}
+
+	// Tag
+	Expr.find[ "TAG" ] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( tag );
+
+			// DocumentFragment nodes don't have gEBTN
+			} else if ( support.qsa ) {
+				return context.querySelectorAll( tag );
+			}
+		} :
+
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+
+				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( ( elem = results[ i++ ] ) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Class
+	Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	/* QSA/matchesSelector
+	---------------------------------------------------------------------- */
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21)
+	// We allow this because of a bug in IE8/9 that throws an error
+	// whenever `document.activeElement` is accessed on an iframe
+	// So, we allow :focus to pass through QSA all the time to avoid the IE error
+	// See https://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
+
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert( function( el ) {
+
+			var input;
+
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explicitly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// https://bugs.jquery.com/ticket/12359
+			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
+				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
+				"<option selected=''></option></select>";
+
+			// Support: IE8, Opera 11-12.16
+			// Nothing should be selected when empty strings follow ^= or $= or *=
+			// The test attribute must be unknown in Opera but "safe" for WinRT
+			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+			if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+			}
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !el.querySelectorAll( "[selected]" ).length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+				rbuggyQSA.push( "~=" );
+			}
+
+			// Support: IE 11+, Edge 15 - 18+
+			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
+			// Adding a temporary attribute to the document before the selection works
+			// around the issue.
+			// Interestingly, IE 10 & older don't seem to have the issue.
+			input = document.createElement( "input" );
+			input.setAttribute( "name", "" );
+			el.appendChild( input );
+			if ( !el.querySelectorAll( "[name='']" ).length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
+					whitespace + "*(?:''|\"\")" );
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !el.querySelectorAll( ":checked" ).length ) {
+				rbuggyQSA.push( ":checked" );
+			}
+
+			// Support: Safari 8+, iOS 8+
+			// https://bugs.webkit.org/show_bug.cgi?id=136851
+			// In-page `selector#id sibling-combinator selector` fails
+			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+				rbuggyQSA.push( ".#.+[+~]" );
+			}
+
+			// Support: Firefox <=3.6 - 5 only
+			// Old Firefox doesn't throw on a badly-escaped identifier.
+			el.querySelectorAll( "\\\f" );
+			rbuggyQSA.push( "[\\r\\n\\f]" );
+		} );
+
+		assert( function( el ) {
+			el.innerHTML = "<a href='' disabled='disabled'></a>" +
+				"<select disabled='disabled'><option/></select>";
+
+			// Support: Windows 8 Native Apps
+			// The type and name attributes are restricted during .innerHTML assignment
+			var input = document.createElement( "input" );
+			input.setAttribute( "type", "hidden" );
+			el.appendChild( input ).setAttribute( "name", "D" );
+
+			// Support: IE8
+			// Enforce case-sensitivity of name attribute
+			if ( el.querySelectorAll( "[name=d]" ).length ) {
+				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Support: IE9-11+
+			// IE's :disabled selector does not pick up the children of disabled fieldsets
+			docElem.appendChild( el ).disabled = true;
+			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Support: Opera 10 - 11 only
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			el.querySelectorAll( "*,:x" );
+			rbuggyQSA.push( ",.*:" );
+		} );
+	}
+
+	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
+		docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector ) ) ) ) {
+
+		assert( function( el ) {
+
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( el, "*" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( el, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		} );
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+	hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+	// Element contains another
+	// Purposefully self-exclusive
+	// As in, an element does not contain itself
+	contains = hasCompare || rnative.test( docElem.contains ) ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			) );
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( ( b = b.parentNode ) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	/* Sorting
+	---------------------------------------------------------------------- */
+
+	// Document order sorting
+	sortOrder = hasCompare ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		// Sort on method existence if only one input has compareDocumentPosition
+		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+		if ( compare ) {
+			return compare;
+		}
+
+		// Calculate position if both inputs belong to the same document
+		// Support: IE 11+, Edge 17 - 18+
+		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+		// two documents; shallow comparisons work.
+		// eslint-disable-next-line eqeqeq
+		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
+			a.compareDocumentPosition( b ) :
+
+			// Otherwise we know they are disconnected
+			1;
+
+		// Disconnected nodes
+		if ( compare & 1 ||
+			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
+
+			// Choose the first element that is related to our preferred document
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			// eslint-disable-next-line eqeqeq
+			if ( a == document || a.ownerDocument == preferredDoc &&
+				contains( preferredDoc, a ) ) {
+				return -1;
+			}
+
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			// eslint-disable-next-line eqeqeq
+			if ( b == document || b.ownerDocument == preferredDoc &&
+				contains( preferredDoc, b ) ) {
+				return 1;
+			}
+
+			// Maintain original order
+			return sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+		}
+
+		return compare & 4 ? -1 : 1;
+	} :
+	function( a, b ) {
+
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Parentless nodes are either documents or disconnected
+		if ( !aup || !bup ) {
+
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			/* eslint-disable eqeqeq */
+			return a == document ? -1 :
+				b == document ? 1 :
+				/* eslint-enable eqeqeq */
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( ( cur = cur.parentNode ) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( ( cur = cur.parentNode ) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[ i ] === bp[ i ] ) {
+			i++;
+		}
+
+		return i ?
+
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[ i ], bp[ i ] ) :
+
+			// Otherwise nodes in our document sort first
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			/* eslint-disable eqeqeq */
+			ap[ i ] == preferredDoc ? -1 :
+			bp[ i ] == preferredDoc ? 1 :
+			/* eslint-enable eqeqeq */
+			0;
+	};
+
+	return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	setDocument( elem );
+
+	if ( support.matchesSelector && documentIsHTML &&
+		!nonnativeSelectorCache[ expr + " " ] &&
+		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+
+				// As well, disconnected nodes are said to be in a document
+				// fragment in IE 9
+				elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch ( e ) {
+			nonnativeSelectorCache( expr, true );
+		}
+	}
+
+	return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+
+	// Set document vars if needed
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( ( context.ownerDocument || context ) != document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+
+	// Set document vars if needed
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( ( elem.ownerDocument || elem ) != document ) {
+		setDocument( elem );
+	}
+
+	var fn = Expr.attrHandle[ name.toLowerCase() ],
+
+		// Don't get fooled by Object.prototype properties (jQuery #13807)
+		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+			fn( elem, name, !documentIsHTML ) :
+			undefined;
+
+	return val !== undefined ?
+		val :
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			( val = elem.getAttributeNode( name ) ) && val.specified ?
+				val.value :
+				null;
+};
+
+Sizzle.escape = function( sel ) {
+	return ( sel + "" ).replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		j = 0,
+		i = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	sortInput = !support.sortStable && results.slice( 0 );
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		while ( ( elem = results[ i++ ] ) ) {
+			if ( elem === results[ i ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	// Clear input after sorting to release objects
+	// See https://github.com/jquery/sizzle/pull/225
+	sortInput = null;
+
+	return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+
+		// If no nodeType, this is expected to be an array
+		while ( ( node = elem[ i++ ] ) ) {
+
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (jQuery #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	attrHandle: {},
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
+				match[ 5 ] || "" ).replace( runescape, funescape );
+
+			if ( match[ 2 ] === "~=" ) {
+				match[ 3 ] = " " + match[ 3 ] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[ 1 ] = match[ 1 ].toLowerCase();
+
+			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
+
+				// nth-* requires argument
+				if ( !match[ 3 ] ) {
+					Sizzle.error( match[ 0 ] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[ 4 ] = +( match[ 4 ] ?
+					match[ 5 ] + ( match[ 6 ] || 1 ) :
+					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
+				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
+
+				// other types prohibit arguments
+			} else if ( match[ 3 ] ) {
+				Sizzle.error( match[ 0 ] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[ 6 ] && match[ 2 ];
+
+			if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[ 3 ] ) {
+				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+
+				// Get excess from tokenize (recursively)
+				( excess = tokenize( unquoted, true ) ) &&
+
+				// advance to the next closing parenthesis
+				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
+
+				// excess is a negative index
+				match[ 0 ] = match[ 0 ].slice( 0, excess );
+				match[ 2 ] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeNameSelector ) {
+			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+			return nodeNameSelector === "*" ?
+				function() {
+					return true;
+				} :
+				function( elem ) {
+					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+				};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				( pattern = new RegExp( "(^|" + whitespace +
+					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
+						className, function( elem ) {
+							return pattern.test(
+								typeof elem.className === "string" && elem.className ||
+								typeof elem.getAttribute !== "undefined" &&
+									elem.getAttribute( "class" ) ||
+								""
+							);
+				} );
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				/* eslint-disable max-len */
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+				/* eslint-enable max-len */
+
+			};
+		},
+
+		"CHILD": function( type, what, _argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, _context, xml ) {
+					var cache, uniqueCache, outerCache, node, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType,
+						diff = false;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( ( node = node[ dir ] ) ) {
+									if ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) {
+
+										return false;
+									}
+								}
+
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+
+							// Seek `elem` from a previously-cached index
+
+							// ...in a gzip-friendly way
+							node = parent;
+							outerCache = node[ expando ] || ( node[ expando ] = {} );
+
+							// Support: IE <9 only
+							// Defend against cloned attroperties (jQuery gh-1709)
+							uniqueCache = outerCache[ node.uniqueID ] ||
+								( outerCache[ node.uniqueID ] = {} );
+
+							cache = uniqueCache[ type ] || [];
+							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+							diff = nodeIndex && cache[ 2 ];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( ( node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								( diff = nodeIndex = 0 ) || start.pop() ) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						} else {
+
+							// Use previously-cached element index if available
+							if ( useCache ) {
+
+								// ...in a gzip-friendly way
+								node = elem;
+								outerCache = node[ expando ] || ( node[ expando ] = {} );
+
+								// Support: IE <9 only
+								// Defend against cloned attroperties (jQuery gh-1709)
+								uniqueCache = outerCache[ node.uniqueID ] ||
+									( outerCache[ node.uniqueID ] = {} );
+
+								cache = uniqueCache[ type ] || [];
+								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+								diff = nodeIndex;
+							}
+
+							// xml :nth-child(...)
+							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
+							if ( diff === false ) {
+
+								// Use the same loop as above to seek `elem` from the start
+								while ( ( node = ++nodeIndex && node && node[ dir ] ||
+									( diff = nodeIndex = 0 ) || start.pop() ) ) {
+
+									if ( ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) &&
+										++diff ) {
+
+										// Cache the index of each encountered element
+										if ( useCache ) {
+											outerCache = node[ expando ] ||
+												( node[ expando ] = {} );
+
+											// Support: IE <9 only
+											// Defend against cloned attroperties (jQuery gh-1709)
+											uniqueCache = outerCache[ node.uniqueID ] ||
+												( outerCache[ node.uniqueID ] = {} );
+
+											uniqueCache[ type ] = [ dirruns, diff ];
+										}
+
+										if ( node === elem ) {
+											break;
+										}
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction( function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf( seed, matched[ i ] );
+							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
+						}
+					} ) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+
+		// Potentially complex pseudos
+		"not": markFunction( function( selector ) {
+
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction( function( seed, matches, _context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( ( elem = unmatched[ i ] ) ) {
+							seed[ i ] = !( matches[ i ] = elem );
+						}
+					}
+				} ) :
+				function( elem, _context, xml ) {
+					input[ 0 ] = elem;
+					matcher( input, null, xml, results );
+
+					// Don't keep the element (issue #299)
+					input[ 0 ] = null;
+					return !results.pop();
+				};
+		} ),
+
+		"has": markFunction( function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		} ),
+
+		"contains": markFunction( function( text ) {
+			text = text.replace( runescape, funescape );
+			return function( elem ) {
+				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
+			};
+		} ),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+
+			// lang value must be a valid identifier
+			if ( !ridentifier.test( lang || "" ) ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( ( elemLang = documentIsHTML ?
+						elem.lang :
+						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
+				return false;
+			};
+		} ),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement &&
+				( !document.hasFocus || document.hasFocus() ) &&
+				!!( elem.type || elem.href || ~elem.tabIndex );
+		},
+
+		// Boolean properties
+		"enabled": createDisabledPseudo( false ),
+		"disabled": createDisabledPseudo( true ),
+
+		"checked": function( elem ) {
+
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return ( nodeName === "input" && !!elem.checked ) ||
+				( nodeName === "option" && !!elem.selected );
+		},
+
+		"selected": function( elem ) {
+
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				// eslint-disable-next-line no-unused-expressions
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+			//   but not by others (comment: 8; processing instruction: 7; etc.)
+			// nodeType < 6 works because attributes (2) do not appear as children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeType < 6 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos[ "empty" ]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+
+				// Support: IE<8
+				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+				( ( attr = elem.getAttribute( "type" ) ) == null ||
+					attr.toLowerCase() === "text" );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo( function() {
+			return [ 0 ];
+		} ),
+
+		"last": createPositionalPseudo( function( _matchIndexes, length ) {
+			return [ length - 1 ];
+		} ),
+
+		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		} ),
+
+		"even": createPositionalPseudo( function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} ),
+
+		"odd": createPositionalPseudo( function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} ),
+
+		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
+			var i = argument < 0 ?
+				argument + length :
+				argument > length ?
+					length :
+					argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} ),
+
+		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} )
+	}
+};
+
+Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
+			if ( match ) {
+
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[ 0 ].length ) || soFar;
+			}
+			groups.push( ( tokens = [] ) );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( ( match = rcombinators.exec( soFar ) ) ) {
+			matched = match.shift();
+			tokens.push( {
+				value: matched,
+
+				// Cast descendant combinators to space
+				type: match[ 0 ].replace( rtrim, " " )
+			} );
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
+				( match = preFilters[ type ]( match ) ) ) ) {
+				matched = match.shift();
+				tokens.push( {
+					value: matched,
+					type: type,
+					matches: match
+				} );
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[ i ].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		skip = combinator.next,
+		key = skip || dir,
+		checkNonElements = base && key === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( ( elem = elem[ dir ] ) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+			return false;
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var oldCache, uniqueCache, outerCache,
+				newCache = [ dirruns, doneName ];
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+			if ( xml ) {
+				while ( ( elem = elem[ dir ] ) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( ( elem = elem[ dir ] ) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
+
+						// Support: IE <9 only
+						// Defend against cloned attroperties (jQuery gh-1709)
+						uniqueCache = outerCache[ elem.uniqueID ] ||
+							( outerCache[ elem.uniqueID ] = {} );
+
+						if ( skip && skip === elem.nodeName.toLowerCase() ) {
+							elem = elem[ dir ] || elem;
+						} else if ( ( oldCache = uniqueCache[ key ] ) &&
+							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+							// Assign to newCache so results back-propagate to previous elements
+							return ( newCache[ 2 ] = oldCache[ 2 ] );
+						} else {
+
+							// Reuse newcache so results back-propagate to previous elements
+							uniqueCache[ key ] = newCache;
+
+							// A match means we're done; a fail means we have to keep checking
+							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+			return false;
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[ i ]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[ 0 ];
+}
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[ i ], results );
+	}
+	return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( ( elem = unmatched[ i ] ) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction( function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts(
+				selector || "*",
+				context.nodeType ? [ context ] : context,
+				[]
+			),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( ( elem = temp[ i ] ) ) {
+					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( ( elem = matcherOut[ i ] ) ) {
+
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( ( matcherIn[ i ] = elem ) );
+						}
+					}
+					postFinder( null, ( matcherOut = [] ), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( ( elem = matcherOut[ i ] ) &&
+						( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
+
+						seed[ temp ] = !( results[ temp ] = elem );
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	} );
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
+		implicitRelative = leadingRelative || Expr.relative[ " " ],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				( checkContext = context ).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+
+			// Avoid hanging onto element (issue #299)
+			checkContext = null;
+			return ret;
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
+			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+		} else {
+			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[ j ].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector(
+
+					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
+					tokens
+						.slice( 0, i - 1 )
+						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
+					).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, outermost ) {
+			var elem, j, matcher,
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				setMatched = [],
+				contextBackup = outermostContext,
+
+				// We must always have either seed elements or outermost context
+				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
+
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
+				len = elems.length;
+
+			if ( outermost ) {
+
+				// Support: IE 11+, Edge 17 - 18+
+				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+				// two documents; shallow comparisons work.
+				// eslint-disable-next-line eqeqeq
+				outermostContext = context == document || context || outermost;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Support: IE<9, Safari
+			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+
+					// Support: IE 11+, Edge 17 - 18+
+					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+					// two documents; shallow comparisons work.
+					// eslint-disable-next-line eqeqeq
+					if ( !context && elem.ownerDocument != document ) {
+						setDocument( elem );
+						xml = !documentIsHTML;
+					}
+					while ( ( matcher = elementMatchers[ j++ ] ) ) {
+						if ( matcher( elem, context || document, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+
+					// They will have gone through all possible matchers
+					if ( ( elem = !matcher && elem ) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// `i` is now the count of elements visited above, and adding it to `matchedCount`
+			// makes the latter nonnegative.
+			matchedCount += i;
+
+			// Apply set filters to unmatched elements
+			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+			// no element matchers and no seed.
+			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
+			// numerically zero.
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( ( matcher = setMatchers[ j++ ] ) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
+								setMatched[ i ] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !match ) {
+			match = tokenize( selector );
+		}
+		i = match.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( match[ i ] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache(
+			selector,
+			matcherFromGroupMatchers( elementMatchers, setMatchers )
+		);
+
+		// Save selector and tokenization
+		cached.selector = selector;
+	}
+	return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		compiled = typeof selector === "function" && selector,
+		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
+
+	results = results || [];
+
+	// Try to minimize operations if there is only one selector in the list and no seed
+	// (the latter of which guarantees us context)
+	if ( match.length === 1 ) {
+
+		// Reduce context if the leading compound selector is an ID
+		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
+		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
+			context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
+
+			context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
+				.replace( runescape, funescape ), context ) || [] )[ 0 ];
+			if ( !context ) {
+				return results;
+
+			// Precompiled matchers will still verify ancestry, so step up a level
+			} else if ( compiled ) {
+				context = context.parentNode;
+			}
+
+			selector = selector.slice( tokens.shift().value.length );
+		}
+
+		// Fetch a seed set for right-to-left matching
+		i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
+		while ( i-- ) {
+			token = tokens[ i ];
+
+			// Abort if we hit a combinator
+			if ( Expr.relative[ ( type = token.type ) ] ) {
+				break;
+			}
+			if ( ( find = Expr.find[ type ] ) ) {
+
+				// Search, expanding context for leading sibling combinators
+				if ( ( seed = find(
+					token.matches[ 0 ].replace( runescape, funescape ),
+					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
+						context
+				) ) ) {
+
+					// If seed is empty or no tokens remain, we can return early
+					tokens.splice( i, 1 );
+					selector = seed.length && toSelector( tokens );
+					if ( !selector ) {
+						push.apply( results, seed );
+						return results;
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function if one is not provided
+	// Provide `match` to avoid retokenization if we modified the selector above
+	( compiled || compile( selector, match ) )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+	);
+	return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert( function( el ) {
+
+	// Should return 1, but returns 4 (following)
+	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
+} );
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert( function( el ) {
+	el.innerHTML = "<a href='#'></a>";
+	return el.firstChild.getAttribute( "href" ) === "#";
+} ) ) {
+	addHandle( "type|href|height|width", function( elem, name, isXML ) {
+		if ( !isXML ) {
+			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+		}
+	} );
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert( function( el ) {
+	el.innerHTML = "<input/>";
+	el.firstChild.setAttribute( "value", "" );
+	return el.firstChild.getAttribute( "value" ) === "";
+} ) ) {
+	addHandle( "value", function( elem, _name, isXML ) {
+		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+			return elem.defaultValue;
+		}
+	} );
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert( function( el ) {
+	return el.getAttribute( "disabled" ) == null;
+} ) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return elem[ name ] === true ? name.toLowerCase() :
+				( val = elem.getAttributeNode( name ) ) && val.specified ?
+					val.value :
+					null;
+		}
+	} );
+}
+
+return Sizzle;
+
+} )( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+	var matched = [],
+		truncate = until !== undefined;
+
+	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+		if ( elem.nodeType === 1 ) {
+			if ( truncate && jQuery( elem ).is( until ) ) {
+				break;
+			}
+			matched.push( elem );
+		}
+	}
+	return matched;
+};
+
+
+var siblings = function( n, elem ) {
+	var matched = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType === 1 && n !== elem ) {
+			matched.push( n );
+		}
+	}
+
+	return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+}
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			return !!qualifier.call( elem, i, elem ) !== not;
+		} );
+	}
+
+	// Single element
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		} );
+	}
+
+	// Arraylike of elements (jQuery, arguments, Array)
+	if ( typeof qualifier !== "string" ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+		} );
+	}
+
+	// Filtered directly for both simple and complex selectors
+	return jQuery.filter( qualifier, elements, not );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+	var elem = elems[ 0 ];
+
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	if ( elems.length === 1 && elem.nodeType === 1 ) {
+		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+	}
+
+	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+		return elem.nodeType === 1;
+	} ) );
+};
+
+jQuery.fn.extend( {
+	find: function( selector ) {
+		var i, ret,
+			len = this.length,
+			self = this;
+
+		if ( typeof selector !== "string" ) {
+			return this.pushStack( jQuery( selector ).filter( function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			} ) );
+		}
+
+		ret = this.pushStack( [] );
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+	},
+	filter: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], false ) );
+	},
+	not: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], true ) );
+	},
+	is: function( selector ) {
+		return !!winnow(
+			this,
+
+			// If this is a positional/relative selector, check membership in the returned set
+			// so $("p:first").is("p:last") won't return true for a doc with two "p".
+			typeof selector === "string" && rneedsContext.test( selector ) ?
+				jQuery( selector ) :
+				selector || [],
+			false
+		).length;
+	}
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	// Shortcut simple #id case for speed
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+	init = jQuery.fn.init = function( selector, context, root ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Method init() accepts an alternate rootjQuery
+		// so migrate can support jQuery.sub (gh-2101)
+		root = root || rootjQuery;
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector[ 0 ] === "<" &&
+				selector[ selector.length - 1 ] === ">" &&
+				selector.length >= 3 ) {
+
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && ( match[ 1 ] || !context ) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[ 1 ] ) {
+					context = context instanceof jQuery ? context[ 0 ] : context;
+
+					// Option to run scripts is true for back-compat
+					// Intentionally let the error be thrown if parseHTML is not present
+					jQuery.merge( this, jQuery.parseHTML(
+						match[ 1 ],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+
+							// Properties of context are called as methods if possible
+							if ( isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[ 2 ] );
+
+					if ( elem ) {
+
+						// Inject the element directly into the jQuery object
+						this[ 0 ] = elem;
+						this.length = 1;
+					}
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || root ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this[ 0 ] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( isFunction( selector ) ) {
+			return root.ready !== undefined ?
+				root.ready( selector ) :
+
+				// Execute immediately if ready is not present
+				selector( jQuery );
+		}
+
+		return jQuery.makeArray( selector, this );
+	};
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+	// Methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend( {
+	has: function( target ) {
+		var targets = jQuery( target, this ),
+			l = targets.length;
+
+		return this.filter( function() {
+			var i = 0;
+			for ( ; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[ i ] ) ) {
+					return true;
+				}
+			}
+		} );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			matched = [],
+			targets = typeof selectors !== "string" && jQuery( selectors );
+
+		// Positional selectors never match, since there's no _selection_ context
+		if ( !rneedsContext.test( selectors ) ) {
+			for ( ; i < l; i++ ) {
+				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+					// Always skip document fragments
+					if ( cur.nodeType < 11 && ( targets ?
+						targets.index( cur ) > -1 :
+
+						// Don't pass non-elements to Sizzle
+						cur.nodeType === 1 &&
+							jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+						matched.push( cur );
+						break;
+					}
+				}
+			}
+		}
+
+		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+	},
+
+	// Determine the position of an element within the set
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// Index in selector
+		if ( typeof elem === "string" ) {
+			return indexOf.call( jQuery( elem ), this[ 0 ] );
+		}
+
+		// Locate the position of the desired element
+		return indexOf.call( this,
+
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[ 0 ] : elem
+		);
+	},
+
+	add: function( selector, context ) {
+		return this.pushStack(
+			jQuery.uniqueSort(
+				jQuery.merge( this.get(), jQuery( selector, context ) )
+			)
+		);
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	}
+} );
+
+function sibling( cur, dir ) {
+	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+	return cur;
+}
+
+jQuery.each( {
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, _i, until ) {
+		return dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, _i, until ) {
+		return dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, _i, until ) {
+		return dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return siblings( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return siblings( elem.firstChild );
+	},
+	contents: function( elem ) {
+		if ( elem.contentDocument != null &&
+
+			// Support: IE 11+
+			// <object> elements with no `data` attribute has an object
+			// `contentDocument` with a `null` prototype.
+			getProto( elem.contentDocument ) ) {
+
+			return elem.contentDocument;
+		}
+
+		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+		// Treat the template element as a regular one in browsers that
+		// don't support it.
+		if ( nodeName( elem, "template" ) ) {
+			elem = elem.content || elem;
+		}
+
+		return jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var matched = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			matched = jQuery.filter( selector, matched );
+		}
+
+		if ( this.length > 1 ) {
+
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				jQuery.uniqueSort( matched );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				matched.reverse();
+			}
+		}
+
+		return this.pushStack( matched );
+	};
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+	var object = {};
+	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	} );
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		createOptions( options ) :
+		jQuery.extend( {}, options );
+
+	var // Flag to know if list is currently firing
+		firing,
+
+		// Last fire value for non-forgettable lists
+		memory,
+
+		// Flag to know if list was already fired
+		fired,
+
+		// Flag to prevent firing
+		locked,
+
+		// Actual callback list
+		list = [],
+
+		// Queue of execution data for repeatable lists
+		queue = [],
+
+		// Index of currently firing callback (modified by add/remove as needed)
+		firingIndex = -1,
+
+		// Fire callbacks
+		fire = function() {
+
+			// Enforce single-firing
+			locked = locked || options.once;
+
+			// Execute callbacks for all pending executions,
+			// respecting firingIndex overrides and runtime changes
+			fired = firing = true;
+			for ( ; queue.length; firingIndex = -1 ) {
+				memory = queue.shift();
+				while ( ++firingIndex < list.length ) {
+
+					// Run callback and check for early termination
+					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+						options.stopOnFalse ) {
+
+						// Jump to end and forget the data so .add doesn't re-fire
+						firingIndex = list.length;
+						memory = false;
+					}
+				}
+			}
+
+			// Forget the data if we're done with it
+			if ( !options.memory ) {
+				memory = false;
+			}
+
+			firing = false;
+
+			// Clean up if we're done firing for good
+			if ( locked ) {
+
+				// Keep an empty list if we have data for future add calls
+				if ( memory ) {
+					list = [];
+
+				// Otherwise, this object is spent
+				} else {
+					list = "";
+				}
+			}
+		},
+
+		// Actual Callbacks object
+		self = {
+
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+
+					// If we have memory from a past run, we should fire after adding
+					if ( memory && !firing ) {
+						firingIndex = list.length - 1;
+						queue.push( memory );
+					}
+
+					( function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							if ( isFunction( arg ) ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
+
+								// Inspect recursively
+								add( arg );
+							}
+						} );
+					} )( arguments );
+
+					if ( memory && !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Remove a callback from the list
+			remove: function() {
+				jQuery.each( arguments, function( _, arg ) {
+					var index;
+					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+						list.splice( index, 1 );
+
+						// Handle firing indexes
+						if ( index <= firingIndex ) {
+							firingIndex--;
+						}
+					}
+				} );
+				return this;
+			},
+
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ?
+					jQuery.inArray( fn, list ) > -1 :
+					list.length > 0;
+			},
+
+			// Remove all callbacks from the list
+			empty: function() {
+				if ( list ) {
+					list = [];
+				}
+				return this;
+			},
+
+			// Disable .fire and .add
+			// Abort any current/pending executions
+			// Clear all callbacks and values
+			disable: function() {
+				locked = queue = [];
+				list = memory = "";
+				return this;
+			},
+			disabled: function() {
+				return !list;
+			},
+
+			// Disable .fire
+			// Also disable .add unless we have memory (since it would have no effect)
+			// Abort any pending executions
+			lock: function() {
+				locked = queue = [];
+				if ( !memory && !firing ) {
+					list = memory = "";
+				}
+				return this;
+			},
+			locked: function() {
+				return !!locked;
+			},
+
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( !locked ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					queue.push( args );
+					if ( !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+function Identity( v ) {
+	return v;
+}
+function Thrower( ex ) {
+	throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+	var method;
+
+	try {
+
+		// Check for promise aspect first to privilege synchronous behavior
+		if ( value && isFunction( ( method = value.promise ) ) ) {
+			method.call( value ).done( resolve ).fail( reject );
+
+		// Other thenables
+		} else if ( value && isFunction( ( method = value.then ) ) ) {
+			method.call( value, resolve, reject );
+
+		// Other non-thenables
+		} else {
+
+			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+			// * false: [ value ].slice( 0 ) => resolve( value )
+			// * true: [ value ].slice( 1 ) => resolve()
+			resolve.apply( undefined, [ value ].slice( noValue ) );
+		}
+
+	// For Promises/A+, convert exceptions into rejections
+	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+	// Deferred#then to conditionally suppress rejection.
+	} catch ( value ) {
+
+		// Support: Android 4.0 only
+		// Strict mode functions invoked without .call/.apply get global-object context
+		reject.apply( undefined, [ value ] );
+	}
+}
+
+jQuery.extend( {
+
+	Deferred: function( func ) {
+		var tuples = [
+
+				// action, add listener, callbacks,
+				// ... .then handlers, argument index, [final state]
+				[ "notify", "progress", jQuery.Callbacks( "memory" ),
+					jQuery.Callbacks( "memory" ), 2 ],
+				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				"catch": function( fn ) {
+					return promise.then( null, fn );
+				},
+
+				// Keep pipe for back-compat
+				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+
+					return jQuery.Deferred( function( newDefer ) {
+						jQuery.each( tuples, function( _i, tuple ) {
+
+							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
+							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+							// deferred.progress(function() { bind to newDefer or newDefer.notify })
+							// deferred.done(function() { bind to newDefer or newDefer.resolve })
+							// deferred.fail(function() { bind to newDefer or newDefer.reject })
+							deferred[ tuple[ 1 ] ]( function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && isFunction( returned.promise ) ) {
+									returned.promise()
+										.progress( newDefer.notify )
+										.done( newDefer.resolve )
+										.fail( newDefer.reject );
+								} else {
+									newDefer[ tuple[ 0 ] + "With" ](
+										this,
+										fn ? [ returned ] : arguments
+									);
+								}
+							} );
+						} );
+						fns = null;
+					} ).promise();
+				},
+				then: function( onFulfilled, onRejected, onProgress ) {
+					var maxDepth = 0;
+					function resolve( depth, deferred, handler, special ) {
+						return function() {
+							var that = this,
+								args = arguments,
+								mightThrow = function() {
+									var returned, then;
+
+									// Support: Promises/A+ section 2.3.3.3.3
+									// https://promisesaplus.com/#point-59
+									// Ignore double-resolution attempts
+									if ( depth < maxDepth ) {
+										return;
+									}
+
+									returned = handler.apply( that, args );
+
+									// Support: Promises/A+ section 2.3.1
+									// https://promisesaplus.com/#point-48
+									if ( returned === deferred.promise() ) {
+										throw new TypeError( "Thenable self-resolution" );
+									}
+
+									// Support: Promises/A+ sections 2.3.3.1, 3.5
+									// https://promisesaplus.com/#point-54
+									// https://promisesaplus.com/#point-75
+									// Retrieve `then` only once
+									then = returned &&
+
+										// Support: Promises/A+ section 2.3.4
+										// https://promisesaplus.com/#point-64
+										// Only check objects and functions for thenability
+										( typeof returned === "object" ||
+											typeof returned === "function" ) &&
+										returned.then;
+
+									// Handle a returned thenable
+									if ( isFunction( then ) ) {
+
+										// Special processors (notify) just wait for resolution
+										if ( special ) {
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special )
+											);
+
+										// Normal processors (resolve) also hook into progress
+										} else {
+
+											// ...and disregard older resolution values
+											maxDepth++;
+
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special ),
+												resolve( maxDepth, deferred, Identity,
+													deferred.notifyWith )
+											);
+										}
+
+									// Handle all other returned values
+									} else {
+
+										// Only substitute handlers pass on context
+										// and multiple values (non-spec behavior)
+										if ( handler !== Identity ) {
+											that = undefined;
+											args = [ returned ];
+										}
+
+										// Process the value(s)
+										// Default process is resolve
+										( special || deferred.resolveWith )( that, args );
+									}
+								},
+
+								// Only normal processors (resolve) catch and reject exceptions
+								process = special ?
+									mightThrow :
+									function() {
+										try {
+											mightThrow();
+										} catch ( e ) {
+
+											if ( jQuery.Deferred.exceptionHook ) {
+												jQuery.Deferred.exceptionHook( e,
+													process.stackTrace );
+											}
+
+											// Support: Promises/A+ section 2.3.3.3.4.1
+											// https://promisesaplus.com/#point-61
+											// Ignore post-resolution exceptions
+											if ( depth + 1 >= maxDepth ) {
+
+												// Only substitute handlers pass on context
+												// and multiple values (non-spec behavior)
+												if ( handler !== Thrower ) {
+													that = undefined;
+													args = [ e ];
+												}
+
+												deferred.rejectWith( that, args );
+											}
+										}
+									};
+
+							// Support: Promises/A+ section 2.3.3.3.1
+							// https://promisesaplus.com/#point-57
+							// Re-resolve promises immediately to dodge false rejection from
+							// subsequent errors
+							if ( depth ) {
+								process();
+							} else {
+
+								// Call an optional hook to record the stack, in case of exception
+								// since it's otherwise lost when execution goes async
+								if ( jQuery.Deferred.getStackHook ) {
+									process.stackTrace = jQuery.Deferred.getStackHook();
+								}
+								window.setTimeout( process );
+							}
+						};
+					}
+
+					return jQuery.Deferred( function( newDefer ) {
+
+						// progress_handlers.add( ... )
+						tuples[ 0 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onProgress ) ?
+									onProgress :
+									Identity,
+								newDefer.notifyWith
+							)
+						);
+
+						// fulfilled_handlers.add( ... )
+						tuples[ 1 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onFulfilled ) ?
+									onFulfilled :
+									Identity
+							)
+						);
+
+						// rejected_handlers.add( ... )
+						tuples[ 2 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onRejected ) ?
+									onRejected :
+									Thrower
+							)
+						);
+					} ).promise();
+				},
+
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 5 ];
+
+			// promise.progress = list.add
+			// promise.done = list.add
+			// promise.fail = list.add
+			promise[ tuple[ 1 ] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(
+					function() {
+
+						// state = "resolved" (i.e., fulfilled)
+						// state = "rejected"
+						state = stateString;
+					},
+
+					// rejected_callbacks.disable
+					// fulfilled_callbacks.disable
+					tuples[ 3 - i ][ 2 ].disable,
+
+					// rejected_handlers.disable
+					// fulfilled_handlers.disable
+					tuples[ 3 - i ][ 3 ].disable,
+
+					// progress_callbacks.lock
+					tuples[ 0 ][ 2 ].lock,
+
+					// progress_handlers.lock
+					tuples[ 0 ][ 3 ].lock
+				);
+			}
+
+			// progress_handlers.fire
+			// fulfilled_handlers.fire
+			// rejected_handlers.fire
+			list.add( tuple[ 3 ].fire );
+
+			// deferred.notify = function() { deferred.notifyWith(...) }
+			// deferred.resolve = function() { deferred.resolveWith(...) }
+			// deferred.reject = function() { deferred.rejectWith(...) }
+			deferred[ tuple[ 0 ] ] = function() {
+				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+				return this;
+			};
+
+			// deferred.notifyWith = list.fireWith
+			// deferred.resolveWith = list.fireWith
+			// deferred.rejectWith = list.fireWith
+			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+		} );
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( singleValue ) {
+		var
+
+			// count of uncompleted subordinates
+			remaining = arguments.length,
+
+			// count of unprocessed arguments
+			i = remaining,
+
+			// subordinate fulfillment data
+			resolveContexts = Array( i ),
+			resolveValues = slice.call( arguments ),
+
+			// the primary Deferred
+			primary = jQuery.Deferred(),
+
+			// subordinate callback factory
+			updateFunc = function( i ) {
+				return function( value ) {
+					resolveContexts[ i ] = this;
+					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+					if ( !( --remaining ) ) {
+						primary.resolveWith( resolveContexts, resolveValues );
+					}
+				};
+			};
+
+		// Single- and empty arguments are adopted like Promise.resolve
+		if ( remaining <= 1 ) {
+			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
+				!remaining );
+
+			// Use .then() to unwrap secondary thenables (cf. gh-3000)
+			if ( primary.state() === "pending" ||
+				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+				return primary.then();
+			}
+		}
+
+		// Multiple arguments are aggregated like Promise.all array elements
+		while ( i-- ) {
+			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
+		}
+
+		return primary.promise();
+	}
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+	// Support: IE 8 - 9 only
+	// Console exists when dev tools are open, which can happen at any time
+	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+	}
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+	window.setTimeout( function() {
+		throw error;
+	} );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+	readyList
+		.then( fn )
+
+		// Wrap jQuery.readyException in a function so that the lookup
+		// happens at the time of error handling instead of callback
+		// registration.
+		.catch( function( error ) {
+			jQuery.readyException( error );
+		} );
+
+	return this;
+};
+
+jQuery.extend( {
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+	}
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+	document.removeEventListener( "DOMContentLoaded", completed );
+	window.removeEventListener( "load", completed );
+	jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+	// Handle it asynchronously to allow scripts the opportunity to delay ready
+	window.setTimeout( jQuery.ready );
+
+} else {
+
+	// Use the handy event callback
+	document.addEventListener( "DOMContentLoaded", completed );
+
+	// A fallback to window.onload, that will always work
+	window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+	var i = 0,
+		len = elems.length,
+		bulk = key == null;
+
+	// Sets many values
+	if ( toType( key ) === "object" ) {
+		chainable = true;
+		for ( i in key ) {
+			access( elems, fn, i, key[ i ], true, emptyGet, raw );
+		}
+
+	// Sets one value
+	} else if ( value !== undefined ) {
+		chainable = true;
+
+		if ( !isFunction( value ) ) {
+			raw = true;
+		}
+
+		if ( bulk ) {
+
+			// Bulk operations run against the entire set
+			if ( raw ) {
+				fn.call( elems, value );
+				fn = null;
+
+			// ...except when executing function values
+			} else {
+				bulk = fn;
+				fn = function( elem, _key, value ) {
+					return bulk.call( jQuery( elem ), value );
+				};
+			}
+		}
+
+		if ( fn ) {
+			for ( ; i < len; i++ ) {
+				fn(
+					elems[ i ], key, raw ?
+						value :
+						value.call( elems[ i ], i, fn( elems[ i ], key ) )
+				);
+			}
+		}
+	}
+
+	if ( chainable ) {
+		return elems;
+	}
+
+	// Gets
+	if ( bulk ) {
+		return fn.call( elems );
+	}
+
+	return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+
+
+// Matches dashed string for camelizing
+var rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([a-z])/g;
+
+// Used by camelCase as callback to replace()
+function fcamelCase( _all, letter ) {
+	return letter.toUpperCase();
+}
+
+// Convert dashed to camelCase; used by the css and data modules
+// Support: IE <=9 - 11, Edge 12 - 15
+// Microsoft forgot to hump their vendor prefix (#9572)
+function camelCase( string ) {
+	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+}
+var acceptData = function( owner ) {
+
+	// Accepts only:
+	//  - Node
+	//    - Node.ELEMENT_NODE
+	//    - Node.DOCUMENT_NODE
+	//  - Object
+	//    - Any
+	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+	this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+	cache: function( owner ) {
+
+		// Check if the owner object already has a cache
+		var value = owner[ this.expando ];
+
+		// If not, create one
+		if ( !value ) {
+			value = {};
+
+			// We can accept data for non-element nodes in modern browsers,
+			// but we should not, see #8335.
+			// Always return an empty object.
+			if ( acceptData( owner ) ) {
+
+				// If it is a node unlikely to be stringify-ed or looped over
+				// use plain assignment
+				if ( owner.nodeType ) {
+					owner[ this.expando ] = value;
+
+				// Otherwise secure it in a non-enumerable property
+				// configurable must be true to allow the property to be
+				// deleted when data is removed
+				} else {
+					Object.defineProperty( owner, this.expando, {
+						value: value,
+						configurable: true
+					} );
+				}
+			}
+		}
+
+		return value;
+	},
+	set: function( owner, data, value ) {
+		var prop,
+			cache = this.cache( owner );
+
+		// Handle: [ owner, key, value ] args
+		// Always use camelCase key (gh-2257)
+		if ( typeof data === "string" ) {
+			cache[ camelCase( data ) ] = value;
+
+		// Handle: [ owner, { properties } ] args
+		} else {
+
+			// Copy the properties one-by-one to the cache object
+			for ( prop in data ) {
+				cache[ camelCase( prop ) ] = data[ prop ];
+			}
+		}
+		return cache;
+	},
+	get: function( owner, key ) {
+		return key === undefined ?
+			this.cache( owner ) :
+
+			// Always use camelCase key (gh-2257)
+			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
+	},
+	access: function( owner, key, value ) {
+
+		// In cases where either:
+		//
+		//   1. No key was specified
+		//   2. A string key was specified, but no value provided
+		//
+		// Take the "read" path and allow the get method to determine
+		// which value to return, respectively either:
+		//
+		//   1. The entire cache object
+		//   2. The data stored at the key
+		//
+		if ( key === undefined ||
+				( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+			return this.get( owner, key );
+		}
+
+		// When the key is not a string, or both a key and value
+		// are specified, set or extend (existing objects) with either:
+		//
+		//   1. An object of properties
+		//   2. A key and value
+		//
+		this.set( owner, key, value );
+
+		// Since the "set" path can have two possible entry points
+		// return the expected data based on which path was taken[*]
+		return value !== undefined ? value : key;
+	},
+	remove: function( owner, key ) {
+		var i,
+			cache = owner[ this.expando ];
+
+		if ( cache === undefined ) {
+			return;
+		}
+
+		if ( key !== undefined ) {
+
+			// Support array or space separated string of keys
+			if ( Array.isArray( key ) ) {
+
+				// If key is an array of keys...
+				// We always set camelCase keys, so remove that.
+				key = key.map( camelCase );
+			} else {
+				key = camelCase( key );
+
+				// If a key with the spaces exists, use it.
+				// Otherwise, create an array by matching non-whitespace
+				key = key in cache ?
+					[ key ] :
+					( key.match( rnothtmlwhite ) || [] );
+			}
+
+			i = key.length;
+
+			while ( i-- ) {
+				delete cache[ key[ i ] ];
+			}
+		}
+
+		// Remove the expando if there's no more data
+		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+			// Support: Chrome <=35 - 45
+			// Webkit & Blink performance suffers when deleting properties
+			// from DOM nodes, so set to undefined instead
+			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+			if ( owner.nodeType ) {
+				owner[ this.expando ] = undefined;
+			} else {
+				delete owner[ this.expando ];
+			}
+		}
+	},
+	hasData: function( owner ) {
+		var cache = owner[ this.expando ];
+		return cache !== undefined && !jQuery.isEmptyObject( cache );
+	}
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+//	Implementation Summary
+//
+//	1. Enforce API surface and semantic compatibility with 1.9.x branch
+//	2. Improve the module's maintainability by reducing the storage
+//		paths to a single mechanism.
+//	3. Use the same single mechanism to support "private" and "user" data.
+//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+//	5. Avoid exposing implementation details on user objects (eg. expando properties)
+//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+	rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+	if ( data === "true" ) {
+		return true;
+	}
+
+	if ( data === "false" ) {
+		return false;
+	}
+
+	if ( data === "null" ) {
+		return null;
+	}
+
+	// Only convert to a number if it doesn't change the string
+	if ( data === +data + "" ) {
+		return +data;
+	}
+
+	if ( rbrace.test( data ) ) {
+		return JSON.parse( data );
+	}
+
+	return data;
+}
+
+function dataAttr( elem, key, data ) {
+	var name;
+
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = getData( data );
+			} catch ( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			dataUser.set( elem, key, data );
+		} else {
+			data = undefined;
+		}
+	}
+	return data;
+}
+
+jQuery.extend( {
+	hasData: function( elem ) {
+		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return dataUser.access( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		dataUser.remove( elem, name );
+	},
+
+	// TODO: Now that all calls to _data and _removeData have been replaced
+	// with direct calls to dataPriv methods, these can be deprecated.
+	_data: function( elem, name, data ) {
+		return dataPriv.access( elem, name, data );
+	},
+
+	_removeData: function( elem, name ) {
+		dataPriv.remove( elem, name );
+	}
+} );
+
+jQuery.fn.extend( {
+	data: function( key, value ) {
+		var i, name, data,
+			elem = this[ 0 ],
+			attrs = elem && elem.attributes;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = dataUser.get( elem );
+
+				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+					i = attrs.length;
+					while ( i-- ) {
+
+						// Support: IE 11 only
+						// The attrs elements can be null (#14894)
+						if ( attrs[ i ] ) {
+							name = attrs[ i ].name;
+							if ( name.indexOf( "data-" ) === 0 ) {
+								name = camelCase( name.slice( 5 ) );
+								dataAttr( elem, name, data[ name ] );
+							}
+						}
+					}
+					dataPriv.set( elem, "hasDataAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each( function() {
+				dataUser.set( this, key );
+			} );
+		}
+
+		return access( this, function( value ) {
+			var data;
+
+			// The calling jQuery object (element matches) is not empty
+			// (and therefore has an element appears at this[ 0 ]) and the
+			// `value` parameter was not undefined. An empty jQuery object
+			// will result in `undefined` for elem = this[ 0 ] which will
+			// throw an exception if an attempt to read a data cache is made.
+			if ( elem && value === undefined ) {
+
+				// Attempt to get data from the cache
+				// The key will always be camelCased in Data
+				data = dataUser.get( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// Attempt to "discover" the data in
+				// HTML5 custom data-* attrs
+				data = dataAttr( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// We tried really hard, but the data doesn't exist.
+				return;
+			}
+
+			// Set the data...
+			this.each( function() {
+
+				// We always store the camelCased key
+				dataUser.set( this, key, value );
+			} );
+		}, null, value, arguments.length > 1, null, true );
+	},
+
+	removeData: function( key ) {
+		return this.each( function() {
+			dataUser.remove( this, key );
+		} );
+	}
+} );
+
+
+jQuery.extend( {
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = dataPriv.get( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || Array.isArray( data ) ) {
+					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// Clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// Not public - generate a queueHooks object, or return the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+			empty: jQuery.Callbacks( "once memory" ).add( function() {
+				dataPriv.remove( elem, [ type + "queue", key ] );
+			} )
+		} );
+	}
+} );
+
+jQuery.fn.extend( {
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[ 0 ], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each( function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// Ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			} );
+	},
+	dequeue: function( type ) {
+		return this.each( function() {
+			jQuery.dequeue( this, type );
+		} );
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while ( i-- ) {
+			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var documentElement = document.documentElement;
+
+
+
+	var isAttached = function( elem ) {
+			return jQuery.contains( elem.ownerDocument, elem );
+		},
+		composed = { composed: true };
+
+	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
+	// Check attachment across shadow DOM boundaries when possible (gh-3504)
+	// Support: iOS 10.0-10.2 only
+	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
+	// leading to errors. We need to check for `getRootNode`.
+	if ( documentElement.getRootNode ) {
+		isAttached = function( elem ) {
+			return jQuery.contains( elem.ownerDocument, elem ) ||
+				elem.getRootNode( composed ) === elem.ownerDocument;
+		};
+	}
+var isHiddenWithinTree = function( elem, el ) {
+
+		// isHiddenWithinTree might be called from jQuery#filter function;
+		// in that case, element will be second argument
+		elem = el || elem;
+
+		// Inline style trumps all
+		return elem.style.display === "none" ||
+			elem.style.display === "" &&
+
+			// Otherwise, check computed style
+			// Support: Firefox <=43 - 45
+			// Disconnected elements can have computed display: none, so first confirm that elem is
+			// in the document.
+			isAttached( elem ) &&
+
+			jQuery.css( elem, "display" ) === "none";
+	};
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+	var adjusted, scale,
+		maxIterations = 20,
+		currentValue = tween ?
+			function() {
+				return tween.cur();
+			} :
+			function() {
+				return jQuery.css( elem, prop, "" );
+			},
+		initial = currentValue(),
+		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+		// Starting value computation is required for potential unit mismatches
+		initialInUnit = elem.nodeType &&
+			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+			rcssNum.exec( jQuery.css( elem, prop ) );
+
+	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+		// Support: Firefox <=54
+		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+		initial = initial / 2;
+
+		// Trust units reported by jQuery.css
+		unit = unit || initialInUnit[ 3 ];
+
+		// Iteratively approximate from a nonzero starting point
+		initialInUnit = +initial || 1;
+
+		while ( maxIterations-- ) {
+
+			// Evaluate and update our best guess (doubling guesses that zero out).
+			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
+			jQuery.style( elem, prop, initialInUnit + unit );
+			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
+				maxIterations = 0;
+			}
+			initialInUnit = initialInUnit / scale;
+
+		}
+
+		initialInUnit = initialInUnit * 2;
+		jQuery.style( elem, prop, initialInUnit + unit );
+
+		// Make sure we update the tween properties later on
+		valueParts = valueParts || [];
+	}
+
+	if ( valueParts ) {
+		initialInUnit = +initialInUnit || +initial || 0;
+
+		// Apply relative offset (+=/-=) if specified
+		adjusted = valueParts[ 1 ] ?
+			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+			+valueParts[ 2 ];
+		if ( tween ) {
+			tween.unit = unit;
+			tween.start = initialInUnit;
+			tween.end = adjusted;
+		}
+	}
+	return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+	var temp,
+		doc = elem.ownerDocument,
+		nodeName = elem.nodeName,
+		display = defaultDisplayMap[ nodeName ];
+
+	if ( display ) {
+		return display;
+	}
+
+	temp = doc.body.appendChild( doc.createElement( nodeName ) );
+	display = jQuery.css( temp, "display" );
+
+	temp.parentNode.removeChild( temp );
+
+	if ( display === "none" ) {
+		display = "block";
+	}
+	defaultDisplayMap[ nodeName ] = display;
+
+	return display;
+}
+
+function showHide( elements, show ) {
+	var display, elem,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	// Determine new display value for elements that need to change
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		display = elem.style.display;
+		if ( show ) {
+
+			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+			// check is required in this first loop unless we have a nonempty display value (either
+			// inline or about-to-be-restored)
+			if ( display === "none" ) {
+				values[ index ] = dataPriv.get( elem, "display" ) || null;
+				if ( !values[ index ] ) {
+					elem.style.display = "";
+				}
+			}
+			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+				values[ index ] = getDefaultDisplay( elem );
+			}
+		} else {
+			if ( display !== "none" ) {
+				values[ index ] = "none";
+
+				// Remember what we're overwriting
+				dataPriv.set( elem, "display", display );
+			}
+		}
+	}
+
+	// Set the display of the elements in a second loop to avoid constant reflow
+	for ( index = 0; index < length; index++ ) {
+		if ( values[ index ] != null ) {
+			elements[ index ].style.display = values[ index ];
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend( {
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		if ( typeof state === "boolean" ) {
+			return state ? this.show() : this.hide();
+		}
+
+		return this.each( function() {
+			if ( isHiddenWithinTree( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		} );
+	}
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
+
+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
+
+
+
+( function() {
+	var fragment = document.createDocumentFragment(),
+		div = fragment.appendChild( document.createElement( "div" ) ),
+		input = document.createElement( "input" );
+
+	// Support: Android 4.0 - 4.3 only
+	// Check state lost if the name is set (#11217)
+	// Support: Windows Web Apps (WWA)
+	// `name` and `type` must use .setAttribute for WWA (#14901)
+	input.setAttribute( "type", "radio" );
+	input.setAttribute( "checked", "checked" );
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+
+	// Support: Android <=4.1 only
+	// Older WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE <=11 only
+	// Make sure textarea (and checkbox) defaultValue is properly cloned
+	div.innerHTML = "<textarea>x</textarea>";
+	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+
+	// Support: IE <=9 only
+	// IE <=9 replaces <option> tags with their contents when inserted outside of
+	// the select element.
+	div.innerHTML = "<option></option>";
+	support.option = !!div.lastChild;
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+	// XHTML parsers do not magically insert elements in the
+	// same way that tag soup parsers do. So we cannot shorten
+	// this by omitting <tbody> or other required elements.
+	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, "", "" ]
+};
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: IE <=9 only
+if ( !support.option ) {
+	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
+}
+
+
+function getAll( context, tag ) {
+
+	// Support: IE <=9 - 11 only
+	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
+	var ret;
+
+	if ( typeof context.getElementsByTagName !== "undefined" ) {
+		ret = context.getElementsByTagName( tag || "*" );
+
+	} else if ( typeof context.querySelectorAll !== "undefined" ) {
+		ret = context.querySelectorAll( tag || "*" );
+
+	} else {
+		ret = [];
+	}
+
+	if ( tag === undefined || tag && nodeName( context, tag ) ) {
+		return jQuery.merge( [ context ], ret );
+	}
+
+	return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		dataPriv.set(
+			elems[ i ],
+			"globalEval",
+			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
+		);
+	}
+}
+
+
+var rhtml = /<|&#?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+	var elem, tmp, tag, wrap, attached, j,
+		fragment = context.createDocumentFragment(),
+		nodes = [],
+		i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		elem = elems[ i ];
+
+		if ( elem || elem === 0 ) {
+
+			// Add nodes directly
+			if ( toType( elem ) === "object" ) {
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+			// Convert non-html into a text node
+			} else if ( !rhtml.test( elem ) ) {
+				nodes.push( context.createTextNode( elem ) );
+
+			// Convert html into DOM nodes
+			} else {
+				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+				// Deserialize a standard representation
+				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+				wrap = wrapMap[ tag ] || wrapMap._default;
+				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+				// Descend through wrappers to the right content
+				j = wrap[ 0 ];
+				while ( j-- ) {
+					tmp = tmp.lastChild;
+				}
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, tmp.childNodes );
+
+				// Remember the top-level container
+				tmp = fragment.firstChild;
+
+				// Ensure the created nodes are orphaned (#12392)
+				tmp.textContent = "";
+			}
+		}
+	}
+
+	// Remove wrapper from fragment
+	fragment.textContent = "";
+
+	i = 0;
+	while ( ( elem = nodes[ i++ ] ) ) {
+
+		// Skip elements already in the context collection (trac-4087)
+		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+			if ( ignored ) {
+				ignored.push( elem );
+			}
+			continue;
+		}
+
+		attached = isAttached( elem );
+
+		// Append to fragment
+		tmp = getAll( fragment.appendChild( elem ), "script" );
+
+		// Preserve script evaluation history
+		if ( attached ) {
+			setGlobalEval( tmp );
+		}
+
+		// Capture executables
+		if ( scripts ) {
+			j = 0;
+			while ( ( elem = tmp[ j++ ] ) ) {
+				if ( rscriptType.test( elem.type || "" ) ) {
+					scripts.push( elem );
+				}
+			}
+		}
+	}
+
+	return fragment;
+}
+
+
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+// Support: IE <=9 - 11+
+// focus() and blur() are asynchronous, except when they are no-op.
+// So expect focus to be synchronous when the element is already active,
+// and blur to be synchronous when the element is not already active.
+// (focus and blur are always synchronous in other supported browsers,
+// this just defines when we can count on it).
+function expectSync( elem, type ) {
+	return ( elem === safeActiveElement() ) === ( type === "focus" );
+}
+
+// Support: IE <=9 only
+// Accessing document.activeElement can throw unexpectedly
+// https://bugs.jquery.com/ticket/13393
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+	var origFn, type;
+
+	// Types can be a map of types/handlers
+	if ( typeof types === "object" ) {
+
+		// ( types-Object, selector, data )
+		if ( typeof selector !== "string" ) {
+
+			// ( types-Object, data )
+			data = data || selector;
+			selector = undefined;
+		}
+		for ( type in types ) {
+			on( elem, type, selector, data, types[ type ], one );
+		}
+		return elem;
+	}
+
+	if ( data == null && fn == null ) {
+
+		// ( types, fn )
+		fn = selector;
+		data = selector = undefined;
+	} else if ( fn == null ) {
+		if ( typeof selector === "string" ) {
+
+			// ( types, selector, fn )
+			fn = data;
+			data = undefined;
+		} else {
+
+			// ( types, data, fn )
+			fn = data;
+			data = selector;
+			selector = undefined;
+		}
+	}
+	if ( fn === false ) {
+		fn = returnFalse;
+	} else if ( !fn ) {
+		return elem;
+	}
+
+	if ( one === 1 ) {
+		origFn = fn;
+		fn = function( event ) {
+
+			// Can use an empty set, since event contains the info
+			jQuery().off( event );
+			return origFn.apply( this, arguments );
+		};
+
+		// Use same guid so caller can remove using origFn
+		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+	}
+	return elem.each( function() {
+		jQuery.event.add( this, types, fn, data, selector );
+	} );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var handleObjIn, eventHandle, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.get( elem );
+
+		// Only attach events to objects that accept data
+		if ( !acceptData( elem ) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Ensure that invalid selectors throw exceptions at attach time
+		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
+		if ( selector ) {
+			jQuery.find.matchesSelector( documentElement, selector );
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !( events = elemData.events ) ) {
+			events = elemData.events = Object.create( null );
+		}
+		if ( !( eventHandle = elemData.handle ) ) {
+			eventHandle = elemData.handle = function( e ) {
+
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+			};
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// There *must* be a type, no attaching namespace-only handlers
+			if ( !type ) {
+				continue;
+			}
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend( {
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join( "." )
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !( handlers = events[ type ] ) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener if the special events handler returns false
+				if ( !special.setup ||
+					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var j, origCount, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+		if ( !elemData || !( events = elemData.events ) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[ 2 ] &&
+				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector ||
+						selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown ||
+					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove data and the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			dataPriv.remove( elem, "handle events" );
+		}
+	},
+
+	dispatch: function( nativeEvent ) {
+
+		var i, j, ret, matched, handleObj, handlerQueue,
+			args = new Array( arguments.length ),
+
+			// Make a writable jQuery.Event from the native event object
+			event = jQuery.event.fix( nativeEvent ),
+
+			handlers = (
+				dataPriv.get( this, "events" ) || Object.create( null )
+			)[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[ 0 ] = event;
+
+		for ( i = 1; i < arguments.length; i++ ) {
+			args[ i ] = arguments[ i ];
+		}
+
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( ( handleObj = matched.handlers[ j++ ] ) &&
+				!event.isImmediatePropagationStopped() ) {
+
+				// If the event is namespaced, then each handler is only invoked if it is
+				// specially universal or its namespaces are a superset of the event's.
+				if ( !event.rnamespace || handleObj.namespace === false ||
+					event.rnamespace.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+						handleObj.handler ).apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( ( event.result = ret ) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var i, handleObj, sel, matchedHandlers, matchedSelectors,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		if ( delegateCount &&
+
+			// Support: IE <=9
+			// Black-hole SVG <use> instance trees (trac-13180)
+			cur.nodeType &&
+
+			// Support: Firefox <=42
+			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+			// Support: IE 11 only
+			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+			!( event.type === "click" && event.button >= 1 ) ) {
+
+			for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+					matchedHandlers = [];
+					matchedSelectors = {};
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matchedSelectors[ sel ] === undefined ) {
+							matchedSelectors[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) > -1 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matchedSelectors[ sel ] ) {
+							matchedHandlers.push( handleObj );
+						}
+					}
+					if ( matchedHandlers.length ) {
+						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		cur = this;
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+		}
+
+		return handlerQueue;
+	},
+
+	addProp: function( name, hook ) {
+		Object.defineProperty( jQuery.Event.prototype, name, {
+			enumerable: true,
+			configurable: true,
+
+			get: isFunction( hook ) ?
+				function() {
+					if ( this.originalEvent ) {
+						return hook( this.originalEvent );
+					}
+				} :
+				function() {
+					if ( this.originalEvent ) {
+						return this.originalEvent[ name ];
+					}
+				},
+
+			set: function( value ) {
+				Object.defineProperty( this, name, {
+					enumerable: true,
+					configurable: true,
+					writable: true,
+					value: value
+				} );
+			}
+		} );
+	},
+
+	fix: function( originalEvent ) {
+		return originalEvent[ jQuery.expando ] ?
+			originalEvent :
+			new jQuery.Event( originalEvent );
+	},
+
+	special: {
+		load: {
+
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		click: {
+
+			// Utilize native event to ensure correct state for checkable inputs
+			setup: function( data ) {
+
+				// For mutual compressibility with _default, replace `this` access with a local var.
+				// `|| data` is dead code meant only to preserve the variable through minification.
+				var el = this || data;
+
+				// Claim the first handler
+				if ( rcheckableType.test( el.type ) &&
+					el.click && nodeName( el, "input" ) ) {
+
+					// dataPriv.set( el, "click", ... )
+					leverageNative( el, "click", returnTrue );
+				}
+
+				// Return false to allow normal processing in the caller
+				return false;
+			},
+			trigger: function( data ) {
+
+				// For mutual compressibility with _default, replace `this` access with a local var.
+				// `|| data` is dead code meant only to preserve the variable through minification.
+				var el = this || data;
+
+				// Force setup before triggering a click
+				if ( rcheckableType.test( el.type ) &&
+					el.click && nodeName( el, "input" ) ) {
+
+					leverageNative( el, "click" );
+				}
+
+				// Return non-false to allow normal event-path propagation
+				return true;
+			},
+
+			// For cross-browser consistency, suppress native .click() on links
+			// Also prevent it if we're currently inside a leveraged native-event stack
+			_default: function( event ) {
+				var target = event.target;
+				return rcheckableType.test( target.type ) &&
+					target.click && nodeName( target, "input" ) &&
+					dataPriv.get( target, "click" ) ||
+					nodeName( target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Support: Firefox 20+
+				// Firefox doesn't alert if the returnValue field is not set.
+				if ( event.result !== undefined && event.originalEvent ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	}
+};
+
+// Ensure the presence of an event listener that handles manually-triggered
+// synthetic events by interrupting progress until reinvoked in response to
+// *native* events that it fires directly, ensuring that state changes have
+// already occurred before other listeners are invoked.
+function leverageNative( el, type, expectSync ) {
+
+	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
+	if ( !expectSync ) {
+		if ( dataPriv.get( el, type ) === undefined ) {
+			jQuery.event.add( el, type, returnTrue );
+		}
+		return;
+	}
+
+	// Register the controller as a special universal handler for all event namespaces
+	dataPriv.set( el, type, false );
+	jQuery.event.add( el, type, {
+		namespace: false,
+		handler: function( event ) {
+			var notAsync, result,
+				saved = dataPriv.get( this, type );
+
+			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
+
+				// Interrupt processing of the outer synthetic .trigger()ed event
+				// Saved data should be false in such cases, but might be a leftover capture object
+				// from an async native handler (gh-4350)
+				if ( !saved.length ) {
+
+					// Store arguments for use when handling the inner native event
+					// There will always be at least one argument (an event object), so this array
+					// will not be confused with a leftover capture object.
+					saved = slice.call( arguments );
+					dataPriv.set( this, type, saved );
+
+					// Trigger the native event and capture its result
+					// Support: IE <=9 - 11+
+					// focus() and blur() are asynchronous
+					notAsync = expectSync( this, type );
+					this[ type ]();
+					result = dataPriv.get( this, type );
+					if ( saved !== result || notAsync ) {
+						dataPriv.set( this, type, false );
+					} else {
+						result = {};
+					}
+					if ( saved !== result ) {
+
+						// Cancel the outer synthetic event
+						event.stopImmediatePropagation();
+						event.preventDefault();
+
+						// Support: Chrome 86+
+						// In Chrome, if an element having a focusout handler is blurred by
+						// clicking outside of it, it invokes the handler synchronously. If
+						// that handler calls `.remove()` on the element, the data is cleared,
+						// leaving `result` undefined. We need to guard against this.
+						return result && result.value;
+					}
+
+				// If this is an inner synthetic event for an event with a bubbling surrogate
+				// (focus or blur), assume that the surrogate already propagated from triggering the
+				// native event and prevent that from happening again here.
+				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
+				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
+				// less bad than duplication.
+				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
+					event.stopPropagation();
+				}
+
+			// If this is a native event triggered above, everything is now in order
+			// Fire an inner synthetic event with the original arguments
+			} else if ( saved.length ) {
+
+				// ...and capture the result
+				dataPriv.set( this, type, {
+					value: jQuery.event.trigger(
+
+						// Support: IE <=9 - 11+
+						// Extend with the prototype to reset the above stopImmediatePropagation()
+						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
+						saved.slice( 1 ),
+						this
+					)
+				} );
+
+				// Abort handling of the native event
+				event.stopImmediatePropagation();
+			}
+		}
+	} );
+}
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+	// This "if" is needed for plain objects
+	if ( elem.removeEventListener ) {
+		elem.removeEventListener( type, handle );
+	}
+};
+
+jQuery.Event = function( src, props ) {
+
+	// Allow instantiation without the 'new' keyword
+	if ( !( this instanceof jQuery.Event ) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = src.defaultPrevented ||
+				src.defaultPrevented === undefined &&
+
+				// Support: Android <=2.3 only
+				src.returnValue === false ?
+			returnTrue :
+			returnFalse;
+
+		// Create target properties
+		// Support: Safari <=6 - 7 only
+		// Target should not be a text node (#504, #13143)
+		this.target = ( src.target && src.target.nodeType === 3 ) ?
+			src.target.parentNode :
+			src.target;
+
+		this.currentTarget = src.currentTarget;
+		this.relatedTarget = src.relatedTarget;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || Date.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	constructor: jQuery.Event,
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+	isSimulated: false,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.preventDefault();
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopPropagation();
+		}
+	},
+	stopImmediatePropagation: function() {
+		var e = this.originalEvent;
+
+		this.isImmediatePropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopImmediatePropagation();
+		}
+
+		this.stopPropagation();
+	}
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+	altKey: true,
+	bubbles: true,
+	cancelable: true,
+	changedTouches: true,
+	ctrlKey: true,
+	detail: true,
+	eventPhase: true,
+	metaKey: true,
+	pageX: true,
+	pageY: true,
+	shiftKey: true,
+	view: true,
+	"char": true,
+	code: true,
+	charCode: true,
+	key: true,
+	keyCode: true,
+	button: true,
+	buttons: true,
+	clientX: true,
+	clientY: true,
+	offsetX: true,
+	offsetY: true,
+	pointerId: true,
+	pointerType: true,
+	screenX: true,
+	screenY: true,
+	targetTouches: true,
+	toElement: true,
+	touches: true,
+	which: true
+}, jQuery.event.addProp );
+
+jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
+	jQuery.event.special[ type ] = {
+
+		// Utilize native event if possible so blur/focus sequence is correct
+		setup: function() {
+
+			// Claim the first handler
+			// dataPriv.set( this, "focus", ... )
+			// dataPriv.set( this, "blur", ... )
+			leverageNative( this, type, expectSync );
+
+			// Return false to allow normal processing in the caller
+			return false;
+		},
+		trigger: function() {
+
+			// Force setup before trigger
+			leverageNative( this, type );
+
+			// Return non-false to allow normal event-path propagation
+			return true;
+		},
+
+		// Suppress native focus or blur as it's already being fired
+		// in leverageNative.
+		_default: function() {
+			return true;
+		},
+
+		delegateType: delegateType
+	};
+} );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+	mouseenter: "mouseover",
+	mouseleave: "mouseout",
+	pointerenter: "pointerover",
+	pointerleave: "pointerout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mouseenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+} );
+
+jQuery.fn.extend( {
+
+	on: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn );
+	},
+	one: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ?
+					handleObj.origType + "." + handleObj.namespace :
+					handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each( function() {
+			jQuery.event.remove( this, types, fn, selector );
+		} );
+	}
+} );
+
+
+var
+
+	// Support: IE <=10 - 11, Edge 12 - 13 only
+	// In IE/Edge using regex groups here causes severe slowdowns.
+	// See https://connect.microsoft.com/IE/feedback/details/1736512/
+	rnoInnerhtml = /<script|<style|<link/i,
+
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+// Prefer a tbody over its parent table for containing new rows
+function manipulationTarget( elem, content ) {
+	if ( nodeName( elem, "table" ) &&
+		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+
+		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
+	}
+
+	return elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
+		elem.type = elem.type.slice( 5 );
+	} else {
+		elem.removeAttribute( "type" );
+	}
+
+	return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+	var i, l, type, pdataOld, udataOld, udataCur, events;
+
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// 1. Copy private data: events, handlers, etc.
+	if ( dataPriv.hasData( src ) ) {
+		pdataOld = dataPriv.get( src );
+		events = pdataOld.events;
+
+		if ( events ) {
+			dataPriv.remove( dest, "handle events" );
+
+			for ( type in events ) {
+				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type, events[ type ][ i ] );
+				}
+			}
+		}
+	}
+
+	// 2. Copy user data
+	if ( dataUser.hasData( src ) ) {
+		udataOld = dataUser.access( src );
+		udataCur = jQuery.extend( {}, udataOld );
+
+		dataUser.set( dest, udataCur );
+	}
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+	var nodeName = dest.nodeName.toLowerCase();
+
+	// Fails to persist the checked state of a cloned checkbox or radio button.
+	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		dest.checked = src.checked;
+
+	// Fails to return the selected option to the default selected state when cloning options
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+	// Flatten any nested arrays
+	args = flat( args );
+
+	var fragment, first, scripts, hasScripts, node, doc,
+		i = 0,
+		l = collection.length,
+		iNoClone = l - 1,
+		value = args[ 0 ],
+		valueIsFunction = isFunction( value );
+
+	// We can't cloneNode fragments that contain checked, in WebKit
+	if ( valueIsFunction ||
+			( l > 1 && typeof value === "string" &&
+				!support.checkClone && rchecked.test( value ) ) ) {
+		return collection.each( function( index ) {
+			var self = collection.eq( index );
+			if ( valueIsFunction ) {
+				args[ 0 ] = value.call( this, index, self.html() );
+			}
+			domManip( self, args, callback, ignored );
+		} );
+	}
+
+	if ( l ) {
+		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+		first = fragment.firstChild;
+
+		if ( fragment.childNodes.length === 1 ) {
+			fragment = first;
+		}
+
+		// Require either new content or an interest in ignored elements to invoke the callback
+		if ( first || ignored ) {
+			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+			hasScripts = scripts.length;
+
+			// Use the original fragment for the last item
+			// instead of the first because it can end up
+			// being emptied incorrectly in certain situations (#8070).
+			for ( ; i < l; i++ ) {
+				node = fragment;
+
+				if ( i !== iNoClone ) {
+					node = jQuery.clone( node, true, true );
+
+					// Keep references to cloned scripts for later restoration
+					if ( hasScripts ) {
+
+						// Support: Android <=4.0 only, PhantomJS 1 only
+						// push.apply(_, arraylike) throws on ancient WebKit
+						jQuery.merge( scripts, getAll( node, "script" ) );
+					}
+				}
+
+				callback.call( collection[ i ], node, i );
+			}
+
+			if ( hasScripts ) {
+				doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+				// Reenable scripts
+				jQuery.map( scripts, restoreScript );
+
+				// Evaluate executable scripts on first document insertion
+				for ( i = 0; i < hasScripts; i++ ) {
+					node = scripts[ i ];
+					if ( rscriptType.test( node.type || "" ) &&
+						!dataPriv.access( node, "globalEval" ) &&
+						jQuery.contains( doc, node ) ) {
+
+						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
+
+							// Optional AJAX dependency, but won't run scripts if not present
+							if ( jQuery._evalUrl && !node.noModule ) {
+								jQuery._evalUrl( node.src, {
+									nonce: node.nonce || node.getAttribute( "nonce" )
+								}, doc );
+							}
+						} else {
+							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return collection;
+}
+
+function remove( elem, selector, keepData ) {
+	var node,
+		nodes = selector ? jQuery.filter( selector, elem ) : elem,
+		i = 0;
+
+	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
+		if ( !keepData && node.nodeType === 1 ) {
+			jQuery.cleanData( getAll( node ) );
+		}
+
+		if ( node.parentNode ) {
+			if ( keepData && isAttached( node ) ) {
+				setGlobalEval( getAll( node, "script" ) );
+			}
+			node.parentNode.removeChild( node );
+		}
+	}
+
+	return elem;
+}
+
+jQuery.extend( {
+	htmlPrefilter: function( html ) {
+		return html;
+	},
+
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var i, l, srcElements, destElements,
+			clone = elem.cloneNode( true ),
+			inPage = isAttached( elem );
+
+		// Fix IE cloning issues
+		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+				!jQuery.isXMLDoc( elem ) ) {
+
+			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			for ( i = 0, l = srcElements.length; i < l; i++ ) {
+				fixInput( srcElements[ i ], destElements[ i ] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0, l = srcElements.length; i < l; i++ ) {
+					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		// Return the cloned set
+		return clone;
+	},
+
+	cleanData: function( elems ) {
+		var data, elem, type,
+			special = jQuery.event.special,
+			i = 0;
+
+		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
+			if ( acceptData( elem ) ) {
+				if ( ( data = elem[ dataPriv.expando ] ) ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataPriv.expando ] = undefined;
+				}
+				if ( elem[ dataUser.expando ] ) {
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataUser.expando ] = undefined;
+				}
+			}
+		}
+	}
+} );
+
+jQuery.fn.extend( {
+	detach: function( selector ) {
+		return remove( this, selector, true );
+	},
+
+	remove: function( selector ) {
+		return remove( this, selector );
+	},
+
+	text: function( value ) {
+		return access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().each( function() {
+					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+						this.textContent = value;
+					}
+				} );
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		} );
+	},
+
+	prepend: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.insertBefore( elem, target.firstChild );
+			}
+		} );
+	},
+
+	before: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		} );
+	},
+
+	after: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		} );
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; ( elem = this[ i ] ) != null; i++ ) {
+			if ( elem.nodeType === 1 ) {
+
+				// Prevent memory leaks
+				jQuery.cleanData( getAll( elem, false ) );
+
+				// Remove any remaining nodes
+				elem.textContent = "";
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function() {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		} );
+	},
+
+	html: function( value ) {
+		return access( this, function( value ) {
+			var elem = this[ 0 ] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined && elem.nodeType === 1 ) {
+				return elem.innerHTML;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+				value = jQuery.htmlPrefilter( value );
+
+				try {
+					for ( ; i < l; i++ ) {
+						elem = this[ i ] || {};
+
+						// Remove element nodes and prevent memory leaks
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch ( e ) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function() {
+		var ignored = [];
+
+		// Make the changes, replacing each non-ignored context element with the new content
+		return domManip( this, arguments, function( elem ) {
+			var parent = this.parentNode;
+
+			if ( jQuery.inArray( this, ignored ) < 0 ) {
+				jQuery.cleanData( getAll( this ) );
+				if ( parent ) {
+					parent.replaceChild( elem, this );
+				}
+			}
+
+		// Force callback invocation
+		}, ignored );
+	}
+} );
+
+jQuery.each( {
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1,
+			i = 0;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone( true );
+			jQuery( insert[ i ] )[ original ]( elems );
+
+			// Support: Android <=4.0 only, PhantomJS 1 only
+			// .get() because push.apply(_, arraylike) throws on ancient WebKit
+			push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+} );
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+
+		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+		// IE throws on elements created in popups
+		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+		var view = elem.ownerDocument.defaultView;
+
+		if ( !view || !view.opener ) {
+			view = window;
+		}
+
+		return view.getComputedStyle( elem );
+	};
+
+var swap = function( elem, options, callback ) {
+	var ret, name,
+		old = {};
+
+	// Remember the old values, and insert the new ones
+	for ( name in options ) {
+		old[ name ] = elem.style[ name ];
+		elem.style[ name ] = options[ name ];
+	}
+
+	ret = callback.call( elem );
+
+	// Revert the old values
+	for ( name in options ) {
+		elem.style[ name ] = old[ name ];
+	}
+
+	return ret;
+};
+
+
+var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
+
+
+
+( function() {
+
+	// Executing both pixelPosition & boxSizingReliable tests require only one layout
+	// so they're executed at the same time to save the second computation.
+	function computeStyleTests() {
+
+		// This is a singleton, we need to execute it only once
+		if ( !div ) {
+			return;
+		}
+
+		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
+			"margin-top:1px;padding:0;border:0";
+		div.style.cssText =
+			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
+			"margin:auto;border:1px;padding:1px;" +
+			"width:60%;top:1%";
+		documentElement.appendChild( container ).appendChild( div );
+
+		var divStyle = window.getComputedStyle( div );
+		pixelPositionVal = divStyle.top !== "1%";
+
+		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
+
+		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
+		// Some styles come back with percentage values, even though they shouldn't
+		div.style.right = "60%";
+		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
+
+		// Support: IE 9 - 11 only
+		// Detect misreporting of content dimensions for box-sizing:border-box elements
+		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
+
+		// Support: IE 9 only
+		// Detect overflow:scroll screwiness (gh-3699)
+		// Support: Chrome <=64
+		// Don't get tricked when zoom affects offsetWidth (gh-4029)
+		div.style.position = "absolute";
+		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
+
+		documentElement.removeChild( container );
+
+		// Nullify the div so it wouldn't be stored in the memory and
+		// it will also be a sign that checks already performed
+		div = null;
+	}
+
+	function roundPixelMeasures( measure ) {
+		return Math.round( parseFloat( measure ) );
+	}
+
+	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
+		reliableTrDimensionsVal, reliableMarginLeftVal,
+		container = document.createElement( "div" ),
+		div = document.createElement( "div" );
+
+	// Finish early in limited (non-browser) environments
+	if ( !div.style ) {
+		return;
+	}
+
+	// Support: IE <=9 - 11 only
+	// Style of cloned element affects source element cloned (#8908)
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	jQuery.extend( support, {
+		boxSizingReliable: function() {
+			computeStyleTests();
+			return boxSizingReliableVal;
+		},
+		pixelBoxStyles: function() {
+			computeStyleTests();
+			return pixelBoxStylesVal;
+		},
+		pixelPosition: function() {
+			computeStyleTests();
+			return pixelPositionVal;
+		},
+		reliableMarginLeft: function() {
+			computeStyleTests();
+			return reliableMarginLeftVal;
+		},
+		scrollboxSize: function() {
+			computeStyleTests();
+			return scrollboxSizeVal;
+		},
+
+		// Support: IE 9 - 11+, Edge 15 - 18+
+		// IE/Edge misreport `getComputedStyle` of table rows with width/height
+		// set in CSS while `offset*` properties report correct values.
+		// Behavior in IE 9 is more subtle than in newer versions & it passes
+		// some versions of this test; make sure not to make it pass there!
+		//
+		// Support: Firefox 70+
+		// Only Firefox includes border widths
+		// in computed dimensions. (gh-4529)
+		reliableTrDimensions: function() {
+			var table, tr, trChild, trStyle;
+			if ( reliableTrDimensionsVal == null ) {
+				table = document.createElement( "table" );
+				tr = document.createElement( "tr" );
+				trChild = document.createElement( "div" );
+
+				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+				tr.style.cssText = "border:1px solid";
+
+				// Support: Chrome 86+
+				// Height set through cssText does not get applied.
+				// Computed height then comes back as 0.
+				tr.style.height = "1px";
+				trChild.style.height = "9px";
+
+				// Support: Android 8 Chrome 86+
+				// In our bodyBackground.html iframe,
+				// display for all div elements is set to "inline",
+				// which causes a problem only in Android 8 Chrome 86.
+				// Ensuring the div is display: block
+				// gets around this issue.
+				trChild.style.display = "block";
+
+				documentElement
+					.appendChild( table )
+					.appendChild( tr )
+					.appendChild( trChild );
+
+				trStyle = window.getComputedStyle( tr );
+				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+					parseInt( trStyle.borderTopWidth, 10 ) +
+					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
+
+				documentElement.removeChild( table );
+			}
+			return reliableTrDimensionsVal;
+		}
+	} );
+} )();
+
+
+function curCSS( elem, name, computed ) {
+	var width, minWidth, maxWidth, ret,
+
+		// Support: Firefox 51+
+		// Retrieving style before computed somehow
+		// fixes an issue with getting wrong values
+		// on detached elements
+		style = elem.style;
+
+	computed = computed || getStyles( elem );
+
+	// getPropertyValue is needed for:
+	//   .css('filter') (IE 9 only, #12537)
+	//   .css('--customProperty) (#3144)
+	if ( computed ) {
+		ret = computed.getPropertyValue( name ) || computed[ name ];
+
+		if ( ret === "" && !isAttached( elem ) ) {
+			ret = jQuery.style( elem, name );
+		}
+
+		// A tribute to the "awesome hack by Dean Edwards"
+		// Android Browser returns percentage for some values,
+		// but width seems to be reliably pixels.
+		// This is against the CSSOM draft spec:
+		// https://drafts.csswg.org/cssom/#resolved-values
+		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
+
+			// Remember the original values
+			width = style.width;
+			minWidth = style.minWidth;
+			maxWidth = style.maxWidth;
+
+			// Put in the new values to get a computed value out
+			style.minWidth = style.maxWidth = style.width = ret;
+			ret = computed.width;
+
+			// Revert the changed values
+			style.width = width;
+			style.minWidth = minWidth;
+			style.maxWidth = maxWidth;
+		}
+	}
+
+	return ret !== undefined ?
+
+		// Support: IE <=9 - 11 only
+		// IE returns zIndex value as an integer.
+		ret + "" :
+		ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+	// Define the hook, we'll check on the first run if it's really needed.
+	return {
+		get: function() {
+			if ( conditionFn() ) {
+
+				// Hook not needed (or it's not possible to use it due
+				// to missing dependency), remove it.
+				delete this.get;
+				return;
+			}
+
+			// Hook needed; redefine it so that the support test is not executed again.
+			return ( this.get = hookFn ).apply( this, arguments );
+		}
+	};
+}
+
+
+var cssPrefixes = [ "Webkit", "Moz", "ms" ],
+	emptyStyle = document.createElement( "div" ).style,
+	vendorProps = {};
+
+// Return a vendor-prefixed property or undefined
+function vendorPropName( name ) {
+
+	// Check for vendor prefixed names
+	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in emptyStyle ) {
+			return name;
+		}
+	}
+}
+
+// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
+function finalPropName( name ) {
+	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
+
+	if ( final ) {
+		return final;
+	}
+	if ( name in emptyStyle ) {
+		return name;
+	}
+	return vendorProps[ name ] = vendorPropName( name ) || name;
+}
+
+
+var
+
+	// Swappable if display is none or starts with table
+	// except "table", "table-cell", or "table-caption"
+	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rcustomProp = /^--/,
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: "0",
+		fontWeight: "400"
+	};
+
+function setPositiveNumber( _elem, value, subtract ) {
+
+	// Any relative (+/-) values have already been
+	// normalized at this point
+	var matches = rcssNum.exec( value );
+	return matches ?
+
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
+		value;
+}
+
+function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
+	var i = dimension === "width" ? 1 : 0,
+		extra = 0,
+		delta = 0;
+
+	// Adjustment may not be necessary
+	if ( box === ( isBorderBox ? "border" : "content" ) ) {
+		return 0;
+	}
+
+	for ( ; i < 4; i += 2 ) {
+
+		// Both box models exclude margin
+		if ( box === "margin" ) {
+			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
+		}
+
+		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
+		if ( !isBorderBox ) {
+
+			// Add padding
+			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// For "border" or "margin", add border
+			if ( box !== "padding" ) {
+				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+
+			// But still keep track of it otherwise
+			} else {
+				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+
+		// If we get here with a border-box (content + padding + border), we're seeking "content" or
+		// "padding" or "margin"
+		} else {
+
+			// For "content", subtract padding
+			if ( box === "content" ) {
+				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// For "content" or "padding", subtract border
+			if ( box !== "margin" ) {
+				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	// Account for positive content-box scroll gutter when requested by providing computedVal
+	if ( !isBorderBox && computedVal >= 0 ) {
+
+		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
+		// Assuming integer scroll gutter, subtract the rest and round down
+		delta += Math.max( 0, Math.ceil(
+			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+			computedVal -
+			delta -
+			extra -
+			0.5
+
+		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
+		// Use an explicit zero to avoid NaN (gh-3964)
+		) ) || 0;
+	}
+
+	return delta;
+}
+
+function getWidthOrHeight( elem, dimension, extra ) {
+
+	// Start with computed style
+	var styles = getStyles( elem ),
+
+		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
+		// Fake content-box until we know it's needed to know the true value.
+		boxSizingNeeded = !support.boxSizingReliable() || extra,
+		isBorderBox = boxSizingNeeded &&
+			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+		valueIsBorderBox = isBorderBox,
+
+		val = curCSS( elem, dimension, styles ),
+		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
+
+	// Support: Firefox <=54
+	// Return a confounding non-pixel value or feign ignorance, as appropriate.
+	if ( rnumnonpx.test( val ) ) {
+		if ( !extra ) {
+			return val;
+		}
+		val = "auto";
+	}
+
+
+	// Support: IE 9 - 11 only
+	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
+	// In those cases, the computed value can be trusted to be border-box.
+	if ( ( !support.boxSizingReliable() && isBorderBox ||
+
+		// Support: IE 10 - 11+, Edge 15 - 18+
+		// IE/Edge misreport `getComputedStyle` of table rows with width/height
+		// set in CSS while `offset*` properties report correct values.
+		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
+		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
+
+		// Fall back to offsetWidth/offsetHeight when value is "auto"
+		// This happens for inline elements with no explicit setting (gh-3571)
+		val === "auto" ||
+
+		// Support: Android <=4.1 - 4.3 only
+		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
+		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
+
+		// Make sure the element is visible & connected
+		elem.getClientRects().length ) {
+
+		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
+		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
+		// retrieved value as a content box dimension.
+		valueIsBorderBox = offsetProp in elem;
+		if ( valueIsBorderBox ) {
+			val = elem[ offsetProp ];
+		}
+	}
+
+	// Normalize "" and auto
+	val = parseFloat( val ) || 0;
+
+	// Adjust for the element's box model
+	return ( val +
+		boxModelAdjustment(
+			elem,
+			dimension,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles,
+
+			// Provide the current computed size to request scroll gutter calculation (gh-3589)
+			val
+		)
+	) + "px";
+}
+
+jQuery.extend( {
+
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Don't automatically add "px" to these possibly-unitless properties
+	cssNumber: {
+		"animationIterationCount": true,
+		"columnCount": true,
+		"fillOpacity": true,
+		"flexGrow": true,
+		"flexShrink": true,
+		"fontWeight": true,
+		"gridArea": true,
+		"gridColumn": true,
+		"gridColumnEnd": true,
+		"gridColumnStart": true,
+		"gridRow": true,
+		"gridRowEnd": true,
+		"gridRowStart": true,
+		"lineHeight": true,
+		"opacity": true,
+		"order": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = camelCase( name ),
+			isCustomProp = rcustomProp.test( name ),
+			style = elem.style;
+
+		// Make sure that we're working with the right name. We don't
+		// want to query the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Gets hook for the prefixed version, then unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// Convert "+=" or "-=" to relative numbers (#7345)
+			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+				value = adjustCSS( elem, name, ret );
+
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that null and NaN values aren't set (#7116)
+			if ( value == null || value !== value ) {
+				return;
+			}
+
+			// If a number was passed in, add the unit (except for certain CSS properties)
+			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
+			// "px" to a few hardcoded values.
+			if ( type === "number" && !isCustomProp ) {
+				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+			}
+
+			// background-* props affect original clone's values
+			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !( "set" in hooks ) ||
+				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+				if ( isCustomProp ) {
+					style.setProperty( name, value );
+				} else {
+					style[ name ] = value;
+				}
+			}
+
+		} else {
+
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks &&
+				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var val, num, hooks,
+			origName = camelCase( name ),
+			isCustomProp = rcustomProp.test( name );
+
+		// Make sure that we're working with the right name. We don't
+		// want to modify the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Try prefixed name followed by the unprefixed name
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		// Convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Make numeric if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || isFinite( num ) ? num || 0 : val;
+		}
+
+		return val;
+	}
+} );
+
+jQuery.each( [ "height", "width" ], function( _i, dimension ) {
+	jQuery.cssHooks[ dimension ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+
+				// Certain elements can have dimension info if we invisibly show them
+				// but it must have a current display style that would benefit
+				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+
+					// Support: Safari 8+
+					// Table columns in Safari have non-zero offsetWidth & zero
+					// getBoundingClientRect().width unless display is changed.
+					// Support: IE <=11 only
+					// Running getBoundingClientRect on a disconnected node
+					// in IE throws an error.
+					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
+					swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, dimension, extra );
+					} ) :
+					getWidthOrHeight( elem, dimension, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var matches,
+				styles = getStyles( elem ),
+
+				// Only read styles.position if the test has a chance to fail
+				// to avoid forcing a reflow.
+				scrollboxSizeBuggy = !support.scrollboxSize() &&
+					styles.position === "absolute",
+
+				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
+				boxSizingNeeded = scrollboxSizeBuggy || extra,
+				isBorderBox = boxSizingNeeded &&
+					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+				subtract = extra ?
+					boxModelAdjustment(
+						elem,
+						dimension,
+						extra,
+						isBorderBox,
+						styles
+					) :
+					0;
+
+			// Account for unreliable border-box dimensions by comparing offset* to computed and
+			// faking a content-box to get border and padding (gh-3699)
+			if ( isBorderBox && scrollboxSizeBuggy ) {
+				subtract -= Math.ceil(
+					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+					parseFloat( styles[ dimension ] ) -
+					boxModelAdjustment( elem, dimension, "border", false, styles ) -
+					0.5
+				);
+			}
+
+			// Convert to pixels if value adjustment is needed
+			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
+				( matches[ 3 ] || "px" ) !== "px" ) {
+
+				elem.style[ dimension ] = value;
+				value = jQuery.css( elem, dimension );
+			}
+
+			return setPositiveNumber( elem, value, subtract );
+		}
+	};
+} );
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+	function( elem, computed ) {
+		if ( computed ) {
+			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
+				elem.getBoundingClientRect().left -
+					swap( elem, { marginLeft: 0 }, function() {
+						return elem.getBoundingClientRect().left;
+					} )
+			) + "px";
+		}
+	}
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// Assumes a single number if not a string
+				parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( prefix !== "margin" ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+} );
+
+jQuery.fn.extend( {
+	css: function( name, value ) {
+		return access( this, function( elem, name, value ) {
+			var styles, len,
+				map = {},
+				i = 0;
+
+			if ( Array.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	}
+} );
+
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || jQuery.easing._default;
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			// Use a property on the element directly when it is not a DOM element,
+			// or when there is no matching style property that exists.
+			if ( tween.elem.nodeType !== 1 ||
+				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// Passing an empty string as a 3rd parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails.
+			// Simple values such as "10px" are parsed to Float;
+			// complex values such as "rotate(1rad)" are returned as-is.
+			result = jQuery.css( tween.elem, tween.prop, "" );
+
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+
+			// Use step hook for back compat.
+			// Use cssHook if its there.
+			// Use .style if available and use plain properties where available.
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.nodeType === 1 && (
+				jQuery.cssHooks[ tween.prop ] ||
+					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Support: IE <=9 only
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p * Math.PI ) / 2;
+	},
+	_default: "swing"
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+	fxNow, inProgress,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rrun = /queueHooks$/;
+
+function schedule() {
+	if ( inProgress ) {
+		if ( document.hidden === false && window.requestAnimationFrame ) {
+			window.requestAnimationFrame( schedule );
+		} else {
+			window.setTimeout( schedule, jQuery.fx.interval );
+		}
+
+		jQuery.fx.tick();
+	}
+}
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	window.setTimeout( function() {
+		fxNow = undefined;
+	} );
+	return ( fxNow = Date.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		i = 0,
+		attrs = { height: type };
+
+	// If we include width, step value is 1 to do all cssExpand values,
+	// otherwise step value is 2 to skip over Left and Right
+	includeWidth = includeWidth ? 1 : 0;
+	for ( ; i < 4; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
+		index = 0,
+		length = collection.length;
+	for ( ; index < length; index++ ) {
+		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
+
+			// We're done with this property
+			return tween;
+		}
+	}
+}
+
+function defaultPrefilter( elem, props, opts ) {
+	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
+		isBox = "width" in props || "height" in props,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHiddenWithinTree( elem ),
+		dataShow = dataPriv.get( elem, "fxshow" );
+
+	// Queue-skipping animations hijack the fx hooks
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always( function() {
+
+			// Ensure the complete handler is called before this completes
+			anim.always( function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			} );
+		} );
+	}
+
+	// Detect show/hide animations
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.test( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+
+				// Pretend to be hidden if this is a "show" and
+				// there is still data from a stopped show/hide
+				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+					hidden = true;
+
+				// Ignore all other no-op show/hide data
+				} else {
+					continue;
+				}
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+		}
+	}
+
+	// Bail out if this is a no-op like .hide().hide()
+	propTween = !jQuery.isEmptyObject( props );
+	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
+		return;
+	}
+
+	// Restrict "overflow" and "display" styles during box animations
+	if ( isBox && elem.nodeType === 1 ) {
+
+		// Support: IE <=9 - 11, Edge 12 - 15
+		// Record all 3 overflow attributes because IE does not infer the shorthand
+		// from identically-valued overflowX and overflowY and Edge just mirrors
+		// the overflowX value there.
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Identify a display type, preferring old show/hide data over the CSS cascade
+		restoreDisplay = dataShow && dataShow.display;
+		if ( restoreDisplay == null ) {
+			restoreDisplay = dataPriv.get( elem, "display" );
+		}
+		display = jQuery.css( elem, "display" );
+		if ( display === "none" ) {
+			if ( restoreDisplay ) {
+				display = restoreDisplay;
+			} else {
+
+				// Get nonempty value(s) by temporarily forcing visibility
+				showHide( [ elem ], true );
+				restoreDisplay = elem.style.display || restoreDisplay;
+				display = jQuery.css( elem, "display" );
+				showHide( [ elem ] );
+			}
+		}
+
+		// Animate inline elements as inline-block
+		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
+			if ( jQuery.css( elem, "float" ) === "none" ) {
+
+				// Restore the original display value at the end of pure show/hide animations
+				if ( !propTween ) {
+					anim.done( function() {
+						style.display = restoreDisplay;
+					} );
+					if ( restoreDisplay == null ) {
+						display = style.display;
+						restoreDisplay = display === "none" ? "" : display;
+					}
+				}
+				style.display = "inline-block";
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		anim.always( function() {
+			style.overflow = opts.overflow[ 0 ];
+			style.overflowX = opts.overflow[ 1 ];
+			style.overflowY = opts.overflow[ 2 ];
+		} );
+	}
+
+	// Implement show/hide animations
+	propTween = false;
+	for ( prop in orig ) {
+
+		// General show/hide setup for this element animation
+		if ( !propTween ) {
+			if ( dataShow ) {
+				if ( "hidden" in dataShow ) {
+					hidden = dataShow.hidden;
+				}
+			} else {
+				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
+			}
+
+			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
+			if ( toggle ) {
+				dataShow.hidden = !hidden;
+			}
+
+			// Show elements before animating them
+			if ( hidden ) {
+				showHide( [ elem ], true );
+			}
+
+			/* eslint-disable no-loop-func */
+
+			anim.done( function() {
+
+				/* eslint-enable no-loop-func */
+
+				// The final step of a "hide" animation is actually hiding the element
+				if ( !hidden ) {
+					showHide( [ elem ] );
+				}
+				dataPriv.remove( elem, "fxshow" );
+				for ( prop in orig ) {
+					jQuery.style( elem, prop, orig[ prop ] );
+				}
+			} );
+		}
+
+		// Per-property setup
+		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+		if ( !( prop in dataShow ) ) {
+			dataShow[ prop ] = propTween.start;
+			if ( hidden ) {
+				propTween.end = propTween.start;
+				propTween.start = 0;
+			}
+		}
+	}
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( Array.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// Not quite $.extend, this won't overwrite existing keys.
+			// Reusing 'index' because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = Animation.prefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+
+			// Don't match elem in the :animated selector
+			delete tick.elem;
+		} ),
+		tick = function() {
+			if ( stopped ) {
+				return false;
+			}
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+
+				// Support: Android 2.3 only
+				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ] );
+
+			// If there's more to do, yield
+			if ( percent < 1 && length ) {
+				return remaining;
+			}
+
+			// If this was an empty animation, synthesize a final progress notification
+			if ( !length ) {
+				deferred.notifyWith( elem, [ animation, 1, 0 ] );
+			}
+
+			// Resolve the animation and report its conclusion
+			deferred.resolveWith( elem, [ animation ] );
+			return false;
+		},
+		animation = deferred.promise( {
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, {
+				specialEasing: {},
+				easing: jQuery.easing._default
+			}, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+					animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+
+					// If we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+				if ( stopped ) {
+					return this;
+				}
+				stopped = true;
+				for ( ; index < length; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// Resolve when we played the last frame; otherwise, reject
+				if ( gotoEnd ) {
+					deferred.notifyWith( elem, [ animation, 1, 0 ] );
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		} ),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length; index++ ) {
+		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			if ( isFunction( result.stop ) ) {
+				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
+					result.stop.bind( result );
+			}
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	// Attach callbacks from options
+	animation
+		.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		} )
+	);
+
+	return animation;
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweeners: {
+		"*": [ function( prop, value ) {
+			var tween = this.createTween( prop, value );
+			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
+			return tween;
+		} ]
+	},
+
+	tweener: function( props, callback ) {
+		if ( isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.match( rnothtmlwhite );
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length; index++ ) {
+			prop = props[ index ];
+			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
+			Animation.tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilters: [ defaultPrefilter ],
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			Animation.prefilters.unshift( callback );
+		} else {
+			Animation.prefilters.push( callback );
+		}
+	}
+} );
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !isFunction( easing ) && easing
+	};
+
+	// Go to the end state if fx are off
+	if ( jQuery.fx.off ) {
+		opt.duration = 0;
+
+	} else {
+		if ( typeof opt.duration !== "number" ) {
+			if ( opt.duration in jQuery.fx.speeds ) {
+				opt.duration = jQuery.fx.speeds[ opt.duration ];
+
+			} else {
+				opt.duration = jQuery.fx.speeds._default;
+			}
+		}
+	}
+
+	// Normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.fn.extend( {
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// Show any hidden elements after setting opacity to 0
+		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
+
+			// Animate to the value specified
+			.end().animate( { opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations, or finishing resolves immediately
+				if ( empty || dataPriv.get( this, "finish" ) ) {
+					anim.stop( true );
+				}
+			};
+
+		doAnimation.finish = doAnimation;
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each( function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = dataPriv.get( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this &&
+					( type == null || timers[ index ].queue === type ) ) {
+
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// Start the next in the queue if the last step wasn't forced.
+			// Timers currently will call their complete callbacks, which
+			// will dequeue but only if they were gotoEnd.
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		} );
+	},
+	finish: function( type ) {
+		if ( type !== false ) {
+			type = type || "fx";
+		}
+		return this.each( function() {
+			var index,
+				data = dataPriv.get( this ),
+				queue = data[ type + "queue" ],
+				hooks = data[ type + "queueHooks" ],
+				timers = jQuery.timers,
+				length = queue ? queue.length : 0;
+
+			// Enable finishing flag on private data
+			data.finish = true;
+
+			// Empty the queue first
+			jQuery.queue( this, type, [] );
+
+			if ( hooks && hooks.stop ) {
+				hooks.stop.call( this, true );
+			}
+
+			// Look for any active animations, and finish them
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+					timers[ index ].anim.stop( true );
+					timers.splice( index, 1 );
+				}
+			}
+
+			// Look for any animations in the old queue and finish them
+			for ( index = 0; index < length; index++ ) {
+				if ( queue[ index ] && queue[ index ].finish ) {
+					queue[ index ].finish.call( this );
+				}
+			}
+
+			// Turn off finishing flag
+			delete data.finish;
+		} );
+	}
+} );
+
+jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+} );
+
+// Generate shortcuts for custom animations
+jQuery.each( {
+	slideDown: genFx( "show" ),
+	slideUp: genFx( "hide" ),
+	slideToggle: genFx( "toggle" ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+} );
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+	var timer,
+		i = 0,
+		timers = jQuery.timers;
+
+	fxNow = Date.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+
+		// Run the timer and safely remove it when done (allowing for external removal)
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	jQuery.timers.push( timer );
+	jQuery.fx.start();
+};
+
+jQuery.fx.interval = 13;
+jQuery.fx.start = function() {
+	if ( inProgress ) {
+		return;
+	}
+
+	inProgress = true;
+	schedule();
+};
+
+jQuery.fx.stop = function() {
+	inProgress = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+
+	// Default speed
+	_default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+	type = type || "fx";
+
+	return this.queue( type, function( next, hooks ) {
+		var timeout = window.setTimeout( next, time );
+		hooks.stop = function() {
+			window.clearTimeout( timeout );
+		};
+	} );
+};
+
+
+( function() {
+	var input = document.createElement( "input" ),
+		select = document.createElement( "select" ),
+		opt = select.appendChild( document.createElement( "option" ) );
+
+	input.type = "checkbox";
+
+	// Support: Android <=4.3 only
+	// Default value for a checkbox should be "on"
+	support.checkOn = input.value !== "";
+
+	// Support: IE <=11 only
+	// Must access selectedIndex to make default options select
+	support.optSelected = opt.selected;
+
+	// Support: IE <=11 only
+	// An input loses its value after becoming a radio
+	input = document.createElement( "input" );
+	input.value = "t";
+	input.type = "radio";
+	support.radioValue = input.value === "t";
+} )();
+
+
+var boolHook,
+	attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend( {
+	attr: function( name, value ) {
+		return access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each( function() {
+			jQuery.removeAttr( this, name );
+		} );
+	}
+} );
+
+jQuery.extend( {
+	attr: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set attributes on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// Attribute hooks are determined by the lowercase version
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
+		}
+
+		if ( value !== undefined ) {
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+			}
+
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			elem.setAttribute( name, value + "" );
+			return value;
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		ret = jQuery.find.attr( elem, name );
+
+		// Non-existent attributes return null, we normalize to undefined
+		return ret == null ? undefined : ret;
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !support.radioValue && value === "radio" &&
+					nodeName( elem, "input" ) ) {
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name,
+			i = 0,
+
+			// Attribute names can contain non-HTML whitespace characters
+			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+			attrNames = value && value.match( rnothtmlwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( ( name = attrNames[ i++ ] ) ) {
+				elem.removeAttribute( name );
+			}
+		}
+	}
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			elem.setAttribute( name, name );
+		}
+		return name;
+	}
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
+	var getter = attrHandle[ name ] || jQuery.find.attr;
+
+	attrHandle[ name ] = function( elem, name, isXML ) {
+		var ret, handle,
+			lowercaseName = name.toLowerCase();
+
+		if ( !isXML ) {
+
+			// Avoid an infinite loop by temporarily removing this function from the getter
+			handle = attrHandle[ lowercaseName ];
+			attrHandle[ lowercaseName ] = ret;
+			ret = getter( elem, name, isXML ) != null ?
+				lowercaseName :
+				null;
+			attrHandle[ lowercaseName ] = handle;
+		}
+		return ret;
+	};
+} );
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i,
+	rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+	prop: function( name, value ) {
+		return access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		return this.each( function() {
+			delete this[ jQuery.propFix[ name ] || name ];
+		} );
+	}
+} );
+
+jQuery.extend( {
+	prop: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set properties on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			return ( elem[ name ] = value );
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		return elem[ name ];
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+
+				// Support: IE <=9 - 11 only
+				// elem.tabIndex doesn't always return the
+				// correct value when it hasn't been explicitly set
+				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				// Use proper attribute retrieval(#12072)
+				var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+				if ( tabindex ) {
+					return parseInt( tabindex, 10 );
+				}
+
+				if (
+					rfocusable.test( elem.nodeName ) ||
+					rclickable.test( elem.nodeName ) &&
+					elem.href
+				) {
+					return 0;
+				}
+
+				return -1;
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	}
+} );
+
+// Support: IE <=11 only
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
+if ( !support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent && parent.parentNode ) {
+				parent.parentNode.selectedIndex;
+			}
+			return null;
+		},
+		set: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent ) {
+				parent.selectedIndex;
+
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+		}
+	};
+}
+
+jQuery.each( [
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+
+
+
+	// Strip and collapse whitespace according to HTML spec
+	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
+	function stripAndCollapse( value ) {
+		var tokens = value.match( rnothtmlwhite ) || [];
+		return tokens.join( " " );
+	}
+
+
+function getClass( elem ) {
+	return elem.getAttribute && elem.getAttribute( "class" ) || "";
+}
+
+function classesToArray( value ) {
+	if ( Array.isArray( value ) ) {
+		return value;
+	}
+	if ( typeof value === "string" ) {
+		return value.match( rnothtmlwhite ) || [];
+	}
+	return [];
+}
+
+jQuery.fn.extend( {
+	addClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		classes = classesToArray( value );
+
+		if ( classes.length ) {
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( !arguments.length ) {
+			return this.attr( "class", "" );
+		}
+
+		classes = classesToArray( value );
+
+		if ( classes.length ) {
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isValidValue = type === "string" || Array.isArray( value );
+
+		if ( typeof stateVal === "boolean" && isValidValue ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( isFunction( value ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).toggleClass(
+					value.call( this, i, getClass( this ), stateVal ),
+					stateVal
+				);
+			} );
+		}
+
+		return this.each( function() {
+			var className, i, self, classNames;
+
+			if ( isValidValue ) {
+
+				// Toggle individual class names
+				i = 0;
+				self = jQuery( this );
+				classNames = classesToArray( value );
+
+				while ( ( className = classNames[ i++ ] ) ) {
+
+					// Check each className given, space separated list
+					if ( self.hasClass( className ) ) {
+						self.removeClass( className );
+					} else {
+						self.addClass( className );
+					}
+				}
+
+			// Toggle whole class name
+			} else if ( value === undefined || type === "boolean" ) {
+				className = getClass( this );
+				if ( className ) {
+
+					// Store className if set
+					dataPriv.set( this, "__className__", className );
+				}
+
+				// If the element has a class name or if we're passed `false`,
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				if ( this.setAttribute ) {
+					this.setAttribute( "class",
+						className || value === false ?
+							"" :
+							dataPriv.get( this, "__className__" ) || ""
+					);
+				}
+			}
+		} );
+	},
+
+	hasClass: function( selector ) {
+		var className, elem,
+			i = 0;
+
+		className = " " + selector + " ";
+		while ( ( elem = this[ i++ ] ) ) {
+			if ( elem.nodeType === 1 &&
+				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+} );
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend( {
+	val: function( value ) {
+		var hooks, ret, valueIsFunction,
+			elem = this[ 0 ];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] ||
+					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks &&
+					"get" in hooks &&
+					( ret = hooks.get( elem, "value" ) ) !== undefined
+				) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				// Handle most common string cases
+				if ( typeof ret === "string" ) {
+					return ret.replace( rreturn, "" );
+				}
+
+				// Handle cases where value is null/undef or number
+				return ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		valueIsFunction = isFunction( value );
+
+		return this.each( function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( valueIsFunction ) {
+				val = value.call( this, i, jQuery( this ).val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+
+			} else if ( typeof val === "number" ) {
+				val += "";
+
+			} else if ( Array.isArray( val ) ) {
+				val = jQuery.map( val, function( value ) {
+					return value == null ? "" : value + "";
+				} );
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		} );
+	}
+} );
+
+jQuery.extend( {
+	valHooks: {
+		option: {
+			get: function( elem ) {
+
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+
+					// Support: IE <=10 - 11 only
+					// option.text throws exceptions (#14686, #14858)
+					// Strip and collapse whitespace
+					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+					stripAndCollapse( jQuery.text( elem ) );
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option, i,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one",
+					values = one ? null : [],
+					max = one ? index + 1 : options.length;
+
+				if ( index < 0 ) {
+					i = max;
+
+				} else {
+					i = one ? index : 0;
+				}
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Support: IE <=9 only
+					// IE8-9 doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+
+							// Don't return options that are disabled or in a disabled optgroup
+							!option.disabled &&
+							( !option.parentNode.disabled ||
+								!nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var optionSet, option,
+					options = elem.options,
+					values = jQuery.makeArray( value ),
+					i = options.length;
+
+				while ( i-- ) {
+					option = options[ i ];
+
+					/* eslint-disable no-cond-assign */
+
+					if ( option.selected =
+						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+					) {
+						optionSet = true;
+					}
+
+					/* eslint-enable no-cond-assign */
+				}
+
+				// Force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	}
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( Array.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+			}
+		}
+	};
+	if ( !support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+		};
+	}
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+support.focusin = "onfocusin" in window;
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	stopPropagationCallback = function( e ) {
+		e.stopPropagation();
+	};
+
+jQuery.extend( jQuery.event, {
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+
+		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
+			eventPath = [ elem || document ],
+			type = hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+		cur = lastElement = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "." ) > -1 ) {
+
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split( "." );
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+		event.isTrigger = onlyHandlers ? 2 : 3;
+		event.namespace = namespaces.join( "." );
+		event.rnamespace = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === ( elem.ownerDocument || document ) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+			lastElement = cur;
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
+				dataPriv.get( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && handle.apply && acceptData( cur ) ) {
+				event.result = handle.apply( cur, data );
+				if ( event.result === false ) {
+					event.preventDefault();
+				}
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( ( !special._default ||
+				special._default.apply( eventPath.pop(), data ) === false ) &&
+				acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name as the event.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+
+					if ( event.isPropagationStopped() ) {
+						lastElement.addEventListener( type, stopPropagationCallback );
+					}
+
+					elem[ type ]();
+
+					if ( event.isPropagationStopped() ) {
+						lastElement.removeEventListener( type, stopPropagationCallback );
+					}
+
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Piggyback on a donor event to simulate a different one
+	// Used only for `focus(in | out)` events
+	simulate: function( type, elem, event ) {
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true
+			}
+		);
+
+		jQuery.event.trigger( e, null, elem );
+	}
+
+} );
+
+jQuery.fn.extend( {
+
+	trigger: function( type, data ) {
+		return this.each( function() {
+			jQuery.event.trigger( type, data, this );
+		} );
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[ 0 ];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+} );
+
+
+// Support: Firefox <=44
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler on the document while someone wants focusin/focusout
+		var handler = function( event ) {
+			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+		};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+
+				// Handle: regular nodes (via `this.ownerDocument`), window
+				// (via `this.document`) & document (via `this`).
+				var doc = this.ownerDocument || this.document || this,
+					attaches = dataPriv.access( doc, fix );
+
+				if ( !attaches ) {
+					doc.addEventListener( orig, handler, true );
+				}
+				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
+			},
+			teardown: function() {
+				var doc = this.ownerDocument || this.document || this,
+					attaches = dataPriv.access( doc, fix ) - 1;
+
+				if ( !attaches ) {
+					doc.removeEventListener( orig, handler, true );
+					dataPriv.remove( doc, fix );
+
+				} else {
+					dataPriv.access( doc, fix, attaches );
+				}
+			}
+		};
+	} );
+}
+var location = window.location;
+
+var nonce = { guid: Date.now() };
+
+var rquery = ( /\?/ );
+
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+	var xml, parserErrorElem;
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+
+	// Support: IE 9 - 11 only
+	// IE throws on parseFromString with invalid input.
+	try {
+		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
+	} catch ( e ) {}
+
+	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+	if ( !xml || parserErrorElem ) {
+		jQuery.error( "Invalid XML: " + (
+			parserErrorElem ?
+				jQuery.map( parserErrorElem.childNodes, function( el ) {
+					return el.textContent;
+				} ).join( "\n" ) :
+				data
+		) );
+	}
+	return xml;
+};
+
+
+var
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( Array.isArray( obj ) ) {
+
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams(
+					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+					v,
+					traditional,
+					add
+				);
+			}
+		} );
+
+	} else if ( !traditional && toType( obj ) === "object" ) {
+
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, valueOrFunction ) {
+
+			// If value is a function, invoke it and use its return value
+			var value = isFunction( valueOrFunction ) ?
+				valueOrFunction() :
+				valueOrFunction;
+
+			s[ s.length ] = encodeURIComponent( key ) + "=" +
+				encodeURIComponent( value == null ? "" : value );
+		};
+
+	if ( a == null ) {
+		return "";
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		} );
+
+	} else {
+
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" );
+};
+
+jQuery.fn.extend( {
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map( function() {
+
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		} ).filter( function() {
+			var type = this.type;
+
+			// Use .is( ":disabled" ) so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !rcheckableType.test( type ) );
+		} ).map( function( _i, elem ) {
+			var val = jQuery( this ).val();
+
+			if ( val == null ) {
+				return null;
+			}
+
+			if ( Array.isArray( val ) ) {
+				return jQuery.map( val, function( val ) {
+					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+				} );
+			}
+
+			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		} ).get();
+	}
+} );
+
+
+var
+	r20 = /%20/g,
+	rhash = /#.*$/,
+	rantiCache = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat( "*" ),
+
+	// Anchor tag for parsing the document origin
+	originAnchor = document.createElement( "a" );
+
+originAnchor.href = location.href;
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
+
+		if ( isFunction( func ) ) {
+
+			// For each dataType in the dataTypeExpression
+			while ( ( dataType = dataTypes[ i++ ] ) ) {
+
+				// Prepend if requested
+				if ( dataType[ 0 ] === "+" ) {
+					dataType = dataType.slice( 1 ) || "*";
+					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
+
+				// Otherwise append
+				} else {
+					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
+				}
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+	var inspected = {},
+		seekingTransport = ( structure === transports );
+
+	function inspect( dataType ) {
+		var selected;
+		inspected[ dataType ] = true;
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+			if ( typeof dataTypeOrTransport === "string" &&
+				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+
+				options.dataTypes.unshift( dataTypeOrTransport );
+				inspect( dataTypeOrTransport );
+				return false;
+			} else if ( seekingTransport ) {
+				return !( selected = dataTypeOrTransport );
+			}
+		} );
+		return selected;
+	}
+
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+
+	return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes;
+
+	// Remove auto dataType and get content-type in the process
+	while ( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+	var conv2, current, conv, tmp, prev,
+		converters = {},
+
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice();
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	current = dataTypes.shift();
+
+	// Convert to each sequential dataType
+	while ( current ) {
+
+		if ( s.responseFields[ current ] ) {
+			jqXHR[ s.responseFields[ current ] ] = response;
+		}
+
+		// Apply the dataFilter if provided
+		if ( !prev && isSuccess && s.dataFilter ) {
+			response = s.dataFilter( response, s.dataType );
+		}
+
+		prev = current;
+		current = dataTypes.shift();
+
+		if ( current ) {
+
+			// There's only work to do if current dataType is non-auto
+			if ( current === "*" ) {
+
+				current = prev;
+
+			// Convert response if prev dataType is non-auto and differs from current
+			} else if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split( " " );
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.unshift( tmp[ 1 ] );
+								}
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s.throws ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return {
+								state: "parsererror",
+								error: conv ? e : "No conversion from " + prev + " to " + current
+							};
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return { state: "success", data: response };
+}
+
+jQuery.extend( {
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: location.href,
+		type: "GET",
+		isLocal: rlocalProtocol.test( location.protocol ),
+		global: true,
+		processData: true,
+		async: true,
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			"*": allTypes,
+			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"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": JSON.parse,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			url: true,
+			context: true
+		}
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		return settings ?
+
+			// Building a settings object
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+			// Extending ajaxSettings
+			ajaxExtend( jQuery.ajaxSettings, target );
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var transport,
+
+			// URL without anti-cache param
+			cacheURL,
+
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+
+			// timeout handle
+			timeoutTimer,
+
+			// Url cleanup var
+			urlAnchor,
+
+			// Request state (becomes false upon send and true upon completion)
+			completed,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			// Loop variable
+			i,
+
+			// uncached part of the url
+			uncached,
+
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+
+			// Callbacks context
+			callbackContext = s.context || s,
+
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
+			globalEventContext = s.context &&
+				( callbackContext.nodeType || callbackContext.jquery ) ?
+				jQuery( callbackContext ) :
+				jQuery.event,
+
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+
+			// Default abort message
+			strAbort = "canceled",
+
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( completed ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
+									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
+										.concat( match[ 2 ] );
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() + " " ];
+					}
+					return match == null ? null : match.join( ", " );
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return completed ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( completed == null ) {
+						name = requestHeadersNames[ name.toLowerCase() ] =
+							requestHeadersNames[ name.toLowerCase() ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( completed == null ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( completed ) {
+
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						} else {
+
+							// Lazy-add the new callbacks in a way that preserves old ones
+							for ( code in map ) {
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						}
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					var finalText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( finalText );
+					}
+					done( 0, finalText );
+					return this;
+				}
+			};
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+
+		// Add protocol if not provided (prefilters might expect it)
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url || location.href ) + "" )
+			.replace( rprotocol, location.protocol + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
+
+		// A cross-domain request is in order when the origin doesn't match the current origin.
+		if ( s.crossDomain == null ) {
+			urlAnchor = document.createElement( "a" );
+
+			// Support: IE <=8 - 11, Edge 12 - 15
+			// IE throws exception on accessing the href property if url is malformed,
+			// e.g. http://example.com:80x/
+			try {
+				urlAnchor.href = s.url;
+
+				// Support: IE <=8 - 11 only
+				// Anchor's host property isn't correctly set when s.url is relative
+				urlAnchor.href = urlAnchor.href;
+				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
+					urlAnchor.protocol + "//" + urlAnchor.host;
+			} catch ( e ) {
+
+				// If there is an error parsing the URL, assume it is crossDomain,
+				// it can be rejected by the transport if it is invalid
+				s.crossDomain = true;
+			}
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( completed ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+		fireGlobals = jQuery.event && s.global;
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Save the URL in case we're toying with the If-Modified-Since
+		// and/or If-None-Match header later on
+		// Remove hash to simplify url manipulation
+		cacheURL = s.url.replace( rhash, "" );
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// Remember the hash so we can put it back
+			uncached = s.url.slice( cacheURL.length );
+
+			// If data is available and should be processed, append data to url
+			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
+				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
+
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add or update anti-cache param if needed
+			if ( s.cache === false ) {
+				cacheURL = cacheURL.replace( rantiCache, "$1" );
+				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
+					uncached;
+			}
+
+			// Put hash and anti-cache on the URL that will be requested (gh-1732)
+			s.url = cacheURL + uncached;
+
+		// Change '%20' to '+' if this is encoded form body content (gh-2658)
+		} else if ( s.data && s.processData &&
+			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
+			s.data = s.data.replace( r20, "+" );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			if ( jQuery.lastModified[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+			}
+			if ( jQuery.etag[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
+				s.accepts[ s.dataTypes[ 0 ] ] +
+					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend &&
+			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
+
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// Aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		completeDeferred.add( s.complete );
+		jqXHR.done( s.success );
+		jqXHR.fail( s.error );
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+
+			// If request was aborted inside ajaxSend, stop there
+			if ( completed ) {
+				return jqXHR;
+			}
+
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = window.setTimeout( function() {
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				completed = false;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+
+				// Rethrow post-completion exceptions
+				if ( completed ) {
+					throw e;
+				}
+
+				// Propagate others as results
+				done( -1, e );
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Ignore repeat invocations
+			if ( completed ) {
+				return;
+			}
+
+			completed = true;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				window.clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Determine if successful
+			isSuccess = status >= 200 && status < 300 || status === 304;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// Use a noop converter for missing script but not if jsonp
+			if ( !isSuccess &&
+				jQuery.inArray( "script", s.dataTypes ) > -1 &&
+				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
+				s.converters[ "text script" ] = function() {};
+			}
+
+			// Convert no matter what (that way responseXXX fields are always set)
+			response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+			// If successful, handle type chaining
+			if ( isSuccess ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+					modified = jqXHR.getResponseHeader( "Last-Modified" );
+					if ( modified ) {
+						jQuery.lastModified[ cacheURL ] = modified;
+					}
+					modified = jqXHR.getResponseHeader( "etag" );
+					if ( modified ) {
+						jQuery.etag[ cacheURL ] = modified;
+					}
+				}
+
+				// if no content
+				if ( status === 204 || s.type === "HEAD" ) {
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					statusText = response.state;
+					success = response.data;
+					error = response.error;
+					isSuccess = !error;
+				}
+			} else {
+
+				// Extract error from statusText and normalize for non-aborts
+				error = statusText;
+				if ( status || !statusText ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+					[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	}
+} );
+
+jQuery.each( [ "get", "post" ], function( _i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+
+		// Shift arguments if data argument was omitted
+		if ( isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		// The url can be an options object (which then must have .url)
+		return jQuery.ajax( jQuery.extend( {
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		}, jQuery.isPlainObject( url ) && url ) );
+	};
+} );
+
+jQuery.ajaxPrefilter( function( s ) {
+	var i;
+	for ( i in s.headers ) {
+		if ( i.toLowerCase() === "content-type" ) {
+			s.contentType = s.headers[ i ] || "";
+		}
+	}
+} );
+
+
+jQuery._evalUrl = function( url, options, doc ) {
+	return jQuery.ajax( {
+		url: url,
+
+		// Make this explicit, since user can override this through ajaxSetup (#11264)
+		type: "GET",
+		dataType: "script",
+		cache: true,
+		async: false,
+		global: false,
+
+		// Only evaluate the response if it is successful (gh-4126)
+		// dataFilter is not invoked for failure responses, so using it instead
+		// of the default converter is kludgy but it works.
+		converters: {
+			"text script": function() {}
+		},
+		dataFilter: function( response ) {
+			jQuery.globalEval( response, options, doc );
+		}
+	} );
+};
+
+
+jQuery.fn.extend( {
+	wrapAll: function( html ) {
+		var wrap;
+
+		if ( this[ 0 ] ) {
+			if ( isFunction( html ) ) {
+				html = html.call( this[ 0 ] );
+			}
+
+			// The elements to wrap the target around
+			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+			if ( this[ 0 ].parentNode ) {
+				wrap.insertBefore( this[ 0 ] );
+			}
+
+			wrap.map( function() {
+				var elem = this;
+
+				while ( elem.firstElementChild ) {
+					elem = elem.firstElementChild;
+				}
+
+				return elem;
+			} ).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( isFunction( html ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).wrapInner( html.call( this, i ) );
+			} );
+		}
+
+		return this.each( function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		} );
+	},
+
+	wrap: function( html ) {
+		var htmlIsFunction = isFunction( html );
+
+		return this.each( function( i ) {
+			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
+		} );
+	},
+
+	unwrap: function( selector ) {
+		this.parent( selector ).not( "body" ).each( function() {
+			jQuery( this ).replaceWith( this.childNodes );
+		} );
+		return this;
+	}
+} );
+
+
+jQuery.expr.pseudos.hidden = function( elem ) {
+	return !jQuery.expr.pseudos.visible( elem );
+};
+jQuery.expr.pseudos.visible = function( elem ) {
+	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
+};
+
+
+
+
+jQuery.ajaxSettings.xhr = function() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch ( e ) {}
+};
+
+var xhrSuccessStatus = {
+
+		// File protocol always yields status code 0, assume 200
+		0: 200,
+
+		// Support: IE <=9 only
+		// #1450: sometimes IE returns 1223 when it should be 204
+		1223: 204
+	},
+	xhrSupported = jQuery.ajaxSettings.xhr();
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport( function( options ) {
+	var callback, errorCallback;
+
+	// Cross domain only allowed if supported through XMLHttpRequest
+	if ( support.cors || xhrSupported && !options.crossDomain ) {
+		return {
+			send: function( headers, complete ) {
+				var i,
+					xhr = options.xhr();
+
+				xhr.open(
+					options.type,
+					options.url,
+					options.async,
+					options.username,
+					options.password
+				);
+
+				// Apply custom fields if provided
+				if ( options.xhrFields ) {
+					for ( i in options.xhrFields ) {
+						xhr[ i ] = options.xhrFields[ i ];
+					}
+				}
+
+				// Override mime type if needed
+				if ( options.mimeType && xhr.overrideMimeType ) {
+					xhr.overrideMimeType( options.mimeType );
+				}
+
+				// X-Requested-With header
+				// For cross-domain requests, seeing as conditions for a preflight are
+				// akin to a jigsaw puzzle, we simply never set it to be sure.
+				// (it can always be set on a per-request basis or even using ajaxSetup)
+				// For same-domain requests, won't change header if already provided.
+				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
+					headers[ "X-Requested-With" ] = "XMLHttpRequest";
+				}
+
+				// Set headers
+				for ( i in headers ) {
+					xhr.setRequestHeader( i, headers[ i ] );
+				}
+
+				// Callback
+				callback = function( type ) {
+					return function() {
+						if ( callback ) {
+							callback = errorCallback = xhr.onload =
+								xhr.onerror = xhr.onabort = xhr.ontimeout =
+									xhr.onreadystatechange = null;
+
+							if ( type === "abort" ) {
+								xhr.abort();
+							} else if ( type === "error" ) {
+
+								// Support: IE <=9 only
+								// On a manual native abort, IE9 throws
+								// errors on any property access that is not readyState
+								if ( typeof xhr.status !== "number" ) {
+									complete( 0, "error" );
+								} else {
+									complete(
+
+										// File: protocol always yields status 0; see #8605, #14207
+										xhr.status,
+										xhr.statusText
+									);
+								}
+							} else {
+								complete(
+									xhrSuccessStatus[ xhr.status ] || xhr.status,
+									xhr.statusText,
+
+									// Support: IE <=9 only
+									// IE9 has no XHR2 but throws on binary (trac-11426)
+									// For XHR2 non-text, let the caller handle it (gh-2498)
+									( xhr.responseType || "text" ) !== "text"  ||
+									typeof xhr.responseText !== "string" ?
+										{ binary: xhr.response } :
+										{ text: xhr.responseText },
+									xhr.getAllResponseHeaders()
+								);
+							}
+						}
+					};
+				};
+
+				// Listen to events
+				xhr.onload = callback();
+				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
+
+				// Support: IE 9 only
+				// Use onreadystatechange to replace onabort
+				// to handle uncaught aborts
+				if ( xhr.onabort !== undefined ) {
+					xhr.onabort = errorCallback;
+				} else {
+					xhr.onreadystatechange = function() {
+
+						// Check readyState before timeout as it changes
+						if ( xhr.readyState === 4 ) {
+
+							// Allow onerror to be called first,
+							// but that will not handle a native abort
+							// Also, save errorCallback to a variable
+							// as xhr.onerror cannot be accessed
+							window.setTimeout( function() {
+								if ( callback ) {
+									errorCallback();
+								}
+							} );
+						}
+					};
+				}
+
+				// Create the abort callback
+				callback = callback( "abort" );
+
+				try {
+
+					// Do send the request (this may raise an exception)
+					xhr.send( options.hasContent && options.data || null );
+				} catch ( e ) {
+
+					// #14683: Only rethrow if this hasn't been notified as an error yet
+					if ( callback ) {
+						throw e;
+					}
+				}
+			},
+
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
+jQuery.ajaxPrefilter( function( s ) {
+	if ( s.crossDomain ) {
+		s.contents.script = false;
+	}
+} );
+
+// Install script dataType
+jQuery.ajaxSetup( {
+	accepts: {
+		script: "text/javascript, application/javascript, " +
+			"application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /\b(?:java|ecma)script\b/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+} );
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+	}
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+
+	// This transport only deals with cross domain or forced-by-attrs requests
+	if ( s.crossDomain || s.scriptAttrs ) {
+		var script, callback;
+		return {
+			send: function( _, complete ) {
+				script = jQuery( "<script>" )
+					.attr( s.scriptAttrs || {} )
+					.prop( { charset: s.scriptCharset, src: s.url } )
+					.on( "load error", callback = function( evt ) {
+						script.remove();
+						callback = null;
+						if ( evt ) {
+							complete( evt.type === "error" ? 404 : 200, evt.type );
+						}
+					} );
+
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				document.head.appendChild( script[ 0 ] );
+			},
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup( {
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+} );
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" &&
+				( s.contentType || "" )
+					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+				rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters[ "script json" ] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// Force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always( function() {
+
+			// If previous value didn't exist - remove it
+			if ( overwritten === undefined ) {
+				jQuery( window ).removeProp( callbackName );
+
+			// Otherwise restore preexisting value
+			} else {
+				window[ callbackName ] = overwritten;
+			}
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+
+				// Make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// Save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		} );
+
+		// Delegate to script
+		return "script";
+	}
+} );
+
+
+
+
+// Support: Safari 8 only
+// In Safari 8 documents created via document.implementation.createHTMLDocument
+// collapse sibling forms: the second one becomes a child of the first one.
+// Because of that, this security measure has to be disabled in Safari 8.
+// https://bugs.webkit.org/show_bug.cgi?id=137337
+support.createHTMLDocument = ( function() {
+	var body = document.implementation.createHTMLDocument( "" ).body;
+	body.innerHTML = "<form></form><form></form>";
+	return body.childNodes.length === 2;
+} )();
+
+
+// Argument "data" should be string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+	if ( typeof data !== "string" ) {
+		return [];
+	}
+	if ( typeof context === "boolean" ) {
+		keepScripts = context;
+		context = false;
+	}
+
+	var base, parsed, scripts;
+
+	if ( !context ) {
+
+		// Stop scripts or inline event handlers from being executed immediately
+		// by using document.implementation
+		if ( support.createHTMLDocument ) {
+			context = document.implementation.createHTMLDocument( "" );
+
+			// Set the base href for the created document
+			// so any parsed elements with URLs
+			// are based on the document's URL (gh-2965)
+			base = context.createElement( "base" );
+			base.href = document.location.href;
+			context.head.appendChild( base );
+		} else {
+			context = document;
+		}
+	}
+
+	parsed = rsingleTag.exec( data );
+	scripts = !keepScripts && [];
+
+	// Single tag
+	if ( parsed ) {
+		return [ context.createElement( parsed[ 1 ] ) ];
+	}
+
+	parsed = buildFragment( [ data ], context, scripts );
+
+	if ( scripts && scripts.length ) {
+		jQuery( scripts ).remove();
+	}
+
+	return jQuery.merge( [], parsed.childNodes );
+};
+
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+	var selector, type, response,
+		self = this,
+		off = url.indexOf( " " );
+
+	if ( off > -1 ) {
+		selector = stripAndCollapse( url.slice( off ) );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax( {
+			url: url,
+
+			// If "type" variable is undefined, then "GET" method will be used.
+			// Make value of this field explicit since
+			// user can override it through ajaxSetup method
+			type: type || "GET",
+			dataType: "html",
+			data: params
+		} ).done( function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		// If the request succeeds, this function gets "data", "status", "jqXHR"
+		// but they are ignored because response was set above.
+		// If it fails, this function gets "jqXHR", "status", "error"
+		} ).always( callback && function( jqXHR, status ) {
+			self.each( function() {
+				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+			} );
+		} );
+	}
+
+	return this;
+};
+
+
+
+
+jQuery.expr.pseudos.animated = function( elem ) {
+	return jQuery.grep( jQuery.timers, function( fn ) {
+		return elem === fn.elem;
+	} ).length;
+};
+
+
+
+
+jQuery.offset = {
+	setOffset: function( elem, options, i ) {
+		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+			position = jQuery.css( elem, "position" ),
+			curElem = jQuery( elem ),
+			props = {};
+
+		// Set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		curOffset = curElem.offset();
+		curCSSTop = jQuery.css( elem, "top" );
+		curCSSLeft = jQuery.css( elem, "left" );
+		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
+
+		// Need to be able to calculate position if either
+		// top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( isFunction( options ) ) {
+
+			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+jQuery.fn.extend( {
+
+	// offset() relates an element's border box to the document origin
+	offset: function( options ) {
+
+		// Preserve chaining for setter
+		if ( arguments.length ) {
+			return options === undefined ?
+				this :
+				this.each( function( i ) {
+					jQuery.offset.setOffset( this, options, i );
+				} );
+		}
+
+		var rect, win,
+			elem = this[ 0 ];
+
+		if ( !elem ) {
+			return;
+		}
+
+		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+		// Support: IE <=11 only
+		// Running getBoundingClientRect on a
+		// disconnected node in IE throws an error
+		if ( !elem.getClientRects().length ) {
+			return { top: 0, left: 0 };
+		}
+
+		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
+		rect = elem.getBoundingClientRect();
+		win = elem.ownerDocument.defaultView;
+		return {
+			top: rect.top + win.pageYOffset,
+			left: rect.left + win.pageXOffset
+		};
+	},
+
+	// position() relates an element's margin box to its offset parent's padding box
+	// This corresponds to the behavior of CSS absolute positioning
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset, doc,
+			elem = this[ 0 ],
+			parentOffset = { top: 0, left: 0 };
+
+		// position:fixed elements are offset from the viewport, which itself always has zero offset
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+			// Assume position:fixed implies availability of getBoundingClientRect
+			offset = elem.getBoundingClientRect();
+
+		} else {
+			offset = this.offset();
+
+			// Account for the *real* offset parent, which can be the document or its root element
+			// when a statically positioned element is identified
+			doc = elem.ownerDocument;
+			offsetParent = elem.offsetParent || doc.documentElement;
+			while ( offsetParent &&
+				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
+				jQuery.css( offsetParent, "position" ) === "static" ) {
+
+				offsetParent = offsetParent.parentNode;
+			}
+			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
+
+				// Incorporate borders into its offset, since they are outside its content origin
+				parentOffset = jQuery( offsetParent ).offset();
+				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
+				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
+			}
+		}
+
+		// Subtract parent offsets and element margins
+		return {
+			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+		};
+	},
+
+	// This method will return documentElement in the following cases:
+	// 1) For the element inside the iframe without offsetParent, this method will return
+	//    documentElement of the parent window
+	// 2) For the hidden or detached element
+	// 3) For body or html element, i.e. in case of the html node - it will return itself
+	//
+	// but those exceptions were never presented as a real life use-cases
+	// and might be considered as more preferable results.
+	//
+	// This logic, however, is not guaranteed and can change at any point in the future
+	offsetParent: function() {
+		return this.map( function() {
+			var offsetParent = this.offsetParent;
+
+			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+
+			return offsetParent || documentElement;
+		} );
+	}
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+	var top = "pageYOffset" === prop;
+
+	jQuery.fn[ method ] = function( val ) {
+		return access( this, function( elem, method, val ) {
+
+			// Coalesce documents and windows
+			var win;
+			if ( isWindow( elem ) ) {
+				win = elem;
+			} else if ( elem.nodeType === 9 ) {
+				win = elem.defaultView;
+			}
+
+			if ( val === undefined ) {
+				return win ? win[ prop ] : elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : win.pageXOffset,
+					top ? val : win.pageYOffset
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length );
+	};
+} );
+
+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( _i, prop ) {
+	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+		function( elem, computed ) {
+			if ( computed ) {
+				computed = curCSS( elem, prop );
+
+				// If curCSS returns percentage, fallback to offset
+				return rnumnonpx.test( computed ) ?
+					jQuery( elem ).position()[ prop ] + "px" :
+					computed;
+			}
+		}
+	);
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( {
+		padding: "inner" + name,
+		content: type,
+		"": "outer" + name
+	}, function( defaultExtra, funcName ) {
+
+		// Margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( isWindow( elem ) ) {
+
+					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+					return funcName.indexOf( "outer" ) === 0 ?
+						elem[ "inner" + name ] :
+						elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+					// whichever is greatest
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable );
+		};
+	} );
+} );
+
+
+jQuery.each( [
+	"ajaxStart",
+	"ajaxStop",
+	"ajaxComplete",
+	"ajaxError",
+	"ajaxSuccess",
+	"ajaxSend"
+], function( _i, type ) {
+	jQuery.fn[ type ] = function( fn ) {
+		return this.on( type, fn );
+	};
+} );
+
+
+
+
+jQuery.fn.extend( {
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ?
+			this.off( selector, "**" ) :
+			this.off( types, selector || "**", fn );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+} );
+
+jQuery.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( _i, name ) {
+
+		// Handle event binding
+		jQuery.fn[ name ] = function( data, fn ) {
+			return arguments.length > 0 ?
+				this.on( name, null, data, fn ) :
+				this.trigger( name );
+		};
+	}
+);
+
+
+
+
+// Support: Android <=4.0 only
+// Make sure we trim BOM and NBSP
+var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+// Bind a function to a context, optionally partially applying any
+// arguments.
+// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
+// However, it is not slated for removal any time soon
+jQuery.proxy = function( fn, context ) {
+	var tmp, args, proxy;
+
+	if ( typeof context === "string" ) {
+		tmp = fn[ context ];
+		context = fn;
+		fn = tmp;
+	}
+
+	// Quick check to determine if target is callable, in the spec
+	// this throws a TypeError, but we will just return undefined.
+	if ( !isFunction( fn ) ) {
+		return undefined;
+	}
+
+	// Simulated bind
+	args = slice.call( arguments, 2 );
+	proxy = function() {
+		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+	};
+
+	// Set the guid of unique handler to the same of original handler, so it can be removed
+	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+	return proxy;
+};
+
+jQuery.holdReady = function( hold ) {
+	if ( hold ) {
+		jQuery.readyWait++;
+	} else {
+		jQuery.ready( true );
+	}
+};
+jQuery.isArray = Array.isArray;
+jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
+jQuery.isFunction = isFunction;
+jQuery.isWindow = isWindow;
+jQuery.camelCase = camelCase;
+jQuery.type = toType;
+
+jQuery.now = Date.now;
+
+jQuery.isNumeric = function( obj ) {
+
+	// As of jQuery 3.0, isNumeric is limited to
+	// strings and numbers (primitives or objects)
+	// that can be coerced to finite numbers (gh-2662)
+	var type = jQuery.type( obj );
+	return ( type === "number" || type === "string" ) &&
+
+		// parseFloat NaNs numeric-cast false positives ("")
+		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+		// subtraction forces infinities to NaN
+		!isNaN( obj - parseFloat( obj ) );
+};
+
+jQuery.trim = function( text ) {
+	return text == null ?
+		"" :
+		( text + "" ).replace( rtrim, "" );
+};
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+	define( "jquery", [], function() {
+		return jQuery;
+	} );
+}
+
+
+
+
+var
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+	if ( window.$ === jQuery ) {
+		window.$ = _$;
+	}
+
+	if ( deep && window.jQuery === jQuery ) {
+		window.jQuery = _jQuery;
+	}
+
+	return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === "undefined" ) {
+	window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+} );
+/*
+Turbolinks 5.2.0
+Copyright © 2018 Basecamp, LLC
+ */
+(function(){var t=this;(function(){(function(){this.Turbolinks={supported:function(){return null!=window.history.pushState&&null!=window.requestAnimationFrame&&null!=window.addEventListener}(),visit:function(t,r){return e.controller.visit(t,r)},clearCache:function(){return e.controller.clearCache()},setProgressBarDelay:function(t){return e.controller.setProgressBarDelay(t)}}}).call(this)}).call(t);var e=t.Turbolinks;(function(){(function(){var t,r,n,o=[].slice;e.copyObject=function(t){var e,r,n;r={};for(e in t)n=t[e],r[e]=n;return r},e.closest=function(e,r){return t.call(e,r)},t=function(){var t,e;return t=document.documentElement,null!=(e=t.closest)?e:function(t){var e;for(e=this;e;){if(e.nodeType===Node.ELEMENT_NODE&&r.call(e,t))return e;e=e.parentNode}}}(),e.defer=function(t){return setTimeout(t,1)},e.throttle=function(t){var e;return e=null,function(){var r;return r=1<=arguments.length?o.call(arguments,0):[],null!=e?e:e=requestAnimationFrame(function(n){return function(){return e=null,t.apply(n,r)}}(this))}},e.dispatch=function(t,e){var r,o,i,s,a,u;return a=null!=e?e:{},u=a.target,r=a.cancelable,o=a.data,i=document.createEvent("Events"),i.initEvent(t,!0,r===!0),i.data=null!=o?o:{},i.cancelable&&!n&&(s=i.preventDefault,i.preventDefault=function(){return this.defaultPrevented||Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}}),s.call(this)}),(null!=u?u:document).dispatchEvent(i),i},n=function(){var t;return t=document.createEvent("Events"),t.initEvent("test",!0,!0),t.preventDefault(),t.defaultPrevented}(),e.match=function(t,e){return r.call(t,e)},r=function(){var t,e,r,n;return t=document.documentElement,null!=(e=null!=(r=null!=(n=t.matchesSelector)?n:t.webkitMatchesSelector)?r:t.msMatchesSelector)?e:t.mozMatchesSelector}(),e.uuid=function(){var t,e,r;for(r="",t=e=1;36>=e;t=++e)r+=9===t||14===t||19===t||24===t?"-":15===t?"4":20===t?(Math.floor(4*Math.random())+8).toString(16):Math.floor(15*Math.random()).toString(16);return r}}).call(this),function(){e.Location=function(){function t(t){var e,r;null==t&&(t=""),r=document.createElement("a"),r.href=t.toString(),this.absoluteURL=r.href,e=r.hash.length,2>e?this.requestURL=this.absoluteURL:(this.requestURL=this.absoluteURL.slice(0,-e),this.anchor=r.hash.slice(1))}var e,r,n,o;return t.wrap=function(t){return t instanceof this?t:new this(t)},t.prototype.getOrigin=function(){return this.absoluteURL.split("/",3).join("/")},t.prototype.getPath=function(){var t,e;return null!=(t=null!=(e=this.requestURL.match(/\/\/[^\/]*(\/[^?;]*)/))?e[1]:void 0)?t:"/"},t.prototype.getPathComponents=function(){return this.getPath().split("/").slice(1)},t.prototype.getLastPathComponent=function(){return this.getPathComponents().slice(-1)[0]},t.prototype.getExtension=function(){var t,e;return null!=(t=null!=(e=this.getLastPathComponent().match(/\.[^.]*$/))?e[0]:void 0)?t:""},t.prototype.isHTML=function(){return this.getExtension().match(/^(?:|\.(?:htm|html|xhtml))$/)},t.prototype.isPrefixedBy=function(t){var e;return e=r(t),this.isEqualTo(t)||o(this.absoluteURL,e)},t.prototype.isEqualTo=function(t){return this.absoluteURL===(null!=t?t.absoluteURL:void 0)},t.prototype.toCacheKey=function(){return this.requestURL},t.prototype.toJSON=function(){return this.absoluteURL},t.prototype.toString=function(){return this.absoluteURL},t.prototype.valueOf=function(){return this.absoluteURL},r=function(t){return e(t.getOrigin()+t.getPath())},e=function(t){return n(t,"/")?t:t+"/"},o=function(t,e){return t.slice(0,e.length)===e},n=function(t,e){return t.slice(-e.length)===e},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.HttpRequest=function(){function r(r,n,o){this.delegate=r,this.requestCanceled=t(this.requestCanceled,this),this.requestTimedOut=t(this.requestTimedOut,this),this.requestFailed=t(this.requestFailed,this),this.requestLoaded=t(this.requestLoaded,this),this.requestProgressed=t(this.requestProgressed,this),this.url=e.Location.wrap(n).requestURL,this.referrer=e.Location.wrap(o).absoluteURL,this.createXHR()}return r.NETWORK_FAILURE=0,r.TIMEOUT_FAILURE=-1,r.timeout=60,r.prototype.send=function(){var t;return this.xhr&&!this.sent?(this.notifyApplicationBeforeRequestStart(),this.setProgress(0),this.xhr.send(),this.sent=!0,"function"==typeof(t=this.delegate).requestStarted?t.requestStarted():void 0):void 0},r.prototype.cancel=function(){return this.xhr&&this.sent?this.xhr.abort():void 0},r.prototype.requestProgressed=function(t){return t.lengthComputable?this.setProgress(t.loaded/t.total):void 0},r.prototype.requestLoaded=function(){return this.endRequest(function(t){return function(){var e;return 200<=(e=t.xhr.status)&&300>e?t.delegate.requestCompletedWithResponse(t.xhr.responseText,t.xhr.getResponseHeader("Turbolinks-Location")):(t.failed=!0,t.delegate.requestFailedWithStatusCode(t.xhr.status,t.xhr.responseText))}}(this))},r.prototype.requestFailed=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.NETWORK_FAILURE)}}(this))},r.prototype.requestTimedOut=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.TIMEOUT_FAILURE)}}(this))},r.prototype.requestCanceled=function(){return this.endRequest()},r.prototype.notifyApplicationBeforeRequestStart=function(){return e.dispatch("turbolinks:request-start",{data:{url:this.url,xhr:this.xhr}})},r.prototype.notifyApplicationAfterRequestEnd=function(){return e.dispatch("turbolinks:request-end",{data:{url:this.url,xhr:this.xhr}})},r.prototype.createXHR=function(){return this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url,!0),this.xhr.timeout=1e3*this.constructor.timeout,this.xhr.setRequestHeader("Accept","text/html, application/xhtml+xml"),this.xhr.setRequestHeader("Turbolinks-Referrer",this.referrer),this.xhr.onprogress=this.requestProgressed,this.xhr.onload=this.requestLoaded,this.xhr.onerror=this.requestFailed,this.xhr.ontimeout=this.requestTimedOut,this.xhr.onabort=this.requestCanceled},r.prototype.endRequest=function(t){return this.xhr?(this.notifyApplicationAfterRequestEnd(),null!=t&&t.call(this),this.destroy()):void 0},r.prototype.setProgress=function(t){var e;return this.progress=t,"function"==typeof(e=this.delegate).requestProgressed?e.requestProgressed(this.progress):void 0},r.prototype.destroy=function(){var t;return this.setProgress(1),"function"==typeof(t=this.delegate).requestFinished&&t.requestFinished(),this.delegate=null,this.xhr=null},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.ProgressBar=function(){function e(){this.trickle=t(this.trickle,this),this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement()}var r;return r=300,e.defaultCSS=".turbolinks-progress-bar {\n  position: fixed;\n  display: block;\n  top: 0;\n  left: 0;\n  height: 3px;\n  background: #0076ff;\n  z-index: 9999;\n  transition: width "+r+"ms ease-out, opacity "+r/2+"ms "+r/2+"ms ease-in;\n  transform: translate3d(0, 0, 0);\n}",e.prototype.show=function(){return this.visible?void 0:(this.visible=!0,this.installStylesheetElement(),this.installProgressElement(),this.startTrickling())},e.prototype.hide=function(){return this.visible&&!this.hiding?(this.hiding=!0,this.fadeProgressElement(function(t){return function(){return t.uninstallProgressElement(),t.stopTrickling(),t.visible=!1,t.hiding=!1}}(this))):void 0},e.prototype.setValue=function(t){return this.value=t,this.refresh()},e.prototype.installStylesheetElement=function(){return document.head.insertBefore(this.stylesheetElement,document.head.firstChild)},e.prototype.installProgressElement=function(){return this.progressElement.style.width=0,this.progressElement.style.opacity=1,document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()},e.prototype.fadeProgressElement=function(t){return this.progressElement.style.opacity=0,setTimeout(t,1.5*r)},e.prototype.uninstallProgressElement=function(){return this.progressElement.parentNode?document.documentElement.removeChild(this.progressElement):void 0},e.prototype.startTrickling=function(){return null!=this.trickleInterval?this.trickleInterval:this.trickleInterval=setInterval(this.trickle,r)},e.prototype.stopTrickling=function(){return clearInterval(this.trickleInterval),this.trickleInterval=null},e.prototype.trickle=function(){return this.setValue(this.value+Math.random()/100)},e.prototype.refresh=function(){return requestAnimationFrame(function(t){return function(){return t.progressElement.style.width=10+90*t.value+"%"}}(this))},e.prototype.createStylesheetElement=function(){var t;return t=document.createElement("style"),t.type="text/css",t.textContent=this.constructor.defaultCSS,t},e.prototype.createProgressElement=function(){var t;return t=document.createElement("div"),t.className="turbolinks-progress-bar",t},e}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.BrowserAdapter=function(){function r(r){this.controller=r,this.showProgressBar=t(this.showProgressBar,this),this.progressBar=new e.ProgressBar}var n,o,i;return i=e.HttpRequest,n=i.NETWORK_FAILURE,o=i.TIMEOUT_FAILURE,r.prototype.visitProposedToLocationWithAction=function(t,e){return this.controller.startVisitToLocationWithAction(t,e)},r.prototype.visitStarted=function(t){return t.issueRequest(),t.changeHistory(),t.loadCachedSnapshot()},r.prototype.visitRequestStarted=function(t){return this.progressBar.setValue(0),t.hasCachedSnapshot()||"restore"!==t.action?this.showProgressBarAfterDelay():this.showProgressBar()},r.prototype.visitRequestProgressed=function(t){return this.progressBar.setValue(t.progress)},r.prototype.visitRequestCompleted=function(t){return t.loadResponse()},r.prototype.visitRequestFailedWithStatusCode=function(t,e){switch(e){case n:case o:return this.reload();default:return t.loadResponse()}},r.prototype.visitRequestFinished=function(t){return this.hideProgressBar()},r.prototype.visitCompleted=function(t){return t.followRedirect()},r.prototype.pageInvalidated=function(){return this.reload()},r.prototype.showProgressBarAfterDelay=function(){return this.progressBarTimeout=setTimeout(this.showProgressBar,this.controller.progressBarDelay)},r.prototype.showProgressBar=function(){return this.progressBar.show()},r.prototype.hideProgressBar=function(){return this.progressBar.hide(),clearTimeout(this.progressBarTimeout)},r.prototype.reload=function(){return window.location.reload()},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.History=function(){function r(e){this.delegate=e,this.onPageLoad=t(this.onPageLoad,this),this.onPopState=t(this.onPopState,this)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("popstate",this.onPopState,!1),addEventListener("load",this.onPageLoad,!1),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("popstate",this.onPopState,!1),removeEventListener("load",this.onPageLoad,!1),this.started=!1):void 0},r.prototype.push=function(t,r){return t=e.Location.wrap(t),this.update("push",t,r)},r.prototype.replace=function(t,r){return t=e.Location.wrap(t),this.update("replace",t,r)},r.prototype.onPopState=function(t){var r,n,o,i;return this.shouldHandlePopState()&&(i=null!=(n=t.state)?n.turbolinks:void 0)?(r=e.Location.wrap(window.location),o=i.restorationIdentifier,this.delegate.historyPoppedToLocationWithRestorationIdentifier(r,o)):void 0},r.prototype.onPageLoad=function(t){return e.defer(function(t){return function(){return t.pageLoaded=!0}}(this))},r.prototype.shouldHandlePopState=function(){return this.pageIsLoaded()},r.prototype.pageIsLoaded=function(){return this.pageLoaded||"complete"===document.readyState},r.prototype.update=function(t,e,r){var n;return n={turbolinks:{restorationIdentifier:r}},history[t+"State"](n,null,e)},r}()}.call(this),function(){e.HeadDetails=function(){function t(t){var e,r,n,s,a,u;for(this.elements={},n=0,a=t.length;a>n;n++)u=t[n],u.nodeType===Node.ELEMENT_NODE&&(s=u.outerHTML,r=null!=(e=this.elements)[s]?e[s]:e[s]={type:i(u),tracked:o(u),elements:[]},r.elements.push(u))}var e,r,n,o,i;return t.fromHeadElement=function(t){var e;return new this(null!=(e=null!=t?t.childNodes:void 0)?e:[])},t.prototype.hasElementWithKey=function(t){return t in this.elements},t.prototype.getTrackedElementSignature=function(){var t,e;return function(){var r,n;r=this.elements,n=[];for(t in r)e=r[t].tracked,e&&n.push(t);return n}.call(this).join("")},t.prototype.getScriptElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("script",t)},t.prototype.getStylesheetElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("stylesheet",t)},t.prototype.getElementsMatchingTypeNotInDetails=function(t,e){var r,n,o,i,s,a;o=this.elements,s=[];for(n in o)i=o[n],a=i.type,r=i.elements,a!==t||e.hasElementWithKey(n)||s.push(r[0]);return s},t.prototype.getProvisionalElements=function(){var t,e,r,n,o,i,s;r=[],n=this.elements;for(e in n)o=n[e],s=o.type,i=o.tracked,t=o.elements,null!=s||i?t.length>1&&r.push.apply(r,t.slice(1)):r.push.apply(r,t);return r},t.prototype.getMetaValue=function(t){var e;return null!=(e=this.findMetaElementByName(t))?e.getAttribute("content"):void 0},t.prototype.findMetaElementByName=function(t){var r,n,o,i;r=void 0,i=this.elements;for(o in i)n=i[o].elements,e(n[0],t)&&(r=n[0]);return r},i=function(t){return r(t)?"script":n(t)?"stylesheet":void 0},o=function(t){return"reload"===t.getAttribute("data-turbolinks-track")},r=function(t){var e;return e=t.tagName.toLowerCase(),"script"===e},n=function(t){var e;return e=t.tagName.toLowerCase(),"style"===e||"link"===e&&"stylesheet"===t.getAttribute("rel")},e=function(t,e){var r;return r=t.tagName.toLowerCase(),"meta"===r&&t.getAttribute("name")===e},t}()}.call(this),function(){e.Snapshot=function(){function t(t,e){this.headDetails=t,this.bodyElement=e}return t.wrap=function(t){return t instanceof this?t:"string"==typeof t?this.fromHTMLString(t):this.fromHTMLElement(t)},t.fromHTMLString=function(t){var e;return e=document.createElement("html"),e.innerHTML=t,this.fromHTMLElement(e)},t.fromHTMLElement=function(t){var r,n,o,i;return o=t.querySelector("head"),r=null!=(i=t.querySelector("body"))?i:document.createElement("body"),n=e.HeadDetails.fromHeadElement(o),new this(n,r)},t.prototype.clone=function(){return new this.constructor(this.headDetails,this.bodyElement.cloneNode(!0))},t.prototype.getRootLocation=function(){var t,r;return r=null!=(t=this.getSetting("root"))?t:"/",new e.Location(r)},t.prototype.getCacheControlValue=function(){return this.getSetting("cache-control")},t.prototype.getElementForAnchor=function(t){try{return this.bodyElement.querySelector("[id='"+t+"'], a[name='"+t+"']")}catch(e){}},t.prototype.getPermanentElements=function(){return this.bodyElement.querySelectorAll("[id][data-turbolinks-permanent]")},t.prototype.getPermanentElementById=function(t){return this.bodyElement.querySelector("#"+t+"[data-turbolinks-permanent]")},t.prototype.getPermanentElementsPresentInSnapshot=function(t){var e,r,n,o,i;for(o=this.getPermanentElements(),i=[],r=0,n=o.length;n>r;r++)e=o[r],t.getPermanentElementById(e.id)&&i.push(e);return i},t.prototype.findFirstAutofocusableElement=function(){return this.bodyElement.querySelector("[autofocus]")},t.prototype.hasAnchor=function(t){return null!=this.getElementForAnchor(t)},t.prototype.isPreviewable=function(){return"no-preview"!==this.getCacheControlValue()},t.prototype.isCacheable=function(){return"no-cache"!==this.getCacheControlValue()},t.prototype.isVisitable=function(){return"reload"!==this.getSetting("visit-control")},t.prototype.getSetting=function(t){return this.headDetails.getMetaValue("turbolinks-"+t)},t}()}.call(this),function(){var t=[].slice;e.Renderer=function(){function e(){}var r;return e.render=function(){var e,r,n,o;return n=arguments[0],r=arguments[1],e=3<=arguments.length?t.call(arguments,2):[],o=function(t,e,r){r.prototype=t.prototype;var n=new r,o=t.apply(n,e);return Object(o)===o?o:n}(this,e,function(){}),o.delegate=n,o.render(r),o},e.prototype.renderView=function(t){return this.delegate.viewWillRender(this.newBody),t(),this.delegate.viewRendered(this.newBody)},e.prototype.invalidateView=function(){return this.delegate.viewInvalidated()},e.prototype.createScriptElement=function(t){var e;return"false"===t.getAttribute("data-turbolinks-eval")?t:(e=document.createElement("script"),e.textContent=t.textContent,e.async=!1,r(e,t),e)},r=function(t,e){var r,n,o,i,s,a,u;for(i=e.attributes,a=[],r=0,n=i.length;n>r;r++)s=i[r],o=s.name,u=s.value,a.push(t.setAttribute(o,u));return a},e}()}.call(this),function(){var t,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;e.SnapshotRenderer=function(e){function o(t,e,r){this.currentSnapshot=t,this.newSnapshot=e,this.isPreview=r,this.currentHeadDetails=this.currentSnapshot.headDetails,this.newHeadDetails=this.newSnapshot.headDetails,this.currentBody=this.currentSnapshot.bodyElement,this.newBody=this.newSnapshot.bodyElement}return n(o,e),o.prototype.render=function(t){return this.shouldRender()?(this.mergeHead(),this.renderView(function(e){return function(){return e.replaceBody(),e.isPreview||e.focusFirstAutofocusableElement(),t()}}(this))):this.invalidateView()},o.prototype.mergeHead=function(){return this.copyNewHeadStylesheetElements(),this.copyNewHeadScriptElements(),this.removeCurrentHeadProvisionalElements(),this.copyNewHeadProvisionalElements()},o.prototype.replaceBody=function(){var t;return t=this.relocateCurrentBodyPermanentElements(),this.activateNewBodyScriptElements(),this.assignNewBody(),this.replacePlaceholderElementsWithClonedPermanentElements(t)},o.prototype.shouldRender=function(){return this.newSnapshot.isVisitable()&&this.trackedElementsAreIdentical()},o.prototype.trackedElementsAreIdentical=function(){return this.currentHeadDetails.getTrackedElementSignature()===this.newHeadDetails.getTrackedElementSignature()},o.prototype.copyNewHeadStylesheetElements=function(){var t,e,r,n,o;for(n=this.getNewHeadStylesheetElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},o.prototype.copyNewHeadScriptElements=function(){var t,e,r,n,o;for(n=this.getNewHeadScriptElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(this.createScriptElement(t)));return o},o.prototype.removeCurrentHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getCurrentHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.removeChild(t));return o},o.prototype.copyNewHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getNewHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},o.prototype.relocateCurrentBodyPermanentElements=function(){var e,n,o,i,s,a,u;for(a=this.getCurrentBodyPermanentElements(),u=[],e=0,n=a.length;n>e;e++)i=a[e],s=t(i),o=this.newSnapshot.getPermanentElementById(i.id),r(i,s.element),r(o,i),u.push(s);return u},o.prototype.replacePlaceholderElementsWithClonedPermanentElements=function(t){var e,n,o,i,s,a,u;for(u=[],o=0,i=t.length;i>o;o++)a=t[o],n=a.element,s=a.permanentElement,e=s.cloneNode(!0),u.push(r(n,e));return u},o.prototype.activateNewBodyScriptElements=function(){var t,e,n,o,i,s;for(i=this.getNewBodyScriptElements(),s=[],e=0,o=i.length;o>e;e++)n=i[e],t=this.createScriptElement(n),s.push(r(n,t));return s},o.prototype.assignNewBody=function(){return document.body=this.newBody},o.prototype.focusFirstAutofocusableElement=function(){var t;return null!=(t=this.newSnapshot.findFirstAutofocusableElement())?t.focus():void 0},o.prototype.getNewHeadStylesheetElements=function(){return this.newHeadDetails.getStylesheetElementsNotInDetails(this.currentHeadDetails)},o.prototype.getNewHeadScriptElements=function(){return this.newHeadDetails.getScriptElementsNotInDetails(this.currentHeadDetails)},o.prototype.getCurrentHeadProvisionalElements=function(){return this.currentHeadDetails.getProvisionalElements()},o.prototype.getNewHeadProvisionalElements=function(){return this.newHeadDetails.getProvisionalElements()},o.prototype.getCurrentBodyPermanentElements=function(){return this.currentSnapshot.getPermanentElementsPresentInSnapshot(this.newSnapshot)},o.prototype.getNewBodyScriptElements=function(){return this.newBody.querySelectorAll("script")},o}(e.Renderer),t=function(t){var e;return e=document.createElement("meta"),e.setAttribute("name","turbolinks-permanent-placeholder"),e.setAttribute("content",t.id),{element:e,permanentElement:t}},r=function(t,e){var r;return(r=t.parentNode)?r.replaceChild(e,t):void 0}}.call(this),function(){var t=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;e.ErrorRenderer=function(e){function r(t){var e;e=document.createElement("html"),e.innerHTML=t,this.newHead=e.querySelector("head"),this.newBody=e.querySelector("body")}return t(r,e),r.prototype.render=function(t){return this.renderView(function(e){return function(){return e.replaceHeadAndBody(),e.activateBodyScriptElements(),t()}}(this))},r.prototype.replaceHeadAndBody=function(){var t,e;return e=document.head,t=document.body,e.parentNode.replaceChild(this.newHead,e),t.parentNode.replaceChild(this.newBody,t)},r.prototype.activateBodyScriptElements=function(){var t,e,r,n,o,i;for(n=this.getScriptElements(),i=[],e=0,r=n.length;r>e;e++)o=n[e],t=this.createScriptElement(o),i.push(o.parentNode.replaceChild(t,o));return i},r.prototype.getScriptElements=function(){return document.documentElement.querySelectorAll("script")},r}(e.Renderer)}.call(this),function(){e.View=function(){function t(t){this.delegate=t,this.htmlElement=document.documentElement}return t.prototype.getRootLocation=function(){return this.getSnapshot().getRootLocation()},t.prototype.getElementForAnchor=function(t){return this.getSnapshot().getElementForAnchor(t)},t.prototype.getSnapshot=function(){return e.Snapshot.fromHTMLElement(this.htmlElement)},t.prototype.render=function(t,e){var r,n,o;return o=t.snapshot,r=t.error,n=t.isPreview,this.markAsPreview(n),null!=o?this.renderSnapshot(o,n,e):this.renderError(r,e)},t.prototype.markAsPreview=function(t){return t?this.htmlElement.setAttribute("data-turbolinks-preview",""):this.htmlElement.removeAttribute("data-turbolinks-preview")},t.prototype.renderSnapshot=function(t,r,n){return e.SnapshotRenderer.render(this.delegate,n,this.getSnapshot(),e.Snapshot.wrap(t),r)},t.prototype.renderError=function(t,r){return e.ErrorRenderer.render(this.delegate,r,t)},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.ScrollManager=function(){function r(r){this.delegate=r,this.onScroll=t(this.onScroll,this),this.onScroll=e.throttle(this.onScroll)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("scroll",this.onScroll,!1),this.onScroll(),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("scroll",this.onScroll,!1),this.started=!1):void 0},r.prototype.scrollToElement=function(t){return t.scrollIntoView()},r.prototype.scrollToPosition=function(t){var e,r;return e=t.x,r=t.y,window.scrollTo(e,r)},r.prototype.onScroll=function(t){return this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})},r.prototype.updatePosition=function(t){var e;return this.position=t,null!=(e=this.delegate)?e.scrollPositionChanged(this.position):void 0},r}()}.call(this),function(){e.SnapshotCache=function(){function t(t){this.size=t,this.keys=[],this.snapshots={}}var r;return t.prototype.has=function(t){var e;return e=r(t),e in this.snapshots},t.prototype.get=function(t){var e;if(this.has(t))return e=this.read(t),this.touch(t),e},t.prototype.put=function(t,e){return this.write(t,e),this.touch(t),e},t.prototype.read=function(t){var e;return e=r(t),this.snapshots[e]},t.prototype.write=function(t,e){var n;return n=r(t),this.snapshots[n]=e},t.prototype.touch=function(t){var e,n;return n=r(t),e=this.keys.indexOf(n),e>-1&&this.keys.splice(e,1),this.keys.unshift(n),this.trim()},t.prototype.trim=function(){var t,e,r,n,o;for(n=this.keys.splice(this.size),o=[],t=0,r=n.length;r>t;t++)e=n[t],o.push(delete this.snapshots[e]);return o},r=function(t){return e.Location.wrap(t).toCacheKey()},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Visit=function(){function r(r,n,o){this.controller=r,this.action=o,this.performScroll=t(this.performScroll,this),this.identifier=e.uuid(),this.location=e.Location.wrap(n),this.adapter=this.controller.adapter,this.state="initialized",this.timingMetrics={}}var n;return r.prototype.start=function(){return"initialized"===this.state?(this.recordTimingMetric("visitStart"),this.state="started",this.adapter.visitStarted(this)):void 0},r.prototype.cancel=function(){var t;return"started"===this.state?(null!=(t=this.request)&&t.cancel(),this.cancelRender(),this.state="canceled"):void 0},r.prototype.complete=function(){var t;return"started"===this.state?(this.recordTimingMetric("visitEnd"),this.state="completed","function"==typeof(t=this.adapter).visitCompleted&&t.visitCompleted(this),this.controller.visitCompleted(this)):void 0},r.prototype.fail=function(){var t;return"started"===this.state?(this.state="failed","function"==typeof(t=this.adapter).visitFailed?t.visitFailed(this):void 0):void 0},r.prototype.changeHistory=function(){var t,e;return this.historyChanged?void 0:(t=this.location.isEqualTo(this.referrer)?"replace":this.action,e=n(t),this.controller[e](this.location,this.restorationIdentifier),this.historyChanged=!0)},r.prototype.issueRequest=function(){return this.shouldIssueRequest()&&null==this.request?(this.progress=0,this.request=new e.HttpRequest(this,this.location,this.referrer),this.request.send()):void 0},r.prototype.getCachedSnapshot=function(){var t;return!(t=this.controller.getCachedSnapshotForLocation(this.location))||null!=this.location.anchor&&!t.hasAnchor(this.location.anchor)||"restore"!==this.action&&!t.isPreviewable()?void 0:t},r.prototype.hasCachedSnapshot=function(){return null!=this.getCachedSnapshot()},r.prototype.loadCachedSnapshot=function(){var t,e;return(e=this.getCachedSnapshot())?(t=this.shouldIssueRequest(),this.render(function(){var r;return this.cacheSnapshot(),this.controller.render({snapshot:e,isPreview:t},this.performScroll),"function"==typeof(r=this.adapter).visitRendered&&r.visitRendered(this),t?void 0:this.complete()})):void 0},r.prototype.loadResponse=function(){return null!=this.response?this.render(function(){var t,e;return this.cacheSnapshot(),this.request.failed?(this.controller.render({error:this.response},this.performScroll),"function"==typeof(t=this.adapter).visitRendered&&t.visitRendered(this),this.fail()):(this.controller.render({snapshot:this.response},this.performScroll),"function"==typeof(e=this.adapter).visitRendered&&e.visitRendered(this),this.complete())}):void 0},r.prototype.followRedirect=function(){return this.redirectedToLocation&&!this.followedRedirect?(this.location=this.redirectedToLocation,this.controller.replaceHistoryWithLocationAndRestorationIdentifier(this.redirectedToLocation,this.restorationIdentifier),this.followedRedirect=!0):void 0},r.prototype.requestStarted=function(){var t;return this.recordTimingMetric("requestStart"),"function"==typeof(t=this.adapter).visitRequestStarted?t.visitRequestStarted(this):void 0},r.prototype.requestProgressed=function(t){var e;return this.progress=t,"function"==typeof(e=this.adapter).visitRequestProgressed?e.visitRequestProgressed(this):void 0},r.prototype.requestCompletedWithResponse=function(t,r){return this.response=t,null!=r&&(this.redirectedToLocation=e.Location.wrap(r)),this.adapter.visitRequestCompleted(this)},r.prototype.requestFailedWithStatusCode=function(t,e){return this.response=e,this.adapter.visitRequestFailedWithStatusCode(this,t)},r.prototype.requestFinished=function(){var t;return this.recordTimingMetric("requestEnd"),"function"==typeof(t=this.adapter).visitRequestFinished?t.visitRequestFinished(this):void 0},r.prototype.performScroll=function(){return this.scrolled?void 0:("restore"===this.action?this.scrollToRestoredPosition()||this.scrollToTop():this.scrollToAnchor()||this.scrollToTop(),this.scrolled=!0)},r.prototype.scrollToRestoredPosition=function(){var t,e;return t=null!=(e=this.restorationData)?e.scrollPosition:void 0,null!=t?(this.controller.scrollToPosition(t),!0):void 0},r.prototype.scrollToAnchor=function(){return null!=this.location.anchor?(this.controller.scrollToAnchor(this.location.anchor),!0):void 0},r.prototype.scrollToTop=function(){return this.controller.scrollToPosition({x:0,y:0})},r.prototype.recordTimingMetric=function(t){var e;return null!=(e=this.timingMetrics)[t]?e[t]:e[t]=(new Date).getTime()},r.prototype.getTimingMetrics=function(){return e.copyObject(this.timingMetrics)},n=function(t){switch(t){case"replace":return"replaceHistoryWithLocationAndRestorationIdentifier";case"advance":case"restore":return"pushHistoryWithLocationAndRestorationIdentifier"}},r.prototype.shouldIssueRequest=function(){return"restore"===this.action?!this.hasCachedSnapshot():!0},r.prototype.cacheSnapshot=function(){return this.snapshotCached?void 0:(this.controller.cacheSnapshot(),this.snapshotCached=!0)},r.prototype.render=function(t){return this.cancelRender(),this.frame=requestAnimationFrame(function(e){return function(){return e.frame=null,t.call(e)}}(this))},r.prototype.cancelRender=function(){return this.frame?cancelAnimationFrame(this.frame):void 0},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Controller=function(){function r(){this.clickBubbled=t(this.clickBubbled,this),this.clickCaptured=t(this.clickCaptured,this),this.pageLoaded=t(this.pageLoaded,this),this.history=new e.History(this),this.view=new e.View(this),this.scrollManager=new e.ScrollManager(this),this.restorationData={},this.clearCache(),this.setProgressBarDelay(500)}return r.prototype.start=function(){return e.supported&&!this.started?(addEventListener("click",this.clickCaptured,!0),addEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.start(),this.startHistory(),this.started=!0,this.enabled=!0):void 0},r.prototype.disable=function(){return this.enabled=!1},r.prototype.stop=function(){return this.started?(removeEventListener("click",this.clickCaptured,!0),removeEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.stop(),this.stopHistory(),this.started=!1):void 0},r.prototype.clearCache=function(){return this.cache=new e.SnapshotCache(10)},r.prototype.visit=function(t,r){var n,o;return null==r&&(r={}),t=e.Location.wrap(t),this.applicationAllowsVisitingLocation(t)?this.locationIsVisitable(t)?(n=null!=(o=r.action)?o:"advance",this.adapter.visitProposedToLocationWithAction(t,n)):window.location=t:void 0},r.prototype.startVisitToLocationWithAction=function(t,r,n){var o;return e.supported?(o=this.getRestorationDataForIdentifier(n),this.startVisit(t,r,{restorationData:o})):window.location=t},r.prototype.setProgressBarDelay=function(t){return this.progressBarDelay=t},r.prototype.startHistory=function(){return this.location=e.Location.wrap(window.location),this.restorationIdentifier=e.uuid(),this.history.start(),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.stopHistory=function(){return this.history.stop()},r.prototype.pushHistoryWithLocationAndRestorationIdentifier=function(t,r){return this.restorationIdentifier=r,this.location=e.Location.wrap(t),this.history.push(this.location,this.restorationIdentifier)},r.prototype.replaceHistoryWithLocationAndRestorationIdentifier=function(t,r){return this.restorationIdentifier=r,this.location=e.Location.wrap(t),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.historyPoppedToLocationWithRestorationIdentifier=function(t,r){var n;return this.restorationIdentifier=r,this.enabled?(n=this.getRestorationDataForIdentifier(this.restorationIdentifier),this.startVisit(t,"restore",{restorationIdentifier:this.restorationIdentifier,restorationData:n,historyChanged:!0}),this.location=e.Location.wrap(t)):this.adapter.pageInvalidated()},r.prototype.getCachedSnapshotForLocation=function(t){var e;return null!=(e=this.cache.get(t))?e.clone():void 0},r.prototype.shouldCacheSnapshot=function(){return this.view.getSnapshot().isCacheable();
+},r.prototype.cacheSnapshot=function(){var t,r;return this.shouldCacheSnapshot()?(this.notifyApplicationBeforeCachingSnapshot(),r=this.view.getSnapshot(),t=this.lastRenderedLocation,e.defer(function(e){return function(){return e.cache.put(t,r.clone())}}(this))):void 0},r.prototype.scrollToAnchor=function(t){var e;return(e=this.view.getElementForAnchor(t))?this.scrollToElement(e):this.scrollToPosition({x:0,y:0})},r.prototype.scrollToElement=function(t){return this.scrollManager.scrollToElement(t)},r.prototype.scrollToPosition=function(t){return this.scrollManager.scrollToPosition(t)},r.prototype.scrollPositionChanged=function(t){var e;return e=this.getCurrentRestorationData(),e.scrollPosition=t},r.prototype.render=function(t,e){return this.view.render(t,e)},r.prototype.viewInvalidated=function(){return this.adapter.pageInvalidated()},r.prototype.viewWillRender=function(t){return this.notifyApplicationBeforeRender(t)},r.prototype.viewRendered=function(){return this.lastRenderedLocation=this.currentVisit.location,this.notifyApplicationAfterRender()},r.prototype.pageLoaded=function(){return this.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()},r.prototype.clickCaptured=function(){return removeEventListener("click",this.clickBubbled,!1),addEventListener("click",this.clickBubbled,!1)},r.prototype.clickBubbled=function(t){var e,r,n;return this.enabled&&this.clickEventIsSignificant(t)&&(r=this.getVisitableLinkForNode(t.target))&&(n=this.getVisitableLocationForLink(r))&&this.applicationAllowsFollowingLinkToLocation(r,n)?(t.preventDefault(),e=this.getActionForLink(r),this.visit(n,{action:e})):void 0},r.prototype.applicationAllowsFollowingLinkToLocation=function(t,e){var r;return r=this.notifyApplicationAfterClickingLinkToLocation(t,e),!r.defaultPrevented},r.prototype.applicationAllowsVisitingLocation=function(t){var e;return e=this.notifyApplicationBeforeVisitingLocation(t),!e.defaultPrevented},r.prototype.notifyApplicationAfterClickingLinkToLocation=function(t,r){return e.dispatch("turbolinks:click",{target:t,data:{url:r.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationBeforeVisitingLocation=function(t){return e.dispatch("turbolinks:before-visit",{data:{url:t.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationAfterVisitingLocation=function(t){return e.dispatch("turbolinks:visit",{data:{url:t.absoluteURL}})},r.prototype.notifyApplicationBeforeCachingSnapshot=function(){return e.dispatch("turbolinks:before-cache")},r.prototype.notifyApplicationBeforeRender=function(t){return e.dispatch("turbolinks:before-render",{data:{newBody:t}})},r.prototype.notifyApplicationAfterRender=function(){return e.dispatch("turbolinks:render")},r.prototype.notifyApplicationAfterPageLoad=function(t){return null==t&&(t={}),e.dispatch("turbolinks:load",{data:{url:this.location.absoluteURL,timing:t}})},r.prototype.startVisit=function(t,e,r){var n;return null!=(n=this.currentVisit)&&n.cancel(),this.currentVisit=this.createVisit(t,e,r),this.currentVisit.start(),this.notifyApplicationAfterVisitingLocation(t)},r.prototype.createVisit=function(t,r,n){var o,i,s,a,u;return i=null!=n?n:{},a=i.restorationIdentifier,s=i.restorationData,o=i.historyChanged,u=new e.Visit(this,t,r),u.restorationIdentifier=null!=a?a:e.uuid(),u.restorationData=e.copyObject(s),u.historyChanged=o,u.referrer=this.location,u},r.prototype.visitCompleted=function(t){return this.notifyApplicationAfterPageLoad(t.getTimingMetrics())},r.prototype.clickEventIsSignificant=function(t){return!(t.defaultPrevented||t.target.isContentEditable||t.which>1||t.altKey||t.ctrlKey||t.metaKey||t.shiftKey)},r.prototype.getVisitableLinkForNode=function(t){return this.nodeIsVisitable(t)?e.closest(t,"a[href]:not([target]):not([download])"):void 0},r.prototype.getVisitableLocationForLink=function(t){var r;return r=new e.Location(t.getAttribute("href")),this.locationIsVisitable(r)?r:void 0},r.prototype.getActionForLink=function(t){var e;return null!=(e=t.getAttribute("data-turbolinks-action"))?e:"advance"},r.prototype.nodeIsVisitable=function(t){var r;return(r=e.closest(t,"[data-turbolinks]"))?"false"!==r.getAttribute("data-turbolinks"):!0},r.prototype.locationIsVisitable=function(t){return t.isPrefixedBy(this.view.getRootLocation())&&t.isHTML()},r.prototype.getCurrentRestorationData=function(){return this.getRestorationDataForIdentifier(this.restorationIdentifier)},r.prototype.getRestorationDataForIdentifier=function(t){var e;return null!=(e=this.restorationData)[t]?e[t]:e[t]={}},r}()}.call(this),function(){!function(){var t,e;if((t=e=document.currentScript)&&!e.hasAttribute("data-turbolinks-suppress-warning"))for(;t=t.parentNode;)if(t===document.body)return console.warn("You are loading Turbolinks from a <script> element inside the <body> element. This is probably not what you meant to do!\n\nLoad your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\nFor more information, see: https://github.com/turbolinks/turbolinks#working-with-script-elements\n\n\u2014\u2014\nSuppress this warning by adding a `data-turbolinks-suppress-warning` attribute to: %s",e.outerHTML)}()}.call(this),function(){var t,r,n;e.start=function(){return r()?(null==e.controller&&(e.controller=t()),e.controller.start()):void 0},r=function(){return null==window.Turbolinks&&(window.Turbolinks=e),n()},t=function(){var t;return t=new e.Controller,t.adapter=new e.BrowserAdapter(t),t},n=function(){return window.Turbolinks===e},n()&&e.start()}.call(this)}).call(this),"object"==typeof module&&module.exports?module.exports=e:"function"==typeof define&&define.amd&&define(e)}).call(this);
+(function() {
+  var visit;
+
+  $(document).on('turbolinks:load', function() {
+    $('table.list td.view a').each(function() {
+      return visit($(this));
+    });
+    return $('.pagination .next a').attr('data-remote', true).each(function() {
+      return $(document).scroll((function(_this) {
+        return function() {
+          if ($(_this).visible(true, true)) {
+            return $(_this).click().parents('.pagination').hide();
+          }
+        };
+      })(this));
+    });
+  });
+
+  $(document).on('ajax:success', '.pagination .next a', function(event, data) {
+    var next;
+    $(this).parents('tfoot').prev().append($('tbody tr', data)).find('td.view a').each(function() {
+      return visit($(this));
+    });
+    next = $('.pagination .next a', data).attr('href');
+    if (next != null) {
+      return $(this).attr('href', next).parents('.pagination').show();
+    }
+  });
+
+  visit = (function(_this) {
+    return function(elt) {
+      return elt.closest('tr').addClass('view').click(function(event) {
+        var target;
+        target = $(event.target);
+        if (!((target.attr('target') != null) || (target.parents('a').attr('target') != null))) {
+          return Turbolinks.visit(elt.attr('href'));
+        }
+      });
+    };
+  })(this);
+
+}).call(this);
+(function() {
+
+
+}).call(this);
diff --git a/public/assets/active_admin-eb8733db747437591c1328e50a95f8ee1a686b381b1db446272df3d19f775b15.js.gz b/public/assets/active_admin-eb8733db747437591c1328e50a95f8ee1a686b381b1db446272df3d19f775b15.js.gz
new file mode 100644
index 0000000000000000000000000000000000000000..1fe1750d539ecb5e177ca915679d1a13cf3c6580
Binary files /dev/null and b/public/assets/active_admin-eb8733db747437591c1328e50a95f8ee1a686b381b1db446272df3d19f775b15.js.gz differ
diff --git a/public/assets/application-3313ec750e3521e59e004f73503bf5ff08f41fd4f0e41d6c6a391b23e375797d.js b/public/assets/application-3313ec750e3521e59e004f73503bf5ff08f41fd4f0e41d6c6a391b23e375797d.js
new file mode 100644
index 0000000000000000000000000000000000000000..90ac1f8e718600e5d9725f3c09ed359e15ddbe14
--- /dev/null
+++ b/public/assets/application-3313ec750e3521e59e004f73503bf5ff08f41fd4f0e41d6c6a391b23e375797d.js
@@ -0,0 +1,54476 @@
+/*
+ * File: iframeResizer.js
+ * Desc: Force iframes to size to content.
+ * Requires: iframeResizer.contentWindow.js to be loaded into the target frame.
+ * Doc: https://github.com/davidjbradshaw/iframe-resizer
+ * Author: David J. Bradshaw - dave@bradshaw.net
+ * Contributor: Jure Mav - jure.mav@gmail.com
+ * Contributor: Reed Dadoune - reed@dadoune.com
+ */
+
+// eslint-disable-next-line sonarjs/cognitive-complexity, no-shadow-restricted-names
+;(function(undefined) {
+  if (typeof window === 'undefined') return // don't run for server side render
+
+  var count = 0,
+    logEnabled = false,
+    hiddenCheckEnabled = false,
+    msgHeader = 'message',
+    msgHeaderLen = msgHeader.length,
+    msgId = '[iFrameSizer]', // Must match iframe msg ID
+    msgIdLen = msgId.length,
+    pagePosition = null,
+    requestAnimationFrame = window.requestAnimationFrame,
+    resetRequiredMethods = {
+      max: 1,
+      scroll: 1,
+      bodyScroll: 1,
+      documentElementScroll: 1
+    },
+    settings = {},
+    timer = null,
+    defaults = {
+      autoResize: true,
+      bodyBackground: null,
+      bodyMargin: null,
+      bodyMarginV1: 8,
+      bodyPadding: null,
+      checkOrigin: true,
+      inPageLinks: false,
+      enablePublicMethods: true,
+      heightCalculationMethod: 'bodyOffset',
+      id: 'iFrameResizer',
+      interval: 32,
+      log: false,
+      maxHeight: Infinity,
+      maxWidth: Infinity,
+      minHeight: 0,
+      minWidth: 0,
+      resizeFrom: 'parent',
+      scrolling: false,
+      sizeHeight: true,
+      sizeWidth: false,
+      warningTimeout: 5000,
+      tolerance: 0,
+      widthCalculationMethod: 'scroll',
+      onClosed: function() {},
+      onInit: function() {},
+      onMessage: function() {
+        warn('onMessage function not defined')
+      },
+      onResized: function() {},
+      onScroll: function() {
+        return true
+      }
+    }
+
+  function getMutationObserver() {
+    return (
+      window.MutationObserver ||
+      window.WebKitMutationObserver ||
+      window.MozMutationObserver
+    )
+  }
+
+  function addEventListener(el, evt, func) {
+    el.addEventListener(evt, func, false)
+  }
+
+  function removeEventListener(el, evt, func) {
+    el.removeEventListener(evt, func, false)
+  }
+
+  function setupRequestAnimationFrame() {
+    var vendors = ['moz', 'webkit', 'o', 'ms']
+    var x
+
+    // Remove vendor prefixing if prefixed and break early if not
+    for (x = 0; x < vendors.length && !requestAnimationFrame; x += 1) {
+      requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']
+    }
+
+    if (!requestAnimationFrame) {
+      log('setup', 'RequestAnimationFrame not supported')
+    }
+  }
+
+  function getMyID(iframeId) {
+    var retStr = 'Host page: ' + iframeId
+
+    if (window.top !== window.self) {
+      if (window.parentIFrame && window.parentIFrame.getId) {
+        retStr = window.parentIFrame.getId() + ': ' + iframeId
+      } else {
+        retStr = 'Nested host page: ' + iframeId
+      }
+    }
+
+    return retStr
+  }
+
+  function formatLogHeader(iframeId) {
+    return msgId + '[' + getMyID(iframeId) + ']'
+  }
+
+  function isLogEnabled(iframeId) {
+    return settings[iframeId] ? settings[iframeId].log : logEnabled
+  }
+
+  function log(iframeId, msg) {
+    output('log', iframeId, msg, isLogEnabled(iframeId))
+  }
+
+  function info(iframeId, msg) {
+    output('info', iframeId, msg, isLogEnabled(iframeId))
+  }
+
+  function warn(iframeId, msg) {
+    output('warn', iframeId, msg, true)
+  }
+
+  function output(type, iframeId, msg, enabled) {
+    if (true === enabled && 'object' === typeof window.console) {
+      // eslint-disable-next-line no-console
+      console[type](formatLogHeader(iframeId), msg)
+    }
+  }
+
+  function iFrameListener(event) {
+    function resizeIFrame() {
+      function resize() {
+        setSize(messageData)
+        setPagePosition(iframeId)
+        on('onResized', messageData)
+      }
+
+      ensureInRange('Height')
+      ensureInRange('Width')
+
+      syncResize(resize, messageData, 'init')
+    }
+
+    function processMsg() {
+      var data = msg.substr(msgIdLen).split(':')
+
+      return {
+        iframe: settings[data[0]] && settings[data[0]].iframe,
+        id: data[0],
+        height: data[1],
+        width: data[2],
+        type: data[3]
+      }
+    }
+
+    function ensureInRange(Dimension) {
+      var max = Number(settings[iframeId]['max' + Dimension]),
+        min = Number(settings[iframeId]['min' + Dimension]),
+        dimension = Dimension.toLowerCase(),
+        size = Number(messageData[dimension])
+
+      log(iframeId, 'Checking ' + dimension + ' is in range ' + min + '-' + max)
+
+      if (size < min) {
+        size = min
+        log(iframeId, 'Set ' + dimension + ' to min value')
+      }
+
+      if (size > max) {
+        size = max
+        log(iframeId, 'Set ' + dimension + ' to max value')
+      }
+
+      messageData[dimension] = '' + size
+    }
+
+    function isMessageFromIFrame() {
+      function checkAllowedOrigin() {
+        function checkList() {
+          var i = 0,
+            retCode = false
+
+          log(
+            iframeId,
+            'Checking connection is from allowed list of origins: ' +
+              checkOrigin
+          )
+
+          for (; i < checkOrigin.length; i++) {
+            if (checkOrigin[i] === origin) {
+              retCode = true
+              break
+            }
+          }
+          return retCode
+        }
+
+        function checkSingle() {
+          var remoteHost = settings[iframeId] && settings[iframeId].remoteHost
+          log(iframeId, 'Checking connection is from: ' + remoteHost)
+          return origin === remoteHost
+        }
+
+        return checkOrigin.constructor === Array ? checkList() : checkSingle()
+      }
+
+      var origin = event.origin,
+        checkOrigin = settings[iframeId] && settings[iframeId].checkOrigin
+
+      if (checkOrigin && '' + origin !== 'null' && !checkAllowedOrigin()) {
+        throw new Error(
+          'Unexpected message received from: ' +
+            origin +
+            ' for ' +
+            messageData.iframe.id +
+            '. Message was: ' +
+            event.data +
+            '. This error can be disabled by setting the checkOrigin: false option or by providing of array of trusted domains.'
+        )
+      }
+
+      return true
+    }
+
+    function isMessageForUs() {
+      return (
+        msgId === ('' + msg).substr(0, msgIdLen) &&
+        msg.substr(msgIdLen).split(':')[0] in settings
+      ) // ''+Protects against non-string msg
+    }
+
+    function isMessageFromMetaParent() {
+      // Test if this message is from a parent above us. This is an ugly test, however, updating
+      // the message format would break backwards compatibity.
+      var retCode = messageData.type in { true: 1, false: 1, undefined: 1 }
+
+      if (retCode) {
+        log(iframeId, 'Ignoring init message from meta parent page')
+      }
+
+      return retCode
+    }
+
+    function getMsgBody(offset) {
+      return msg.substr(msg.indexOf(':') + msgHeaderLen + offset)
+    }
+
+    function forwardMsgFromIFrame(msgBody) {
+      log(
+        iframeId,
+        'onMessage passed: {iframe: ' +
+          messageData.iframe.id +
+          ', message: ' +
+          msgBody +
+          '}'
+      )
+      on('onMessage', {
+        iframe: messageData.iframe,
+        message: JSON.parse(msgBody)
+      })
+      log(iframeId, '--')
+    }
+
+    function getPageInfo() {
+      var bodyPosition = document.body.getBoundingClientRect(),
+        iFramePosition = messageData.iframe.getBoundingClientRect()
+
+      return JSON.stringify({
+        iframeHeight: iFramePosition.height,
+        iframeWidth: iFramePosition.width,
+        clientHeight: Math.max(
+          document.documentElement.clientHeight,
+          window.innerHeight || 0
+        ),
+        clientWidth: Math.max(
+          document.documentElement.clientWidth,
+          window.innerWidth || 0
+        ),
+        offsetTop: parseInt(iFramePosition.top - bodyPosition.top, 10),
+        offsetLeft: parseInt(iFramePosition.left - bodyPosition.left, 10),
+        scrollTop: window.pageYOffset,
+        scrollLeft: window.pageXOffset,
+        documentHeight: document.documentElement.clientHeight,
+        documentWidth: document.documentElement.clientWidth,
+        windowHeight: window.innerHeight,
+        windowWidth: window.innerWidth
+      })
+    }
+
+    function sendPageInfoToIframe(iframe, iframeId) {
+      function debouncedTrigger() {
+        trigger('Send Page Info', 'pageInfo:' + getPageInfo(), iframe, iframeId)
+      }
+      debounceFrameEvents(debouncedTrigger, 32, iframeId)
+    }
+
+    function startPageInfoMonitor() {
+      function setListener(type, func) {
+        function sendPageInfo() {
+          if (settings[id]) {
+            sendPageInfoToIframe(settings[id].iframe, id)
+          } else {
+            stop()
+          }
+        }
+
+        ;['scroll', 'resize'].forEach(function(evt) {
+          log(id, type + evt + ' listener for sendPageInfo')
+          func(window, evt, sendPageInfo)
+        })
+      }
+
+      function stop() {
+        setListener('Remove ', removeEventListener)
+      }
+
+      function start() {
+        setListener('Add ', addEventListener)
+      }
+
+      var id = iframeId // Create locally scoped copy of iFrame ID
+
+      start()
+
+      if (settings[id]) {
+        settings[id].stopPageInfo = stop
+      }
+    }
+
+    function stopPageInfoMonitor() {
+      if (settings[iframeId] && settings[iframeId].stopPageInfo) {
+        settings[iframeId].stopPageInfo()
+        delete settings[iframeId].stopPageInfo
+      }
+    }
+
+    function checkIFrameExists() {
+      var retBool = true
+
+      if (null === messageData.iframe) {
+        warn(iframeId, 'IFrame (' + messageData.id + ') not found')
+        retBool = false
+      }
+      return retBool
+    }
+
+    function getElementPosition(target) {
+      var iFramePosition = target.getBoundingClientRect()
+
+      getPagePosition(iframeId)
+
+      return {
+        x: Math.floor(Number(iFramePosition.left) + Number(pagePosition.x)),
+        y: Math.floor(Number(iFramePosition.top) + Number(pagePosition.y))
+      }
+    }
+
+    function scrollRequestFromChild(addOffset) {
+      /* istanbul ignore next */ // Not testable in Karma
+      function reposition() {
+        pagePosition = newPosition
+        scrollTo()
+        log(iframeId, '--')
+      }
+
+      function calcOffset() {
+        return {
+          x: Number(messageData.width) + offset.x,
+          y: Number(messageData.height) + offset.y
+        }
+      }
+
+      function scrollParent() {
+        if (window.parentIFrame) {
+          window.parentIFrame['scrollTo' + (addOffset ? 'Offset' : '')](
+            newPosition.x,
+            newPosition.y
+          )
+        } else {
+          warn(
+            iframeId,
+            'Unable to scroll to requested position, window.parentIFrame not found'
+          )
+        }
+      }
+
+      var offset = addOffset
+          ? getElementPosition(messageData.iframe)
+          : { x: 0, y: 0 },
+        newPosition = calcOffset()
+
+      log(
+        iframeId,
+        'Reposition requested from iFrame (offset x:' +
+          offset.x +
+          ' y:' +
+          offset.y +
+          ')'
+      )
+
+      if (window.top !== window.self) {
+        scrollParent()
+      } else {
+        reposition()
+      }
+    }
+
+    function scrollTo() {
+      if (false !== on('onScroll', pagePosition)) {
+        setPagePosition(iframeId)
+      } else {
+        unsetPagePosition()
+      }
+    }
+
+    function findTarget(location) {
+      function jumpToTarget() {
+        var jumpPosition = getElementPosition(target)
+
+        log(
+          iframeId,
+          'Moving to in page link (#' +
+            hash +
+            ') at x: ' +
+            jumpPosition.x +
+            ' y: ' +
+            jumpPosition.y
+        )
+        pagePosition = {
+          x: jumpPosition.x,
+          y: jumpPosition.y
+        }
+
+        scrollTo()
+        log(iframeId, '--')
+      }
+
+      function jumpToParent() {
+        if (window.parentIFrame) {
+          window.parentIFrame.moveToAnchor(hash)
+        } else {
+          log(
+            iframeId,
+            'In page link #' +
+              hash +
+              ' not found and window.parentIFrame not found'
+          )
+        }
+      }
+
+      var hash = location.split('#')[1] || '',
+        hashData = decodeURIComponent(hash),
+        target =
+          document.getElementById(hashData) ||
+          document.getElementsByName(hashData)[0]
+
+      if (target) {
+        jumpToTarget()
+      } else if (window.top !== window.self) {
+        jumpToParent()
+      } else {
+        log(iframeId, 'In page link #' + hash + ' not found')
+      }
+    }
+
+    function on(funcName, val) {
+      return chkEvent(iframeId, funcName, val)
+    }
+
+    function actionMsg() {
+      if (settings[iframeId] && settings[iframeId].firstRun) firstRun()
+
+      switch (messageData.type) {
+        case 'close':
+          if (settings[iframeId].closeRequeston)
+            chkEvent(iframeId, 'onCloseRequest', settings[iframeId].iframe)
+          else closeIFrame(messageData.iframe)
+          break
+
+        case 'message':
+          forwardMsgFromIFrame(getMsgBody(6))
+          break
+
+        case 'scrollTo':
+          scrollRequestFromChild(false)
+          break
+
+        case 'scrollToOffset':
+          scrollRequestFromChild(true)
+          break
+
+        case 'pageInfo':
+          sendPageInfoToIframe(
+            settings[iframeId] && settings[iframeId].iframe,
+            iframeId
+          )
+          startPageInfoMonitor()
+          break
+
+        case 'pageInfoStop':
+          stopPageInfoMonitor()
+          break
+
+        case 'inPageLink':
+          findTarget(getMsgBody(9))
+          break
+
+        case 'reset':
+          resetIFrame(messageData)
+          break
+
+        case 'init':
+          resizeIFrame()
+          on('onInit', messageData.iframe)
+          break
+
+        default:
+          resizeIFrame()
+      }
+    }
+
+    function hasSettings(iframeId) {
+      var retBool = true
+
+      if (!settings[iframeId]) {
+        retBool = false
+        warn(
+          messageData.type +
+            ' No settings for ' +
+            iframeId +
+            '. Message was: ' +
+            msg
+        )
+      }
+
+      return retBool
+    }
+
+    function iFrameReadyMsgReceived() {
+      // eslint-disable-next-line no-restricted-syntax, guard-for-in
+      for (var iframeId in settings) {
+        trigger(
+          'iFrame requested init',
+          createOutgoingMsg(iframeId),
+          document.getElementById(iframeId),
+          iframeId
+        )
+      }
+    }
+
+    function firstRun() {
+      if (settings[iframeId]) {
+        settings[iframeId].firstRun = false
+      }
+    }
+
+    var msg = event.data,
+      messageData = {},
+      iframeId = null
+
+    if ('[iFrameResizerChild]Ready' === msg) {
+      iFrameReadyMsgReceived()
+    } else if (isMessageForUs()) {
+      messageData = processMsg()
+      iframeId = messageData.id
+      if (settings[iframeId]) {
+        settings[iframeId].loaded = true
+      }
+
+      if (!isMessageFromMetaParent() && hasSettings(iframeId)) {
+        log(iframeId, 'Received: ' + msg)
+
+        if (checkIFrameExists() && isMessageFromIFrame()) {
+          actionMsg()
+        }
+      }
+    } else {
+      info(iframeId, 'Ignored: ' + msg)
+    }
+  }
+
+  function chkEvent(iframeId, funcName, val) {
+    var func = null,
+      retVal = null
+
+    if (settings[iframeId]) {
+      func = settings[iframeId][funcName]
+
+      if ('function' === typeof func) {
+        retVal = func(val)
+      } else {
+        throw new TypeError(
+          funcName + ' on iFrame[' + iframeId + '] is not a function'
+        )
+      }
+    }
+
+    return retVal
+  }
+
+  function removeIframeListeners(iframe) {
+    var iframeId = iframe.id
+    delete settings[iframeId]
+  }
+
+  function closeIFrame(iframe) {
+    var iframeId = iframe.id
+    log(iframeId, 'Removing iFrame: ' + iframeId)
+
+    try {
+      // Catch race condition error with React
+      if (iframe.parentNode) {
+        iframe.parentNode.removeChild(iframe)
+      }
+    } catch (error) {
+      warn(error)
+    }
+
+    chkEvent(iframeId, 'onClosed', iframeId)
+    log(iframeId, '--')
+    removeIframeListeners(iframe)
+  }
+
+  function getPagePosition(iframeId) {
+    if (null === pagePosition) {
+      pagePosition = {
+        x:
+          window.pageXOffset !== undefined
+            ? window.pageXOffset
+            : document.documentElement.scrollLeft,
+        y:
+          window.pageYOffset !== undefined
+            ? window.pageYOffset
+            : document.documentElement.scrollTop
+      }
+      log(
+        iframeId,
+        'Get page position: ' + pagePosition.x + ',' + pagePosition.y
+      )
+    }
+  }
+
+  function setPagePosition(iframeId) {
+    if (null !== pagePosition) {
+      window.scrollTo(pagePosition.x, pagePosition.y)
+      log(
+        iframeId,
+        'Set page position: ' + pagePosition.x + ',' + pagePosition.y
+      )
+      unsetPagePosition()
+    }
+  }
+
+  function unsetPagePosition() {
+    pagePosition = null
+  }
+
+  function resetIFrame(messageData) {
+    function reset() {
+      setSize(messageData)
+      trigger('reset', 'reset', messageData.iframe, messageData.id)
+    }
+
+    log(
+      messageData.id,
+      'Size reset requested by ' +
+        ('init' === messageData.type ? 'host page' : 'iFrame')
+    )
+    getPagePosition(messageData.id)
+    syncResize(reset, messageData, 'reset')
+  }
+
+  function setSize(messageData) {
+    function setDimension(dimension) {
+      if (!messageData.id) {
+        log('undefined', 'messageData id not set')
+        return
+      }
+      messageData.iframe.style[dimension] = messageData[dimension] + 'px'
+      log(
+        messageData.id,
+        'IFrame (' +
+          iframeId +
+          ') ' +
+          dimension +
+          ' set to ' +
+          messageData[dimension] +
+          'px'
+      )
+    }
+
+    function chkZero(dimension) {
+      // FireFox sets dimension of hidden iFrames to zero.
+      // So if we detect that set up an event to check for
+      // when iFrame becomes visible.
+
+      /* istanbul ignore next */ // Not testable in PhantomJS
+      if (!hiddenCheckEnabled && '0' === messageData[dimension]) {
+        hiddenCheckEnabled = true
+        log(iframeId, 'Hidden iFrame detected, creating visibility listener')
+        fixHiddenIFrames()
+      }
+    }
+
+    function processDimension(dimension) {
+      setDimension(dimension)
+      chkZero(dimension)
+    }
+
+    var iframeId = messageData.iframe.id
+
+    if (settings[iframeId]) {
+      if (settings[iframeId].sizeHeight) {
+        processDimension('height')
+      }
+      if (settings[iframeId].sizeWidth) {
+        processDimension('width')
+      }
+    }
+  }
+
+  function syncResize(func, messageData, doNotSync) {
+    /* istanbul ignore if */ // Not testable in PhantomJS
+    if (doNotSync !== messageData.type && requestAnimationFrame) {
+      log(messageData.id, 'Requesting animation frame')
+      requestAnimationFrame(func)
+    } else {
+      func()
+    }
+  }
+
+  function trigger(calleeMsg, msg, iframe, id, noResponseWarning) {
+    function postMessageToIFrame() {
+      var target = settings[id] && settings[id].targetOrigin
+      log(
+        id,
+        '[' +
+          calleeMsg +
+          '] Sending msg to iframe[' +
+          id +
+          '] (' +
+          msg +
+          ') targetOrigin: ' +
+          target
+      )
+      iframe.contentWindow.postMessage(msgId + msg, target)
+    }
+
+    function iFrameNotFound() {
+      warn(id, '[' + calleeMsg + '] IFrame(' + id + ') not found')
+    }
+
+    function chkAndSend() {
+      if (
+        iframe &&
+        'contentWindow' in iframe &&
+        null !== iframe.contentWindow
+      ) {
+        // Null test for PhantomJS
+        postMessageToIFrame()
+      } else {
+        iFrameNotFound()
+      }
+    }
+
+    function warnOnNoResponse() {
+      function warning() {
+        if (settings[id] && !settings[id].loaded && !errorShown) {
+          errorShown = true
+          warn(
+            id,
+            'IFrame has not responded within ' +
+              settings[id].warningTimeout / 1000 +
+              ' seconds. Check iFrameResizer.contentWindow.js has been loaded in iFrame. This message can be ignored if everything is working, or you can set the warningTimeout option to a higher value or zero to suppress this warning.'
+          )
+        }
+      }
+
+      if (
+        !!noResponseWarning &&
+        settings[id] &&
+        !!settings[id].warningTimeout
+      ) {
+        settings[id].msgTimeout = setTimeout(
+          warning,
+          settings[id].warningTimeout
+        )
+      }
+    }
+
+    var errorShown = false
+
+    id = id || iframe.id
+
+    if (settings[id]) {
+      chkAndSend()
+      warnOnNoResponse()
+    }
+  }
+
+  function createOutgoingMsg(iframeId) {
+    return (
+      iframeId +
+      ':' +
+      settings[iframeId].bodyMarginV1 +
+      ':' +
+      settings[iframeId].sizeWidth +
+      ':' +
+      settings[iframeId].log +
+      ':' +
+      settings[iframeId].interval +
+      ':' +
+      settings[iframeId].enablePublicMethods +
+      ':' +
+      settings[iframeId].autoResize +
+      ':' +
+      settings[iframeId].bodyMargin +
+      ':' +
+      settings[iframeId].heightCalculationMethod +
+      ':' +
+      settings[iframeId].bodyBackground +
+      ':' +
+      settings[iframeId].bodyPadding +
+      ':' +
+      settings[iframeId].tolerance +
+      ':' +
+      settings[iframeId].inPageLinks +
+      ':' +
+      settings[iframeId].resizeFrom +
+      ':' +
+      settings[iframeId].widthCalculationMethod
+    )
+  }
+
+  function setupIFrame(iframe, options) {
+    function setLimits() {
+      function addStyle(style) {
+        if (
+          Infinity !== settings[iframeId][style] &&
+          0 !== settings[iframeId][style]
+        ) {
+          iframe.style[style] = settings[iframeId][style] + 'px'
+          log(
+            iframeId,
+            'Set ' + style + ' = ' + settings[iframeId][style] + 'px'
+          )
+        }
+      }
+
+      function chkMinMax(dimension) {
+        if (
+          settings[iframeId]['min' + dimension] >
+          settings[iframeId]['max' + dimension]
+        ) {
+          throw new Error(
+            'Value for min' +
+              dimension +
+              ' can not be greater than max' +
+              dimension
+          )
+        }
+      }
+
+      chkMinMax('Height')
+      chkMinMax('Width')
+
+      addStyle('maxHeight')
+      addStyle('minHeight')
+      addStyle('maxWidth')
+      addStyle('minWidth')
+    }
+
+    function newId() {
+      var id = (options && options.id) || defaults.id + count++
+      if (null !== document.getElementById(id)) {
+        id += count++
+      }
+      return id
+    }
+
+    function ensureHasId(iframeId) {
+      if ('' === iframeId) {
+        // eslint-disable-next-line no-multi-assign
+        iframe.id = iframeId = newId()
+        logEnabled = (options || {}).log
+        log(
+          iframeId,
+          'Added missing iframe ID: ' + iframeId + ' (' + iframe.src + ')'
+        )
+      }
+
+      return iframeId
+    }
+
+    function setScrolling() {
+      log(
+        iframeId,
+        'IFrame scrolling ' +
+          (settings[iframeId] && settings[iframeId].scrolling
+            ? 'enabled'
+            : 'disabled') +
+          ' for ' +
+          iframeId
+      )
+      iframe.style.overflow =
+        false === (settings[iframeId] && settings[iframeId].scrolling)
+          ? 'hidden'
+          : 'auto'
+      switch (settings[iframeId] && settings[iframeId].scrolling) {
+        case 'omit':
+          break
+
+        case true:
+          iframe.scrolling = 'yes'
+          break
+
+        case false:
+          iframe.scrolling = 'no'
+          break
+
+        default:
+          iframe.scrolling = settings[iframeId]
+            ? settings[iframeId].scrolling
+            : 'no'
+      }
+    }
+
+    // The V1 iFrame script expects an int, where as in V2 expects a CSS
+    // string value such as '1px 3em', so if we have an int for V2, set V1=V2
+    // and then convert V2 to a string PX value.
+    function setupBodyMarginValues() {
+      if (
+        'number' ===
+          typeof (settings[iframeId] && settings[iframeId].bodyMargin) ||
+        '0' === (settings[iframeId] && settings[iframeId].bodyMargin)
+      ) {
+        settings[iframeId].bodyMarginV1 = settings[iframeId].bodyMargin
+        settings[iframeId].bodyMargin =
+          '' + settings[iframeId].bodyMargin + 'px'
+      }
+    }
+
+    function checkReset() {
+      // Reduce scope of firstRun to function, because IE8's JS execution
+      // context stack is borked and this value gets externally
+      // changed midway through running this function!!!
+      var firstRun = settings[iframeId] && settings[iframeId].firstRun,
+        resetRequertMethod =
+          settings[iframeId] &&
+          settings[iframeId].heightCalculationMethod in resetRequiredMethods
+
+      if (!firstRun && resetRequertMethod) {
+        resetIFrame({ iframe: iframe, height: 0, width: 0, type: 'init' })
+      }
+    }
+
+    function setupIFrameObject() {
+      if (settings[iframeId]) {
+        settings[iframeId].iframe.iFrameResizer = {
+          close: closeIFrame.bind(null, settings[iframeId].iframe),
+
+          removeListeners: removeIframeListeners.bind(
+            null,
+            settings[iframeId].iframe
+          ),
+
+          resize: trigger.bind(
+            null,
+            'Window resize',
+            'resize',
+            settings[iframeId].iframe
+          ),
+
+          moveToAnchor: function(anchor) {
+            trigger(
+              'Move to anchor',
+              'moveToAnchor:' + anchor,
+              settings[iframeId].iframe,
+              iframeId
+            )
+          },
+
+          sendMessage: function(message) {
+            message = JSON.stringify(message)
+            trigger(
+              'Send Message',
+              'message:' + message,
+              settings[iframeId].iframe,
+              iframeId
+            )
+          }
+        }
+      }
+    }
+
+    // We have to call trigger twice, as we can not be sure if all
+    // iframes have completed loading when this code runs. The
+    // event listener also catches the page changing in the iFrame.
+    function init(msg) {
+      function iFrameLoaded() {
+        trigger('iFrame.onload', msg, iframe, undefined, true)
+        checkReset()
+      }
+
+      function createDestroyObserver(MutationObserver) {
+        if (!iframe.parentNode) {
+          return
+        }
+
+        var destroyObserver = new MutationObserver(function(mutations) {
+          mutations.forEach(function(mutation) {
+            var removedNodes = Array.prototype.slice.call(mutation.removedNodes) // Transform NodeList into an Array
+            removedNodes.forEach(function(removedNode) {
+              if (removedNode === iframe) {
+                closeIFrame(iframe)
+              }
+            })
+          })
+        })
+        destroyObserver.observe(iframe.parentNode, {
+          childList: true
+        })
+      }
+
+      var MutationObserver = getMutationObserver()
+      if (MutationObserver) {
+        createDestroyObserver(MutationObserver)
+      }
+
+      addEventListener(iframe, 'load', iFrameLoaded)
+      trigger('init', msg, iframe, undefined, true)
+    }
+
+    function checkOptions(options) {
+      if ('object' !== typeof options) {
+        throw new TypeError('Options is not an object')
+      }
+    }
+
+    function copyOptions(options) {
+      // eslint-disable-next-line no-restricted-syntax
+      for (var option in defaults) {
+        if (Object.prototype.hasOwnProperty.call(defaults, option)) {
+          settings[iframeId][option] = Object.prototype.hasOwnProperty.call(
+            options,
+            option
+          )
+            ? options[option]
+            : defaults[option]
+        }
+      }
+    }
+
+    function getTargetOrigin(remoteHost) {
+      return '' === remoteHost || 'file://' === remoteHost ? '*' : remoteHost
+    }
+
+    function depricate(key) {
+      var splitName = key.split('Callback')
+
+      if (splitName.length === 2) {
+        var name =
+          'on' + splitName[0].charAt(0).toUpperCase() + splitName[0].slice(1)
+        this[name] = this[key]
+        delete this[key]
+        warn(
+          iframeId,
+          "Deprecated: '" +
+            key +
+            "' has been renamed '" +
+            name +
+            "'. The old method will be removed in the next major version."
+        )
+      }
+    }
+
+    function processOptions(options) {
+      options = options || {}
+      settings[iframeId] = {
+        firstRun: true,
+        iframe: iframe,
+        remoteHost: iframe.src
+          .split('/')
+          .slice(0, 3)
+          .join('/')
+      }
+
+      checkOptions(options)
+      Object.keys(options).forEach(depricate, options)
+      copyOptions(options)
+
+      if (settings[iframeId]) {
+        settings[iframeId].targetOrigin =
+          true === settings[iframeId].checkOrigin
+            ? getTargetOrigin(settings[iframeId].remoteHost)
+            : '*'
+      }
+    }
+
+    function beenHere() {
+      return iframeId in settings && 'iFrameResizer' in iframe
+    }
+
+    var iframeId = ensureHasId(iframe.id)
+
+    if (!beenHere()) {
+      processOptions(options)
+      setScrolling()
+      setLimits()
+      setupBodyMarginValues()
+      init(createOutgoingMsg(iframeId))
+      setupIFrameObject()
+    } else {
+      warn(iframeId, 'Ignored iFrame, already setup.')
+    }
+  }
+
+  function debouce(fn, time) {
+    if (null === timer) {
+      timer = setTimeout(function() {
+        timer = null
+        fn()
+      }, time)
+    }
+  }
+
+  var frameTimer = {}
+  function debounceFrameEvents(fn, time, frameId) {
+    if (!frameTimer[frameId]) {
+      frameTimer[frameId] = setTimeout(function() {
+        frameTimer[frameId] = null
+        fn()
+      }, time)
+    }
+  }
+
+  // Not testable in PhantomJS
+  /* istanbul ignore next */
+
+  function fixHiddenIFrames() {
+    function checkIFrames() {
+      function checkIFrame(settingId) {
+        function chkDimension(dimension) {
+          return (
+            '0px' ===
+            (settings[settingId] && settings[settingId].iframe.style[dimension])
+          )
+        }
+
+        function isVisible(el) {
+          return null !== el.offsetParent
+        }
+
+        if (
+          settings[settingId] &&
+          isVisible(settings[settingId].iframe) &&
+          (chkDimension('height') || chkDimension('width'))
+        ) {
+          trigger(
+            'Visibility change',
+            'resize',
+            settings[settingId].iframe,
+            settingId
+          )
+        }
+      }
+
+      Object.keys(settings).forEach(function(key) {
+        checkIFrame(settings[key])
+      })
+    }
+
+    function mutationObserved(mutations) {
+      log(
+        'window',
+        'Mutation observed: ' + mutations[0].target + ' ' + mutations[0].type
+      )
+      debouce(checkIFrames, 16)
+    }
+
+    function createMutationObserver() {
+      var target = document.querySelector('body'),
+        config = {
+          attributes: true,
+          attributeOldValue: false,
+          characterData: true,
+          characterDataOldValue: false,
+          childList: true,
+          subtree: true
+        },
+        observer = new MutationObserver(mutationObserved)
+
+      observer.observe(target, config)
+    }
+
+    var MutationObserver = getMutationObserver()
+    if (MutationObserver) {
+      createMutationObserver()
+    }
+  }
+
+  function resizeIFrames(event) {
+    function resize() {
+      sendTriggerMsg('Window ' + event, 'resize')
+    }
+
+    log('window', 'Trigger event: ' + event)
+    debouce(resize, 16)
+  }
+
+  // Not testable in PhantomJS
+  /* istanbul ignore next */
+  function tabVisible() {
+    function resize() {
+      sendTriggerMsg('Tab Visable', 'resize')
+    }
+
+    if ('hidden' !== document.visibilityState) {
+      log('document', 'Trigger event: Visiblity change')
+      debouce(resize, 16)
+    }
+  }
+
+  function sendTriggerMsg(eventName, event) {
+    function isIFrameResizeEnabled(iframeId) {
+      return (
+        settings[iframeId] &&
+        'parent' === settings[iframeId].resizeFrom &&
+        settings[iframeId].autoResize &&
+        !settings[iframeId].firstRun
+      )
+    }
+
+    Object.keys(settings).forEach(function(iframeId) {
+      if (isIFrameResizeEnabled(iframeId)) {
+        trigger(eventName, event, document.getElementById(iframeId), iframeId)
+      }
+    })
+  }
+
+  function setupEventListeners() {
+    addEventListener(window, 'message', iFrameListener)
+
+    addEventListener(window, 'resize', function() {
+      resizeIFrames('resize')
+    })
+
+    addEventListener(document, 'visibilitychange', tabVisible)
+
+    addEventListener(document, '-webkit-visibilitychange', tabVisible)
+  }
+
+  function factory() {
+    function init(options, element) {
+      function chkType() {
+        if (!element.tagName) {
+          throw new TypeError('Object is not a valid DOM element')
+        } else if ('IFRAME' !== element.tagName.toUpperCase()) {
+          throw new TypeError(
+            'Expected <IFRAME> tag, found <' + element.tagName + '>'
+          )
+        }
+      }
+
+      if (element) {
+        chkType()
+        setupIFrame(element, options)
+        iFrames.push(element)
+      }
+    }
+
+    function warnDeprecatedOptions(options) {
+      if (options && options.enablePublicMethods) {
+        warn(
+          'enablePublicMethods option has been removed, public methods are now always available in the iFrame'
+        )
+      }
+    }
+
+    var iFrames
+
+    setupRequestAnimationFrame()
+    setupEventListeners()
+
+    return function iFrameResizeF(options, target) {
+      iFrames = [] // Only return iFrames past in on this call
+
+      warnDeprecatedOptions(options)
+
+      switch (typeof target) {
+        case 'undefined':
+        case 'string':
+          Array.prototype.forEach.call(
+            document.querySelectorAll(target || 'iframe'),
+            init.bind(undefined, options)
+          )
+          break
+
+        case 'object':
+          init(options, target)
+          break
+
+        default:
+          throw new TypeError('Unexpected data type (' + typeof target + ')')
+      }
+
+      return iFrames
+    }
+  }
+
+  function createJQueryPublicMethod($) {
+    if (!$.fn) {
+      info('', 'Unable to bind to jQuery, it is not fully loaded.')
+    } else if (!$.fn.iFrameResize) {
+      $.fn.iFrameResize = function $iFrameResizeF(options) {
+        function init(index, element) {
+          setupIFrame(element, options)
+        }
+
+        return this.filter('iframe')
+          .each(init)
+          .end()
+      }
+    }
+  }
+
+  if (window.jQuery) {
+    createJQueryPublicMethod(window.jQuery)
+  }
+
+  if (typeof define === 'function' && define.amd) {
+    define([], factory)
+  } else if (typeof module === 'object' && typeof module.exports === 'object') {
+    // Node for browserfy
+    module.exports = factory()
+  }
+  window.iFrameResize = window.iFrameResize || factory()
+})();
+/*
+ * File: iframeResizer.contentWindow.js
+ * Desc: Include this file in any page being loaded into an iframe
+ *       to force the iframe to resize to the content size.
+ * Requires: iframeResizer.js on host page.
+ * Doc: https://github.com/davidjbradshaw/iframe-resizer
+ * Author: David J. Bradshaw - dave@bradshaw.net
+ *
+ */
+
+// eslint-disable-next-line sonarjs/cognitive-complexity, no-shadow-restricted-names
+;(function(undefined) {
+  if (typeof window === 'undefined') return // don't run for server side render
+
+  var autoResize = true,
+    base = 10,
+    bodyBackground = '',
+    bodyMargin = 0,
+    bodyMarginStr = '',
+    bodyObserver = null,
+    bodyPadding = '',
+    calculateWidth = false,
+    doubleEventList = { resize: 1, click: 1 },
+    eventCancelTimer = 128,
+    firstRun = true,
+    height = 1,
+    heightCalcModeDefault = 'bodyOffset',
+    heightCalcMode = heightCalcModeDefault,
+    initLock = true,
+    initMsg = '',
+    inPageLinks = {},
+    interval = 32,
+    intervalTimer = null,
+    logging = false,
+    msgID = '[iFrameSizer]', // Must match host page msg ID
+    msgIdLen = msgID.length,
+    myID = '',
+    resetRequiredMethods = {
+      max: 1,
+      min: 1,
+      bodyScroll: 1,
+      documentElementScroll: 1
+    },
+    resizeFrom = 'child',
+    sendPermit = true,
+    target = window.parent,
+    targetOriginDefault = '*',
+    tolerance = 0,
+    triggerLocked = false,
+    triggerLockedTimer = null,
+    throttledTimer = 16,
+    width = 1,
+    widthCalcModeDefault = 'scroll',
+    widthCalcMode = widthCalcModeDefault,
+    win = window,
+    onMessage = function() {
+      warn('onMessage function not defined')
+    },
+    onReady = function() {},
+    onPageInfo = function() {},
+    customCalcMethods = {
+      height: function() {
+        warn('Custom height calculation function not defined')
+        return document.documentElement.offsetHeight
+      },
+      width: function() {
+        warn('Custom width calculation function not defined')
+        return document.body.scrollWidth
+      }
+    },
+    eventHandlersByName = {},
+    passiveSupported = false
+
+  function noop() {}
+
+  try {
+    var options = Object.create(
+      {},
+      {
+        passive: {
+          get: function() {
+            passiveSupported = true
+          }
+        }
+      }
+    )
+    window.addEventListener('test', noop, options)
+    window.removeEventListener('test', noop, options)
+  } catch (error) {
+    /* */
+  }
+
+  function addEventListener(el, evt, func, options) {
+    el.addEventListener(evt, func, passiveSupported ? options || {} : false)
+  }
+
+  function removeEventListener(el, evt, func) {
+    el.removeEventListener(evt, func, false)
+  }
+
+  function capitalizeFirstLetter(string) {
+    return string.charAt(0).toUpperCase() + string.slice(1)
+  }
+
+  // Based on underscore.js
+  function throttle(func) {
+    var context,
+      args,
+      result,
+      timeout = null,
+      previous = 0,
+      later = function() {
+        previous = getNow()
+        timeout = null
+        result = func.apply(context, args)
+        if (!timeout) {
+          // eslint-disable-next-line no-multi-assign
+          context = args = null
+        }
+      }
+
+    return function() {
+      var now = getNow()
+
+      if (!previous) {
+        previous = now
+      }
+
+      var remaining = throttledTimer - (now - previous)
+
+      context = this
+      args = arguments
+
+      if (remaining <= 0 || remaining > throttledTimer) {
+        if (timeout) {
+          clearTimeout(timeout)
+          timeout = null
+        }
+
+        previous = now
+        result = func.apply(context, args)
+
+        if (!timeout) {
+          // eslint-disable-next-line no-multi-assign
+          context = args = null
+        }
+      } else if (!timeout) {
+        timeout = setTimeout(later, remaining)
+      }
+
+      return result
+    }
+  }
+
+  var getNow =
+    Date.now ||
+    function() {
+      /* istanbul ignore next */ // Not testable in PhantonJS
+      return new Date().getTime()
+    }
+
+  function formatLogMsg(msg) {
+    return msgID + '[' + myID + '] ' + msg
+  }
+
+  function log(msg) {
+    if (logging && 'object' === typeof window.console) {
+      // eslint-disable-next-line no-console
+      console.log(formatLogMsg(msg))
+    }
+  }
+
+  function warn(msg) {
+    if ('object' === typeof window.console) {
+      // eslint-disable-next-line no-console
+      console.warn(formatLogMsg(msg))
+    }
+  }
+
+  function init() {
+    readDataFromParent()
+    log('Initialising iFrame (' + location.href + ')')
+    readDataFromPage()
+    setMargin()
+    setBodyStyle('background', bodyBackground)
+    setBodyStyle('padding', bodyPadding)
+    injectClearFixIntoBodyElement()
+    checkHeightMode()
+    checkWidthMode()
+    stopInfiniteResizingOfIFrame()
+    setupPublicMethods()
+    startEventListeners()
+    inPageLinks = setupInPageLinks()
+    sendSize('init', 'Init message from host page')
+    onReady()
+  }
+
+  function readDataFromParent() {
+    function strBool(str) {
+      return 'true' === str
+    }
+
+    var data = initMsg.substr(msgIdLen).split(':')
+
+    myID = data[0]
+    bodyMargin = undefined !== data[1] ? Number(data[1]) : bodyMargin // For V1 compatibility
+    calculateWidth = undefined !== data[2] ? strBool(data[2]) : calculateWidth
+    logging = undefined !== data[3] ? strBool(data[3]) : logging
+    interval = undefined !== data[4] ? Number(data[4]) : interval
+    autoResize = undefined !== data[6] ? strBool(data[6]) : autoResize
+    bodyMarginStr = data[7]
+    heightCalcMode = undefined !== data[8] ? data[8] : heightCalcMode
+    bodyBackground = data[9]
+    bodyPadding = data[10]
+    tolerance = undefined !== data[11] ? Number(data[11]) : tolerance
+    inPageLinks.enable = undefined !== data[12] ? strBool(data[12]) : false
+    resizeFrom = undefined !== data[13] ? data[13] : resizeFrom
+    widthCalcMode = undefined !== data[14] ? data[14] : widthCalcMode
+  }
+
+  function depricate(key) {
+    var splitName = key.split('Callback')
+
+    if (splitName.length === 2) {
+      var name =
+        'on' + splitName[0].charAt(0).toUpperCase() + splitName[0].slice(1)
+      this[name] = this[key]
+      delete this[key]
+      warn(
+        "Deprecated: '" +
+          key +
+          "' has been renamed '" +
+          name +
+          "'. The old method will be removed in the next major version."
+      )
+    }
+  }
+
+  function readDataFromPage() {
+    function readData() {
+      var data = window.iFrameResizer
+
+      log('Reading data from page: ' + JSON.stringify(data))
+      Object.keys(data).forEach(depricate, data)
+
+      onMessage = 'onMessage' in data ? data.onMessage : onMessage
+      onReady = 'onReady' in data ? data.onReady : onReady
+      targetOriginDefault =
+        'targetOrigin' in data ? data.targetOrigin : targetOriginDefault
+      heightCalcMode =
+        'heightCalculationMethod' in data
+          ? data.heightCalculationMethod
+          : heightCalcMode
+      widthCalcMode =
+        'widthCalculationMethod' in data
+          ? data.widthCalculationMethod
+          : widthCalcMode
+    }
+
+    function setupCustomCalcMethods(calcMode, calcFunc) {
+      if ('function' === typeof calcMode) {
+        log('Setup custom ' + calcFunc + 'CalcMethod')
+        customCalcMethods[calcFunc] = calcMode
+        calcMode = 'custom'
+      }
+
+      return calcMode
+    }
+
+    if (
+      'iFrameResizer' in window &&
+      Object === window.iFrameResizer.constructor
+    ) {
+      readData()
+      heightCalcMode = setupCustomCalcMethods(heightCalcMode, 'height')
+      widthCalcMode = setupCustomCalcMethods(widthCalcMode, 'width')
+    }
+
+    log('TargetOrigin for parent set to: ' + targetOriginDefault)
+  }
+
+  function chkCSS(attr, value) {
+    if (-1 !== value.indexOf('-')) {
+      warn('Negative CSS value ignored for ' + attr)
+      value = ''
+    }
+    return value
+  }
+
+  function setBodyStyle(attr, value) {
+    if (undefined !== value && '' !== value && 'null' !== value) {
+      document.body.style[attr] = value
+      log('Body ' + attr + ' set to "' + value + '"')
+    }
+  }
+
+  function setMargin() {
+    // If called via V1 script, convert bodyMargin from int to str
+    if (undefined === bodyMarginStr) {
+      bodyMarginStr = bodyMargin + 'px'
+    }
+
+    setBodyStyle('margin', chkCSS('margin', bodyMarginStr))
+  }
+
+  function stopInfiniteResizingOfIFrame() {
+    document.documentElement.style.height = ''
+    document.body.style.height = ''
+    log('HTML & body height set to "auto"')
+  }
+
+  function manageTriggerEvent(options) {
+    var listener = {
+      add: function(eventName) {
+        function handleEvent() {
+          sendSize(options.eventName, options.eventType)
+        }
+
+        eventHandlersByName[eventName] = handleEvent
+
+        addEventListener(window, eventName, handleEvent, { passive: true })
+      },
+      remove: function(eventName) {
+        var handleEvent = eventHandlersByName[eventName]
+        delete eventHandlersByName[eventName]
+
+        removeEventListener(window, eventName, handleEvent)
+      }
+    }
+
+    if (options.eventNames && Array.prototype.map) {
+      options.eventName = options.eventNames[0]
+      options.eventNames.map(listener[options.method])
+    } else {
+      listener[options.method](options.eventName)
+    }
+
+    log(
+      capitalizeFirstLetter(options.method) +
+        ' event listener: ' +
+        options.eventType
+    )
+  }
+
+  function manageEventListeners(method) {
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Animation Start',
+      eventNames: ['animationstart', 'webkitAnimationStart']
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Animation Iteration',
+      eventNames: ['animationiteration', 'webkitAnimationIteration']
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Animation End',
+      eventNames: ['animationend', 'webkitAnimationEnd']
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Input',
+      eventName: 'input'
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Mouse Up',
+      eventName: 'mouseup'
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Mouse Down',
+      eventName: 'mousedown'
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Orientation Change',
+      eventName: 'orientationchange'
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Print',
+      eventName: ['afterprint', 'beforeprint']
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Ready State Change',
+      eventName: 'readystatechange'
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Touch Start',
+      eventName: 'touchstart'
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Touch End',
+      eventName: 'touchend'
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Touch Cancel',
+      eventName: 'touchcancel'
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Transition Start',
+      eventNames: [
+        'transitionstart',
+        'webkitTransitionStart',
+        'MSTransitionStart',
+        'oTransitionStart',
+        'otransitionstart'
+      ]
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Transition Iteration',
+      eventNames: [
+        'transitioniteration',
+        'webkitTransitionIteration',
+        'MSTransitionIteration',
+        'oTransitionIteration',
+        'otransitioniteration'
+      ]
+    })
+    manageTriggerEvent({
+      method: method,
+      eventType: 'Transition End',
+      eventNames: [
+        'transitionend',
+        'webkitTransitionEnd',
+        'MSTransitionEnd',
+        'oTransitionEnd',
+        'otransitionend'
+      ]
+    })
+    if ('child' === resizeFrom) {
+      manageTriggerEvent({
+        method: method,
+        eventType: 'IFrame Resized',
+        eventName: 'resize'
+      })
+    }
+  }
+
+  function checkCalcMode(calcMode, calcModeDefault, modes, type) {
+    if (calcModeDefault !== calcMode) {
+      if (!(calcMode in modes)) {
+        warn(
+          calcMode + ' is not a valid option for ' + type + 'CalculationMethod.'
+        )
+        calcMode = calcModeDefault
+      }
+      log(type + ' calculation method set to "' + calcMode + '"')
+    }
+
+    return calcMode
+  }
+
+  function checkHeightMode() {
+    heightCalcMode = checkCalcMode(
+      heightCalcMode,
+      heightCalcModeDefault,
+      getHeight,
+      'height'
+    )
+  }
+
+  function checkWidthMode() {
+    widthCalcMode = checkCalcMode(
+      widthCalcMode,
+      widthCalcModeDefault,
+      getWidth,
+      'width'
+    )
+  }
+
+  function startEventListeners() {
+    if (true === autoResize) {
+      manageEventListeners('add')
+      setupMutationObserver()
+    } else {
+      log('Auto Resize disabled')
+    }
+  }
+
+  function stopMsgsToParent() {
+    log('Disable outgoing messages')
+    sendPermit = false
+  }
+
+  function removeMsgListener() {
+    log('Remove event listener: Message')
+    removeEventListener(window, 'message', receiver)
+  }
+
+  function disconnectMutationObserver() {
+    if (null !== bodyObserver) {
+      /* istanbul ignore next */ // Not testable in PhantonJS
+      bodyObserver.disconnect()
+    }
+  }
+
+  function stopEventListeners() {
+    manageEventListeners('remove')
+    disconnectMutationObserver()
+    clearInterval(intervalTimer)
+  }
+
+  function teardown() {
+    stopMsgsToParent()
+    removeMsgListener()
+    if (true === autoResize) stopEventListeners()
+  }
+
+  function injectClearFixIntoBodyElement() {
+    var clearFix = document.createElement('div')
+    clearFix.style.clear = 'both'
+    // Guard against the following having been globally redefined in CSS.
+    clearFix.style.display = 'block'
+    clearFix.style.height = '0'
+    document.body.appendChild(clearFix)
+  }
+
+  function setupInPageLinks() {
+    function getPagePosition() {
+      return {
+        x:
+          window.pageXOffset !== undefined
+            ? window.pageXOffset
+            : document.documentElement.scrollLeft,
+        y:
+          window.pageYOffset !== undefined
+            ? window.pageYOffset
+            : document.documentElement.scrollTop
+      }
+    }
+
+    function getElementPosition(el) {
+      var elPosition = el.getBoundingClientRect(),
+        pagePosition = getPagePosition()
+
+      return {
+        x: parseInt(elPosition.left, 10) + parseInt(pagePosition.x, 10),
+        y: parseInt(elPosition.top, 10) + parseInt(pagePosition.y, 10)
+      }
+    }
+
+    function findTarget(location) {
+      function jumpToTarget(target) {
+        var jumpPosition = getElementPosition(target)
+
+        log(
+          'Moving to in page link (#' +
+            hash +
+            ') at x: ' +
+            jumpPosition.x +
+            ' y: ' +
+            jumpPosition.y
+        )
+        sendMsg(jumpPosition.y, jumpPosition.x, 'scrollToOffset') // X&Y reversed at sendMsg uses height/width
+      }
+
+      var hash = location.split('#')[1] || location, // Remove # if present
+        hashData = decodeURIComponent(hash),
+        target =
+          document.getElementById(hashData) ||
+          document.getElementsByName(hashData)[0]
+
+      if (undefined !== target) {
+        jumpToTarget(target)
+      } else {
+        log(
+          'In page link (#' +
+            hash +
+            ') not found in iFrame, so sending to parent'
+        )
+        sendMsg(0, 0, 'inPageLink', '#' + hash)
+      }
+    }
+
+    function checkLocationHash() {
+      if ('' !== location.hash && '#' !== location.hash) {
+        findTarget(location.href)
+      }
+    }
+
+    function bindAnchors() {
+      function setupLink(el) {
+        function linkClicked(e) {
+          e.preventDefault()
+
+          /* jshint validthis:true */
+          findTarget(this.getAttribute('href'))
+        }
+
+        if ('#' !== el.getAttribute('href')) {
+          addEventListener(el, 'click', linkClicked)
+        }
+      }
+
+      Array.prototype.forEach.call(
+        document.querySelectorAll('a[href^="#"]'),
+        setupLink
+      )
+    }
+
+    function bindLocationHash() {
+      addEventListener(window, 'hashchange', checkLocationHash)
+    }
+
+    function initCheck() {
+      // Check if page loaded with location hash after init resize
+      setTimeout(checkLocationHash, eventCancelTimer)
+    }
+
+    function enableInPageLinks() {
+      /* istanbul ignore else */ // Not testable in phantonJS
+      if (Array.prototype.forEach && document.querySelectorAll) {
+        log('Setting up location.hash handlers')
+        bindAnchors()
+        bindLocationHash()
+        initCheck()
+      } else {
+        warn(
+          'In page linking not fully supported in this browser! (See README.md for IE8 workaround)'
+        )
+      }
+    }
+
+    if (inPageLinks.enable) {
+      enableInPageLinks()
+    } else {
+      log('In page linking not enabled')
+    }
+
+    return {
+      findTarget: findTarget
+    }
+  }
+
+  function setupPublicMethods() {
+    log('Enable public methods')
+
+    win.parentIFrame = {
+      autoResize: function autoResizeF(resize) {
+        if (true === resize && false === autoResize) {
+          autoResize = true
+          startEventListeners()
+        } else if (false === resize && true === autoResize) {
+          autoResize = false
+          stopEventListeners()
+        }
+
+        return autoResize
+      },
+
+      close: function closeF() {
+        sendMsg(0, 0, 'close')
+        teardown()
+      },
+
+      getId: function getIdF() {
+        return myID
+      },
+
+      getPageInfo: function getPageInfoF(callback) {
+        if ('function' === typeof callback) {
+          onPageInfo = callback
+          sendMsg(0, 0, 'pageInfo')
+        } else {
+          onPageInfo = function() {}
+          sendMsg(0, 0, 'pageInfoStop')
+        }
+      },
+
+      moveToAnchor: function moveToAnchorF(hash) {
+        inPageLinks.findTarget(hash)
+      },
+
+      reset: function resetF() {
+        resetIFrame('parentIFrame.reset')
+      },
+
+      scrollTo: function scrollToF(x, y) {
+        sendMsg(y, x, 'scrollTo') // X&Y reversed at sendMsg uses height/width
+      },
+
+      scrollToOffset: function scrollToF(x, y) {
+        sendMsg(y, x, 'scrollToOffset') // X&Y reversed at sendMsg uses height/width
+      },
+
+      sendMessage: function sendMessageF(msg, targetOrigin) {
+        sendMsg(0, 0, 'message', JSON.stringify(msg), targetOrigin)
+      },
+
+      setHeightCalculationMethod: function setHeightCalculationMethodF(
+        heightCalculationMethod
+      ) {
+        heightCalcMode = heightCalculationMethod
+        checkHeightMode()
+      },
+
+      setWidthCalculationMethod: function setWidthCalculationMethodF(
+        widthCalculationMethod
+      ) {
+        widthCalcMode = widthCalculationMethod
+        checkWidthMode()
+      },
+
+      setTargetOrigin: function setTargetOriginF(targetOrigin) {
+        log('Set targetOrigin: ' + targetOrigin)
+        targetOriginDefault = targetOrigin
+      },
+
+      size: function sizeF(customHeight, customWidth) {
+        var valString =
+          '' + (customHeight || '') + (customWidth ? ',' + customWidth : '')
+        sendSize(
+          'size',
+          'parentIFrame.size(' + valString + ')',
+          customHeight,
+          customWidth
+        )
+      }
+    }
+  }
+
+  function initInterval() {
+    if (0 !== interval) {
+      log('setInterval: ' + interval + 'ms')
+      intervalTimer = setInterval(function() {
+        sendSize('interval', 'setInterval: ' + interval)
+      }, Math.abs(interval))
+    }
+  }
+
+  // Not testable in PhantomJS
+  /* istanbul ignore next */
+  function setupBodyMutationObserver() {
+    function addImageLoadListners(mutation) {
+      function addImageLoadListener(element) {
+        if (false === element.complete) {
+          log('Attach listeners to ' + element.src)
+          element.addEventListener('load', imageLoaded, false)
+          element.addEventListener('error', imageError, false)
+          elements.push(element)
+        }
+      }
+
+      if (mutation.type === 'attributes' && mutation.attributeName === 'src') {
+        addImageLoadListener(mutation.target)
+      } else if (mutation.type === 'childList') {
+        Array.prototype.forEach.call(
+          mutation.target.querySelectorAll('img'),
+          addImageLoadListener
+        )
+      }
+    }
+
+    function removeFromArray(element) {
+      elements.splice(elements.indexOf(element), 1)
+    }
+
+    function removeImageLoadListener(element) {
+      log('Remove listeners from ' + element.src)
+      element.removeEventListener('load', imageLoaded, false)
+      element.removeEventListener('error', imageError, false)
+      removeFromArray(element)
+    }
+
+    function imageEventTriggered(event, type, typeDesc) {
+      removeImageLoadListener(event.target)
+      sendSize(type, typeDesc + ': ' + event.target.src, undefined, undefined)
+    }
+
+    function imageLoaded(event) {
+      imageEventTriggered(event, 'imageLoad', 'Image loaded')
+    }
+
+    function imageError(event) {
+      imageEventTriggered(event, 'imageLoadFailed', 'Image load failed')
+    }
+
+    function mutationObserved(mutations) {
+      sendSize(
+        'mutationObserver',
+        'mutationObserver: ' + mutations[0].target + ' ' + mutations[0].type
+      )
+
+      // Deal with WebKit / Blink asyncing image loading when tags are injected into the page
+      mutations.forEach(addImageLoadListners)
+    }
+
+    function createMutationObserver() {
+      var target = document.querySelector('body'),
+        config = {
+          attributes: true,
+          attributeOldValue: false,
+          characterData: true,
+          characterDataOldValue: false,
+          childList: true,
+          subtree: true
+        }
+
+      observer = new MutationObserver(mutationObserved)
+
+      log('Create body MutationObserver')
+      observer.observe(target, config)
+
+      return observer
+    }
+
+    var elements = [],
+      MutationObserver =
+        window.MutationObserver || window.WebKitMutationObserver,
+      observer = createMutationObserver()
+
+    return {
+      disconnect: function() {
+        if ('disconnect' in observer) {
+          log('Disconnect body MutationObserver')
+          observer.disconnect()
+          elements.forEach(removeImageLoadListener)
+        }
+      }
+    }
+  }
+
+  function setupMutationObserver() {
+    var forceIntervalTimer = 0 > interval
+
+    // Not testable in PhantomJS
+    /* istanbul ignore if */ if (
+      window.MutationObserver ||
+      window.WebKitMutationObserver
+    ) {
+      if (forceIntervalTimer) {
+        initInterval()
+      } else {
+        bodyObserver = setupBodyMutationObserver()
+      }
+    } else {
+      log('MutationObserver not supported in this browser!')
+      initInterval()
+    }
+  }
+
+  // document.documentElement.offsetHeight is not reliable, so
+  // we have to jump through hoops to get a better value.
+  function getComputedStyle(prop, el) {
+    var retVal = 0
+    el = el || document.body // Not testable in phantonJS
+
+    retVal = document.defaultView.getComputedStyle(el, null)
+    retVal = null !== retVal ? retVal[prop] : 0
+
+    return parseInt(retVal, base)
+  }
+
+  function chkEventThottle(timer) {
+    if (timer > throttledTimer / 2) {
+      throttledTimer = 2 * timer
+      log('Event throttle increased to ' + throttledTimer + 'ms')
+    }
+  }
+
+  // Idea from https://github.com/guardian/iframe-messenger
+  function getMaxElement(side, elements) {
+    var elementsLength = elements.length,
+      elVal = 0,
+      maxVal = 0,
+      Side = capitalizeFirstLetter(side),
+      timer = getNow()
+
+    for (var i = 0; i < elementsLength; i++) {
+      elVal =
+        elements[i].getBoundingClientRect()[side] +
+        getComputedStyle('margin' + Side, elements[i])
+      if (elVal > maxVal) {
+        maxVal = elVal
+      }
+    }
+
+    timer = getNow() - timer
+
+    log('Parsed ' + elementsLength + ' HTML elements')
+    log('Element position calculated in ' + timer + 'ms')
+
+    chkEventThottle(timer)
+
+    return maxVal
+  }
+
+  function getAllMeasurements(dimention) {
+    return [
+      dimention.bodyOffset(),
+      dimention.bodyScroll(),
+      dimention.documentElementOffset(),
+      dimention.documentElementScroll()
+    ]
+  }
+
+  function getTaggedElements(side, tag) {
+    function noTaggedElementsFound() {
+      warn('No tagged elements (' + tag + ') found on page')
+      return document.querySelectorAll('body *')
+    }
+
+    var elements = document.querySelectorAll('[' + tag + ']')
+
+    if (0 === elements.length) noTaggedElementsFound()
+
+    return getMaxElement(side, elements)
+  }
+
+  function getAllElements() {
+    return document.querySelectorAll('body *')
+  }
+
+  var getHeight = {
+      bodyOffset: function getBodyOffsetHeight() {
+        return (
+          document.body.offsetHeight +
+          getComputedStyle('marginTop') +
+          getComputedStyle('marginBottom')
+        )
+      },
+
+      offset: function() {
+        return getHeight.bodyOffset() // Backwards compatability
+      },
+
+      bodyScroll: function getBodyScrollHeight() {
+        return document.body.scrollHeight
+      },
+
+      custom: function getCustomWidth() {
+        return customCalcMethods.height()
+      },
+
+      documentElementOffset: function getDEOffsetHeight() {
+        return document.documentElement.offsetHeight
+      },
+
+      documentElementScroll: function getDEScrollHeight() {
+        return document.documentElement.scrollHeight
+      },
+
+      max: function getMaxHeight() {
+        return Math.max.apply(null, getAllMeasurements(getHeight))
+      },
+
+      min: function getMinHeight() {
+        return Math.min.apply(null, getAllMeasurements(getHeight))
+      },
+
+      grow: function growHeight() {
+        return getHeight.max() // Run max without the forced downsizing
+      },
+
+      lowestElement: function getBestHeight() {
+        return Math.max(
+          getHeight.bodyOffset() || getHeight.documentElementOffset(),
+          getMaxElement('bottom', getAllElements())
+        )
+      },
+
+      taggedElement: function getTaggedElementsHeight() {
+        return getTaggedElements('bottom', 'data-iframe-height')
+      }
+    },
+    getWidth = {
+      bodyScroll: function getBodyScrollWidth() {
+        return document.body.scrollWidth
+      },
+
+      bodyOffset: function getBodyOffsetWidth() {
+        return document.body.offsetWidth
+      },
+
+      custom: function getCustomWidth() {
+        return customCalcMethods.width()
+      },
+
+      documentElementScroll: function getDEScrollWidth() {
+        return document.documentElement.scrollWidth
+      },
+
+      documentElementOffset: function getDEOffsetWidth() {
+        return document.documentElement.offsetWidth
+      },
+
+      scroll: function getMaxWidth() {
+        return Math.max(getWidth.bodyScroll(), getWidth.documentElementScroll())
+      },
+
+      max: function getMaxWidth() {
+        return Math.max.apply(null, getAllMeasurements(getWidth))
+      },
+
+      min: function getMinWidth() {
+        return Math.min.apply(null, getAllMeasurements(getWidth))
+      },
+
+      rightMostElement: function rightMostElement() {
+        return getMaxElement('right', getAllElements())
+      },
+
+      taggedElement: function getTaggedElementsWidth() {
+        return getTaggedElements('right', 'data-iframe-width')
+      }
+    }
+
+  function sizeIFrame(
+    triggerEvent,
+    triggerEventDesc,
+    customHeight,
+    customWidth
+  ) {
+    function resizeIFrame() {
+      height = currentHeight
+      width = currentWidth
+
+      sendMsg(height, width, triggerEvent)
+    }
+
+    function isSizeChangeDetected() {
+      function checkTolarance(a, b) {
+        var retVal = Math.abs(a - b) <= tolerance
+        return !retVal
+      }
+
+      currentHeight =
+        undefined !== customHeight ? customHeight : getHeight[heightCalcMode]()
+      currentWidth =
+        undefined !== customWidth ? customWidth : getWidth[widthCalcMode]()
+
+      return (
+        checkTolarance(height, currentHeight) ||
+        (calculateWidth && checkTolarance(width, currentWidth))
+      )
+    }
+
+    function isForceResizableEvent() {
+      return !(triggerEvent in { init: 1, interval: 1, size: 1 })
+    }
+
+    function isForceResizableCalcMode() {
+      return (
+        heightCalcMode in resetRequiredMethods ||
+        (calculateWidth && widthCalcMode in resetRequiredMethods)
+      )
+    }
+
+    function logIgnored() {
+      log('No change in size detected')
+    }
+
+    function checkDownSizing() {
+      if (isForceResizableEvent() && isForceResizableCalcMode()) {
+        resetIFrame(triggerEventDesc)
+      } else if (!(triggerEvent in { interval: 1 })) {
+        logIgnored()
+      }
+    }
+
+    var currentHeight, currentWidth
+
+    if (isSizeChangeDetected() || 'init' === triggerEvent) {
+      lockTrigger()
+      resizeIFrame()
+    } else {
+      checkDownSizing()
+    }
+  }
+
+  var sizeIFrameThrottled = throttle(sizeIFrame)
+
+  function sendSize(triggerEvent, triggerEventDesc, customHeight, customWidth) {
+    function recordTrigger() {
+      if (!(triggerEvent in { reset: 1, resetPage: 1, init: 1 })) {
+        log('Trigger event: ' + triggerEventDesc)
+      }
+    }
+
+    function isDoubleFiredEvent() {
+      return triggerLocked && triggerEvent in doubleEventList
+    }
+
+    if (!isDoubleFiredEvent()) {
+      recordTrigger()
+      if (triggerEvent === 'init') {
+        sizeIFrame(triggerEvent, triggerEventDesc, customHeight, customWidth)
+      } else {
+        sizeIFrameThrottled(
+          triggerEvent,
+          triggerEventDesc,
+          customHeight,
+          customWidth
+        )
+      }
+    } else {
+      log('Trigger event cancelled: ' + triggerEvent)
+    }
+  }
+
+  function lockTrigger() {
+    if (!triggerLocked) {
+      triggerLocked = true
+      log('Trigger event lock on')
+    }
+    clearTimeout(triggerLockedTimer)
+    triggerLockedTimer = setTimeout(function() {
+      triggerLocked = false
+      log('Trigger event lock off')
+      log('--')
+    }, eventCancelTimer)
+  }
+
+  function triggerReset(triggerEvent) {
+    height = getHeight[heightCalcMode]()
+    width = getWidth[widthCalcMode]()
+
+    sendMsg(height, width, triggerEvent)
+  }
+
+  function resetIFrame(triggerEventDesc) {
+    var hcm = heightCalcMode
+    heightCalcMode = heightCalcModeDefault
+
+    log('Reset trigger event: ' + triggerEventDesc)
+    lockTrigger()
+    triggerReset('reset')
+
+    heightCalcMode = hcm
+  }
+
+  function sendMsg(height, width, triggerEvent, msg, targetOrigin) {
+    function setTargetOrigin() {
+      if (undefined === targetOrigin) {
+        targetOrigin = targetOriginDefault
+      } else {
+        log('Message targetOrigin: ' + targetOrigin)
+      }
+    }
+
+    function sendToParent() {
+      var size = height + ':' + width,
+        message =
+          myID +
+          ':' +
+          size +
+          ':' +
+          triggerEvent +
+          (undefined !== msg ? ':' + msg : '')
+
+      log('Sending message to host page (' + message + ')')
+      target.postMessage(msgID + message, targetOrigin)
+    }
+
+    if (true === sendPermit) {
+      setTargetOrigin()
+      sendToParent()
+    }
+  }
+
+  function receiver(event) {
+    var processRequestFromParent = {
+      init: function initFromParent() {
+        initMsg = event.data
+        target = event.source
+
+        init()
+        firstRun = false
+        setTimeout(function() {
+          initLock = false
+        }, eventCancelTimer)
+      },
+
+      reset: function resetFromParent() {
+        if (!initLock) {
+          log('Page size reset by host page')
+          triggerReset('resetPage')
+        } else {
+          log('Page reset ignored by init')
+        }
+      },
+
+      resize: function resizeFromParent() {
+        sendSize('resizeParent', 'Parent window requested size check')
+      },
+
+      moveToAnchor: function moveToAnchorF() {
+        inPageLinks.findTarget(getData())
+      },
+      inPageLink: function inPageLinkF() {
+        this.moveToAnchor()
+      }, // Backward compatability
+
+      pageInfo: function pageInfoFromParent() {
+        var msgBody = getData()
+        log('PageInfoFromParent called from parent: ' + msgBody)
+        onPageInfo(JSON.parse(msgBody))
+        log(' --')
+      },
+
+      message: function messageFromParent() {
+        var msgBody = getData()
+
+        log('onMessage called from parent: ' + msgBody)
+        // eslint-disable-next-line sonarjs/no-extra-arguments
+        onMessage(JSON.parse(msgBody))
+        log(' --')
+      }
+    }
+
+    function isMessageForUs() {
+      return msgID === ('' + event.data).substr(0, msgIdLen) // ''+ Protects against non-string messages
+    }
+
+    function getMessageType() {
+      return event.data.split(']')[1].split(':')[0]
+    }
+
+    function getData() {
+      return event.data.substr(event.data.indexOf(':') + 1)
+    }
+
+    function isMiddleTier() {
+      return (
+        (!(typeof module !== 'undefined' && module.exports) &&
+          'iFrameResize' in window) ||
+        ('jQuery' in window && 'iFrameResize' in window.jQuery.prototype)
+      )
+    }
+
+    function isInitMsg() {
+      // Test if this message is from a child below us. This is an ugly test, however, updating
+      // the message format would break backwards compatibity.
+      return event.data.split(':')[2] in { true: 1, false: 1 }
+    }
+
+    function callFromParent() {
+      var messageType = getMessageType()
+
+      if (messageType in processRequestFromParent) {
+        processRequestFromParent[messageType]()
+      } else if (!isMiddleTier() && !isInitMsg()) {
+        warn('Unexpected message (' + event.data + ')')
+      }
+    }
+
+    function processMessage() {
+      if (false === firstRun) {
+        callFromParent()
+      } else if (isInitMsg()) {
+        processRequestFromParent.init()
+      } else {
+        log(
+          'Ignored message of type "' +
+            getMessageType() +
+            '". Received before initialization.'
+        )
+      }
+    }
+
+    if (isMessageForUs()) {
+      processMessage()
+    }
+  }
+
+  // Normally the parent kicks things off when it detects the iFrame has loaded.
+  // If this script is async-loaded, then tell parent page to retry init.
+  function chkLateLoaded() {
+    if ('loading' !== document.readyState) {
+      window.parent.postMessage('[iFrameResizerChild]Ready', '*')
+    }
+  }
+
+  addEventListener(window, 'message', receiver)
+  addEventListener(window, 'readystatechange', chkLateLoaded)
+  chkLateLoaded()
+
+  
+})();
+
+
+/*!
+ * jQuery JavaScript Library v3.6.0
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright OpenJS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2021-03-02T17:08Z
+ */
+( function( global, factory ) {
+
+	"use strict";
+
+	if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+		// For CommonJS and CommonJS-like environments where a proper `window`
+		// is present, execute the factory and get jQuery.
+		// For environments that do not have a `window` with a `document`
+		// (such as Node.js), expose a factory as module.exports.
+		// This accentuates the need for the creation of a real `window`.
+		// e.g. var jQuery = require("jquery")(window);
+		// See ticket #14549 for more info.
+		module.exports = global.document ?
+			factory( global, true ) :
+			function( w ) {
+				if ( !w.document ) {
+					throw new Error( "jQuery requires a window with a document" );
+				}
+				return factory( w );
+			};
+	} else {
+		factory( global );
+	}
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var flat = arr.flat ? function( array ) {
+	return arr.flat.call( array );
+} : function( array ) {
+	return arr.concat.apply( [], array );
+};
+
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+		// Support: Chrome <=57, Firefox <=52
+		// In some browsers, typeof returns "function" for HTML <object> elements
+		// (i.e., `typeof document.createElement( "object" ) === "function"`).
+		// We don't want to classify *any* DOM node as a function.
+		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+		// Plus for old WebKit, typeof returns "function" for HTML collections
+		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+			typeof obj.item !== "function";
+	};
+
+
+var isWindow = function isWindow( obj ) {
+		return obj != null && obj === obj.window;
+	};
+
+
+var document = window.document;
+
+
+
+	var preservedScriptAttributes = {
+		type: true,
+		src: true,
+		nonce: true,
+		noModule: true
+	};
+
+	function DOMEval( code, node, doc ) {
+		doc = doc || document;
+
+		var i, val,
+			script = doc.createElement( "script" );
+
+		script.text = code;
+		if ( node ) {
+			for ( i in preservedScriptAttributes ) {
+
+				// Support: Firefox 64+, Edge 18+
+				// Some browsers don't support the "nonce" property on scripts.
+				// On the other hand, just using `getAttribute` is not enough as
+				// the `nonce` attribute is reset to an empty string whenever it
+				// becomes browsing-context connected.
+				// See https://github.com/whatwg/html/issues/2369
+				// See https://html.spec.whatwg.org/#nonce-attributes
+				// The `node.getAttribute` check was added for the sake of
+				// `jQuery.globalEval` so that it can fake a nonce-containing node
+				// via an object.
+				val = node[ i ] || node.getAttribute && node.getAttribute( i );
+				if ( val ) {
+					script.setAttribute( i, val );
+				}
+			}
+		}
+		doc.head.appendChild( script ).parentNode.removeChild( script );
+	}
+
+
+function toType( obj ) {
+	if ( obj == null ) {
+		return obj + "";
+	}
+
+	// Support: Android <=2.3 only (functionish RegExp)
+	return typeof obj === "object" || typeof obj === "function" ?
+		class2type[ toString.call( obj ) ] || "object" :
+		typeof obj;
+}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+	version = "3.6.0",
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+
+		// The jQuery object is actually just the init constructor 'enhanced'
+		// Need init if jQuery is called (just allow error to be thrown if not included)
+		return new jQuery.fn.init( selector, context );
+	};
+
+jQuery.fn = jQuery.prototype = {
+
+	// The current version of jQuery being used
+	jquery: version,
+
+	constructor: jQuery,
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+
+		// Return all the elements in a clean array
+		if ( num == null ) {
+			return slice.call( this );
+		}
+
+		// Return just the one element from the set
+		return num < 0 ? this[ num + this.length ] : this[ num ];
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	each: function( callback ) {
+		return jQuery.each( this, callback );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map( this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		} ) );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	even: function() {
+		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+			return ( i + 1 ) % 2;
+		} ) );
+	},
+
+	odd: function() {
+		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+			return i % 2;
+		} ) );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor();
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: arr.sort,
+	splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[ 0 ] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+
+		// Skip the boolean and the target
+		target = arguments[ i ] || {};
+		i++;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !isFunction( target ) ) {
+		target = {};
+	}
+
+	// Extend jQuery itself if only one argument is passed
+	if ( i === length ) {
+		target = this;
+		i--;
+	}
+
+	for ( ; i < length; i++ ) {
+
+		// Only deal with non-null/undefined values
+		if ( ( options = arguments[ i ] ) != null ) {
+
+			// Extend the base object
+			for ( name in options ) {
+				copy = options[ name ];
+
+				// Prevent Object.prototype pollution
+				// Prevent never-ending loop
+				if ( name === "__proto__" || target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+					( copyIsArray = Array.isArray( copy ) ) ) ) {
+					src = target[ name ];
+
+					// Ensure proper type for the source value
+					if ( copyIsArray && !Array.isArray( src ) ) {
+						clone = [];
+					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
+						clone = {};
+					} else {
+						clone = src;
+					}
+					copyIsArray = false;
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend( {
+
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+	// Assume jQuery is ready without the ready module
+	isReady: true,
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	noop: function() {},
+
+	isPlainObject: function( obj ) {
+		var proto, Ctor;
+
+		// Detect obvious negatives
+		// Use toString instead of jQuery.type to catch host objects
+		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+			return false;
+		}
+
+		proto = getProto( obj );
+
+		// Objects with no prototype (e.g., `Object.create( null )`) are plain
+		if ( !proto ) {
+			return true;
+		}
+
+		// Objects with prototype are plain iff they were constructed by a global Object function
+		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	// Evaluates a script in a provided context; falls back to the global one
+	// if not specified.
+	globalEval: function( code, options, doc ) {
+		DOMEval( code, { nonce: options && options.nonce }, doc );
+	},
+
+	each: function( obj, callback ) {
+		var length, i = 0;
+
+		if ( isArrayLike( obj ) ) {
+			length = obj.length;
+			for ( ; i < length; i++ ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		} else {
+			for ( i in obj ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArrayLike( Object( arr ) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+						[ arr ] : arr
+				);
+			} else {
+				push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		return arr == null ? -1 : indexOf.call( arr, elem, i );
+	},
+
+	// Support: Android <=4.0 only, PhantomJS 1 only
+	// push.apply(_, arraylike) throws on ancient WebKit
+	merge: function( first, second ) {
+		var len = +second.length,
+			j = 0,
+			i = first.length;
+
+		for ( ; j < len; j++ ) {
+			first[ i++ ] = second[ j ];
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, invert ) {
+		var callbackInverse,
+			matches = [],
+			i = 0,
+			length = elems.length,
+			callbackExpect = !invert;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			callbackInverse = !callback( elems[ i ], i );
+			if ( callbackInverse !== callbackExpect ) {
+				matches.push( elems[ i ] );
+			}
+		}
+
+		return matches;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var length, value,
+			i = 0,
+			ret = [];
+
+		// Go through the array, translating each of the items to their new values
+		if ( isArrayLike( elems ) ) {
+			length = elems.length;
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return flat( ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// jQuery.support is not used in Core but other projects attach their
+	// properties to it so it needs to exist.
+	support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+	function( _i, name ) {
+		class2type[ "[object " + name + "]" ] = name.toLowerCase();
+	} );
+
+function isArrayLike( obj ) {
+
+	// Support: real iOS 8.2 only (not reproducible in simulator)
+	// `in` check used to prevent JIT error (gh-2145)
+	// hasOwn isn't used here due to false negatives
+	// regarding Nodelist length in IE
+	var length = !!obj && "length" in obj && obj.length,
+		type = toType( obj );
+
+	if ( isFunction( obj ) || isWindow( obj ) ) {
+		return false;
+	}
+
+	return type === "array" || length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.6
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://js.foundation/
+ *
+ * Date: 2021-02-16
+ */
+( function( window ) {
+var i,
+	support,
+	Expr,
+	getText,
+	isXML,
+	tokenize,
+	compile,
+	select,
+	outermostContext,
+	sortInput,
+	hasDuplicate,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + 1 * new Date(),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	nonnativeSelectorCache = createCache(),
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+		}
+		return 0;
+	},
+
+	// Instance methods
+	hasOwn = ( {} ).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	pushNative = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+
+	// Use a stripped-down indexOf as it's faster than native
+	// https://jsperf.com/thor-indexof-vs-for/5
+	indexOf = function( list, elem ) {
+		var i = 0,
+			len = list.length;
+		for ( ; i < len; i++ ) {
+			if ( list[ i ] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
+		"ismap|loop|multiple|open|readonly|required|scoped",
+
+	// Regular expressions
+
+	// http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+
+	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
+	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
+		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
+
+	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+
+		// Operator (capture 2)
+		"*([*^$|!~]?=)" + whitespace +
+
+		// "Attribute values must be CSS identifiers [capture 5]
+		// or strings [capture 3 or capture 4]"
+		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
+		whitespace + "*\\]",
+
+	pseudos = ":(" + identifier + ")(?:\\((" +
+
+		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+		// 1. quoted (capture 3; capture 4 or capture 5)
+		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+
+		// 2. simple (capture 6)
+		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+
+		// 3. anything else (capture 2)
+		".*" +
+		")\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rwhitespace = new RegExp( whitespace + "+", "g" ),
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
+		whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
+		"*" ),
+	rdescend = new RegExp( whitespace + "|>" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + identifier + ")" ),
+		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
+			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
+			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace +
+			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rhtml = /HTML$/i,
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rsibling = /[+~]/,
+
+	// CSS escapes
+	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
+	funescape = function( escape, nonHex ) {
+		var high = "0x" + escape.slice( 1 ) - 0x10000;
+
+		return nonHex ?
+
+			// Strip the backslash prefix from a non-hex escape sequence
+			nonHex :
+
+			// Replace a hexadecimal escape sequence with the encoded Unicode code point
+			// Support: IE <=11+
+			// For values outside the Basic Multilingual Plane (BMP), manually construct a
+			// surrogate pair
+			high < 0 ?
+				String.fromCharCode( high + 0x10000 ) :
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	},
+
+	// CSS string/identifier serialization
+	// https://drafts.csswg.org/cssom/#common-serializing-idioms
+	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+	fcssescape = function( ch, asCodePoint ) {
+		if ( asCodePoint ) {
+
+			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+			if ( ch === "\0" ) {
+				return "\uFFFD";
+			}
+
+			// Control characters and (dependent upon position) numbers get escaped as code points
+			return ch.slice( 0, -1 ) + "\\" +
+				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+		}
+
+		// Other potentially-special ASCII characters get backslash-escaped
+		return "\\" + ch;
+	},
+
+	// Used for iframes
+	// See setDocument()
+	// Removing the function wrapper causes a "Permission Denied"
+	// error in IE
+	unloadHandler = function() {
+		setDocument();
+	},
+
+	inDisabledFieldset = addCombinator(
+		function( elem ) {
+			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
+		},
+		{ dir: "parentNode", next: "legend" }
+	);
+
+// Optimize for push.apply( _, NodeList )
+try {
+	push.apply(
+		( arr = slice.call( preferredDoc.childNodes ) ),
+		preferredDoc.childNodes
+	);
+
+	// Support: Android<4.0
+	// Detect silently failing push.apply
+	// eslint-disable-next-line no-unused-expressions
+	arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+	push = { apply: arr.length ?
+
+		// Leverage slice if possible
+		function( target, els ) {
+			pushNative.apply( target, slice.call( els ) );
+		} :
+
+		// Support: IE<9
+		// Otherwise append directly
+		function( target, els ) {
+			var j = target.length,
+				i = 0;
+
+			// Can't trust NodeList.length
+			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
+			target.length = j - 1;
+		}
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var m, i, elem, nid, match, groups, newSelector,
+		newContext = context && context.ownerDocument,
+
+		// nodeType defaults to 9, since context defaults to document
+		nodeType = context ? context.nodeType : 9;
+
+	results = results || [];
+
+	// Return early from calls with invalid selector or context
+	if ( typeof selector !== "string" || !selector ||
+		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+		return results;
+	}
+
+	// Try to shortcut find operations (as opposed to filters) in HTML documents
+	if ( !seed ) {
+		setDocument( context );
+		context = context || document;
+
+		if ( documentIsHTML ) {
+
+			// If the selector is sufficiently simple, try using a "get*By*" DOM method
+			// (excepting DocumentFragment context, where the methods don't exist)
+			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
+
+				// ID selector
+				if ( ( m = match[ 1 ] ) ) {
+
+					// Document context
+					if ( nodeType === 9 ) {
+						if ( ( elem = context.getElementById( m ) ) ) {
+
+							// Support: IE, Opera, Webkit
+							// TODO: identify versions
+							// getElementById can match elements by name instead of ID
+							if ( elem.id === m ) {
+								results.push( elem );
+								return results;
+							}
+						} else {
+							return results;
+						}
+
+					// Element context
+					} else {
+
+						// Support: IE, Opera, Webkit
+						// TODO: identify versions
+						// getElementById can match elements by name instead of ID
+						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
+							contains( context, elem ) &&
+							elem.id === m ) {
+
+							results.push( elem );
+							return results;
+						}
+					}
+
+				// Type selector
+				} else if ( match[ 2 ] ) {
+					push.apply( results, context.getElementsByTagName( selector ) );
+					return results;
+
+				// Class selector
+				} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
+					context.getElementsByClassName ) {
+
+					push.apply( results, context.getElementsByClassName( m ) );
+					return results;
+				}
+			}
+
+			// Take advantage of querySelectorAll
+			if ( support.qsa &&
+				!nonnativeSelectorCache[ selector + " " ] &&
+				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
+
+				// Support: IE 8 only
+				// Exclude object elements
+				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
+
+				newSelector = selector;
+				newContext = context;
+
+				// qSA considers elements outside a scoping root when evaluating child or
+				// descendant combinators, which is not what we want.
+				// In such cases, we work around the behavior by prefixing every selector in the
+				// list with an ID selector referencing the scope context.
+				// The technique has to be used as well when a leading combinator is used
+				// as such selectors are not recognized by querySelectorAll.
+				// Thanks to Andrew Dupont for this technique.
+				if ( nodeType === 1 &&
+					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
+
+					// Expand context for sibling selectors
+					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+						context;
+
+					// We can use :scope instead of the ID hack if the browser
+					// supports it & if we're not changing the context.
+					if ( newContext !== context || !support.scope ) {
+
+						// Capture the context ID, setting it first if necessary
+						if ( ( nid = context.getAttribute( "id" ) ) ) {
+							nid = nid.replace( rcssescape, fcssescape );
+						} else {
+							context.setAttribute( "id", ( nid = expando ) );
+						}
+					}
+
+					// Prefix every selector in the list
+					groups = tokenize( selector );
+					i = groups.length;
+					while ( i-- ) {
+						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
+							toSelector( groups[ i ] );
+					}
+					newSelector = groups.join( "," );
+				}
+
+				try {
+					push.apply( results,
+						newContext.querySelectorAll( newSelector )
+					);
+					return results;
+				} catch ( qsaError ) {
+					nonnativeSelectorCache( selector, true );
+				} finally {
+					if ( nid === expando ) {
+						context.removeAttribute( "id" );
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var keys = [];
+
+	function cache( key, value ) {
+
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key + " " ) > Expr.cacheLength ) {
+
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return ( cache[ key + " " ] = value );
+	}
+	return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+	var el = document.createElement( "fieldset" );
+
+	try {
+		return !!fn( el );
+	} catch ( e ) {
+		return false;
+	} finally {
+
+		// Remove from its parent by default
+		if ( el.parentNode ) {
+			el.parentNode.removeChild( el );
+		}
+
+		// release memory in IE
+		el = null;
+	}
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+	var arr = attrs.split( "|" ),
+		i = arr.length;
+
+	while ( i-- ) {
+		Expr.attrHandle[ arr[ i ] ] = handler;
+	}
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+			a.sourceIndex - b.sourceIndex;
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( ( cur = cur.nextSibling ) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return ( name === "input" || name === "button" ) && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+	return function( elem ) {
+
+		// Only certain elements can match :enabled or :disabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+		if ( "form" in elem ) {
+
+			// Check for inherited disabledness on relevant non-disabled elements:
+			// * listed form-associated elements in a disabled fieldset
+			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+			// * option elements in a disabled optgroup
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+			// All such elements have a "form" property.
+			if ( elem.parentNode && elem.disabled === false ) {
+
+				// Option elements defer to a parent optgroup if present
+				if ( "label" in elem ) {
+					if ( "label" in elem.parentNode ) {
+						return elem.parentNode.disabled === disabled;
+					} else {
+						return elem.disabled === disabled;
+					}
+				}
+
+				// Support: IE 6 - 11
+				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
+				return elem.isDisabled === disabled ||
+
+					// Where there is no isDisabled, check manually
+					/* jshint -W018 */
+					elem.isDisabled !== !disabled &&
+					inDisabledFieldset( elem ) === disabled;
+			}
+
+			return elem.disabled === disabled;
+
+		// Try to winnow out elements that can't be disabled before trusting the disabled property.
+		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+		// even exist on them, let alone have a boolean value.
+		} else if ( "label" in elem ) {
+			return elem.disabled === disabled;
+		}
+
+		// Remaining elements are neither :enabled nor :disabled
+		return false;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+	return markFunction( function( argument ) {
+		argument = +argument;
+		return markFunction( function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
+					seed[ j ] = !( matches[ j ] = seed[ j ] );
+				}
+			}
+		} );
+	} );
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+	return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	var namespace = elem && elem.namespaceURI,
+		docElem = elem && ( elem.ownerDocument || elem ).documentElement;
+
+	// Support: IE <=8
+	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
+	// https://bugs.jquery.com/ticket/4833
+	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var hasCompare, subWindow,
+		doc = node ? node.ownerDocument || node : preferredDoc;
+
+	// Return early if doc is invalid or already selected
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Update global variables
+	document = doc;
+	docElem = document.documentElement;
+	documentIsHTML = !isXML( document );
+
+	// Support: IE 9 - 11+, Edge 12 - 18+
+	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( preferredDoc != document &&
+		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
+
+		// Support: IE 11, Edge
+		if ( subWindow.addEventListener ) {
+			subWindow.addEventListener( "unload", unloadHandler, false );
+
+		// Support: IE 9 - 10 only
+		} else if ( subWindow.attachEvent ) {
+			subWindow.attachEvent( "onunload", unloadHandler );
+		}
+	}
+
+	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
+	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
+	// IE/Edge & older browsers don't support the :scope pseudo-class.
+	// Support: Safari 6.0 only
+	// Safari 6.0 supports :scope but it's an alias of :root there.
+	support.scope = assert( function( el ) {
+		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
+		return typeof el.querySelectorAll !== "undefined" &&
+			!el.querySelectorAll( ":scope fieldset div" ).length;
+	} );
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties
+	// (excepting IE8 booleans)
+	support.attributes = assert( function( el ) {
+		el.className = "i";
+		return !el.getAttribute( "className" );
+	} );
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert( function( el ) {
+		el.appendChild( document.createComment( "" ) );
+		return !el.getElementsByTagName( "*" ).length;
+	} );
+
+	// Support: IE<9
+	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programmatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert( function( el ) {
+		docElem.appendChild( el ).id = expando;
+		return !document.getElementsByName || !document.getElementsByName( expando ).length;
+	} );
+
+	// ID filter and find
+	if ( support.getById ) {
+		Expr.filter[ "ID" ] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute( "id" ) === attrId;
+			};
+		};
+		Expr.find[ "ID" ] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var elem = context.getElementById( id );
+				return elem ? [ elem ] : [];
+			}
+		};
+	} else {
+		Expr.filter[ "ID" ] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== "undefined" &&
+					elem.getAttributeNode( "id" );
+				return node && node.value === attrId;
+			};
+		};
+
+		// Support: IE 6 - 7 only
+		// getElementById is not reliable as a find shortcut
+		Expr.find[ "ID" ] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var node, i, elems,
+					elem = context.getElementById( id );
+
+				if ( elem ) {
+
+					// Verify the id attribute
+					node = elem.getAttributeNode( "id" );
+					if ( node && node.value === id ) {
+						return [ elem ];
+					}
+
+					// Fall back on getElementsByName
+					elems = context.getElementsByName( id );
+					i = 0;
+					while ( ( elem = elems[ i++ ] ) ) {
+						node = elem.getAttributeNode( "id" );
+						if ( node && node.value === id ) {
+							return [ elem ];
+						}
+					}
+				}
+
+				return [];
+			}
+		};
+	}
+
+	// Tag
+	Expr.find[ "TAG" ] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( tag );
+
+			// DocumentFragment nodes don't have gEBTN
+			} else if ( support.qsa ) {
+				return context.querySelectorAll( tag );
+			}
+		} :
+
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+
+				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( ( elem = results[ i++ ] ) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Class
+	Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	/* QSA/matchesSelector
+	---------------------------------------------------------------------- */
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21)
+	// We allow this because of a bug in IE8/9 that throws an error
+	// whenever `document.activeElement` is accessed on an iframe
+	// So, we allow :focus to pass through QSA all the time to avoid the IE error
+	// See https://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
+
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert( function( el ) {
+
+			var input;
+
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explicitly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// https://bugs.jquery.com/ticket/12359
+			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
+				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
+				"<option selected=''></option></select>";
+
+			// Support: IE8, Opera 11-12.16
+			// Nothing should be selected when empty strings follow ^= or $= or *=
+			// The test attribute must be unknown in Opera but "safe" for WinRT
+			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+			if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+			}
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !el.querySelectorAll( "[selected]" ).length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+				rbuggyQSA.push( "~=" );
+			}
+
+			// Support: IE 11+, Edge 15 - 18+
+			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
+			// Adding a temporary attribute to the document before the selection works
+			// around the issue.
+			// Interestingly, IE 10 & older don't seem to have the issue.
+			input = document.createElement( "input" );
+			input.setAttribute( "name", "" );
+			el.appendChild( input );
+			if ( !el.querySelectorAll( "[name='']" ).length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
+					whitespace + "*(?:''|\"\")" );
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !el.querySelectorAll( ":checked" ).length ) {
+				rbuggyQSA.push( ":checked" );
+			}
+
+			// Support: Safari 8+, iOS 8+
+			// https://bugs.webkit.org/show_bug.cgi?id=136851
+			// In-page `selector#id sibling-combinator selector` fails
+			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+				rbuggyQSA.push( ".#.+[+~]" );
+			}
+
+			// Support: Firefox <=3.6 - 5 only
+			// Old Firefox doesn't throw on a badly-escaped identifier.
+			el.querySelectorAll( "\\\f" );
+			rbuggyQSA.push( "[\\r\\n\\f]" );
+		} );
+
+		assert( function( el ) {
+			el.innerHTML = "<a href='' disabled='disabled'></a>" +
+				"<select disabled='disabled'><option/></select>";
+
+			// Support: Windows 8 Native Apps
+			// The type and name attributes are restricted during .innerHTML assignment
+			var input = document.createElement( "input" );
+			input.setAttribute( "type", "hidden" );
+			el.appendChild( input ).setAttribute( "name", "D" );
+
+			// Support: IE8
+			// Enforce case-sensitivity of name attribute
+			if ( el.querySelectorAll( "[name=d]" ).length ) {
+				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Support: IE9-11+
+			// IE's :disabled selector does not pick up the children of disabled fieldsets
+			docElem.appendChild( el ).disabled = true;
+			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Support: Opera 10 - 11 only
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			el.querySelectorAll( "*,:x" );
+			rbuggyQSA.push( ",.*:" );
+		} );
+	}
+
+	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
+		docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector ) ) ) ) {
+
+		assert( function( el ) {
+
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( el, "*" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( el, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		} );
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+	hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+	// Element contains another
+	// Purposefully self-exclusive
+	// As in, an element does not contain itself
+	contains = hasCompare || rnative.test( docElem.contains ) ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			) );
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( ( b = b.parentNode ) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	/* Sorting
+	---------------------------------------------------------------------- */
+
+	// Document order sorting
+	sortOrder = hasCompare ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		// Sort on method existence if only one input has compareDocumentPosition
+		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+		if ( compare ) {
+			return compare;
+		}
+
+		// Calculate position if both inputs belong to the same document
+		// Support: IE 11+, Edge 17 - 18+
+		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+		// two documents; shallow comparisons work.
+		// eslint-disable-next-line eqeqeq
+		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
+			a.compareDocumentPosition( b ) :
+
+			// Otherwise we know they are disconnected
+			1;
+
+		// Disconnected nodes
+		if ( compare & 1 ||
+			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
+
+			// Choose the first element that is related to our preferred document
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			// eslint-disable-next-line eqeqeq
+			if ( a == document || a.ownerDocument == preferredDoc &&
+				contains( preferredDoc, a ) ) {
+				return -1;
+			}
+
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			// eslint-disable-next-line eqeqeq
+			if ( b == document || b.ownerDocument == preferredDoc &&
+				contains( preferredDoc, b ) ) {
+				return 1;
+			}
+
+			// Maintain original order
+			return sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+		}
+
+		return compare & 4 ? -1 : 1;
+	} :
+	function( a, b ) {
+
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Parentless nodes are either documents or disconnected
+		if ( !aup || !bup ) {
+
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			/* eslint-disable eqeqeq */
+			return a == document ? -1 :
+				b == document ? 1 :
+				/* eslint-enable eqeqeq */
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( ( cur = cur.parentNode ) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( ( cur = cur.parentNode ) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[ i ] === bp[ i ] ) {
+			i++;
+		}
+
+		return i ?
+
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[ i ], bp[ i ] ) :
+
+			// Otherwise nodes in our document sort first
+			// Support: IE 11+, Edge 17 - 18+
+			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+			// two documents; shallow comparisons work.
+			/* eslint-disable eqeqeq */
+			ap[ i ] == preferredDoc ? -1 :
+			bp[ i ] == preferredDoc ? 1 :
+			/* eslint-enable eqeqeq */
+			0;
+	};
+
+	return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	setDocument( elem );
+
+	if ( support.matchesSelector && documentIsHTML &&
+		!nonnativeSelectorCache[ expr + " " ] &&
+		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+
+				// As well, disconnected nodes are said to be in a document
+				// fragment in IE 9
+				elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch ( e ) {
+			nonnativeSelectorCache( expr, true );
+		}
+	}
+
+	return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+
+	// Set document vars if needed
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( ( context.ownerDocument || context ) != document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+
+	// Set document vars if needed
+	// Support: IE 11+, Edge 17 - 18+
+	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+	// two documents; shallow comparisons work.
+	// eslint-disable-next-line eqeqeq
+	if ( ( elem.ownerDocument || elem ) != document ) {
+		setDocument( elem );
+	}
+
+	var fn = Expr.attrHandle[ name.toLowerCase() ],
+
+		// Don't get fooled by Object.prototype properties (jQuery #13807)
+		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+			fn( elem, name, !documentIsHTML ) :
+			undefined;
+
+	return val !== undefined ?
+		val :
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			( val = elem.getAttributeNode( name ) ) && val.specified ?
+				val.value :
+				null;
+};
+
+Sizzle.escape = function( sel ) {
+	return ( sel + "" ).replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		j = 0,
+		i = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	sortInput = !support.sortStable && results.slice( 0 );
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		while ( ( elem = results[ i++ ] ) ) {
+			if ( elem === results[ i ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	// Clear input after sorting to release objects
+	// See https://github.com/jquery/sizzle/pull/225
+	sortInput = null;
+
+	return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+
+		// If no nodeType, this is expected to be an array
+		while ( ( node = elem[ i++ ] ) ) {
+
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (jQuery #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	attrHandle: {},
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
+				match[ 5 ] || "" ).replace( runescape, funescape );
+
+			if ( match[ 2 ] === "~=" ) {
+				match[ 3 ] = " " + match[ 3 ] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[ 1 ] = match[ 1 ].toLowerCase();
+
+			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
+
+				// nth-* requires argument
+				if ( !match[ 3 ] ) {
+					Sizzle.error( match[ 0 ] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[ 4 ] = +( match[ 4 ] ?
+					match[ 5 ] + ( match[ 6 ] || 1 ) :
+					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
+				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
+
+				// other types prohibit arguments
+			} else if ( match[ 3 ] ) {
+				Sizzle.error( match[ 0 ] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[ 6 ] && match[ 2 ];
+
+			if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[ 3 ] ) {
+				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+
+				// Get excess from tokenize (recursively)
+				( excess = tokenize( unquoted, true ) ) &&
+
+				// advance to the next closing parenthesis
+				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
+
+				// excess is a negative index
+				match[ 0 ] = match[ 0 ].slice( 0, excess );
+				match[ 2 ] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeNameSelector ) {
+			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+			return nodeNameSelector === "*" ?
+				function() {
+					return true;
+				} :
+				function( elem ) {
+					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+				};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				( pattern = new RegExp( "(^|" + whitespace +
+					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
+						className, function( elem ) {
+							return pattern.test(
+								typeof elem.className === "string" && elem.className ||
+								typeof elem.getAttribute !== "undefined" &&
+									elem.getAttribute( "class" ) ||
+								""
+							);
+				} );
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				/* eslint-disable max-len */
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+				/* eslint-enable max-len */
+
+			};
+		},
+
+		"CHILD": function( type, what, _argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, _context, xml ) {
+					var cache, uniqueCache, outerCache, node, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType,
+						diff = false;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( ( node = node[ dir ] ) ) {
+									if ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) {
+
+										return false;
+									}
+								}
+
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+
+							// Seek `elem` from a previously-cached index
+
+							// ...in a gzip-friendly way
+							node = parent;
+							outerCache = node[ expando ] || ( node[ expando ] = {} );
+
+							// Support: IE <9 only
+							// Defend against cloned attroperties (jQuery gh-1709)
+							uniqueCache = outerCache[ node.uniqueID ] ||
+								( outerCache[ node.uniqueID ] = {} );
+
+							cache = uniqueCache[ type ] || [];
+							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+							diff = nodeIndex && cache[ 2 ];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( ( node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								( diff = nodeIndex = 0 ) || start.pop() ) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						} else {
+
+							// Use previously-cached element index if available
+							if ( useCache ) {
+
+								// ...in a gzip-friendly way
+								node = elem;
+								outerCache = node[ expando ] || ( node[ expando ] = {} );
+
+								// Support: IE <9 only
+								// Defend against cloned attroperties (jQuery gh-1709)
+								uniqueCache = outerCache[ node.uniqueID ] ||
+									( outerCache[ node.uniqueID ] = {} );
+
+								cache = uniqueCache[ type ] || [];
+								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+								diff = nodeIndex;
+							}
+
+							// xml :nth-child(...)
+							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
+							if ( diff === false ) {
+
+								// Use the same loop as above to seek `elem` from the start
+								while ( ( node = ++nodeIndex && node && node[ dir ] ||
+									( diff = nodeIndex = 0 ) || start.pop() ) ) {
+
+									if ( ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) &&
+										++diff ) {
+
+										// Cache the index of each encountered element
+										if ( useCache ) {
+											outerCache = node[ expando ] ||
+												( node[ expando ] = {} );
+
+											// Support: IE <9 only
+											// Defend against cloned attroperties (jQuery gh-1709)
+											uniqueCache = outerCache[ node.uniqueID ] ||
+												( outerCache[ node.uniqueID ] = {} );
+
+											uniqueCache[ type ] = [ dirruns, diff ];
+										}
+
+										if ( node === elem ) {
+											break;
+										}
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction( function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf( seed, matched[ i ] );
+							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
+						}
+					} ) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+
+		// Potentially complex pseudos
+		"not": markFunction( function( selector ) {
+
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction( function( seed, matches, _context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( ( elem = unmatched[ i ] ) ) {
+							seed[ i ] = !( matches[ i ] = elem );
+						}
+					}
+				} ) :
+				function( elem, _context, xml ) {
+					input[ 0 ] = elem;
+					matcher( input, null, xml, results );
+
+					// Don't keep the element (issue #299)
+					input[ 0 ] = null;
+					return !results.pop();
+				};
+		} ),
+
+		"has": markFunction( function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		} ),
+
+		"contains": markFunction( function( text ) {
+			text = text.replace( runescape, funescape );
+			return function( elem ) {
+				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
+			};
+		} ),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+
+			// lang value must be a valid identifier
+			if ( !ridentifier.test( lang || "" ) ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( ( elemLang = documentIsHTML ?
+						elem.lang :
+						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
+				return false;
+			};
+		} ),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement &&
+				( !document.hasFocus || document.hasFocus() ) &&
+				!!( elem.type || elem.href || ~elem.tabIndex );
+		},
+
+		// Boolean properties
+		"enabled": createDisabledPseudo( false ),
+		"disabled": createDisabledPseudo( true ),
+
+		"checked": function( elem ) {
+
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return ( nodeName === "input" && !!elem.checked ) ||
+				( nodeName === "option" && !!elem.selected );
+		},
+
+		"selected": function( elem ) {
+
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				// eslint-disable-next-line no-unused-expressions
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+			//   but not by others (comment: 8; processing instruction: 7; etc.)
+			// nodeType < 6 works because attributes (2) do not appear as children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeType < 6 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos[ "empty" ]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+
+				// Support: IE<8
+				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+				( ( attr = elem.getAttribute( "type" ) ) == null ||
+					attr.toLowerCase() === "text" );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo( function() {
+			return [ 0 ];
+		} ),
+
+		"last": createPositionalPseudo( function( _matchIndexes, length ) {
+			return [ length - 1 ];
+		} ),
+
+		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		} ),
+
+		"even": createPositionalPseudo( function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} ),
+
+		"odd": createPositionalPseudo( function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} ),
+
+		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
+			var i = argument < 0 ?
+				argument + length :
+				argument > length ?
+					length :
+					argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} ),
+
+		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		} )
+	}
+};
+
+Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
+			if ( match ) {
+
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[ 0 ].length ) || soFar;
+			}
+			groups.push( ( tokens = [] ) );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( ( match = rcombinators.exec( soFar ) ) ) {
+			matched = match.shift();
+			tokens.push( {
+				value: matched,
+
+				// Cast descendant combinators to space
+				type: match[ 0 ].replace( rtrim, " " )
+			} );
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
+				( match = preFilters[ type ]( match ) ) ) ) {
+				matched = match.shift();
+				tokens.push( {
+					value: matched,
+					type: type,
+					matches: match
+				} );
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[ i ].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		skip = combinator.next,
+		key = skip || dir,
+		checkNonElements = base && key === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( ( elem = elem[ dir ] ) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+			return false;
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var oldCache, uniqueCache, outerCache,
+				newCache = [ dirruns, doneName ];
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+			if ( xml ) {
+				while ( ( elem = elem[ dir ] ) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( ( elem = elem[ dir ] ) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
+
+						// Support: IE <9 only
+						// Defend against cloned attroperties (jQuery gh-1709)
+						uniqueCache = outerCache[ elem.uniqueID ] ||
+							( outerCache[ elem.uniqueID ] = {} );
+
+						if ( skip && skip === elem.nodeName.toLowerCase() ) {
+							elem = elem[ dir ] || elem;
+						} else if ( ( oldCache = uniqueCache[ key ] ) &&
+							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+							// Assign to newCache so results back-propagate to previous elements
+							return ( newCache[ 2 ] = oldCache[ 2 ] );
+						} else {
+
+							// Reuse newcache so results back-propagate to previous elements
+							uniqueCache[ key ] = newCache;
+
+							// A match means we're done; a fail means we have to keep checking
+							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+			return false;
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[ i ]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[ 0 ];
+}
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[ i ], results );
+	}
+	return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( ( elem = unmatched[ i ] ) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction( function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts(
+				selector || "*",
+				context.nodeType ? [ context ] : context,
+				[]
+			),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( ( elem = temp[ i ] ) ) {
+					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( ( elem = matcherOut[ i ] ) ) {
+
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( ( matcherIn[ i ] = elem ) );
+						}
+					}
+					postFinder( null, ( matcherOut = [] ), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( ( elem = matcherOut[ i ] ) &&
+						( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
+
+						seed[ temp ] = !( results[ temp ] = elem );
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	} );
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
+		implicitRelative = leadingRelative || Expr.relative[ " " ],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				( checkContext = context ).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+
+			// Avoid hanging onto element (issue #299)
+			checkContext = null;
+			return ret;
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
+			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+		} else {
+			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[ j ].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector(
+
+					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
+					tokens
+						.slice( 0, i - 1 )
+						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
+					).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, outermost ) {
+			var elem, j, matcher,
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				setMatched = [],
+				contextBackup = outermostContext,
+
+				// We must always have either seed elements or outermost context
+				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
+
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
+				len = elems.length;
+
+			if ( outermost ) {
+
+				// Support: IE 11+, Edge 17 - 18+
+				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+				// two documents; shallow comparisons work.
+				// eslint-disable-next-line eqeqeq
+				outermostContext = context == document || context || outermost;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Support: IE<9, Safari
+			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+
+					// Support: IE 11+, Edge 17 - 18+
+					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+					// two documents; shallow comparisons work.
+					// eslint-disable-next-line eqeqeq
+					if ( !context && elem.ownerDocument != document ) {
+						setDocument( elem );
+						xml = !documentIsHTML;
+					}
+					while ( ( matcher = elementMatchers[ j++ ] ) ) {
+						if ( matcher( elem, context || document, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+
+					// They will have gone through all possible matchers
+					if ( ( elem = !matcher && elem ) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// `i` is now the count of elements visited above, and adding it to `matchedCount`
+			// makes the latter nonnegative.
+			matchedCount += i;
+
+			// Apply set filters to unmatched elements
+			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+			// no element matchers and no seed.
+			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
+			// numerically zero.
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( ( matcher = setMatchers[ j++ ] ) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
+								setMatched[ i ] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !match ) {
+			match = tokenize( selector );
+		}
+		i = match.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( match[ i ] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache(
+			selector,
+			matcherFromGroupMatchers( elementMatchers, setMatchers )
+		);
+
+		// Save selector and tokenization
+		cached.selector = selector;
+	}
+	return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		compiled = typeof selector === "function" && selector,
+		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
+
+	results = results || [];
+
+	// Try to minimize operations if there is only one selector in the list and no seed
+	// (the latter of which guarantees us context)
+	if ( match.length === 1 ) {
+
+		// Reduce context if the leading compound selector is an ID
+		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
+		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
+			context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
+
+			context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
+				.replace( runescape, funescape ), context ) || [] )[ 0 ];
+			if ( !context ) {
+				return results;
+
+			// Precompiled matchers will still verify ancestry, so step up a level
+			} else if ( compiled ) {
+				context = context.parentNode;
+			}
+
+			selector = selector.slice( tokens.shift().value.length );
+		}
+
+		// Fetch a seed set for right-to-left matching
+		i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
+		while ( i-- ) {
+			token = tokens[ i ];
+
+			// Abort if we hit a combinator
+			if ( Expr.relative[ ( type = token.type ) ] ) {
+				break;
+			}
+			if ( ( find = Expr.find[ type ] ) ) {
+
+				// Search, expanding context for leading sibling combinators
+				if ( ( seed = find(
+					token.matches[ 0 ].replace( runescape, funescape ),
+					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
+						context
+				) ) ) {
+
+					// If seed is empty or no tokens remain, we can return early
+					tokens.splice( i, 1 );
+					selector = seed.length && toSelector( tokens );
+					if ( !selector ) {
+						push.apply( results, seed );
+						return results;
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function if one is not provided
+	// Provide `match` to avoid retokenization if we modified the selector above
+	( compiled || compile( selector, match ) )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+	);
+	return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert( function( el ) {
+
+	// Should return 1, but returns 4 (following)
+	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
+} );
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert( function( el ) {
+	el.innerHTML = "<a href='#'></a>";
+	return el.firstChild.getAttribute( "href" ) === "#";
+} ) ) {
+	addHandle( "type|href|height|width", function( elem, name, isXML ) {
+		if ( !isXML ) {
+			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+		}
+	} );
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert( function( el ) {
+	el.innerHTML = "<input/>";
+	el.firstChild.setAttribute( "value", "" );
+	return el.firstChild.getAttribute( "value" ) === "";
+} ) ) {
+	addHandle( "value", function( elem, _name, isXML ) {
+		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+			return elem.defaultValue;
+		}
+	} );
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert( function( el ) {
+	return el.getAttribute( "disabled" ) == null;
+} ) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return elem[ name ] === true ? name.toLowerCase() :
+				( val = elem.getAttributeNode( name ) ) && val.specified ?
+					val.value :
+					null;
+		}
+	} );
+}
+
+return Sizzle;
+
+} )( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+	var matched = [],
+		truncate = until !== undefined;
+
+	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+		if ( elem.nodeType === 1 ) {
+			if ( truncate && jQuery( elem ).is( until ) ) {
+				break;
+			}
+			matched.push( elem );
+		}
+	}
+	return matched;
+};
+
+
+var siblings = function( n, elem ) {
+	var matched = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType === 1 && n !== elem ) {
+			matched.push( n );
+		}
+	}
+
+	return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+}
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			return !!qualifier.call( elem, i, elem ) !== not;
+		} );
+	}
+
+	// Single element
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		} );
+	}
+
+	// Arraylike of elements (jQuery, arguments, Array)
+	if ( typeof qualifier !== "string" ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+		} );
+	}
+
+	// Filtered directly for both simple and complex selectors
+	return jQuery.filter( qualifier, elements, not );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+	var elem = elems[ 0 ];
+
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	if ( elems.length === 1 && elem.nodeType === 1 ) {
+		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+	}
+
+	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+		return elem.nodeType === 1;
+	} ) );
+};
+
+jQuery.fn.extend( {
+	find: function( selector ) {
+		var i, ret,
+			len = this.length,
+			self = this;
+
+		if ( typeof selector !== "string" ) {
+			return this.pushStack( jQuery( selector ).filter( function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			} ) );
+		}
+
+		ret = this.pushStack( [] );
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+	},
+	filter: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], false ) );
+	},
+	not: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], true ) );
+	},
+	is: function( selector ) {
+		return !!winnow(
+			this,
+
+			// If this is a positional/relative selector, check membership in the returned set
+			// so $("p:first").is("p:last") won't return true for a doc with two "p".
+			typeof selector === "string" && rneedsContext.test( selector ) ?
+				jQuery( selector ) :
+				selector || [],
+			false
+		).length;
+	}
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	// Shortcut simple #id case for speed
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+	init = jQuery.fn.init = function( selector, context, root ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Method init() accepts an alternate rootjQuery
+		// so migrate can support jQuery.sub (gh-2101)
+		root = root || rootjQuery;
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector[ 0 ] === "<" &&
+				selector[ selector.length - 1 ] === ">" &&
+				selector.length >= 3 ) {
+
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && ( match[ 1 ] || !context ) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[ 1 ] ) {
+					context = context instanceof jQuery ? context[ 0 ] : context;
+
+					// Option to run scripts is true for back-compat
+					// Intentionally let the error be thrown if parseHTML is not present
+					jQuery.merge( this, jQuery.parseHTML(
+						match[ 1 ],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+
+							// Properties of context are called as methods if possible
+							if ( isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[ 2 ] );
+
+					if ( elem ) {
+
+						// Inject the element directly into the jQuery object
+						this[ 0 ] = elem;
+						this.length = 1;
+					}
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || root ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this[ 0 ] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( isFunction( selector ) ) {
+			return root.ready !== undefined ?
+				root.ready( selector ) :
+
+				// Execute immediately if ready is not present
+				selector( jQuery );
+		}
+
+		return jQuery.makeArray( selector, this );
+	};
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+	// Methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend( {
+	has: function( target ) {
+		var targets = jQuery( target, this ),
+			l = targets.length;
+
+		return this.filter( function() {
+			var i = 0;
+			for ( ; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[ i ] ) ) {
+					return true;
+				}
+			}
+		} );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			matched = [],
+			targets = typeof selectors !== "string" && jQuery( selectors );
+
+		// Positional selectors never match, since there's no _selection_ context
+		if ( !rneedsContext.test( selectors ) ) {
+			for ( ; i < l; i++ ) {
+				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+					// Always skip document fragments
+					if ( cur.nodeType < 11 && ( targets ?
+						targets.index( cur ) > -1 :
+
+						// Don't pass non-elements to Sizzle
+						cur.nodeType === 1 &&
+							jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+						matched.push( cur );
+						break;
+					}
+				}
+			}
+		}
+
+		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+	},
+
+	// Determine the position of an element within the set
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// Index in selector
+		if ( typeof elem === "string" ) {
+			return indexOf.call( jQuery( elem ), this[ 0 ] );
+		}
+
+		// Locate the position of the desired element
+		return indexOf.call( this,
+
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[ 0 ] : elem
+		);
+	},
+
+	add: function( selector, context ) {
+		return this.pushStack(
+			jQuery.uniqueSort(
+				jQuery.merge( this.get(), jQuery( selector, context ) )
+			)
+		);
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	}
+} );
+
+function sibling( cur, dir ) {
+	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+	return cur;
+}
+
+jQuery.each( {
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, _i, until ) {
+		return dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, _i, until ) {
+		return dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, _i, until ) {
+		return dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return siblings( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return siblings( elem.firstChild );
+	},
+	contents: function( elem ) {
+		if ( elem.contentDocument != null &&
+
+			// Support: IE 11+
+			// <object> elements with no `data` attribute has an object
+			// `contentDocument` with a `null` prototype.
+			getProto( elem.contentDocument ) ) {
+
+			return elem.contentDocument;
+		}
+
+		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+		// Treat the template element as a regular one in browsers that
+		// don't support it.
+		if ( nodeName( elem, "template" ) ) {
+			elem = elem.content || elem;
+		}
+
+		return jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var matched = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			matched = jQuery.filter( selector, matched );
+		}
+
+		if ( this.length > 1 ) {
+
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				jQuery.uniqueSort( matched );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				matched.reverse();
+			}
+		}
+
+		return this.pushStack( matched );
+	};
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+	var object = {};
+	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	} );
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		createOptions( options ) :
+		jQuery.extend( {}, options );
+
+	var // Flag to know if list is currently firing
+		firing,
+
+		// Last fire value for non-forgettable lists
+		memory,
+
+		// Flag to know if list was already fired
+		fired,
+
+		// Flag to prevent firing
+		locked,
+
+		// Actual callback list
+		list = [],
+
+		// Queue of execution data for repeatable lists
+		queue = [],
+
+		// Index of currently firing callback (modified by add/remove as needed)
+		firingIndex = -1,
+
+		// Fire callbacks
+		fire = function() {
+
+			// Enforce single-firing
+			locked = locked || options.once;
+
+			// Execute callbacks for all pending executions,
+			// respecting firingIndex overrides and runtime changes
+			fired = firing = true;
+			for ( ; queue.length; firingIndex = -1 ) {
+				memory = queue.shift();
+				while ( ++firingIndex < list.length ) {
+
+					// Run callback and check for early termination
+					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+						options.stopOnFalse ) {
+
+						// Jump to end and forget the data so .add doesn't re-fire
+						firingIndex = list.length;
+						memory = false;
+					}
+				}
+			}
+
+			// Forget the data if we're done with it
+			if ( !options.memory ) {
+				memory = false;
+			}
+
+			firing = false;
+
+			// Clean up if we're done firing for good
+			if ( locked ) {
+
+				// Keep an empty list if we have data for future add calls
+				if ( memory ) {
+					list = [];
+
+				// Otherwise, this object is spent
+				} else {
+					list = "";
+				}
+			}
+		},
+
+		// Actual Callbacks object
+		self = {
+
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+
+					// If we have memory from a past run, we should fire after adding
+					if ( memory && !firing ) {
+						firingIndex = list.length - 1;
+						queue.push( memory );
+					}
+
+					( function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							if ( isFunction( arg ) ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
+
+								// Inspect recursively
+								add( arg );
+							}
+						} );
+					} )( arguments );
+
+					if ( memory && !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Remove a callback from the list
+			remove: function() {
+				jQuery.each( arguments, function( _, arg ) {
+					var index;
+					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+						list.splice( index, 1 );
+
+						// Handle firing indexes
+						if ( index <= firingIndex ) {
+							firingIndex--;
+						}
+					}
+				} );
+				return this;
+			},
+
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ?
+					jQuery.inArray( fn, list ) > -1 :
+					list.length > 0;
+			},
+
+			// Remove all callbacks from the list
+			empty: function() {
+				if ( list ) {
+					list = [];
+				}
+				return this;
+			},
+
+			// Disable .fire and .add
+			// Abort any current/pending executions
+			// Clear all callbacks and values
+			disable: function() {
+				locked = queue = [];
+				list = memory = "";
+				return this;
+			},
+			disabled: function() {
+				return !list;
+			},
+
+			// Disable .fire
+			// Also disable .add unless we have memory (since it would have no effect)
+			// Abort any pending executions
+			lock: function() {
+				locked = queue = [];
+				if ( !memory && !firing ) {
+					list = memory = "";
+				}
+				return this;
+			},
+			locked: function() {
+				return !!locked;
+			},
+
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( !locked ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					queue.push( args );
+					if ( !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+function Identity( v ) {
+	return v;
+}
+function Thrower( ex ) {
+	throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+	var method;
+
+	try {
+
+		// Check for promise aspect first to privilege synchronous behavior
+		if ( value && isFunction( ( method = value.promise ) ) ) {
+			method.call( value ).done( resolve ).fail( reject );
+
+		// Other thenables
+		} else if ( value && isFunction( ( method = value.then ) ) ) {
+			method.call( value, resolve, reject );
+
+		// Other non-thenables
+		} else {
+
+			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+			// * false: [ value ].slice( 0 ) => resolve( value )
+			// * true: [ value ].slice( 1 ) => resolve()
+			resolve.apply( undefined, [ value ].slice( noValue ) );
+		}
+
+	// For Promises/A+, convert exceptions into rejections
+	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+	// Deferred#then to conditionally suppress rejection.
+	} catch ( value ) {
+
+		// Support: Android 4.0 only
+		// Strict mode functions invoked without .call/.apply get global-object context
+		reject.apply( undefined, [ value ] );
+	}
+}
+
+jQuery.extend( {
+
+	Deferred: function( func ) {
+		var tuples = [
+
+				// action, add listener, callbacks,
+				// ... .then handlers, argument index, [final state]
+				[ "notify", "progress", jQuery.Callbacks( "memory" ),
+					jQuery.Callbacks( "memory" ), 2 ],
+				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				"catch": function( fn ) {
+					return promise.then( null, fn );
+				},
+
+				// Keep pipe for back-compat
+				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+
+					return jQuery.Deferred( function( newDefer ) {
+						jQuery.each( tuples, function( _i, tuple ) {
+
+							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
+							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+							// deferred.progress(function() { bind to newDefer or newDefer.notify })
+							// deferred.done(function() { bind to newDefer or newDefer.resolve })
+							// deferred.fail(function() { bind to newDefer or newDefer.reject })
+							deferred[ tuple[ 1 ] ]( function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && isFunction( returned.promise ) ) {
+									returned.promise()
+										.progress( newDefer.notify )
+										.done( newDefer.resolve )
+										.fail( newDefer.reject );
+								} else {
+									newDefer[ tuple[ 0 ] + "With" ](
+										this,
+										fn ? [ returned ] : arguments
+									);
+								}
+							} );
+						} );
+						fns = null;
+					} ).promise();
+				},
+				then: function( onFulfilled, onRejected, onProgress ) {
+					var maxDepth = 0;
+					function resolve( depth, deferred, handler, special ) {
+						return function() {
+							var that = this,
+								args = arguments,
+								mightThrow = function() {
+									var returned, then;
+
+									// Support: Promises/A+ section 2.3.3.3.3
+									// https://promisesaplus.com/#point-59
+									// Ignore double-resolution attempts
+									if ( depth < maxDepth ) {
+										return;
+									}
+
+									returned = handler.apply( that, args );
+
+									// Support: Promises/A+ section 2.3.1
+									// https://promisesaplus.com/#point-48
+									if ( returned === deferred.promise() ) {
+										throw new TypeError( "Thenable self-resolution" );
+									}
+
+									// Support: Promises/A+ sections 2.3.3.1, 3.5
+									// https://promisesaplus.com/#point-54
+									// https://promisesaplus.com/#point-75
+									// Retrieve `then` only once
+									then = returned &&
+
+										// Support: Promises/A+ section 2.3.4
+										// https://promisesaplus.com/#point-64
+										// Only check objects and functions for thenability
+										( typeof returned === "object" ||
+											typeof returned === "function" ) &&
+										returned.then;
+
+									// Handle a returned thenable
+									if ( isFunction( then ) ) {
+
+										// Special processors (notify) just wait for resolution
+										if ( special ) {
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special )
+											);
+
+										// Normal processors (resolve) also hook into progress
+										} else {
+
+											// ...and disregard older resolution values
+											maxDepth++;
+
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special ),
+												resolve( maxDepth, deferred, Identity,
+													deferred.notifyWith )
+											);
+										}
+
+									// Handle all other returned values
+									} else {
+
+										// Only substitute handlers pass on context
+										// and multiple values (non-spec behavior)
+										if ( handler !== Identity ) {
+											that = undefined;
+											args = [ returned ];
+										}
+
+										// Process the value(s)
+										// Default process is resolve
+										( special || deferred.resolveWith )( that, args );
+									}
+								},
+
+								// Only normal processors (resolve) catch and reject exceptions
+								process = special ?
+									mightThrow :
+									function() {
+										try {
+											mightThrow();
+										} catch ( e ) {
+
+											if ( jQuery.Deferred.exceptionHook ) {
+												jQuery.Deferred.exceptionHook( e,
+													process.stackTrace );
+											}
+
+											// Support: Promises/A+ section 2.3.3.3.4.1
+											// https://promisesaplus.com/#point-61
+											// Ignore post-resolution exceptions
+											if ( depth + 1 >= maxDepth ) {
+
+												// Only substitute handlers pass on context
+												// and multiple values (non-spec behavior)
+												if ( handler !== Thrower ) {
+													that = undefined;
+													args = [ e ];
+												}
+
+												deferred.rejectWith( that, args );
+											}
+										}
+									};
+
+							// Support: Promises/A+ section 2.3.3.3.1
+							// https://promisesaplus.com/#point-57
+							// Re-resolve promises immediately to dodge false rejection from
+							// subsequent errors
+							if ( depth ) {
+								process();
+							} else {
+
+								// Call an optional hook to record the stack, in case of exception
+								// since it's otherwise lost when execution goes async
+								if ( jQuery.Deferred.getStackHook ) {
+									process.stackTrace = jQuery.Deferred.getStackHook();
+								}
+								window.setTimeout( process );
+							}
+						};
+					}
+
+					return jQuery.Deferred( function( newDefer ) {
+
+						// progress_handlers.add( ... )
+						tuples[ 0 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onProgress ) ?
+									onProgress :
+									Identity,
+								newDefer.notifyWith
+							)
+						);
+
+						// fulfilled_handlers.add( ... )
+						tuples[ 1 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onFulfilled ) ?
+									onFulfilled :
+									Identity
+							)
+						);
+
+						// rejected_handlers.add( ... )
+						tuples[ 2 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onRejected ) ?
+									onRejected :
+									Thrower
+							)
+						);
+					} ).promise();
+				},
+
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 5 ];
+
+			// promise.progress = list.add
+			// promise.done = list.add
+			// promise.fail = list.add
+			promise[ tuple[ 1 ] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(
+					function() {
+
+						// state = "resolved" (i.e., fulfilled)
+						// state = "rejected"
+						state = stateString;
+					},
+
+					// rejected_callbacks.disable
+					// fulfilled_callbacks.disable
+					tuples[ 3 - i ][ 2 ].disable,
+
+					// rejected_handlers.disable
+					// fulfilled_handlers.disable
+					tuples[ 3 - i ][ 3 ].disable,
+
+					// progress_callbacks.lock
+					tuples[ 0 ][ 2 ].lock,
+
+					// progress_handlers.lock
+					tuples[ 0 ][ 3 ].lock
+				);
+			}
+
+			// progress_handlers.fire
+			// fulfilled_handlers.fire
+			// rejected_handlers.fire
+			list.add( tuple[ 3 ].fire );
+
+			// deferred.notify = function() { deferred.notifyWith(...) }
+			// deferred.resolve = function() { deferred.resolveWith(...) }
+			// deferred.reject = function() { deferred.rejectWith(...) }
+			deferred[ tuple[ 0 ] ] = function() {
+				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+				return this;
+			};
+
+			// deferred.notifyWith = list.fireWith
+			// deferred.resolveWith = list.fireWith
+			// deferred.rejectWith = list.fireWith
+			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+		} );
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( singleValue ) {
+		var
+
+			// count of uncompleted subordinates
+			remaining = arguments.length,
+
+			// count of unprocessed arguments
+			i = remaining,
+
+			// subordinate fulfillment data
+			resolveContexts = Array( i ),
+			resolveValues = slice.call( arguments ),
+
+			// the primary Deferred
+			primary = jQuery.Deferred(),
+
+			// subordinate callback factory
+			updateFunc = function( i ) {
+				return function( value ) {
+					resolveContexts[ i ] = this;
+					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+					if ( !( --remaining ) ) {
+						primary.resolveWith( resolveContexts, resolveValues );
+					}
+				};
+			};
+
+		// Single- and empty arguments are adopted like Promise.resolve
+		if ( remaining <= 1 ) {
+			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
+				!remaining );
+
+			// Use .then() to unwrap secondary thenables (cf. gh-3000)
+			if ( primary.state() === "pending" ||
+				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+				return primary.then();
+			}
+		}
+
+		// Multiple arguments are aggregated like Promise.all array elements
+		while ( i-- ) {
+			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
+		}
+
+		return primary.promise();
+	}
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+	// Support: IE 8 - 9 only
+	// Console exists when dev tools are open, which can happen at any time
+	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+	}
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+	window.setTimeout( function() {
+		throw error;
+	} );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+	readyList
+		.then( fn )
+
+		// Wrap jQuery.readyException in a function so that the lookup
+		// happens at the time of error handling instead of callback
+		// registration.
+		.catch( function( error ) {
+			jQuery.readyException( error );
+		} );
+
+	return this;
+};
+
+jQuery.extend( {
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+	}
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+	document.removeEventListener( "DOMContentLoaded", completed );
+	window.removeEventListener( "load", completed );
+	jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+	// Handle it asynchronously to allow scripts the opportunity to delay ready
+	window.setTimeout( jQuery.ready );
+
+} else {
+
+	// Use the handy event callback
+	document.addEventListener( "DOMContentLoaded", completed );
+
+	// A fallback to window.onload, that will always work
+	window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+	var i = 0,
+		len = elems.length,
+		bulk = key == null;
+
+	// Sets many values
+	if ( toType( key ) === "object" ) {
+		chainable = true;
+		for ( i in key ) {
+			access( elems, fn, i, key[ i ], true, emptyGet, raw );
+		}
+
+	// Sets one value
+	} else if ( value !== undefined ) {
+		chainable = true;
+
+		if ( !isFunction( value ) ) {
+			raw = true;
+		}
+
+		if ( bulk ) {
+
+			// Bulk operations run against the entire set
+			if ( raw ) {
+				fn.call( elems, value );
+				fn = null;
+
+			// ...except when executing function values
+			} else {
+				bulk = fn;
+				fn = function( elem, _key, value ) {
+					return bulk.call( jQuery( elem ), value );
+				};
+			}
+		}
+
+		if ( fn ) {
+			for ( ; i < len; i++ ) {
+				fn(
+					elems[ i ], key, raw ?
+						value :
+						value.call( elems[ i ], i, fn( elems[ i ], key ) )
+				);
+			}
+		}
+	}
+
+	if ( chainable ) {
+		return elems;
+	}
+
+	// Gets
+	if ( bulk ) {
+		return fn.call( elems );
+	}
+
+	return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+
+
+// Matches dashed string for camelizing
+var rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([a-z])/g;
+
+// Used by camelCase as callback to replace()
+function fcamelCase( _all, letter ) {
+	return letter.toUpperCase();
+}
+
+// Convert dashed to camelCase; used by the css and data modules
+// Support: IE <=9 - 11, Edge 12 - 15
+// Microsoft forgot to hump their vendor prefix (#9572)
+function camelCase( string ) {
+	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+}
+var acceptData = function( owner ) {
+
+	// Accepts only:
+	//  - Node
+	//    - Node.ELEMENT_NODE
+	//    - Node.DOCUMENT_NODE
+	//  - Object
+	//    - Any
+	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+	this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+	cache: function( owner ) {
+
+		// Check if the owner object already has a cache
+		var value = owner[ this.expando ];
+
+		// If not, create one
+		if ( !value ) {
+			value = {};
+
+			// We can accept data for non-element nodes in modern browsers,
+			// but we should not, see #8335.
+			// Always return an empty object.
+			if ( acceptData( owner ) ) {
+
+				// If it is a node unlikely to be stringify-ed or looped over
+				// use plain assignment
+				if ( owner.nodeType ) {
+					owner[ this.expando ] = value;
+
+				// Otherwise secure it in a non-enumerable property
+				// configurable must be true to allow the property to be
+				// deleted when data is removed
+				} else {
+					Object.defineProperty( owner, this.expando, {
+						value: value,
+						configurable: true
+					} );
+				}
+			}
+		}
+
+		return value;
+	},
+	set: function( owner, data, value ) {
+		var prop,
+			cache = this.cache( owner );
+
+		// Handle: [ owner, key, value ] args
+		// Always use camelCase key (gh-2257)
+		if ( typeof data === "string" ) {
+			cache[ camelCase( data ) ] = value;
+
+		// Handle: [ owner, { properties } ] args
+		} else {
+
+			// Copy the properties one-by-one to the cache object
+			for ( prop in data ) {
+				cache[ camelCase( prop ) ] = data[ prop ];
+			}
+		}
+		return cache;
+	},
+	get: function( owner, key ) {
+		return key === undefined ?
+			this.cache( owner ) :
+
+			// Always use camelCase key (gh-2257)
+			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
+	},
+	access: function( owner, key, value ) {
+
+		// In cases where either:
+		//
+		//   1. No key was specified
+		//   2. A string key was specified, but no value provided
+		//
+		// Take the "read" path and allow the get method to determine
+		// which value to return, respectively either:
+		//
+		//   1. The entire cache object
+		//   2. The data stored at the key
+		//
+		if ( key === undefined ||
+				( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+			return this.get( owner, key );
+		}
+
+		// When the key is not a string, or both a key and value
+		// are specified, set or extend (existing objects) with either:
+		//
+		//   1. An object of properties
+		//   2. A key and value
+		//
+		this.set( owner, key, value );
+
+		// Since the "set" path can have two possible entry points
+		// return the expected data based on which path was taken[*]
+		return value !== undefined ? value : key;
+	},
+	remove: function( owner, key ) {
+		var i,
+			cache = owner[ this.expando ];
+
+		if ( cache === undefined ) {
+			return;
+		}
+
+		if ( key !== undefined ) {
+
+			// Support array or space separated string of keys
+			if ( Array.isArray( key ) ) {
+
+				// If key is an array of keys...
+				// We always set camelCase keys, so remove that.
+				key = key.map( camelCase );
+			} else {
+				key = camelCase( key );
+
+				// If a key with the spaces exists, use it.
+				// Otherwise, create an array by matching non-whitespace
+				key = key in cache ?
+					[ key ] :
+					( key.match( rnothtmlwhite ) || [] );
+			}
+
+			i = key.length;
+
+			while ( i-- ) {
+				delete cache[ key[ i ] ];
+			}
+		}
+
+		// Remove the expando if there's no more data
+		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+			// Support: Chrome <=35 - 45
+			// Webkit & Blink performance suffers when deleting properties
+			// from DOM nodes, so set to undefined instead
+			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+			if ( owner.nodeType ) {
+				owner[ this.expando ] = undefined;
+			} else {
+				delete owner[ this.expando ];
+			}
+		}
+	},
+	hasData: function( owner ) {
+		var cache = owner[ this.expando ];
+		return cache !== undefined && !jQuery.isEmptyObject( cache );
+	}
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+//	Implementation Summary
+//
+//	1. Enforce API surface and semantic compatibility with 1.9.x branch
+//	2. Improve the module's maintainability by reducing the storage
+//		paths to a single mechanism.
+//	3. Use the same single mechanism to support "private" and "user" data.
+//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+//	5. Avoid exposing implementation details on user objects (eg. expando properties)
+//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+	rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+	if ( data === "true" ) {
+		return true;
+	}
+
+	if ( data === "false" ) {
+		return false;
+	}
+
+	if ( data === "null" ) {
+		return null;
+	}
+
+	// Only convert to a number if it doesn't change the string
+	if ( data === +data + "" ) {
+		return +data;
+	}
+
+	if ( rbrace.test( data ) ) {
+		return JSON.parse( data );
+	}
+
+	return data;
+}
+
+function dataAttr( elem, key, data ) {
+	var name;
+
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = getData( data );
+			} catch ( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			dataUser.set( elem, key, data );
+		} else {
+			data = undefined;
+		}
+	}
+	return data;
+}
+
+jQuery.extend( {
+	hasData: function( elem ) {
+		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return dataUser.access( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		dataUser.remove( elem, name );
+	},
+
+	// TODO: Now that all calls to _data and _removeData have been replaced
+	// with direct calls to dataPriv methods, these can be deprecated.
+	_data: function( elem, name, data ) {
+		return dataPriv.access( elem, name, data );
+	},
+
+	_removeData: function( elem, name ) {
+		dataPriv.remove( elem, name );
+	}
+} );
+
+jQuery.fn.extend( {
+	data: function( key, value ) {
+		var i, name, data,
+			elem = this[ 0 ],
+			attrs = elem && elem.attributes;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = dataUser.get( elem );
+
+				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+					i = attrs.length;
+					while ( i-- ) {
+
+						// Support: IE 11 only
+						// The attrs elements can be null (#14894)
+						if ( attrs[ i ] ) {
+							name = attrs[ i ].name;
+							if ( name.indexOf( "data-" ) === 0 ) {
+								name = camelCase( name.slice( 5 ) );
+								dataAttr( elem, name, data[ name ] );
+							}
+						}
+					}
+					dataPriv.set( elem, "hasDataAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each( function() {
+				dataUser.set( this, key );
+			} );
+		}
+
+		return access( this, function( value ) {
+			var data;
+
+			// The calling jQuery object (element matches) is not empty
+			// (and therefore has an element appears at this[ 0 ]) and the
+			// `value` parameter was not undefined. An empty jQuery object
+			// will result in `undefined` for elem = this[ 0 ] which will
+			// throw an exception if an attempt to read a data cache is made.
+			if ( elem && value === undefined ) {
+
+				// Attempt to get data from the cache
+				// The key will always be camelCased in Data
+				data = dataUser.get( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// Attempt to "discover" the data in
+				// HTML5 custom data-* attrs
+				data = dataAttr( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// We tried really hard, but the data doesn't exist.
+				return;
+			}
+
+			// Set the data...
+			this.each( function() {
+
+				// We always store the camelCased key
+				dataUser.set( this, key, value );
+			} );
+		}, null, value, arguments.length > 1, null, true );
+	},
+
+	removeData: function( key ) {
+		return this.each( function() {
+			dataUser.remove( this, key );
+		} );
+	}
+} );
+
+
+jQuery.extend( {
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = dataPriv.get( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || Array.isArray( data ) ) {
+					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// Clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// Not public - generate a queueHooks object, or return the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+			empty: jQuery.Callbacks( "once memory" ).add( function() {
+				dataPriv.remove( elem, [ type + "queue", key ] );
+			} )
+		} );
+	}
+} );
+
+jQuery.fn.extend( {
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[ 0 ], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each( function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// Ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			} );
+	},
+	dequeue: function( type ) {
+		return this.each( function() {
+			jQuery.dequeue( this, type );
+		} );
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while ( i-- ) {
+			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var documentElement = document.documentElement;
+
+
+
+	var isAttached = function( elem ) {
+			return jQuery.contains( elem.ownerDocument, elem );
+		},
+		composed = { composed: true };
+
+	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
+	// Check attachment across shadow DOM boundaries when possible (gh-3504)
+	// Support: iOS 10.0-10.2 only
+	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
+	// leading to errors. We need to check for `getRootNode`.
+	if ( documentElement.getRootNode ) {
+		isAttached = function( elem ) {
+			return jQuery.contains( elem.ownerDocument, elem ) ||
+				elem.getRootNode( composed ) === elem.ownerDocument;
+		};
+	}
+var isHiddenWithinTree = function( elem, el ) {
+
+		// isHiddenWithinTree might be called from jQuery#filter function;
+		// in that case, element will be second argument
+		elem = el || elem;
+
+		// Inline style trumps all
+		return elem.style.display === "none" ||
+			elem.style.display === "" &&
+
+			// Otherwise, check computed style
+			// Support: Firefox <=43 - 45
+			// Disconnected elements can have computed display: none, so first confirm that elem is
+			// in the document.
+			isAttached( elem ) &&
+
+			jQuery.css( elem, "display" ) === "none";
+	};
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+	var adjusted, scale,
+		maxIterations = 20,
+		currentValue = tween ?
+			function() {
+				return tween.cur();
+			} :
+			function() {
+				return jQuery.css( elem, prop, "" );
+			},
+		initial = currentValue(),
+		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+		// Starting value computation is required for potential unit mismatches
+		initialInUnit = elem.nodeType &&
+			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+			rcssNum.exec( jQuery.css( elem, prop ) );
+
+	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+		// Support: Firefox <=54
+		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+		initial = initial / 2;
+
+		// Trust units reported by jQuery.css
+		unit = unit || initialInUnit[ 3 ];
+
+		// Iteratively approximate from a nonzero starting point
+		initialInUnit = +initial || 1;
+
+		while ( maxIterations-- ) {
+
+			// Evaluate and update our best guess (doubling guesses that zero out).
+			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
+			jQuery.style( elem, prop, initialInUnit + unit );
+			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
+				maxIterations = 0;
+			}
+			initialInUnit = initialInUnit / scale;
+
+		}
+
+		initialInUnit = initialInUnit * 2;
+		jQuery.style( elem, prop, initialInUnit + unit );
+
+		// Make sure we update the tween properties later on
+		valueParts = valueParts || [];
+	}
+
+	if ( valueParts ) {
+		initialInUnit = +initialInUnit || +initial || 0;
+
+		// Apply relative offset (+=/-=) if specified
+		adjusted = valueParts[ 1 ] ?
+			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+			+valueParts[ 2 ];
+		if ( tween ) {
+			tween.unit = unit;
+			tween.start = initialInUnit;
+			tween.end = adjusted;
+		}
+	}
+	return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+	var temp,
+		doc = elem.ownerDocument,
+		nodeName = elem.nodeName,
+		display = defaultDisplayMap[ nodeName ];
+
+	if ( display ) {
+		return display;
+	}
+
+	temp = doc.body.appendChild( doc.createElement( nodeName ) );
+	display = jQuery.css( temp, "display" );
+
+	temp.parentNode.removeChild( temp );
+
+	if ( display === "none" ) {
+		display = "block";
+	}
+	defaultDisplayMap[ nodeName ] = display;
+
+	return display;
+}
+
+function showHide( elements, show ) {
+	var display, elem,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	// Determine new display value for elements that need to change
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		display = elem.style.display;
+		if ( show ) {
+
+			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+			// check is required in this first loop unless we have a nonempty display value (either
+			// inline or about-to-be-restored)
+			if ( display === "none" ) {
+				values[ index ] = dataPriv.get( elem, "display" ) || null;
+				if ( !values[ index ] ) {
+					elem.style.display = "";
+				}
+			}
+			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+				values[ index ] = getDefaultDisplay( elem );
+			}
+		} else {
+			if ( display !== "none" ) {
+				values[ index ] = "none";
+
+				// Remember what we're overwriting
+				dataPriv.set( elem, "display", display );
+			}
+		}
+	}
+
+	// Set the display of the elements in a second loop to avoid constant reflow
+	for ( index = 0; index < length; index++ ) {
+		if ( values[ index ] != null ) {
+			elements[ index ].style.display = values[ index ];
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend( {
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		if ( typeof state === "boolean" ) {
+			return state ? this.show() : this.hide();
+		}
+
+		return this.each( function() {
+			if ( isHiddenWithinTree( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		} );
+	}
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
+
+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
+
+
+
+( function() {
+	var fragment = document.createDocumentFragment(),
+		div = fragment.appendChild( document.createElement( "div" ) ),
+		input = document.createElement( "input" );
+
+	// Support: Android 4.0 - 4.3 only
+	// Check state lost if the name is set (#11217)
+	// Support: Windows Web Apps (WWA)
+	// `name` and `type` must use .setAttribute for WWA (#14901)
+	input.setAttribute( "type", "radio" );
+	input.setAttribute( "checked", "checked" );
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+
+	// Support: Android <=4.1 only
+	// Older WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE <=11 only
+	// Make sure textarea (and checkbox) defaultValue is properly cloned
+	div.innerHTML = "<textarea>x</textarea>";
+	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+
+	// Support: IE <=9 only
+	// IE <=9 replaces <option> tags with their contents when inserted outside of
+	// the select element.
+	div.innerHTML = "<option></option>";
+	support.option = !!div.lastChild;
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+	// XHTML parsers do not magically insert elements in the
+	// same way that tag soup parsers do. So we cannot shorten
+	// this by omitting <tbody> or other required elements.
+	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, "", "" ]
+};
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: IE <=9 only
+if ( !support.option ) {
+	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
+}
+
+
+function getAll( context, tag ) {
+
+	// Support: IE <=9 - 11 only
+	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
+	var ret;
+
+	if ( typeof context.getElementsByTagName !== "undefined" ) {
+		ret = context.getElementsByTagName( tag || "*" );
+
+	} else if ( typeof context.querySelectorAll !== "undefined" ) {
+		ret = context.querySelectorAll( tag || "*" );
+
+	} else {
+		ret = [];
+	}
+
+	if ( tag === undefined || tag && nodeName( context, tag ) ) {
+		return jQuery.merge( [ context ], ret );
+	}
+
+	return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		dataPriv.set(
+			elems[ i ],
+			"globalEval",
+			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
+		);
+	}
+}
+
+
+var rhtml = /<|&#?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+	var elem, tmp, tag, wrap, attached, j,
+		fragment = context.createDocumentFragment(),
+		nodes = [],
+		i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		elem = elems[ i ];
+
+		if ( elem || elem === 0 ) {
+
+			// Add nodes directly
+			if ( toType( elem ) === "object" ) {
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+			// Convert non-html into a text node
+			} else if ( !rhtml.test( elem ) ) {
+				nodes.push( context.createTextNode( elem ) );
+
+			// Convert html into DOM nodes
+			} else {
+				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+				// Deserialize a standard representation
+				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+				wrap = wrapMap[ tag ] || wrapMap._default;
+				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+				// Descend through wrappers to the right content
+				j = wrap[ 0 ];
+				while ( j-- ) {
+					tmp = tmp.lastChild;
+				}
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, tmp.childNodes );
+
+				// Remember the top-level container
+				tmp = fragment.firstChild;
+
+				// Ensure the created nodes are orphaned (#12392)
+				tmp.textContent = "";
+			}
+		}
+	}
+
+	// Remove wrapper from fragment
+	fragment.textContent = "";
+
+	i = 0;
+	while ( ( elem = nodes[ i++ ] ) ) {
+
+		// Skip elements already in the context collection (trac-4087)
+		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+			if ( ignored ) {
+				ignored.push( elem );
+			}
+			continue;
+		}
+
+		attached = isAttached( elem );
+
+		// Append to fragment
+		tmp = getAll( fragment.appendChild( elem ), "script" );
+
+		// Preserve script evaluation history
+		if ( attached ) {
+			setGlobalEval( tmp );
+		}
+
+		// Capture executables
+		if ( scripts ) {
+			j = 0;
+			while ( ( elem = tmp[ j++ ] ) ) {
+				if ( rscriptType.test( elem.type || "" ) ) {
+					scripts.push( elem );
+				}
+			}
+		}
+	}
+
+	return fragment;
+}
+
+
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+// Support: IE <=9 - 11+
+// focus() and blur() are asynchronous, except when they are no-op.
+// So expect focus to be synchronous when the element is already active,
+// and blur to be synchronous when the element is not already active.
+// (focus and blur are always synchronous in other supported browsers,
+// this just defines when we can count on it).
+function expectSync( elem, type ) {
+	return ( elem === safeActiveElement() ) === ( type === "focus" );
+}
+
+// Support: IE <=9 only
+// Accessing document.activeElement can throw unexpectedly
+// https://bugs.jquery.com/ticket/13393
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+	var origFn, type;
+
+	// Types can be a map of types/handlers
+	if ( typeof types === "object" ) {
+
+		// ( types-Object, selector, data )
+		if ( typeof selector !== "string" ) {
+
+			// ( types-Object, data )
+			data = data || selector;
+			selector = undefined;
+		}
+		for ( type in types ) {
+			on( elem, type, selector, data, types[ type ], one );
+		}
+		return elem;
+	}
+
+	if ( data == null && fn == null ) {
+
+		// ( types, fn )
+		fn = selector;
+		data = selector = undefined;
+	} else if ( fn == null ) {
+		if ( typeof selector === "string" ) {
+
+			// ( types, selector, fn )
+			fn = data;
+			data = undefined;
+		} else {
+
+			// ( types, data, fn )
+			fn = data;
+			data = selector;
+			selector = undefined;
+		}
+	}
+	if ( fn === false ) {
+		fn = returnFalse;
+	} else if ( !fn ) {
+		return elem;
+	}
+
+	if ( one === 1 ) {
+		origFn = fn;
+		fn = function( event ) {
+
+			// Can use an empty set, since event contains the info
+			jQuery().off( event );
+			return origFn.apply( this, arguments );
+		};
+
+		// Use same guid so caller can remove using origFn
+		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+	}
+	return elem.each( function() {
+		jQuery.event.add( this, types, fn, data, selector );
+	} );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var handleObjIn, eventHandle, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.get( elem );
+
+		// Only attach events to objects that accept data
+		if ( !acceptData( elem ) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Ensure that invalid selectors throw exceptions at attach time
+		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
+		if ( selector ) {
+			jQuery.find.matchesSelector( documentElement, selector );
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !( events = elemData.events ) ) {
+			events = elemData.events = Object.create( null );
+		}
+		if ( !( eventHandle = elemData.handle ) ) {
+			eventHandle = elemData.handle = function( e ) {
+
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+			};
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// There *must* be a type, no attaching namespace-only handlers
+			if ( !type ) {
+				continue;
+			}
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend( {
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join( "." )
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !( handlers = events[ type ] ) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener if the special events handler returns false
+				if ( !special.setup ||
+					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var j, origCount, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+		if ( !elemData || !( events = elemData.events ) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[ 2 ] &&
+				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector ||
+						selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown ||
+					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove data and the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			dataPriv.remove( elem, "handle events" );
+		}
+	},
+
+	dispatch: function( nativeEvent ) {
+
+		var i, j, ret, matched, handleObj, handlerQueue,
+			args = new Array( arguments.length ),
+
+			// Make a writable jQuery.Event from the native event object
+			event = jQuery.event.fix( nativeEvent ),
+
+			handlers = (
+				dataPriv.get( this, "events" ) || Object.create( null )
+			)[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[ 0 ] = event;
+
+		for ( i = 1; i < arguments.length; i++ ) {
+			args[ i ] = arguments[ i ];
+		}
+
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( ( handleObj = matched.handlers[ j++ ] ) &&
+				!event.isImmediatePropagationStopped() ) {
+
+				// If the event is namespaced, then each handler is only invoked if it is
+				// specially universal or its namespaces are a superset of the event's.
+				if ( !event.rnamespace || handleObj.namespace === false ||
+					event.rnamespace.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+						handleObj.handler ).apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( ( event.result = ret ) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var i, handleObj, sel, matchedHandlers, matchedSelectors,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		if ( delegateCount &&
+
+			// Support: IE <=9
+			// Black-hole SVG <use> instance trees (trac-13180)
+			cur.nodeType &&
+
+			// Support: Firefox <=42
+			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+			// Support: IE 11 only
+			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+			!( event.type === "click" && event.button >= 1 ) ) {
+
+			for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+					matchedHandlers = [];
+					matchedSelectors = {};
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matchedSelectors[ sel ] === undefined ) {
+							matchedSelectors[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) > -1 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matchedSelectors[ sel ] ) {
+							matchedHandlers.push( handleObj );
+						}
+					}
+					if ( matchedHandlers.length ) {
+						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		cur = this;
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+		}
+
+		return handlerQueue;
+	},
+
+	addProp: function( name, hook ) {
+		Object.defineProperty( jQuery.Event.prototype, name, {
+			enumerable: true,
+			configurable: true,
+
+			get: isFunction( hook ) ?
+				function() {
+					if ( this.originalEvent ) {
+						return hook( this.originalEvent );
+					}
+				} :
+				function() {
+					if ( this.originalEvent ) {
+						return this.originalEvent[ name ];
+					}
+				},
+
+			set: function( value ) {
+				Object.defineProperty( this, name, {
+					enumerable: true,
+					configurable: true,
+					writable: true,
+					value: value
+				} );
+			}
+		} );
+	},
+
+	fix: function( originalEvent ) {
+		return originalEvent[ jQuery.expando ] ?
+			originalEvent :
+			new jQuery.Event( originalEvent );
+	},
+
+	special: {
+		load: {
+
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		click: {
+
+			// Utilize native event to ensure correct state for checkable inputs
+			setup: function( data ) {
+
+				// For mutual compressibility with _default, replace `this` access with a local var.
+				// `|| data` is dead code meant only to preserve the variable through minification.
+				var el = this || data;
+
+				// Claim the first handler
+				if ( rcheckableType.test( el.type ) &&
+					el.click && nodeName( el, "input" ) ) {
+
+					// dataPriv.set( el, "click", ... )
+					leverageNative( el, "click", returnTrue );
+				}
+
+				// Return false to allow normal processing in the caller
+				return false;
+			},
+			trigger: function( data ) {
+
+				// For mutual compressibility with _default, replace `this` access with a local var.
+				// `|| data` is dead code meant only to preserve the variable through minification.
+				var el = this || data;
+
+				// Force setup before triggering a click
+				if ( rcheckableType.test( el.type ) &&
+					el.click && nodeName( el, "input" ) ) {
+
+					leverageNative( el, "click" );
+				}
+
+				// Return non-false to allow normal event-path propagation
+				return true;
+			},
+
+			// For cross-browser consistency, suppress native .click() on links
+			// Also prevent it if we're currently inside a leveraged native-event stack
+			_default: function( event ) {
+				var target = event.target;
+				return rcheckableType.test( target.type ) &&
+					target.click && nodeName( target, "input" ) &&
+					dataPriv.get( target, "click" ) ||
+					nodeName( target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Support: Firefox 20+
+				// Firefox doesn't alert if the returnValue field is not set.
+				if ( event.result !== undefined && event.originalEvent ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	}
+};
+
+// Ensure the presence of an event listener that handles manually-triggered
+// synthetic events by interrupting progress until reinvoked in response to
+// *native* events that it fires directly, ensuring that state changes have
+// already occurred before other listeners are invoked.
+function leverageNative( el, type, expectSync ) {
+
+	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
+	if ( !expectSync ) {
+		if ( dataPriv.get( el, type ) === undefined ) {
+			jQuery.event.add( el, type, returnTrue );
+		}
+		return;
+	}
+
+	// Register the controller as a special universal handler for all event namespaces
+	dataPriv.set( el, type, false );
+	jQuery.event.add( el, type, {
+		namespace: false,
+		handler: function( event ) {
+			var notAsync, result,
+				saved = dataPriv.get( this, type );
+
+			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
+
+				// Interrupt processing of the outer synthetic .trigger()ed event
+				// Saved data should be false in such cases, but might be a leftover capture object
+				// from an async native handler (gh-4350)
+				if ( !saved.length ) {
+
+					// Store arguments for use when handling the inner native event
+					// There will always be at least one argument (an event object), so this array
+					// will not be confused with a leftover capture object.
+					saved = slice.call( arguments );
+					dataPriv.set( this, type, saved );
+
+					// Trigger the native event and capture its result
+					// Support: IE <=9 - 11+
+					// focus() and blur() are asynchronous
+					notAsync = expectSync( this, type );
+					this[ type ]();
+					result = dataPriv.get( this, type );
+					if ( saved !== result || notAsync ) {
+						dataPriv.set( this, type, false );
+					} else {
+						result = {};
+					}
+					if ( saved !== result ) {
+
+						// Cancel the outer synthetic event
+						event.stopImmediatePropagation();
+						event.preventDefault();
+
+						// Support: Chrome 86+
+						// In Chrome, if an element having a focusout handler is blurred by
+						// clicking outside of it, it invokes the handler synchronously. If
+						// that handler calls `.remove()` on the element, the data is cleared,
+						// leaving `result` undefined. We need to guard against this.
+						return result && result.value;
+					}
+
+				// If this is an inner synthetic event for an event with a bubbling surrogate
+				// (focus or blur), assume that the surrogate already propagated from triggering the
+				// native event and prevent that from happening again here.
+				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
+				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
+				// less bad than duplication.
+				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
+					event.stopPropagation();
+				}
+
+			// If this is a native event triggered above, everything is now in order
+			// Fire an inner synthetic event with the original arguments
+			} else if ( saved.length ) {
+
+				// ...and capture the result
+				dataPriv.set( this, type, {
+					value: jQuery.event.trigger(
+
+						// Support: IE <=9 - 11+
+						// Extend with the prototype to reset the above stopImmediatePropagation()
+						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
+						saved.slice( 1 ),
+						this
+					)
+				} );
+
+				// Abort handling of the native event
+				event.stopImmediatePropagation();
+			}
+		}
+	} );
+}
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+	// This "if" is needed for plain objects
+	if ( elem.removeEventListener ) {
+		elem.removeEventListener( type, handle );
+	}
+};
+
+jQuery.Event = function( src, props ) {
+
+	// Allow instantiation without the 'new' keyword
+	if ( !( this instanceof jQuery.Event ) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = src.defaultPrevented ||
+				src.defaultPrevented === undefined &&
+
+				// Support: Android <=2.3 only
+				src.returnValue === false ?
+			returnTrue :
+			returnFalse;
+
+		// Create target properties
+		// Support: Safari <=6 - 7 only
+		// Target should not be a text node (#504, #13143)
+		this.target = ( src.target && src.target.nodeType === 3 ) ?
+			src.target.parentNode :
+			src.target;
+
+		this.currentTarget = src.currentTarget;
+		this.relatedTarget = src.relatedTarget;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || Date.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	constructor: jQuery.Event,
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+	isSimulated: false,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.preventDefault();
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopPropagation();
+		}
+	},
+	stopImmediatePropagation: function() {
+		var e = this.originalEvent;
+
+		this.isImmediatePropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopImmediatePropagation();
+		}
+
+		this.stopPropagation();
+	}
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+	altKey: true,
+	bubbles: true,
+	cancelable: true,
+	changedTouches: true,
+	ctrlKey: true,
+	detail: true,
+	eventPhase: true,
+	metaKey: true,
+	pageX: true,
+	pageY: true,
+	shiftKey: true,
+	view: true,
+	"char": true,
+	code: true,
+	charCode: true,
+	key: true,
+	keyCode: true,
+	button: true,
+	buttons: true,
+	clientX: true,
+	clientY: true,
+	offsetX: true,
+	offsetY: true,
+	pointerId: true,
+	pointerType: true,
+	screenX: true,
+	screenY: true,
+	targetTouches: true,
+	toElement: true,
+	touches: true,
+	which: true
+}, jQuery.event.addProp );
+
+jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
+	jQuery.event.special[ type ] = {
+
+		// Utilize native event if possible so blur/focus sequence is correct
+		setup: function() {
+
+			// Claim the first handler
+			// dataPriv.set( this, "focus", ... )
+			// dataPriv.set( this, "blur", ... )
+			leverageNative( this, type, expectSync );
+
+			// Return false to allow normal processing in the caller
+			return false;
+		},
+		trigger: function() {
+
+			// Force setup before trigger
+			leverageNative( this, type );
+
+			// Return non-false to allow normal event-path propagation
+			return true;
+		},
+
+		// Suppress native focus or blur as it's already being fired
+		// in leverageNative.
+		_default: function() {
+			return true;
+		},
+
+		delegateType: delegateType
+	};
+} );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+	mouseenter: "mouseover",
+	mouseleave: "mouseout",
+	pointerenter: "pointerover",
+	pointerleave: "pointerout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mouseenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+} );
+
+jQuery.fn.extend( {
+
+	on: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn );
+	},
+	one: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ?
+					handleObj.origType + "." + handleObj.namespace :
+					handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each( function() {
+			jQuery.event.remove( this, types, fn, selector );
+		} );
+	}
+} );
+
+
+var
+
+	// Support: IE <=10 - 11, Edge 12 - 13 only
+	// In IE/Edge using regex groups here causes severe slowdowns.
+	// See https://connect.microsoft.com/IE/feedback/details/1736512/
+	rnoInnerhtml = /<script|<style|<link/i,
+
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+// Prefer a tbody over its parent table for containing new rows
+function manipulationTarget( elem, content ) {
+	if ( nodeName( elem, "table" ) &&
+		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+
+		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
+	}
+
+	return elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
+		elem.type = elem.type.slice( 5 );
+	} else {
+		elem.removeAttribute( "type" );
+	}
+
+	return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+	var i, l, type, pdataOld, udataOld, udataCur, events;
+
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// 1. Copy private data: events, handlers, etc.
+	if ( dataPriv.hasData( src ) ) {
+		pdataOld = dataPriv.get( src );
+		events = pdataOld.events;
+
+		if ( events ) {
+			dataPriv.remove( dest, "handle events" );
+
+			for ( type in events ) {
+				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type, events[ type ][ i ] );
+				}
+			}
+		}
+	}
+
+	// 2. Copy user data
+	if ( dataUser.hasData( src ) ) {
+		udataOld = dataUser.access( src );
+		udataCur = jQuery.extend( {}, udataOld );
+
+		dataUser.set( dest, udataCur );
+	}
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+	var nodeName = dest.nodeName.toLowerCase();
+
+	// Fails to persist the checked state of a cloned checkbox or radio button.
+	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		dest.checked = src.checked;
+
+	// Fails to return the selected option to the default selected state when cloning options
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+	// Flatten any nested arrays
+	args = flat( args );
+
+	var fragment, first, scripts, hasScripts, node, doc,
+		i = 0,
+		l = collection.length,
+		iNoClone = l - 1,
+		value = args[ 0 ],
+		valueIsFunction = isFunction( value );
+
+	// We can't cloneNode fragments that contain checked, in WebKit
+	if ( valueIsFunction ||
+			( l > 1 && typeof value === "string" &&
+				!support.checkClone && rchecked.test( value ) ) ) {
+		return collection.each( function( index ) {
+			var self = collection.eq( index );
+			if ( valueIsFunction ) {
+				args[ 0 ] = value.call( this, index, self.html() );
+			}
+			domManip( self, args, callback, ignored );
+		} );
+	}
+
+	if ( l ) {
+		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+		first = fragment.firstChild;
+
+		if ( fragment.childNodes.length === 1 ) {
+			fragment = first;
+		}
+
+		// Require either new content or an interest in ignored elements to invoke the callback
+		if ( first || ignored ) {
+			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+			hasScripts = scripts.length;
+
+			// Use the original fragment for the last item
+			// instead of the first because it can end up
+			// being emptied incorrectly in certain situations (#8070).
+			for ( ; i < l; i++ ) {
+				node = fragment;
+
+				if ( i !== iNoClone ) {
+					node = jQuery.clone( node, true, true );
+
+					// Keep references to cloned scripts for later restoration
+					if ( hasScripts ) {
+
+						// Support: Android <=4.0 only, PhantomJS 1 only
+						// push.apply(_, arraylike) throws on ancient WebKit
+						jQuery.merge( scripts, getAll( node, "script" ) );
+					}
+				}
+
+				callback.call( collection[ i ], node, i );
+			}
+
+			if ( hasScripts ) {
+				doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+				// Reenable scripts
+				jQuery.map( scripts, restoreScript );
+
+				// Evaluate executable scripts on first document insertion
+				for ( i = 0; i < hasScripts; i++ ) {
+					node = scripts[ i ];
+					if ( rscriptType.test( node.type || "" ) &&
+						!dataPriv.access( node, "globalEval" ) &&
+						jQuery.contains( doc, node ) ) {
+
+						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
+
+							// Optional AJAX dependency, but won't run scripts if not present
+							if ( jQuery._evalUrl && !node.noModule ) {
+								jQuery._evalUrl( node.src, {
+									nonce: node.nonce || node.getAttribute( "nonce" )
+								}, doc );
+							}
+						} else {
+							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return collection;
+}
+
+function remove( elem, selector, keepData ) {
+	var node,
+		nodes = selector ? jQuery.filter( selector, elem ) : elem,
+		i = 0;
+
+	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
+		if ( !keepData && node.nodeType === 1 ) {
+			jQuery.cleanData( getAll( node ) );
+		}
+
+		if ( node.parentNode ) {
+			if ( keepData && isAttached( node ) ) {
+				setGlobalEval( getAll( node, "script" ) );
+			}
+			node.parentNode.removeChild( node );
+		}
+	}
+
+	return elem;
+}
+
+jQuery.extend( {
+	htmlPrefilter: function( html ) {
+		return html;
+	},
+
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var i, l, srcElements, destElements,
+			clone = elem.cloneNode( true ),
+			inPage = isAttached( elem );
+
+		// Fix IE cloning issues
+		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+				!jQuery.isXMLDoc( elem ) ) {
+
+			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			for ( i = 0, l = srcElements.length; i < l; i++ ) {
+				fixInput( srcElements[ i ], destElements[ i ] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0, l = srcElements.length; i < l; i++ ) {
+					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		// Return the cloned set
+		return clone;
+	},
+
+	cleanData: function( elems ) {
+		var data, elem, type,
+			special = jQuery.event.special,
+			i = 0;
+
+		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
+			if ( acceptData( elem ) ) {
+				if ( ( data = elem[ dataPriv.expando ] ) ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataPriv.expando ] = undefined;
+				}
+				if ( elem[ dataUser.expando ] ) {
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataUser.expando ] = undefined;
+				}
+			}
+		}
+	}
+} );
+
+jQuery.fn.extend( {
+	detach: function( selector ) {
+		return remove( this, selector, true );
+	},
+
+	remove: function( selector ) {
+		return remove( this, selector );
+	},
+
+	text: function( value ) {
+		return access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().each( function() {
+					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+						this.textContent = value;
+					}
+				} );
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		} );
+	},
+
+	prepend: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.insertBefore( elem, target.firstChild );
+			}
+		} );
+	},
+
+	before: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		} );
+	},
+
+	after: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		} );
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; ( elem = this[ i ] ) != null; i++ ) {
+			if ( elem.nodeType === 1 ) {
+
+				// Prevent memory leaks
+				jQuery.cleanData( getAll( elem, false ) );
+
+				// Remove any remaining nodes
+				elem.textContent = "";
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function() {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		} );
+	},
+
+	html: function( value ) {
+		return access( this, function( value ) {
+			var elem = this[ 0 ] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined && elem.nodeType === 1 ) {
+				return elem.innerHTML;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+				value = jQuery.htmlPrefilter( value );
+
+				try {
+					for ( ; i < l; i++ ) {
+						elem = this[ i ] || {};
+
+						// Remove element nodes and prevent memory leaks
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch ( e ) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function() {
+		var ignored = [];
+
+		// Make the changes, replacing each non-ignored context element with the new content
+		return domManip( this, arguments, function( elem ) {
+			var parent = this.parentNode;
+
+			if ( jQuery.inArray( this, ignored ) < 0 ) {
+				jQuery.cleanData( getAll( this ) );
+				if ( parent ) {
+					parent.replaceChild( elem, this );
+				}
+			}
+
+		// Force callback invocation
+		}, ignored );
+	}
+} );
+
+jQuery.each( {
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1,
+			i = 0;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone( true );
+			jQuery( insert[ i ] )[ original ]( elems );
+
+			// Support: Android <=4.0 only, PhantomJS 1 only
+			// .get() because push.apply(_, arraylike) throws on ancient WebKit
+			push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+} );
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+
+		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+		// IE throws on elements created in popups
+		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+		var view = elem.ownerDocument.defaultView;
+
+		if ( !view || !view.opener ) {
+			view = window;
+		}
+
+		return view.getComputedStyle( elem );
+	};
+
+var swap = function( elem, options, callback ) {
+	var ret, name,
+		old = {};
+
+	// Remember the old values, and insert the new ones
+	for ( name in options ) {
+		old[ name ] = elem.style[ name ];
+		elem.style[ name ] = options[ name ];
+	}
+
+	ret = callback.call( elem );
+
+	// Revert the old values
+	for ( name in options ) {
+		elem.style[ name ] = old[ name ];
+	}
+
+	return ret;
+};
+
+
+var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
+
+
+
+( function() {
+
+	// Executing both pixelPosition & boxSizingReliable tests require only one layout
+	// so they're executed at the same time to save the second computation.
+	function computeStyleTests() {
+
+		// This is a singleton, we need to execute it only once
+		if ( !div ) {
+			return;
+		}
+
+		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
+			"margin-top:1px;padding:0;border:0";
+		div.style.cssText =
+			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
+			"margin:auto;border:1px;padding:1px;" +
+			"width:60%;top:1%";
+		documentElement.appendChild( container ).appendChild( div );
+
+		var divStyle = window.getComputedStyle( div );
+		pixelPositionVal = divStyle.top !== "1%";
+
+		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
+
+		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
+		// Some styles come back with percentage values, even though they shouldn't
+		div.style.right = "60%";
+		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
+
+		// Support: IE 9 - 11 only
+		// Detect misreporting of content dimensions for box-sizing:border-box elements
+		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
+
+		// Support: IE 9 only
+		// Detect overflow:scroll screwiness (gh-3699)
+		// Support: Chrome <=64
+		// Don't get tricked when zoom affects offsetWidth (gh-4029)
+		div.style.position = "absolute";
+		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
+
+		documentElement.removeChild( container );
+
+		// Nullify the div so it wouldn't be stored in the memory and
+		// it will also be a sign that checks already performed
+		div = null;
+	}
+
+	function roundPixelMeasures( measure ) {
+		return Math.round( parseFloat( measure ) );
+	}
+
+	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
+		reliableTrDimensionsVal, reliableMarginLeftVal,
+		container = document.createElement( "div" ),
+		div = document.createElement( "div" );
+
+	// Finish early in limited (non-browser) environments
+	if ( !div.style ) {
+		return;
+	}
+
+	// Support: IE <=9 - 11 only
+	// Style of cloned element affects source element cloned (#8908)
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	jQuery.extend( support, {
+		boxSizingReliable: function() {
+			computeStyleTests();
+			return boxSizingReliableVal;
+		},
+		pixelBoxStyles: function() {
+			computeStyleTests();
+			return pixelBoxStylesVal;
+		},
+		pixelPosition: function() {
+			computeStyleTests();
+			return pixelPositionVal;
+		},
+		reliableMarginLeft: function() {
+			computeStyleTests();
+			return reliableMarginLeftVal;
+		},
+		scrollboxSize: function() {
+			computeStyleTests();
+			return scrollboxSizeVal;
+		},
+
+		// Support: IE 9 - 11+, Edge 15 - 18+
+		// IE/Edge misreport `getComputedStyle` of table rows with width/height
+		// set in CSS while `offset*` properties report correct values.
+		// Behavior in IE 9 is more subtle than in newer versions & it passes
+		// some versions of this test; make sure not to make it pass there!
+		//
+		// Support: Firefox 70+
+		// Only Firefox includes border widths
+		// in computed dimensions. (gh-4529)
+		reliableTrDimensions: function() {
+			var table, tr, trChild, trStyle;
+			if ( reliableTrDimensionsVal == null ) {
+				table = document.createElement( "table" );
+				tr = document.createElement( "tr" );
+				trChild = document.createElement( "div" );
+
+				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+				tr.style.cssText = "border:1px solid";
+
+				// Support: Chrome 86+
+				// Height set through cssText does not get applied.
+				// Computed height then comes back as 0.
+				tr.style.height = "1px";
+				trChild.style.height = "9px";
+
+				// Support: Android 8 Chrome 86+
+				// In our bodyBackground.html iframe,
+				// display for all div elements is set to "inline",
+				// which causes a problem only in Android 8 Chrome 86.
+				// Ensuring the div is display: block
+				// gets around this issue.
+				trChild.style.display = "block";
+
+				documentElement
+					.appendChild( table )
+					.appendChild( tr )
+					.appendChild( trChild );
+
+				trStyle = window.getComputedStyle( tr );
+				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+					parseInt( trStyle.borderTopWidth, 10 ) +
+					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
+
+				documentElement.removeChild( table );
+			}
+			return reliableTrDimensionsVal;
+		}
+	} );
+} )();
+
+
+function curCSS( elem, name, computed ) {
+	var width, minWidth, maxWidth, ret,
+
+		// Support: Firefox 51+
+		// Retrieving style before computed somehow
+		// fixes an issue with getting wrong values
+		// on detached elements
+		style = elem.style;
+
+	computed = computed || getStyles( elem );
+
+	// getPropertyValue is needed for:
+	//   .css('filter') (IE 9 only, #12537)
+	//   .css('--customProperty) (#3144)
+	if ( computed ) {
+		ret = computed.getPropertyValue( name ) || computed[ name ];
+
+		if ( ret === "" && !isAttached( elem ) ) {
+			ret = jQuery.style( elem, name );
+		}
+
+		// A tribute to the "awesome hack by Dean Edwards"
+		// Android Browser returns percentage for some values,
+		// but width seems to be reliably pixels.
+		// This is against the CSSOM draft spec:
+		// https://drafts.csswg.org/cssom/#resolved-values
+		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
+
+			// Remember the original values
+			width = style.width;
+			minWidth = style.minWidth;
+			maxWidth = style.maxWidth;
+
+			// Put in the new values to get a computed value out
+			style.minWidth = style.maxWidth = style.width = ret;
+			ret = computed.width;
+
+			// Revert the changed values
+			style.width = width;
+			style.minWidth = minWidth;
+			style.maxWidth = maxWidth;
+		}
+	}
+
+	return ret !== undefined ?
+
+		// Support: IE <=9 - 11 only
+		// IE returns zIndex value as an integer.
+		ret + "" :
+		ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+	// Define the hook, we'll check on the first run if it's really needed.
+	return {
+		get: function() {
+			if ( conditionFn() ) {
+
+				// Hook not needed (or it's not possible to use it due
+				// to missing dependency), remove it.
+				delete this.get;
+				return;
+			}
+
+			// Hook needed; redefine it so that the support test is not executed again.
+			return ( this.get = hookFn ).apply( this, arguments );
+		}
+	};
+}
+
+
+var cssPrefixes = [ "Webkit", "Moz", "ms" ],
+	emptyStyle = document.createElement( "div" ).style,
+	vendorProps = {};
+
+// Return a vendor-prefixed property or undefined
+function vendorPropName( name ) {
+
+	// Check for vendor prefixed names
+	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in emptyStyle ) {
+			return name;
+		}
+	}
+}
+
+// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
+function finalPropName( name ) {
+	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
+
+	if ( final ) {
+		return final;
+	}
+	if ( name in emptyStyle ) {
+		return name;
+	}
+	return vendorProps[ name ] = vendorPropName( name ) || name;
+}
+
+
+var
+
+	// Swappable if display is none or starts with table
+	// except "table", "table-cell", or "table-caption"
+	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rcustomProp = /^--/,
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: "0",
+		fontWeight: "400"
+	};
+
+function setPositiveNumber( _elem, value, subtract ) {
+
+	// Any relative (+/-) values have already been
+	// normalized at this point
+	var matches = rcssNum.exec( value );
+	return matches ?
+
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
+		value;
+}
+
+function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
+	var i = dimension === "width" ? 1 : 0,
+		extra = 0,
+		delta = 0;
+
+	// Adjustment may not be necessary
+	if ( box === ( isBorderBox ? "border" : "content" ) ) {
+		return 0;
+	}
+
+	for ( ; i < 4; i += 2 ) {
+
+		// Both box models exclude margin
+		if ( box === "margin" ) {
+			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
+		}
+
+		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
+		if ( !isBorderBox ) {
+
+			// Add padding
+			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// For "border" or "margin", add border
+			if ( box !== "padding" ) {
+				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+
+			// But still keep track of it otherwise
+			} else {
+				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+
+		// If we get here with a border-box (content + padding + border), we're seeking "content" or
+		// "padding" or "margin"
+		} else {
+
+			// For "content", subtract padding
+			if ( box === "content" ) {
+				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// For "content" or "padding", subtract border
+			if ( box !== "margin" ) {
+				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	// Account for positive content-box scroll gutter when requested by providing computedVal
+	if ( !isBorderBox && computedVal >= 0 ) {
+
+		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
+		// Assuming integer scroll gutter, subtract the rest and round down
+		delta += Math.max( 0, Math.ceil(
+			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+			computedVal -
+			delta -
+			extra -
+			0.5
+
+		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
+		// Use an explicit zero to avoid NaN (gh-3964)
+		) ) || 0;
+	}
+
+	return delta;
+}
+
+function getWidthOrHeight( elem, dimension, extra ) {
+
+	// Start with computed style
+	var styles = getStyles( elem ),
+
+		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
+		// Fake content-box until we know it's needed to know the true value.
+		boxSizingNeeded = !support.boxSizingReliable() || extra,
+		isBorderBox = boxSizingNeeded &&
+			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+		valueIsBorderBox = isBorderBox,
+
+		val = curCSS( elem, dimension, styles ),
+		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
+
+	// Support: Firefox <=54
+	// Return a confounding non-pixel value or feign ignorance, as appropriate.
+	if ( rnumnonpx.test( val ) ) {
+		if ( !extra ) {
+			return val;
+		}
+		val = "auto";
+	}
+
+
+	// Support: IE 9 - 11 only
+	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
+	// In those cases, the computed value can be trusted to be border-box.
+	if ( ( !support.boxSizingReliable() && isBorderBox ||
+
+		// Support: IE 10 - 11+, Edge 15 - 18+
+		// IE/Edge misreport `getComputedStyle` of table rows with width/height
+		// set in CSS while `offset*` properties report correct values.
+		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
+		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
+
+		// Fall back to offsetWidth/offsetHeight when value is "auto"
+		// This happens for inline elements with no explicit setting (gh-3571)
+		val === "auto" ||
+
+		// Support: Android <=4.1 - 4.3 only
+		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
+		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
+
+		// Make sure the element is visible & connected
+		elem.getClientRects().length ) {
+
+		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
+		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
+		// retrieved value as a content box dimension.
+		valueIsBorderBox = offsetProp in elem;
+		if ( valueIsBorderBox ) {
+			val = elem[ offsetProp ];
+		}
+	}
+
+	// Normalize "" and auto
+	val = parseFloat( val ) || 0;
+
+	// Adjust for the element's box model
+	return ( val +
+		boxModelAdjustment(
+			elem,
+			dimension,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles,
+
+			// Provide the current computed size to request scroll gutter calculation (gh-3589)
+			val
+		)
+	) + "px";
+}
+
+jQuery.extend( {
+
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Don't automatically add "px" to these possibly-unitless properties
+	cssNumber: {
+		"animationIterationCount": true,
+		"columnCount": true,
+		"fillOpacity": true,
+		"flexGrow": true,
+		"flexShrink": true,
+		"fontWeight": true,
+		"gridArea": true,
+		"gridColumn": true,
+		"gridColumnEnd": true,
+		"gridColumnStart": true,
+		"gridRow": true,
+		"gridRowEnd": true,
+		"gridRowStart": true,
+		"lineHeight": true,
+		"opacity": true,
+		"order": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = camelCase( name ),
+			isCustomProp = rcustomProp.test( name ),
+			style = elem.style;
+
+		// Make sure that we're working with the right name. We don't
+		// want to query the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Gets hook for the prefixed version, then unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// Convert "+=" or "-=" to relative numbers (#7345)
+			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+				value = adjustCSS( elem, name, ret );
+
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that null and NaN values aren't set (#7116)
+			if ( value == null || value !== value ) {
+				return;
+			}
+
+			// If a number was passed in, add the unit (except for certain CSS properties)
+			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
+			// "px" to a few hardcoded values.
+			if ( type === "number" && !isCustomProp ) {
+				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+			}
+
+			// background-* props affect original clone's values
+			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !( "set" in hooks ) ||
+				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+				if ( isCustomProp ) {
+					style.setProperty( name, value );
+				} else {
+					style[ name ] = value;
+				}
+			}
+
+		} else {
+
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks &&
+				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var val, num, hooks,
+			origName = camelCase( name ),
+			isCustomProp = rcustomProp.test( name );
+
+		// Make sure that we're working with the right name. We don't
+		// want to modify the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Try prefixed name followed by the unprefixed name
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		// Convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Make numeric if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || isFinite( num ) ? num || 0 : val;
+		}
+
+		return val;
+	}
+} );
+
+jQuery.each( [ "height", "width" ], function( _i, dimension ) {
+	jQuery.cssHooks[ dimension ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+
+				// Certain elements can have dimension info if we invisibly show them
+				// but it must have a current display style that would benefit
+				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+
+					// Support: Safari 8+
+					// Table columns in Safari have non-zero offsetWidth & zero
+					// getBoundingClientRect().width unless display is changed.
+					// Support: IE <=11 only
+					// Running getBoundingClientRect on a disconnected node
+					// in IE throws an error.
+					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
+					swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, dimension, extra );
+					} ) :
+					getWidthOrHeight( elem, dimension, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var matches,
+				styles = getStyles( elem ),
+
+				// Only read styles.position if the test has a chance to fail
+				// to avoid forcing a reflow.
+				scrollboxSizeBuggy = !support.scrollboxSize() &&
+					styles.position === "absolute",
+
+				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
+				boxSizingNeeded = scrollboxSizeBuggy || extra,
+				isBorderBox = boxSizingNeeded &&
+					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+				subtract = extra ?
+					boxModelAdjustment(
+						elem,
+						dimension,
+						extra,
+						isBorderBox,
+						styles
+					) :
+					0;
+
+			// Account for unreliable border-box dimensions by comparing offset* to computed and
+			// faking a content-box to get border and padding (gh-3699)
+			if ( isBorderBox && scrollboxSizeBuggy ) {
+				subtract -= Math.ceil(
+					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+					parseFloat( styles[ dimension ] ) -
+					boxModelAdjustment( elem, dimension, "border", false, styles ) -
+					0.5
+				);
+			}
+
+			// Convert to pixels if value adjustment is needed
+			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
+				( matches[ 3 ] || "px" ) !== "px" ) {
+
+				elem.style[ dimension ] = value;
+				value = jQuery.css( elem, dimension );
+			}
+
+			return setPositiveNumber( elem, value, subtract );
+		}
+	};
+} );
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+	function( elem, computed ) {
+		if ( computed ) {
+			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
+				elem.getBoundingClientRect().left -
+					swap( elem, { marginLeft: 0 }, function() {
+						return elem.getBoundingClientRect().left;
+					} )
+			) + "px";
+		}
+	}
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// Assumes a single number if not a string
+				parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( prefix !== "margin" ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+} );
+
+jQuery.fn.extend( {
+	css: function( name, value ) {
+		return access( this, function( elem, name, value ) {
+			var styles, len,
+				map = {},
+				i = 0;
+
+			if ( Array.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	}
+} );
+
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || jQuery.easing._default;
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			// Use a property on the element directly when it is not a DOM element,
+			// or when there is no matching style property that exists.
+			if ( tween.elem.nodeType !== 1 ||
+				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// Passing an empty string as a 3rd parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails.
+			// Simple values such as "10px" are parsed to Float;
+			// complex values such as "rotate(1rad)" are returned as-is.
+			result = jQuery.css( tween.elem, tween.prop, "" );
+
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+
+			// Use step hook for back compat.
+			// Use cssHook if its there.
+			// Use .style if available and use plain properties where available.
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.nodeType === 1 && (
+				jQuery.cssHooks[ tween.prop ] ||
+					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Support: IE <=9 only
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p * Math.PI ) / 2;
+	},
+	_default: "swing"
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+	fxNow, inProgress,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rrun = /queueHooks$/;
+
+function schedule() {
+	if ( inProgress ) {
+		if ( document.hidden === false && window.requestAnimationFrame ) {
+			window.requestAnimationFrame( schedule );
+		} else {
+			window.setTimeout( schedule, jQuery.fx.interval );
+		}
+
+		jQuery.fx.tick();
+	}
+}
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	window.setTimeout( function() {
+		fxNow = undefined;
+	} );
+	return ( fxNow = Date.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		i = 0,
+		attrs = { height: type };
+
+	// If we include width, step value is 1 to do all cssExpand values,
+	// otherwise step value is 2 to skip over Left and Right
+	includeWidth = includeWidth ? 1 : 0;
+	for ( ; i < 4; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
+		index = 0,
+		length = collection.length;
+	for ( ; index < length; index++ ) {
+		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
+
+			// We're done with this property
+			return tween;
+		}
+	}
+}
+
+function defaultPrefilter( elem, props, opts ) {
+	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
+		isBox = "width" in props || "height" in props,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHiddenWithinTree( elem ),
+		dataShow = dataPriv.get( elem, "fxshow" );
+
+	// Queue-skipping animations hijack the fx hooks
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always( function() {
+
+			// Ensure the complete handler is called before this completes
+			anim.always( function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			} );
+		} );
+	}
+
+	// Detect show/hide animations
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.test( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+
+				// Pretend to be hidden if this is a "show" and
+				// there is still data from a stopped show/hide
+				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+					hidden = true;
+
+				// Ignore all other no-op show/hide data
+				} else {
+					continue;
+				}
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+		}
+	}
+
+	// Bail out if this is a no-op like .hide().hide()
+	propTween = !jQuery.isEmptyObject( props );
+	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
+		return;
+	}
+
+	// Restrict "overflow" and "display" styles during box animations
+	if ( isBox && elem.nodeType === 1 ) {
+
+		// Support: IE <=9 - 11, Edge 12 - 15
+		// Record all 3 overflow attributes because IE does not infer the shorthand
+		// from identically-valued overflowX and overflowY and Edge just mirrors
+		// the overflowX value there.
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Identify a display type, preferring old show/hide data over the CSS cascade
+		restoreDisplay = dataShow && dataShow.display;
+		if ( restoreDisplay == null ) {
+			restoreDisplay = dataPriv.get( elem, "display" );
+		}
+		display = jQuery.css( elem, "display" );
+		if ( display === "none" ) {
+			if ( restoreDisplay ) {
+				display = restoreDisplay;
+			} else {
+
+				// Get nonempty value(s) by temporarily forcing visibility
+				showHide( [ elem ], true );
+				restoreDisplay = elem.style.display || restoreDisplay;
+				display = jQuery.css( elem, "display" );
+				showHide( [ elem ] );
+			}
+		}
+
+		// Animate inline elements as inline-block
+		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
+			if ( jQuery.css( elem, "float" ) === "none" ) {
+
+				// Restore the original display value at the end of pure show/hide animations
+				if ( !propTween ) {
+					anim.done( function() {
+						style.display = restoreDisplay;
+					} );
+					if ( restoreDisplay == null ) {
+						display = style.display;
+						restoreDisplay = display === "none" ? "" : display;
+					}
+				}
+				style.display = "inline-block";
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		anim.always( function() {
+			style.overflow = opts.overflow[ 0 ];
+			style.overflowX = opts.overflow[ 1 ];
+			style.overflowY = opts.overflow[ 2 ];
+		} );
+	}
+
+	// Implement show/hide animations
+	propTween = false;
+	for ( prop in orig ) {
+
+		// General show/hide setup for this element animation
+		if ( !propTween ) {
+			if ( dataShow ) {
+				if ( "hidden" in dataShow ) {
+					hidden = dataShow.hidden;
+				}
+			} else {
+				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
+			}
+
+			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
+			if ( toggle ) {
+				dataShow.hidden = !hidden;
+			}
+
+			// Show elements before animating them
+			if ( hidden ) {
+				showHide( [ elem ], true );
+			}
+
+			/* eslint-disable no-loop-func */
+
+			anim.done( function() {
+
+				/* eslint-enable no-loop-func */
+
+				// The final step of a "hide" animation is actually hiding the element
+				if ( !hidden ) {
+					showHide( [ elem ] );
+				}
+				dataPriv.remove( elem, "fxshow" );
+				for ( prop in orig ) {
+					jQuery.style( elem, prop, orig[ prop ] );
+				}
+			} );
+		}
+
+		// Per-property setup
+		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+		if ( !( prop in dataShow ) ) {
+			dataShow[ prop ] = propTween.start;
+			if ( hidden ) {
+				propTween.end = propTween.start;
+				propTween.start = 0;
+			}
+		}
+	}
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( Array.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// Not quite $.extend, this won't overwrite existing keys.
+			// Reusing 'index' because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = Animation.prefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+
+			// Don't match elem in the :animated selector
+			delete tick.elem;
+		} ),
+		tick = function() {
+			if ( stopped ) {
+				return false;
+			}
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+
+				// Support: Android 2.3 only
+				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ] );
+
+			// If there's more to do, yield
+			if ( percent < 1 && length ) {
+				return remaining;
+			}
+
+			// If this was an empty animation, synthesize a final progress notification
+			if ( !length ) {
+				deferred.notifyWith( elem, [ animation, 1, 0 ] );
+			}
+
+			// Resolve the animation and report its conclusion
+			deferred.resolveWith( elem, [ animation ] );
+			return false;
+		},
+		animation = deferred.promise( {
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, {
+				specialEasing: {},
+				easing: jQuery.easing._default
+			}, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+					animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+
+					// If we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+				if ( stopped ) {
+					return this;
+				}
+				stopped = true;
+				for ( ; index < length; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// Resolve when we played the last frame; otherwise, reject
+				if ( gotoEnd ) {
+					deferred.notifyWith( elem, [ animation, 1, 0 ] );
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		} ),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length; index++ ) {
+		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			if ( isFunction( result.stop ) ) {
+				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
+					result.stop.bind( result );
+			}
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	// Attach callbacks from options
+	animation
+		.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		} )
+	);
+
+	return animation;
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweeners: {
+		"*": [ function( prop, value ) {
+			var tween = this.createTween( prop, value );
+			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
+			return tween;
+		} ]
+	},
+
+	tweener: function( props, callback ) {
+		if ( isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.match( rnothtmlwhite );
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length; index++ ) {
+			prop = props[ index ];
+			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
+			Animation.tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilters: [ defaultPrefilter ],
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			Animation.prefilters.unshift( callback );
+		} else {
+			Animation.prefilters.push( callback );
+		}
+	}
+} );
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !isFunction( easing ) && easing
+	};
+
+	// Go to the end state if fx are off
+	if ( jQuery.fx.off ) {
+		opt.duration = 0;
+
+	} else {
+		if ( typeof opt.duration !== "number" ) {
+			if ( opt.duration in jQuery.fx.speeds ) {
+				opt.duration = jQuery.fx.speeds[ opt.duration ];
+
+			} else {
+				opt.duration = jQuery.fx.speeds._default;
+			}
+		}
+	}
+
+	// Normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.fn.extend( {
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// Show any hidden elements after setting opacity to 0
+		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
+
+			// Animate to the value specified
+			.end().animate( { opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations, or finishing resolves immediately
+				if ( empty || dataPriv.get( this, "finish" ) ) {
+					anim.stop( true );
+				}
+			};
+
+		doAnimation.finish = doAnimation;
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each( function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = dataPriv.get( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this &&
+					( type == null || timers[ index ].queue === type ) ) {
+
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// Start the next in the queue if the last step wasn't forced.
+			// Timers currently will call their complete callbacks, which
+			// will dequeue but only if they were gotoEnd.
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		} );
+	},
+	finish: function( type ) {
+		if ( type !== false ) {
+			type = type || "fx";
+		}
+		return this.each( function() {
+			var index,
+				data = dataPriv.get( this ),
+				queue = data[ type + "queue" ],
+				hooks = data[ type + "queueHooks" ],
+				timers = jQuery.timers,
+				length = queue ? queue.length : 0;
+
+			// Enable finishing flag on private data
+			data.finish = true;
+
+			// Empty the queue first
+			jQuery.queue( this, type, [] );
+
+			if ( hooks && hooks.stop ) {
+				hooks.stop.call( this, true );
+			}
+
+			// Look for any active animations, and finish them
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+					timers[ index ].anim.stop( true );
+					timers.splice( index, 1 );
+				}
+			}
+
+			// Look for any animations in the old queue and finish them
+			for ( index = 0; index < length; index++ ) {
+				if ( queue[ index ] && queue[ index ].finish ) {
+					queue[ index ].finish.call( this );
+				}
+			}
+
+			// Turn off finishing flag
+			delete data.finish;
+		} );
+	}
+} );
+
+jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+} );
+
+// Generate shortcuts for custom animations
+jQuery.each( {
+	slideDown: genFx( "show" ),
+	slideUp: genFx( "hide" ),
+	slideToggle: genFx( "toggle" ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+} );
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+	var timer,
+		i = 0,
+		timers = jQuery.timers;
+
+	fxNow = Date.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+
+		// Run the timer and safely remove it when done (allowing for external removal)
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	jQuery.timers.push( timer );
+	jQuery.fx.start();
+};
+
+jQuery.fx.interval = 13;
+jQuery.fx.start = function() {
+	if ( inProgress ) {
+		return;
+	}
+
+	inProgress = true;
+	schedule();
+};
+
+jQuery.fx.stop = function() {
+	inProgress = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+
+	// Default speed
+	_default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+	type = type || "fx";
+
+	return this.queue( type, function( next, hooks ) {
+		var timeout = window.setTimeout( next, time );
+		hooks.stop = function() {
+			window.clearTimeout( timeout );
+		};
+	} );
+};
+
+
+( function() {
+	var input = document.createElement( "input" ),
+		select = document.createElement( "select" ),
+		opt = select.appendChild( document.createElement( "option" ) );
+
+	input.type = "checkbox";
+
+	// Support: Android <=4.3 only
+	// Default value for a checkbox should be "on"
+	support.checkOn = input.value !== "";
+
+	// Support: IE <=11 only
+	// Must access selectedIndex to make default options select
+	support.optSelected = opt.selected;
+
+	// Support: IE <=11 only
+	// An input loses its value after becoming a radio
+	input = document.createElement( "input" );
+	input.value = "t";
+	input.type = "radio";
+	support.radioValue = input.value === "t";
+} )();
+
+
+var boolHook,
+	attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend( {
+	attr: function( name, value ) {
+		return access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each( function() {
+			jQuery.removeAttr( this, name );
+		} );
+	}
+} );
+
+jQuery.extend( {
+	attr: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set attributes on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// Attribute hooks are determined by the lowercase version
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
+		}
+
+		if ( value !== undefined ) {
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+			}
+
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			elem.setAttribute( name, value + "" );
+			return value;
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		ret = jQuery.find.attr( elem, name );
+
+		// Non-existent attributes return null, we normalize to undefined
+		return ret == null ? undefined : ret;
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !support.radioValue && value === "radio" &&
+					nodeName( elem, "input" ) ) {
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name,
+			i = 0,
+
+			// Attribute names can contain non-HTML whitespace characters
+			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+			attrNames = value && value.match( rnothtmlwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( ( name = attrNames[ i++ ] ) ) {
+				elem.removeAttribute( name );
+			}
+		}
+	}
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			elem.setAttribute( name, name );
+		}
+		return name;
+	}
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
+	var getter = attrHandle[ name ] || jQuery.find.attr;
+
+	attrHandle[ name ] = function( elem, name, isXML ) {
+		var ret, handle,
+			lowercaseName = name.toLowerCase();
+
+		if ( !isXML ) {
+
+			// Avoid an infinite loop by temporarily removing this function from the getter
+			handle = attrHandle[ lowercaseName ];
+			attrHandle[ lowercaseName ] = ret;
+			ret = getter( elem, name, isXML ) != null ?
+				lowercaseName :
+				null;
+			attrHandle[ lowercaseName ] = handle;
+		}
+		return ret;
+	};
+} );
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i,
+	rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+	prop: function( name, value ) {
+		return access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		return this.each( function() {
+			delete this[ jQuery.propFix[ name ] || name ];
+		} );
+	}
+} );
+
+jQuery.extend( {
+	prop: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set properties on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			return ( elem[ name ] = value );
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		return elem[ name ];
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+
+				// Support: IE <=9 - 11 only
+				// elem.tabIndex doesn't always return the
+				// correct value when it hasn't been explicitly set
+				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				// Use proper attribute retrieval(#12072)
+				var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+				if ( tabindex ) {
+					return parseInt( tabindex, 10 );
+				}
+
+				if (
+					rfocusable.test( elem.nodeName ) ||
+					rclickable.test( elem.nodeName ) &&
+					elem.href
+				) {
+					return 0;
+				}
+
+				return -1;
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	}
+} );
+
+// Support: IE <=11 only
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
+if ( !support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent && parent.parentNode ) {
+				parent.parentNode.selectedIndex;
+			}
+			return null;
+		},
+		set: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent ) {
+				parent.selectedIndex;
+
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+		}
+	};
+}
+
+jQuery.each( [
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+
+
+
+	// Strip and collapse whitespace according to HTML spec
+	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
+	function stripAndCollapse( value ) {
+		var tokens = value.match( rnothtmlwhite ) || [];
+		return tokens.join( " " );
+	}
+
+
+function getClass( elem ) {
+	return elem.getAttribute && elem.getAttribute( "class" ) || "";
+}
+
+function classesToArray( value ) {
+	if ( Array.isArray( value ) ) {
+		return value;
+	}
+	if ( typeof value === "string" ) {
+		return value.match( rnothtmlwhite ) || [];
+	}
+	return [];
+}
+
+jQuery.fn.extend( {
+	addClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		classes = classesToArray( value );
+
+		if ( classes.length ) {
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( !arguments.length ) {
+			return this.attr( "class", "" );
+		}
+
+		classes = classesToArray( value );
+
+		if ( classes.length ) {
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isValidValue = type === "string" || Array.isArray( value );
+
+		if ( typeof stateVal === "boolean" && isValidValue ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( isFunction( value ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).toggleClass(
+					value.call( this, i, getClass( this ), stateVal ),
+					stateVal
+				);
+			} );
+		}
+
+		return this.each( function() {
+			var className, i, self, classNames;
+
+			if ( isValidValue ) {
+
+				// Toggle individual class names
+				i = 0;
+				self = jQuery( this );
+				classNames = classesToArray( value );
+
+				while ( ( className = classNames[ i++ ] ) ) {
+
+					// Check each className given, space separated list
+					if ( self.hasClass( className ) ) {
+						self.removeClass( className );
+					} else {
+						self.addClass( className );
+					}
+				}
+
+			// Toggle whole class name
+			} else if ( value === undefined || type === "boolean" ) {
+				className = getClass( this );
+				if ( className ) {
+
+					// Store className if set
+					dataPriv.set( this, "__className__", className );
+				}
+
+				// If the element has a class name or if we're passed `false`,
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				if ( this.setAttribute ) {
+					this.setAttribute( "class",
+						className || value === false ?
+							"" :
+							dataPriv.get( this, "__className__" ) || ""
+					);
+				}
+			}
+		} );
+	},
+
+	hasClass: function( selector ) {
+		var className, elem,
+			i = 0;
+
+		className = " " + selector + " ";
+		while ( ( elem = this[ i++ ] ) ) {
+			if ( elem.nodeType === 1 &&
+				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+} );
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend( {
+	val: function( value ) {
+		var hooks, ret, valueIsFunction,
+			elem = this[ 0 ];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] ||
+					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks &&
+					"get" in hooks &&
+					( ret = hooks.get( elem, "value" ) ) !== undefined
+				) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				// Handle most common string cases
+				if ( typeof ret === "string" ) {
+					return ret.replace( rreturn, "" );
+				}
+
+				// Handle cases where value is null/undef or number
+				return ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		valueIsFunction = isFunction( value );
+
+		return this.each( function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( valueIsFunction ) {
+				val = value.call( this, i, jQuery( this ).val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+
+			} else if ( typeof val === "number" ) {
+				val += "";
+
+			} else if ( Array.isArray( val ) ) {
+				val = jQuery.map( val, function( value ) {
+					return value == null ? "" : value + "";
+				} );
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		} );
+	}
+} );
+
+jQuery.extend( {
+	valHooks: {
+		option: {
+			get: function( elem ) {
+
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+
+					// Support: IE <=10 - 11 only
+					// option.text throws exceptions (#14686, #14858)
+					// Strip and collapse whitespace
+					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+					stripAndCollapse( jQuery.text( elem ) );
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option, i,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one",
+					values = one ? null : [],
+					max = one ? index + 1 : options.length;
+
+				if ( index < 0 ) {
+					i = max;
+
+				} else {
+					i = one ? index : 0;
+				}
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Support: IE <=9 only
+					// IE8-9 doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+
+							// Don't return options that are disabled or in a disabled optgroup
+							!option.disabled &&
+							( !option.parentNode.disabled ||
+								!nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var optionSet, option,
+					options = elem.options,
+					values = jQuery.makeArray( value ),
+					i = options.length;
+
+				while ( i-- ) {
+					option = options[ i ];
+
+					/* eslint-disable no-cond-assign */
+
+					if ( option.selected =
+						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+					) {
+						optionSet = true;
+					}
+
+					/* eslint-enable no-cond-assign */
+				}
+
+				// Force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	}
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( Array.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+			}
+		}
+	};
+	if ( !support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+		};
+	}
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+support.focusin = "onfocusin" in window;
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	stopPropagationCallback = function( e ) {
+		e.stopPropagation();
+	};
+
+jQuery.extend( jQuery.event, {
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+
+		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
+			eventPath = [ elem || document ],
+			type = hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+		cur = lastElement = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "." ) > -1 ) {
+
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split( "." );
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+		event.isTrigger = onlyHandlers ? 2 : 3;
+		event.namespace = namespaces.join( "." );
+		event.rnamespace = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === ( elem.ownerDocument || document ) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+			lastElement = cur;
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
+				dataPriv.get( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && handle.apply && acceptData( cur ) ) {
+				event.result = handle.apply( cur, data );
+				if ( event.result === false ) {
+					event.preventDefault();
+				}
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( ( !special._default ||
+				special._default.apply( eventPath.pop(), data ) === false ) &&
+				acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name as the event.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+
+					if ( event.isPropagationStopped() ) {
+						lastElement.addEventListener( type, stopPropagationCallback );
+					}
+
+					elem[ type ]();
+
+					if ( event.isPropagationStopped() ) {
+						lastElement.removeEventListener( type, stopPropagationCallback );
+					}
+
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Piggyback on a donor event to simulate a different one
+	// Used only for `focus(in | out)` events
+	simulate: function( type, elem, event ) {
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true
+			}
+		);
+
+		jQuery.event.trigger( e, null, elem );
+	}
+
+} );
+
+jQuery.fn.extend( {
+
+	trigger: function( type, data ) {
+		return this.each( function() {
+			jQuery.event.trigger( type, data, this );
+		} );
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[ 0 ];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+} );
+
+
+// Support: Firefox <=44
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler on the document while someone wants focusin/focusout
+		var handler = function( event ) {
+			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+		};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+
+				// Handle: regular nodes (via `this.ownerDocument`), window
+				// (via `this.document`) & document (via `this`).
+				var doc = this.ownerDocument || this.document || this,
+					attaches = dataPriv.access( doc, fix );
+
+				if ( !attaches ) {
+					doc.addEventListener( orig, handler, true );
+				}
+				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
+			},
+			teardown: function() {
+				var doc = this.ownerDocument || this.document || this,
+					attaches = dataPriv.access( doc, fix ) - 1;
+
+				if ( !attaches ) {
+					doc.removeEventListener( orig, handler, true );
+					dataPriv.remove( doc, fix );
+
+				} else {
+					dataPriv.access( doc, fix, attaches );
+				}
+			}
+		};
+	} );
+}
+var location = window.location;
+
+var nonce = { guid: Date.now() };
+
+var rquery = ( /\?/ );
+
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+	var xml, parserErrorElem;
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+
+	// Support: IE 9 - 11 only
+	// IE throws on parseFromString with invalid input.
+	try {
+		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
+	} catch ( e ) {}
+
+	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+	if ( !xml || parserErrorElem ) {
+		jQuery.error( "Invalid XML: " + (
+			parserErrorElem ?
+				jQuery.map( parserErrorElem.childNodes, function( el ) {
+					return el.textContent;
+				} ).join( "\n" ) :
+				data
+		) );
+	}
+	return xml;
+};
+
+
+var
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( Array.isArray( obj ) ) {
+
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams(
+					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+					v,
+					traditional,
+					add
+				);
+			}
+		} );
+
+	} else if ( !traditional && toType( obj ) === "object" ) {
+
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, valueOrFunction ) {
+
+			// If value is a function, invoke it and use its return value
+			var value = isFunction( valueOrFunction ) ?
+				valueOrFunction() :
+				valueOrFunction;
+
+			s[ s.length ] = encodeURIComponent( key ) + "=" +
+				encodeURIComponent( value == null ? "" : value );
+		};
+
+	if ( a == null ) {
+		return "";
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		} );
+
+	} else {
+
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" );
+};
+
+jQuery.fn.extend( {
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map( function() {
+
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		} ).filter( function() {
+			var type = this.type;
+
+			// Use .is( ":disabled" ) so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !rcheckableType.test( type ) );
+		} ).map( function( _i, elem ) {
+			var val = jQuery( this ).val();
+
+			if ( val == null ) {
+				return null;
+			}
+
+			if ( Array.isArray( val ) ) {
+				return jQuery.map( val, function( val ) {
+					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+				} );
+			}
+
+			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		} ).get();
+	}
+} );
+
+
+var
+	r20 = /%20/g,
+	rhash = /#.*$/,
+	rantiCache = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat( "*" ),
+
+	// Anchor tag for parsing the document origin
+	originAnchor = document.createElement( "a" );
+
+originAnchor.href = location.href;
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
+
+		if ( isFunction( func ) ) {
+
+			// For each dataType in the dataTypeExpression
+			while ( ( dataType = dataTypes[ i++ ] ) ) {
+
+				// Prepend if requested
+				if ( dataType[ 0 ] === "+" ) {
+					dataType = dataType.slice( 1 ) || "*";
+					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
+
+				// Otherwise append
+				} else {
+					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
+				}
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+	var inspected = {},
+		seekingTransport = ( structure === transports );
+
+	function inspect( dataType ) {
+		var selected;
+		inspected[ dataType ] = true;
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+			if ( typeof dataTypeOrTransport === "string" &&
+				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+
+				options.dataTypes.unshift( dataTypeOrTransport );
+				inspect( dataTypeOrTransport );
+				return false;
+			} else if ( seekingTransport ) {
+				return !( selected = dataTypeOrTransport );
+			}
+		} );
+		return selected;
+	}
+
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+
+	return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes;
+
+	// Remove auto dataType and get content-type in the process
+	while ( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+	var conv2, current, conv, tmp, prev,
+		converters = {},
+
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice();
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	current = dataTypes.shift();
+
+	// Convert to each sequential dataType
+	while ( current ) {
+
+		if ( s.responseFields[ current ] ) {
+			jqXHR[ s.responseFields[ current ] ] = response;
+		}
+
+		// Apply the dataFilter if provided
+		if ( !prev && isSuccess && s.dataFilter ) {
+			response = s.dataFilter( response, s.dataType );
+		}
+
+		prev = current;
+		current = dataTypes.shift();
+
+		if ( current ) {
+
+			// There's only work to do if current dataType is non-auto
+			if ( current === "*" ) {
+
+				current = prev;
+
+			// Convert response if prev dataType is non-auto and differs from current
+			} else if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split( " " );
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.unshift( tmp[ 1 ] );
+								}
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s.throws ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return {
+								state: "parsererror",
+								error: conv ? e : "No conversion from " + prev + " to " + current
+							};
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return { state: "success", data: response };
+}
+
+jQuery.extend( {
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: location.href,
+		type: "GET",
+		isLocal: rlocalProtocol.test( location.protocol ),
+		global: true,
+		processData: true,
+		async: true,
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			"*": allTypes,
+			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"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": JSON.parse,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			url: true,
+			context: true
+		}
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		return settings ?
+
+			// Building a settings object
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+			// Extending ajaxSettings
+			ajaxExtend( jQuery.ajaxSettings, target );
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var transport,
+
+			// URL without anti-cache param
+			cacheURL,
+
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+
+			// timeout handle
+			timeoutTimer,
+
+			// Url cleanup var
+			urlAnchor,
+
+			// Request state (becomes false upon send and true upon completion)
+			completed,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			// Loop variable
+			i,
+
+			// uncached part of the url
+			uncached,
+
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+
+			// Callbacks context
+			callbackContext = s.context || s,
+
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
+			globalEventContext = s.context &&
+				( callbackContext.nodeType || callbackContext.jquery ) ?
+				jQuery( callbackContext ) :
+				jQuery.event,
+
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+
+			// Default abort message
+			strAbort = "canceled",
+
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( completed ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
+									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
+										.concat( match[ 2 ] );
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() + " " ];
+					}
+					return match == null ? null : match.join( ", " );
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return completed ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( completed == null ) {
+						name = requestHeadersNames[ name.toLowerCase() ] =
+							requestHeadersNames[ name.toLowerCase() ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( completed == null ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( completed ) {
+
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						} else {
+
+							// Lazy-add the new callbacks in a way that preserves old ones
+							for ( code in map ) {
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						}
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					var finalText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( finalText );
+					}
+					done( 0, finalText );
+					return this;
+				}
+			};
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+
+		// Add protocol if not provided (prefilters might expect it)
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url || location.href ) + "" )
+			.replace( rprotocol, location.protocol + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
+
+		// A cross-domain request is in order when the origin doesn't match the current origin.
+		if ( s.crossDomain == null ) {
+			urlAnchor = document.createElement( "a" );
+
+			// Support: IE <=8 - 11, Edge 12 - 15
+			// IE throws exception on accessing the href property if url is malformed,
+			// e.g. http://example.com:80x/
+			try {
+				urlAnchor.href = s.url;
+
+				// Support: IE <=8 - 11 only
+				// Anchor's host property isn't correctly set when s.url is relative
+				urlAnchor.href = urlAnchor.href;
+				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
+					urlAnchor.protocol + "//" + urlAnchor.host;
+			} catch ( e ) {
+
+				// If there is an error parsing the URL, assume it is crossDomain,
+				// it can be rejected by the transport if it is invalid
+				s.crossDomain = true;
+			}
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( completed ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+		fireGlobals = jQuery.event && s.global;
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Save the URL in case we're toying with the If-Modified-Since
+		// and/or If-None-Match header later on
+		// Remove hash to simplify url manipulation
+		cacheURL = s.url.replace( rhash, "" );
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// Remember the hash so we can put it back
+			uncached = s.url.slice( cacheURL.length );
+
+			// If data is available and should be processed, append data to url
+			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
+				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
+
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add or update anti-cache param if needed
+			if ( s.cache === false ) {
+				cacheURL = cacheURL.replace( rantiCache, "$1" );
+				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
+					uncached;
+			}
+
+			// Put hash and anti-cache on the URL that will be requested (gh-1732)
+			s.url = cacheURL + uncached;
+
+		// Change '%20' to '+' if this is encoded form body content (gh-2658)
+		} else if ( s.data && s.processData &&
+			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
+			s.data = s.data.replace( r20, "+" );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			if ( jQuery.lastModified[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+			}
+			if ( jQuery.etag[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
+				s.accepts[ s.dataTypes[ 0 ] ] +
+					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend &&
+			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
+
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// Aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		completeDeferred.add( s.complete );
+		jqXHR.done( s.success );
+		jqXHR.fail( s.error );
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+
+			// If request was aborted inside ajaxSend, stop there
+			if ( completed ) {
+				return jqXHR;
+			}
+
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = window.setTimeout( function() {
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				completed = false;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+
+				// Rethrow post-completion exceptions
+				if ( completed ) {
+					throw e;
+				}
+
+				// Propagate others as results
+				done( -1, e );
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Ignore repeat invocations
+			if ( completed ) {
+				return;
+			}
+
+			completed = true;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				window.clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Determine if successful
+			isSuccess = status >= 200 && status < 300 || status === 304;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// Use a noop converter for missing script but not if jsonp
+			if ( !isSuccess &&
+				jQuery.inArray( "script", s.dataTypes ) > -1 &&
+				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
+				s.converters[ "text script" ] = function() {};
+			}
+
+			// Convert no matter what (that way responseXXX fields are always set)
+			response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+			// If successful, handle type chaining
+			if ( isSuccess ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+					modified = jqXHR.getResponseHeader( "Last-Modified" );
+					if ( modified ) {
+						jQuery.lastModified[ cacheURL ] = modified;
+					}
+					modified = jqXHR.getResponseHeader( "etag" );
+					if ( modified ) {
+						jQuery.etag[ cacheURL ] = modified;
+					}
+				}
+
+				// if no content
+				if ( status === 204 || s.type === "HEAD" ) {
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					statusText = response.state;
+					success = response.data;
+					error = response.error;
+					isSuccess = !error;
+				}
+			} else {
+
+				// Extract error from statusText and normalize for non-aborts
+				error = statusText;
+				if ( status || !statusText ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+					[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	}
+} );
+
+jQuery.each( [ "get", "post" ], function( _i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+
+		// Shift arguments if data argument was omitted
+		if ( isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		// The url can be an options object (which then must have .url)
+		return jQuery.ajax( jQuery.extend( {
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		}, jQuery.isPlainObject( url ) && url ) );
+	};
+} );
+
+jQuery.ajaxPrefilter( function( s ) {
+	var i;
+	for ( i in s.headers ) {
+		if ( i.toLowerCase() === "content-type" ) {
+			s.contentType = s.headers[ i ] || "";
+		}
+	}
+} );
+
+
+jQuery._evalUrl = function( url, options, doc ) {
+	return jQuery.ajax( {
+		url: url,
+
+		// Make this explicit, since user can override this through ajaxSetup (#11264)
+		type: "GET",
+		dataType: "script",
+		cache: true,
+		async: false,
+		global: false,
+
+		// Only evaluate the response if it is successful (gh-4126)
+		// dataFilter is not invoked for failure responses, so using it instead
+		// of the default converter is kludgy but it works.
+		converters: {
+			"text script": function() {}
+		},
+		dataFilter: function( response ) {
+			jQuery.globalEval( response, options, doc );
+		}
+	} );
+};
+
+
+jQuery.fn.extend( {
+	wrapAll: function( html ) {
+		var wrap;
+
+		if ( this[ 0 ] ) {
+			if ( isFunction( html ) ) {
+				html = html.call( this[ 0 ] );
+			}
+
+			// The elements to wrap the target around
+			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+			if ( this[ 0 ].parentNode ) {
+				wrap.insertBefore( this[ 0 ] );
+			}
+
+			wrap.map( function() {
+				var elem = this;
+
+				while ( elem.firstElementChild ) {
+					elem = elem.firstElementChild;
+				}
+
+				return elem;
+			} ).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( isFunction( html ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).wrapInner( html.call( this, i ) );
+			} );
+		}
+
+		return this.each( function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		} );
+	},
+
+	wrap: function( html ) {
+		var htmlIsFunction = isFunction( html );
+
+		return this.each( function( i ) {
+			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
+		} );
+	},
+
+	unwrap: function( selector ) {
+		this.parent( selector ).not( "body" ).each( function() {
+			jQuery( this ).replaceWith( this.childNodes );
+		} );
+		return this;
+	}
+} );
+
+
+jQuery.expr.pseudos.hidden = function( elem ) {
+	return !jQuery.expr.pseudos.visible( elem );
+};
+jQuery.expr.pseudos.visible = function( elem ) {
+	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
+};
+
+
+
+
+jQuery.ajaxSettings.xhr = function() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch ( e ) {}
+};
+
+var xhrSuccessStatus = {
+
+		// File protocol always yields status code 0, assume 200
+		0: 200,
+
+		// Support: IE <=9 only
+		// #1450: sometimes IE returns 1223 when it should be 204
+		1223: 204
+	},
+	xhrSupported = jQuery.ajaxSettings.xhr();
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport( function( options ) {
+	var callback, errorCallback;
+
+	// Cross domain only allowed if supported through XMLHttpRequest
+	if ( support.cors || xhrSupported && !options.crossDomain ) {
+		return {
+			send: function( headers, complete ) {
+				var i,
+					xhr = options.xhr();
+
+				xhr.open(
+					options.type,
+					options.url,
+					options.async,
+					options.username,
+					options.password
+				);
+
+				// Apply custom fields if provided
+				if ( options.xhrFields ) {
+					for ( i in options.xhrFields ) {
+						xhr[ i ] = options.xhrFields[ i ];
+					}
+				}
+
+				// Override mime type if needed
+				if ( options.mimeType && xhr.overrideMimeType ) {
+					xhr.overrideMimeType( options.mimeType );
+				}
+
+				// X-Requested-With header
+				// For cross-domain requests, seeing as conditions for a preflight are
+				// akin to a jigsaw puzzle, we simply never set it to be sure.
+				// (it can always be set on a per-request basis or even using ajaxSetup)
+				// For same-domain requests, won't change header if already provided.
+				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
+					headers[ "X-Requested-With" ] = "XMLHttpRequest";
+				}
+
+				// Set headers
+				for ( i in headers ) {
+					xhr.setRequestHeader( i, headers[ i ] );
+				}
+
+				// Callback
+				callback = function( type ) {
+					return function() {
+						if ( callback ) {
+							callback = errorCallback = xhr.onload =
+								xhr.onerror = xhr.onabort = xhr.ontimeout =
+									xhr.onreadystatechange = null;
+
+							if ( type === "abort" ) {
+								xhr.abort();
+							} else if ( type === "error" ) {
+
+								// Support: IE <=9 only
+								// On a manual native abort, IE9 throws
+								// errors on any property access that is not readyState
+								if ( typeof xhr.status !== "number" ) {
+									complete( 0, "error" );
+								} else {
+									complete(
+
+										// File: protocol always yields status 0; see #8605, #14207
+										xhr.status,
+										xhr.statusText
+									);
+								}
+							} else {
+								complete(
+									xhrSuccessStatus[ xhr.status ] || xhr.status,
+									xhr.statusText,
+
+									// Support: IE <=9 only
+									// IE9 has no XHR2 but throws on binary (trac-11426)
+									// For XHR2 non-text, let the caller handle it (gh-2498)
+									( xhr.responseType || "text" ) !== "text"  ||
+									typeof xhr.responseText !== "string" ?
+										{ binary: xhr.response } :
+										{ text: xhr.responseText },
+									xhr.getAllResponseHeaders()
+								);
+							}
+						}
+					};
+				};
+
+				// Listen to events
+				xhr.onload = callback();
+				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
+
+				// Support: IE 9 only
+				// Use onreadystatechange to replace onabort
+				// to handle uncaught aborts
+				if ( xhr.onabort !== undefined ) {
+					xhr.onabort = errorCallback;
+				} else {
+					xhr.onreadystatechange = function() {
+
+						// Check readyState before timeout as it changes
+						if ( xhr.readyState === 4 ) {
+
+							// Allow onerror to be called first,
+							// but that will not handle a native abort
+							// Also, save errorCallback to a variable
+							// as xhr.onerror cannot be accessed
+							window.setTimeout( function() {
+								if ( callback ) {
+									errorCallback();
+								}
+							} );
+						}
+					};
+				}
+
+				// Create the abort callback
+				callback = callback( "abort" );
+
+				try {
+
+					// Do send the request (this may raise an exception)
+					xhr.send( options.hasContent && options.data || null );
+				} catch ( e ) {
+
+					// #14683: Only rethrow if this hasn't been notified as an error yet
+					if ( callback ) {
+						throw e;
+					}
+				}
+			},
+
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
+jQuery.ajaxPrefilter( function( s ) {
+	if ( s.crossDomain ) {
+		s.contents.script = false;
+	}
+} );
+
+// Install script dataType
+jQuery.ajaxSetup( {
+	accepts: {
+		script: "text/javascript, application/javascript, " +
+			"application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /\b(?:java|ecma)script\b/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+} );
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+	}
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+
+	// This transport only deals with cross domain or forced-by-attrs requests
+	if ( s.crossDomain || s.scriptAttrs ) {
+		var script, callback;
+		return {
+			send: function( _, complete ) {
+				script = jQuery( "<script>" )
+					.attr( s.scriptAttrs || {} )
+					.prop( { charset: s.scriptCharset, src: s.url } )
+					.on( "load error", callback = function( evt ) {
+						script.remove();
+						callback = null;
+						if ( evt ) {
+							complete( evt.type === "error" ? 404 : 200, evt.type );
+						}
+					} );
+
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				document.head.appendChild( script[ 0 ] );
+			},
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup( {
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+} );
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" &&
+				( s.contentType || "" )
+					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+				rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters[ "script json" ] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// Force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always( function() {
+
+			// If previous value didn't exist - remove it
+			if ( overwritten === undefined ) {
+				jQuery( window ).removeProp( callbackName );
+
+			// Otherwise restore preexisting value
+			} else {
+				window[ callbackName ] = overwritten;
+			}
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+
+				// Make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// Save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		} );
+
+		// Delegate to script
+		return "script";
+	}
+} );
+
+
+
+
+// Support: Safari 8 only
+// In Safari 8 documents created via document.implementation.createHTMLDocument
+// collapse sibling forms: the second one becomes a child of the first one.
+// Because of that, this security measure has to be disabled in Safari 8.
+// https://bugs.webkit.org/show_bug.cgi?id=137337
+support.createHTMLDocument = ( function() {
+	var body = document.implementation.createHTMLDocument( "" ).body;
+	body.innerHTML = "<form></form><form></form>";
+	return body.childNodes.length === 2;
+} )();
+
+
+// Argument "data" should be string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+	if ( typeof data !== "string" ) {
+		return [];
+	}
+	if ( typeof context === "boolean" ) {
+		keepScripts = context;
+		context = false;
+	}
+
+	var base, parsed, scripts;
+
+	if ( !context ) {
+
+		// Stop scripts or inline event handlers from being executed immediately
+		// by using document.implementation
+		if ( support.createHTMLDocument ) {
+			context = document.implementation.createHTMLDocument( "" );
+
+			// Set the base href for the created document
+			// so any parsed elements with URLs
+			// are based on the document's URL (gh-2965)
+			base = context.createElement( "base" );
+			base.href = document.location.href;
+			context.head.appendChild( base );
+		} else {
+			context = document;
+		}
+	}
+
+	parsed = rsingleTag.exec( data );
+	scripts = !keepScripts && [];
+
+	// Single tag
+	if ( parsed ) {
+		return [ context.createElement( parsed[ 1 ] ) ];
+	}
+
+	parsed = buildFragment( [ data ], context, scripts );
+
+	if ( scripts && scripts.length ) {
+		jQuery( scripts ).remove();
+	}
+
+	return jQuery.merge( [], parsed.childNodes );
+};
+
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+	var selector, type, response,
+		self = this,
+		off = url.indexOf( " " );
+
+	if ( off > -1 ) {
+		selector = stripAndCollapse( url.slice( off ) );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax( {
+			url: url,
+
+			// If "type" variable is undefined, then "GET" method will be used.
+			// Make value of this field explicit since
+			// user can override it through ajaxSetup method
+			type: type || "GET",
+			dataType: "html",
+			data: params
+		} ).done( function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		// If the request succeeds, this function gets "data", "status", "jqXHR"
+		// but they are ignored because response was set above.
+		// If it fails, this function gets "jqXHR", "status", "error"
+		} ).always( callback && function( jqXHR, status ) {
+			self.each( function() {
+				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+			} );
+		} );
+	}
+
+	return this;
+};
+
+
+
+
+jQuery.expr.pseudos.animated = function( elem ) {
+	return jQuery.grep( jQuery.timers, function( fn ) {
+		return elem === fn.elem;
+	} ).length;
+};
+
+
+
+
+jQuery.offset = {
+	setOffset: function( elem, options, i ) {
+		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+			position = jQuery.css( elem, "position" ),
+			curElem = jQuery( elem ),
+			props = {};
+
+		// Set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		curOffset = curElem.offset();
+		curCSSTop = jQuery.css( elem, "top" );
+		curCSSLeft = jQuery.css( elem, "left" );
+		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
+
+		// Need to be able to calculate position if either
+		// top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( isFunction( options ) ) {
+
+			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+jQuery.fn.extend( {
+
+	// offset() relates an element's border box to the document origin
+	offset: function( options ) {
+
+		// Preserve chaining for setter
+		if ( arguments.length ) {
+			return options === undefined ?
+				this :
+				this.each( function( i ) {
+					jQuery.offset.setOffset( this, options, i );
+				} );
+		}
+
+		var rect, win,
+			elem = this[ 0 ];
+
+		if ( !elem ) {
+			return;
+		}
+
+		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+		// Support: IE <=11 only
+		// Running getBoundingClientRect on a
+		// disconnected node in IE throws an error
+		if ( !elem.getClientRects().length ) {
+			return { top: 0, left: 0 };
+		}
+
+		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
+		rect = elem.getBoundingClientRect();
+		win = elem.ownerDocument.defaultView;
+		return {
+			top: rect.top + win.pageYOffset,
+			left: rect.left + win.pageXOffset
+		};
+	},
+
+	// position() relates an element's margin box to its offset parent's padding box
+	// This corresponds to the behavior of CSS absolute positioning
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset, doc,
+			elem = this[ 0 ],
+			parentOffset = { top: 0, left: 0 };
+
+		// position:fixed elements are offset from the viewport, which itself always has zero offset
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+			// Assume position:fixed implies availability of getBoundingClientRect
+			offset = elem.getBoundingClientRect();
+
+		} else {
+			offset = this.offset();
+
+			// Account for the *real* offset parent, which can be the document or its root element
+			// when a statically positioned element is identified
+			doc = elem.ownerDocument;
+			offsetParent = elem.offsetParent || doc.documentElement;
+			while ( offsetParent &&
+				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
+				jQuery.css( offsetParent, "position" ) === "static" ) {
+
+				offsetParent = offsetParent.parentNode;
+			}
+			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
+
+				// Incorporate borders into its offset, since they are outside its content origin
+				parentOffset = jQuery( offsetParent ).offset();
+				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
+				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
+			}
+		}
+
+		// Subtract parent offsets and element margins
+		return {
+			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+		};
+	},
+
+	// This method will return documentElement in the following cases:
+	// 1) For the element inside the iframe without offsetParent, this method will return
+	//    documentElement of the parent window
+	// 2) For the hidden or detached element
+	// 3) For body or html element, i.e. in case of the html node - it will return itself
+	//
+	// but those exceptions were never presented as a real life use-cases
+	// and might be considered as more preferable results.
+	//
+	// This logic, however, is not guaranteed and can change at any point in the future
+	offsetParent: function() {
+		return this.map( function() {
+			var offsetParent = this.offsetParent;
+
+			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+
+			return offsetParent || documentElement;
+		} );
+	}
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+	var top = "pageYOffset" === prop;
+
+	jQuery.fn[ method ] = function( val ) {
+		return access( this, function( elem, method, val ) {
+
+			// Coalesce documents and windows
+			var win;
+			if ( isWindow( elem ) ) {
+				win = elem;
+			} else if ( elem.nodeType === 9 ) {
+				win = elem.defaultView;
+			}
+
+			if ( val === undefined ) {
+				return win ? win[ prop ] : elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : win.pageXOffset,
+					top ? val : win.pageYOffset
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length );
+	};
+} );
+
+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( _i, prop ) {
+	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+		function( elem, computed ) {
+			if ( computed ) {
+				computed = curCSS( elem, prop );
+
+				// If curCSS returns percentage, fallback to offset
+				return rnumnonpx.test( computed ) ?
+					jQuery( elem ).position()[ prop ] + "px" :
+					computed;
+			}
+		}
+	);
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( {
+		padding: "inner" + name,
+		content: type,
+		"": "outer" + name
+	}, function( defaultExtra, funcName ) {
+
+		// Margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( isWindow( elem ) ) {
+
+					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+					return funcName.indexOf( "outer" ) === 0 ?
+						elem[ "inner" + name ] :
+						elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+					// whichever is greatest
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable );
+		};
+	} );
+} );
+
+
+jQuery.each( [
+	"ajaxStart",
+	"ajaxStop",
+	"ajaxComplete",
+	"ajaxError",
+	"ajaxSuccess",
+	"ajaxSend"
+], function( _i, type ) {
+	jQuery.fn[ type ] = function( fn ) {
+		return this.on( type, fn );
+	};
+} );
+
+
+
+
+jQuery.fn.extend( {
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ?
+			this.off( selector, "**" ) :
+			this.off( types, selector || "**", fn );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+} );
+
+jQuery.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( _i, name ) {
+
+		// Handle event binding
+		jQuery.fn[ name ] = function( data, fn ) {
+			return arguments.length > 0 ?
+				this.on( name, null, data, fn ) :
+				this.trigger( name );
+		};
+	}
+);
+
+
+
+
+// Support: Android <=4.0 only
+// Make sure we trim BOM and NBSP
+var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+// Bind a function to a context, optionally partially applying any
+// arguments.
+// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
+// However, it is not slated for removal any time soon
+jQuery.proxy = function( fn, context ) {
+	var tmp, args, proxy;
+
+	if ( typeof context === "string" ) {
+		tmp = fn[ context ];
+		context = fn;
+		fn = tmp;
+	}
+
+	// Quick check to determine if target is callable, in the spec
+	// this throws a TypeError, but we will just return undefined.
+	if ( !isFunction( fn ) ) {
+		return undefined;
+	}
+
+	// Simulated bind
+	args = slice.call( arguments, 2 );
+	proxy = function() {
+		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+	};
+
+	// Set the guid of unique handler to the same of original handler, so it can be removed
+	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+	return proxy;
+};
+
+jQuery.holdReady = function( hold ) {
+	if ( hold ) {
+		jQuery.readyWait++;
+	} else {
+		jQuery.ready( true );
+	}
+};
+jQuery.isArray = Array.isArray;
+jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
+jQuery.isFunction = isFunction;
+jQuery.isWindow = isWindow;
+jQuery.camelCase = camelCase;
+jQuery.type = toType;
+
+jQuery.now = Date.now;
+
+jQuery.isNumeric = function( obj ) {
+
+	// As of jQuery 3.0, isNumeric is limited to
+	// strings and numbers (primitives or objects)
+	// that can be coerced to finite numbers (gh-2662)
+	var type = jQuery.type( obj );
+	return ( type === "number" || type === "string" ) &&
+
+		// parseFloat NaNs numeric-cast false positives ("")
+		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+		// subtraction forces infinities to NaN
+		!isNaN( obj - parseFloat( obj ) );
+};
+
+jQuery.trim = function( text ) {
+	return text == null ?
+		"" :
+		( text + "" ).replace( rtrim, "" );
+};
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+	define( "jquery", [], function() {
+		return jQuery;
+	} );
+}
+
+
+
+
+var
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+	if ( window.$ === jQuery ) {
+		window.$ = _$;
+	}
+
+	if ( deep && window.jQuery === jQuery ) {
+		window.jQuery = _jQuery;
+	}
+
+	return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === "undefined" ) {
+	window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+} );
+(function($, undefined) {
+
+/**
+ * Unobtrusive scripting adapter for jQuery
+ * https://github.com/rails/jquery-ujs
+ *
+ * Requires jQuery 1.8.0 or later.
+ *
+ * Released under the MIT license
+ *
+ */
+
+  // Cut down on the number of issues from people inadvertently including jquery_ujs twice
+  // by detecting and raising an error when it happens.
+  'use strict';
+
+  if ( $.rails !== undefined ) {
+    $.error('jquery-ujs has already been loaded!');
+  }
+
+  // Shorthand to make it a little easier to call public rails functions from within rails.js
+  var rails;
+  var $document = $(document);
+
+  $.rails = rails = {
+    // Link elements bound by jquery-ujs
+    linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote]:not([disabled]), a[data-disable-with], a[data-disable]',
+
+    // Button elements bound by jquery-ujs
+    buttonClickSelector: 'button[data-remote]:not([form]):not(form button), button[data-confirm]:not([form]):not(form button)',
+
+    // Select elements bound by jquery-ujs
+    inputChangeSelector: 'select[data-remote], input[data-remote], textarea[data-remote]',
+
+    // Form elements bound by jquery-ujs
+    formSubmitSelector: 'form',
+
+    // Form input elements bound by jquery-ujs
+    formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type]), input[type=submit][form], input[type=image][form], button[type=submit][form], button[form]:not([type])',
+
+    // Form input elements disabled during form submission
+    disableSelector: 'input[data-disable-with]:enabled, button[data-disable-with]:enabled, textarea[data-disable-with]:enabled, input[data-disable]:enabled, button[data-disable]:enabled, textarea[data-disable]:enabled',
+
+    // Form input elements re-enabled after form submission
+    enableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled, input[data-disable]:disabled, button[data-disable]:disabled, textarea[data-disable]:disabled',
+
+    // Form required input elements
+    requiredInputSelector: 'input[name][required]:not([disabled]), textarea[name][required]:not([disabled])',
+
+    // Form file input elements
+    fileInputSelector: 'input[name][type=file]:not([disabled])',
+
+    // Link onClick disable selector with possible reenable after remote submission
+    linkDisableSelector: 'a[data-disable-with], a[data-disable]',
+
+    // Button onClick disable selector with possible reenable after remote submission
+    buttonDisableSelector: 'button[data-remote][data-disable-with], button[data-remote][data-disable]',
+
+    // Up-to-date Cross-Site Request Forgery token
+    csrfToken: function() {
+     return $('meta[name=csrf-token]').attr('content');
+    },
+
+    // URL param that must contain the CSRF token
+    csrfParam: function() {
+     return $('meta[name=csrf-param]').attr('content');
+    },
+
+    // Make sure that every Ajax request sends the CSRF token
+    CSRFProtection: function(xhr) {
+      var token = rails.csrfToken();
+      if (token) xhr.setRequestHeader('X-CSRF-Token', token);
+    },
+
+    // Make sure that all forms have actual up-to-date tokens (cached forms contain old ones)
+    refreshCSRFTokens: function(){
+      $('form input[name="' + rails.csrfParam() + '"]').val(rails.csrfToken());
+    },
+
+    // Triggers an event on an element and returns false if the event result is false
+    fire: function(obj, name, data) {
+      var event = $.Event(name);
+      obj.trigger(event, data);
+      return event.result !== false;
+    },
+
+    // Default confirm dialog, may be overridden with custom confirm dialog in $.rails.confirm
+    confirm: function(message) {
+      return confirm(message);
+    },
+
+    // Default ajax function, may be overridden with custom function in $.rails.ajax
+    ajax: function(options) {
+      return $.ajax(options);
+    },
+
+    // Default way to get an element's href. May be overridden at $.rails.href.
+    href: function(element) {
+      return element[0].href;
+    },
+
+    // Checks "data-remote" if true to handle the request through a XHR request.
+    isRemote: function(element) {
+      return element.data('remote') !== undefined && element.data('remote') !== false;
+    },
+
+    // Submits "remote" forms and links with ajax
+    handleRemote: function(element) {
+      var method, url, data, withCredentials, dataType, options;
+
+      if (rails.fire(element, 'ajax:before')) {
+        withCredentials = element.data('with-credentials') || null;
+        dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);
+
+        if (element.is('form')) {
+          method = element.data('ujs:submit-button-formmethod') || element.attr('method');
+          url = element.data('ujs:submit-button-formaction') || element.attr('action');
+          data = $(element[0]).serializeArray();
+          // memoized value from clicked submit button
+          var button = element.data('ujs:submit-button');
+          if (button) {
+            data.push(button);
+            element.data('ujs:submit-button', null);
+          }
+          element.data('ujs:submit-button-formmethod', null);
+          element.data('ujs:submit-button-formaction', null);
+        } else if (element.is(rails.inputChangeSelector)) {
+          method = element.data('method');
+          url = element.data('url');
+          data = element.serialize();
+          if (element.data('params')) data = data + '&' + element.data('params');
+        } else if (element.is(rails.buttonClickSelector)) {
+          method = element.data('method') || 'get';
+          url = element.data('url');
+          data = element.serialize();
+          if (element.data('params')) data = data + '&' + element.data('params');
+        } else {
+          method = element.data('method');
+          url = rails.href(element);
+          data = element.data('params') || null;
+        }
+
+        options = {
+          type: method || 'GET', data: data, dataType: dataType,
+          // stopping the "ajax:beforeSend" event will cancel the ajax request
+          beforeSend: function(xhr, settings) {
+            if (settings.dataType === undefined) {
+              xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
+            }
+            if (rails.fire(element, 'ajax:beforeSend', [xhr, settings])) {
+              element.trigger('ajax:send', xhr);
+            } else {
+              return false;
+            }
+          },
+          success: function(data, status, xhr) {
+            element.trigger('ajax:success', [data, status, xhr]);
+          },
+          complete: function(xhr, status) {
+            element.trigger('ajax:complete', [xhr, status]);
+          },
+          error: function(xhr, status, error) {
+            element.trigger('ajax:error', [xhr, status, error]);
+          },
+          crossDomain: rails.isCrossDomain(url)
+        };
+
+        // There is no withCredentials for IE6-8 when
+        // "Enable native XMLHTTP support" is disabled
+        if (withCredentials) {
+          options.xhrFields = {
+            withCredentials: withCredentials
+          };
+        }
+
+        // Only pass url to `ajax` options if not blank
+        if (url) { options.url = url; }
+
+        return rails.ajax(options);
+      } else {
+        return false;
+      }
+    },
+
+    // Determines if the request is a cross domain request.
+    isCrossDomain: function(url) {
+      var originAnchor = document.createElement('a');
+      originAnchor.href = location.href;
+      var urlAnchor = document.createElement('a');
+
+      try {
+        urlAnchor.href = url;
+        // This is a workaround to a IE bug.
+        urlAnchor.href = urlAnchor.href;
+
+        // If URL protocol is false or is a string containing a single colon
+        // *and* host are false, assume it is not a cross-domain request
+        // (should only be the case for IE7 and IE compatibility mode).
+        // Otherwise, evaluate protocol and host of the URL against the origin
+        // protocol and host.
+        return !(((!urlAnchor.protocol || urlAnchor.protocol === ':') && !urlAnchor.host) ||
+          (originAnchor.protocol + '//' + originAnchor.host ===
+            urlAnchor.protocol + '//' + urlAnchor.host));
+      } catch (e) {
+        // If there is an error parsing the URL, assume it is crossDomain.
+        return true;
+      }
+    },
+
+    // Handles "data-method" on links such as:
+    // <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>
+    handleMethod: function(link) {
+      var href = rails.href(link),
+        method = link.data('method'),
+        target = link.attr('target'),
+        csrfToken = rails.csrfToken(),
+        csrfParam = rails.csrfParam(),
+        form = $('<form method="post" action="' + href + '"></form>'),
+        metadataInput = '<input name="_method" value="' + method + '" type="hidden" />';
+
+      if (csrfParam !== undefined && csrfToken !== undefined && !rails.isCrossDomain(href)) {
+        metadataInput += '<input name="' + csrfParam + '" value="' + csrfToken + '" type="hidden" />';
+      }
+
+      if (target) { form.attr('target', target); }
+
+      form.hide().append(metadataInput).appendTo('body');
+      form.submit();
+    },
+
+    // Helper function that returns form elements that match the specified CSS selector
+    // If form is actually a "form" element this will return associated elements outside the from that have
+    // the html form attribute set
+    formElements: function(form, selector) {
+      return form.is('form') ? $(form[0].elements).filter(selector) : form.find(selector);
+    },
+
+    /* Disables form elements:
+      - Caches element value in 'ujs:enable-with' data store
+      - Replaces element text with value of 'data-disable-with' attribute
+      - Sets disabled property to true
+    */
+    disableFormElements: function(form) {
+      rails.formElements(form, rails.disableSelector).each(function() {
+        rails.disableFormElement($(this));
+      });
+    },
+
+    disableFormElement: function(element) {
+      var method, replacement;
+
+      method = element.is('button') ? 'html' : 'val';
+      replacement = element.data('disable-with');
+
+      if (replacement !== undefined) {
+        element.data('ujs:enable-with', element[method]());
+        element[method](replacement);
+      }
+
+      element.prop('disabled', true);
+      element.data('ujs:disabled', true);
+    },
+
+    /* Re-enables disabled form elements:
+      - Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`)
+      - Sets disabled property to false
+    */
+    enableFormElements: function(form) {
+      rails.formElements(form, rails.enableSelector).each(function() {
+        rails.enableFormElement($(this));
+      });
+    },
+
+    enableFormElement: function(element) {
+      var method = element.is('button') ? 'html' : 'val';
+      if (element.data('ujs:enable-with') !== undefined) {
+        element[method](element.data('ujs:enable-with'));
+        element.removeData('ujs:enable-with'); // clean up cache
+      }
+      element.prop('disabled', false);
+      element.removeData('ujs:disabled');
+    },
+
+   /* For 'data-confirm' attribute:
+      - Fires `confirm` event
+      - Shows the confirmation dialog
+      - Fires the `confirm:complete` event
+
+      Returns `true` if no function stops the chain and user chose yes; `false` otherwise.
+      Attaching a handler to the element's `confirm` event that returns a `falsy` value cancels the confirmation dialog.
+      Attaching a handler to the element's `confirm:complete` event that returns a `falsy` value makes this function
+      return false. The `confirm:complete` event is fired whether or not the user answered true or false to the dialog.
+   */
+    allowAction: function(element) {
+      var message = element.data('confirm'),
+          answer = false, callback;
+      if (!message) { return true; }
+
+      if (rails.fire(element, 'confirm')) {
+        try {
+          answer = rails.confirm(message);
+        } catch (e) {
+          (console.error || console.log).call(console, e.stack || e);
+        }
+        callback = rails.fire(element, 'confirm:complete', [answer]);
+      }
+      return answer && callback;
+    },
+
+    // Helper function which checks for blank inputs in a form that match the specified CSS selector
+    blankInputs: function(form, specifiedSelector, nonBlank) {
+      var foundInputs = $(),
+        input,
+        valueToCheck,
+        radiosForNameWithNoneSelected,
+        radioName,
+        selector = specifiedSelector || 'input,textarea',
+        requiredInputs = form.find(selector),
+        checkedRadioButtonNames = {};
+
+      requiredInputs.each(function() {
+        input = $(this);
+        if (input.is('input[type=radio]')) {
+
+          // Don't count unchecked required radio as blank if other radio with same name is checked,
+          // regardless of whether same-name radio input has required attribute or not. The spec
+          // states https://www.w3.org/TR/html5/forms.html#the-required-attribute
+          radioName = input.attr('name');
+
+          // Skip if we've already seen the radio with this name.
+          if (!checkedRadioButtonNames[radioName]) {
+
+            // If none checked
+            if (form.find('input[type=radio]:checked[name="' + radioName + '"]').length === 0) {
+              radiosForNameWithNoneSelected = form.find(
+                'input[type=radio][name="' + radioName + '"]');
+              foundInputs = foundInputs.add(radiosForNameWithNoneSelected);
+            }
+
+            // We only need to check each name once.
+            checkedRadioButtonNames[radioName] = radioName;
+          }
+        } else {
+          valueToCheck = input.is('input[type=checkbox],input[type=radio]') ? input.is(':checked') : !!input.val();
+          if (valueToCheck === nonBlank) {
+            foundInputs = foundInputs.add(input);
+          }
+        }
+      });
+      return foundInputs.length ? foundInputs : false;
+    },
+
+    // Helper function which checks for non-blank inputs in a form that match the specified CSS selector
+    nonBlankInputs: function(form, specifiedSelector) {
+      return rails.blankInputs(form, specifiedSelector, true); // true specifies nonBlank
+    },
+
+    // Helper function, needed to provide consistent behavior in IE
+    stopEverything: function(e) {
+      $(e.target).trigger('ujs:everythingStopped');
+      e.stopImmediatePropagation();
+      return false;
+    },
+
+    //  Replace element's html with the 'data-disable-with' after storing original html
+    //  and prevent clicking on it
+    disableElement: function(element) {
+      var replacement = element.data('disable-with');
+
+      if (replacement !== undefined) {
+        element.data('ujs:enable-with', element.html()); // store enabled state
+        element.html(replacement);
+      }
+
+      element.bind('click.railsDisable', function(e) { // prevent further clicking
+        return rails.stopEverything(e);
+      });
+      element.data('ujs:disabled', true);
+    },
+
+    // Restore element to its original state which was disabled by 'disableElement' above
+    enableElement: function(element) {
+      if (element.data('ujs:enable-with') !== undefined) {
+        element.html(element.data('ujs:enable-with')); // set to old enabled state
+        element.removeData('ujs:enable-with'); // clean up cache
+      }
+      element.unbind('click.railsDisable'); // enable element
+      element.removeData('ujs:disabled');
+    }
+  };
+
+  if (rails.fire($document, 'rails:attachBindings')) {
+
+    $.ajaxPrefilter(function(options, originalOptions, xhr){ if ( !options.crossDomain ) { rails.CSRFProtection(xhr); }});
+
+    // This event works the same as the load event, except that it fires every
+    // time the page is loaded.
+    //
+    // See https://github.com/rails/jquery-ujs/issues/357
+    // See https://developer.mozilla.org/en-US/docs/Using_Firefox_1.5_caching
+    $(window).on('pageshow.rails', function () {
+      $($.rails.enableSelector).each(function () {
+        var element = $(this);
+
+        if (element.data('ujs:disabled')) {
+          $.rails.enableFormElement(element);
+        }
+      });
+
+      $($.rails.linkDisableSelector).each(function () {
+        var element = $(this);
+
+        if (element.data('ujs:disabled')) {
+          $.rails.enableElement(element);
+        }
+      });
+    });
+
+    $document.on('ajax:complete', rails.linkDisableSelector, function() {
+        rails.enableElement($(this));
+    });
+
+    $document.on('ajax:complete', rails.buttonDisableSelector, function() {
+        rails.enableFormElement($(this));
+    });
+
+    $document.on('click.rails', rails.linkClickSelector, function(e) {
+      var link = $(this), method = link.data('method'), data = link.data('params'), metaClick = e.metaKey || e.ctrlKey;
+      if (!rails.allowAction(link)) return rails.stopEverything(e);
+
+      if (!metaClick && link.is(rails.linkDisableSelector)) rails.disableElement(link);
+
+      if (rails.isRemote(link)) {
+        if (metaClick && (!method || method === 'GET') && !data) { return true; }
+
+        var handleRemote = rails.handleRemote(link);
+        // Response from rails.handleRemote() will either be false or a deferred object promise.
+        if (handleRemote === false) {
+          rails.enableElement(link);
+        } else {
+          handleRemote.fail( function() { rails.enableElement(link); } );
+        }
+        return false;
+
+      } else if (method) {
+        rails.handleMethod(link);
+        return false;
+      }
+    });
+
+    $document.on('click.rails', rails.buttonClickSelector, function(e) {
+      var button = $(this);
+
+      if (!rails.allowAction(button) || !rails.isRemote(button)) return rails.stopEverything(e);
+
+      if (button.is(rails.buttonDisableSelector)) rails.disableFormElement(button);
+
+      var handleRemote = rails.handleRemote(button);
+      // Response from rails.handleRemote() will either be false or a deferred object promise.
+      if (handleRemote === false) {
+        rails.enableFormElement(button);
+      } else {
+        handleRemote.fail( function() { rails.enableFormElement(button); } );
+      }
+      return false;
+    });
+
+    $document.on('change.rails', rails.inputChangeSelector, function(e) {
+      var link = $(this);
+      if (!rails.allowAction(link) || !rails.isRemote(link)) return rails.stopEverything(e);
+
+      rails.handleRemote(link);
+      return false;
+    });
+
+    $document.on('submit.rails', rails.formSubmitSelector, function(e) {
+      var form = $(this),
+        remote = rails.isRemote(form),
+        blankRequiredInputs,
+        nonBlankFileInputs;
+
+      if (!rails.allowAction(form)) return rails.stopEverything(e);
+
+      // Skip other logic when required values are missing or file upload is present
+      if (form.attr('novalidate') === undefined) {
+        if (form.data('ujs:formnovalidate-button') === undefined) {
+          blankRequiredInputs = rails.blankInputs(form, rails.requiredInputSelector, false);
+          if (blankRequiredInputs && rails.fire(form, 'ajax:aborted:required', [blankRequiredInputs])) {
+            return rails.stopEverything(e);
+          }
+        } else {
+          // Clear the formnovalidate in case the next button click is not on a formnovalidate button
+          // Not strictly necessary to do here, since it is also reset on each button click, but just to be certain
+          form.data('ujs:formnovalidate-button', undefined);
+        }
+      }
+
+      if (remote) {
+        nonBlankFileInputs = rails.nonBlankInputs(form, rails.fileInputSelector);
+        if (nonBlankFileInputs) {
+          // Slight timeout so that the submit button gets properly serialized
+          // (make it easy for event handler to serialize form without disabled values)
+          setTimeout(function(){ rails.disableFormElements(form); }, 13);
+          var aborted = rails.fire(form, 'ajax:aborted:file', [nonBlankFileInputs]);
+
+          // Re-enable form elements if event bindings return false (canceling normal form submission)
+          if (!aborted) { setTimeout(function(){ rails.enableFormElements(form); }, 13); }
+
+          return aborted;
+        }
+
+        rails.handleRemote(form);
+        return false;
+
+      } else {
+        // Slight timeout so that the submit button gets properly serialized
+        setTimeout(function(){ rails.disableFormElements(form); }, 13);
+      }
+    });
+
+    $document.on('click.rails', rails.formInputClickSelector, function(event) {
+      var button = $(this);
+
+      if (!rails.allowAction(button)) return rails.stopEverything(event);
+
+      // Register the pressed submit button
+      var name = button.attr('name'),
+        data = name ? {name:name, value:button.val()} : null;
+
+      var form = button.closest('form');
+      if (form.length === 0) {
+        form = $('#' + button.attr('form'));
+      }
+      form.data('ujs:submit-button', data);
+
+      // Save attributes from button
+      form.data('ujs:formnovalidate-button', button.attr('formnovalidate'));
+      form.data('ujs:submit-button-formaction', button.attr('formaction'));
+      form.data('ujs:submit-button-formmethod', button.attr('formmethod'));
+    });
+
+    $document.on('ajax:send.rails', rails.formSubmitSelector, function(event) {
+      if (this === event.target) rails.disableFormElements($(this));
+    });
+
+    $document.on('ajax:complete.rails', rails.formSubmitSelector, function(event) {
+      if (this === event.target) rails.enableFormElements($(this));
+    });
+
+    $(function(){
+      rails.refreshCSRFTokens();
+    });
+  }
+
+})( jQuery );
+/**
+*
+* jquery.sparkline.js
+*
+* v2.1.3
+* (c) Splunk, Inc
+* Contact: Gareth Watts (gareth@splunk.com)
+* http://omnipotent.net/jquery.sparkline/
+*
+* Generates inline sparkline charts from data supplied either to the method
+* or inline in HTML
+*
+* Compatible with Internet Explorer 6.0+ and modern browsers equipped with the canvas tag
+* (Firefox 2.0+, Safari, Opera, etc)
+*
+* License: New BSD License
+*
+* Copyright (c) 2012, Splunk Inc.
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification,
+* are permitted provided that the following conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright notice,
+*       this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright notice,
+*       this list of conditions and the following disclaimer in the documentation
+*       and/or other materials provided with the distribution.
+*     * Neither the name of Splunk Inc nor the names of its contributors may
+*       be used to endorse or promote products derived from this software without
+*       specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*
+* Usage:
+*  $(selector).sparkline(values, options)
+*
+* If values is undefined or set to 'html' then the data values are read from the specified tag:
+*   <p>Sparkline: <span class="sparkline">1,4,6,6,8,5,3,5</span></p>
+*   $('.sparkline').sparkline();
+* There must be no spaces in the enclosed data set
+*
+* Otherwise values must be an array of numbers or null values
+*    <p>Sparkline: <span id="sparkline1">This text replaced if the browser is compatible</span></p>
+*    $('#sparkline1').sparkline([1,4,6,6,8,5,3,5])
+*    $('#sparkline2').sparkline([1,4,6,null,null,5,3,5])
+*
+* Values can also be specified in an HTML comment, or as a values attribute:
+*    <p>Sparkline: <span class="sparkline"><!--1,4,6,6,8,5,3,5 --></span></p>
+*    <p>Sparkline: <span class="sparkline" values="1,4,6,6,8,5,3,5"></span></p>
+*    $('.sparkline').sparkline();
+*
+* For line charts, x values can also be specified:
+*   <p>Sparkline: <span class="sparkline">1:1,2.7:4,3.4:6,5:6,6:8,8.7:5,9:3,10:5</span></p>
+*    $('#sparkline1').sparkline([ [1,1], [2.7,4], [3.4,6], [5,6], [6,8], [8.7,5], [9,3], [10,5] ])
+*
+* By default, options should be passed in as the second argument to the sparkline function:
+*   $('.sparkline').sparkline([1,2,3,4], {type: 'bar'})
+*
+* Options can also be set by passing them on the tag itself.  This feature is disabled by default though
+* as there's a slight performance overhead:
+*   $('.sparkline').sparkline([1,2,3,4], {enableTagOptions: true})
+*   <p>Sparkline: <span class="sparkline" sparkType="bar" sparkBarColor="red">loading</span></p>
+* Prefix all options supplied as tag attribute with "spark" (configurable by setting tagOptionsPrefix)
+*
+* Supported options:
+*   lineColor - Color of the line used for the chart
+*   fillColor - Color used to fill in the chart - Set to '' or false for a transparent chart
+*   width - Width of the chart - Defaults to 3 times the number of values in pixels
+*   height - Height of the chart - Defaults to the height of the containing element
+*   chartRangeMin - Specify the minimum value to use for the Y range of the chart - Defaults to the minimum value supplied
+*   chartRangeMax - Specify the maximum value to use for the Y range of the chart - Defaults to the maximum value supplied
+*   chartRangeClip - Clip out of range values to the max/min specified by chartRangeMin and chartRangeMax
+*   chartRangeMinX - Specify the minimum value to use for the X range of the chart - Defaults to the minimum value supplied
+*   chartRangeMaxX - Specify the maximum value to use for the X range of the chart - Defaults to the maximum value supplied
+*   composite - If true then don't erase any existing chart attached to the tag, but draw
+*           another chart over the top - Note that width and height are ignored if an
+*           existing chart is detected.
+*   tagValuesAttribute - Name of tag attribute to check for data values - Defaults to 'values'
+*   enableTagOptions - Whether to check tags for sparkline options
+*   tagOptionsPrefix - Prefix used for options supplied as tag attributes - Defaults to 'spark'
+*   disableHiddenCheck - If set to true, then the plugin will assume that charts will never be drawn into a
+*           hidden dom element, avoding a browser reflow
+*   disableInteraction - If set to true then all mouseover/click interaction behaviour will be disabled,
+*       making the plugin perform much like it did in 1.x
+*   disableTooltips - If set to true then tooltips will be disabled - Defaults to false (tooltips enabled)
+*   disableHighlight - If set to true then highlighting of selected chart elements on mouseover will be disabled
+*       defaults to false (highlights enabled)
+*   highlightLighten - Factor to lighten/darken highlighted chart values by - Defaults to 1.4 for a 40% increase
+*   tooltipContainer - Specify which DOM element the tooltip should be rendered into - defaults to document.body
+*   tooltipClassname - Optional CSS classname to apply to tooltips - If not specified then a default style will be applied
+*   tooltipOffsetX - How many pixels away from the mouse pointer to render the tooltip on the X axis
+*   tooltipOffsetY - How many pixels away from the mouse pointer to render the tooltip on the r axis
+*   tooltipFormatter  - Optional callback that allows you to override the HTML displayed in the tooltip
+*       callback is given arguments of (sparkline, options, fields)
+*   tooltipChartTitle - If specified then the tooltip uses the string specified by this setting as a title
+*   tooltipFormat - A format string or SPFormat object  (or an array thereof for multiple entries)
+*       to control the format of the tooltip
+*   tooltipPrefix - A string to prepend to each field displayed in a tooltip
+*   tooltipSuffix - A string to append to each field displayed in a tooltip
+*   tooltipSkipNull - If true then null values will not have a tooltip displayed (defaults to true)
+*   tooltipValueLookups - An object or range map to map field values to tooltip strings
+*       (eg. to map -1 to "Lost", 0 to "Draw", and 1 to "Win")
+*   numberFormatter - Optional callback for formatting numbers in tooltips
+*   numberDigitGroupSep - Character to use for group separator in numbers "1,234" - Defaults to ","
+*   numberDecimalMark - Character to use for the decimal point when formatting numbers - Defaults to "."
+*   numberDigitGroupCount - Number of digits between group separator - Defaults to 3
+*
+* There are 7 types of sparkline, selected by supplying a "type" option of 'line' (default),
+* 'bar', 'tristate', 'bullet', 'discrete', 'pie' or 'box'
+*    line - Line chart.  Options:
+*       spotColor - Set to '' to not end each line in a circular spot
+*       minSpotColor - If set, color of spot at minimum value
+*       maxSpotColor - If set, color of spot at maximum value
+*       spotRadius - Radius in pixels
+*       lineWidth - Width of line in pixels
+*       normalRangeMin
+*       normalRangeMax - If set draws a filled horizontal bar between these two values marking the "normal"
+*                      or expected range of values
+*       normalRangeColor - Color to use for the above bar
+*       drawNormalOnTop - Draw the normal range above the chart fill color if true
+*       defaultPixelsPerValue - Defaults to 3 pixels of width for each value in the chart
+*       highlightSpotColor - The color to use for drawing a highlight spot on mouseover - Set to null to disable
+*       highlightLineColor - The color to use for drawing a highlight line on mouseover - Set to null to disable
+*       valueSpots - Specify which points to draw spots on, and in which color.  Accepts a range map
+*
+*   bar - Bar chart.  Options:
+*       barColor - Color of bars for postive values
+*       negBarColor - Color of bars for negative values
+*       zeroColor - Color of bars with zero values
+*       nullColor - Color of bars with null values - Defaults to omitting the bar entirely
+*       barWidth - Width of bars in pixels
+*       colorMap - Optional mappnig of values to colors to override the *BarColor values above
+*                  can be an Array of values to control the color of individual bars or a range map
+*                  to specify colors for individual ranges of values
+*       barSpacing - Gap between bars in pixels
+*       zeroAxis - Centers the y-axis around zero if true
+*
+*   tristate - Charts values of win (>0), lose (<0) or draw (=0)
+*       posBarColor - Color of win values
+*       negBarColor - Color of lose values
+*       zeroBarColor - Color of draw values
+*       barWidth - Width of bars in pixels
+*       barSpacing - Gap between bars in pixels
+*       colorMap - Optional mappnig of values to colors to override the *BarColor values above
+*                  can be an Array of values to control the color of individual bars or a range map
+*                  to specify colors for individual ranges of values
+*
+*   discrete - Options:
+*       lineHeight - Height of each line in pixels - Defaults to 30% of the graph height
+*       thesholdValue - Values less than this value will be drawn using thresholdColor instead of lineColor
+*       thresholdColor
+*
+*   bullet - Values for bullet graphs msut be in the order: target, performance, range1, range2, range3, ...
+*       options:
+*       targetColor - The color of the vertical target marker
+*       targetWidth - The width of the target marker in pixels
+*       performanceColor - The color of the performance measure horizontal bar
+*       rangeColors - Colors to use for each qualitative range background color
+*
+*   pie - Pie chart. Options:
+*       sliceColors - An array of colors to use for pie slices
+*       offset - Angle in degrees to offset the first slice - Try -90 or +90
+*       borderWidth - Width of border to draw around the pie chart, in pixels - Defaults to 0 (no border)
+*       borderColor - Color to use for the pie chart border - Defaults to #000
+*
+*   box - Box plot. Options:
+*       raw - Set to true to supply pre-computed plot points as values
+*             values should be: low_outlier, low_whisker, q1, median, q3, high_whisker, high_outlier
+*             When set to false you can supply any number of values and the box plot will
+*             be computed for you.  Default is false.
+*       showOutliers - Set to true (default) to display outliers as circles
+*       outlierIQR - Interquartile range used to determine outliers.  Default 1.5
+*       boxLineColor - Outline color of the box
+*       boxFillColor - Fill color for the box
+*       whiskerColor - Line color used for whiskers
+*       outlierLineColor - Outline color of outlier circles
+*       outlierFillColor - Fill color of the outlier circles
+*       spotRadius - Radius of outlier circles
+*       medianColor - Line color of the median line
+*       target - Draw a target cross hair at the supplied value (default undefined)
+*
+*
+*
+*   Examples:
+*   $('#sparkline1').sparkline(myvalues, { lineColor: '#f00', fillColor: false });
+*   $('.barsparks').sparkline('html', { type:'bar', height:'40px', barWidth:5 });
+*   $('#tristate').sparkline([1,1,-1,1,0,0,-1], { type:'tristate' }):
+*   $('#discrete').sparkline([1,3,4,5,5,3,4,5], { type:'discrete' });
+*   $('#bullet').sparkline([10,12,12,9,7], { type:'bullet' });
+*   $('#pie').sparkline([1,1,2], { type:'pie' });
+*/
+
+/*jslint regexp: true, browser: true, jquery: true, white: true, nomen: false, plusplus: false, maxerr: 500, indent: 4 */
+
+(function(document, Math, undefined) { // performance/minified-size optimization
+(function(factory) {
+    if(typeof define === 'function' && define.amd) {
+        define(['jquery'], factory);
+    } else if (jQuery && !jQuery.fn.sparkline) {
+        factory(jQuery);
+    }
+}
+(function($) {
+    'use strict';
+
+    var UNSET_OPTION = {},
+        getDefaults, createClass, SPFormat, clipval, quartile, normalizeValue, normalizeValues,
+        remove, isNumber, all, sum, addCSS, ensureArray, formatNumber, RangeMap,
+        MouseHandler, Tooltip, barHighlightMixin,
+        line, bar, tristate, discrete, bullet, pie, box, defaultStyles, initStyles,
+        VShape, VCanvas_base, VCanvas_canvas, VCanvas_vml, pending, shapeCount = 0;
+
+    /**
+     * Default configuration settings
+     */
+    getDefaults = function () {
+        return {
+            // Settings common to most/all chart types
+            common: {
+                type: 'line',
+                lineColor: '#00f',
+                fillColor: '#cdf',
+                defaultPixelsPerValue: 3,
+                width: 'auto',
+                height: 'auto',
+                composite: false,
+                tagValuesAttribute: 'values',
+                tagOptionsPrefix: 'spark',
+                enableTagOptions: false,
+                enableHighlight: true,
+                highlightLighten: 1.4,
+                tooltipSkipNull: true,
+                tooltipPrefix: '',
+                tooltipSuffix: '',
+                disableHiddenCheck: false,
+                numberFormatter: false,
+                numberDigitGroupCount: 3,
+                numberDigitGroupSep: ',',
+                numberDecimalMark: '.',
+                disableTooltips: false,
+                disableInteraction: false
+            },
+            // Defaults for line charts
+            line: {
+                spotColor: '#f80',
+                highlightSpotColor: '#5f5',
+                highlightLineColor: '#f22',
+                spotRadius: 1.5,
+                minSpotColor: '#f80',
+                maxSpotColor: '#f80',
+                lineWidth: 1,
+                normalRangeMin: undefined,
+                normalRangeMax: undefined,
+                normalRangeColor: '#ccc',
+                drawNormalOnTop: false,
+                chartRangeMin: undefined,
+                chartRangeMax: undefined,
+                chartRangeMinX: undefined,
+                chartRangeMaxX: undefined,
+                tooltipFormat: new SPFormat('<span style="color: {{color}}">&#9679;</span> {{prefix}}{{y}}{{suffix}}')
+            },
+            // Defaults for bar charts
+            bar: {
+                barColor: '#3366cc',
+                negBarColor: '#f44',
+                stackedBarColor: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00',
+                    '#dd4477', '#0099c6', '#990099'],
+                zeroColor: undefined,
+                nullColor: undefined,
+                zeroAxis: true,
+                barWidth: 4,
+                barSpacing: 1,
+                chartRangeMax: undefined,
+                chartRangeMin: undefined,
+                chartRangeClip: false,
+                colorMap: undefined,
+                tooltipFormat: new SPFormat('<span style="color: {{color}}">&#9679;</span> {{prefix}}{{value}}{{suffix}}')
+            },
+            // Defaults for tristate charts
+            tristate: {
+                barWidth: 4,
+                barSpacing: 1,
+                posBarColor: '#6f6',
+                negBarColor: '#f44',
+                zeroBarColor: '#999',
+                colorMap: {},
+                tooltipFormat: new SPFormat('<span style="color: {{color}}">&#9679;</span> {{value:map}}'),
+                tooltipValueLookups: { map: { '-1': 'Loss', '0': 'Draw', '1': 'Win' } }
+            },
+            // Defaults for discrete charts
+            discrete: {
+                lineHeight: 'auto',
+                thresholdColor: undefined,
+                thresholdValue: 0,
+                chartRangeMax: undefined,
+                chartRangeMin: undefined,
+                chartRangeClip: false,
+                tooltipFormat: new SPFormat('{{prefix}}{{value}}{{suffix}}')
+            },
+            // Defaults for bullet charts
+            bullet: {
+                targetColor: '#f33',
+                targetWidth: 3, // width of the target bar in pixels
+                performanceColor: '#33f',
+                rangeColors: ['#d3dafe', '#a8b6ff', '#7f94ff'],
+                base: undefined, // set this to a number to change the base start number
+                tooltipFormat: new SPFormat('{{fieldkey:fields}} - {{value}}'),
+                tooltipValueLookups: { fields: {r: 'Range', p: 'Performance', t: 'Target'} }
+            },
+            // Defaults for pie charts
+            pie: {
+                offset: 0,
+                sliceColors: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00',
+                    '#dd4477', '#0099c6', '#990099'],
+                borderWidth: 0,
+                borderColor: '#000',
+                tooltipFormat: new SPFormat('<span style="color: {{color}}">&#9679;</span> {{value}} ({{percent.1}}%)')
+            },
+            // Defaults for box plots
+            box: {
+                raw: false,
+                boxLineColor: '#000',
+                boxFillColor: '#cdf',
+                whiskerColor: '#000',
+                outlierLineColor: '#333',
+                outlierFillColor: '#fff',
+                medianColor: '#f00',
+                showOutliers: true,
+                outlierIQR: 1.5,
+                spotRadius: 1.5,
+                target: undefined,
+                targetColor: '#4a2',
+                chartRangeMax: undefined,
+                chartRangeMin: undefined,
+                tooltipFormat: new SPFormat('{{field:fields}}: {{value}}'),
+                tooltipFormatFieldlistKey: 'field',
+                tooltipValueLookups: { fields: { lq: 'Lower Quartile', med: 'Median',
+                    uq: 'Upper Quartile', lo: 'Left Outlier', ro: 'Right Outlier',
+                    lw: 'Left Whisker', rw: 'Right Whisker'} }
+            }
+        };
+    };
+
+    // You can have tooltips use a css class other than jqstooltip by specifying tooltipClassname
+    defaultStyles = '.jqstooltip { ' +
+            'position: absolute;' +
+            'left: 0px;' +
+            'top: 0px;' +
+            'visibility: hidden;' +
+            'background: rgb(0, 0, 0) transparent;' +
+            'background-color: rgba(0,0,0,0.6);' +
+            'filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);' +
+            '-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";' +
+            'color: white;' +
+            'font: 10px arial, san serif;' +
+            'text-align: left;' +
+            'white-space: nowrap;' +
+            'padding: 5px;' +
+            'border: 1px solid white;' +
+            'box-sizing: content-box;' +
+            'z-index: 10000;' +
+            '}' +
+            '.jqsfield { ' +
+            'color: white;' +
+            'font: 10px arial, san serif;' +
+            'text-align: left;' +
+            '}';
+
+    /**
+     * Utilities
+     */
+
+    createClass = function (/* [baseclass, [mixin, ...]], definition */) {
+        var Class, args;
+        Class = function () {
+            this.init.apply(this, arguments);
+        };
+        if (arguments.length > 1) {
+            if (arguments[0]) {
+                Class.prototype = $.extend(new arguments[0](), arguments[arguments.length - 1]);
+                Class._super = arguments[0].prototype;
+            } else {
+                Class.prototype = arguments[arguments.length - 1];
+            }
+            if (arguments.length > 2) {
+                args = Array.prototype.slice.call(arguments, 1, -1);
+                args.unshift(Class.prototype);
+                $.extend.apply($, args);
+            }
+        } else {
+            Class.prototype = arguments[0];
+        }
+        Class.prototype.cls = Class;
+        return Class;
+    };
+
+    /**
+     * Wraps a format string for tooltips
+     * {{x}}
+     * {{x.2}
+     * {{x:months}}
+     */
+    $.SPFormatClass = SPFormat = createClass({
+        fre: /\{\{([\w.]+?)(:(.+?))?\}\}/g,
+        precre: /(\w+)\.(\d+)/,
+
+        init: function (format, fclass) {
+            this.format = format;
+            this.fclass = fclass;
+        },
+
+        render: function (fieldset, lookups, options) {
+            var self = this,
+                fields = fieldset,
+                match, token, lookupkey, fieldvalue, prec;
+            return this.format.replace(this.fre, function () {
+                var lookup;
+                token = arguments[1];
+                lookupkey = arguments[3];
+                match = self.precre.exec(token);
+                if (match) {
+                    prec = match[2];
+                    token = match[1];
+                } else {
+                    prec = false;
+                }
+                fieldvalue = fields[token];
+                if (fieldvalue === undefined) {
+                    return '';
+                }
+                if (lookupkey && lookups && lookups[lookupkey]) {
+                    lookup = lookups[lookupkey];
+                    if (lookup.get) { // RangeMap
+                        return lookups[lookupkey].get(fieldvalue) || fieldvalue;
+                    } else {
+                        return lookups[lookupkey][fieldvalue] || fieldvalue;
+                    }
+                }
+                if (isNumber(fieldvalue)) {
+                    if (options.get('numberFormatter')) {
+                        fieldvalue = options.get('numberFormatter')(fieldvalue);
+                    } else {
+                        fieldvalue = formatNumber(fieldvalue, prec,
+                            options.get('numberDigitGroupCount'),
+                            options.get('numberDigitGroupSep'),
+                            options.get('numberDecimalMark'));
+                    }
+                }
+                return fieldvalue;
+            });
+        }
+    });
+
+    // convience method to avoid needing the new operator
+    $.spformat = function(format, fclass) {
+        return new SPFormat(format, fclass);
+    };
+
+    clipval = function (val, min, max) {
+        if (val < min) {
+            return min;
+        }
+        if (val > max) {
+            return max;
+        }
+        return val;
+    };
+
+    quartile = function (values, q) {
+        var vl;
+        if (q === 2) {
+            vl = Math.floor(values.length / 2);
+            return values.length % 2 ? values[vl] : (values[vl-1] + values[vl]) / 2;
+        } else {
+            if (values.length % 2 ) { // odd
+                vl = (values.length * q + q) / 4;
+                return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1];
+            } else { //even
+                vl = (values.length * q + 2) / 4;
+                return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 :  values[vl-1];
+
+            }
+        }
+    };
+
+    normalizeValue = function (val) {
+        var nf;
+        switch (val) {
+            case 'undefined':
+                val = undefined;
+                break;
+            case 'null':
+                val = null;
+                break;
+            case 'true':
+                val = true;
+                break;
+            case 'false':
+                val = false;
+                break;
+            default:
+                nf = parseFloat(val);
+                if (val == nf) {
+                    val = nf;
+                }
+        }
+        return val;
+    };
+
+    normalizeValues = function (vals) {
+        var i, result = [];
+        for (i = vals.length; i--;) {
+            result[i] = normalizeValue(vals[i]);
+        }
+        return result;
+    };
+
+    remove = function (vals, filter) {
+        var i, vl, result = [];
+        for (i = 0, vl = vals.length; i < vl; i++) {
+            if (vals[i] !== filter) {
+                result.push(vals[i]);
+            }
+        }
+        return result;
+    };
+
+    isNumber = function (num) {
+        return !isNaN(parseFloat(num)) && isFinite(num);
+    };
+
+    formatNumber = function (num, prec, groupsize, groupsep, decsep) {
+        var p, i;
+        num = (prec === false ? parseFloat(num).toString() : num.toFixed(prec)).split('');
+        p = (p = $.inArray('.', num)) < 0 ? num.length : p;
+        if (p < num.length) {
+            num[p] = decsep;
+        }
+        for (i = p - groupsize; i > 0; i -= groupsize) {
+            num.splice(i, 0, groupsep);
+        }
+        return num.join('');
+    };
+
+    // determine if all values of an array match a value
+    // returns true if the array is empty
+    all = function (val, arr, ignoreNull) {
+        var i;
+        for (i = arr.length; i--; ) {
+            if (ignoreNull && arr[i] === null) continue;
+            if (arr[i] !== val) {
+                return false;
+            }
+        }
+        return true;
+    };
+
+    // sums the numeric values in an array, ignoring other values
+    sum = function (vals) {
+        var total = 0, i;
+        for (i = vals.length; i--;) {
+            total += typeof vals[i] === 'number' ? vals[i] : 0;
+        }
+        return total;
+    };
+
+    ensureArray = function (val) {
+        return $.isArray(val) ? val : [val];
+    };
+
+    // http://paulirish.com/2008/bookmarklet-inject-new-css-rules/
+    addCSS = function(css) {
+        var tag, iefail;
+        if (document.createStyleSheet) {
+            try {
+                document.createStyleSheet().cssText = css;
+                return;
+            } catch (e) {
+                // IE <= 9 maxes out at 31 stylesheets; inject into page instead.
+                iefail = true;
+            }
+        }
+        tag = document.createElement('style');
+        tag.type = 'text/css';
+        document.getElementsByTagName('head')[0].appendChild(tag);
+        if (iefail) {
+            document.styleSheets[document.styleSheets.length - 1].cssText = css;
+        } else {
+            tag[(typeof document.body.style.WebkitAppearance == 'string') /* webkit only */ ? 'innerText' : 'innerHTML'] = css;
+        }
+    };
+
+    // Provide a cross-browser interface to a few simple drawing primitives
+    $.fn.simpledraw = function (width, height, useExisting, interact) {
+        var target, mhandler;
+        if (useExisting && (target = this.data('_jqs_vcanvas'))) {
+            return target;
+        }
+
+        if ($.fn.sparkline.canvas === false) {
+            // We've already determined that neither Canvas nor VML are available
+            return false;
+
+        } else if ($.fn.sparkline.canvas === undefined) {
+            // No function defined yet -- need to see if we support Canvas or VML
+            var el = document.createElement('canvas');
+            if (!!(el.getContext && el.getContext('2d'))) {
+                // Canvas is available
+                $.fn.sparkline.canvas = function(width, height, target, interact) {
+                    return new VCanvas_canvas(width, height, target, interact);
+                };
+            } else if (document.namespaces && !document.namespaces.v) {
+                // VML is available
+                document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML');
+                $.fn.sparkline.canvas = function(width, height, target, interact) {
+                    return new VCanvas_vml(width, height, target);
+                };
+            } else {
+                // Neither Canvas nor VML are available
+                $.fn.sparkline.canvas = false;
+                return false;
+            }
+        }
+
+        if (width === undefined) {
+            width = $(this).innerWidth();
+        }
+        if (height === undefined) {
+            height = $(this).innerHeight();
+        }
+
+        target = $.fn.sparkline.canvas(width, height, this, interact);
+
+        mhandler = $(this).data('_jqs_mhandler');
+        if (mhandler) {
+            mhandler.registerCanvas(target);
+        }
+        return target;
+    };
+
+    $.fn.cleardraw = function () {
+        var target = this.data('_jqs_vcanvas');
+        if (target) {
+            target.reset();
+        }
+    };
+
+    $.RangeMapClass = RangeMap = createClass({
+        init: function (map) {
+            var key, range, rangelist = [];
+            for (key in map) {
+                if (map.hasOwnProperty(key) && typeof key === 'string' && key.indexOf(':') > -1) {
+                    range = key.split(':');
+                    range[0] = range[0].length === 0 ? -Infinity : parseFloat(range[0]);
+                    range[1] = range[1].length === 0 ? Infinity : parseFloat(range[1]);
+                    range[2] = map[key];
+                    rangelist.push(range);
+                }
+            }
+            this.map = map;
+            this.rangelist = rangelist || false;
+        },
+
+        get: function (value) {
+            var rangelist = this.rangelist,
+                i, range, result;
+            if ((result = this.map[value]) !== undefined) {
+                return result;
+            }
+            if (rangelist) {
+                for (i = rangelist.length; i--;) {
+                    range = rangelist[i];
+                    if (range[0] <= value && range[1] >= value) {
+                        return range[2];
+                    }
+                }
+            }
+            return undefined;
+        }
+    });
+
+    // Convenience function
+    $.range_map = function(map) {
+        return new RangeMap(map);
+    };
+
+    MouseHandler = createClass({
+        init: function (el, options) {
+            var $el = $(el);
+            this.$el = $el;
+            this.options = options;
+            this.currentPageX = 0;
+            this.currentPageY = 0;
+            this.el = el;
+            this.splist = [];
+            this.tooltip = null;
+            this.over = false;
+            this.displayTooltips = !options.get('disableTooltips');
+            this.highlightEnabled = !options.get('disableHighlight');
+        },
+
+        registerSparkline: function (sp) {
+            this.splist.push(sp);
+            if (this.over) {
+                this.updateDisplay();
+            }
+        },
+
+        registerCanvas: function (canvas) {
+            var $canvas = $(canvas.canvas);
+            this.canvas = canvas;
+            this.$canvas = $canvas;
+            $canvas.mouseenter($.proxy(this.mouseenter, this));
+            $canvas.mouseleave($.proxy(this.mouseleave, this));
+            $canvas.click($.proxy(this.mouseclick, this));
+        },
+
+        reset: function (removeTooltip) {
+            this.splist = [];
+            if (this.tooltip && removeTooltip) {
+                this.tooltip.remove();
+                this.tooltip = undefined;
+            }
+        },
+
+        mouseclick: function (e) {
+            var clickEvent = $.Event('sparklineClick');
+            clickEvent.originalEvent = e;
+            clickEvent.sparklines = this.splist;
+            this.$el.trigger(clickEvent);
+        },
+
+        mouseenter: function (e) {
+            $(document.body).unbind('mousemove.jqs');
+            $(document.body).bind('mousemove.jqs', $.proxy(this.mousemove, this));
+            this.over = true;
+            this.currentPageX = e.pageX;
+            this.currentPageY = e.pageY;
+            this.currentEl = e.target;
+            if (!this.tooltip && this.displayTooltips) {
+                this.tooltip = new Tooltip(this.options);
+                this.tooltip.updatePosition(e.pageX, e.pageY);
+            }
+            this.updateDisplay();
+        },
+
+        mouseleave: function () {
+            $(document.body).unbind('mousemove.jqs');
+            var splist = this.splist,
+                 spcount = splist.length,
+                 needsRefresh = false,
+                 sp, i;
+            this.over = false;
+            this.currentEl = null;
+
+            if (this.tooltip) {
+                this.tooltip.remove();
+                this.tooltip = null;
+            }
+
+            for (i = 0; i < spcount; i++) {
+                sp = splist[i];
+                if (sp.clearRegionHighlight()) {
+                    needsRefresh = true;
+                }
+            }
+
+            if (needsRefresh) {
+                this.canvas.render();
+            }
+        },
+
+        mousemove: function (e) {
+            this.currentPageX = e.pageX;
+            this.currentPageY = e.pageY;
+            this.currentEl = e.target;
+            if (this.tooltip) {
+                this.tooltip.updatePosition(e.pageX, e.pageY);
+            }
+            this.updateDisplay();
+        },
+
+        updateDisplay: function () {
+            var splist = this.splist,
+                 spcount = splist.length,
+                 needsRefresh = false,
+                 offset = this.$canvas.offset(),
+                 localX = this.currentPageX - offset.left,
+                 localY = this.currentPageY - offset.top,
+                 tooltiphtml, sp, i, result, changeEvent;
+            if (!this.over) {
+                return;
+            }
+            for (i = 0; i < spcount; i++) {
+                sp = splist[i];
+                result = sp.setRegionHighlight(this.currentEl, localX, localY);
+                if (result) {
+                    needsRefresh = true;
+                }
+            }
+            if (needsRefresh) {
+                changeEvent = $.Event('sparklineRegionChange');
+                changeEvent.sparklines = this.splist;
+                this.$el.trigger(changeEvent);
+                if (this.tooltip) {
+                    tooltiphtml = '';
+                    for (i = 0; i < spcount; i++) {
+                        sp = splist[i];
+                        tooltiphtml += sp.getCurrentRegionTooltip();
+                    }
+                    this.tooltip.setContent(tooltiphtml);
+                }
+                if (!this.disableHighlight) {
+                    this.canvas.render();
+                }
+            }
+            if (result === null) {
+                this.mouseleave();
+            }
+        }
+    });
+
+
+    Tooltip = createClass({
+        sizeStyle: 'position: static !important;' +
+            'display: block !important;' +
+            'visibility: hidden !important;' +
+            'float: left !important;',
+
+        init: function (options) {
+            var tooltipClassname = options.get('tooltipClassname', 'jqstooltip'),
+                sizetipStyle = this.sizeStyle,
+                offset;
+            this.container = options.get('tooltipContainer') || document.body;
+            this.tooltipOffsetX = options.get('tooltipOffsetX', 10);
+            this.tooltipOffsetY = options.get('tooltipOffsetY', 12);
+            // remove any previous lingering tooltip
+            $('#jqssizetip').remove();
+            $('#jqstooltip').remove();
+            this.sizetip = $('<div/>', {
+                id: 'jqssizetip',
+                style: sizetipStyle,
+                'class': tooltipClassname
+            });
+            this.tooltip = $('<div/>', {
+                id: 'jqstooltip',
+                'class': tooltipClassname
+            }).appendTo(this.container);
+            // account for the container's location
+            offset = this.tooltip.offset();
+            this.offsetLeft = offset.left;
+            this.offsetTop = offset.top;
+            this.hidden = true;
+            $(window).unbind('resize.jqs scroll.jqs');
+            $(window).bind('resize.jqs scroll.jqs', $.proxy(this.updateWindowDims, this));
+            this.updateWindowDims();
+        },
+
+        updateWindowDims: function () {
+            this.scrollTop = $(window).scrollTop();
+            this.scrollLeft = $(window).scrollLeft();
+            this.scrollRight = this.scrollLeft + $(window).width();
+            this.updatePosition();
+        },
+
+        getSize: function (content) {
+            this.sizetip.html(content).appendTo(this.container);
+            this.width = this.sizetip.width() + 1;
+            this.height = this.sizetip.height();
+            this.sizetip.remove();
+        },
+
+        setContent: function (content) {
+            if (!content) {
+                this.tooltip.css('visibility', 'hidden');
+                this.hidden = true;
+                return;
+            }
+            this.getSize(content);
+            this.tooltip.html(content)
+                .css({
+                    'width': this.width,
+                    'height': this.height,
+                    'visibility': 'visible'
+                });
+            if (this.hidden) {
+                this.hidden = false;
+                this.updatePosition();
+            }
+        },
+
+        updatePosition: function (x, y) {
+            if (x === undefined) {
+                if (this.mousex === undefined) {
+                    return;
+                }
+                x = this.mousex - this.offsetLeft;
+                y = this.mousey - this.offsetTop;
+
+            } else {
+                this.mousex = x = x - this.offsetLeft;
+                this.mousey = y = y - this.offsetTop;
+            }
+            if (!this.height || !this.width || this.hidden) {
+                return;
+            }
+
+            y -= this.height + this.tooltipOffsetY;
+            x += this.tooltipOffsetX;
+
+            if (y < this.scrollTop) {
+                y = this.scrollTop;
+            }
+            if (x < this.scrollLeft) {
+                x = this.scrollLeft;
+            } else if (x + this.width > this.scrollRight) {
+                x = this.scrollRight - this.width;
+            }
+
+            this.tooltip.css({
+                'left': x,
+                'top': y
+            });
+        },
+
+        remove: function () {
+            this.tooltip.remove();
+            this.sizetip.remove();
+            this.sizetip = this.tooltip = undefined;
+            $(window).unbind('resize.jqs scroll.jqs');
+        }
+    });
+
+    initStyles = function() {
+        addCSS(defaultStyles);
+    };
+
+    $(initStyles);
+
+    pending = [];
+    $.fn.sparkline = function (userValues, userOptions) {
+        return this.each(function () {
+            var options = new $.fn.sparkline.options(this, userOptions),
+                 $this = $(this),
+                 render, i;
+            render = function () {
+                var values, width, height, tmp, mhandler, sp, vals;
+                if (userValues === 'html' || userValues === undefined) {
+                    vals = this.getAttribute(options.get('tagValuesAttribute'));
+                    if (vals === undefined || vals === null) {
+                        vals = $this.html();
+                    }
+                    values = vals.replace(/(^\s*<!--)|(-->\s*$)|\s+/g, '').split(',');
+                } else {
+                    values = userValues;
+                }
+
+                width = options.get('width') === 'auto' ? values.length * options.get('defaultPixelsPerValue') : options.get('width');
+                if (options.get('height') === 'auto') {
+                    if (!options.get('composite') || !$.data(this, '_jqs_vcanvas')) {
+                        // must be a better way to get the line height
+                        tmp = document.createElement('span');
+                        tmp.innerHTML = 'a';
+                        $this.html(tmp);
+                        height = $(tmp).innerHeight() || $(tmp).height();
+                        $(tmp).remove();
+                        tmp = null;
+                    }
+                } else {
+                    height = options.get('height');
+                }
+
+                if (!options.get('disableInteraction')) {
+                    mhandler = $.data(this, '_jqs_mhandler');
+                    if (!mhandler) {
+                        mhandler = new MouseHandler(this, options);
+                        $.data(this, '_jqs_mhandler', mhandler);
+                    } else if (!options.get('composite')) {
+                        mhandler.reset();
+                    }
+                } else {
+                    mhandler = false;
+                }
+
+                if (options.get('composite') && !$.data(this, '_jqs_vcanvas')) {
+                    if (!$.data(this, '_jqs_errnotify')) {
+                        alert('Attempted to attach a composite sparkline to an element with no existing sparkline');
+                        $.data(this, '_jqs_errnotify', true);
+                    }
+                    return;
+                }
+
+                sp = new $.fn.sparkline[options.get('type')](this, values, options, width, height);
+
+                sp.render();
+
+                if (mhandler) {
+                    mhandler.registerSparkline(sp);
+                }
+            };
+            if (($(this).html() && !options.get('disableHiddenCheck') && $(this).is(':hidden')) || !$(this).parents('body').length) {
+                if (!options.get('composite') && $.data(this, '_jqs_pending')) {
+                    // remove any existing references to the element
+                    for (i = pending.length; i; i--) {
+                        if (pending[i - 1][0] == this) {
+                            pending.splice(i - 1, 1);
+                        }
+                    }
+                }
+                pending.push([this, render]);
+                $.data(this, '_jqs_pending', true);
+            } else {
+                render.call(this);
+            }
+        });
+    };
+
+    $.fn.sparkline.defaults = getDefaults();
+
+
+    $.sparkline_display_visible = function () {
+        var el, i, pl;
+        var done = [];
+        for (i = 0, pl = pending.length; i < pl; i++) {
+            el = pending[i][0];
+            if ($(el).is(':visible') && !$(el).parents().is(':hidden')) {
+                pending[i][1].call(el);
+                $.data(pending[i][0], '_jqs_pending', false);
+                done.push(i);
+            } else if (!$(el).closest('html').length && !$.data(el, '_jqs_pending')) {
+                // element has been inserted and removed from the DOM
+                // If it was not yet inserted into the dom then the .data request
+                // will return true.
+                // removing from the dom causes the data to be removed.
+                $.data(pending[i][0], '_jqs_pending', false);
+                done.push(i);
+            }
+        }
+        for (i = done.length; i; i--) {
+            pending.splice(done[i - 1], 1);
+        }
+    };
+
+
+    /**
+     * User option handler
+     */
+    $.fn.sparkline.options = createClass({
+        init: function (tag, userOptions) {
+            var extendedOptions, defaults, base, tagOptionType;
+            this.userOptions = userOptions = userOptions || {};
+            this.tag = tag;
+            this.tagValCache = {};
+            defaults = $.fn.sparkline.defaults;
+            base = defaults.common;
+            this.tagOptionsPrefix = userOptions.enableTagOptions && (userOptions.tagOptionsPrefix || base.tagOptionsPrefix);
+
+            tagOptionType = this.getTagSetting('type');
+            if (tagOptionType === UNSET_OPTION) {
+                extendedOptions = defaults[userOptions.type || base.type];
+            } else {
+                extendedOptions = defaults[tagOptionType];
+            }
+            this.mergedOptions = $.extend({}, base, extendedOptions, userOptions);
+        },
+
+
+        getTagSetting: function (key) {
+            var prefix = this.tagOptionsPrefix,
+                val, i, pairs, keyval;
+            if (prefix === false || prefix === undefined) {
+                return UNSET_OPTION;
+            }
+            if (this.tagValCache.hasOwnProperty(key)) {
+                val = this.tagValCache.key;
+            } else {
+                val = this.tag.getAttribute(prefix + key);
+                if (val === undefined || val === null) {
+                    val = UNSET_OPTION;
+                } else if (val.substr(0, 1) === '[') {
+                    val = val.substr(1, val.length - 2).split(',');
+                    for (i = val.length; i--;) {
+                        val[i] = normalizeValue(val[i].replace(/(^\s*)|(\s*$)/g, ''));
+                    }
+                } else if (val.substr(0, 1) === '{') {
+                    pairs = val.substr(1, val.length - 2).split(',');
+                    val = {};
+                    for (i = pairs.length; i--;) {
+                        keyval = pairs[i].split(':', 2);
+                        val[keyval[0].replace(/(^\s*)|(\s*$)/g, '')] = normalizeValue(keyval[1].replace(/(^\s*)|(\s*$)/g, ''));
+                    }
+                } else {
+                    val = normalizeValue(val);
+                }
+                this.tagValCache.key = val;
+            }
+            return val;
+        },
+
+        get: function (key, defaultval) {
+            var tagOption = this.getTagSetting(key),
+                result;
+            if (tagOption !== UNSET_OPTION) {
+                return tagOption;
+            }
+            return (result = this.mergedOptions[key]) === undefined ? defaultval : result;
+        }
+    });
+
+
+    $.fn.sparkline._base = createClass({
+        disabled: false,
+
+        init: function (el, values, options, width, height) {
+            this.el = el;
+            this.$el = $(el);
+            this.values = values;
+            this.options = options;
+            this.width = width;
+            this.height = height;
+            this.currentRegion = undefined;
+        },
+
+        /**
+         * Setup the canvas
+         */
+        initTarget: function () {
+            var interactive = !this.options.get('disableInteraction');
+            if (!(this.target = this.$el.simpledraw(this.width, this.height, this.options.get('composite'), interactive))) {
+                this.disabled = true;
+            } else {
+                this.canvasWidth = this.target.pixelWidth;
+                this.canvasHeight = this.target.pixelHeight;
+            }
+        },
+
+        /**
+         * Actually render the chart to the canvas
+         */
+        render: function () {
+            if (this.disabled) {
+                this.el.innerHTML = '';
+                return false;
+            }
+            return true;
+        },
+
+        /**
+         * Return a region id for a given x/y co-ordinate
+         */
+        getRegion: function (x, y) {
+        },
+
+        /**
+         * Highlight an item based on the moused-over x,y co-ordinate
+         */
+        setRegionHighlight: function (el, x, y) {
+            var currentRegion = this.currentRegion,
+                highlightEnabled = !this.options.get('disableHighlight'),
+                newRegion;
+            if (x > this.canvasWidth || y > this.canvasHeight || x < 0 || y < 0) {
+                return null;
+            }
+            newRegion = this.getRegion(el, x, y);
+            if (currentRegion !== newRegion) {
+                if (currentRegion !== undefined && highlightEnabled) {
+                    this.removeHighlight();
+                }
+                this.currentRegion = newRegion;
+                if (newRegion !== undefined && highlightEnabled) {
+                    this.renderHighlight();
+                }
+                return true;
+            }
+            return false;
+        },
+
+        /**
+         * Reset any currently highlighted item
+         */
+        clearRegionHighlight: function () {
+            if (this.currentRegion !== undefined) {
+                this.removeHighlight();
+                this.currentRegion = undefined;
+                return true;
+            }
+            return false;
+        },
+
+        renderHighlight: function () {
+            this.changeHighlight(true);
+        },
+
+        removeHighlight: function () {
+            this.changeHighlight(false);
+        },
+
+        changeHighlight: function (highlight)  {},
+
+        /**
+         * Fetch the HTML to display as a tooltip
+         */
+        getCurrentRegionTooltip: function () {
+            var options = this.options,
+                header = '',
+                entries = [],
+                fields, formats, formatlen, fclass, text, i,
+                showFields, showFieldsKey, newFields, fv,
+                formatter, format, fieldlen, j;
+            if (this.currentRegion === undefined) {
+                return '';
+            }
+            fields = this.getCurrentRegionFields();
+            formatter = options.get('tooltipFormatter');
+            if (formatter) {
+                return formatter(this, options, fields);
+            }
+            if (options.get('tooltipChartTitle')) {
+                header += '<div class="jqs jqstitle">' + options.get('tooltipChartTitle') + '</div>\n';
+            }
+            formats = this.options.get('tooltipFormat');
+            if (!formats) {
+                return '';
+            }
+            if (!$.isArray(formats)) {
+                formats = [formats];
+            }
+            if (!$.isArray(fields)) {
+                fields = [fields];
+            }
+            showFields = this.options.get('tooltipFormatFieldlist');
+            showFieldsKey = this.options.get('tooltipFormatFieldlistKey');
+            if (showFields && showFieldsKey) {
+                // user-selected ordering of fields
+                newFields = [];
+                for (i = fields.length; i--;) {
+                    fv = fields[i][showFieldsKey];
+                    if ((j = $.inArray(fv, showFields)) != -1) {
+                        newFields[j] = fields[i];
+                    }
+                }
+                fields = newFields;
+            }
+            formatlen = formats.length;
+            fieldlen = fields.length;
+            for (i = 0; i < formatlen; i++) {
+                format = formats[i];
+                if (typeof format === 'string') {
+                    format = new SPFormat(format);
+                }
+                fclass = format.fclass || 'jqsfield';
+                for (j = 0; j < fieldlen; j++) {
+                    if (!fields[j].isNull || !options.get('tooltipSkipNull')) {
+                        $.extend(fields[j], {
+                            prefix: options.get('tooltipPrefix'),
+                            suffix: options.get('tooltipSuffix')
+                        });
+                        text = format.render(fields[j], options.get('tooltipValueLookups'), options);
+                        entries.push('<div class="' + fclass + '">' + text + '</div>');
+                    }
+                }
+            }
+            if (entries.length) {
+                return header + entries.join('\n');
+            }
+            return '';
+        },
+
+        getCurrentRegionFields: function () {},
+
+        calcHighlightColor: function (color, options) {
+            var highlightColor = options.get('highlightColor'),
+                lighten = options.get('highlightLighten'),
+                parse, mult, rgbnew, i;
+            if (highlightColor) {
+                return highlightColor;
+            }
+            if (lighten) {
+                // extract RGB values
+                parse = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(color) || /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color);
+                if (parse) {
+                    rgbnew = [];
+                    mult = color.length === 4 ? 16 : 1;
+                    for (i = 0; i < 3; i++) {
+                        rgbnew[i] = clipval(Math.round(parseInt(parse[i + 1], 16) * mult * lighten), 0, 255);
+                    }
+                    return 'rgb(' + rgbnew.join(',') + ')';
+                }
+
+            }
+            return color;
+        }
+
+    });
+
+    barHighlightMixin = {
+        changeHighlight: function (highlight) {
+            var currentRegion = this.currentRegion,
+                target = this.target,
+                shapeids = this.regionShapes[currentRegion],
+                newShapes;
+            // will be null if the region value was null
+            if (shapeids) {
+                newShapes = this.renderRegion(currentRegion, highlight);
+                if ($.isArray(newShapes) || $.isArray(shapeids)) {
+                    target.replaceWithShapes(shapeids, newShapes);
+                    this.regionShapes[currentRegion] = $.map(newShapes, function (newShape) {
+                        return newShape.id;
+                    });
+                } else {
+                    target.replaceWithShape(shapeids, newShapes);
+                    this.regionShapes[currentRegion] = newShapes.id;
+                }
+            }
+        },
+
+        render: function () {
+            var values = this.values,
+                target = this.target,
+                regionShapes = this.regionShapes,
+                shapes, ids, i, j;
+
+            if (!this.cls._super.render.call(this)) {
+                return;
+            }
+            for (i = values.length; i--;) {
+                shapes = this.renderRegion(i);
+                if (shapes) {
+                    if ($.isArray(shapes)) {
+                        ids = [];
+                        for (j = shapes.length; j--;) {
+                            shapes[j].append();
+                            ids.push(shapes[j].id);
+                        }
+                        regionShapes[i] = ids;
+                    } else {
+                        shapes.append();
+                        regionShapes[i] = shapes.id; // store just the shapeid
+                    }
+                } else {
+                    // null value
+                    regionShapes[i] = null;
+                }
+            }
+            target.render();
+        }
+    };
+
+    /**
+     * Line charts
+     */
+    $.fn.sparkline.line = line = createClass($.fn.sparkline._base, {
+        type: 'line',
+
+        init: function (el, values, options, width, height) {
+            line._super.init.call(this, el, values, options, width, height);
+            this.vertices = [];
+            this.regionMap = [];
+            this.xvalues = [];
+            this.yvalues = [];
+            this.yminmax = [];
+            this.hightlightSpotId = null;
+            this.lastShapeId = null;
+            this.initTarget();
+        },
+
+        getRegion: function (el, x, y) {
+            var i,
+                regionMap = this.regionMap; // maps regions to value positions
+            for (i = regionMap.length; i--;) {
+                if (regionMap[i] !== null && x >= regionMap[i][0] && x <= regionMap[i][1]) {
+                    return regionMap[i][2];
+                }
+            }
+            return undefined;
+        },
+
+        getCurrentRegionFields: function () {
+            var currentRegion = this.currentRegion;
+            return {
+                isNull: this.yvalues[currentRegion] === null,
+                x: this.xvalues[currentRegion],
+                y: this.yvalues[currentRegion],
+                color: this.options.get('lineColor'),
+                fillColor: this.options.get('fillColor'),
+                offset: currentRegion
+            };
+        },
+
+        renderHighlight: function () {
+            var currentRegion = this.currentRegion,
+                target = this.target,
+                vertex = this.vertices[currentRegion],
+                options = this.options,
+                spotRadius = options.get('spotRadius'),
+                highlightSpotColor = options.get('highlightSpotColor'),
+                highlightLineColor = options.get('highlightLineColor'),
+                highlightSpot, highlightLine;
+
+            if (!vertex) {
+                return;
+            }
+            if (spotRadius && highlightSpotColor) {
+                highlightSpot = target.drawCircle(vertex[0], vertex[1],
+                    spotRadius, undefined, highlightSpotColor);
+                this.highlightSpotId = highlightSpot.id;
+                target.insertAfterShape(this.lastShapeId, highlightSpot);
+            }
+            if (highlightLineColor) {
+                highlightLine = target.drawLine(vertex[0], this.canvasTop, vertex[0],
+                    this.canvasTop + this.canvasHeight, highlightLineColor);
+                this.highlightLineId = highlightLine.id;
+                target.insertAfterShape(this.lastShapeId, highlightLine);
+            }
+        },
+
+        removeHighlight: function () {
+            var target = this.target;
+            if (this.highlightSpotId) {
+                target.removeShapeId(this.highlightSpotId);
+                this.highlightSpotId = null;
+            }
+            if (this.highlightLineId) {
+                target.removeShapeId(this.highlightLineId);
+                this.highlightLineId = null;
+            }
+        },
+
+        scanValues: function () {
+            var values = this.values,
+                valcount = values.length,
+                xvalues = this.xvalues,
+                yvalues = this.yvalues,
+                yminmax = this.yminmax,
+                i, val, isStr, isArray, sp;
+            for (i = 0; i < valcount; i++) {
+                val = values[i];
+                isStr = typeof(values[i]) === 'string';
+                isArray = typeof(values[i]) === 'object' && values[i] instanceof Array;
+                sp = isStr && values[i].split(':');
+                if (isStr && sp.length === 2) { // x:y
+                    xvalues.push(Number(sp[0]));
+                    yvalues.push(Number(sp[1]));
+                    yminmax.push(Number(sp[1]));
+                } else if (isArray) {
+                    xvalues.push(val[0]);
+                    yvalues.push(val[1]);
+                    yminmax.push(val[1]);
+                } else {
+                    xvalues.push(i);
+                    if (values[i] === null || values[i] === 'null') {
+                        yvalues.push(null);
+                    } else {
+                        yvalues.push(Number(val));
+                        yminmax.push(Number(val));
+                    }
+                }
+            }
+            if (this.options.get('xvalues')) {
+                xvalues = this.options.get('xvalues');
+            }
+
+            this.maxy = this.maxyorg = Math.max.apply(Math, yminmax);
+            this.miny = this.minyorg = Math.min.apply(Math, yminmax);
+
+            this.maxx = Math.max.apply(Math, xvalues);
+            this.minx = Math.min.apply(Math, xvalues);
+
+            this.xvalues = xvalues;
+            this.yvalues = yvalues;
+            this.yminmax = yminmax;
+
+        },
+
+        processRangeOptions: function () {
+            var options = this.options,
+                normalRangeMin = options.get('normalRangeMin'),
+                normalRangeMax = options.get('normalRangeMax');
+
+            if (normalRangeMin !== undefined) {
+                if (normalRangeMin < this.miny) {
+                    this.miny = normalRangeMin;
+                }
+                if (normalRangeMax > this.maxy) {
+                    this.maxy = normalRangeMax;
+                }
+            }
+            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.miny)) {
+                this.miny = options.get('chartRangeMin');
+            }
+            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.maxy)) {
+                this.maxy = options.get('chartRangeMax');
+            }
+            if (options.get('chartRangeMinX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMinX') < this.minx)) {
+                this.minx = options.get('chartRangeMinX');
+            }
+            if (options.get('chartRangeMaxX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMaxX') > this.maxx)) {
+                this.maxx = options.get('chartRangeMaxX');
+            }
+
+        },
+
+        drawNormalRange: function (canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey) {
+            var normalRangeMin = this.options.get('normalRangeMin'),
+                normalRangeMax = this.options.get('normalRangeMax'),
+                ytop = canvasTop + Math.round(canvasHeight - (canvasHeight * ((normalRangeMax - this.miny) / rangey))),
+                height = Math.round((canvasHeight * (normalRangeMax - normalRangeMin)) / rangey);
+            this.target.drawRect(canvasLeft, ytop, canvasWidth, height, undefined, this.options.get('normalRangeColor')).append();
+        },
+
+        render: function () {
+            var options = this.options,
+                target = this.target,
+                canvasWidth = this.canvasWidth,
+                canvasHeight = this.canvasHeight,
+                vertices = this.vertices,
+                spotRadius = options.get('spotRadius'),
+                regionMap = this.regionMap,
+                rangex, rangey, yvallast,
+                canvasTop, canvasLeft,
+                vertex, path, paths, x, y, xnext, xpos, xposnext,
+                last, next, yvalcount, lineShapes, fillShapes, plen,
+                valueSpots, hlSpotsEnabled, color, xvalues, yvalues, i;
+
+            if (!line._super.render.call(this)) {
+                return;
+            }
+
+            this.scanValues();
+            this.processRangeOptions();
+
+            xvalues = this.xvalues;
+            yvalues = this.yvalues;
+
+            if (!this.yminmax.length || this.yvalues.length < 2) {
+                // empty or all null valuess
+                return;
+            }
+
+            canvasTop = canvasLeft = 0;
+
+            rangex = this.maxx - this.minx === 0 ? 1 : this.maxx - this.minx;
+            rangey = this.maxy - this.miny === 0 ? 1 : this.maxy - this.miny;
+            yvallast = this.yvalues.length - 1;
+
+            if (spotRadius && (canvasWidth < (spotRadius * 4) || canvasHeight < (spotRadius * 4))) {
+                spotRadius = 0;
+            }
+            if (spotRadius) {
+                // adjust the canvas size as required so that spots will fit
+                hlSpotsEnabled = options.get('highlightSpotColor') &&  !options.get('disableInteraction');
+                if (hlSpotsEnabled || options.get('minSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.miny)) {
+                    canvasHeight -= Math.ceil(spotRadius);
+                }
+                if (hlSpotsEnabled || options.get('maxSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.maxy)) {
+                    canvasHeight -= Math.ceil(spotRadius);
+                    canvasTop += Math.ceil(spotRadius);
+                }
+                if (hlSpotsEnabled ||
+                     ((options.get('minSpotColor') || options.get('maxSpotColor')) && (yvalues[0] === this.miny || yvalues[0] === this.maxy))) {
+                    canvasLeft += Math.ceil(spotRadius);
+                    canvasWidth -= Math.ceil(spotRadius);
+                }
+                if (hlSpotsEnabled || options.get('spotColor') ||
+                    (options.get('minSpotColor') || options.get('maxSpotColor') &&
+                        (yvalues[yvallast] === this.miny || yvalues[yvallast] === this.maxy))) {
+                    canvasWidth -= Math.ceil(spotRadius);
+                }
+            }
+
+
+            canvasHeight--;
+
+            if (options.get('normalRangeMin') !== undefined && !options.get('drawNormalOnTop')) {
+                this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey);
+            }
+
+            path = [];
+            paths = [path];
+            last = next = null;
+            yvalcount = yvalues.length;
+            for (i = 0; i < yvalcount; i++) {
+                x = xvalues[i];
+                xnext = xvalues[i + 1];
+                y = yvalues[i];
+                xpos = canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex));
+                xposnext = i < yvalcount - 1 ? canvasLeft + Math.round((xnext - this.minx) * (canvasWidth / rangex)) : canvasWidth;
+                next = xpos + ((xposnext - xpos) / 2);
+                regionMap[i] = [last || 0, next, i];
+                last = next;
+                if (y === null) {
+                    if (i) {
+                        if (yvalues[i - 1] !== null) {
+                            path = [];
+                            paths.push(path);
+                        }
+                        vertices.push(null);
+                    }
+                } else {
+                    if (y < this.miny) {
+                        y = this.miny;
+                    }
+                    if (y > this.maxy) {
+                        y = this.maxy;
+                    }
+                    if (!path.length) {
+                        // previous value was null
+                        path.push([xpos, canvasTop + canvasHeight]);
+                    }
+                    vertex = [xpos, canvasTop + Math.round(canvasHeight - (canvasHeight * ((y - this.miny) / rangey)))];
+                    path.push(vertex);
+                    vertices.push(vertex);
+                }
+            }
+
+            lineShapes = [];
+            fillShapes = [];
+            plen = paths.length;
+            for (i = 0; i < plen; i++) {
+                path = paths[i];
+                if (path.length) {
+                    if (options.get('fillColor')) {
+                        path.push([path[path.length - 1][0], (canvasTop + canvasHeight)]);
+                        fillShapes.push(path.slice(0));
+                        path.pop();
+                    }
+                    // if there's only a single point in this path, then we want to display it
+                    // as a vertical line which means we keep path[0]  as is
+                    if (path.length > 2) {
+                        // else we want the first value
+                        path[0] = [path[0][0], path[1][1]];
+                    }
+                    lineShapes.push(path);
+                }
+            }
+
+            // draw the fill first, then optionally the normal range, then the line on top of that
+            plen = fillShapes.length;
+            for (i = 0; i < plen; i++) {
+                target.drawShape(fillShapes[i],
+                    options.get('fillColor'), options.get('fillColor')).append();
+            }
+
+            if (options.get('normalRangeMin') !== undefined && options.get('drawNormalOnTop')) {
+                this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey);
+            }
+
+            plen = lineShapes.length;
+            for (i = 0; i < plen; i++) {
+                target.drawShape(lineShapes[i], options.get('lineColor'), undefined,
+                    options.get('lineWidth')).append();
+            }
+
+            if (spotRadius && options.get('valueSpots')) {
+                valueSpots = options.get('valueSpots');
+                if (valueSpots.get === undefined) {
+                    valueSpots = new RangeMap(valueSpots);
+                }
+                for (i = 0; i < yvalcount; i++) {
+                    color = valueSpots.get(yvalues[i]);
+                    if (color) {
+                        target.drawCircle(canvasLeft + Math.round((xvalues[i] - this.minx) * (canvasWidth / rangex)),
+                            canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[i] - this.miny) / rangey))),
+                            spotRadius, undefined,
+                            color).append();
+                    }
+                }
+
+            }
+            if (spotRadius && options.get('spotColor') && yvalues[yvallast] !== null) {
+                target.drawCircle(canvasLeft + Math.round((xvalues[xvalues.length - 1] - this.minx) * (canvasWidth / rangex)),
+                    canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[yvallast] - this.miny) / rangey))),
+                    spotRadius, undefined,
+                    options.get('spotColor')).append();
+            }
+            if (this.maxy !== this.minyorg) {
+                if (spotRadius && options.get('minSpotColor')) {
+                    x = xvalues[$.inArray(this.minyorg, yvalues)];
+                    target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)),
+                        canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.minyorg - this.miny) / rangey))),
+                        spotRadius, undefined,
+                        options.get('minSpotColor')).append();
+                }
+                if (spotRadius && options.get('maxSpotColor')) {
+                    x = xvalues[$.inArray(this.maxyorg, yvalues)];
+                    target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)),
+                        canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.maxyorg - this.miny) / rangey))),
+                        spotRadius, undefined,
+                        options.get('maxSpotColor')).append();
+                }
+            }
+
+            this.lastShapeId = target.getLastShapeId();
+            this.canvasTop = canvasTop;
+            target.render();
+        }
+    });
+
+    /**
+     * Bar charts
+     */
+    $.fn.sparkline.bar = bar = createClass($.fn.sparkline._base, barHighlightMixin, {
+        type: 'bar',
+
+        init: function (el, values, options, width, height) {
+            var barWidth = parseInt(options.get('barWidth'), 10),
+                barSpacing = parseInt(options.get('barSpacing'), 10),
+                chartRangeMin = options.get('chartRangeMin'),
+                chartRangeMax = options.get('chartRangeMax'),
+                chartRangeClip = options.get('chartRangeClip'),
+                stackMin = Infinity,
+                stackMax = -Infinity,
+                isStackString, groupMin, groupMax, stackRanges,
+                numValues, i, vlen, range, zeroAxis, xaxisOffset, min, max, clipMin, clipMax,
+                stacked, vlist, j, slen, svals, val, yoffset, yMaxCalc, canvasHeightEf;
+            bar._super.init.call(this, el, values, options, width, height);
+
+            // scan values to determine whether to stack bars
+            for (i = 0, vlen = values.length; i < vlen; i++) {
+                val = values[i];
+                isStackString = typeof(val) === 'string' && val.indexOf(':') > -1;
+                if (isStackString || $.isArray(val)) {
+                    stacked = true;
+                    if (isStackString) {
+                        val = values[i] = normalizeValues(val.split(':'));
+                    }
+                    val = remove(val, null); // min/max will treat null as zero
+                    groupMin = Math.min.apply(Math, val);
+                    groupMax = Math.max.apply(Math, val);
+                    if (groupMin < stackMin) {
+                        stackMin = groupMin;
+                    }
+                    if (groupMax > stackMax) {
+                        stackMax = groupMax;
+                    }
+                }
+            }
+
+            this.stacked = stacked;
+            this.regionShapes = {};
+            this.barWidth = barWidth;
+            this.barSpacing = barSpacing;
+            this.totalBarWidth = barWidth + barSpacing;
+            this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing);
+
+            this.initTarget();
+
+            if (chartRangeClip) {
+                clipMin = chartRangeMin === undefined ? -Infinity : chartRangeMin;
+                clipMax = chartRangeMax === undefined ? Infinity : chartRangeMax;
+            }
+
+            numValues = [];
+            stackRanges = stacked ? [] : numValues;
+            var stackTotals = [];
+            var stackRangesNeg = [];
+            for (i = 0, vlen = values.length; i < vlen; i++) {
+                if (stacked) {
+                    vlist = values[i];
+                    values[i] = svals = [];
+                    stackTotals[i] = 0;
+                    stackRanges[i] = stackRangesNeg[i] = 0;
+                    for (j = 0, slen = vlist.length; j < slen; j++) {
+                        val = svals[j] = chartRangeClip ? clipval(vlist[j], clipMin, clipMax) : vlist[j];
+                        if (val !== null) {
+                            if (val > 0) {
+                                stackTotals[i] += val;
+                            }
+                            if (stackMin < 0 && stackMax > 0) {
+                                if (val < 0) {
+                                    stackRangesNeg[i] += Math.abs(val);
+                                } else {
+                                    stackRanges[i] += val;
+                                }
+                            } else {
+                                stackRanges[i] += Math.abs(val - (val < 0 ? stackMax : stackMin));
+                            }
+                            numValues.push(val);
+                        }
+                    }
+                } else {
+                    val = chartRangeClip ? clipval(values[i], clipMin, clipMax) : values[i];
+                    val = values[i] = normalizeValue(val);
+                    if (val !== null) {
+                        numValues.push(val);
+                    }
+                }
+            }
+            this.max = max = Math.max.apply(Math, numValues);
+            this.min = min = Math.min.apply(Math, numValues);
+            this.stackMax = stackMax = stacked ? Math.max.apply(Math, stackTotals) : max;
+            this.stackMin = stackMin = stacked ? Math.min.apply(Math, numValues) : min;
+
+            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < min)) {
+                min = options.get('chartRangeMin');
+            }
+            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > max)) {
+                max = options.get('chartRangeMax');
+            }
+
+            this.zeroAxis = zeroAxis = options.get('zeroAxis', true);
+            if (min <= 0 && max >= 0 && zeroAxis) {
+                xaxisOffset = 0;
+            } else if (zeroAxis == false) {
+                xaxisOffset = min;
+            } else if (min > 0) {
+                xaxisOffset = min;
+            } else {
+                xaxisOffset = max;
+            }
+            this.xaxisOffset = xaxisOffset;
+
+            range = stacked ? (Math.max.apply(Math, stackRanges) + Math.max.apply(Math, stackRangesNeg)) : max - min;
+
+            // as we plot zero/min values a single pixel line, we add a pixel to all other
+            // values - Reduce the effective canvas size to suit
+            this.canvasHeightEf = (zeroAxis && min < 0) ? this.canvasHeight - 2 : this.canvasHeight - 1;
+
+            if (min < xaxisOffset) {
+                yMaxCalc = (stacked && max >= 0) ? stackMax : max;
+                yoffset = (yMaxCalc - xaxisOffset) / range * this.canvasHeight;
+                if (yoffset !== Math.ceil(yoffset)) {
+                    this.canvasHeightEf -= 2;
+                    yoffset = Math.ceil(yoffset);
+                }
+            } else {
+                yoffset = this.canvasHeight;
+            }
+            this.yoffset = yoffset;
+
+            if ($.isArray(options.get('colorMap'))) {
+                this.colorMapByIndex = options.get('colorMap');
+                this.colorMapByValue = null;
+            } else {
+                this.colorMapByIndex = null;
+                this.colorMapByValue = options.get('colorMap');
+                if (this.colorMapByValue && this.colorMapByValue.get === undefined) {
+                    this.colorMapByValue = new RangeMap(this.colorMapByValue);
+                }
+            }
+
+            this.range = range;
+        },
+
+        getRegion: function (el, x, y) {
+            var result = Math.floor(x / this.totalBarWidth);
+            return (result < 0 || result >= this.values.length) ? undefined : result;
+        },
+
+        getCurrentRegionFields: function () {
+            var currentRegion = this.currentRegion,
+                values = ensureArray(this.values[currentRegion]),
+                result = [],
+                value, i;
+            for (i = values.length; i--;) {
+                value = values[i];
+                result.push({
+                    isNull: value === null,
+                    value: value,
+                    color: this.calcColor(i, value, currentRegion),
+                    offset: currentRegion
+                });
+            }
+            return result;
+        },
+
+        calcColor: function (stacknum, value, valuenum) {
+            var colorMapByIndex = this.colorMapByIndex,
+                colorMapByValue = this.colorMapByValue,
+                options = this.options,
+                color, newColor;
+            if (this.stacked) {
+                color = options.get('stackedBarColor');
+            } else {
+                color = (value < 0) ? options.get('negBarColor') : options.get('barColor');
+            }
+            if (value === 0 && options.get('zeroColor') !== undefined) {
+                color = options.get('zeroColor');
+            }
+            if (colorMapByValue && (newColor = colorMapByValue.get(value))) {
+                color = newColor;
+            } else if (colorMapByIndex && colorMapByIndex.length > valuenum) {
+                color = colorMapByIndex[valuenum];
+            }
+            return $.isArray(color) ? color[stacknum % color.length] : color;
+        },
+
+        /**
+         * Render bar(s) for a region
+         */
+        renderRegion: function (valuenum, highlight) {
+            var vals = this.values[valuenum],
+                options = this.options,
+                xaxisOffset = this.xaxisOffset,
+                result = [],
+                range = this.range,
+                stacked = this.stacked,
+                target = this.target,
+                x = valuenum * this.totalBarWidth,
+                canvasHeightEf = this.canvasHeightEf,
+                yoffset = this.yoffset,
+                y, height, color, isNull, yoffsetNeg, i, valcount, val, minPlotted, allMin;
+
+            vals = $.isArray(vals) ? vals : [vals];
+            valcount = vals.length;
+            val = vals[0];
+            isNull = all(null, vals);
+            allMin = all(xaxisOffset, vals, true);
+
+            if (isNull) {
+                if (options.get('nullColor')) {
+                    color = highlight ? options.get('nullColor') : this.calcHighlightColor(options.get('nullColor'), options);
+                    y = (yoffset > 0) ? yoffset - 1 : yoffset;
+                    return target.drawRect(x, y, this.barWidth - 1, 0, color, color);
+                } else {
+                    return undefined;
+                }
+            }
+            yoffsetNeg = yoffset;
+            for (i = 0; i < valcount; i++) {
+                val = vals[i];
+
+                if (stacked && val === xaxisOffset) {
+                    if (!allMin || minPlotted) {
+                        continue;
+                    }
+                    minPlotted = true;
+                }
+
+                if (range > 0) {
+                    height = Math.floor(canvasHeightEf * ((Math.abs(val - xaxisOffset) / range))) + 1;
+                } else {
+                    height = 1;
+                }
+                if (val < xaxisOffset || (val === xaxisOffset && yoffset === 0)) {
+                    y = yoffsetNeg;
+                    yoffsetNeg += height;
+                } else {
+                    y = yoffset - height;
+                    yoffset -= height;
+                }
+                color = this.calcColor(i, val, valuenum);
+                if (highlight) {
+                    color = this.calcHighlightColor(color, options);
+                }
+                result.push(target.drawRect(x, y, this.barWidth - 1, height - 1, color, color));
+            }
+            if (result.length === 1) {
+                return result[0];
+            }
+            return result;
+        }
+    });
+
+    /**
+     * Tristate charts
+     */
+    $.fn.sparkline.tristate = tristate = createClass($.fn.sparkline._base, barHighlightMixin, {
+        type: 'tristate',
+
+        init: function (el, values, options, width, height) {
+            var barWidth = parseInt(options.get('barWidth'), 10),
+                barSpacing = parseInt(options.get('barSpacing'), 10);
+            tristate._super.init.call(this, el, values, options, width, height);
+
+            this.regionShapes = {};
+            this.barWidth = barWidth;
+            this.barSpacing = barSpacing;
+            this.totalBarWidth = barWidth + barSpacing;
+            this.values = $.map(values, Number);
+            this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing);
+
+            if ($.isArray(options.get('colorMap'))) {
+                this.colorMapByIndex = options.get('colorMap');
+                this.colorMapByValue = null;
+            } else {
+                this.colorMapByIndex = null;
+                this.colorMapByValue = options.get('colorMap');
+                if (this.colorMapByValue && this.colorMapByValue.get === undefined) {
+                    this.colorMapByValue = new RangeMap(this.colorMapByValue);
+                }
+            }
+            this.initTarget();
+        },
+
+        getRegion: function (el, x, y) {
+            return Math.floor(x / this.totalBarWidth);
+        },
+
+        getCurrentRegionFields: function () {
+            var currentRegion = this.currentRegion;
+            return {
+                isNull: this.values[currentRegion] === undefined,
+                value: this.values[currentRegion],
+                color: this.calcColor(this.values[currentRegion], currentRegion),
+                offset: currentRegion
+            };
+        },
+
+        calcColor: function (value, valuenum) {
+            var values = this.values,
+                options = this.options,
+                colorMapByIndex = this.colorMapByIndex,
+                colorMapByValue = this.colorMapByValue,
+                color, newColor;
+
+            if (colorMapByValue && (newColor = colorMapByValue.get(value))) {
+                color = newColor;
+            } else if (colorMapByIndex && colorMapByIndex.length > valuenum) {
+                color = colorMapByIndex[valuenum];
+            } else if (values[valuenum] < 0) {
+                color = options.get('negBarColor');
+            } else if (values[valuenum] > 0) {
+                color = options.get('posBarColor');
+            } else {
+                color = options.get('zeroBarColor');
+            }
+            return color;
+        },
+
+        renderRegion: function (valuenum, highlight) {
+            var values = this.values,
+                options = this.options,
+                target = this.target,
+                canvasHeight, height, halfHeight,
+                x, y, color;
+
+            canvasHeight = target.pixelHeight;
+            halfHeight = Math.round(canvasHeight / 2);
+
+            x = valuenum * this.totalBarWidth;
+            if (values[valuenum] < 0) {
+                y = halfHeight;
+                height = halfHeight - 1;
+            } else if (values[valuenum] > 0) {
+                y = 0;
+                height = halfHeight - 1;
+            } else {
+                y = halfHeight - 1;
+                height = 2;
+            }
+            color = this.calcColor(values[valuenum], valuenum);
+            if (color === null) {
+                return;
+            }
+            if (highlight) {
+                color = this.calcHighlightColor(color, options);
+            }
+            return target.drawRect(x, y, this.barWidth - 1, height - 1, color, color);
+        }
+    });
+
+    /**
+     * Discrete charts
+     */
+    $.fn.sparkline.discrete = discrete = createClass($.fn.sparkline._base, barHighlightMixin, {
+        type: 'discrete',
+
+        init: function (el, values, options, width, height) {
+            discrete._super.init.call(this, el, values, options, width, height);
+
+            this.regionShapes = {};
+            this.values = values = $.map(values, Number);
+            this.min = Math.min.apply(Math, values);
+            this.max = Math.max.apply(Math, values);
+            this.range = this.max - this.min;
+            this.width = width = options.get('width') === 'auto' ? values.length * 2 : this.width;
+            this.interval = Math.floor(width / values.length);
+            this.itemWidth = width / values.length;
+            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.min)) {
+                this.min = options.get('chartRangeMin');
+            }
+            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.max)) {
+                this.max = options.get('chartRangeMax');
+            }
+            this.initTarget();
+            if (this.target) {
+                this.lineHeight = options.get('lineHeight') === 'auto' ? Math.round(this.canvasHeight * 0.3) : options.get('lineHeight');
+            }
+        },
+
+        getRegion: function (el, x, y) {
+            return Math.floor(x / this.itemWidth);
+        },
+
+        getCurrentRegionFields: function () {
+            var currentRegion = this.currentRegion;
+            return {
+                isNull: this.values[currentRegion] === undefined,
+                value: this.values[currentRegion],
+                offset: currentRegion
+            };
+        },
+
+        renderRegion: function (valuenum, highlight) {
+            var values = this.values,
+                options = this.options,
+                min = this.min,
+                max = this.max,
+                range = this.range,
+                interval = this.interval,
+                target = this.target,
+                canvasHeight = this.canvasHeight,
+                lineHeight = this.lineHeight,
+                pheight = canvasHeight - lineHeight,
+                ytop, val, color, x;
+
+            val = clipval(values[valuenum], min, max);
+            x = valuenum * interval;
+            ytop = Math.round(pheight - pheight * ((val - min) / range));
+            color = (options.get('thresholdColor') && val < options.get('thresholdValue')) ? options.get('thresholdColor') : options.get('lineColor');
+            if (highlight) {
+                color = this.calcHighlightColor(color, options);
+            }
+            return target.drawLine(x, ytop, x, ytop + lineHeight, color);
+        }
+    });
+
+    /**
+     * Bullet charts
+     */
+    $.fn.sparkline.bullet = bullet = createClass($.fn.sparkline._base, {
+        type: 'bullet',
+
+        init: function (el, values, options, width, height) {
+            var min, max, vals;
+            bullet._super.init.call(this, el, values, options, width, height);
+
+            // values: target, performance, range1, range2, range3
+            this.values = values = normalizeValues(values);
+            // target or performance could be null
+            vals = values.slice();
+            vals[0] = vals[0] === null ? vals[2] : vals[0];
+            vals[1] = values[1] === null ? vals[2] : vals[1];
+            min = Math.min.apply(Math, values);
+            max = Math.max.apply(Math, values);
+            if (options.get('base') === undefined) {
+                min = min < 0 ? min : 0;
+            } else {
+                min = options.get('base');
+            }
+            this.min = min;
+            this.max = max;
+            this.range = max - min;
+            this.shapes = {};
+            this.valueShapes = {};
+            this.regiondata = {};
+            this.width = width = options.get('width') === 'auto' ? '4.0em' : width;
+            this.target = this.$el.simpledraw(width, height, options.get('composite'));
+            if (!values.length) {
+                this.disabled = true;
+            }
+            this.initTarget();
+        },
+
+        getRegion: function (el, x, y) {
+            var shapeid = this.target.getShapeAt(el, x, y);
+            return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined;
+        },
+
+        getCurrentRegionFields: function () {
+            var currentRegion = this.currentRegion;
+            return {
+                fieldkey: currentRegion.substr(0, 1),
+                value: this.values[currentRegion.substr(1)],
+                region: currentRegion
+            };
+        },
+
+        changeHighlight: function (highlight) {
+            var currentRegion = this.currentRegion,
+                shapeid = this.valueShapes[currentRegion],
+                shape;
+            delete this.shapes[shapeid];
+            switch (currentRegion.substr(0, 1)) {
+                case 'r':
+                    shape = this.renderRange(currentRegion.substr(1), highlight);
+                    break;
+                case 'p':
+                    shape = this.renderPerformance(highlight);
+                    break;
+                case 't':
+                    shape = this.renderTarget(highlight);
+                    break;
+            }
+            this.valueShapes[currentRegion] = shape.id;
+            this.shapes[shape.id] = currentRegion;
+            this.target.replaceWithShape(shapeid, shape);
+        },
+
+        renderRange: function (rn, highlight) {
+            var rangeval = this.values[rn],
+                rangewidth = Math.round(this.canvasWidth * ((rangeval - this.min) / this.range)),
+                color = this.options.get('rangeColors')[rn - 2];
+            if (highlight) {
+                color = this.calcHighlightColor(color, this.options);
+            }
+            return this.target.drawRect(0, 0, rangewidth - 1, this.canvasHeight - 1, color, color);
+        },
+
+        renderPerformance: function (highlight) {
+            var perfval = this.values[1],
+                perfwidth = Math.round(this.canvasWidth * ((perfval - this.min) / this.range)),
+                color = this.options.get('performanceColor');
+            if (highlight) {
+                color = this.calcHighlightColor(color, this.options);
+            }
+            return this.target.drawRect(0, Math.round(this.canvasHeight * 0.3), perfwidth - 1,
+                Math.round(this.canvasHeight * 0.4) - 1, color, color);
+        },
+
+        renderTarget: function (highlight) {
+            var targetval = this.values[0],
+                x = Math.round(this.canvasWidth * ((targetval - this.min) / this.range) - (this.options.get('targetWidth') / 2)),
+                targettop = Math.round(this.canvasHeight * 0.10),
+                targetheight = this.canvasHeight - (targettop * 2),
+                color = this.options.get('targetColor');
+            if (highlight) {
+                color = this.calcHighlightColor(color, this.options);
+            }
+            return this.target.drawRect(x, targettop, this.options.get('targetWidth') - 1, targetheight - 1, color, color);
+        },
+
+        render: function () {
+            var vlen = this.values.length,
+                target = this.target,
+                i, shape;
+            if (!bullet._super.render.call(this)) {
+                return;
+            }
+            for (i = 2; i < vlen; i++) {
+                shape = this.renderRange(i).append();
+                this.shapes[shape.id] = 'r' + i;
+                this.valueShapes['r' + i] = shape.id;
+            }
+            if (this.values[1] !== null) {
+                shape = this.renderPerformance().append();
+                this.shapes[shape.id] = 'p1';
+                this.valueShapes.p1 = shape.id;
+            }
+            if (this.values[0] !== null) {
+                shape = this.renderTarget().append();
+                this.shapes[shape.id] = 't0';
+                this.valueShapes.t0 = shape.id;
+            }
+            target.render();
+        }
+    });
+
+    /**
+     * Pie charts
+     */
+    $.fn.sparkline.pie = pie = createClass($.fn.sparkline._base, {
+        type: 'pie',
+
+        init: function (el, values, options, width, height) {
+            var total = 0, i;
+
+            pie._super.init.call(this, el, values, options, width, height);
+
+            this.shapes = {}; // map shape ids to value offsets
+            this.valueShapes = {}; // maps value offsets to shape ids
+            this.values = values = $.map(values, Number);
+
+            if (options.get('width') === 'auto') {
+                this.width = this.height;
+            }
+
+            if (values.length > 0) {
+                for (i = values.length; i--;) {
+                    total += values[i];
+                }
+            }
+            this.total = total;
+            this.initTarget();
+            this.radius = Math.floor(Math.min(this.canvasWidth, this.canvasHeight) / 2);
+        },
+
+        getRegion: function (el, x, y) {
+            var shapeid = this.target.getShapeAt(el, x, y);
+            return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined;
+        },
+
+        getCurrentRegionFields: function () {
+            var currentRegion = this.currentRegion;
+            return {
+                isNull: this.values[currentRegion] === undefined,
+                value: this.values[currentRegion],
+                percent: this.values[currentRegion] / this.total * 100,
+                color: this.options.get('sliceColors')[currentRegion % this.options.get('sliceColors').length],
+                offset: currentRegion
+            };
+        },
+
+        changeHighlight: function (highlight) {
+            var currentRegion = this.currentRegion,
+                 newslice = this.renderSlice(currentRegion, highlight),
+                 shapeid = this.valueShapes[currentRegion];
+            delete this.shapes[shapeid];
+            this.target.replaceWithShape(shapeid, newslice);
+            this.valueShapes[currentRegion] = newslice.id;
+            this.shapes[newslice.id] = currentRegion;
+        },
+
+        renderSlice: function (valuenum, highlight) {
+            var target = this.target,
+                options = this.options,
+                radius = this.radius,
+                borderWidth = options.get('borderWidth'),
+                offset = options.get('offset'),
+                circle = 2 * Math.PI,
+                values = this.values,
+                total = this.total,
+                next = offset ? (2*Math.PI)*(offset/360) : 0,
+                start, end, i, vlen, color;
+
+            vlen = values.length;
+            for (i = 0; i < vlen; i++) {
+                start = next;
+                end = next;
+                if (total > 0) {  // avoid divide by zero
+                    end = next + (circle * (values[i] / total));
+                }
+                if (valuenum === i) {
+                    color = options.get('sliceColors')[i % options.get('sliceColors').length];
+                    if (highlight) {
+                        color = this.calcHighlightColor(color, options);
+                    }
+
+                    return target.drawPieSlice(radius, radius, radius - borderWidth, start, end, undefined, color);
+                }
+                next = end;
+            }
+        },
+
+        render: function () {
+            var target = this.target,
+                values = this.values,
+                options = this.options,
+                radius = this.radius,
+                borderWidth = options.get('borderWidth'),
+                shape, i;
+
+            if (!pie._super.render.call(this)) {
+                return;
+            }
+            if (borderWidth) {
+                target.drawCircle(radius, radius, Math.floor(radius - (borderWidth / 2)),
+                    options.get('borderColor'), undefined, borderWidth).append();
+            }
+            for (i = values.length; i--;) {
+                if (values[i]) { // don't render zero values
+                    shape = this.renderSlice(i).append();
+                    this.valueShapes[i] = shape.id; // store just the shapeid
+                    this.shapes[shape.id] = i;
+                }
+            }
+            target.render();
+        }
+    });
+
+    /**
+     * Box plots
+     */
+    $.fn.sparkline.box = box = createClass($.fn.sparkline._base, {
+        type: 'box',
+
+        init: function (el, values, options, width, height) {
+            box._super.init.call(this, el, values, options, width, height);
+            this.values = $.map(values, Number);
+            this.width = options.get('width') === 'auto' ? '4.0em' : width;
+            this.initTarget();
+            if (!this.values.length) {
+                this.disabled = 1;
+            }
+        },
+
+        /**
+         * Simulate a single region
+         */
+        getRegion: function () {
+            return 1;
+        },
+
+        getCurrentRegionFields: function () {
+            var result = [
+                { field: 'lq', value: this.quartiles[0] },
+                { field: 'med', value: this.quartiles[1] },
+                { field: 'uq', value: this.quartiles[2] }
+            ];
+            if (this.loutlier !== undefined) {
+                result.push({ field: 'lo', value: this.loutlier});
+            }
+            if (this.routlier !== undefined) {
+                result.push({ field: 'ro', value: this.routlier});
+            }
+            if (this.lwhisker !== undefined) {
+                result.push({ field: 'lw', value: this.lwhisker});
+            }
+            if (this.rwhisker !== undefined) {
+                result.push({ field: 'rw', value: this.rwhisker});
+            }
+            return result;
+        },
+
+        render: function () {
+            var target = this.target,
+                values = this.values,
+                vlen = values.length,
+                options = this.options,
+                canvasWidth = this.canvasWidth,
+                canvasHeight = this.canvasHeight,
+                minValue = options.get('chartRangeMin') === undefined ? Math.min.apply(Math, values) : options.get('chartRangeMin'),
+                maxValue = options.get('chartRangeMax') === undefined ? Math.max.apply(Math, values) : options.get('chartRangeMax'),
+                canvasLeft = 0,
+                lwhisker, loutlier, iqr, q1, q2, q3, rwhisker, routlier, i,
+                size, unitSize;
+
+            if (!box._super.render.call(this)) {
+                return;
+            }
+
+            if (options.get('raw')) {
+                if (options.get('showOutliers') && values.length > 5) {
+                    loutlier = values[0];
+                    lwhisker = values[1];
+                    q1 = values[2];
+                    q2 = values[3];
+                    q3 = values[4];
+                    rwhisker = values[5];
+                    routlier = values[6];
+                } else {
+                    lwhisker = values[0];
+                    q1 = values[1];
+                    q2 = values[2];
+                    q3 = values[3];
+                    rwhisker = values[4];
+                }
+            } else {
+                values.sort(function (a, b) { return a - b; });
+                q1 = quartile(values, 1);
+                q2 = quartile(values, 2);
+                q3 = quartile(values, 3);
+                iqr = q3 - q1;
+                if (options.get('showOutliers')) {
+                    lwhisker = rwhisker = undefined;
+                    for (i = 0; i < vlen; i++) {
+                        if (lwhisker === undefined && values[i] > q1 - (iqr * options.get('outlierIQR'))) {
+                            lwhisker = values[i];
+                        }
+                        if (values[i] < q3 + (iqr * options.get('outlierIQR'))) {
+                            rwhisker = values[i];
+                        }
+                    }
+                    loutlier = values[0];
+                    routlier = values[vlen - 1];
+                } else {
+                    lwhisker = values[0];
+                    rwhisker = values[vlen - 1];
+                }
+            }
+            this.quartiles = [q1, q2, q3];
+            this.lwhisker = lwhisker;
+            this.rwhisker = rwhisker;
+            this.loutlier = loutlier;
+            this.routlier = routlier;
+
+            unitSize = canvasWidth / (maxValue - minValue + 1);
+            if (options.get('showOutliers')) {
+                canvasLeft = Math.ceil(options.get('spotRadius'));
+                canvasWidth -= 2 * Math.ceil(options.get('spotRadius'));
+                unitSize = canvasWidth / (maxValue - minValue + 1);
+                if (loutlier < lwhisker) {
+                    target.drawCircle((loutlier - minValue) * unitSize + canvasLeft,
+                        canvasHeight / 2,
+                        options.get('spotRadius'),
+                        options.get('outlierLineColor'),
+                        options.get('outlierFillColor')).append();
+                }
+                if (routlier > rwhisker) {
+                    target.drawCircle((routlier - minValue) * unitSize + canvasLeft,
+                        canvasHeight / 2,
+                        options.get('spotRadius'),
+                        options.get('outlierLineColor'),
+                        options.get('outlierFillColor')).append();
+                }
+            }
+
+            // box
+            target.drawRect(
+                Math.round((q1 - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight * 0.1),
+                Math.round((q3 - q1) * unitSize),
+                Math.round(canvasHeight * 0.8),
+                options.get('boxLineColor'),
+                options.get('boxFillColor')).append();
+            // left whisker
+            target.drawLine(
+                Math.round((lwhisker - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight / 2),
+                Math.round((q1 - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight / 2),
+                options.get('lineColor')).append();
+            target.drawLine(
+                Math.round((lwhisker - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight / 4),
+                Math.round((lwhisker - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight - canvasHeight / 4),
+                options.get('whiskerColor')).append();
+            // right whisker
+            target.drawLine(Math.round((rwhisker - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight / 2),
+                Math.round((q3 - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight / 2),
+                options.get('lineColor')).append();
+            target.drawLine(
+                Math.round((rwhisker - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight / 4),
+                Math.round((rwhisker - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight - canvasHeight / 4),
+                options.get('whiskerColor')).append();
+            // median line
+            target.drawLine(
+                Math.round((q2 - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight * 0.1),
+                Math.round((q2 - minValue) * unitSize + canvasLeft),
+                Math.round(canvasHeight * 0.9),
+                options.get('medianColor')).append();
+            if (options.get('target')) {
+                size = Math.ceil(options.get('spotRadius'));
+                target.drawLine(
+                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft),
+                    Math.round((canvasHeight / 2) - size),
+                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft),
+                    Math.round((canvasHeight / 2) + size),
+                    options.get('targetColor')).append();
+                target.drawLine(
+                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft - size),
+                    Math.round(canvasHeight / 2),
+                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft + size),
+                    Math.round(canvasHeight / 2),
+                    options.get('targetColor')).append();
+            }
+            target.render();
+        }
+    });
+
+    // Setup a very simple "virtual canvas" to make drawing the few shapes we need easier
+    // This is accessible as $(foo).simpledraw()
+
+    VShape = createClass({
+        init: function (target, id, type, args) {
+            this.target = target;
+            this.id = id;
+            this.type = type;
+            this.args = args;
+        },
+        append: function () {
+            this.target.appendShape(this);
+            return this;
+        }
+    });
+
+    VCanvas_base = createClass({
+        _pxregex: /(\d+)(px)?\s*$/i,
+
+        init: function (width, height, target) {
+            if (!width) {
+                return;
+            }
+            this.width = width;
+            this.height = height;
+            this.target = target;
+            this.lastShapeId = null;
+            if (target[0]) {
+                target = target[0];
+            }
+            $.data(target, '_jqs_vcanvas', this);
+        },
+
+        drawLine: function (x1, y1, x2, y2, lineColor, lineWidth) {
+            return this.drawShape([[x1, y1], [x2, y2]], lineColor, lineWidth);
+        },
+
+        drawShape: function (path, lineColor, fillColor, lineWidth) {
+            return this._genShape('Shape', [path, lineColor, fillColor, lineWidth]);
+        },
+
+        drawCircle: function (x, y, radius, lineColor, fillColor, lineWidth) {
+            return this._genShape('Circle', [x, y, radius, lineColor, fillColor, lineWidth]);
+        },
+
+        drawPieSlice: function (x, y, radius, startAngle, endAngle, lineColor, fillColor) {
+            return this._genShape('PieSlice', [x, y, radius, startAngle, endAngle, lineColor, fillColor]);
+        },
+
+        drawRect: function (x, y, width, height, lineColor, fillColor) {
+            return this._genShape('Rect', [x, y, width, height, lineColor, fillColor]);
+        },
+
+        getElement: function () {
+            return this.canvas;
+        },
+
+        /**
+         * Return the most recently inserted shape id
+         */
+        getLastShapeId: function () {
+            return this.lastShapeId;
+        },
+
+        /**
+         * Clear and reset the canvas
+         */
+        reset: function () {
+            alert('reset not implemented');
+        },
+
+        _insert: function (el, target) {
+            $(target).html(el);
+        },
+
+        /**
+         * Calculate the pixel dimensions of the canvas
+         */
+        _calculatePixelDims: function (width, height, canvas) {
+            // XXX This should probably be a configurable option
+            var match;
+            match = this._pxregex.exec(height);
+            if (match) {
+                this.pixelHeight = match[1];
+            } else {
+                this.pixelHeight = $(canvas).height();
+            }
+            match = this._pxregex.exec(width);
+            if (match) {
+                this.pixelWidth = match[1];
+            } else {
+                this.pixelWidth = $(canvas).width();
+            }
+        },
+
+        /**
+         * Generate a shape object and id for later rendering
+         */
+        _genShape: function (shapetype, shapeargs) {
+            var id = shapeCount++;
+            shapeargs.unshift(id);
+            return new VShape(this, id, shapetype, shapeargs);
+        },
+
+        /**
+         * Add a shape to the end of the render queue
+         */
+        appendShape: function (shape) {
+            alert('appendShape not implemented');
+        },
+
+        /**
+         * Replace one shape with another
+         */
+        replaceWithShape: function (shapeid, shape) {
+            alert('replaceWithShape not implemented');
+        },
+
+        /**
+         * Insert one shape after another in the render queue
+         */
+        insertAfterShape: function (shapeid, shape) {
+            alert('insertAfterShape not implemented');
+        },
+
+        /**
+         * Remove a shape from the queue
+         */
+        removeShapeId: function (shapeid) {
+            alert('removeShapeId not implemented');
+        },
+
+        /**
+         * Find a shape at the specified x/y co-ordinates
+         */
+        getShapeAt: function (el, x, y) {
+            alert('getShapeAt not implemented');
+        },
+
+        /**
+         * Render all queued shapes onto the canvas
+         */
+        render: function () {
+            alert('render not implemented');
+        }
+    });
+
+    VCanvas_canvas = createClass(VCanvas_base, {
+        init: function (width, height, target, interact) {
+            VCanvas_canvas._super.init.call(this, width, height, target);
+            this.canvas = document.createElement('canvas');
+            if (target[0]) {
+                target = target[0];
+            }
+            $.data(target, '_jqs_vcanvas', this);
+            $(this.canvas).css({ display: 'inline-block', width: width, height: height, verticalAlign: 'top' });
+            this._insert(this.canvas, target);
+            this._calculatePixelDims(width, height, this.canvas);
+            this.canvas.width = this.pixelWidth;
+            this.canvas.height = this.pixelHeight;
+            this.interact = interact;
+            this.shapes = {};
+            this.shapeseq = [];
+            this.currentTargetShapeId = undefined;
+            $(this.canvas).css({width: this.pixelWidth, height: this.pixelHeight});
+        },
+
+        _getContext: function (lineColor, fillColor, lineWidth) {
+            var context = this.canvas.getContext('2d');
+            if (lineColor !== undefined) {
+                context.strokeStyle = lineColor;
+            }
+            context.lineWidth = lineWidth === undefined ? 1 : lineWidth;
+            if (fillColor !== undefined) {
+                context.fillStyle = fillColor;
+            }
+            return context;
+        },
+
+        reset: function () {
+            var context = this._getContext();
+            context.clearRect(0, 0, this.pixelWidth, this.pixelHeight);
+            this.shapes = {};
+            this.shapeseq = [];
+            this.currentTargetShapeId = undefined;
+        },
+
+        _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) {
+            var context = this._getContext(lineColor, fillColor, lineWidth),
+                i, plen;
+            context.beginPath();
+            context.moveTo(path[0][0] + 0.5, path[0][1] + 0.5);
+            for (i = 1, plen = path.length; i < plen; i++) {
+                context.lineTo(path[i][0] + 0.5, path[i][1] + 0.5); // the 0.5 offset gives us crisp pixel-width lines
+            }
+            if (lineColor !== undefined) {
+                context.stroke();
+            }
+            if (fillColor !== undefined) {
+                context.fill();
+            }
+            if (this.targetX !== undefined && this.targetY !== undefined &&
+                context.isPointInPath(this.targetX, this.targetY)) {
+                this.currentTargetShapeId = shapeid;
+            }
+        },
+
+        _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) {
+            var context = this._getContext(lineColor, fillColor, lineWidth);
+            context.beginPath();
+            context.arc(x, y, radius, 0, 2 * Math.PI, false);
+            if (this.targetX !== undefined && this.targetY !== undefined &&
+                context.isPointInPath(this.targetX, this.targetY)) {
+                this.currentTargetShapeId = shapeid;
+            }
+            if (lineColor !== undefined) {
+                context.stroke();
+            }
+            if (fillColor !== undefined) {
+                context.fill();
+            }
+        },
+
+        _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) {
+            var context = this._getContext(lineColor, fillColor);
+            context.beginPath();
+            context.moveTo(x, y);
+            context.arc(x, y, radius, startAngle, endAngle, false);
+            context.lineTo(x, y);
+            context.closePath();
+            if (lineColor !== undefined) {
+                context.stroke();
+            }
+            if (fillColor) {
+                context.fill();
+            }
+            if (this.targetX !== undefined && this.targetY !== undefined &&
+                context.isPointInPath(this.targetX, this.targetY)) {
+                this.currentTargetShapeId = shapeid;
+            }
+        },
+
+        _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) {
+            return this._drawShape(shapeid, [[x, y], [x + width, y], [x + width, y + height], [x, y + height], [x, y]], lineColor, fillColor);
+        },
+
+        appendShape: function (shape) {
+            this.shapes[shape.id] = shape;
+            this.shapeseq.push(shape.id);
+            this.lastShapeId = shape.id;
+            return shape.id;
+        },
+
+        replaceWithShape: function (shapeid, shape) {
+            var shapeseq = this.shapeseq,
+                i;
+            this.shapes[shape.id] = shape;
+            for (i = shapeseq.length; i--;) {
+                if (shapeseq[i] == shapeid) {
+                    shapeseq[i] = shape.id;
+                }
+            }
+            delete this.shapes[shapeid];
+        },
+
+        replaceWithShapes: function (shapeids, shapes) {
+            var shapeseq = this.shapeseq,
+                shapemap = {},
+                sid, i, first;
+
+            for (i = shapeids.length; i--;) {
+                shapemap[shapeids[i]] = true;
+            }
+            for (i = shapeseq.length; i--;) {
+                sid = shapeseq[i];
+                if (shapemap[sid]) {
+                    shapeseq.splice(i, 1);
+                    delete this.shapes[sid];
+                    first = i;
+                }
+            }
+            for (i = shapes.length; i--;) {
+                shapeseq.splice(first, 0, shapes[i].id);
+                this.shapes[shapes[i].id] = shapes[i];
+            }
+
+        },
+
+        insertAfterShape: function (shapeid, shape) {
+            var shapeseq = this.shapeseq,
+                i;
+            for (i = shapeseq.length; i--;) {
+                if (shapeseq[i] === shapeid) {
+                    shapeseq.splice(i + 1, 0, shape.id);
+                    this.shapes[shape.id] = shape;
+                    return;
+                }
+            }
+        },
+
+        removeShapeId: function (shapeid) {
+            var shapeseq = this.shapeseq,
+                i;
+            for (i = shapeseq.length; i--;) {
+                if (shapeseq[i] === shapeid) {
+                    shapeseq.splice(i, 1);
+                    break;
+                }
+            }
+            delete this.shapes[shapeid];
+        },
+
+        getShapeAt: function (el, x, y) {
+            this.targetX = x;
+            this.targetY = y;
+            this.render();
+            return this.currentTargetShapeId;
+        },
+
+        render: function () {
+            var shapeseq = this.shapeseq,
+                shapes = this.shapes,
+                shapeCount = shapeseq.length,
+                context = this._getContext(),
+                shapeid, shape, i;
+            context.clearRect(0, 0, this.pixelWidth, this.pixelHeight);
+            for (i = 0; i < shapeCount; i++) {
+                shapeid = shapeseq[i];
+                shape = shapes[shapeid];
+                this['_draw' + shape.type].apply(this, shape.args);
+            }
+            if (!this.interact) {
+                // not interactive so no need to keep the shapes array
+                this.shapes = {};
+                this.shapeseq = [];
+            }
+        }
+
+    });
+
+    VCanvas_vml = createClass(VCanvas_base, {
+        init: function (width, height, target) {
+            var groupel;
+            VCanvas_vml._super.init.call(this, width, height, target);
+            if (target[0]) {
+                target = target[0];
+            }
+            $.data(target, '_jqs_vcanvas', this);
+            this.canvas = document.createElement('span');
+            $(this.canvas).css({ display: 'inline-block', position: 'relative', overflow: 'hidden', width: width, height: height, margin: '0px', padding: '0px', verticalAlign: 'top'});
+            this._insert(this.canvas, target);
+            this._calculatePixelDims(width, height, this.canvas);
+            this.canvas.width = this.pixelWidth;
+            this.canvas.height = this.pixelHeight;
+            groupel = '<v:group coordorigin="0 0" coordsize="' + this.pixelWidth + ' ' + this.pixelHeight + '"' +
+                    ' style="position:absolute;top:0;left:0;width:' + this.pixelWidth + 'px;height=' + this.pixelHeight + 'px;"></v:group>';
+            this.canvas.insertAdjacentHTML('beforeEnd', groupel);
+            this.group = $(this.canvas).children()[0];
+            this.rendered = false;
+            this.prerender = '';
+        },
+
+        _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) {
+            var vpath = [],
+                initial, stroke, fill, closed, vel, plen, i;
+            for (i = 0, plen = path.length; i < plen; i++) {
+                vpath[i] = '' + (path[i][0]) + ',' + (path[i][1]);
+            }
+            initial = vpath.splice(0, 1);
+            lineWidth = lineWidth === undefined ? 1 : lineWidth;
+            stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" ';
+            fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" ';
+            closed = vpath[0] === vpath[vpath.length - 1] ? 'x ' : '';
+            vel = '<v:shape coordorigin="0 0" coordsize="' + this.pixelWidth + ' ' + this.pixelHeight + '" ' +
+                 ' id="jqsshape' + shapeid + '" ' +
+                 stroke +
+                 fill +
+                ' style="position:absolute;left:0px;top:0px;height:' + this.pixelHeight + 'px;width:' + this.pixelWidth + 'px;padding:0px;margin:0px;" ' +
+                ' path="m ' + initial + ' l ' + vpath.join(', ') + ' ' + closed + 'e">' +
+                ' </v:shape>';
+            return vel;
+        },
+
+        _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) {
+            var stroke, fill, vel;
+            x -= radius;
+            y -= radius;
+            stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" ';
+            fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" ';
+            vel = '<v:oval ' +
+                 ' id="jqsshape' + shapeid + '" ' +
+                stroke +
+                fill +
+                ' style="position:absolute;top:' + y + 'px; left:' + x + 'px; width:' + (radius * 2) + 'px; height:' + (radius * 2) + 'px"></v:oval>';
+            return vel;
+
+        },
+
+        _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) {
+            var vpath, startx, starty, endx, endy, stroke, fill, vel;
+            if (startAngle === endAngle) {
+                return '';  // VML seems to have problem when start angle equals end angle.
+            }
+            if ((endAngle - startAngle) === (2 * Math.PI)) {
+                startAngle = 0.0;  // VML seems to have a problem when drawing a full circle that doesn't start 0
+                endAngle = (2 * Math.PI);
+            }
+
+            startx = x + Math.round(Math.cos(startAngle) * radius);
+            starty = y + Math.round(Math.sin(startAngle) * radius);
+            endx = x + Math.round(Math.cos(endAngle) * radius);
+            endy = y + Math.round(Math.sin(endAngle) * radius);
+
+            if (startx === endx && starty === endy) {
+                if ((endAngle - startAngle) < Math.PI) {
+                    // Prevent very small slices from being mistaken as a whole pie
+                    return '';
+                }
+                // essentially going to be the entire circle, so ignore startAngle
+                startx = endx = x + radius;
+                starty = endy = y;
+            }
+
+            if (startx === endx && starty === endy && (endAngle - startAngle) < Math.PI) {
+                return '';
+            }
+
+            vpath = [x - radius, y - radius, x + radius, y + radius, startx, starty, endx, endy];
+            stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="1px" strokeColor="' + lineColor + '" ';
+            fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" ';
+            vel = '<v:shape coordorigin="0 0" coordsize="' + this.pixelWidth + ' ' + this.pixelHeight + '" ' +
+                 ' id="jqsshape' + shapeid + '" ' +
+                 stroke +
+                 fill +
+                ' style="position:absolute;left:0px;top:0px;height:' + this.pixelHeight + 'px;width:' + this.pixelWidth + 'px;padding:0px;margin:0px;" ' +
+                ' path="m ' + x + ',' + y + ' wa ' + vpath.join(', ') + ' x e">' +
+                ' </v:shape>';
+            return vel;
+        },
+
+        _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) {
+            return this._drawShape(shapeid, [[x, y], [x, y + height], [x + width, y + height], [x + width, y], [x, y]], lineColor, fillColor);
+        },
+
+        reset: function () {
+            this.group.innerHTML = '';
+        },
+
+        appendShape: function (shape) {
+            var vel = this['_draw' + shape.type].apply(this, shape.args);
+            if (this.rendered) {
+                this.group.insertAdjacentHTML('beforeEnd', vel);
+            } else {
+                this.prerender += vel;
+            }
+            this.lastShapeId = shape.id;
+            return shape.id;
+        },
+
+        replaceWithShape: function (shapeid, shape) {
+            var existing = $('#jqsshape' + shapeid),
+                vel = this['_draw' + shape.type].apply(this, shape.args);
+            existing[0].outerHTML = vel;
+        },
+
+        replaceWithShapes: function (shapeids, shapes) {
+            // replace the first shapeid with all the new shapes then toast the remaining old shapes
+            var existing = $('#jqsshape' + shapeids[0]),
+                replace = '',
+                slen = shapes.length,
+                i;
+            for (i = 0; i < slen; i++) {
+                replace += this['_draw' + shapes[i].type].apply(this, shapes[i].args);
+            }
+            existing[0].outerHTML = replace;
+            for (i = 1; i < shapeids.length; i++) {
+                $('#jqsshape' + shapeids[i]).remove();
+            }
+        },
+
+        insertAfterShape: function (shapeid, shape) {
+            var existing = $('#jqsshape' + shapeid),
+                 vel = this['_draw' + shape.type].apply(this, shape.args);
+            existing[0].insertAdjacentHTML('afterEnd', vel);
+        },
+
+        removeShapeId: function (shapeid) {
+            var existing = $('#jqsshape' + shapeid);
+            this.group.removeChild(existing[0]);
+        },
+
+        getShapeAt: function (el, x, y) {
+            var shapeid = el.id.substr(8);
+            return shapeid;
+        },
+
+        render: function () {
+            if (!this.rendered) {
+                // batch the intial render into a single repaint
+                this.group.innerHTML = this.prerender;
+                this.rendered = true;
+            }
+        }
+    });
+
+}))}(document, Math));
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+$.ui = $.ui || {};
+
+return $.ui.version = "1.12.1";
+
+} ) );
+
+
+/*!
+ * jQuery UI Keycode 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Keycode
+//>>group: Core
+//>>description: Provide keycodes as keynames
+//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+return $.ui.keyCode = {
+	BACKSPACE: 8,
+	COMMA: 188,
+	DELETE: 46,
+	DOWN: 40,
+	END: 35,
+	ENTER: 13,
+	ESCAPE: 27,
+	HOME: 36,
+	LEFT: 37,
+	PAGE_DOWN: 34,
+	PAGE_UP: 33,
+	PERIOD: 190,
+	RIGHT: 39,
+	SPACE: 32,
+	TAB: 9,
+	UP: 38
+};
+
+} ) );
+
+
+/*!
+ * jQuery UI Position 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/position/
+ */
+
+//>>label: Position
+//>>group: Core
+//>>description: Positions elements relative to other elements.
+//>>docs: http://api.jqueryui.com/position/
+//>>demos: http://jqueryui.com/position/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+( function() {
+var cachedScrollbarWidth,
+	max = Math.max,
+	abs = Math.abs,
+	rhorizontal = /left|center|right/,
+	rvertical = /top|center|bottom/,
+	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
+	rposition = /^\w+/,
+	rpercent = /%$/,
+	_position = $.fn.position;
+
+function getOffsets( offsets, width, height ) {
+	return [
+		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
+		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
+	];
+}
+
+function parseCss( element, property ) {
+	return parseInt( $.css( element, property ), 10 ) || 0;
+}
+
+function getDimensions( elem ) {
+	var raw = elem[ 0 ];
+	if ( raw.nodeType === 9 ) {
+		return {
+			width: elem.width(),
+			height: elem.height(),
+			offset: { top: 0, left: 0 }
+		};
+	}
+	if ( $.isWindow( raw ) ) {
+		return {
+			width: elem.width(),
+			height: elem.height(),
+			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
+		};
+	}
+	if ( raw.preventDefault ) {
+		return {
+			width: 0,
+			height: 0,
+			offset: { top: raw.pageY, left: raw.pageX }
+		};
+	}
+	return {
+		width: elem.outerWidth(),
+		height: elem.outerHeight(),
+		offset: elem.offset()
+	};
+}
+
+$.position = {
+	scrollbarWidth: function() {
+		if ( cachedScrollbarWidth !== undefined ) {
+			return cachedScrollbarWidth;
+		}
+		var w1, w2,
+			div = $( "<div " +
+				"style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>" +
+				"<div style='height:100px;width:auto;'></div></div>" ),
+			innerDiv = div.children()[ 0 ];
+
+		$( "body" ).append( div );
+		w1 = innerDiv.offsetWidth;
+		div.css( "overflow", "scroll" );
+
+		w2 = innerDiv.offsetWidth;
+
+		if ( w1 === w2 ) {
+			w2 = div[ 0 ].clientWidth;
+		}
+
+		div.remove();
+
+		return ( cachedScrollbarWidth = w1 - w2 );
+	},
+	getScrollInfo: function( within ) {
+		var overflowX = within.isWindow || within.isDocument ? "" :
+				within.element.css( "overflow-x" ),
+			overflowY = within.isWindow || within.isDocument ? "" :
+				within.element.css( "overflow-y" ),
+			hasOverflowX = overflowX === "scroll" ||
+				( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
+			hasOverflowY = overflowY === "scroll" ||
+				( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
+		return {
+			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
+			height: hasOverflowX ? $.position.scrollbarWidth() : 0
+		};
+	},
+	getWithinInfo: function( element ) {
+		var withinElement = $( element || window ),
+			isWindow = $.isWindow( withinElement[ 0 ] ),
+			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
+			hasOffset = !isWindow && !isDocument;
+		return {
+			element: withinElement,
+			isWindow: isWindow,
+			isDocument: isDocument,
+			offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
+			scrollLeft: withinElement.scrollLeft(),
+			scrollTop: withinElement.scrollTop(),
+			width: withinElement.outerWidth(),
+			height: withinElement.outerHeight()
+		};
+	}
+};
+
+$.fn.position = function( options ) {
+	if ( !options || !options.of ) {
+		return _position.apply( this, arguments );
+	}
+
+	// Make a copy, we don't want to modify arguments
+	options = $.extend( {}, options );
+
+	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
+		target = $( options.of ),
+		within = $.position.getWithinInfo( options.within ),
+		scrollInfo = $.position.getScrollInfo( within ),
+		collision = ( options.collision || "flip" ).split( " " ),
+		offsets = {};
+
+	dimensions = getDimensions( target );
+	if ( target[ 0 ].preventDefault ) {
+
+		// Force left top to allow flipping
+		options.at = "left top";
+	}
+	targetWidth = dimensions.width;
+	targetHeight = dimensions.height;
+	targetOffset = dimensions.offset;
+
+	// Clone to reuse original targetOffset later
+	basePosition = $.extend( {}, targetOffset );
+
+	// Force my and at to have valid horizontal and vertical positions
+	// if a value is missing or invalid, it will be converted to center
+	$.each( [ "my", "at" ], function() {
+		var pos = ( options[ this ] || "" ).split( " " ),
+			horizontalOffset,
+			verticalOffset;
+
+		if ( pos.length === 1 ) {
+			pos = rhorizontal.test( pos[ 0 ] ) ?
+				pos.concat( [ "center" ] ) :
+				rvertical.test( pos[ 0 ] ) ?
+					[ "center" ].concat( pos ) :
+					[ "center", "center" ];
+		}
+		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
+		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
+
+		// Calculate offsets
+		horizontalOffset = roffset.exec( pos[ 0 ] );
+		verticalOffset = roffset.exec( pos[ 1 ] );
+		offsets[ this ] = [
+			horizontalOffset ? horizontalOffset[ 0 ] : 0,
+			verticalOffset ? verticalOffset[ 0 ] : 0
+		];
+
+		// Reduce to just the positions without the offsets
+		options[ this ] = [
+			rposition.exec( pos[ 0 ] )[ 0 ],
+			rposition.exec( pos[ 1 ] )[ 0 ]
+		];
+	} );
+
+	// Normalize collision option
+	if ( collision.length === 1 ) {
+		collision[ 1 ] = collision[ 0 ];
+	}
+
+	if ( options.at[ 0 ] === "right" ) {
+		basePosition.left += targetWidth;
+	} else if ( options.at[ 0 ] === "center" ) {
+		basePosition.left += targetWidth / 2;
+	}
+
+	if ( options.at[ 1 ] === "bottom" ) {
+		basePosition.top += targetHeight;
+	} else if ( options.at[ 1 ] === "center" ) {
+		basePosition.top += targetHeight / 2;
+	}
+
+	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
+	basePosition.left += atOffset[ 0 ];
+	basePosition.top += atOffset[ 1 ];
+
+	return this.each( function() {
+		var collisionPosition, using,
+			elem = $( this ),
+			elemWidth = elem.outerWidth(),
+			elemHeight = elem.outerHeight(),
+			marginLeft = parseCss( this, "marginLeft" ),
+			marginTop = parseCss( this, "marginTop" ),
+			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
+				scrollInfo.width,
+			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
+				scrollInfo.height,
+			position = $.extend( {}, basePosition ),
+			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
+
+		if ( options.my[ 0 ] === "right" ) {
+			position.left -= elemWidth;
+		} else if ( options.my[ 0 ] === "center" ) {
+			position.left -= elemWidth / 2;
+		}
+
+		if ( options.my[ 1 ] === "bottom" ) {
+			position.top -= elemHeight;
+		} else if ( options.my[ 1 ] === "center" ) {
+			position.top -= elemHeight / 2;
+		}
+
+		position.left += myOffset[ 0 ];
+		position.top += myOffset[ 1 ];
+
+		collisionPosition = {
+			marginLeft: marginLeft,
+			marginTop: marginTop
+		};
+
+		$.each( [ "left", "top" ], function( i, dir ) {
+			if ( $.ui.position[ collision[ i ] ] ) {
+				$.ui.position[ collision[ i ] ][ dir ]( position, {
+					targetWidth: targetWidth,
+					targetHeight: targetHeight,
+					elemWidth: elemWidth,
+					elemHeight: elemHeight,
+					collisionPosition: collisionPosition,
+					collisionWidth: collisionWidth,
+					collisionHeight: collisionHeight,
+					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
+					my: options.my,
+					at: options.at,
+					within: within,
+					elem: elem
+				} );
+			}
+		} );
+
+		if ( options.using ) {
+
+			// Adds feedback as second argument to using callback, if present
+			using = function( props ) {
+				var left = targetOffset.left - position.left,
+					right = left + targetWidth - elemWidth,
+					top = targetOffset.top - position.top,
+					bottom = top + targetHeight - elemHeight,
+					feedback = {
+						target: {
+							element: target,
+							left: targetOffset.left,
+							top: targetOffset.top,
+							width: targetWidth,
+							height: targetHeight
+						},
+						element: {
+							element: elem,
+							left: position.left,
+							top: position.top,
+							width: elemWidth,
+							height: elemHeight
+						},
+						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
+						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
+					};
+				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
+					feedback.horizontal = "center";
+				}
+				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
+					feedback.vertical = "middle";
+				}
+				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
+					feedback.important = "horizontal";
+				} else {
+					feedback.important = "vertical";
+				}
+				options.using.call( this, props, feedback );
+			};
+		}
+
+		elem.offset( $.extend( position, { using: using } ) );
+	} );
+};
+
+$.ui.position = {
+	fit: {
+		left: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
+				outerWidth = within.width,
+				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+				overLeft = withinOffset - collisionPosLeft,
+				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
+				newOverRight;
+
+			// Element is wider than within
+			if ( data.collisionWidth > outerWidth ) {
+
+				// Element is initially over the left side of within
+				if ( overLeft > 0 && overRight <= 0 ) {
+					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
+						withinOffset;
+					position.left += overLeft - newOverRight;
+
+				// Element is initially over right side of within
+				} else if ( overRight > 0 && overLeft <= 0 ) {
+					position.left = withinOffset;
+
+				// Element is initially over both left and right sides of within
+				} else {
+					if ( overLeft > overRight ) {
+						position.left = withinOffset + outerWidth - data.collisionWidth;
+					} else {
+						position.left = withinOffset;
+					}
+				}
+
+			// Too far left -> align with left edge
+			} else if ( overLeft > 0 ) {
+				position.left += overLeft;
+
+			// Too far right -> align with right edge
+			} else if ( overRight > 0 ) {
+				position.left -= overRight;
+
+			// Adjust based on position and margin
+			} else {
+				position.left = max( position.left - collisionPosLeft, position.left );
+			}
+		},
+		top: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
+				outerHeight = data.within.height,
+				collisionPosTop = position.top - data.collisionPosition.marginTop,
+				overTop = withinOffset - collisionPosTop,
+				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
+				newOverBottom;
+
+			// Element is taller than within
+			if ( data.collisionHeight > outerHeight ) {
+
+				// Element is initially over the top of within
+				if ( overTop > 0 && overBottom <= 0 ) {
+					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
+						withinOffset;
+					position.top += overTop - newOverBottom;
+
+				// Element is initially over bottom of within
+				} else if ( overBottom > 0 && overTop <= 0 ) {
+					position.top = withinOffset;
+
+				// Element is initially over both top and bottom of within
+				} else {
+					if ( overTop > overBottom ) {
+						position.top = withinOffset + outerHeight - data.collisionHeight;
+					} else {
+						position.top = withinOffset;
+					}
+				}
+
+			// Too far up -> align with top
+			} else if ( overTop > 0 ) {
+				position.top += overTop;
+
+			// Too far down -> align with bottom edge
+			} else if ( overBottom > 0 ) {
+				position.top -= overBottom;
+
+			// Adjust based on position and margin
+			} else {
+				position.top = max( position.top - collisionPosTop, position.top );
+			}
+		}
+	},
+	flip: {
+		left: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.offset.left + within.scrollLeft,
+				outerWidth = within.width,
+				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
+				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+				overLeft = collisionPosLeft - offsetLeft,
+				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
+				myOffset = data.my[ 0 ] === "left" ?
+					-data.elemWidth :
+					data.my[ 0 ] === "right" ?
+						data.elemWidth :
+						0,
+				atOffset = data.at[ 0 ] === "left" ?
+					data.targetWidth :
+					data.at[ 0 ] === "right" ?
+						-data.targetWidth :
+						0,
+				offset = -2 * data.offset[ 0 ],
+				newOverRight,
+				newOverLeft;
+
+			if ( overLeft < 0 ) {
+				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
+					outerWidth - withinOffset;
+				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
+					position.left += myOffset + atOffset + offset;
+				}
+			} else if ( overRight > 0 ) {
+				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
+					atOffset + offset - offsetLeft;
+				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
+					position.left += myOffset + atOffset + offset;
+				}
+			}
+		},
+		top: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.offset.top + within.scrollTop,
+				outerHeight = within.height,
+				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
+				collisionPosTop = position.top - data.collisionPosition.marginTop,
+				overTop = collisionPosTop - offsetTop,
+				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
+				top = data.my[ 1 ] === "top",
+				myOffset = top ?
+					-data.elemHeight :
+					data.my[ 1 ] === "bottom" ?
+						data.elemHeight :
+						0,
+				atOffset = data.at[ 1 ] === "top" ?
+					data.targetHeight :
+					data.at[ 1 ] === "bottom" ?
+						-data.targetHeight :
+						0,
+				offset = -2 * data.offset[ 1 ],
+				newOverTop,
+				newOverBottom;
+			if ( overTop < 0 ) {
+				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
+					outerHeight - withinOffset;
+				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
+					position.top += myOffset + atOffset + offset;
+				}
+			} else if ( overBottom > 0 ) {
+				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
+					offset - offsetTop;
+				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
+					position.top += myOffset + atOffset + offset;
+				}
+			}
+		}
+	},
+	flipfit: {
+		left: function() {
+			$.ui.position.flip.left.apply( this, arguments );
+			$.ui.position.fit.left.apply( this, arguments );
+		},
+		top: function() {
+			$.ui.position.flip.top.apply( this, arguments );
+			$.ui.position.fit.top.apply( this, arguments );
+		}
+	}
+};
+
+} )();
+
+return $.ui.position;
+
+} ) );
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+return $.ui.safeActiveElement = function( document ) {
+	var activeElement;
+
+	// Support: IE 9 only
+	// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
+	try {
+		activeElement = document.activeElement;
+	} catch ( error ) {
+		activeElement = document.body;
+	}
+
+	// Support: IE 9 - 11 only
+	// IE may return null instead of an element
+	// Interestingly, this only seems to occur when NOT in an iframe
+	if ( !activeElement ) {
+		activeElement = document.body;
+	}
+
+	// Support: IE 11 only
+	// IE11 returns a seemingly empty object in some cases when accessing
+	// document.activeElement from an <iframe>
+	if ( !activeElement.nodeName ) {
+		activeElement = document.body;
+	}
+
+	return activeElement;
+};
+
+} ) );
+
+
+/*!
+ * jQuery UI Unique ID 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: uniqueId
+//>>group: Core
+//>>description: Functions to generate and remove uniqueId's
+//>>docs: http://api.jqueryui.com/uniqueId/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+} ( function( $ ) {
+
+return $.fn.extend( {
+	uniqueId: ( function() {
+		var uuid = 0;
+
+		return function() {
+			return this.each( function() {
+				if ( !this.id ) {
+					this.id = "ui-id-" + ( ++uuid );
+				}
+			} );
+		};
+	} )(),
+
+	removeUniqueId: function() {
+		return this.each( function() {
+			if ( /^ui-id-\d+$/.test( this.id ) ) {
+				$( this ).removeAttr( "id" );
+			}
+		} );
+	}
+} );
+
+} ) );
+
+
+/*!
+ * jQuery UI Widget 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Widget
+//>>group: Core
+//>>description: Provides a factory for creating stateful widgets with a common API.
+//>>docs: http://api.jqueryui.com/jQuery.widget/
+//>>demos: http://jqueryui.com/widget/
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "jquery", "./version" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+var widgetUuid = 0;
+var widgetSlice = Array.prototype.slice;
+
+$.cleanData = ( function( orig ) {
+	return function( elems ) {
+		var events, elem, i;
+		for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
+			try {
+
+				// Only trigger remove when necessary to save time
+				events = $._data( elem, "events" );
+				if ( events && events.remove ) {
+					$( elem ).triggerHandler( "remove" );
+				}
+
+			// Http://bugs.jquery.com/ticket/8235
+			} catch ( e ) {}
+		}
+		orig( elems );
+	};
+} )( $.cleanData );
+
+$.widget = function( name, base, prototype ) {
+	var existingConstructor, constructor, basePrototype;
+
+	// ProxiedPrototype allows the provided prototype to remain unmodified
+	// so that it can be used as a mixin for multiple widgets (#8876)
+	var proxiedPrototype = {};
+
+	var namespace = name.split( "." )[ 0 ];
+	name = name.split( "." )[ 1 ];
+	var fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	if ( $.isArray( prototype ) ) {
+		prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
+	}
+
+	// Create selector for plugin
+	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+		return !!$.data( elem, fullName );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	existingConstructor = $[ namespace ][ name ];
+	constructor = $[ namespace ][ name ] = function( options, element ) {
+
+		// Allow instantiation without "new" keyword
+		if ( !this._createWidget ) {
+			return new constructor( options, element );
+		}
+
+		// Allow instantiation without initializing for simple inheritance
+		// must use "new" keyword (the code above always passes args)
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+
+	// Extend with the existing constructor to carry over any static properties
+	$.extend( constructor, existingConstructor, {
+		version: prototype.version,
+
+		// Copy the object used to create the prototype in case we need to
+		// redefine the widget later
+		_proto: $.extend( {}, prototype ),
+
+		// Track widgets that inherit from this widget in case this widget is
+		// redefined after a widget inherits from it
+		_childConstructors: []
+	} );
+
+	basePrototype = new base();
+
+	// We need to make the options hash a property directly on the new instance
+	// otherwise we'll modify the options hash on the prototype that we're
+	// inheriting from
+	basePrototype.options = $.widget.extend( {}, basePrototype.options );
+	$.each( prototype, function( prop, value ) {
+		if ( !$.isFunction( value ) ) {
+			proxiedPrototype[ prop ] = value;
+			return;
+		}
+		proxiedPrototype[ prop ] = ( function() {
+			function _super() {
+				return base.prototype[ prop ].apply( this, arguments );
+			}
+
+			function _superApply( args ) {
+				return base.prototype[ prop ].apply( this, args );
+			}
+
+			return function() {
+				var __super = this._super;
+				var __superApply = this._superApply;
+				var returnValue;
+
+				this._super = _super;
+				this._superApply = _superApply;
+
+				returnValue = value.apply( this, arguments );
+
+				this._super = __super;
+				this._superApply = __superApply;
+
+				return returnValue;
+			};
+		} )();
+	} );
+	constructor.prototype = $.widget.extend( basePrototype, {
+
+		// TODO: remove support for widgetEventPrefix
+		// always use the name + a colon as the prefix, e.g., draggable:start
+		// don't prefix for widgets that aren't DOM-based
+		widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
+	}, proxiedPrototype, {
+		constructor: constructor,
+		namespace: namespace,
+		widgetName: name,
+		widgetFullName: fullName
+	} );
+
+	// If this widget is being redefined then we need to find all widgets that
+	// are inheriting from it and redefine all of them so that they inherit from
+	// the new version of this widget. We're essentially trying to replace one
+	// level in the prototype chain.
+	if ( existingConstructor ) {
+		$.each( existingConstructor._childConstructors, function( i, child ) {
+			var childPrototype = child.prototype;
+
+			// Redefine the child widget using the same prototype that was
+			// originally used, but inherit from the new version of the base
+			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
+				child._proto );
+		} );
+
+		// Remove the list of existing child constructors from the old constructor
+		// so the old child constructors can be garbage collected
+		delete existingConstructor._childConstructors;
+	} else {
+		base._childConstructors.push( constructor );
+	}
+
+	$.widget.bridge( name, constructor );
+
+	return constructor;
+};
+
+$.widget.extend = function( target ) {
+	var input = widgetSlice.call( arguments, 1 );
+	var inputIndex = 0;
+	var inputLength = input.length;
+	var key;
+	var value;
+
+	for ( ; inputIndex < inputLength; inputIndex++ ) {
+		for ( key in input[ inputIndex ] ) {
+			value = input[ inputIndex ][ key ];
+			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+
+				// Clone objects
+				if ( $.isPlainObject( value ) ) {
+					target[ key ] = $.isPlainObject( target[ key ] ) ?
+						$.widget.extend( {}, target[ key ], value ) :
+
+						// Don't extend strings, arrays, etc. with objects
+						$.widget.extend( {}, value );
+
+				// Copy everything else by reference
+				} else {
+					target[ key ] = value;
+				}
+			}
+		}
+	}
+	return target;
+};
+
+$.widget.bridge = function( name, object ) {
+	var fullName = object.prototype.widgetFullName || name;
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string";
+		var args = widgetSlice.call( arguments, 1 );
+		var returnValue = this;
+
+		if ( isMethodCall ) {
+
+			// If this is an empty collection, we need to have the instance method
+			// return undefined instead of the jQuery instance
+			if ( !this.length && options === "instance" ) {
+				returnValue = undefined;
+			} else {
+				this.each( function() {
+					var methodValue;
+					var instance = $.data( this, fullName );
+
+					if ( options === "instance" ) {
+						returnValue = instance;
+						return false;
+					}
+
+					if ( !instance ) {
+						return $.error( "cannot call methods on " + name +
+							" prior to initialization; " +
+							"attempted to call method '" + options + "'" );
+					}
+
+					if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) {
+						return $.error( "no such method '" + options + "' for " + name +
+							" widget instance" );
+					}
+
+					methodValue = instance[ options ].apply( instance, args );
+
+					if ( methodValue !== instance && methodValue !== undefined ) {
+						returnValue = methodValue && methodValue.jquery ?
+							returnValue.pushStack( methodValue.get() ) :
+							methodValue;
+						return false;
+					}
+				} );
+			}
+		} else {
+
+			// Allow multiple hashes to be passed on init
+			if ( args.length ) {
+				options = $.widget.extend.apply( null, [ options ].concat( args ) );
+			}
+
+			this.each( function() {
+				var instance = $.data( this, fullName );
+				if ( instance ) {
+					instance.option( options || {} );
+					if ( instance._init ) {
+						instance._init();
+					}
+				} else {
+					$.data( this, fullName, new object( options, this ) );
+				}
+			} );
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( /* options, element */ ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	defaultElement: "<div>",
+
+	options: {
+		classes: {},
+		disabled: false,
+
+		// Callbacks
+		create: null
+	},
+
+	_createWidget: function( options, element ) {
+		element = $( element || this.defaultElement || this )[ 0 ];
+		this.element = $( element );
+		this.uuid = widgetUuid++;
+		this.eventNamespace = "." + this.widgetName + this.uuid;
+
+		this.bindings = $();
+		this.hoverable = $();
+		this.focusable = $();
+		this.classesElementLookup = {};
+
+		if ( element !== this ) {
+			$.data( element, this.widgetFullName, this );
+			this._on( true, this.element, {
+				remove: function( event ) {
+					if ( event.target === element ) {
+						this.destroy();
+					}
+				}
+			} );
+			this.document = $( element.style ?
+
+				// Element within the document
+				element.ownerDocument :
+
+				// Element is window or document
+				element.document || element );
+			this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
+		}
+
+		this.options = $.widget.extend( {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		this._create();
+
+		if ( this.options.disabled ) {
+			this._setOptionDisabled( this.options.disabled );
+		}
+
+		this._trigger( "create", null, this._getCreateEventData() );
+		this._init();
+	},
+
+	_getCreateOptions: function() {
+		return {};
+	},
+
+	_getCreateEventData: $.noop,
+
+	_create: $.noop,
+
+	_init: $.noop,
+
+	destroy: function() {
+		var that = this;
+
+		this._destroy();
+		$.each( this.classesElementLookup, function( key, value ) {
+			that._removeClass( value, key );
+		} );
+
+		// We can probably remove the unbind calls in 2.0
+		// all event bindings should go through this._on()
+		this.element
+			.off( this.eventNamespace )
+			.removeData( this.widgetFullName );
+		this.widget()
+			.off( this.eventNamespace )
+			.removeAttr( "aria-disabled" );
+
+		// Clean up events and states
+		this.bindings.off( this.eventNamespace );
+	},
+
+	_destroy: $.noop,
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key;
+		var parts;
+		var curOption;
+		var i;
+
+		if ( arguments.length === 0 ) {
+
+			// Don't return a reference to the internal hash
+			return $.widget.extend( {}, this.options );
+		}
+
+		if ( typeof key === "string" ) {
+
+			// Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+			options = {};
+			parts = key.split( "." );
+			key = parts.shift();
+			if ( parts.length ) {
+				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+				for ( i = 0; i < parts.length - 1; i++ ) {
+					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+					curOption = curOption[ parts[ i ] ];
+				}
+				key = parts.pop();
+				if ( arguments.length === 1 ) {
+					return curOption[ key ] === undefined ? null : curOption[ key ];
+				}
+				curOption[ key ] = value;
+			} else {
+				if ( arguments.length === 1 ) {
+					return this.options[ key ] === undefined ? null : this.options[ key ];
+				}
+				options[ key ] = value;
+			}
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+
+	_setOptions: function( options ) {
+		var key;
+
+		for ( key in options ) {
+			this._setOption( key, options[ key ] );
+		}
+
+		return this;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "classes" ) {
+			this._setOptionClasses( value );
+		}
+
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this._setOptionDisabled( value );
+		}
+
+		return this;
+	},
+
+	_setOptionClasses: function( value ) {
+		var classKey, elements, currentElements;
+
+		for ( classKey in value ) {
+			currentElements = this.classesElementLookup[ classKey ];
+			if ( value[ classKey ] === this.options.classes[ classKey ] ||
+					!currentElements ||
+					!currentElements.length ) {
+				continue;
+			}
+
+			// We are doing this to create a new jQuery object because the _removeClass() call
+			// on the next line is going to destroy the reference to the current elements being
+			// tracked. We need to save a copy of this collection so that we can add the new classes
+			// below.
+			elements = $( currentElements.get() );
+			this._removeClass( currentElements, classKey );
+
+			// We don't use _addClass() here, because that uses this.options.classes
+			// for generating the string of classes. We want to use the value passed in from
+			// _setOption(), this is the new value of the classes option which was passed to
+			// _setOption(). We pass this value directly to _classes().
+			elements.addClass( this._classes( {
+				element: elements,
+				keys: classKey,
+				classes: value,
+				add: true
+			} ) );
+		}
+	},
+
+	_setOptionDisabled: function( value ) {
+		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
+
+		// If the widget is becoming disabled, then nothing is interactive
+		if ( value ) {
+			this._removeClass( this.hoverable, null, "ui-state-hover" );
+			this._removeClass( this.focusable, null, "ui-state-focus" );
+		}
+	},
+
+	enable: function() {
+		return this._setOptions( { disabled: false } );
+	},
+
+	disable: function() {
+		return this._setOptions( { disabled: true } );
+	},
+
+	_classes: function( options ) {
+		var full = [];
+		var that = this;
+
+		options = $.extend( {
+			element: this.element,
+			classes: this.options.classes || {}
+		}, options );
+
+		function processClassString( classes, checkOption ) {
+			var current, i;
+			for ( i = 0; i < classes.length; i++ ) {
+				current = that.classesElementLookup[ classes[ i ] ] || $();
+				if ( options.add ) {
+					current = $( $.unique( current.get().concat( options.element.get() ) ) );
+				} else {
+					current = $( current.not( options.element ).get() );
+				}
+				that.classesElementLookup[ classes[ i ] ] = current;
+				full.push( classes[ i ] );
+				if ( checkOption && options.classes[ classes[ i ] ] ) {
+					full.push( options.classes[ classes[ i ] ] );
+				}
+			}
+		}
+
+		this._on( options.element, {
+			"remove": "_untrackClassesElement"
+		} );
+
+		if ( options.keys ) {
+			processClassString( options.keys.match( /\S+/g ) || [], true );
+		}
+		if ( options.extra ) {
+			processClassString( options.extra.match( /\S+/g ) || [] );
+		}
+
+		return full.join( " " );
+	},
+
+	_untrackClassesElement: function( event ) {
+		var that = this;
+		$.each( that.classesElementLookup, function( key, value ) {
+			if ( $.inArray( event.target, value ) !== -1 ) {
+				that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
+			}
+		} );
+	},
+
+	_removeClass: function( element, keys, extra ) {
+		return this._toggleClass( element, keys, extra, false );
+	},
+
+	_addClass: function( element, keys, extra ) {
+		return this._toggleClass( element, keys, extra, true );
+	},
+
+	_toggleClass: function( element, keys, extra, add ) {
+		add = ( typeof add === "boolean" ) ? add : extra;
+		var shift = ( typeof element === "string" || element === null ),
+			options = {
+				extra: shift ? keys : extra,
+				keys: shift ? element : keys,
+				element: shift ? this.element : element,
+				add: add
+			};
+		options.element.toggleClass( this._classes( options ), add );
+		return this;
+	},
+
+	_on: function( suppressDisabledCheck, element, handlers ) {
+		var delegateElement;
+		var instance = this;
+
+		// No suppressDisabledCheck flag, shuffle arguments
+		if ( typeof suppressDisabledCheck !== "boolean" ) {
+			handlers = element;
+			element = suppressDisabledCheck;
+			suppressDisabledCheck = false;
+		}
+
+		// No element argument, shuffle and use this.element
+		if ( !handlers ) {
+			handlers = element;
+			element = this.element;
+			delegateElement = this.widget();
+		} else {
+			element = delegateElement = $( element );
+			this.bindings = this.bindings.add( element );
+		}
+
+		$.each( handlers, function( event, handler ) {
+			function handlerProxy() {
+
+				// Allow widgets to customize the disabled handling
+				// - disabled as an array instead of boolean
+				// - disabled class as method for disabling individual parts
+				if ( !suppressDisabledCheck &&
+						( instance.options.disabled === true ||
+						$( this ).hasClass( "ui-state-disabled" ) ) ) {
+					return;
+				}
+				return ( typeof handler === "string" ? instance[ handler ] : handler )
+					.apply( instance, arguments );
+			}
+
+			// Copy the guid so direct unbinding works
+			if ( typeof handler !== "string" ) {
+				handlerProxy.guid = handler.guid =
+					handler.guid || handlerProxy.guid || $.guid++;
+			}
+
+			var match = event.match( /^([\w:-]*)\s*(.*)$/ );
+			var eventName = match[ 1 ] + instance.eventNamespace;
+			var selector = match[ 2 ];
+
+			if ( selector ) {
+				delegateElement.on( eventName, selector, handlerProxy );
+			} else {
+				element.on( eventName, handlerProxy );
+			}
+		} );
+	},
+
+	_off: function( element, eventName ) {
+		eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
+			this.eventNamespace;
+		element.off( eventName ).off( eventName );
+
+		// Clear the stack to avoid memory leaks (#10056)
+		this.bindings = $( this.bindings.not( element ).get() );
+		this.focusable = $( this.focusable.not( element ).get() );
+		this.hoverable = $( this.hoverable.not( element ).get() );
+	},
+
+	_delay: function( handler, delay ) {
+		function handlerProxy() {
+			return ( typeof handler === "string" ? instance[ handler ] : handler )
+				.apply( instance, arguments );
+		}
+		var instance = this;
+		return setTimeout( handlerProxy, delay || 0 );
+	},
+
+	_hoverable: function( element ) {
+		this.hoverable = this.hoverable.add( element );
+		this._on( element, {
+			mouseenter: function( event ) {
+				this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
+			},
+			mouseleave: function( event ) {
+				this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
+			}
+		} );
+	},
+
+	_focusable: function( element ) {
+		this.focusable = this.focusable.add( element );
+		this._on( element, {
+			focusin: function( event ) {
+				this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
+			},
+			focusout: function( event ) {
+				this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
+			}
+		} );
+	},
+
+	_trigger: function( type, event, data ) {
+		var prop, orig;
+		var callback = this.options[ type ];
+
+		data = data || {};
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+
+		// The original event may come from any element
+		// so we need to reset the target on the new event
+		event.target = this.element[ 0 ];
+
+		// Copy original event properties over to the new event
+		orig = event.originalEvent;
+		if ( orig ) {
+			for ( prop in orig ) {
+				if ( !( prop in event ) ) {
+					event[ prop ] = orig[ prop ];
+				}
+			}
+		}
+
+		this.element.trigger( event, data );
+		return !( $.isFunction( callback ) &&
+			callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+		if ( typeof options === "string" ) {
+			options = { effect: options };
+		}
+
+		var hasOptions;
+		var effectName = !options ?
+			method :
+			options === true || typeof options === "number" ?
+				defaultEffect :
+				options.effect || defaultEffect;
+
+		options = options || {};
+		if ( typeof options === "number" ) {
+			options = { duration: options };
+		}
+
+		hasOptions = !$.isEmptyObject( options );
+		options.complete = callback;
+
+		if ( options.delay ) {
+			element.delay( options.delay );
+		}
+
+		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
+			element[ method ]( options );
+		} else if ( effectName !== method && element[ effectName ] ) {
+			element[ effectName ]( options.duration, options.easing, callback );
+		} else {
+			element.queue( function( next ) {
+				$( this )[ method ]();
+				if ( callback ) {
+					callback.call( element[ 0 ] );
+				}
+				next();
+			} );
+		}
+	};
+} );
+
+return $.widget;
+
+} ) );
+
+
+
+
+
+
+
+/*!
+ * jQuery UI Menu 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Menu
+//>>group: Widgets
+//>>description: Creates nestable menus.
+//>>docs: http://api.jqueryui.com/menu/
+//>>demos: http://jqueryui.com/menu/
+//>>css.structure: ../../themes/base/core.css
+//>>css.structure: ../../themes/base/menu.css
+//>>css.theme: ../../themes/base/theme.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"../keycode",
+			"../position",
+			"../safe-active-element",
+			"../unique-id",
+			"../version",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+return $.widget( "ui.menu", {
+	version: "1.12.1",
+	defaultElement: "<ul>",
+	delay: 300,
+	options: {
+		icons: {
+			submenu: "ui-icon-caret-1-e"
+		},
+		items: "> *",
+		menus: "ul",
+		position: {
+			my: "left top",
+			at: "right top"
+		},
+		role: "menu",
+
+		// Callbacks
+		blur: null,
+		focus: null,
+		select: null
+	},
+
+	_create: function() {
+		this.activeMenu = this.element;
+
+		// Flag used to prevent firing of the click handler
+		// as the event bubbles up through nested menus
+		this.mouseHandled = false;
+		this.element
+			.uniqueId()
+			.attr( {
+				role: this.options.role,
+				tabIndex: 0
+			} );
+
+		this._addClass( "ui-menu", "ui-widget ui-widget-content" );
+		this._on( {
+
+			// Prevent focus from sticking to links inside menu after clicking
+			// them (focus should always stay on UL during navigation).
+			"mousedown .ui-menu-item": function( event ) {
+				event.preventDefault();
+			},
+			"click .ui-menu-item": function( event ) {
+				var target = $( event.target );
+				var active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
+				if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
+					this.select( event );
+
+					// Only set the mouseHandled flag if the event will bubble, see #9469.
+					if ( !event.isPropagationStopped() ) {
+						this.mouseHandled = true;
+					}
+
+					// Open submenu on click
+					if ( target.has( ".ui-menu" ).length ) {
+						this.expand( event );
+					} else if ( !this.element.is( ":focus" ) &&
+							active.closest( ".ui-menu" ).length ) {
+
+						// Redirect focus to the menu
+						this.element.trigger( "focus", [ true ] );
+
+						// If the active item is on the top level, let it stay active.
+						// Otherwise, blur the active item since it is no longer visible.
+						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
+							clearTimeout( this.timer );
+						}
+					}
+				}
+			},
+			"mouseenter .ui-menu-item": function( event ) {
+
+				// Ignore mouse events while typeahead is active, see #10458.
+				// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
+				// is over an item in the menu
+				if ( this.previousFilter ) {
+					return;
+				}
+
+				var actualTarget = $( event.target ).closest( ".ui-menu-item" ),
+					target = $( event.currentTarget );
+
+				// Ignore bubbled events on parent items, see #11641
+				if ( actualTarget[ 0 ] !== target[ 0 ] ) {
+					return;
+				}
+
+				// Remove ui-state-active class from siblings of the newly focused menu item
+				// to avoid a jump caused by adjacent elements both having a class with a border
+				this._removeClass( target.siblings().children( ".ui-state-active" ),
+					null, "ui-state-active" );
+				this.focus( event, target );
+			},
+			mouseleave: "collapseAll",
+			"mouseleave .ui-menu": "collapseAll",
+			focus: function( event, keepActiveItem ) {
+
+				// If there's already an active item, keep it active
+				// If not, activate the first item
+				var item = this.active || this.element.find( this.options.items ).eq( 0 );
+
+				if ( !keepActiveItem ) {
+					this.focus( event, item );
+				}
+			},
+			blur: function( event ) {
+				this._delay( function() {
+					var notContained = !$.contains(
+						this.element[ 0 ],
+						$.ui.safeActiveElement( this.document[ 0 ] )
+					);
+					if ( notContained ) {
+						this.collapseAll( event );
+					}
+				} );
+			},
+			keydown: "_keydown"
+		} );
+
+		this.refresh();
+
+		// Clicks outside of a menu collapse any open menus
+		this._on( this.document, {
+			click: function( event ) {
+				if ( this._closeOnDocumentClick( event ) ) {
+					this.collapseAll( event );
+				}
+
+				// Reset the mouseHandled flag
+				this.mouseHandled = false;
+			}
+		} );
+	},
+
+	_destroy: function() {
+		var items = this.element.find( ".ui-menu-item" )
+				.removeAttr( "role aria-disabled" ),
+			submenus = items.children( ".ui-menu-item-wrapper" )
+				.removeUniqueId()
+				.removeAttr( "tabIndex role aria-haspopup" );
+
+		// Destroy (sub)menus
+		this.element
+			.removeAttr( "aria-activedescendant" )
+			.find( ".ui-menu" ).addBack()
+				.removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " +
+					"tabIndex" )
+				.removeUniqueId()
+				.show();
+
+		submenus.children().each( function() {
+			var elem = $( this );
+			if ( elem.data( "ui-menu-submenu-caret" ) ) {
+				elem.remove();
+			}
+		} );
+	},
+
+	_keydown: function( event ) {
+		var match, prev, character, skip,
+			preventDefault = true;
+
+		switch ( event.keyCode ) {
+		case $.ui.keyCode.PAGE_UP:
+			this.previousPage( event );
+			break;
+		case $.ui.keyCode.PAGE_DOWN:
+			this.nextPage( event );
+			break;
+		case $.ui.keyCode.HOME:
+			this._move( "first", "first", event );
+			break;
+		case $.ui.keyCode.END:
+			this._move( "last", "last", event );
+			break;
+		case $.ui.keyCode.UP:
+			this.previous( event );
+			break;
+		case $.ui.keyCode.DOWN:
+			this.next( event );
+			break;
+		case $.ui.keyCode.LEFT:
+			this.collapse( event );
+			break;
+		case $.ui.keyCode.RIGHT:
+			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
+				this.expand( event );
+			}
+			break;
+		case $.ui.keyCode.ENTER:
+		case $.ui.keyCode.SPACE:
+			this._activate( event );
+			break;
+		case $.ui.keyCode.ESCAPE:
+			this.collapse( event );
+			break;
+		default:
+			preventDefault = false;
+			prev = this.previousFilter || "";
+			skip = false;
+
+			// Support number pad values
+			character = event.keyCode >= 96 && event.keyCode <= 105 ?
+				( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );
+
+			clearTimeout( this.filterTimer );
+
+			if ( character === prev ) {
+				skip = true;
+			} else {
+				character = prev + character;
+			}
+
+			match = this._filterMenuItems( character );
+			match = skip && match.index( this.active.next() ) !== -1 ?
+				this.active.nextAll( ".ui-menu-item" ) :
+				match;
+
+			// If no matches on the current filter, reset to the last character pressed
+			// to move down the menu to the first item that starts with that character
+			if ( !match.length ) {
+				character = String.fromCharCode( event.keyCode );
+				match = this._filterMenuItems( character );
+			}
+
+			if ( match.length ) {
+				this.focus( event, match );
+				this.previousFilter = character;
+				this.filterTimer = this._delay( function() {
+					delete this.previousFilter;
+				}, 1000 );
+			} else {
+				delete this.previousFilter;
+			}
+		}
+
+		if ( preventDefault ) {
+			event.preventDefault();
+		}
+	},
+
+	_activate: function( event ) {
+		if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
+			if ( this.active.children( "[aria-haspopup='true']" ).length ) {
+				this.expand( event );
+			} else {
+				this.select( event );
+			}
+		}
+	},
+
+	refresh: function() {
+		var menus, items, newSubmenus, newItems, newWrappers,
+			that = this,
+			icon = this.options.icons.submenu,
+			submenus = this.element.find( this.options.menus );
+
+		this._toggleClass( "ui-menu-icons", null, !!this.element.find( ".ui-icon" ).length );
+
+		// Initialize nested menus
+		newSubmenus = submenus.filter( ":not(.ui-menu)" )
+			.hide()
+			.attr( {
+				role: this.options.role,
+				"aria-hidden": "true",
+				"aria-expanded": "false"
+			} )
+			.each( function() {
+				var menu = $( this ),
+					item = menu.prev(),
+					submenuCaret = $( "<span>" ).data( "ui-menu-submenu-caret", true );
+
+				that._addClass( submenuCaret, "ui-menu-icon", "ui-icon " + icon );
+				item
+					.attr( "aria-haspopup", "true" )
+					.prepend( submenuCaret );
+				menu.attr( "aria-labelledby", item.attr( "id" ) );
+			} );
+
+		this._addClass( newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front" );
+
+		menus = submenus.add( this.element );
+		items = menus.find( this.options.items );
+
+		// Initialize menu-items containing spaces and/or dashes only as dividers
+		items.not( ".ui-menu-item" ).each( function() {
+			var item = $( this );
+			if ( that._isDivider( item ) ) {
+				that._addClass( item, "ui-menu-divider", "ui-widget-content" );
+			}
+		} );
+
+		// Don't refresh list items that are already adapted
+		newItems = items.not( ".ui-menu-item, .ui-menu-divider" );
+		newWrappers = newItems.children()
+			.not( ".ui-menu" )
+				.uniqueId()
+				.attr( {
+					tabIndex: -1,
+					role: this._itemRole()
+				} );
+		this._addClass( newItems, "ui-menu-item" )
+			._addClass( newWrappers, "ui-menu-item-wrapper" );
+
+		// Add aria-disabled attribute to any disabled menu item
+		items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
+
+		// If the active item has been removed, blur the menu
+		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
+			this.blur();
+		}
+	},
+
+	_itemRole: function() {
+		return {
+			menu: "menuitem",
+			listbox: "option"
+		}[ this.options.role ];
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "icons" ) {
+			var icons = this.element.find( ".ui-menu-icon" );
+			this._removeClass( icons, null, this.options.icons.submenu )
+				._addClass( icons, null, value.submenu );
+		}
+		this._super( key, value );
+	},
+
+	_setOptionDisabled: function( value ) {
+		this._super( value );
+
+		this.element.attr( "aria-disabled", String( value ) );
+		this._toggleClass( null, "ui-state-disabled", !!value );
+	},
+
+	focus: function( event, item ) {
+		var nested, focused, activeParent;
+		this.blur( event, event && event.type === "focus" );
+
+		this._scrollIntoView( item );
+
+		this.active = item.first();
+
+		focused = this.active.children( ".ui-menu-item-wrapper" );
+		this._addClass( focused, null, "ui-state-active" );
+
+		// Only update aria-activedescendant if there's a role
+		// otherwise we assume focus is managed elsewhere
+		if ( this.options.role ) {
+			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
+		}
+
+		// Highlight active parent menu item, if any
+		activeParent = this.active
+			.parent()
+				.closest( ".ui-menu-item" )
+					.children( ".ui-menu-item-wrapper" );
+		this._addClass( activeParent, null, "ui-state-active" );
+
+		if ( event && event.type === "keydown" ) {
+			this._close();
+		} else {
+			this.timer = this._delay( function() {
+				this._close();
+			}, this.delay );
+		}
+
+		nested = item.children( ".ui-menu" );
+		if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
+			this._startOpening( nested );
+		}
+		this.activeMenu = item.parent();
+
+		this._trigger( "focus", event, { item: item } );
+	},
+
+	_scrollIntoView: function( item ) {
+		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
+		if ( this._hasScroll() ) {
+			borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
+			paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
+			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
+			scroll = this.activeMenu.scrollTop();
+			elementHeight = this.activeMenu.height();
+			itemHeight = item.outerHeight();
+
+			if ( offset < 0 ) {
+				this.activeMenu.scrollTop( scroll + offset );
+			} else if ( offset + itemHeight > elementHeight ) {
+				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
+			}
+		}
+	},
+
+	blur: function( event, fromFocus ) {
+		if ( !fromFocus ) {
+			clearTimeout( this.timer );
+		}
+
+		if ( !this.active ) {
+			return;
+		}
+
+		this._removeClass( this.active.children( ".ui-menu-item-wrapper" ),
+			null, "ui-state-active" );
+
+		this._trigger( "blur", event, { item: this.active } );
+		this.active = null;
+	},
+
+	_startOpening: function( submenu ) {
+		clearTimeout( this.timer );
+
+		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
+		// shift in the submenu position when mousing over the caret icon
+		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
+			return;
+		}
+
+		this.timer = this._delay( function() {
+			this._close();
+			this._open( submenu );
+		}, this.delay );
+	},
+
+	_open: function( submenu ) {
+		var position = $.extend( {
+			of: this.active
+		}, this.options.position );
+
+		clearTimeout( this.timer );
+		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
+			.hide()
+			.attr( "aria-hidden", "true" );
+
+		submenu
+			.show()
+			.removeAttr( "aria-hidden" )
+			.attr( "aria-expanded", "true" )
+			.position( position );
+	},
+
+	collapseAll: function( event, all ) {
+		clearTimeout( this.timer );
+		this.timer = this._delay( function() {
+
+			// If we were passed an event, look for the submenu that contains the event
+			var currentMenu = all ? this.element :
+				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
+
+			// If we found no valid submenu ancestor, use the main menu to close all
+			// sub menus anyway
+			if ( !currentMenu.length ) {
+				currentMenu = this.element;
+			}
+
+			this._close( currentMenu );
+
+			this.blur( event );
+
+			// Work around active item staying active after menu is blurred
+			this._removeClass( currentMenu.find( ".ui-state-active" ), null, "ui-state-active" );
+
+			this.activeMenu = currentMenu;
+		}, this.delay );
+	},
+
+	// With no arguments, closes the currently active menu - if nothing is active
+	// it closes all menus.  If passed an argument, it will search for menus BELOW
+	_close: function( startMenu ) {
+		if ( !startMenu ) {
+			startMenu = this.active ? this.active.parent() : this.element;
+		}
+
+		startMenu.find( ".ui-menu" )
+			.hide()
+			.attr( "aria-hidden", "true" )
+			.attr( "aria-expanded", "false" );
+	},
+
+	_closeOnDocumentClick: function( event ) {
+		return !$( event.target ).closest( ".ui-menu" ).length;
+	},
+
+	_isDivider: function( item ) {
+
+		// Match hyphen, em dash, en dash
+		return !/[^\-\u2014\u2013\s]/.test( item.text() );
+	},
+
+	collapse: function( event ) {
+		var newItem = this.active &&
+			this.active.parent().closest( ".ui-menu-item", this.element );
+		if ( newItem && newItem.length ) {
+			this._close();
+			this.focus( event, newItem );
+		}
+	},
+
+	expand: function( event ) {
+		var newItem = this.active &&
+			this.active
+				.children( ".ui-menu " )
+					.find( this.options.items )
+						.first();
+
+		if ( newItem && newItem.length ) {
+			this._open( newItem.parent() );
+
+			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
+			this._delay( function() {
+				this.focus( event, newItem );
+			} );
+		}
+	},
+
+	next: function( event ) {
+		this._move( "next", "first", event );
+	},
+
+	previous: function( event ) {
+		this._move( "prev", "last", event );
+	},
+
+	isFirstItem: function() {
+		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
+	},
+
+	isLastItem: function() {
+		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
+	},
+
+	_move: function( direction, filter, event ) {
+		var next;
+		if ( this.active ) {
+			if ( direction === "first" || direction === "last" ) {
+				next = this.active
+					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
+					.eq( -1 );
+			} else {
+				next = this.active
+					[ direction + "All" ]( ".ui-menu-item" )
+					.eq( 0 );
+			}
+		}
+		if ( !next || !next.length || !this.active ) {
+			next = this.activeMenu.find( this.options.items )[ filter ]();
+		}
+
+		this.focus( event, next );
+	},
+
+	nextPage: function( event ) {
+		var item, base, height;
+
+		if ( !this.active ) {
+			this.next( event );
+			return;
+		}
+		if ( this.isLastItem() ) {
+			return;
+		}
+		if ( this._hasScroll() ) {
+			base = this.active.offset().top;
+			height = this.element.height();
+			this.active.nextAll( ".ui-menu-item" ).each( function() {
+				item = $( this );
+				return item.offset().top - base - height < 0;
+			} );
+
+			this.focus( event, item );
+		} else {
+			this.focus( event, this.activeMenu.find( this.options.items )
+				[ !this.active ? "first" : "last" ]() );
+		}
+	},
+
+	previousPage: function( event ) {
+		var item, base, height;
+		if ( !this.active ) {
+			this.next( event );
+			return;
+		}
+		if ( this.isFirstItem() ) {
+			return;
+		}
+		if ( this._hasScroll() ) {
+			base = this.active.offset().top;
+			height = this.element.height();
+			this.active.prevAll( ".ui-menu-item" ).each( function() {
+				item = $( this );
+				return item.offset().top - base + height > 0;
+			} );
+
+			this.focus( event, item );
+		} else {
+			this.focus( event, this.activeMenu.find( this.options.items ).first() );
+		}
+	},
+
+	_hasScroll: function() {
+		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
+	},
+
+	select: function( event ) {
+
+		// TODO: It should never be possible to not have an active item at this
+		// point, but the tests don't trigger mouseenter before click.
+		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
+		var ui = { item: this.active };
+		if ( !this.active.has( ".ui-menu" ).length ) {
+			this.collapseAll( event, true );
+		}
+		this._trigger( "select", event, ui );
+	},
+
+	_filterMenuItems: function( character ) {
+		var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
+			regex = new RegExp( "^" + escapedCharacter, "i" );
+
+		return this.activeMenu
+			.find( this.options.items )
+
+				// Only match on items, not dividers or other content (#10571)
+				.filter( ".ui-menu-item" )
+					.filter( function() {
+						return regex.test(
+							$.trim( $( this ).children( ".ui-menu-item-wrapper" ).text() ) );
+					} );
+	}
+} );
+
+} ) );
+
+
+
+
+
+
+
+/*!
+ * jQuery UI Autocomplete 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Autocomplete
+//>>group: Widgets
+//>>description: Lists suggested words as the user is typing.
+//>>docs: http://api.jqueryui.com/autocomplete/
+//>>demos: http://jqueryui.com/autocomplete/
+//>>css.structure: ../../themes/base/core.css
+//>>css.structure: ../../themes/base/autocomplete.css
+//>>css.theme: ../../themes/base/theme.css
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [
+			"jquery",
+			"./menu",
+			"../keycode",
+			"../position",
+			"../safe-active-element",
+			"../version",
+			"../widget"
+		], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}( function( $ ) {
+
+$.widget( "ui.autocomplete", {
+	version: "1.12.1",
+	defaultElement: "<input>",
+	options: {
+		appendTo: null,
+		autoFocus: false,
+		delay: 300,
+		minLength: 1,
+		position: {
+			my: "left top",
+			at: "left bottom",
+			collision: "none"
+		},
+		source: null,
+
+		// Callbacks
+		change: null,
+		close: null,
+		focus: null,
+		open: null,
+		response: null,
+		search: null,
+		select: null
+	},
+
+	requestIndex: 0,
+	pending: 0,
+
+	_create: function() {
+
+		// Some browsers only repeat keydown events, not keypress events,
+		// so we use the suppressKeyPress flag to determine if we've already
+		// handled the keydown event. #7269
+		// Unfortunately the code for & in keypress is the same as the up arrow,
+		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
+		// events when we know the keydown event was used to modify the
+		// search term. #7799
+		var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
+			nodeName = this.element[ 0 ].nodeName.toLowerCase(),
+			isTextarea = nodeName === "textarea",
+			isInput = nodeName === "input";
+
+		// Textareas are always multi-line
+		// Inputs are always single-line, even if inside a contentEditable element
+		// IE also treats inputs as contentEditable
+		// All other element types are determined by whether or not they're contentEditable
+		this.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );
+
+		this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
+		this.isNewMenu = true;
+
+		this._addClass( "ui-autocomplete-input" );
+		this.element.attr( "autocomplete", "off" );
+
+		this._on( this.element, {
+			keydown: function( event ) {
+				if ( this.element.prop( "readOnly" ) ) {
+					suppressKeyPress = true;
+					suppressInput = true;
+					suppressKeyPressRepeat = true;
+					return;
+				}
+
+				suppressKeyPress = false;
+				suppressInput = false;
+				suppressKeyPressRepeat = false;
+				var keyCode = $.ui.keyCode;
+				switch ( event.keyCode ) {
+				case keyCode.PAGE_UP:
+					suppressKeyPress = true;
+					this._move( "previousPage", event );
+					break;
+				case keyCode.PAGE_DOWN:
+					suppressKeyPress = true;
+					this._move( "nextPage", event );
+					break;
+				case keyCode.UP:
+					suppressKeyPress = true;
+					this._keyEvent( "previous", event );
+					break;
+				case keyCode.DOWN:
+					suppressKeyPress = true;
+					this._keyEvent( "next", event );
+					break;
+				case keyCode.ENTER:
+
+					// when menu is open and has focus
+					if ( this.menu.active ) {
+
+						// #6055 - Opera still allows the keypress to occur
+						// which causes forms to submit
+						suppressKeyPress = true;
+						event.preventDefault();
+						this.menu.select( event );
+					}
+					break;
+				case keyCode.TAB:
+					if ( this.menu.active ) {
+						this.menu.select( event );
+					}
+					break;
+				case keyCode.ESCAPE:
+					if ( this.menu.element.is( ":visible" ) ) {
+						if ( !this.isMultiLine ) {
+							this._value( this.term );
+						}
+						this.close( event );
+
+						// Different browsers have different default behavior for escape
+						// Single press can mean undo or clear
+						// Double press in IE means clear the whole form
+						event.preventDefault();
+					}
+					break;
+				default:
+					suppressKeyPressRepeat = true;
+
+					// search timeout should be triggered before the input value is changed
+					this._searchTimeout( event );
+					break;
+				}
+			},
+			keypress: function( event ) {
+				if ( suppressKeyPress ) {
+					suppressKeyPress = false;
+					if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+						event.preventDefault();
+					}
+					return;
+				}
+				if ( suppressKeyPressRepeat ) {
+					return;
+				}
+
+				// Replicate some key handlers to allow them to repeat in Firefox and Opera
+				var keyCode = $.ui.keyCode;
+				switch ( event.keyCode ) {
+				case keyCode.PAGE_UP:
+					this._move( "previousPage", event );
+					break;
+				case keyCode.PAGE_DOWN:
+					this._move( "nextPage", event );
+					break;
+				case keyCode.UP:
+					this._keyEvent( "previous", event );
+					break;
+				case keyCode.DOWN:
+					this._keyEvent( "next", event );
+					break;
+				}
+			},
+			input: function( event ) {
+				if ( suppressInput ) {
+					suppressInput = false;
+					event.preventDefault();
+					return;
+				}
+				this._searchTimeout( event );
+			},
+			focus: function() {
+				this.selectedItem = null;
+				this.previous = this._value();
+			},
+			blur: function( event ) {
+				if ( this.cancelBlur ) {
+					delete this.cancelBlur;
+					return;
+				}
+
+				clearTimeout( this.searching );
+				this.close( event );
+				this._change( event );
+			}
+		} );
+
+		this._initSource();
+		this.menu = $( "<ul>" )
+			.appendTo( this._appendTo() )
+			.menu( {
+
+				// disable ARIA support, the live region takes care of that
+				role: null
+			} )
+			.hide()
+			.menu( "instance" );
+
+		this._addClass( this.menu.element, "ui-autocomplete", "ui-front" );
+		this._on( this.menu.element, {
+			mousedown: function( event ) {
+
+				// prevent moving focus out of the text field
+				event.preventDefault();
+
+				// IE doesn't prevent moving focus even with event.preventDefault()
+				// so we set a flag to know when we should ignore the blur event
+				this.cancelBlur = true;
+				this._delay( function() {
+					delete this.cancelBlur;
+
+					// Support: IE 8 only
+					// Right clicking a menu item or selecting text from the menu items will
+					// result in focus moving out of the input. However, we've already received
+					// and ignored the blur event because of the cancelBlur flag set above. So
+					// we restore focus to ensure that the menu closes properly based on the user's
+					// next actions.
+					if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
+						this.element.trigger( "focus" );
+					}
+				} );
+			},
+			menufocus: function( event, ui ) {
+				var label, item;
+
+				// support: Firefox
+				// Prevent accidental activation of menu items in Firefox (#7024 #9118)
+				if ( this.isNewMenu ) {
+					this.isNewMenu = false;
+					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
+						this.menu.blur();
+
+						this.document.one( "mousemove", function() {
+							$( event.target ).trigger( event.originalEvent );
+						} );
+
+						return;
+					}
+				}
+
+				item = ui.item.data( "ui-autocomplete-item" );
+				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
+
+					// use value to match what will end up in the input, if it was a key event
+					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
+						this._value( item.value );
+					}
+				}
+
+				// Announce the value in the liveRegion
+				label = ui.item.attr( "aria-label" ) || item.value;
+				if ( label && $.trim( label ).length ) {
+					this.liveRegion.children().hide();
+					$( "<div>" ).text( label ).appendTo( this.liveRegion );
+				}
+			},
+			menuselect: function( event, ui ) {
+				var item = ui.item.data( "ui-autocomplete-item" ),
+					previous = this.previous;
+
+				// Only trigger when focus was lost (click on menu)
+				if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
+					this.element.trigger( "focus" );
+					this.previous = previous;
+
+					// #6109 - IE triggers two focus events and the second
+					// is asynchronous, so we need to reset the previous
+					// term synchronously and asynchronously :-(
+					this._delay( function() {
+						this.previous = previous;
+						this.selectedItem = item;
+					} );
+				}
+
+				if ( false !== this._trigger( "select", event, { item: item } ) ) {
+					this._value( item.value );
+				}
+
+				// reset the term after the select event
+				// this allows custom select handling to work properly
+				this.term = this._value();
+
+				this.close( event );
+				this.selectedItem = item;
+			}
+		} );
+
+		this.liveRegion = $( "<div>", {
+			role: "status",
+			"aria-live": "assertive",
+			"aria-relevant": "additions"
+		} )
+			.appendTo( this.document[ 0 ].body );
+
+		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
+
+		// Turning off autocomplete prevents the browser from remembering the
+		// value when navigating through history, so we re-enable autocomplete
+		// if the page is unloaded before the widget is destroyed. #7790
+		this._on( this.window, {
+			beforeunload: function() {
+				this.element.removeAttr( "autocomplete" );
+			}
+		} );
+	},
+
+	_destroy: function() {
+		clearTimeout( this.searching );
+		this.element.removeAttr( "autocomplete" );
+		this.menu.element.remove();
+		this.liveRegion.remove();
+	},
+
+	_setOption: function( key, value ) {
+		this._super( key, value );
+		if ( key === "source" ) {
+			this._initSource();
+		}
+		if ( key === "appendTo" ) {
+			this.menu.element.appendTo( this._appendTo() );
+		}
+		if ( key === "disabled" && value && this.xhr ) {
+			this.xhr.abort();
+		}
+	},
+
+	_isEventTargetInWidget: function( event ) {
+		var menuElement = this.menu.element[ 0 ];
+
+		return event.target === this.element[ 0 ] ||
+			event.target === menuElement ||
+			$.contains( menuElement, event.target );
+	},
+
+	_closeOnClickOutside: function( event ) {
+		if ( !this._isEventTargetInWidget( event ) ) {
+			this.close();
+		}
+	},
+
+	_appendTo: function() {
+		var element = this.options.appendTo;
+
+		if ( element ) {
+			element = element.jquery || element.nodeType ?
+				$( element ) :
+				this.document.find( element ).eq( 0 );
+		}
+
+		if ( !element || !element[ 0 ] ) {
+			element = this.element.closest( ".ui-front, dialog" );
+		}
+
+		if ( !element.length ) {
+			element = this.document[ 0 ].body;
+		}
+
+		return element;
+	},
+
+	_initSource: function() {
+		var array, url,
+			that = this;
+		if ( $.isArray( this.options.source ) ) {
+			array = this.options.source;
+			this.source = function( request, response ) {
+				response( $.ui.autocomplete.filter( array, request.term ) );
+			};
+		} else if ( typeof this.options.source === "string" ) {
+			url = this.options.source;
+			this.source = function( request, response ) {
+				if ( that.xhr ) {
+					that.xhr.abort();
+				}
+				that.xhr = $.ajax( {
+					url: url,
+					data: request,
+					dataType: "json",
+					success: function( data ) {
+						response( data );
+					},
+					error: function() {
+						response( [] );
+					}
+				} );
+			};
+		} else {
+			this.source = this.options.source;
+		}
+	},
+
+	_searchTimeout: function( event ) {
+		clearTimeout( this.searching );
+		this.searching = this._delay( function() {
+
+			// Search if the value has changed, or if the user retypes the same value (see #7434)
+			var equalValues = this.term === this._value(),
+				menuVisible = this.menu.element.is( ":visible" ),
+				modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
+
+			if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
+				this.selectedItem = null;
+				this.search( null, event );
+			}
+		}, this.options.delay );
+	},
+
+	search: function( value, event ) {
+		value = value != null ? value : this._value();
+
+		// Always save the actual value, not the one passed as an argument
+		this.term = this._value();
+
+		if ( value.length < this.options.minLength ) {
+			return this.close( event );
+		}
+
+		if ( this._trigger( "search", event ) === false ) {
+			return;
+		}
+
+		return this._search( value );
+	},
+
+	_search: function( value ) {
+		this.pending++;
+		this._addClass( "ui-autocomplete-loading" );
+		this.cancelSearch = false;
+
+		this.source( { term: value }, this._response() );
+	},
+
+	_response: function() {
+		var index = ++this.requestIndex;
+
+		return $.proxy( function( content ) {
+			if ( index === this.requestIndex ) {
+				this.__response( content );
+			}
+
+			this.pending--;
+			if ( !this.pending ) {
+				this._removeClass( "ui-autocomplete-loading" );
+			}
+		}, this );
+	},
+
+	__response: function( content ) {
+		if ( content ) {
+			content = this._normalize( content );
+		}
+		this._trigger( "response", null, { content: content } );
+		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
+			this._suggest( content );
+			this._trigger( "open" );
+		} else {
+
+			// use ._close() instead of .close() so we don't cancel future searches
+			this._close();
+		}
+	},
+
+	close: function( event ) {
+		this.cancelSearch = true;
+		this._close( event );
+	},
+
+	_close: function( event ) {
+
+		// Remove the handler that closes the menu on outside clicks
+		this._off( this.document, "mousedown" );
+
+		if ( this.menu.element.is( ":visible" ) ) {
+			this.menu.element.hide();
+			this.menu.blur();
+			this.isNewMenu = true;
+			this._trigger( "close", event );
+		}
+	},
+
+	_change: function( event ) {
+		if ( this.previous !== this._value() ) {
+			this._trigger( "change", event, { item: this.selectedItem } );
+		}
+	},
+
+	_normalize: function( items ) {
+
+		// assume all items have the right format when the first item is complete
+		if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
+			return items;
+		}
+		return $.map( items, function( item ) {
+			if ( typeof item === "string" ) {
+				return {
+					label: item,
+					value: item
+				};
+			}
+			return $.extend( {}, item, {
+				label: item.label || item.value,
+				value: item.value || item.label
+			} );
+		} );
+	},
+
+	_suggest: function( items ) {
+		var ul = this.menu.element.empty();
+		this._renderMenu( ul, items );
+		this.isNewMenu = true;
+		this.menu.refresh();
+
+		// Size and position menu
+		ul.show();
+		this._resizeMenu();
+		ul.position( $.extend( {
+			of: this.element
+		}, this.options.position ) );
+
+		if ( this.options.autoFocus ) {
+			this.menu.next();
+		}
+
+		// Listen for interactions outside of the widget (#6642)
+		this._on( this.document, {
+			mousedown: "_closeOnClickOutside"
+		} );
+	},
+
+	_resizeMenu: function() {
+		var ul = this.menu.element;
+		ul.outerWidth( Math.max(
+
+			// Firefox wraps long text (possibly a rounding bug)
+			// so we add 1px to avoid the wrapping (#7513)
+			ul.width( "" ).outerWidth() + 1,
+			this.element.outerWidth()
+		) );
+	},
+
+	_renderMenu: function( ul, items ) {
+		var that = this;
+		$.each( items, function( index, item ) {
+			that._renderItemData( ul, item );
+		} );
+	},
+
+	_renderItemData: function( ul, item ) {
+		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
+	},
+
+	_renderItem: function( ul, item ) {
+		return $( "<li>" )
+			.append( $( "<div>" ).text( item.label ) )
+			.appendTo( ul );
+	},
+
+	_move: function( direction, event ) {
+		if ( !this.menu.element.is( ":visible" ) ) {
+			this.search( null, event );
+			return;
+		}
+		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
+				this.menu.isLastItem() && /^next/.test( direction ) ) {
+
+			if ( !this.isMultiLine ) {
+				this._value( this.term );
+			}
+
+			this.menu.blur();
+			return;
+		}
+		this.menu[ direction ]( event );
+	},
+
+	widget: function() {
+		return this.menu.element;
+	},
+
+	_value: function() {
+		return this.valueMethod.apply( this.element, arguments );
+	},
+
+	_keyEvent: function( keyEvent, event ) {
+		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+			this._move( keyEvent, event );
+
+			// Prevents moving cursor to beginning/end of the text field in some browsers
+			event.preventDefault();
+		}
+	},
+
+	// Support: Chrome <=50
+	// We should be able to just use this.element.prop( "isContentEditable" )
+	// but hidden elements always report false in Chrome.
+	// https://code.google.com/p/chromium/issues/detail?id=313082
+	_isContentEditable: function( element ) {
+		if ( !element.length ) {
+			return false;
+		}
+
+		var editable = element.prop( "contentEditable" );
+
+		if ( editable === "inherit" ) {
+		  return this._isContentEditable( element.parent() );
+		}
+
+		return editable === "true";
+	}
+} );
+
+$.extend( $.ui.autocomplete, {
+	escapeRegex: function( value ) {
+		return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
+	},
+	filter: function( array, term ) {
+		var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
+		return $.grep( array, function( value ) {
+			return matcher.test( value.label || value.value || value );
+		} );
+	}
+} );
+
+// Live region extension, adding a `messages` option
+// NOTE: This is an experimental API. We are still investigating
+// a full solution for string manipulation and internationalization.
+$.widget( "ui.autocomplete", $.ui.autocomplete, {
+	options: {
+		messages: {
+			noResults: "No search results.",
+			results: function( amount ) {
+				return amount + ( amount > 1 ? " results are" : " result is" ) +
+					" available, use up and down arrow keys to navigate.";
+			}
+		}
+	},
+
+	__response: function( content ) {
+		var message;
+		this._superApply( arguments );
+		if ( this.options.disabled || this.cancelSearch ) {
+			return;
+		}
+		if ( content && content.length ) {
+			message = this.options.messages.results( content.length );
+		} else {
+			message = this.options.messages.noResults;
+		}
+		this.liveRegion.children().hide();
+		$( "<div>" ).text( message ).appendTo( this.liveRegion );
+	}
+} );
+
+return $.ui.autocomplete;
+
+} ) );
+/*
+
+	jQuery Tags Input Plugin 1.3.3
+
+	Copyright (c) 2011 XOXCO, Inc
+
+	Documentation for this plugin lives here:
+	http://xoxco.com/clickable/jquery-tags-input
+
+	Licensed under the MIT license:
+	http://www.opensource.org/licenses/mit-license.php
+
+	ben@xoxco.com
+
+*/
+
+(function($) {
+
+	var delimiter = new Array();
+	var tags_callbacks = new Array();
+	$.fn.doAutosize = function(o){
+	    var minWidth = $(this).data('minwidth'),
+	        maxWidth = $(this).data('maxwidth'),
+	        val = '',
+	        input = $(this),
+	        testSubject = $('#'+$(this).data('tester_id'));
+
+	    if (val === (val = input.val())) {return;}
+
+	    // Enter new content into testSubject
+	    var escaped = val.replace(/&/g, '&amp;').replace(/\s/g,' ').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+	    testSubject.html(escaped);
+	    // Calculate new width + whether to change
+	    var testerWidth = testSubject.width(),
+	        newWidth = (testerWidth + o.comfortZone) >= minWidth ? testerWidth + o.comfortZone : minWidth,
+	        currentWidth = input.width(),
+	        isValidWidthChange = (newWidth < currentWidth && newWidth >= minWidth)
+	                             || (newWidth > minWidth && newWidth < maxWidth);
+
+	    // Animate width
+	    if (isValidWidthChange) {
+	        input.width(newWidth);
+	    }
+
+
+  };
+  $.fn.resetAutosize = function(options){
+    // alert(JSON.stringify(options));
+    var minWidth =  $(this).data('minwidth') || options.minInputWidth || $(this).width(),
+        maxWidth = $(this).data('maxwidth') || options.maxInputWidth || ($(this).closest('.tagsinput').width() - options.inputPadding),
+        val = '',
+        input = $(this),
+        testSubject = $('<tester/>').css({
+            position: 'absolute',
+            top: -9999,
+            left: -9999,
+            width: 'auto',
+            fontSize: input.css('fontSize'),
+            fontFamily: input.css('fontFamily'),
+            fontWeight: input.css('fontWeight'),
+            letterSpacing: input.css('letterSpacing'),
+            whiteSpace: 'nowrap'
+        }),
+        testerId = $(this).attr('id')+'_autosize_tester';
+    if(! $('#'+testerId).length > 0){
+      testSubject.attr('id', testerId);
+      testSubject.appendTo('body');
+    }
+
+    input.data('minwidth', minWidth);
+    input.data('maxwidth', maxWidth);
+    input.data('tester_id', testerId);
+    input.css('width', minWidth);
+  };
+
+	$.fn.addTag = function(value,options) {
+			options = jQuery.extend({focus:false,callback:true},options);
+			this.each(function() {
+				var id = $(this).attr('id');
+
+				var tagslist = $(this).val().split(delimiter[id]);
+				if (tagslist[0] == '') {
+					tagslist = new Array();
+				}
+
+				value = jQuery.trim(value);
+
+				if (options.unique) {
+					var skipTag = $(this).tagExist(value);
+					if(skipTag == true) {
+					    //Marks fake input as not_valid to let styling it
+    				    $('#'+id+'_tag').addClass('not_valid');
+    				}
+				} else {
+					var skipTag = false;
+				}
+
+				if (value !='' && skipTag != true) {
+                    $('<span>').addClass('tag').append(
+                        $('<span>').text(value).append('&nbsp;&nbsp;'),
+                        $('<a>', {
+                            href  : '#',
+                            title : 'Removing tag',
+                            text  : 'x'
+                        }).click(function () {
+                            return $('#' + id).removeTag(escape(value));
+                        })
+                    ).insertBefore('#' + id + '_addTag');
+
+					tagslist.push(value);
+
+					$('#'+id+'_tag').val('');
+					if (options.focus) {
+						$('#'+id+'_tag').focus();
+					} else {
+						$('#'+id+'_tag').blur();
+					}
+
+					$.fn.tagsInput.updateTagsField(this,tagslist);
+
+					if (options.callback && tags_callbacks[id] && tags_callbacks[id]['onAddTag']) {
+						var f = tags_callbacks[id]['onAddTag'];
+						f.call(this, value);
+					}
+					if(tags_callbacks[id] && tags_callbacks[id]['onChange'])
+					{
+						var i = tagslist.length;
+						var f = tags_callbacks[id]['onChange'];
+						f.call(this, $(this), tagslist[i-1]);
+					}
+				}
+
+			});
+
+			return false;
+		};
+
+	$.fn.removeTag = function(value) {
+			value = unescape(value);
+			this.each(function() {
+				var id = $(this).attr('id');
+
+				var old = $(this).val().split(delimiter[id]);
+
+				$('#'+id+'_tagsinput .tag').remove();
+				str = '';
+				for (i=0; i< old.length; i++) {
+					if (old[i]!=value) {
+						str = str + delimiter[id] +old[i];
+					}
+				}
+
+				$.fn.tagsInput.importTags(this,str);
+
+				if (tags_callbacks[id] && tags_callbacks[id]['onRemoveTag']) {
+					var f = tags_callbacks[id]['onRemoveTag'];
+					f.call(this, value);
+				}
+			});
+
+			return false;
+		};
+
+	$.fn.tagExist = function(val) {
+		var id = $(this).attr('id');
+		var tagslist = $(this).val().split(delimiter[id]);
+		return (jQuery.inArray(val, tagslist) >= 0); //true when tag exists, false when not
+	};
+
+   // clear all existing tags and import new ones from a string
+   $.fn.importTags = function(str) {
+      var id = $(this).attr('id');
+      $('#'+id+'_tagsinput .tag').remove();
+      $.fn.tagsInput.importTags(this,str);
+   }
+
+	$.fn.tagsInput = function(options) {
+    var settings = jQuery.extend({
+      interactive:true,
+      defaultText:'add a tag',
+      minChars:0,
+      width:'300px',
+      height:'100px',
+      autocomplete: {selectFirst: false },
+      hide:true,
+      delimiter: ',',
+      unique:true,
+      removeWithBackspace:true,
+      placeholderColor:'#666666',
+      autosize: true,
+      comfortZone: 20,
+      inputPadding: 6*2
+    },options);
+
+    	var uniqueIdCounter = 0;
+
+		this.each(function() {
+         // If we have already initialized the field, do not do it again
+         if (typeof $(this).attr('data-tagsinput-init') !== 'undefined') {
+            return;
+         }
+
+         // Mark the field as having been initialized
+         $(this).attr('data-tagsinput-init', true);
+
+			if (settings.hide) {
+				$(this).hide();
+			}
+			var id = $(this).attr('id');
+			if (!id || delimiter[$(this).attr('id')]) {
+				id = $(this).attr('id', 'tags' + new Date().getTime() + (uniqueIdCounter++)).attr('id');
+			}
+
+			var data = jQuery.extend({
+				pid:id,
+				real_input: '#'+id,
+				holder: '#'+id+'_tagsinput',
+				input_wrapper: '#'+id+'_addTag',
+				fake_input: '#'+id+'_tag'
+			},settings);
+
+			delimiter[id] = data.delimiter;
+
+			if (settings.onAddTag || settings.onRemoveTag || settings.onChange) {
+				tags_callbacks[id] = new Array();
+				tags_callbacks[id]['onAddTag'] = settings.onAddTag;
+				tags_callbacks[id]['onRemoveTag'] = settings.onRemoveTag;
+				tags_callbacks[id]['onChange'] = settings.onChange;
+			}
+
+			var markup = '<div id="'+id+'_tagsinput" class="tagsinput"><div id="'+id+'_addTag">';
+
+			if (settings.interactive) {
+				markup = markup + '<input id="'+id+'_tag" value="" data-default="'+settings.defaultText+'" />';
+			}
+
+			markup = markup + '</div><div class="tags_clear"></div></div>';
+
+			$(markup).insertAfter(this);
+
+			$(data.holder).css('width',settings.width);
+			$(data.holder).css('min-height',settings.height);
+			$(data.holder).css('height',settings.height);
+
+			if ($(data.real_input).val()!='') {
+				$.fn.tagsInput.importTags($(data.real_input),$(data.real_input).val());
+			}
+			if (settings.interactive) {
+				$(data.fake_input).val($(data.fake_input).attr('data-default'));
+				$(data.fake_input).css('color',settings.placeholderColor);
+		        $(data.fake_input).resetAutosize(settings);
+
+				$(data.holder).bind('click',data,function(event) {
+					$(event.data.fake_input).focus();
+				});
+
+				$(data.fake_input).bind('focus',data,function(event) {
+					if ($(event.data.fake_input).val()==$(event.data.fake_input).attr('data-default')) {
+						$(event.data.fake_input).val('');
+					}
+					$(event.data.fake_input).css('color','#000000');
+				});
+
+				if (settings.autocomplete_url != undefined) {
+					autocomplete_options = {source: settings.autocomplete_url};
+					for (attrname in settings.autocomplete) {
+						autocomplete_options[attrname] = settings.autocomplete[attrname];
+					}
+
+					if (jQuery.Autocompleter !== undefined) {
+						$(data.fake_input).autocomplete(settings.autocomplete_url, settings.autocomplete);
+						$(data.fake_input).bind('result',data,function(event,data,formatted) {
+							if (data) {
+								$('#'+id).addTag(data[0] + "",{focus:true,unique:(settings.unique)});
+							}
+					  	});
+					} else if (jQuery.ui.autocomplete !== undefined) {
+						$(data.fake_input).autocomplete(autocomplete_options);
+						$(data.fake_input).bind('autocompleteselect',data,function(event,ui) {
+							$(event.data.real_input).addTag(ui.item.value,{focus:true,unique:(settings.unique)});
+							return false;
+						});
+					}
+
+
+				} else {
+						// if a user tabs out of the field, create a new tag
+						// this is only available if autocomplete is not used.
+						$(data.fake_input).bind('blur',data,function(event) {
+							var d = $(this).attr('data-default');
+							if ($(event.data.fake_input).val()!='' && $(event.data.fake_input).val()!=d) {
+								if( (event.data.minChars <= $(event.data.fake_input).val().length) && (!event.data.maxChars || (event.data.maxChars >= $(event.data.fake_input).val().length)) )
+									$(event.data.real_input).addTag($(event.data.fake_input).val(),{focus:true,unique:(settings.unique)});
+							} else {
+								$(event.data.fake_input).val($(event.data.fake_input).attr('data-default'));
+								$(event.data.fake_input).css('color',settings.placeholderColor);
+							}
+							return false;
+						});
+
+				}
+				// if user types a default delimiter like comma,semicolon and then create a new tag
+				$(data.fake_input).bind('keypress',data,function(event) {
+					if (_checkDelimiter(event)) {
+					    event.preventDefault();
+						if( (event.data.minChars <= $(event.data.fake_input).val().length) && (!event.data.maxChars || (event.data.maxChars >= $(event.data.fake_input).val().length)) )
+							$(event.data.real_input).addTag($(event.data.fake_input).val(),{focus:true,unique:(settings.unique)});
+					  	$(event.data.fake_input).resetAutosize(settings);
+						return false;
+					} else if (event.data.autosize) {
+			            $(event.data.fake_input).doAutosize(settings);
+
+          			}
+				});
+				//Delete last tag on backspace
+				data.removeWithBackspace && $(data.fake_input).bind('keydown', function(event)
+				{
+					if(event.keyCode == 8 && $(this).val() == '')
+					{
+						 event.preventDefault();
+						 var last_tag = $(this).closest('.tagsinput').find('.tag:last').text();
+						 var id = $(this).attr('id').replace(/_tag$/, '');
+						 last_tag = last_tag.replace(/[\s]+x$/, '');
+						 $('#' + id).removeTag(escape(last_tag));
+						 $(this).trigger('focus');
+					}
+				});
+				$(data.fake_input).blur();
+
+				//Removes the not_valid class when user changes the value of the fake input
+				if(data.unique) {
+				    $(data.fake_input).keydown(function(event){
+				        if(event.keyCode == 8 || String.fromCharCode(event.which).match(/\w+|[áéíóúÁÉÍÓÚñÑ,/]+/)) {
+				            $(this).removeClass('not_valid');
+				        }
+				    });
+				}
+			} // if settings.interactive
+		});
+
+		return this;
+
+	};
+
+	$.fn.tagsInput.updateTagsField = function(obj,tagslist) {
+		var id = $(obj).attr('id');
+		$(obj).val(tagslist.join(delimiter[id]));
+	};
+
+	$.fn.tagsInput.importTags = function(obj,val) {
+		$(obj).val('');
+		var id = $(obj).attr('id');
+		var tags = val.split(delimiter[id]);
+		for (i=0; i<tags.length; i++) {
+			$(obj).addTag(tags[i],{focus:false,callback:false});
+		}
+		if(tags_callbacks[id] && tags_callbacks[id]['onChange'])
+		{
+			var f = tags_callbacks[id]['onChange'];
+			f.call(obj, obj, tags[i]);
+		}
+	};
+
+   /**
+     * check delimiter Array
+     * @param event
+     * @returns {boolean}
+     * @private
+     */
+   var _checkDelimiter = function(event){
+      var found = false;
+      if (event.which == 13) {
+         return true;
+      }
+
+      if (typeof event.data.delimiter === 'string') {
+         if (event.which == event.data.delimiter.charCodeAt(0)) {
+            found = true;
+         }
+      } else {
+         $.each(event.data.delimiter, function(index, delimiter) {
+            if (event.which == delimiter.charCodeAt(0)) {
+               found = true;
+            }
+         });
+      }
+
+      return found;
+   }
+})(jQuery);
+(function($){
+
+    /**
+     * Copyright 2012, Digital Fusion
+     * Licensed under the MIT license.
+     * http://teamdf.com/jquery-plugins/license/
+     *
+     * @author Sam Sehnert
+     * @desc A small plugin that checks whether elements are within
+     *       the user visible viewport of a web browser.
+     *       only accounts for vertical position, not horizontal.
+     */
+    var $w = $(window);
+    $.fn.visible = function(partial,hidden,direction){
+
+        if (this.length < 1)
+            return;
+
+        var $t        = this.length > 1 ? this.eq(0) : this,
+            t         = $t.get(0),
+            vpWidth   = $w.width(),
+            vpHeight  = $w.height(),
+            direction = (direction) ? direction : 'both',
+            clientSize = hidden === true ? t.offsetWidth * t.offsetHeight : true;
+
+        if (typeof t.getBoundingClientRect === 'function'){
+
+            // Use this native browser method, if available.
+            var rec = t.getBoundingClientRect(),
+                tViz = rec.top    >= 0 && rec.top    <  vpHeight,
+                bViz = rec.bottom >  0 && rec.bottom <= vpHeight,
+                lViz = rec.left   >= 0 && rec.left   <  vpWidth,
+                rViz = rec.right  >  0 && rec.right  <= vpWidth,
+                vVisible   = partial ? tViz || bViz : tViz && bViz,
+                hVisible   = partial ? lViz || rViz : lViz && rViz;
+
+            if(direction === 'both')
+                return clientSize && vVisible && hVisible;
+            else if(direction === 'vertical')
+                return clientSize && vVisible;
+            else if(direction === 'horizontal')
+                return clientSize && hVisible;
+        } else {
+
+            var viewTop         = $w.scrollTop(),
+                viewBottom      = viewTop + vpHeight,
+                viewLeft        = $w.scrollLeft(),
+                viewRight       = viewLeft + vpWidth,
+                offset          = $t.offset(),
+                _top            = offset.top,
+                _bottom         = _top + $t.height(),
+                _left           = offset.left,
+                _right          = _left + $t.width(),
+                compareTop      = partial === true ? _bottom : _top,
+                compareBottom   = partial === true ? _top : _bottom,
+                compareLeft     = partial === true ? _right : _left,
+                compareRight    = partial === true ? _left : _right;
+
+            if(direction === 'both')
+                return !!clientSize && ((compareBottom <= viewBottom) && (compareTop >= viewTop)) && ((compareRight <= viewRight) && (compareLeft >= viewLeft));
+            else if(direction === 'vertical')
+                return !!clientSize && ((compareBottom <= viewBottom) && (compareTop >= viewTop));
+            else if(direction === 'horizontal')
+                return !!clientSize && ((compareRight <= viewRight) && (compareLeft >= viewLeft));
+        }
+    };
+
+})(jQuery);
+/*
+Turbolinks 5.2.0
+Copyright © 2018 Basecamp, LLC
+ */
+(function(){var t=this;(function(){(function(){this.Turbolinks={supported:function(){return null!=window.history.pushState&&null!=window.requestAnimationFrame&&null!=window.addEventListener}(),visit:function(t,r){return e.controller.visit(t,r)},clearCache:function(){return e.controller.clearCache()},setProgressBarDelay:function(t){return e.controller.setProgressBarDelay(t)}}}).call(this)}).call(t);var e=t.Turbolinks;(function(){(function(){var t,r,n,o=[].slice;e.copyObject=function(t){var e,r,n;r={};for(e in t)n=t[e],r[e]=n;return r},e.closest=function(e,r){return t.call(e,r)},t=function(){var t,e;return t=document.documentElement,null!=(e=t.closest)?e:function(t){var e;for(e=this;e;){if(e.nodeType===Node.ELEMENT_NODE&&r.call(e,t))return e;e=e.parentNode}}}(),e.defer=function(t){return setTimeout(t,1)},e.throttle=function(t){var e;return e=null,function(){var r;return r=1<=arguments.length?o.call(arguments,0):[],null!=e?e:e=requestAnimationFrame(function(n){return function(){return e=null,t.apply(n,r)}}(this))}},e.dispatch=function(t,e){var r,o,i,s,a,u;return a=null!=e?e:{},u=a.target,r=a.cancelable,o=a.data,i=document.createEvent("Events"),i.initEvent(t,!0,r===!0),i.data=null!=o?o:{},i.cancelable&&!n&&(s=i.preventDefault,i.preventDefault=function(){return this.defaultPrevented||Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}}),s.call(this)}),(null!=u?u:document).dispatchEvent(i),i},n=function(){var t;return t=document.createEvent("Events"),t.initEvent("test",!0,!0),t.preventDefault(),t.defaultPrevented}(),e.match=function(t,e){return r.call(t,e)},r=function(){var t,e,r,n;return t=document.documentElement,null!=(e=null!=(r=null!=(n=t.matchesSelector)?n:t.webkitMatchesSelector)?r:t.msMatchesSelector)?e:t.mozMatchesSelector}(),e.uuid=function(){var t,e,r;for(r="",t=e=1;36>=e;t=++e)r+=9===t||14===t||19===t||24===t?"-":15===t?"4":20===t?(Math.floor(4*Math.random())+8).toString(16):Math.floor(15*Math.random()).toString(16);return r}}).call(this),function(){e.Location=function(){function t(t){var e,r;null==t&&(t=""),r=document.createElement("a"),r.href=t.toString(),this.absoluteURL=r.href,e=r.hash.length,2>e?this.requestURL=this.absoluteURL:(this.requestURL=this.absoluteURL.slice(0,-e),this.anchor=r.hash.slice(1))}var e,r,n,o;return t.wrap=function(t){return t instanceof this?t:new this(t)},t.prototype.getOrigin=function(){return this.absoluteURL.split("/",3).join("/")},t.prototype.getPath=function(){var t,e;return null!=(t=null!=(e=this.requestURL.match(/\/\/[^\/]*(\/[^?;]*)/))?e[1]:void 0)?t:"/"},t.prototype.getPathComponents=function(){return this.getPath().split("/").slice(1)},t.prototype.getLastPathComponent=function(){return this.getPathComponents().slice(-1)[0]},t.prototype.getExtension=function(){var t,e;return null!=(t=null!=(e=this.getLastPathComponent().match(/\.[^.]*$/))?e[0]:void 0)?t:""},t.prototype.isHTML=function(){return this.getExtension().match(/^(?:|\.(?:htm|html|xhtml))$/)},t.prototype.isPrefixedBy=function(t){var e;return e=r(t),this.isEqualTo(t)||o(this.absoluteURL,e)},t.prototype.isEqualTo=function(t){return this.absoluteURL===(null!=t?t.absoluteURL:void 0)},t.prototype.toCacheKey=function(){return this.requestURL},t.prototype.toJSON=function(){return this.absoluteURL},t.prototype.toString=function(){return this.absoluteURL},t.prototype.valueOf=function(){return this.absoluteURL},r=function(t){return e(t.getOrigin()+t.getPath())},e=function(t){return n(t,"/")?t:t+"/"},o=function(t,e){return t.slice(0,e.length)===e},n=function(t,e){return t.slice(-e.length)===e},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.HttpRequest=function(){function r(r,n,o){this.delegate=r,this.requestCanceled=t(this.requestCanceled,this),this.requestTimedOut=t(this.requestTimedOut,this),this.requestFailed=t(this.requestFailed,this),this.requestLoaded=t(this.requestLoaded,this),this.requestProgressed=t(this.requestProgressed,this),this.url=e.Location.wrap(n).requestURL,this.referrer=e.Location.wrap(o).absoluteURL,this.createXHR()}return r.NETWORK_FAILURE=0,r.TIMEOUT_FAILURE=-1,r.timeout=60,r.prototype.send=function(){var t;return this.xhr&&!this.sent?(this.notifyApplicationBeforeRequestStart(),this.setProgress(0),this.xhr.send(),this.sent=!0,"function"==typeof(t=this.delegate).requestStarted?t.requestStarted():void 0):void 0},r.prototype.cancel=function(){return this.xhr&&this.sent?this.xhr.abort():void 0},r.prototype.requestProgressed=function(t){return t.lengthComputable?this.setProgress(t.loaded/t.total):void 0},r.prototype.requestLoaded=function(){return this.endRequest(function(t){return function(){var e;return 200<=(e=t.xhr.status)&&300>e?t.delegate.requestCompletedWithResponse(t.xhr.responseText,t.xhr.getResponseHeader("Turbolinks-Location")):(t.failed=!0,t.delegate.requestFailedWithStatusCode(t.xhr.status,t.xhr.responseText))}}(this))},r.prototype.requestFailed=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.NETWORK_FAILURE)}}(this))},r.prototype.requestTimedOut=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.TIMEOUT_FAILURE)}}(this))},r.prototype.requestCanceled=function(){return this.endRequest()},r.prototype.notifyApplicationBeforeRequestStart=function(){return e.dispatch("turbolinks:request-start",{data:{url:this.url,xhr:this.xhr}})},r.prototype.notifyApplicationAfterRequestEnd=function(){return e.dispatch("turbolinks:request-end",{data:{url:this.url,xhr:this.xhr}})},r.prototype.createXHR=function(){return this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url,!0),this.xhr.timeout=1e3*this.constructor.timeout,this.xhr.setRequestHeader("Accept","text/html, application/xhtml+xml"),this.xhr.setRequestHeader("Turbolinks-Referrer",this.referrer),this.xhr.onprogress=this.requestProgressed,this.xhr.onload=this.requestLoaded,this.xhr.onerror=this.requestFailed,this.xhr.ontimeout=this.requestTimedOut,this.xhr.onabort=this.requestCanceled},r.prototype.endRequest=function(t){return this.xhr?(this.notifyApplicationAfterRequestEnd(),null!=t&&t.call(this),this.destroy()):void 0},r.prototype.setProgress=function(t){var e;return this.progress=t,"function"==typeof(e=this.delegate).requestProgressed?e.requestProgressed(this.progress):void 0},r.prototype.destroy=function(){var t;return this.setProgress(1),"function"==typeof(t=this.delegate).requestFinished&&t.requestFinished(),this.delegate=null,this.xhr=null},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.ProgressBar=function(){function e(){this.trickle=t(this.trickle,this),this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement()}var r;return r=300,e.defaultCSS=".turbolinks-progress-bar {\n  position: fixed;\n  display: block;\n  top: 0;\n  left: 0;\n  height: 3px;\n  background: #0076ff;\n  z-index: 9999;\n  transition: width "+r+"ms ease-out, opacity "+r/2+"ms "+r/2+"ms ease-in;\n  transform: translate3d(0, 0, 0);\n}",e.prototype.show=function(){return this.visible?void 0:(this.visible=!0,this.installStylesheetElement(),this.installProgressElement(),this.startTrickling())},e.prototype.hide=function(){return this.visible&&!this.hiding?(this.hiding=!0,this.fadeProgressElement(function(t){return function(){return t.uninstallProgressElement(),t.stopTrickling(),t.visible=!1,t.hiding=!1}}(this))):void 0},e.prototype.setValue=function(t){return this.value=t,this.refresh()},e.prototype.installStylesheetElement=function(){return document.head.insertBefore(this.stylesheetElement,document.head.firstChild)},e.prototype.installProgressElement=function(){return this.progressElement.style.width=0,this.progressElement.style.opacity=1,document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()},e.prototype.fadeProgressElement=function(t){return this.progressElement.style.opacity=0,setTimeout(t,1.5*r)},e.prototype.uninstallProgressElement=function(){return this.progressElement.parentNode?document.documentElement.removeChild(this.progressElement):void 0},e.prototype.startTrickling=function(){return null!=this.trickleInterval?this.trickleInterval:this.trickleInterval=setInterval(this.trickle,r)},e.prototype.stopTrickling=function(){return clearInterval(this.trickleInterval),this.trickleInterval=null},e.prototype.trickle=function(){return this.setValue(this.value+Math.random()/100)},e.prototype.refresh=function(){return requestAnimationFrame(function(t){return function(){return t.progressElement.style.width=10+90*t.value+"%"}}(this))},e.prototype.createStylesheetElement=function(){var t;return t=document.createElement("style"),t.type="text/css",t.textContent=this.constructor.defaultCSS,t},e.prototype.createProgressElement=function(){var t;return t=document.createElement("div"),t.className="turbolinks-progress-bar",t},e}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.BrowserAdapter=function(){function r(r){this.controller=r,this.showProgressBar=t(this.showProgressBar,this),this.progressBar=new e.ProgressBar}var n,o,i;return i=e.HttpRequest,n=i.NETWORK_FAILURE,o=i.TIMEOUT_FAILURE,r.prototype.visitProposedToLocationWithAction=function(t,e){return this.controller.startVisitToLocationWithAction(t,e)},r.prototype.visitStarted=function(t){return t.issueRequest(),t.changeHistory(),t.loadCachedSnapshot()},r.prototype.visitRequestStarted=function(t){return this.progressBar.setValue(0),t.hasCachedSnapshot()||"restore"!==t.action?this.showProgressBarAfterDelay():this.showProgressBar()},r.prototype.visitRequestProgressed=function(t){return this.progressBar.setValue(t.progress)},r.prototype.visitRequestCompleted=function(t){return t.loadResponse()},r.prototype.visitRequestFailedWithStatusCode=function(t,e){switch(e){case n:case o:return this.reload();default:return t.loadResponse()}},r.prototype.visitRequestFinished=function(t){return this.hideProgressBar()},r.prototype.visitCompleted=function(t){return t.followRedirect()},r.prototype.pageInvalidated=function(){return this.reload()},r.prototype.showProgressBarAfterDelay=function(){return this.progressBarTimeout=setTimeout(this.showProgressBar,this.controller.progressBarDelay)},r.prototype.showProgressBar=function(){return this.progressBar.show()},r.prototype.hideProgressBar=function(){return this.progressBar.hide(),clearTimeout(this.progressBarTimeout)},r.prototype.reload=function(){return window.location.reload()},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.History=function(){function r(e){this.delegate=e,this.onPageLoad=t(this.onPageLoad,this),this.onPopState=t(this.onPopState,this)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("popstate",this.onPopState,!1),addEventListener("load",this.onPageLoad,!1),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("popstate",this.onPopState,!1),removeEventListener("load",this.onPageLoad,!1),this.started=!1):void 0},r.prototype.push=function(t,r){return t=e.Location.wrap(t),this.update("push",t,r)},r.prototype.replace=function(t,r){return t=e.Location.wrap(t),this.update("replace",t,r)},r.prototype.onPopState=function(t){var r,n,o,i;return this.shouldHandlePopState()&&(i=null!=(n=t.state)?n.turbolinks:void 0)?(r=e.Location.wrap(window.location),o=i.restorationIdentifier,this.delegate.historyPoppedToLocationWithRestorationIdentifier(r,o)):void 0},r.prototype.onPageLoad=function(t){return e.defer(function(t){return function(){return t.pageLoaded=!0}}(this))},r.prototype.shouldHandlePopState=function(){return this.pageIsLoaded()},r.prototype.pageIsLoaded=function(){return this.pageLoaded||"complete"===document.readyState},r.prototype.update=function(t,e,r){var n;return n={turbolinks:{restorationIdentifier:r}},history[t+"State"](n,null,e)},r}()}.call(this),function(){e.HeadDetails=function(){function t(t){var e,r,n,s,a,u;for(this.elements={},n=0,a=t.length;a>n;n++)u=t[n],u.nodeType===Node.ELEMENT_NODE&&(s=u.outerHTML,r=null!=(e=this.elements)[s]?e[s]:e[s]={type:i(u),tracked:o(u),elements:[]},r.elements.push(u))}var e,r,n,o,i;return t.fromHeadElement=function(t){var e;return new this(null!=(e=null!=t?t.childNodes:void 0)?e:[])},t.prototype.hasElementWithKey=function(t){return t in this.elements},t.prototype.getTrackedElementSignature=function(){var t,e;return function(){var r,n;r=this.elements,n=[];for(t in r)e=r[t].tracked,e&&n.push(t);return n}.call(this).join("")},t.prototype.getScriptElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("script",t)},t.prototype.getStylesheetElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("stylesheet",t)},t.prototype.getElementsMatchingTypeNotInDetails=function(t,e){var r,n,o,i,s,a;o=this.elements,s=[];for(n in o)i=o[n],a=i.type,r=i.elements,a!==t||e.hasElementWithKey(n)||s.push(r[0]);return s},t.prototype.getProvisionalElements=function(){var t,e,r,n,o,i,s;r=[],n=this.elements;for(e in n)o=n[e],s=o.type,i=o.tracked,t=o.elements,null!=s||i?t.length>1&&r.push.apply(r,t.slice(1)):r.push.apply(r,t);return r},t.prototype.getMetaValue=function(t){var e;return null!=(e=this.findMetaElementByName(t))?e.getAttribute("content"):void 0},t.prototype.findMetaElementByName=function(t){var r,n,o,i;r=void 0,i=this.elements;for(o in i)n=i[o].elements,e(n[0],t)&&(r=n[0]);return r},i=function(t){return r(t)?"script":n(t)?"stylesheet":void 0},o=function(t){return"reload"===t.getAttribute("data-turbolinks-track")},r=function(t){var e;return e=t.tagName.toLowerCase(),"script"===e},n=function(t){var e;return e=t.tagName.toLowerCase(),"style"===e||"link"===e&&"stylesheet"===t.getAttribute("rel")},e=function(t,e){var r;return r=t.tagName.toLowerCase(),"meta"===r&&t.getAttribute("name")===e},t}()}.call(this),function(){e.Snapshot=function(){function t(t,e){this.headDetails=t,this.bodyElement=e}return t.wrap=function(t){return t instanceof this?t:"string"==typeof t?this.fromHTMLString(t):this.fromHTMLElement(t)},t.fromHTMLString=function(t){var e;return e=document.createElement("html"),e.innerHTML=t,this.fromHTMLElement(e)},t.fromHTMLElement=function(t){var r,n,o,i;return o=t.querySelector("head"),r=null!=(i=t.querySelector("body"))?i:document.createElement("body"),n=e.HeadDetails.fromHeadElement(o),new this(n,r)},t.prototype.clone=function(){return new this.constructor(this.headDetails,this.bodyElement.cloneNode(!0))},t.prototype.getRootLocation=function(){var t,r;return r=null!=(t=this.getSetting("root"))?t:"/",new e.Location(r)},t.prototype.getCacheControlValue=function(){return this.getSetting("cache-control")},t.prototype.getElementForAnchor=function(t){try{return this.bodyElement.querySelector("[id='"+t+"'], a[name='"+t+"']")}catch(e){}},t.prototype.getPermanentElements=function(){return this.bodyElement.querySelectorAll("[id][data-turbolinks-permanent]")},t.prototype.getPermanentElementById=function(t){return this.bodyElement.querySelector("#"+t+"[data-turbolinks-permanent]")},t.prototype.getPermanentElementsPresentInSnapshot=function(t){var e,r,n,o,i;for(o=this.getPermanentElements(),i=[],r=0,n=o.length;n>r;r++)e=o[r],t.getPermanentElementById(e.id)&&i.push(e);return i},t.prototype.findFirstAutofocusableElement=function(){return this.bodyElement.querySelector("[autofocus]")},t.prototype.hasAnchor=function(t){return null!=this.getElementForAnchor(t)},t.prototype.isPreviewable=function(){return"no-preview"!==this.getCacheControlValue()},t.prototype.isCacheable=function(){return"no-cache"!==this.getCacheControlValue()},t.prototype.isVisitable=function(){return"reload"!==this.getSetting("visit-control")},t.prototype.getSetting=function(t){return this.headDetails.getMetaValue("turbolinks-"+t)},t}()}.call(this),function(){var t=[].slice;e.Renderer=function(){function e(){}var r;return e.render=function(){var e,r,n,o;return n=arguments[0],r=arguments[1],e=3<=arguments.length?t.call(arguments,2):[],o=function(t,e,r){r.prototype=t.prototype;var n=new r,o=t.apply(n,e);return Object(o)===o?o:n}(this,e,function(){}),o.delegate=n,o.render(r),o},e.prototype.renderView=function(t){return this.delegate.viewWillRender(this.newBody),t(),this.delegate.viewRendered(this.newBody)},e.prototype.invalidateView=function(){return this.delegate.viewInvalidated()},e.prototype.createScriptElement=function(t){var e;return"false"===t.getAttribute("data-turbolinks-eval")?t:(e=document.createElement("script"),e.textContent=t.textContent,e.async=!1,r(e,t),e)},r=function(t,e){var r,n,o,i,s,a,u;for(i=e.attributes,a=[],r=0,n=i.length;n>r;r++)s=i[r],o=s.name,u=s.value,a.push(t.setAttribute(o,u));return a},e}()}.call(this),function(){var t,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;e.SnapshotRenderer=function(e){function o(t,e,r){this.currentSnapshot=t,this.newSnapshot=e,this.isPreview=r,this.currentHeadDetails=this.currentSnapshot.headDetails,this.newHeadDetails=this.newSnapshot.headDetails,this.currentBody=this.currentSnapshot.bodyElement,this.newBody=this.newSnapshot.bodyElement}return n(o,e),o.prototype.render=function(t){return this.shouldRender()?(this.mergeHead(),this.renderView(function(e){return function(){return e.replaceBody(),e.isPreview||e.focusFirstAutofocusableElement(),t()}}(this))):this.invalidateView()},o.prototype.mergeHead=function(){return this.copyNewHeadStylesheetElements(),this.copyNewHeadScriptElements(),this.removeCurrentHeadProvisionalElements(),this.copyNewHeadProvisionalElements()},o.prototype.replaceBody=function(){var t;return t=this.relocateCurrentBodyPermanentElements(),this.activateNewBodyScriptElements(),this.assignNewBody(),this.replacePlaceholderElementsWithClonedPermanentElements(t)},o.prototype.shouldRender=function(){return this.newSnapshot.isVisitable()&&this.trackedElementsAreIdentical()},o.prototype.trackedElementsAreIdentical=function(){return this.currentHeadDetails.getTrackedElementSignature()===this.newHeadDetails.getTrackedElementSignature()},o.prototype.copyNewHeadStylesheetElements=function(){var t,e,r,n,o;for(n=this.getNewHeadStylesheetElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},o.prototype.copyNewHeadScriptElements=function(){var t,e,r,n,o;for(n=this.getNewHeadScriptElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(this.createScriptElement(t)));return o},o.prototype.removeCurrentHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getCurrentHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.removeChild(t));return o},o.prototype.copyNewHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getNewHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},o.prototype.relocateCurrentBodyPermanentElements=function(){var e,n,o,i,s,a,u;for(a=this.getCurrentBodyPermanentElements(),u=[],e=0,n=a.length;n>e;e++)i=a[e],s=t(i),o=this.newSnapshot.getPermanentElementById(i.id),r(i,s.element),r(o,i),u.push(s);return u},o.prototype.replacePlaceholderElementsWithClonedPermanentElements=function(t){var e,n,o,i,s,a,u;for(u=[],o=0,i=t.length;i>o;o++)a=t[o],n=a.element,s=a.permanentElement,e=s.cloneNode(!0),u.push(r(n,e));return u},o.prototype.activateNewBodyScriptElements=function(){var t,e,n,o,i,s;for(i=this.getNewBodyScriptElements(),s=[],e=0,o=i.length;o>e;e++)n=i[e],t=this.createScriptElement(n),s.push(r(n,t));return s},o.prototype.assignNewBody=function(){return document.body=this.newBody},o.prototype.focusFirstAutofocusableElement=function(){var t;return null!=(t=this.newSnapshot.findFirstAutofocusableElement())?t.focus():void 0},o.prototype.getNewHeadStylesheetElements=function(){return this.newHeadDetails.getStylesheetElementsNotInDetails(this.currentHeadDetails)},o.prototype.getNewHeadScriptElements=function(){return this.newHeadDetails.getScriptElementsNotInDetails(this.currentHeadDetails)},o.prototype.getCurrentHeadProvisionalElements=function(){return this.currentHeadDetails.getProvisionalElements()},o.prototype.getNewHeadProvisionalElements=function(){return this.newHeadDetails.getProvisionalElements()},o.prototype.getCurrentBodyPermanentElements=function(){return this.currentSnapshot.getPermanentElementsPresentInSnapshot(this.newSnapshot)},o.prototype.getNewBodyScriptElements=function(){return this.newBody.querySelectorAll("script")},o}(e.Renderer),t=function(t){var e;return e=document.createElement("meta"),e.setAttribute("name","turbolinks-permanent-placeholder"),e.setAttribute("content",t.id),{element:e,permanentElement:t}},r=function(t,e){var r;return(r=t.parentNode)?r.replaceChild(e,t):void 0}}.call(this),function(){var t=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;e.ErrorRenderer=function(e){function r(t){var e;e=document.createElement("html"),e.innerHTML=t,this.newHead=e.querySelector("head"),this.newBody=e.querySelector("body")}return t(r,e),r.prototype.render=function(t){return this.renderView(function(e){return function(){return e.replaceHeadAndBody(),e.activateBodyScriptElements(),t()}}(this))},r.prototype.replaceHeadAndBody=function(){var t,e;return e=document.head,t=document.body,e.parentNode.replaceChild(this.newHead,e),t.parentNode.replaceChild(this.newBody,t)},r.prototype.activateBodyScriptElements=function(){var t,e,r,n,o,i;for(n=this.getScriptElements(),i=[],e=0,r=n.length;r>e;e++)o=n[e],t=this.createScriptElement(o),i.push(o.parentNode.replaceChild(t,o));return i},r.prototype.getScriptElements=function(){return document.documentElement.querySelectorAll("script")},r}(e.Renderer)}.call(this),function(){e.View=function(){function t(t){this.delegate=t,this.htmlElement=document.documentElement}return t.prototype.getRootLocation=function(){return this.getSnapshot().getRootLocation()},t.prototype.getElementForAnchor=function(t){return this.getSnapshot().getElementForAnchor(t)},t.prototype.getSnapshot=function(){return e.Snapshot.fromHTMLElement(this.htmlElement)},t.prototype.render=function(t,e){var r,n,o;return o=t.snapshot,r=t.error,n=t.isPreview,this.markAsPreview(n),null!=o?this.renderSnapshot(o,n,e):this.renderError(r,e)},t.prototype.markAsPreview=function(t){return t?this.htmlElement.setAttribute("data-turbolinks-preview",""):this.htmlElement.removeAttribute("data-turbolinks-preview")},t.prototype.renderSnapshot=function(t,r,n){return e.SnapshotRenderer.render(this.delegate,n,this.getSnapshot(),e.Snapshot.wrap(t),r)},t.prototype.renderError=function(t,r){return e.ErrorRenderer.render(this.delegate,r,t)},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.ScrollManager=function(){function r(r){this.delegate=r,this.onScroll=t(this.onScroll,this),this.onScroll=e.throttle(this.onScroll)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("scroll",this.onScroll,!1),this.onScroll(),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("scroll",this.onScroll,!1),this.started=!1):void 0},r.prototype.scrollToElement=function(t){return t.scrollIntoView()},r.prototype.scrollToPosition=function(t){var e,r;return e=t.x,r=t.y,window.scrollTo(e,r)},r.prototype.onScroll=function(t){return this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})},r.prototype.updatePosition=function(t){var e;return this.position=t,null!=(e=this.delegate)?e.scrollPositionChanged(this.position):void 0},r}()}.call(this),function(){e.SnapshotCache=function(){function t(t){this.size=t,this.keys=[],this.snapshots={}}var r;return t.prototype.has=function(t){var e;return e=r(t),e in this.snapshots},t.prototype.get=function(t){var e;if(this.has(t))return e=this.read(t),this.touch(t),e},t.prototype.put=function(t,e){return this.write(t,e),this.touch(t),e},t.prototype.read=function(t){var e;return e=r(t),this.snapshots[e]},t.prototype.write=function(t,e){var n;return n=r(t),this.snapshots[n]=e},t.prototype.touch=function(t){var e,n;return n=r(t),e=this.keys.indexOf(n),e>-1&&this.keys.splice(e,1),this.keys.unshift(n),this.trim()},t.prototype.trim=function(){var t,e,r,n,o;for(n=this.keys.splice(this.size),o=[],t=0,r=n.length;r>t;t++)e=n[t],o.push(delete this.snapshots[e]);return o},r=function(t){return e.Location.wrap(t).toCacheKey()},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Visit=function(){function r(r,n,o){this.controller=r,this.action=o,this.performScroll=t(this.performScroll,this),this.identifier=e.uuid(),this.location=e.Location.wrap(n),this.adapter=this.controller.adapter,this.state="initialized",this.timingMetrics={}}var n;return r.prototype.start=function(){return"initialized"===this.state?(this.recordTimingMetric("visitStart"),this.state="started",this.adapter.visitStarted(this)):void 0},r.prototype.cancel=function(){var t;return"started"===this.state?(null!=(t=this.request)&&t.cancel(),this.cancelRender(),this.state="canceled"):void 0},r.prototype.complete=function(){var t;return"started"===this.state?(this.recordTimingMetric("visitEnd"),this.state="completed","function"==typeof(t=this.adapter).visitCompleted&&t.visitCompleted(this),this.controller.visitCompleted(this)):void 0},r.prototype.fail=function(){var t;return"started"===this.state?(this.state="failed","function"==typeof(t=this.adapter).visitFailed?t.visitFailed(this):void 0):void 0},r.prototype.changeHistory=function(){var t,e;return this.historyChanged?void 0:(t=this.location.isEqualTo(this.referrer)?"replace":this.action,e=n(t),this.controller[e](this.location,this.restorationIdentifier),this.historyChanged=!0)},r.prototype.issueRequest=function(){return this.shouldIssueRequest()&&null==this.request?(this.progress=0,this.request=new e.HttpRequest(this,this.location,this.referrer),this.request.send()):void 0},r.prototype.getCachedSnapshot=function(){var t;return!(t=this.controller.getCachedSnapshotForLocation(this.location))||null!=this.location.anchor&&!t.hasAnchor(this.location.anchor)||"restore"!==this.action&&!t.isPreviewable()?void 0:t},r.prototype.hasCachedSnapshot=function(){return null!=this.getCachedSnapshot()},r.prototype.loadCachedSnapshot=function(){var t,e;return(e=this.getCachedSnapshot())?(t=this.shouldIssueRequest(),this.render(function(){var r;return this.cacheSnapshot(),this.controller.render({snapshot:e,isPreview:t},this.performScroll),"function"==typeof(r=this.adapter).visitRendered&&r.visitRendered(this),t?void 0:this.complete()})):void 0},r.prototype.loadResponse=function(){return null!=this.response?this.render(function(){var t,e;return this.cacheSnapshot(),this.request.failed?(this.controller.render({error:this.response},this.performScroll),"function"==typeof(t=this.adapter).visitRendered&&t.visitRendered(this),this.fail()):(this.controller.render({snapshot:this.response},this.performScroll),"function"==typeof(e=this.adapter).visitRendered&&e.visitRendered(this),this.complete())}):void 0},r.prototype.followRedirect=function(){return this.redirectedToLocation&&!this.followedRedirect?(this.location=this.redirectedToLocation,this.controller.replaceHistoryWithLocationAndRestorationIdentifier(this.redirectedToLocation,this.restorationIdentifier),this.followedRedirect=!0):void 0},r.prototype.requestStarted=function(){var t;return this.recordTimingMetric("requestStart"),"function"==typeof(t=this.adapter).visitRequestStarted?t.visitRequestStarted(this):void 0},r.prototype.requestProgressed=function(t){var e;return this.progress=t,"function"==typeof(e=this.adapter).visitRequestProgressed?e.visitRequestProgressed(this):void 0},r.prototype.requestCompletedWithResponse=function(t,r){return this.response=t,null!=r&&(this.redirectedToLocation=e.Location.wrap(r)),this.adapter.visitRequestCompleted(this)},r.prototype.requestFailedWithStatusCode=function(t,e){return this.response=e,this.adapter.visitRequestFailedWithStatusCode(this,t)},r.prototype.requestFinished=function(){var t;return this.recordTimingMetric("requestEnd"),"function"==typeof(t=this.adapter).visitRequestFinished?t.visitRequestFinished(this):void 0},r.prototype.performScroll=function(){return this.scrolled?void 0:("restore"===this.action?this.scrollToRestoredPosition()||this.scrollToTop():this.scrollToAnchor()||this.scrollToTop(),this.scrolled=!0)},r.prototype.scrollToRestoredPosition=function(){var t,e;return t=null!=(e=this.restorationData)?e.scrollPosition:void 0,null!=t?(this.controller.scrollToPosition(t),!0):void 0},r.prototype.scrollToAnchor=function(){return null!=this.location.anchor?(this.controller.scrollToAnchor(this.location.anchor),!0):void 0},r.prototype.scrollToTop=function(){return this.controller.scrollToPosition({x:0,y:0})},r.prototype.recordTimingMetric=function(t){var e;return null!=(e=this.timingMetrics)[t]?e[t]:e[t]=(new Date).getTime()},r.prototype.getTimingMetrics=function(){return e.copyObject(this.timingMetrics)},n=function(t){switch(t){case"replace":return"replaceHistoryWithLocationAndRestorationIdentifier";case"advance":case"restore":return"pushHistoryWithLocationAndRestorationIdentifier"}},r.prototype.shouldIssueRequest=function(){return"restore"===this.action?!this.hasCachedSnapshot():!0},r.prototype.cacheSnapshot=function(){return this.snapshotCached?void 0:(this.controller.cacheSnapshot(),this.snapshotCached=!0)},r.prototype.render=function(t){return this.cancelRender(),this.frame=requestAnimationFrame(function(e){return function(){return e.frame=null,t.call(e)}}(this))},r.prototype.cancelRender=function(){return this.frame?cancelAnimationFrame(this.frame):void 0},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Controller=function(){function r(){this.clickBubbled=t(this.clickBubbled,this),this.clickCaptured=t(this.clickCaptured,this),this.pageLoaded=t(this.pageLoaded,this),this.history=new e.History(this),this.view=new e.View(this),this.scrollManager=new e.ScrollManager(this),this.restorationData={},this.clearCache(),this.setProgressBarDelay(500)}return r.prototype.start=function(){return e.supported&&!this.started?(addEventListener("click",this.clickCaptured,!0),addEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.start(),this.startHistory(),this.started=!0,this.enabled=!0):void 0},r.prototype.disable=function(){return this.enabled=!1},r.prototype.stop=function(){return this.started?(removeEventListener("click",this.clickCaptured,!0),removeEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.stop(),this.stopHistory(),this.started=!1):void 0},r.prototype.clearCache=function(){return this.cache=new e.SnapshotCache(10)},r.prototype.visit=function(t,r){var n,o;return null==r&&(r={}),t=e.Location.wrap(t),this.applicationAllowsVisitingLocation(t)?this.locationIsVisitable(t)?(n=null!=(o=r.action)?o:"advance",this.adapter.visitProposedToLocationWithAction(t,n)):window.location=t:void 0},r.prototype.startVisitToLocationWithAction=function(t,r,n){var o;return e.supported?(o=this.getRestorationDataForIdentifier(n),this.startVisit(t,r,{restorationData:o})):window.location=t},r.prototype.setProgressBarDelay=function(t){return this.progressBarDelay=t},r.prototype.startHistory=function(){return this.location=e.Location.wrap(window.location),this.restorationIdentifier=e.uuid(),this.history.start(),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.stopHistory=function(){return this.history.stop()},r.prototype.pushHistoryWithLocationAndRestorationIdentifier=function(t,r){return this.restorationIdentifier=r,this.location=e.Location.wrap(t),this.history.push(this.location,this.restorationIdentifier)},r.prototype.replaceHistoryWithLocationAndRestorationIdentifier=function(t,r){return this.restorationIdentifier=r,this.location=e.Location.wrap(t),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.historyPoppedToLocationWithRestorationIdentifier=function(t,r){var n;return this.restorationIdentifier=r,this.enabled?(n=this.getRestorationDataForIdentifier(this.restorationIdentifier),this.startVisit(t,"restore",{restorationIdentifier:this.restorationIdentifier,restorationData:n,historyChanged:!0}),this.location=e.Location.wrap(t)):this.adapter.pageInvalidated()},r.prototype.getCachedSnapshotForLocation=function(t){var e;return null!=(e=this.cache.get(t))?e.clone():void 0},r.prototype.shouldCacheSnapshot=function(){return this.view.getSnapshot().isCacheable();
+},r.prototype.cacheSnapshot=function(){var t,r;return this.shouldCacheSnapshot()?(this.notifyApplicationBeforeCachingSnapshot(),r=this.view.getSnapshot(),t=this.lastRenderedLocation,e.defer(function(e){return function(){return e.cache.put(t,r.clone())}}(this))):void 0},r.prototype.scrollToAnchor=function(t){var e;return(e=this.view.getElementForAnchor(t))?this.scrollToElement(e):this.scrollToPosition({x:0,y:0})},r.prototype.scrollToElement=function(t){return this.scrollManager.scrollToElement(t)},r.prototype.scrollToPosition=function(t){return this.scrollManager.scrollToPosition(t)},r.prototype.scrollPositionChanged=function(t){var e;return e=this.getCurrentRestorationData(),e.scrollPosition=t},r.prototype.render=function(t,e){return this.view.render(t,e)},r.prototype.viewInvalidated=function(){return this.adapter.pageInvalidated()},r.prototype.viewWillRender=function(t){return this.notifyApplicationBeforeRender(t)},r.prototype.viewRendered=function(){return this.lastRenderedLocation=this.currentVisit.location,this.notifyApplicationAfterRender()},r.prototype.pageLoaded=function(){return this.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()},r.prototype.clickCaptured=function(){return removeEventListener("click",this.clickBubbled,!1),addEventListener("click",this.clickBubbled,!1)},r.prototype.clickBubbled=function(t){var e,r,n;return this.enabled&&this.clickEventIsSignificant(t)&&(r=this.getVisitableLinkForNode(t.target))&&(n=this.getVisitableLocationForLink(r))&&this.applicationAllowsFollowingLinkToLocation(r,n)?(t.preventDefault(),e=this.getActionForLink(r),this.visit(n,{action:e})):void 0},r.prototype.applicationAllowsFollowingLinkToLocation=function(t,e){var r;return r=this.notifyApplicationAfterClickingLinkToLocation(t,e),!r.defaultPrevented},r.prototype.applicationAllowsVisitingLocation=function(t){var e;return e=this.notifyApplicationBeforeVisitingLocation(t),!e.defaultPrevented},r.prototype.notifyApplicationAfterClickingLinkToLocation=function(t,r){return e.dispatch("turbolinks:click",{target:t,data:{url:r.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationBeforeVisitingLocation=function(t){return e.dispatch("turbolinks:before-visit",{data:{url:t.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationAfterVisitingLocation=function(t){return e.dispatch("turbolinks:visit",{data:{url:t.absoluteURL}})},r.prototype.notifyApplicationBeforeCachingSnapshot=function(){return e.dispatch("turbolinks:before-cache")},r.prototype.notifyApplicationBeforeRender=function(t){return e.dispatch("turbolinks:before-render",{data:{newBody:t}})},r.prototype.notifyApplicationAfterRender=function(){return e.dispatch("turbolinks:render")},r.prototype.notifyApplicationAfterPageLoad=function(t){return null==t&&(t={}),e.dispatch("turbolinks:load",{data:{url:this.location.absoluteURL,timing:t}})},r.prototype.startVisit=function(t,e,r){var n;return null!=(n=this.currentVisit)&&n.cancel(),this.currentVisit=this.createVisit(t,e,r),this.currentVisit.start(),this.notifyApplicationAfterVisitingLocation(t)},r.prototype.createVisit=function(t,r,n){var o,i,s,a,u;return i=null!=n?n:{},a=i.restorationIdentifier,s=i.restorationData,o=i.historyChanged,u=new e.Visit(this,t,r),u.restorationIdentifier=null!=a?a:e.uuid(),u.restorationData=e.copyObject(s),u.historyChanged=o,u.referrer=this.location,u},r.prototype.visitCompleted=function(t){return this.notifyApplicationAfterPageLoad(t.getTimingMetrics())},r.prototype.clickEventIsSignificant=function(t){return!(t.defaultPrevented||t.target.isContentEditable||t.which>1||t.altKey||t.ctrlKey||t.metaKey||t.shiftKey)},r.prototype.getVisitableLinkForNode=function(t){return this.nodeIsVisitable(t)?e.closest(t,"a[href]:not([target]):not([download])"):void 0},r.prototype.getVisitableLocationForLink=function(t){var r;return r=new e.Location(t.getAttribute("href")),this.locationIsVisitable(r)?r:void 0},r.prototype.getActionForLink=function(t){var e;return null!=(e=t.getAttribute("data-turbolinks-action"))?e:"advance"},r.prototype.nodeIsVisitable=function(t){var r;return(r=e.closest(t,"[data-turbolinks]"))?"false"!==r.getAttribute("data-turbolinks"):!0},r.prototype.locationIsVisitable=function(t){return t.isPrefixedBy(this.view.getRootLocation())&&t.isHTML()},r.prototype.getCurrentRestorationData=function(){return this.getRestorationDataForIdentifier(this.restorationIdentifier)},r.prototype.getRestorationDataForIdentifier=function(t){var e;return null!=(e=this.restorationData)[t]?e[t]:e[t]={}},r}()}.call(this),function(){!function(){var t,e;if((t=e=document.currentScript)&&!e.hasAttribute("data-turbolinks-suppress-warning"))for(;t=t.parentNode;)if(t===document.body)return console.warn("You are loading Turbolinks from a <script> element inside the <body> element. This is probably not what you meant to do!\n\nLoad your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\nFor more information, see: https://github.com/turbolinks/turbolinks#working-with-script-elements\n\n\u2014\u2014\nSuppress this warning by adding a `data-turbolinks-suppress-warning` attribute to: %s",e.outerHTML)}()}.call(this),function(){var t,r,n;e.start=function(){return r()?(null==e.controller&&(e.controller=t()),e.controller.start()):void 0},r=function(){return null==window.Turbolinks&&(window.Turbolinks=e),n()},t=function(){var t;return t=new e.Controller,t.adapter=new e.BrowserAdapter(t),t},n=function(){return window.Turbolinks===e},n()&&e.start()}.call(this)}).call(this),"object"==typeof module&&module.exports?module.exports=e:"function"==typeof define&&define.amd&&define(e)}).call(this);
+window.TinyMCERails = {
+  configuration: {
+    default: {}
+  },
+
+  initialize: function(config, options) {
+    if (typeof tinyMCE != 'undefined') {
+      // Merge the custom options with the given configuration
+      var configuration = TinyMCERails.configuration[config || 'default'];
+      configuration = TinyMCERails._merge(configuration, options);
+
+      tinymce.init(configuration);
+    } else {
+      // Wait until TinyMCE is loaded
+      setTimeout(function() {
+        TinyMCERails.initialize(config, options);
+      }, 50);
+    }
+  },
+
+  setupTurbolinks: function() {
+    // Remove all TinyMCE instances before rendering
+    document.addEventListener('turbolinks:before-render', function() {
+      tinymce.remove();
+    });
+  },
+
+  _merge: function() {
+    var result = {};
+
+    for (var i = 0; i < arguments.length; ++i) {
+      var source = arguments[i];
+
+      for (var key in source) {
+        if (Object.prototype.hasOwnProperty.call(source, key)) {
+          if (Object.prototype.toString.call(source[key]) === '[object Object]') {
+            result[key] = TinyMCERails._merge(result[key], source[key]);
+          } else {
+            result[key] = source[key];
+          }
+        }
+      }
+    }
+
+    return result;
+  }
+};
+
+if (typeof Turbolinks != 'undefined' && Turbolinks.supported) {
+  TinyMCERails.setupTurbolinks();
+};
+window.tinymce = window.tinymce || {
+  base:   '/assets/tinymce',
+  suffix: ''
+};
+/**
+ * TinyMCE version 6.0.3 (2022-05-25)
+ */
+
+(function () {
+    'use strict';
+
+    var typeOf$1 = function (x) {
+      if (x === null) {
+        return 'null';
+      }
+      if (x === undefined) {
+        return 'undefined';
+      }
+      var t = typeof x;
+      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
+        return 'array';
+      }
+      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
+        return 'string';
+      }
+      return t;
+    };
+    var isEquatableType = function (x) {
+      return [
+        'undefined',
+        'boolean',
+        'number',
+        'string',
+        'function',
+        'xml',
+        'null'
+      ].indexOf(x) !== -1;
+    };
+
+    var sort$1 = function (xs, compareFn) {
+      var clone = Array.prototype.slice.call(xs);
+      return clone.sort(compareFn);
+    };
+
+    var contramap = function (eqa, f) {
+      return eq$2(function (x, y) {
+        return eqa.eq(f(x), f(y));
+      });
+    };
+    var eq$2 = function (f) {
+      return { eq: f };
+    };
+    var tripleEq = eq$2(function (x, y) {
+      return x === y;
+    });
+    var eqString = tripleEq;
+    var eqArray = function (eqa) {
+      return eq$2(function (x, y) {
+        if (x.length !== y.length) {
+          return false;
+        }
+        var len = x.length;
+        for (var i = 0; i < len; i++) {
+          if (!eqa.eq(x[i], y[i])) {
+            return false;
+          }
+        }
+        return true;
+      });
+    };
+    var eqSortedArray = function (eqa, compareFn) {
+      return contramap(eqArray(eqa), function (xs) {
+        return sort$1(xs, compareFn);
+      });
+    };
+    var eqRecord = function (eqa) {
+      return eq$2(function (x, y) {
+        var kx = Object.keys(x);
+        var ky = Object.keys(y);
+        if (!eqSortedArray(eqString).eq(kx, ky)) {
+          return false;
+        }
+        var len = kx.length;
+        for (var i = 0; i < len; i++) {
+          var q = kx[i];
+          if (!eqa.eq(x[q], y[q])) {
+            return false;
+          }
+        }
+        return true;
+      });
+    };
+    var eqAny = eq$2(function (x, y) {
+      if (x === y) {
+        return true;
+      }
+      var tx = typeOf$1(x);
+      var ty = typeOf$1(y);
+      if (tx !== ty) {
+        return false;
+      }
+      if (isEquatableType(tx)) {
+        return x === y;
+      } else if (tx === 'array') {
+        return eqArray(eqAny).eq(x, y);
+      } else if (tx === 'object') {
+        return eqRecord(eqAny).eq(x, y);
+      }
+      return false;
+    });
+
+    const getPrototypeOf$1 = Object.getPrototypeOf;
+    const hasProto = (v, constructor, predicate) => {
+      var _a;
+      if (predicate(v, constructor.prototype)) {
+        return true;
+      } else {
+        return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
+      }
+    };
+    const typeOf = x => {
+      const t = typeof x;
+      if (x === null) {
+        return 'null';
+      } else if (t === 'object' && Array.isArray(x)) {
+        return 'array';
+      } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
+        return 'string';
+      } else {
+        return t;
+      }
+    };
+    const isType$1 = type => value => typeOf(value) === type;
+    const isSimpleType = type => value => typeof value === type;
+    const eq$1 = t => a => t === a;
+    const is$4 = (value, constructor) => isObject(value) && hasProto(value, constructor, (o, proto) => getPrototypeOf$1(o) === proto);
+    const isString = isType$1('string');
+    const isObject = isType$1('object');
+    const isPlainObject = value => is$4(value, Object);
+    const isArray$1 = isType$1('array');
+    const isNull = eq$1(null);
+    const isBoolean = isSimpleType('boolean');
+    const isUndefined = eq$1(undefined);
+    const isNullable = a => a === null || a === undefined;
+    const isNonNullable = a => !isNullable(a);
+    const isFunction = isSimpleType('function');
+    const isNumber = isSimpleType('number');
+    const isArrayOf = (value, pred) => {
+      if (isArray$1(value)) {
+        for (let i = 0, len = value.length; i < len; ++i) {
+          if (!pred(value[i])) {
+            return false;
+          }
+        }
+        return true;
+      }
+      return false;
+    };
+
+    const noop = () => {
+    };
+    const compose = (fa, fb) => {
+      return (...args) => {
+        return fa(fb.apply(null, args));
+      };
+    };
+    const compose1 = (fbc, fab) => a => fbc(fab(a));
+    const constant = value => {
+      return () => {
+        return value;
+      };
+    };
+    const identity = x => {
+      return x;
+    };
+    const tripleEquals = (a, b) => {
+      return a === b;
+    };
+    function curry(fn, ...initialArgs) {
+      return (...restArgs) => {
+        const all = initialArgs.concat(restArgs);
+        return fn.apply(null, all);
+      };
+    }
+    const not = f => t => !f(t);
+    const die = msg => {
+      return () => {
+        throw new Error(msg);
+      };
+    };
+    const apply$1 = f => {
+      return f();
+    };
+    const call = f => {
+      f();
+    };
+    const never = constant(false);
+    const always = constant(true);
+
+    class Optional {
+      constructor(tag, value) {
+        this.tag = tag;
+        this.value = value;
+      }
+      static some(value) {
+        return new Optional(true, value);
+      }
+      static none() {
+        return Optional.singletonNone;
+      }
+      fold(onNone, onSome) {
+        if (this.tag) {
+          return onSome(this.value);
+        } else {
+          return onNone();
+        }
+      }
+      isSome() {
+        return this.tag;
+      }
+      isNone() {
+        return !this.tag;
+      }
+      map(mapper) {
+        if (this.tag) {
+          return Optional.some(mapper(this.value));
+        } else {
+          return Optional.none();
+        }
+      }
+      bind(binder) {
+        if (this.tag) {
+          return binder(this.value);
+        } else {
+          return Optional.none();
+        }
+      }
+      exists(predicate) {
+        return this.tag && predicate(this.value);
+      }
+      forall(predicate) {
+        return !this.tag || predicate(this.value);
+      }
+      filter(predicate) {
+        if (!this.tag || predicate(this.value)) {
+          return this;
+        } else {
+          return Optional.none();
+        }
+      }
+      getOr(replacement) {
+        return this.tag ? this.value : replacement;
+      }
+      or(replacement) {
+        return this.tag ? this : replacement;
+      }
+      getOrThunk(thunk) {
+        return this.tag ? this.value : thunk();
+      }
+      orThunk(thunk) {
+        return this.tag ? this : thunk();
+      }
+      getOrDie(message) {
+        if (!this.tag) {
+          throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
+        } else {
+          return this.value;
+        }
+      }
+      static from(value) {
+        return isNonNullable(value) ? Optional.some(value) : Optional.none();
+      }
+      getOrNull() {
+        return this.tag ? this.value : null;
+      }
+      getOrUndefined() {
+        return this.value;
+      }
+      each(worker) {
+        if (this.tag) {
+          worker(this.value);
+        }
+      }
+      toArray() {
+        return this.tag ? [this.value] : [];
+      }
+      toString() {
+        return this.tag ? `some(${ this.value })` : 'none()';
+      }
+    }
+    Optional.singletonNone = new Optional(false);
+
+    const nativeSlice = Array.prototype.slice;
+    const nativeIndexOf = Array.prototype.indexOf;
+    const nativePush = Array.prototype.push;
+    const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);
+    const indexOf$1 = (xs, x) => {
+      const r = rawIndexOf(xs, x);
+      return r === -1 ? Optional.none() : Optional.some(r);
+    };
+    const contains$2 = (xs, x) => rawIndexOf(xs, x) > -1;
+    const exists = (xs, pred) => {
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        if (pred(x, i)) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const map$3 = (xs, f) => {
+      const len = xs.length;
+      const r = new Array(len);
+      for (let i = 0; i < len; i++) {
+        const x = xs[i];
+        r[i] = f(x, i);
+      }
+      return r;
+    };
+    const each$g = (xs, f) => {
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        f(x, i);
+      }
+    };
+    const eachr = (xs, f) => {
+      for (let i = xs.length - 1; i >= 0; i--) {
+        const x = xs[i];
+        f(x, i);
+      }
+    };
+    const partition$2 = (xs, pred) => {
+      const pass = [];
+      const fail = [];
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        const arr = pred(x, i) ? pass : fail;
+        arr.push(x);
+      }
+      return {
+        pass,
+        fail
+      };
+    };
+    const filter$6 = (xs, pred) => {
+      const r = [];
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        if (pred(x, i)) {
+          r.push(x);
+        }
+      }
+      return r;
+    };
+    const foldr = (xs, f, acc) => {
+      eachr(xs, (x, i) => {
+        acc = f(acc, x, i);
+      });
+      return acc;
+    };
+    const foldl = (xs, f, acc) => {
+      each$g(xs, (x, i) => {
+        acc = f(acc, x, i);
+      });
+      return acc;
+    };
+    const findUntil$1 = (xs, pred, until) => {
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        if (pred(x, i)) {
+          return Optional.some(x);
+        } else if (until(x, i)) {
+          break;
+        }
+      }
+      return Optional.none();
+    };
+    const find$2 = (xs, pred) => {
+      return findUntil$1(xs, pred, never);
+    };
+    const findIndex$2 = (xs, pred) => {
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        if (pred(x, i)) {
+          return Optional.some(i);
+        }
+      }
+      return Optional.none();
+    };
+    const flatten = xs => {
+      const r = [];
+      for (let i = 0, len = xs.length; i < len; ++i) {
+        if (!isArray$1(xs[i])) {
+          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
+        }
+        nativePush.apply(r, xs[i]);
+      }
+      return r;
+    };
+    const bind$3 = (xs, f) => flatten(map$3(xs, f));
+    const forall = (xs, pred) => {
+      for (let i = 0, len = xs.length; i < len; ++i) {
+        const x = xs[i];
+        if (pred(x, i) !== true) {
+          return false;
+        }
+      }
+      return true;
+    };
+    const reverse = xs => {
+      const r = nativeSlice.call(xs, 0);
+      r.reverse();
+      return r;
+    };
+    const difference = (a1, a2) => filter$6(a1, x => !contains$2(a2, x));
+    const mapToObject = (xs, f) => {
+      const r = {};
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        r[String(x)] = f(x, i);
+      }
+      return r;
+    };
+    const sort = (xs, comparator) => {
+      const copy = nativeSlice.call(xs, 0);
+      copy.sort(comparator);
+      return copy;
+    };
+    const get$b = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
+    const head = xs => get$b(xs, 0);
+    const last$3 = xs => get$b(xs, xs.length - 1);
+    const from = isFunction(Array.from) ? Array.from : x => nativeSlice.call(x);
+    const findMap = (arr, f) => {
+      for (let i = 0; i < arr.length; i++) {
+        const r = f(arr[i], i);
+        if (r.isSome()) {
+          return r;
+        }
+      }
+      return Optional.none();
+    };
+    const unique$1 = (xs, comparator) => {
+      const r = [];
+      const isDuplicated = isFunction(comparator) ? x => exists(r, i => comparator(i, x)) : x => contains$2(r, x);
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        if (!isDuplicated(x)) {
+          r.push(x);
+        }
+      }
+      return r;
+    };
+
+    const keys = Object.keys;
+    const hasOwnProperty$2 = Object.hasOwnProperty;
+    const each$f = (obj, f) => {
+      const props = keys(obj);
+      for (let k = 0, len = props.length; k < len; k++) {
+        const i = props[k];
+        const x = obj[i];
+        f(x, i);
+      }
+    };
+    const map$2 = (obj, f) => {
+      return tupleMap(obj, (x, i) => ({
+        k: i,
+        v: f(x, i)
+      }));
+    };
+    const tupleMap = (obj, f) => {
+      const r = {};
+      each$f(obj, (x, i) => {
+        const tuple = f(x, i);
+        r[tuple.k] = tuple.v;
+      });
+      return r;
+    };
+    const objAcc = r => (x, i) => {
+      r[i] = x;
+    };
+    const internalFilter = (obj, pred, onTrue, onFalse) => {
+      const r = {};
+      each$f(obj, (x, i) => {
+        (pred(x, i) ? onTrue : onFalse)(x, i);
+      });
+      return r;
+    };
+    const bifilter = (obj, pred) => {
+      const t = {};
+      const f = {};
+      internalFilter(obj, pred, objAcc(t), objAcc(f));
+      return {
+        t,
+        f
+      };
+    };
+    const filter$5 = (obj, pred) => {
+      const t = {};
+      internalFilter(obj, pred, objAcc(t), noop);
+      return t;
+    };
+    const mapToArray = (obj, f) => {
+      const r = [];
+      each$f(obj, (value, name) => {
+        r.push(f(value, name));
+      });
+      return r;
+    };
+    const values = obj => {
+      return mapToArray(obj, identity);
+    };
+    const get$a = (obj, key) => {
+      return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none();
+    };
+    const has$2 = (obj, key) => hasOwnProperty$2.call(obj, key);
+    const hasNonNullableKey = (obj, key) => has$2(obj, key) && obj[key] !== undefined && obj[key] !== null;
+    const equal$1 = (a1, a2, eq = eqAny) => eqRecord(eq).eq(a1, a2);
+
+    const stringArray = a => {
+      const all = {};
+      each$g(a, key => {
+        all[key] = {};
+      });
+      return keys(all);
+    };
+
+    const isArray = Array.isArray;
+    const toArray$1 = obj => {
+      if (!isArray(obj)) {
+        const array = [];
+        for (let i = 0, l = obj.length; i < l; i++) {
+          array[i] = obj[i];
+        }
+        return array;
+      } else {
+        return obj;
+      }
+    };
+    const each$e = (o, cb, s) => {
+      let n, l;
+      if (!o) {
+        return false;
+      }
+      s = s || o;
+      if (o.length !== undefined) {
+        for (n = 0, l = o.length; n < l; n++) {
+          if (cb.call(s, o[n], n, o) === false) {
+            return false;
+          }
+        }
+      } else {
+        for (n in o) {
+          if (has$2(o, n)) {
+            if (cb.call(s, o[n], n, o) === false) {
+              return false;
+            }
+          }
+        }
+      }
+      return true;
+    };
+    const map$1 = (array, callback) => {
+      const out = [];
+      each$e(array, (item, index) => {
+        out.push(callback(item, index, array));
+      });
+      return out;
+    };
+    const filter$4 = (a, f) => {
+      const o = [];
+      each$e(a, (v, index) => {
+        if (!f || f(v, index, a)) {
+          o.push(v);
+        }
+      });
+      return o;
+    };
+    const indexOf = (a, v) => {
+      if (a) {
+        for (let i = 0, l = a.length; i < l; i++) {
+          if (a[i] === v) {
+            return i;
+          }
+        }
+      }
+      return -1;
+    };
+    const reduce = (collection, iteratee, accumulator, thisArg) => {
+      let acc = isUndefined(accumulator) ? collection[0] : accumulator;
+      for (let i = 0; i < collection.length; i++) {
+        acc = iteratee.call(thisArg, acc, collection[i], i);
+      }
+      return acc;
+    };
+    const findIndex$1 = (array, predicate, thisArg) => {
+      let i, l;
+      for (i = 0, l = array.length; i < l; i++) {
+        if (predicate.call(thisArg, array[i], i, array)) {
+          return i;
+        }
+      }
+      return -1;
+    };
+    const last$2 = collection => collection[collection.length - 1];
+
+    const cached = f => {
+      let called = false;
+      let r;
+      return (...args) => {
+        if (!called) {
+          called = true;
+          r = f.apply(null, args);
+        }
+        return r;
+      };
+    };
+
+    const DeviceType = (os, browser, userAgent, mediaMatch) => {
+      const isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
+      const isiPhone = os.isiOS() && !isiPad;
+      const isMobile = os.isiOS() || os.isAndroid();
+      const isTouch = isMobile || mediaMatch('(pointer:coarse)');
+      const isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');
+      const isPhone = isiPhone || isMobile && !isTablet;
+      const iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
+      const isDesktop = !isPhone && !isTablet && !iOSwebview;
+      return {
+        isiPad: constant(isiPad),
+        isiPhone: constant(isiPhone),
+        isTablet: constant(isTablet),
+        isPhone: constant(isPhone),
+        isTouch: constant(isTouch),
+        isAndroid: os.isAndroid,
+        isiOS: os.isiOS,
+        isWebView: constant(iOSwebview),
+        isDesktop: constant(isDesktop)
+      };
+    };
+
+    const firstMatch = (regexes, s) => {
+      for (let i = 0; i < regexes.length; i++) {
+        const x = regexes[i];
+        if (x.test(s)) {
+          return x;
+        }
+      }
+      return undefined;
+    };
+    const find$1 = (regexes, agent) => {
+      const r = firstMatch(regexes, agent);
+      if (!r) {
+        return {
+          major: 0,
+          minor: 0
+        };
+      }
+      const group = i => {
+        return Number(agent.replace(r, '$' + i));
+      };
+      return nu$3(group(1), group(2));
+    };
+    const detect$5 = (versionRegexes, agent) => {
+      const cleanedAgent = String(agent).toLowerCase();
+      if (versionRegexes.length === 0) {
+        return unknown$2();
+      }
+      return find$1(versionRegexes, cleanedAgent);
+    };
+    const unknown$2 = () => {
+      return nu$3(0, 0);
+    };
+    const nu$3 = (major, minor) => {
+      return {
+        major,
+        minor
+      };
+    };
+    const Version = {
+      nu: nu$3,
+      detect: detect$5,
+      unknown: unknown$2
+    };
+
+    const detectBrowser$1 = (browsers, userAgentData) => {
+      return findMap(userAgentData.brands, uaBrand => {
+        const lcBrand = uaBrand.brand.toLowerCase();
+        return find$2(browsers, browser => {
+          var _a;
+          return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());
+        }).map(info => ({
+          current: info.name,
+          version: Version.nu(parseInt(uaBrand.version, 10), 0)
+        }));
+      });
+    };
+
+    const detect$4 = (candidates, userAgent) => {
+      const agent = String(userAgent).toLowerCase();
+      return find$2(candidates, candidate => {
+        return candidate.search(agent);
+      });
+    };
+    const detectBrowser = (browsers, userAgent) => {
+      return detect$4(browsers, userAgent).map(browser => {
+        const version = Version.detect(browser.versionRegexes, userAgent);
+        return {
+          current: browser.name,
+          version
+        };
+      });
+    };
+    const detectOs = (oses, userAgent) => {
+      return detect$4(oses, userAgent).map(os => {
+        const version = Version.detect(os.versionRegexes, userAgent);
+        return {
+          current: os.name,
+          version
+        };
+      });
+    };
+
+    const removeFromStart = (str, numChars) => {
+      return str.substring(numChars);
+    };
+
+    const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
+    const removeLeading = (str, prefix) => {
+      return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str;
+    };
+    const contains$1 = (str, substr) => {
+      return str.indexOf(substr) !== -1;
+    };
+    const startsWith = (str, prefix) => {
+      return checkRange(str, prefix, 0);
+    };
+    const endsWith = (str, suffix) => {
+      return checkRange(str, suffix, str.length - suffix.length);
+    };
+    const blank = r => s => s.replace(r, '');
+    const trim$3 = blank(/^\s+|\s+$/g);
+    const lTrim = blank(/^\s+/g);
+    const rTrim = blank(/\s+$/g);
+    const isNotEmpty = s => s.length > 0;
+    const isEmpty$3 = s => !isNotEmpty(s);
+    const repeat = (s, count) => count <= 0 ? '' : new Array(count + 1).join(s);
+    const toInt = (value, radix = 10) => {
+      const num = parseInt(value, radix);
+      return isNaN(num) ? Optional.none() : Optional.some(num);
+    };
+
+    const normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
+    const checkContains = target => {
+      return uastring => {
+        return contains$1(uastring, target);
+      };
+    };
+    const browsers = [
+      {
+        name: 'Edge',
+        versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
+        search: uastring => {
+          return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit');
+        }
+      },
+      {
+        name: 'Chromium',
+        brand: 'Chromium',
+        versionRegexes: [
+          /.*?chrome\/([0-9]+)\.([0-9]+).*/,
+          normalVersionRegex
+        ],
+        search: uastring => {
+          return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe');
+        }
+      },
+      {
+        name: 'IE',
+        versionRegexes: [
+          /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
+          /.*?rv:([0-9]+)\.([0-9]+).*/
+        ],
+        search: uastring => {
+          return contains$1(uastring, 'msie') || contains$1(uastring, 'trident');
+        }
+      },
+      {
+        name: 'Opera',
+        versionRegexes: [
+          normalVersionRegex,
+          /.*?opera\/([0-9]+)\.([0-9]+).*/
+        ],
+        search: checkContains('opera')
+      },
+      {
+        name: 'Firefox',
+        versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
+        search: checkContains('firefox')
+      },
+      {
+        name: 'Safari',
+        versionRegexes: [
+          normalVersionRegex,
+          /.*?cpu os ([0-9]+)_([0-9]+).*/
+        ],
+        search: uastring => {
+          return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit');
+        }
+      }
+    ];
+    const oses = [
+      {
+        name: 'Windows',
+        search: checkContains('win'),
+        versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
+      },
+      {
+        name: 'iOS',
+        search: uastring => {
+          return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad');
+        },
+        versionRegexes: [
+          /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
+          /.*cpu os ([0-9]+)_([0-9]+).*/,
+          /.*cpu iphone os ([0-9]+)_([0-9]+).*/
+        ]
+      },
+      {
+        name: 'Android',
+        search: checkContains('android'),
+        versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
+      },
+      {
+        name: 'macOS',
+        search: checkContains('mac os x'),
+        versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]
+      },
+      {
+        name: 'Linux',
+        search: checkContains('linux'),
+        versionRegexes: []
+      },
+      {
+        name: 'Solaris',
+        search: checkContains('sunos'),
+        versionRegexes: []
+      },
+      {
+        name: 'FreeBSD',
+        search: checkContains('freebsd'),
+        versionRegexes: []
+      },
+      {
+        name: 'ChromeOS',
+        search: checkContains('cros'),
+        versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/]
+      }
+    ];
+    const PlatformInfo = {
+      browsers: constant(browsers),
+      oses: constant(oses)
+    };
+
+    const edge = 'Edge';
+    const chromium = 'Chromium';
+    const ie = 'IE';
+    const opera = 'Opera';
+    const firefox = 'Firefox';
+    const safari = 'Safari';
+    const unknown$1 = () => {
+      return nu$2({
+        current: undefined,
+        version: Version.unknown()
+      });
+    };
+    const nu$2 = info => {
+      const current = info.current;
+      const version = info.version;
+      const isBrowser = name => () => current === name;
+      return {
+        current,
+        version,
+        isEdge: isBrowser(edge),
+        isChromium: isBrowser(chromium),
+        isIE: isBrowser(ie),
+        isOpera: isBrowser(opera),
+        isFirefox: isBrowser(firefox),
+        isSafari: isBrowser(safari)
+      };
+    };
+    const Browser = {
+      unknown: unknown$1,
+      nu: nu$2,
+      edge: constant(edge),
+      chromium: constant(chromium),
+      ie: constant(ie),
+      opera: constant(opera),
+      firefox: constant(firefox),
+      safari: constant(safari)
+    };
+
+    const windows = 'Windows';
+    const ios = 'iOS';
+    const android = 'Android';
+    const linux = 'Linux';
+    const macos = 'macOS';
+    const solaris = 'Solaris';
+    const freebsd = 'FreeBSD';
+    const chromeos = 'ChromeOS';
+    const unknown = () => {
+      return nu$1({
+        current: undefined,
+        version: Version.unknown()
+      });
+    };
+    const nu$1 = info => {
+      const current = info.current;
+      const version = info.version;
+      const isOS = name => () => current === name;
+      return {
+        current,
+        version,
+        isWindows: isOS(windows),
+        isiOS: isOS(ios),
+        isAndroid: isOS(android),
+        isMacOS: isOS(macos),
+        isLinux: isOS(linux),
+        isSolaris: isOS(solaris),
+        isFreeBSD: isOS(freebsd),
+        isChromeOS: isOS(chromeos)
+      };
+    };
+    const OperatingSystem = {
+      unknown,
+      nu: nu$1,
+      windows: constant(windows),
+      ios: constant(ios),
+      android: constant(android),
+      linux: constant(linux),
+      macos: constant(macos),
+      solaris: constant(solaris),
+      freebsd: constant(freebsd),
+      chromeos: constant(chromeos)
+    };
+
+    const detect$3 = (userAgent, userAgentDataOpt, mediaMatch) => {
+      const browsers = PlatformInfo.browsers();
+      const oses = PlatformInfo.oses();
+      const browser = userAgentDataOpt.bind(userAgentData => detectBrowser$1(browsers, userAgentData)).orThunk(() => detectBrowser(browsers, userAgent)).fold(Browser.unknown, Browser.nu);
+      const os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
+      const deviceType = DeviceType(os, browser, userAgent, mediaMatch);
+      return {
+        browser,
+        os,
+        deviceType
+      };
+    };
+    const PlatformDetection = { detect: detect$3 };
+
+    const mediaMatch = query => window.matchMedia(query).matches;
+    let platform$2 = cached(() => PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch));
+    const detect$2 = () => platform$2();
+
+    const userAgent = navigator.userAgent;
+    const platform$1 = detect$2();
+    const browser$1 = platform$1.browser;
+    const os = platform$1.os;
+    const deviceType = platform$1.deviceType;
+    const windowsPhone = userAgent.indexOf('Windows Phone') !== -1;
+    const Env = {
+      transparentSrc: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
+      documentMode: browser$1.isIE() ? document.documentMode || 7 : 10,
+      cacheSuffix: null,
+      container: null,
+      canHaveCSP: !browser$1.isIE(),
+      windowsPhone,
+      browser: {
+        current: browser$1.current,
+        version: browser$1.version,
+        isChromium: browser$1.isChromium,
+        isEdge: browser$1.isEdge,
+        isFirefox: browser$1.isFirefox,
+        isIE: browser$1.isIE,
+        isOpera: browser$1.isOpera,
+        isSafari: browser$1.isSafari
+      },
+      os: {
+        current: os.current,
+        version: os.version,
+        isAndroid: os.isAndroid,
+        isChromeOS: os.isChromeOS,
+        isFreeBSD: os.isFreeBSD,
+        isiOS: os.isiOS,
+        isLinux: os.isLinux,
+        isMacOS: os.isMacOS,
+        isSolaris: os.isSolaris,
+        isWindows: os.isWindows
+      },
+      deviceType: {
+        isDesktop: deviceType.isDesktop,
+        isiPad: deviceType.isiPad,
+        isiPhone: deviceType.isiPhone,
+        isPhone: deviceType.isPhone,
+        isTablet: deviceType.isTablet,
+        isTouch: deviceType.isTouch,
+        isWebView: deviceType.isWebView
+      }
+    };
+
+    const whiteSpaceRegExp$1 = /^\s*|\s*$/g;
+    const trim$2 = str => {
+      return str === null || str === undefined ? '' : ('' + str).replace(whiteSpaceRegExp$1, '');
+    };
+    const is$3 = (obj, type) => {
+      if (!type) {
+        return obj !== undefined;
+      }
+      if (type === 'array' && isArray(obj)) {
+        return true;
+      }
+      return typeof obj === type;
+    };
+    const makeMap$4 = (items, delim, map) => {
+      let i;
+      items = items || [];
+      delim = delim || ',';
+      if (typeof items === 'string') {
+        items = items.split(delim);
+      }
+      map = map || {};
+      i = items.length;
+      while (i--) {
+        map[items[i]] = {};
+      }
+      return map;
+    };
+    const hasOwnProperty$1 = has$2;
+    const extend$3 = (obj, ...exts) => {
+      for (let i = 0; i < exts.length; i++) {
+        const ext = exts[i];
+        for (const name in ext) {
+          if (has$2(ext, name)) {
+            const value = ext[name];
+            if (value !== undefined) {
+              obj[name] = value;
+            }
+          }
+        }
+      }
+      return obj;
+    };
+    const walk$4 = function (o, f, n, s) {
+      s = s || this;
+      if (o) {
+        if (n) {
+          o = o[n];
+        }
+        each$e(o, (o, i) => {
+          if (f.call(s, o, i, n) === false) {
+            return false;
+          }
+          walk$4(o, f, n, s);
+        });
+      }
+    };
+    const resolve$2 = (n, o) => {
+      let i, l;
+      o = o || window;
+      n = n.split('.');
+      for (i = 0, l = n.length; i < l; i++) {
+        o = o[n[i]];
+        if (!o) {
+          break;
+        }
+      }
+      return o;
+    };
+    const explode$3 = (s, d) => {
+      if (!s || is$3(s, 'array')) {
+        return s;
+      }
+      return map$1(s.split(d || ','), trim$2);
+    };
+    const _addCacheSuffix = url => {
+      const cacheSuffix = Env.cacheSuffix;
+      if (cacheSuffix) {
+        url += (url.indexOf('?') === -1 ? '?' : '&') + cacheSuffix;
+      }
+      return url;
+    };
+    const Tools = {
+      trim: trim$2,
+      isArray: isArray,
+      is: is$3,
+      toArray: toArray$1,
+      makeMap: makeMap$4,
+      each: each$e,
+      map: map$1,
+      grep: filter$4,
+      inArray: indexOf,
+      hasOwn: hasOwnProperty$1,
+      extend: extend$3,
+      walk: walk$4,
+      resolve: resolve$2,
+      explode: explode$3,
+      _addCacheSuffix
+    };
+
+    const is$2 = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));
+    const cat = arr => {
+      const r = [];
+      const push = x => {
+        r.push(x);
+      };
+      for (let i = 0; i < arr.length; i++) {
+        arr[i].each(push);
+      }
+      return r;
+    };
+    const lift2 = (oa, ob, f) => oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();
+    const lift3 = (oa, ob, oc, f) => oa.isSome() && ob.isSome() && oc.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Optional.none();
+    const someIf = (b, a) => b ? Optional.some(a) : Optional.none();
+
+    typeof window !== 'undefined' ? window : Function('return this;')();
+
+    const COMMENT = 8;
+    const DOCUMENT = 9;
+    const DOCUMENT_FRAGMENT = 11;
+    const ELEMENT = 1;
+    const TEXT = 3;
+
+    const name = element => {
+      const r = element.dom.nodeName;
+      return r.toLowerCase();
+    };
+    const type$1 = element => element.dom.nodeType;
+    const isType = t => element => type$1(element) === t;
+    const isComment$1 = element => type$1(element) === COMMENT || name(element) === '#comment';
+    const isElement$7 = isType(ELEMENT);
+    const isText$9 = isType(TEXT);
+    const isDocument$2 = isType(DOCUMENT);
+    const isDocumentFragment$1 = isType(DOCUMENT_FRAGMENT);
+    const isTag = tag => e => isElement$7(e) && name(e) === tag;
+
+    const rawSet = (dom, key, value) => {
+      if (isString(value) || isBoolean(value) || isNumber(value)) {
+        dom.setAttribute(key, value + '');
+      } else {
+        console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
+        throw new Error('Attribute value was not simple');
+      }
+    };
+    const set$2 = (element, key, value) => {
+      rawSet(element.dom, key, value);
+    };
+    const setAll$1 = (element, attrs) => {
+      const dom = element.dom;
+      each$f(attrs, (v, k) => {
+        rawSet(dom, k, v);
+      });
+    };
+    const get$9 = (element, key) => {
+      const v = element.dom.getAttribute(key);
+      return v === null ? undefined : v;
+    };
+    const getOpt = (element, key) => Optional.from(get$9(element, key));
+    const has$1 = (element, key) => {
+      const dom = element.dom;
+      return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;
+    };
+    const remove$a = (element, key) => {
+      element.dom.removeAttribute(key);
+    };
+    const hasNone = element => {
+      const attrs = element.dom.attributes;
+      return attrs === undefined || attrs === null || attrs.length === 0;
+    };
+    const clone$4 = element => foldl(element.dom.attributes, (acc, attr) => {
+      acc[attr.name] = attr.value;
+      return acc;
+    }, {});
+
+    const read$4 = (element, attr) => {
+      const value = get$9(element, attr);
+      return value === undefined || value === '' ? [] : value.split(' ');
+    };
+    const add$4 = (element, attr, id) => {
+      const old = read$4(element, attr);
+      const nu = old.concat([id]);
+      set$2(element, attr, nu.join(' '));
+      return true;
+    };
+    const remove$9 = (element, attr, id) => {
+      const nu = filter$6(read$4(element, attr), v => v !== id);
+      if (nu.length > 0) {
+        set$2(element, attr, nu.join(' '));
+      } else {
+        remove$a(element, attr);
+      }
+      return false;
+    };
+
+    const supports = element => element.dom.classList !== undefined;
+    const get$8 = element => read$4(element, 'class');
+    const add$3 = (element, clazz) => add$4(element, 'class', clazz);
+    const remove$8 = (element, clazz) => remove$9(element, 'class', clazz);
+    const toggle$2 = (element, clazz) => {
+      if (contains$2(get$8(element), clazz)) {
+        return remove$8(element, clazz);
+      } else {
+        return add$3(element, clazz);
+      }
+    };
+
+    const add$2 = (element, clazz) => {
+      if (supports(element)) {
+        element.dom.classList.add(clazz);
+      } else {
+        add$3(element, clazz);
+      }
+    };
+    const cleanClass = element => {
+      const classList = supports(element) ? element.dom.classList : get$8(element);
+      if (classList.length === 0) {
+        remove$a(element, 'class');
+      }
+    };
+    const remove$7 = (element, clazz) => {
+      if (supports(element)) {
+        const classList = element.dom.classList;
+        classList.remove(clazz);
+      } else {
+        remove$8(element, clazz);
+      }
+      cleanClass(element);
+    };
+    const toggle$1 = (element, clazz) => {
+      const result = supports(element) ? element.dom.classList.toggle(clazz) : toggle$2(element, clazz);
+      cleanClass(element);
+      return result;
+    };
+    const has = (element, clazz) => supports(element) && element.dom.classList.contains(clazz);
+
+    const isSupported$1 = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);
+
+    const fromHtml$1 = (html, scope) => {
+      const doc = scope || document;
+      const div = doc.createElement('div');
+      div.innerHTML = html;
+      if (!div.hasChildNodes() || div.childNodes.length > 1) {
+        const message = 'HTML does not have a single root node';
+        console.error(message, html);
+        throw new Error(message);
+      }
+      return fromDom$2(div.childNodes[0]);
+    };
+    const fromTag = (tag, scope) => {
+      const doc = scope || document;
+      const node = doc.createElement(tag);
+      return fromDom$2(node);
+    };
+    const fromText = (text, scope) => {
+      const doc = scope || document;
+      const node = doc.createTextNode(text);
+      return fromDom$2(node);
+    };
+    const fromDom$2 = node => {
+      if (node === null || node === undefined) {
+        throw new Error('Node cannot be null or undefined');
+      }
+      return { dom: node };
+    };
+    const fromPoint$2 = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$2);
+    const SugarElement = {
+      fromHtml: fromHtml$1,
+      fromTag,
+      fromText,
+      fromDom: fromDom$2,
+      fromPoint: fromPoint$2
+    };
+
+    const toArray = (target, f) => {
+      const r = [];
+      const recurse = e => {
+        r.push(e);
+        return f(e);
+      };
+      let cur = f(target);
+      do {
+        cur = cur.bind(recurse);
+      } while (cur.isSome());
+      return r;
+    };
+
+    const is$1 = (element, selector) => {
+      const dom = element.dom;
+      if (dom.nodeType !== ELEMENT) {
+        return false;
+      } else {
+        const elem = dom;
+        if (elem.matches !== undefined) {
+          return elem.matches(selector);
+        } else if (elem.msMatchesSelector !== undefined) {
+          return elem.msMatchesSelector(selector);
+        } else if (elem.webkitMatchesSelector !== undefined) {
+          return elem.webkitMatchesSelector(selector);
+        } else if (elem.mozMatchesSelector !== undefined) {
+          return elem.mozMatchesSelector(selector);
+        } else {
+          throw new Error('Browser lacks native selectors');
+        }
+      }
+    };
+    const bypassSelector = dom => dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;
+    const all = (selector, scope) => {
+      const base = scope === undefined ? document : scope.dom;
+      return bypassSelector(base) ? [] : map$3(base.querySelectorAll(selector), SugarElement.fromDom);
+    };
+    const one = (selector, scope) => {
+      const base = scope === undefined ? document : scope.dom;
+      return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);
+    };
+
+    const eq = (e1, e2) => e1.dom === e2.dom;
+    const contains = (e1, e2) => {
+      const d1 = e1.dom;
+      const d2 = e2.dom;
+      return d1 === d2 ? false : d1.contains(d2);
+    };
+
+    const owner$1 = element => SugarElement.fromDom(element.dom.ownerDocument);
+    const documentOrOwner = dos => isDocument$2(dos) ? dos : owner$1(dos);
+    const documentElement = element => SugarElement.fromDom(documentOrOwner(element).dom.documentElement);
+    const defaultView = element => SugarElement.fromDom(documentOrOwner(element).dom.defaultView);
+    const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
+    const parentElement = element => Optional.from(element.dom.parentElement).map(SugarElement.fromDom);
+    const parents$1 = (element, isRoot) => {
+      const stop = isFunction(isRoot) ? isRoot : never;
+      let dom = element.dom;
+      const ret = [];
+      while (dom.parentNode !== null && dom.parentNode !== undefined) {
+        const rawParent = dom.parentNode;
+        const p = SugarElement.fromDom(rawParent);
+        ret.push(p);
+        if (stop(p) === true) {
+          break;
+        } else {
+          dom = rawParent;
+        }
+      }
+      return ret;
+    };
+    const siblings = element => {
+      const filterSelf = elements => filter$6(elements, x => !eq(element, x));
+      return parent(element).map(children).map(filterSelf).getOr([]);
+    };
+    const prevSibling = element => Optional.from(element.dom.previousSibling).map(SugarElement.fromDom);
+    const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
+    const prevSiblings = element => reverse(toArray(element, prevSibling));
+    const nextSiblings = element => toArray(element, nextSibling);
+    const children = element => map$3(element.dom.childNodes, SugarElement.fromDom);
+    const child$1 = (element, index) => {
+      const cs = element.dom.childNodes;
+      return Optional.from(cs[index]).map(SugarElement.fromDom);
+    };
+    const firstChild = element => child$1(element, 0);
+    const lastChild = element => child$1(element, element.dom.childNodes.length - 1);
+    const childNodesCount = element => element.dom.childNodes.length;
+
+    const getHead = doc => {
+      const b = doc.dom.head;
+      if (b === null || b === undefined) {
+        throw new Error('Head is not available yet');
+      }
+      return SugarElement.fromDom(b);
+    };
+
+    const isShadowRoot = dos => isDocumentFragment$1(dos) && isNonNullable(dos.dom.host);
+    const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
+    const isSupported = constant(supported);
+    const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner;
+    const getStyleContainer = dos => isShadowRoot(dos) ? dos : getHead(documentOrOwner(dos));
+    const getShadowRoot = e => {
+      const r = getRootNode(e);
+      return isShadowRoot(r) ? Optional.some(r) : Optional.none();
+    };
+    const getShadowHost = e => SugarElement.fromDom(e.dom.host);
+    const getOriginalEventTarget = event => {
+      if (isSupported() && isNonNullable(event.target)) {
+        const el = SugarElement.fromDom(event.target);
+        if (isElement$7(el) && isOpenShadowHost(el)) {
+          if (event.composed && event.composedPath) {
+            const composedPath = event.composedPath();
+            if (composedPath) {
+              return head(composedPath);
+            }
+          }
+        }
+      }
+      return Optional.from(event.target);
+    };
+    const isOpenShadowHost = element => isNonNullable(element.dom.shadowRoot);
+
+    const inBody = element => {
+      const dom = isText$9(element) ? element.dom.parentNode : element.dom;
+      if (dom === undefined || dom === null || dom.ownerDocument === null) {
+        return false;
+      }
+      const doc = dom.ownerDocument;
+      return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost));
+    };
+
+    const internalSet = (dom, property, value) => {
+      if (!isString(value)) {
+        console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
+        throw new Error('CSS value must be a string: ' + value);
+      }
+      if (isSupported$1(dom)) {
+        dom.style.setProperty(property, value);
+      }
+    };
+    const internalRemove = (dom, property) => {
+      if (isSupported$1(dom)) {
+        dom.style.removeProperty(property);
+      }
+    };
+    const set$1 = (element, property, value) => {
+      const dom = element.dom;
+      internalSet(dom, property, value);
+    };
+    const setAll = (element, css) => {
+      const dom = element.dom;
+      each$f(css, (v, k) => {
+        internalSet(dom, k, v);
+      });
+    };
+    const get$7 = (element, property) => {
+      const dom = element.dom;
+      const styles = window.getComputedStyle(dom);
+      const r = styles.getPropertyValue(property);
+      return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
+    };
+    const getUnsafeProperty = (dom, property) => isSupported$1(dom) ? dom.style.getPropertyValue(property) : '';
+    const getRaw$1 = (element, property) => {
+      const dom = element.dom;
+      const raw = getUnsafeProperty(dom, property);
+      return Optional.from(raw).filter(r => r.length > 0);
+    };
+    const getAllRaw = element => {
+      const css = {};
+      const dom = element.dom;
+      if (isSupported$1(dom)) {
+        for (let i = 0; i < dom.style.length; i++) {
+          const ruleName = dom.style.item(i);
+          css[ruleName] = dom.style[ruleName];
+        }
+      }
+      return css;
+    };
+    const remove$6 = (element, property) => {
+      const dom = element.dom;
+      internalRemove(dom, property);
+      if (is$2(getOpt(element, 'style').map(trim$3), '')) {
+        remove$a(element, 'style');
+      }
+    };
+    const reflow = e => e.dom.offsetWidth;
+
+    const before$3 = (marker, element) => {
+      const parent$1 = parent(marker);
+      parent$1.each(v => {
+        v.dom.insertBefore(element.dom, marker.dom);
+      });
+    };
+    const after$4 = (marker, element) => {
+      const sibling = nextSibling(marker);
+      sibling.fold(() => {
+        const parent$1 = parent(marker);
+        parent$1.each(v => {
+          append$1(v, element);
+        });
+      }, v => {
+        before$3(v, element);
+      });
+    };
+    const prepend = (parent, element) => {
+      const firstChild$1 = firstChild(parent);
+      firstChild$1.fold(() => {
+        append$1(parent, element);
+      }, v => {
+        parent.dom.insertBefore(element.dom, v.dom);
+      });
+    };
+    const append$1 = (parent, element) => {
+      parent.dom.appendChild(element.dom);
+    };
+    const wrap$2 = (element, wrapper) => {
+      before$3(element, wrapper);
+      append$1(wrapper, element);
+    };
+
+    const after$3 = (marker, elements) => {
+      each$g(elements, (x, i) => {
+        const e = i === 0 ? marker : elements[i - 1];
+        after$4(e, x);
+      });
+    };
+    const append = (parent, elements) => {
+      each$g(elements, x => {
+        append$1(parent, x);
+      });
+    };
+
+    const empty = element => {
+      element.dom.textContent = '';
+      each$g(children(element), rogue => {
+        remove$5(rogue);
+      });
+    };
+    const remove$5 = element => {
+      const dom = element.dom;
+      if (dom.parentNode !== null) {
+        dom.parentNode.removeChild(dom);
+      }
+    };
+    const unwrap = wrapper => {
+      const children$1 = children(wrapper);
+      if (children$1.length > 0) {
+        after$3(wrapper, children$1);
+      }
+      remove$5(wrapper);
+    };
+
+    const fromHtml = (html, scope) => {
+      const doc = scope || document;
+      const div = doc.createElement('div');
+      div.innerHTML = html;
+      return children(SugarElement.fromDom(div));
+    };
+    const fromDom$1 = nodes => map$3(nodes, SugarElement.fromDom);
+
+    const get$6 = element => element.dom.innerHTML;
+    const set = (element, content) => {
+      const owner = owner$1(element);
+      const docDom = owner.dom;
+      const fragment = SugarElement.fromDom(docDom.createDocumentFragment());
+      const contentElements = fromHtml(content, docDom);
+      append(fragment, contentElements);
+      empty(element);
+      append$1(element, fragment);
+    };
+    const getOuter = element => {
+      const container = SugarElement.fromTag('div');
+      const clone = SugarElement.fromDom(element.dom.cloneNode(true));
+      append$1(container, clone);
+      return get$6(container);
+    };
+
+    const mkEvent = (target, x, y, stop, prevent, kill, raw) => ({
+      target,
+      x,
+      y,
+      stop,
+      prevent,
+      kill,
+      raw
+    });
+    const fromRawEvent = rawEvent => {
+      const target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));
+      const stop = () => rawEvent.stopPropagation();
+      const prevent = () => rawEvent.preventDefault();
+      const kill = compose(prevent, stop);
+      return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);
+    };
+    const handle$1 = (filter, handler) => rawEvent => {
+      if (filter(rawEvent)) {
+        handler(fromRawEvent(rawEvent));
+      }
+    };
+    const binder = (element, event, filter, handler, useCapture) => {
+      const wrapped = handle$1(filter, handler);
+      element.dom.addEventListener(event, wrapped, useCapture);
+      return { unbind: curry(unbind, element, event, wrapped, useCapture) };
+    };
+    const bind$2 = (element, event, filter, handler) => binder(element, event, filter, handler, false);
+    const unbind = (element, event, handler, useCapture) => {
+      element.dom.removeEventListener(event, handler, useCapture);
+    };
+
+    const r = (left, top) => {
+      const translate = (x, y) => r(left + x, top + y);
+      return {
+        left,
+        top,
+        translate
+      };
+    };
+    const SugarPosition = r;
+
+    const boxPosition = dom => {
+      const box = dom.getBoundingClientRect();
+      return SugarPosition(box.left, box.top);
+    };
+    const firstDefinedOrZero = (a, b) => {
+      if (a !== undefined) {
+        return a;
+      } else {
+        return b !== undefined ? b : 0;
+      }
+    };
+    const absolute = element => {
+      const doc = element.dom.ownerDocument;
+      const body = doc.body;
+      const win = doc.defaultView;
+      const html = doc.documentElement;
+      if (body === element.dom) {
+        return SugarPosition(body.offsetLeft, body.offsetTop);
+      }
+      const scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop);
+      const scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft);
+      const clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);
+      const clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);
+      return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);
+    };
+    const viewport = element => {
+      const dom = element.dom;
+      const doc = dom.ownerDocument;
+      const body = doc.body;
+      if (body === dom) {
+        return SugarPosition(body.offsetLeft, body.offsetTop);
+      }
+      if (!inBody(element)) {
+        return SugarPosition(0, 0);
+      }
+      return boxPosition(dom);
+    };
+
+    const get$5 = _DOC => {
+      const doc = _DOC !== undefined ? _DOC.dom : document;
+      const x = doc.body.scrollLeft || doc.documentElement.scrollLeft;
+      const y = doc.body.scrollTop || doc.documentElement.scrollTop;
+      return SugarPosition(x, y);
+    };
+    const to = (x, y, _DOC) => {
+      const doc = _DOC !== undefined ? _DOC.dom : document;
+      const win = doc.defaultView;
+      if (win) {
+        win.scrollTo(x, y);
+      }
+    };
+    const intoView = (element, alignToTop) => {
+      const isSafari = detect$2().browser.isSafari();
+      if (isSafari && isFunction(element.dom.scrollIntoViewIfNeeded)) {
+        element.dom.scrollIntoViewIfNeeded(false);
+      } else {
+        element.dom.scrollIntoView(alignToTop);
+      }
+    };
+
+    const get$4 = _win => {
+      const win = _win === undefined ? window : _win;
+      if (detect$2().browser.isFirefox()) {
+        return Optional.none();
+      } else {
+        return Optional.from(win.visualViewport);
+      }
+    };
+    const bounds = (x, y, width, height) => ({
+      x,
+      y,
+      width,
+      height,
+      right: x + width,
+      bottom: y + height
+    });
+    const getBounds = _win => {
+      const win = _win === undefined ? window : _win;
+      const doc = win.document;
+      const scroll = get$5(SugarElement.fromDom(doc));
+      return get$4(win).fold(() => {
+        const html = win.document.documentElement;
+        const width = html.clientWidth;
+        const height = html.clientHeight;
+        return bounds(scroll.left, scroll.top, width, height);
+      }, visualViewport => bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height));
+    };
+
+    const isNodeType = type => {
+      return node => {
+        return !!node && node.nodeType === type;
+      };
+    };
+    const isRestrictedNode = node => !!node && !Object.getPrototypeOf(node);
+    const isElement$6 = isNodeType(1);
+    const matchNodeNames = names => {
+      const lowercasedNames = names.map(s => s.toLowerCase());
+      return node => {
+        if (node && node.nodeName) {
+          const nodeName = node.nodeName.toLowerCase();
+          return contains$2(lowercasedNames, nodeName);
+        }
+        return false;
+      };
+    };
+    const matchStyleValues = (name, values) => {
+      const items = values.toLowerCase().split(' ');
+      return node => {
+        if (isElement$6(node)) {
+          for (let i = 0; i < items.length; i++) {
+            const computed = node.ownerDocument.defaultView.getComputedStyle(node, null);
+            const cssValue = computed ? computed.getPropertyValue(name) : null;
+            if (cssValue === items[i]) {
+              return true;
+            }
+          }
+        }
+        return false;
+      };
+    };
+    const hasAttribute = attrName => {
+      return node => {
+        return isElement$6(node) && node.hasAttribute(attrName);
+      };
+    };
+    const hasAttributeValue = (attrName, attrValue) => {
+      return node => {
+        return isElement$6(node) && node.getAttribute(attrName) === attrValue;
+      };
+    };
+    const isBogus$2 = node => isElement$6(node) && node.hasAttribute('data-mce-bogus');
+    const isBogusAll$1 = node => isElement$6(node) && node.getAttribute('data-mce-bogus') === 'all';
+    const isTable$3 = node => isElement$6(node) && node.tagName === 'TABLE';
+    const hasContentEditableState = value => {
+      return node => {
+        if (isElement$6(node)) {
+          if (node.contentEditable === value) {
+            return true;
+          }
+          if (node.getAttribute('data-mce-contenteditable') === value) {
+            return true;
+          }
+        }
+        return false;
+      };
+    };
+    const isTextareaOrInput = matchNodeNames([
+      'textarea',
+      'input'
+    ]);
+    const isText$8 = isNodeType(3);
+    const isCData = isNodeType(4);
+    const isPi = isNodeType(7);
+    const isComment = isNodeType(8);
+    const isDocument$1 = isNodeType(9);
+    const isDocumentFragment = isNodeType(11);
+    const isBr$5 = matchNodeNames(['br']);
+    const isImg = matchNodeNames(['img']);
+    const isContentEditableTrue$4 = hasContentEditableState('true');
+    const isContentEditableFalse$a = hasContentEditableState('false');
+    const isTableCell$5 = matchNodeNames([
+      'td',
+      'th'
+    ]);
+    const isMedia$2 = matchNodeNames([
+      'video',
+      'audio',
+      'object',
+      'embed'
+    ]);
+
+    const browser = detect$2().browser;
+    const firstElement = nodes => find$2(nodes, isElement$7);
+    const getTableCaptionDeltaY = elm => {
+      if (browser.isFirefox() && name(elm) === 'table') {
+        return firstElement(children(elm)).filter(elm => {
+          return name(elm) === 'caption';
+        }).bind(caption => {
+          return firstElement(nextSiblings(caption)).map(body => {
+            const bodyTop = body.dom.offsetTop;
+            const captionTop = caption.dom.offsetTop;
+            const captionHeight = caption.dom.offsetHeight;
+            return bodyTop <= captionTop ? -captionHeight : 0;
+          });
+        }).getOr(0);
+      } else {
+        return 0;
+      }
+    };
+    const hasChild = (elm, child) => elm.children && contains$2(elm.children, child);
+    const getPos = (body, elm, rootElm) => {
+      let x = 0, y = 0;
+      const doc = body.ownerDocument;
+      rootElm = rootElm ? rootElm : body;
+      if (elm) {
+        if (rootElm === body && elm.getBoundingClientRect && get$7(SugarElement.fromDom(body), 'position') === 'static') {
+          const pos = elm.getBoundingClientRect();
+          x = pos.left + (doc.documentElement.scrollLeft || body.scrollLeft) - doc.documentElement.clientLeft;
+          y = pos.top + (doc.documentElement.scrollTop || body.scrollTop) - doc.documentElement.clientTop;
+          return {
+            x,
+            y
+          };
+        }
+        let offsetParent = elm;
+        while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {
+          const castOffsetParent = offsetParent;
+          x += castOffsetParent.offsetLeft || 0;
+          y += castOffsetParent.offsetTop || 0;
+          offsetParent = castOffsetParent.offsetParent;
+        }
+        offsetParent = elm.parentNode;
+        while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {
+          x -= offsetParent.scrollLeft || 0;
+          y -= offsetParent.scrollTop || 0;
+          offsetParent = offsetParent.parentNode;
+        }
+        y += getTableCaptionDeltaY(SugarElement.fromDom(elm));
+      }
+      return {
+        x,
+        y
+      };
+    };
+
+    var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => {
+      if (is(scope, a)) {
+        return Optional.some(scope);
+      } else if (isFunction(isRoot) && isRoot(scope)) {
+        return Optional.none();
+      } else {
+        return ancestor(scope, a, isRoot);
+      }
+    };
+
+    const ancestor$3 = (scope, predicate, isRoot) => {
+      let element = scope.dom;
+      const stop = isFunction(isRoot) ? isRoot : never;
+      while (element.parentNode) {
+        element = element.parentNode;
+        const el = SugarElement.fromDom(element);
+        if (predicate(el)) {
+          return Optional.some(el);
+        } else if (stop(el)) {
+          break;
+        }
+      }
+      return Optional.none();
+    };
+    const closest$4 = (scope, predicate, isRoot) => {
+      const is = (s, test) => test(s);
+      return ClosestOrAncestor(is, ancestor$3, scope, predicate, isRoot);
+    };
+    const sibling$1 = (scope, predicate) => {
+      const element = scope.dom;
+      if (!element.parentNode) {
+        return Optional.none();
+      }
+      return child(SugarElement.fromDom(element.parentNode), x => !eq(scope, x) && predicate(x));
+    };
+    const child = (scope, predicate) => {
+      const pred = node => predicate(SugarElement.fromDom(node));
+      const result = find$2(scope.dom.childNodes, pred);
+      return result.map(SugarElement.fromDom);
+    };
+    const descendant$1 = (scope, predicate) => {
+      const descend = node => {
+        for (let i = 0; i < node.childNodes.length; i++) {
+          const child = SugarElement.fromDom(node.childNodes[i]);
+          if (predicate(child)) {
+            return Optional.some(child);
+          }
+          const res = descend(node.childNodes[i]);
+          if (res.isSome()) {
+            return res;
+          }
+        }
+        return Optional.none();
+      };
+      return descend(scope.dom);
+    };
+
+    const ancestor$2 = (scope, selector, isRoot) => ancestor$3(scope, e => is$1(e, selector), isRoot);
+    const descendant = (scope, selector) => one(selector, scope);
+    const closest$3 = (scope, selector, isRoot) => {
+      const is = (element, selector) => is$1(element, selector);
+      return ClosestOrAncestor(is, ancestor$2, scope, selector, isRoot);
+    };
+
+    const StyleSheetLoader = (documentOrShadowRoot, settings = {}) => {
+      let idCount = 0;
+      const loadedStates = {};
+      const edos = SugarElement.fromDom(documentOrShadowRoot);
+      const doc = documentOrOwner(edos);
+      const maxLoadTime = settings.maxLoadTime || 5000;
+      const _setReferrerPolicy = referrerPolicy => {
+        settings.referrerPolicy = referrerPolicy;
+      };
+      const addStyle = element => {
+        append$1(getStyleContainer(edos), element);
+      };
+      const removeStyle = id => {
+        const styleContainer = getStyleContainer(edos);
+        descendant(styleContainer, '#' + id).each(remove$5);
+      };
+      const getOrCreateState = url => get$a(loadedStates, url).getOrThunk(() => ({
+        id: 'mce-u' + idCount++,
+        passed: [],
+        failed: [],
+        count: 0
+      }));
+      const load = url => new Promise((success, failure) => {
+        let link;
+        const urlWithSuffix = Tools._addCacheSuffix(url);
+        const state = getOrCreateState(urlWithSuffix);
+        loadedStates[urlWithSuffix] = state;
+        state.count++;
+        const resolve = (callbacks, status) => {
+          each$g(callbacks, call);
+          state.status = status;
+          state.passed = [];
+          state.failed = [];
+          if (link) {
+            link.onload = null;
+            link.onerror = null;
+            link = null;
+          }
+        };
+        const passed = () => resolve(state.passed, 2);
+        const failed = () => resolve(state.failed, 3);
+        const wait = (testCallback, waitCallback) => {
+          if (!testCallback()) {
+            if (Date.now() - startTime < maxLoadTime) {
+              setTimeout(waitCallback);
+            } else {
+              failed();
+            }
+          }
+        };
+        const waitForWebKitLinkLoaded = () => {
+          wait(() => {
+            const styleSheets = documentOrShadowRoot.styleSheets;
+            let i = styleSheets.length;
+            while (i--) {
+              const styleSheet = styleSheets[i];
+              const owner = styleSheet.ownerNode;
+              if (owner && owner.id === link.id) {
+                passed();
+                return true;
+              }
+            }
+            return false;
+          }, waitForWebKitLinkLoaded);
+        };
+        if (success) {
+          state.passed.push(success);
+        }
+        if (failure) {
+          state.failed.push(failure);
+        }
+        if (state.status === 1) {
+          return;
+        }
+        if (state.status === 2) {
+          passed();
+          return;
+        }
+        if (state.status === 3) {
+          failed();
+          return;
+        }
+        state.status = 1;
+        const linkElem = SugarElement.fromTag('link', doc.dom);
+        setAll$1(linkElem, {
+          rel: 'stylesheet',
+          type: 'text/css',
+          id: state.id
+        });
+        const startTime = Date.now();
+        if (settings.contentCssCors) {
+          set$2(linkElem, 'crossOrigin', 'anonymous');
+        }
+        if (settings.referrerPolicy) {
+          set$2(linkElem, 'referrerpolicy', settings.referrerPolicy);
+        }
+        link = linkElem.dom;
+        link.onload = waitForWebKitLinkLoaded;
+        link.onerror = failed;
+        addStyle(linkElem);
+        set$2(linkElem, 'href', urlWithSuffix);
+      });
+      const loadAll = urls => {
+        const loadedUrls = Promise.allSettled(map$3(urls, url => load(url).then(constant(url))));
+        return loadedUrls.then(results => {
+          const parts = partition$2(results, r => r.status === 'fulfilled');
+          if (parts.fail.length > 0) {
+            return Promise.reject(map$3(parts.fail, result => result.reason));
+          } else {
+            return map$3(parts.pass, result => result.value);
+          }
+        });
+      };
+      const unload = url => {
+        const urlWithSuffix = Tools._addCacheSuffix(url);
+        get$a(loadedStates, urlWithSuffix).each(state => {
+          const count = --state.count;
+          if (count === 0) {
+            delete loadedStates[urlWithSuffix];
+            removeStyle(state.id);
+          }
+        });
+      };
+      const unloadAll = urls => {
+        each$g(urls, url => {
+          unload(url);
+        });
+      };
+      return {
+        load,
+        loadAll,
+        unload,
+        unloadAll,
+        _setReferrerPolicy
+      };
+    };
+
+    const create$c = () => {
+      const map = new WeakMap();
+      const forElement = (referenceElement, settings) => {
+        const root = getRootNode(referenceElement);
+        const rootDom = root.dom;
+        return Optional.from(map.get(rootDom)).getOrThunk(() => {
+          const sl = StyleSheetLoader(rootDom, settings);
+          map.set(rootDom, sl);
+          return sl;
+        });
+      };
+      return { forElement };
+    };
+    const instance = create$c();
+
+    class DomTreeWalker {
+      constructor(startNode, rootNode) {
+        this.node = startNode;
+        this.rootNode = rootNode;
+        this.current = this.current.bind(this);
+        this.next = this.next.bind(this);
+        this.prev = this.prev.bind(this);
+        this.prev2 = this.prev2.bind(this);
+      }
+      current() {
+        return this.node;
+      }
+      next(shallow) {
+        this.node = this.findSibling(this.node, 'firstChild', 'nextSibling', shallow);
+        return this.node;
+      }
+      prev(shallow) {
+        this.node = this.findSibling(this.node, 'lastChild', 'previousSibling', shallow);
+        return this.node;
+      }
+      prev2(shallow) {
+        this.node = this.findPreviousNode(this.node, 'lastChild', 'previousSibling', shallow);
+        return this.node;
+      }
+      findSibling(node, startName, siblingName, shallow) {
+        let sibling, parent;
+        if (node) {
+          if (!shallow && node[startName]) {
+            return node[startName];
+          }
+          if (node !== this.rootNode) {
+            sibling = node[siblingName];
+            if (sibling) {
+              return sibling;
+            }
+            for (parent = node.parentNode; parent && parent !== this.rootNode; parent = parent.parentNode) {
+              sibling = parent[siblingName];
+              if (sibling) {
+                return sibling;
+              }
+            }
+          }
+        }
+      }
+      findPreviousNode(node, startName, siblingName, shallow) {
+        let sibling, parent, child;
+        if (node) {
+          sibling = node[siblingName];
+          if (this.rootNode && sibling === this.rootNode) {
+            return;
+          }
+          if (sibling) {
+            if (!shallow) {
+              for (child = sibling[startName]; child; child = child[startName]) {
+                if (!child[startName]) {
+                  return child;
+                }
+              }
+            }
+            return sibling;
+          }
+          parent = node.parentNode;
+          if (parent && parent !== this.rootNode) {
+            return parent;
+          }
+        }
+      }
+    }
+
+    const blocks = [
+      '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'
+    ];
+    const tableCells = [
+      'td',
+      'th'
+    ];
+    const tableSections = [
+      'thead',
+      'tbody',
+      'tfoot'
+    ];
+    const textBlocks = [
+      'h1',
+      'h2',
+      'h3',
+      'h4',
+      'h5',
+      'h6',
+      'p',
+      'div',
+      'address',
+      'pre',
+      'form',
+      'blockquote',
+      'center',
+      'dir',
+      'fieldset',
+      'header',
+      'footer',
+      'article',
+      'section',
+      'hgroup',
+      'aside',
+      'nav',
+      'figure'
+    ];
+    const headings = [
+      'h1',
+      'h2',
+      'h3',
+      'h4',
+      'h5',
+      'h6'
+    ];
+    const listItems$1 = [
+      'li',
+      'dd',
+      'dt'
+    ];
+    const lists = [
+      'ul',
+      'ol',
+      'dl'
+    ];
+    const wsElements = [
+      'pre',
+      'script',
+      'textarea',
+      'style'
+    ];
+    const lazyLookup = items => {
+      let lookup;
+      return node => {
+        lookup = lookup ? lookup : mapToObject(items, always);
+        return has$2(lookup, name(node));
+      };
+    };
+    const isHeading = lazyLookup(headings);
+    const isBlock$2 = lazyLookup(blocks);
+    const isTable$2 = node => name(node) === 'table';
+    const isInline$1 = node => isElement$7(node) && !isBlock$2(node);
+    const isBr$4 = node => isElement$7(node) && name(node) === 'br';
+    const isTextBlock$2 = lazyLookup(textBlocks);
+    const isList = lazyLookup(lists);
+    const isListItem = lazyLookup(listItems$1);
+    const isTableSection = lazyLookup(tableSections);
+    const isTableCell$4 = lazyLookup(tableCells);
+    const isWsPreserveElement = lazyLookup(wsElements);
+
+    const ancestor$1 = (scope, selector, isRoot) => ancestor$2(scope, selector, isRoot).isSome();
+
+    const zeroWidth = '\uFEFF';
+    const nbsp = '\xA0';
+    const isZwsp$1 = char => char === zeroWidth;
+    const removeZwsp = s => s.replace(/\uFEFF/g, '');
+
+    const ZWSP$1 = zeroWidth;
+    const isZwsp = isZwsp$1;
+    const trim$1 = removeZwsp;
+
+    const isElement$5 = isElement$6;
+    const isText$7 = isText$8;
+    const isCaretContainerBlock$1 = node => {
+      if (isText$7(node)) {
+        node = node.parentNode;
+      }
+      return isElement$5(node) && node.hasAttribute('data-mce-caret');
+    };
+    const isCaretContainerInline = node => isText$7(node) && isZwsp(node.data);
+    const isCaretContainer$2 = node => isCaretContainerBlock$1(node) || isCaretContainerInline(node);
+    const hasContent = node => node.firstChild !== node.lastChild || !isBr$5(node.firstChild);
+    const insertInline$1 = (node, before) => {
+      const doc = node.ownerDocument;
+      const textNode = doc.createTextNode(ZWSP$1);
+      const parentNode = node.parentNode;
+      if (!before) {
+        const sibling = node.nextSibling;
+        if (isText$7(sibling)) {
+          if (isCaretContainer$2(sibling)) {
+            return sibling;
+          }
+          if (startsWithCaretContainer$1(sibling)) {
+            sibling.splitText(1);
+            return sibling;
+          }
+        }
+        if (node.nextSibling) {
+          parentNode.insertBefore(textNode, node.nextSibling);
+        } else {
+          parentNode.appendChild(textNode);
+        }
+      } else {
+        const sibling = node.previousSibling;
+        if (isText$7(sibling)) {
+          if (isCaretContainer$2(sibling)) {
+            return sibling;
+          }
+          if (endsWithCaretContainer$1(sibling)) {
+            return sibling.splitText(sibling.data.length - 1);
+          }
+        }
+        parentNode.insertBefore(textNode, node);
+      }
+      return textNode;
+    };
+    const isBeforeInline = pos => {
+      const container = pos.container();
+      if (!isText$8(container)) {
+        return false;
+      }
+      return container.data.charAt(pos.offset()) === ZWSP$1 || pos.isAtStart() && isCaretContainerInline(container.previousSibling);
+    };
+    const isAfterInline = pos => {
+      const container = pos.container();
+      if (!isText$8(container)) {
+        return false;
+      }
+      return container.data.charAt(pos.offset() - 1) === ZWSP$1 || pos.isAtEnd() && isCaretContainerInline(container.nextSibling);
+    };
+    const createBogusBr = () => {
+      const br = document.createElement('br');
+      br.setAttribute('data-mce-bogus', '1');
+      return br;
+    };
+    const insertBlock = (blockName, node, before) => {
+      const doc = node.ownerDocument;
+      const blockNode = doc.createElement(blockName);
+      blockNode.setAttribute('data-mce-caret', before ? 'before' : 'after');
+      blockNode.setAttribute('data-mce-bogus', 'all');
+      blockNode.appendChild(createBogusBr());
+      const parentNode = node.parentNode;
+      if (!before) {
+        if (node.nextSibling) {
+          parentNode.insertBefore(blockNode, node.nextSibling);
+        } else {
+          parentNode.appendChild(blockNode);
+        }
+      } else {
+        parentNode.insertBefore(blockNode, node);
+      }
+      return blockNode;
+    };
+    const startsWithCaretContainer$1 = node => isText$7(node) && node.data[0] === ZWSP$1;
+    const endsWithCaretContainer$1 = node => isText$7(node) && node.data[node.data.length - 1] === ZWSP$1;
+    const trimBogusBr = elm => {
+      const brs = elm.getElementsByTagName('br');
+      const lastBr = brs[brs.length - 1];
+      if (isBogus$2(lastBr)) {
+        lastBr.parentNode.removeChild(lastBr);
+      }
+    };
+    const showCaretContainerBlock = caretContainer => {
+      if (caretContainer && caretContainer.hasAttribute('data-mce-caret')) {
+        trimBogusBr(caretContainer);
+        caretContainer.removeAttribute('data-mce-caret');
+        caretContainer.removeAttribute('data-mce-bogus');
+        caretContainer.removeAttribute('style');
+        caretContainer.removeAttribute('data-mce-style');
+        caretContainer.removeAttribute('_moz_abspos');
+        return caretContainer;
+      }
+      return null;
+    };
+    const isRangeInCaretContainerBlock = range => isCaretContainerBlock$1(range.startContainer);
+
+    const isContentEditableTrue$3 = isContentEditableTrue$4;
+    const isContentEditableFalse$9 = isContentEditableFalse$a;
+    const isBr$3 = isBr$5;
+    const isText$6 = isText$8;
+    const isInvalidTextElement = matchNodeNames([
+      'script',
+      'style',
+      'textarea'
+    ]);
+    const isAtomicInline = matchNodeNames([
+      'img',
+      'input',
+      'textarea',
+      'hr',
+      'iframe',
+      'video',
+      'audio',
+      'object',
+      'embed'
+    ]);
+    const isTable$1 = matchNodeNames(['table']);
+    const isCaretContainer$1 = isCaretContainer$2;
+    const isCaretCandidate$3 = node => {
+      if (isCaretContainer$1(node)) {
+        return false;
+      }
+      if (isText$6(node)) {
+        return !isInvalidTextElement(node.parentNode);
+      }
+      return isAtomicInline(node) || isBr$3(node) || isTable$1(node) || isNonUiContentEditableFalse(node);
+    };
+    const isUnselectable = node => isElement$6(node) && node.getAttribute('unselectable') === 'true';
+    const isNonUiContentEditableFalse = node => isUnselectable(node) === false && isContentEditableFalse$9(node);
+    const isInEditable = (node, root) => {
+      for (node = node.parentNode; node && node !== root; node = node.parentNode) {
+        if (isNonUiContentEditableFalse(node)) {
+          return false;
+        }
+        if (isContentEditableTrue$3(node)) {
+          return true;
+        }
+      }
+      return true;
+    };
+    const isAtomicContentEditableFalse = node => {
+      if (!isNonUiContentEditableFalse(node)) {
+        return false;
+      }
+      return foldl(from(node.getElementsByTagName('*')), (result, elm) => {
+        return result || isContentEditableTrue$3(elm);
+      }, false) !== true;
+    };
+    const isAtomic$1 = node => isAtomicInline(node) || isAtomicContentEditableFalse(node);
+    const isEditableCaretCandidate$1 = (node, root) => isCaretCandidate$3(node) && isInEditable(node, root);
+
+    const whiteSpaceRegExp = /^[ \t\r\n]*$/;
+    const isWhitespaceText = text => whiteSpaceRegExp.test(text);
+    const isCollapsibleWhitespace$1 = c => ' \f\t\x0B'.indexOf(c) !== -1;
+    const isNewLineChar = c => c === '\n' || c === '\r';
+    const isNewline = (text, idx) => idx < text.length && idx >= 0 ? isNewLineChar(text[idx]) : false;
+    const normalize$4 = (text, tabSpaces = 4, isStartOfContent = true, isEndOfContent = true) => {
+      const tabSpace = repeat(' ', tabSpaces);
+      const normalizedText = text.replace(/\t/g, tabSpace);
+      const result = foldl(normalizedText, (acc, c) => {
+        if (isCollapsibleWhitespace$1(c) || c === nbsp) {
+          if (acc.pcIsSpace || acc.str === '' && isStartOfContent || acc.str.length === normalizedText.length - 1 && isEndOfContent || isNewline(normalizedText, acc.str.length + 1)) {
+            return {
+              pcIsSpace: false,
+              str: acc.str + nbsp
+            };
+          } else {
+            return {
+              pcIsSpace: true,
+              str: acc.str + ' '
+            };
+          }
+        } else {
+          return {
+            pcIsSpace: isNewLineChar(c),
+            str: acc.str + c
+          };
+        }
+      }, {
+        pcIsSpace: false,
+        str: ''
+      });
+      return result.str;
+    };
+
+    const hasWhitespacePreserveParent = (node, rootNode) => {
+      const rootElement = SugarElement.fromDom(rootNode);
+      const startNode = SugarElement.fromDom(node);
+      return ancestor$1(startNode, 'pre,code', curry(eq, rootElement));
+    };
+    const isWhitespace$1 = (node, rootNode) => {
+      return isText$8(node) && isWhitespaceText(node.data) && hasWhitespacePreserveParent(node, rootNode) === false;
+    };
+    const isNamedAnchor = node => {
+      return isElement$6(node) && node.nodeName === 'A' && !node.hasAttribute('href') && (node.hasAttribute('name') || node.hasAttribute('id'));
+    };
+    const isContent$1 = (node, rootNode) => {
+      return isCaretCandidate$3(node) && isWhitespace$1(node, rootNode) === false || isNamedAnchor(node) || isBookmark(node);
+    };
+    const isBookmark = hasAttribute('data-mce-bookmark');
+    const isBogus$1 = hasAttribute('data-mce-bogus');
+    const isBogusAll = hasAttributeValue('data-mce-bogus', 'all');
+    const isEmptyNode = (targetNode, skipBogus) => {
+      let brCount = 0;
+      if (isContent$1(targetNode, targetNode)) {
+        return false;
+      } else {
+        let node = targetNode.firstChild;
+        if (!node) {
+          return true;
+        }
+        const walker = new DomTreeWalker(node, targetNode);
+        do {
+          if (skipBogus) {
+            if (isBogusAll(node)) {
+              node = walker.next(true);
+              continue;
+            }
+            if (isBogus$1(node)) {
+              node = walker.next();
+              continue;
+            }
+          }
+          if (isBr$5(node)) {
+            brCount++;
+            node = walker.next();
+            continue;
+          }
+          if (isContent$1(node, targetNode)) {
+            return false;
+          }
+          node = walker.next();
+        } while (node);
+        return brCount <= 1;
+      }
+    };
+    const isEmpty$2 = (elm, skipBogus = true) => isEmptyNode(elm.dom, skipBogus);
+
+    const isSpan = node => node.nodeName.toLowerCase() === 'span';
+    const isInlineContent = (node, root) => isNonNullable(node) && (isContent$1(node, root) || isInline$1(SugarElement.fromDom(node)));
+    const surroundedByInlineContent = (node, root) => {
+      const prev = new DomTreeWalker(node, root).prev(false);
+      const next = new DomTreeWalker(node, root).next(false);
+      const prevIsInline = isUndefined(prev) || isInlineContent(prev, root);
+      const nextIsInline = isUndefined(next) || isInlineContent(next, root);
+      return prevIsInline && nextIsInline;
+    };
+    const isBookmarkNode$2 = node => isSpan(node) && node.getAttribute('data-mce-type') === 'bookmark';
+    const isKeepTextNode = (node, root) => isText$8(node) && node.data.length > 0 && surroundedByInlineContent(node, root);
+    const isKeepElement = node => isElement$6(node) ? node.childNodes.length > 0 : false;
+    const isDocument = node => isDocumentFragment(node) || isDocument$1(node);
+    const trimNode = (dom, node, root) => {
+      const rootNode = root || node;
+      if (isElement$6(node) && isBookmarkNode$2(node)) {
+        return node;
+      }
+      const children = node.childNodes;
+      for (let i = children.length - 1; i >= 0; i--) {
+        trimNode(dom, children[i], rootNode);
+      }
+      if (isElement$6(node)) {
+        const currentChildren = node.childNodes;
+        if (currentChildren.length === 1 && isBookmarkNode$2(currentChildren[0])) {
+          node.parentNode.insertBefore(currentChildren[0], node);
+        }
+      }
+      if (!isDocument(node) && !isContent$1(node, rootNode) && !isKeepElement(node) && !isKeepTextNode(node, rootNode)) {
+        dom.remove(node);
+      }
+      return node;
+    };
+
+    const makeMap$3 = Tools.makeMap;
+    const attrsCharsRegExp = /[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+    const textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+    const rawCharsRegExp = /[<>&\"\']/g;
+    const entityRegExp = /&#([a-z0-9]+);?|&([a-z0-9]+);/gi;
+    const asciiMap = {
+      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'
+    };
+    const baseEntities = {
+      '"': '&quot;',
+      '\'': '&#39;',
+      '<': '&lt;',
+      '>': '&gt;',
+      '&': '&amp;',
+      '`': '&#96;'
+    };
+    const reverseEntities = {
+      '&lt;': '<',
+      '&gt;': '>',
+      '&amp;': '&',
+      '&quot;': '"',
+      '&apos;': `'`
+    };
+    const nativeDecode = text => {
+      const elm = SugarElement.fromTag('div').dom;
+      elm.innerHTML = text;
+      return elm.textContent || elm.innerText || text;
+    };
+    const buildEntitiesLookup = (items, radix) => {
+      let i, chr, entity;
+      const lookup = {};
+      if (items) {
+        items = items.split(',');
+        radix = radix || 10;
+        for (i = 0; i < items.length; i += 2) {
+          chr = String.fromCharCode(parseInt(items[i], radix));
+          if (!baseEntities[chr]) {
+            entity = '&' + items[i + 1] + ';';
+            lookup[chr] = entity;
+            lookup[entity] = chr;
+          }
+        }
+        return lookup;
+      }
+    };
+    const namedEntities = buildEntitiesLookup('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);
+    const encodeRaw = (text, attr) => text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {
+      return baseEntities[chr] || chr;
+    });
+    const encodeAllRaw = text => ('' + text).replace(rawCharsRegExp, chr => {
+      return baseEntities[chr] || chr;
+    });
+    const encodeNumeric = (text, attr) => text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {
+      if (chr.length > 1) {
+        return '&#' + ((chr.charCodeAt(0) - 55296) * 1024 + (chr.charCodeAt(1) - 56320) + 65536) + ';';
+      }
+      return baseEntities[chr] || '&#' + chr.charCodeAt(0) + ';';
+    });
+    const encodeNamed = (text, attr, entities) => {
+      entities = entities || namedEntities;
+      return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {
+        return baseEntities[chr] || entities[chr] || chr;
+      });
+    };
+    const getEncodeFunc = (name, entities) => {
+      const entitiesMap = buildEntitiesLookup(entities) || namedEntities;
+      const encodeNamedAndNumeric = (text, attr) => text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {
+        if (baseEntities[chr] !== undefined) {
+          return baseEntities[chr];
+        }
+        if (entitiesMap[chr] !== undefined) {
+          return entitiesMap[chr];
+        }
+        if (chr.length > 1) {
+          return '&#' + ((chr.charCodeAt(0) - 55296) * 1024 + (chr.charCodeAt(1) - 56320) + 65536) + ';';
+        }
+        return '&#' + chr.charCodeAt(0) + ';';
+      });
+      const encodeCustomNamed = (text, attr) => {
+        return encodeNamed(text, attr, entitiesMap);
+      };
+      const nameMap = makeMap$3(name.replace(/\+/g, ','));
+      if (nameMap.named && nameMap.numeric) {
+        return encodeNamedAndNumeric;
+      }
+      if (nameMap.named) {
+        if (entities) {
+          return encodeCustomNamed;
+        }
+        return encodeNamed;
+      }
+      if (nameMap.numeric) {
+        return encodeNumeric;
+      }
+      return encodeRaw;
+    };
+    const decode = text => text.replace(entityRegExp, (all, numeric) => {
+      if (numeric) {
+        if (numeric.charAt(0).toLowerCase() === 'x') {
+          numeric = parseInt(numeric.substr(1), 16);
+        } else {
+          numeric = parseInt(numeric, 10);
+        }
+        if (numeric > 65535) {
+          numeric -= 65536;
+          return String.fromCharCode(55296 + (numeric >> 10), 56320 + (numeric & 1023));
+        }
+        return asciiMap[numeric] || String.fromCharCode(numeric);
+      }
+      return reverseEntities[all] || namedEntities[all] || nativeDecode(all);
+    });
+    const Entities = {
+      encodeRaw,
+      encodeAllRaw,
+      encodeNumeric,
+      encodeNamed,
+      getEncodeFunc,
+      decode
+    };
+
+    const mapCache = {}, dummyObj = {};
+    const makeMap$2 = Tools.makeMap, each$d = Tools.each, extend$2 = Tools.extend, explode$2 = Tools.explode, inArray = Tools.inArray;
+    const split$1 = (items, delim) => {
+      items = Tools.trim(items);
+      return items ? items.split(delim || ' ') : [];
+    };
+    const createMap = (defaultValue, extendWith) => {
+      const value = makeMap$2(defaultValue, ' ', makeMap$2(defaultValue.toUpperCase(), ' '));
+      return extend$2(value, extendWith);
+    };
+    const getTextRootBlockElements = schema => createMap('td th li dt dd figcaption caption details summary', schema.getTextBlockElements());
+    const compileSchema = type => {
+      const schema = {};
+      let globalAttributes, blockContent;
+      let phrasingContent, flowContent, html4BlockContent, html4PhrasingContent;
+      const add = (name, attributes = '', children = '') => {
+        const childNames = split$1(children);
+        const names = split$1(name);
+        let ni = names.length;
+        while (ni--) {
+          const attributesOrder = split$1([
+            globalAttributes,
+            attributes
+          ].join(' '));
+          schema[names[ni]] = {
+            attributes: mapToObject(attributesOrder, () => ({})),
+            attributesOrder,
+            children: mapToObject(childNames, constant(dummyObj))
+          };
+        }
+      };
+      const addAttrs = (name, attributes) => {
+        const names = split$1(name);
+        const attrs = split$1(attributes);
+        let ni = names.length;
+        while (ni--) {
+          const schemaItem = schema[names[ni]];
+          for (let i = 0, l = attrs.length; i < l; i++) {
+            schemaItem.attributes[attrs[i]] = {};
+            schemaItem.attributesOrder.push(attrs[i]);
+          }
+        }
+      };
+      if (mapCache[type]) {
+        return mapCache[type];
+      }
+      globalAttributes = 'id accesskey class dir lang style tabindex title role';
+      blockContent = 'address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul';
+      phrasingContent = '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';
+      if (type !== 'html4') {
+        globalAttributes += ' contenteditable contextmenu draggable dropzone ' + 'hidden spellcheck translate';
+        blockContent += ' article aside details dialog figure main header footer hgroup section nav';
+        phrasingContent += ' audio canvas command datalist mark meter output picture ' + 'progress time wbr video ruby bdi keygen';
+      }
+      if (type !== 'html5-strict') {
+        globalAttributes += ' xml:lang';
+        html4PhrasingContent = 'acronym applet basefont big font strike tt';
+        phrasingContent = [
+          phrasingContent,
+          html4PhrasingContent
+        ].join(' ');
+        each$d(split$1(html4PhrasingContent), name => {
+          add(name, '', phrasingContent);
+        });
+        html4BlockContent = 'center dir isindex noframes';
+        blockContent = [
+          blockContent,
+          html4BlockContent
+        ].join(' ');
+        flowContent = [
+          blockContent,
+          phrasingContent
+        ].join(' ');
+        each$d(split$1(html4BlockContent), name => {
+          add(name, '', flowContent);
+        });
+      }
+      flowContent = flowContent || [
+        blockContent,
+        phrasingContent
+      ].join(' ');
+      add('html', 'manifest', 'head body');
+      add('head', '', 'base command link meta noscript script style title');
+      add('title hr noscript br');
+      add('base', 'href target');
+      add('link', 'href rel media hreflang type sizes hreflang');
+      add('meta', 'name http-equiv content charset');
+      add('style', 'media type scoped');
+      add('script', 'src async defer type charset');
+      add('body', 'onafterprint onbeforeprint onbeforeunload onblur onerror onfocus ' + 'onhashchange onload onmessage onoffline ononline onpagehide onpageshow ' + 'onpopstate onresize onscroll onstorage onunload', flowContent);
+      add('address dt dd div caption', '', flowContent);
+      add('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', '', phrasingContent);
+      add('blockquote', 'cite', flowContent);
+      add('ol', 'reversed start type', 'li');
+      add('ul', '', 'li');
+      add('li', 'value', flowContent);
+      add('dl', '', 'dt dd');
+      add('a', 'href target rel media hreflang type', phrasingContent);
+      add('q', 'cite', phrasingContent);
+      add('ins del', 'cite datetime', flowContent);
+      add('img', 'src sizes srcset alt usemap ismap width height');
+      add('iframe', 'src name width height', flowContent);
+      add('embed', 'src type width height');
+      add('object', 'data type typemustmatch name usemap form width height', [
+        flowContent,
+        'param'
+      ].join(' '));
+      add('param', 'name value');
+      add('map', 'name', [
+        flowContent,
+        'area'
+      ].join(' '));
+      add('area', 'alt coords shape href target rel media hreflang type');
+      add('table', 'border', 'caption colgroup thead tfoot tbody tr' + (type === 'html4' ? ' col' : ''));
+      add('colgroup', 'span', 'col');
+      add('col', 'span');
+      add('tbody thead tfoot', '', 'tr');
+      add('tr', '', 'td th');
+      add('td', 'colspan rowspan headers', flowContent);
+      add('th', 'colspan rowspan headers scope abbr', flowContent);
+      add('form', 'accept-charset action autocomplete enctype method name novalidate target', flowContent);
+      add('fieldset', 'disabled form name', [
+        flowContent,
+        'legend'
+      ].join(' '));
+      add('label', 'form for', phrasingContent);
+      add('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');
+      add('button', 'disabled form formaction formenctype formmethod formnovalidate formtarget name type value', type === 'html4' ? flowContent : phrasingContent);
+      add('select', 'disabled form multiple name required size', 'option optgroup');
+      add('optgroup', 'disabled label', 'option');
+      add('option', 'disabled label selected value');
+      add('textarea', 'cols dirname disabled form maxlength name readonly required rows wrap');
+      add('menu', 'type label', [
+        flowContent,
+        'li'
+      ].join(' '));
+      add('noscript', '', flowContent);
+      if (type !== 'html4') {
+        add('wbr');
+        add('ruby', '', [
+          phrasingContent,
+          'rt rp'
+        ].join(' '));
+        add('figcaption', '', flowContent);
+        add('mark rt rp summary bdi', '', phrasingContent);
+        add('canvas', 'width height', flowContent);
+        add('video', 'src crossorigin poster preload autoplay mediagroup loop ' + 'muted controls width height buffered', [
+          flowContent,
+          'track source'
+        ].join(' '));
+        add('audio', 'src crossorigin preload autoplay mediagroup loop muted controls ' + 'buffered volume', [
+          flowContent,
+          'track source'
+        ].join(' '));
+        add('picture', '', 'img source');
+        add('source', 'src srcset type media sizes');
+        add('track', 'kind src srclang label default');
+        add('datalist', '', [
+          phrasingContent,
+          'option'
+        ].join(' '));
+        add('article section nav aside main header footer', '', flowContent);
+        add('hgroup', '', 'h1 h2 h3 h4 h5 h6');
+        add('figure', '', [
+          flowContent,
+          'figcaption'
+        ].join(' '));
+        add('time', 'datetime', phrasingContent);
+        add('dialog', 'open', flowContent);
+        add('command', 'type label icon disabled checked radiogroup command');
+        add('output', 'for form name', phrasingContent);
+        add('progress', 'value max', phrasingContent);
+        add('meter', 'value min max low high optimum', phrasingContent);
+        add('details', 'open', [
+          flowContent,
+          'summary'
+        ].join(' '));
+        add('keygen', 'autofocus challenge disabled form keytype name');
+      }
+      if (type !== 'html5-strict') {
+        addAttrs('script', 'language xml:space');
+        addAttrs('style', 'xml:space');
+        addAttrs('object', 'declare classid code codebase codetype archive standby align border hspace vspace');
+        addAttrs('embed', 'align name hspace vspace');
+        addAttrs('param', 'valuetype type');
+        addAttrs('a', 'charset name rev shape coords');
+        addAttrs('br', 'clear');
+        addAttrs('applet', 'codebase archive code object alt name width height align hspace vspace');
+        addAttrs('img', 'name longdesc align border hspace vspace');
+        addAttrs('iframe', 'longdesc frameborder marginwidth marginheight scrolling align');
+        addAttrs('font basefont', 'size color face');
+        addAttrs('input', 'usemap align');
+        addAttrs('select');
+        addAttrs('textarea');
+        addAttrs('h1 h2 h3 h4 h5 h6 div p legend caption', 'align');
+        addAttrs('ul', 'type compact');
+        addAttrs('li', 'type');
+        addAttrs('ol dl menu dir', 'compact');
+        addAttrs('pre', 'width xml:space');
+        addAttrs('hr', 'align noshade size width');
+        addAttrs('isindex', 'prompt');
+        addAttrs('table', 'summary width frame rules cellspacing cellpadding align bgcolor');
+        addAttrs('col', 'width align char charoff valign');
+        addAttrs('colgroup', 'width align char charoff valign');
+        addAttrs('thead', 'align char charoff valign');
+        addAttrs('tr', 'align char charoff valign bgcolor');
+        addAttrs('th', 'axis align char charoff valign nowrap bgcolor width height');
+        addAttrs('form', 'accept');
+        addAttrs('td', 'abbr axis scope align char charoff valign nowrap bgcolor width height');
+        addAttrs('tfoot', 'align char charoff valign');
+        addAttrs('tbody', 'align char charoff valign');
+        addAttrs('area', 'nohref');
+        addAttrs('body', 'background bgcolor text link vlink alink');
+      }
+      if (type !== 'html4') {
+        addAttrs('input button select textarea', 'autofocus');
+        addAttrs('input textarea', 'placeholder');
+        addAttrs('a', 'download');
+        addAttrs('link script img', 'crossorigin');
+        addAttrs('img', 'loading');
+        addAttrs('iframe', 'sandbox seamless allowfullscreen loading');
+      }
+      if (type !== 'html4') {
+        each$g([
+          schema.video,
+          schema.audio
+        ], item => {
+          delete item.children.audio;
+          delete item.children.video;
+        });
+      }
+      each$d(split$1('a form meter progress dfn'), name => {
+        if (schema[name]) {
+          delete schema[name].children[name];
+        }
+      });
+      delete schema.caption.children.table;
+      delete schema.script;
+      mapCache[type] = schema;
+      return schema;
+    };
+    const compileElementMap = (value, mode) => {
+      let styles;
+      if (value) {
+        styles = {};
+        if (typeof value === 'string') {
+          value = { '*': value };
+        }
+        each$d(value, (value, key) => {
+          styles[key] = styles[key.toUpperCase()] = mode === 'map' ? makeMap$2(value, /[, ]/) : explode$2(value, /[, ]/);
+        });
+      }
+      return styles;
+    };
+    const Schema = settings => {
+      var _a;
+      const elements = {};
+      const children = {};
+      let patternElements = [];
+      const customElementsMap = {}, specialElements = {};
+      const createLookupTable = (option, defaultValue, extendWith) => {
+        let value = settings[option];
+        if (!value) {
+          value = mapCache[option];
+          if (!value) {
+            value = createMap(defaultValue, extendWith);
+            mapCache[option] = value;
+          }
+        } else {
+          value = makeMap$2(value, /[, ]/, makeMap$2(value.toUpperCase(), /[, ]/));
+        }
+        return value;
+      };
+      settings = settings || {};
+      const schemaType = (_a = settings.schema) !== null && _a !== void 0 ? _a : 'html5';
+      const schemaItems = compileSchema(schemaType);
+      if (settings.verify_html === false) {
+        settings.valid_elements = '*[*]';
+      }
+      const validStyles = compileElementMap(settings.valid_styles);
+      const invalidStyles = compileElementMap(settings.invalid_styles, 'map');
+      const validClasses = compileElementMap(settings.valid_classes, 'map');
+      const whitespaceElementsMap = createLookupTable('whitespace_elements', 'pre script noscript style textarea video audio iframe object code');
+      const selfClosingElementsMap = createLookupTable('self_closing_elements', 'colgroup dd dt li option p td tfoot th thead tr');
+      const voidElementsMap = createLookupTable('void_elements', 'area base basefont br col frame hr img input isindex link ' + 'meta param embed source wbr track');
+      const boolAttrMap = createLookupTable('boolean_attributes', 'checked compact declare defer disabled ismap multiple nohref noresize ' + 'noshade nowrap readonly selected autoplay loop controls allowfullscreen');
+      const nonEmptyOrMoveCaretBeforeOnEnter = 'td th iframe video audio object script code';
+      const nonEmptyElementsMap = createLookupTable('non_empty_elements', nonEmptyOrMoveCaretBeforeOnEnter + ' pre', voidElementsMap);
+      const moveCaretBeforeOnEnterElementsMap = createLookupTable('move_caret_before_on_enter_elements', nonEmptyOrMoveCaretBeforeOnEnter + ' table', voidElementsMap);
+      const textBlockElementsMap = createLookupTable('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');
+      const blockElementsMap = createLookupTable('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', textBlockElementsMap);
+      const textInlineElementsMap = createLookupTable('text_inline_elements', 'span strong b em i font s strike u var cite ' + 'dfn code mark q sup sub samp');
+      each$d('script noscript iframe noframes noembed title style textarea xmp plaintext'.split(' '), name => {
+        specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');
+      });
+      const patternToRegExp = str => new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');
+      const addValidElements = validElements => {
+        let ei, el, ai, al, matches, element, attr, attrData, elementName, attrName, attrType, attributes, attributesOrder, prefix, outputName, globalAttributes, globalAttributesOrder, value;
+        const elementRuleRegExp = /^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)])?$/, attrRuleRegExp = /^([!\-])?(\w+[\\:]:\w+|[^=~<]+)?(?:([=~<])(.*))?$/, hasPatternsRegExp = /[*?+]/;
+        if (validElements) {
+          const validElementsArr = split$1(validElements, ',');
+          if (elements['@']) {
+            globalAttributes = elements['@'].attributes;
+            globalAttributesOrder = elements['@'].attributesOrder;
+          }
+          for (ei = 0, el = validElementsArr.length; ei < el; ei++) {
+            matches = elementRuleRegExp.exec(validElementsArr[ei]);
+            if (matches) {
+              prefix = matches[1];
+              elementName = matches[2];
+              outputName = matches[3];
+              attrData = matches[5];
+              attributes = {};
+              attributesOrder = [];
+              element = {
+                attributes,
+                attributesOrder
+              };
+              if (prefix === '#') {
+                element.paddEmpty = true;
+              }
+              if (prefix === '-') {
+                element.removeEmpty = true;
+              }
+              if (matches[4] === '!') {
+                element.removeEmptyAttrs = true;
+              }
+              if (globalAttributes) {
+                each$f(globalAttributes, (value, key) => {
+                  attributes[key] = value;
+                });
+                attributesOrder.push.apply(attributesOrder, globalAttributesOrder);
+              }
+              if (attrData) {
+                attrData = split$1(attrData, '|');
+                for (ai = 0, al = attrData.length; ai < al; ai++) {
+                  matches = attrRuleRegExp.exec(attrData[ai]);
+                  if (matches) {
+                    attr = {};
+                    attrType = matches[1];
+                    attrName = matches[2].replace(/[\\:]:/g, ':');
+                    prefix = matches[3];
+                    value = matches[4];
+                    if (attrType === '!') {
+                      element.attributesRequired = element.attributesRequired || [];
+                      element.attributesRequired.push(attrName);
+                      attr.required = true;
+                    }
+                    if (attrType === '-') {
+                      delete attributes[attrName];
+                      attributesOrder.splice(inArray(attributesOrder, attrName), 1);
+                      continue;
+                    }
+                    if (prefix) {
+                      if (prefix === '=') {
+                        element.attributesDefault = element.attributesDefault || [];
+                        element.attributesDefault.push({
+                          name: attrName,
+                          value
+                        });
+                        attr.defaultValue = value;
+                      }
+                      if (prefix === '~') {
+                        element.attributesForced = element.attributesForced || [];
+                        element.attributesForced.push({
+                          name: attrName,
+                          value
+                        });
+                        attr.forcedValue = value;
+                      }
+                      if (prefix === '<') {
+                        attr.validValues = makeMap$2(value, '?');
+                      }
+                    }
+                    if (hasPatternsRegExp.test(attrName)) {
+                      element.attributePatterns = element.attributePatterns || [];
+                      attr.pattern = patternToRegExp(attrName);
+                      element.attributePatterns.push(attr);
+                    } else {
+                      if (!attributes[attrName]) {
+                        attributesOrder.push(attrName);
+                      }
+                      attributes[attrName] = attr;
+                    }
+                  }
+                }
+              }
+              if (!globalAttributes && elementName === '@') {
+                globalAttributes = attributes;
+                globalAttributesOrder = attributesOrder;
+              }
+              if (outputName) {
+                element.outputName = elementName;
+                elements[outputName] = element;
+              }
+              if (hasPatternsRegExp.test(elementName)) {
+                element.pattern = patternToRegExp(elementName);
+                patternElements.push(element);
+              } else {
+                elements[elementName] = element;
+              }
+            }
+          }
+        }
+      };
+      const setValidElements = validElements => {
+        patternElements = [];
+        each$g(keys(elements), name => {
+          delete elements[name];
+        });
+        addValidElements(validElements);
+        each$d(schemaItems, (element, name) => {
+          children[name] = element.children;
+        });
+      };
+      const addCustomElements = customElements => {
+        const customElementRegExp = /^(~)?(.+)$/;
+        if (customElements) {
+          mapCache.text_block_elements = mapCache.block_elements = null;
+          each$d(split$1(customElements, ','), rule => {
+            const matches = customElementRegExp.exec(rule), inline = matches[1] === '~', cloneName = inline ? 'span' : 'div', name = matches[2];
+            children[name] = children[cloneName];
+            customElementsMap[name] = cloneName;
+            if (!inline) {
+              blockElementsMap[name.toUpperCase()] = {};
+              blockElementsMap[name] = {};
+            }
+            if (!elements[name]) {
+              let customRule = elements[cloneName];
+              customRule = extend$2({}, customRule);
+              delete customRule.removeEmptyAttrs;
+              delete customRule.removeEmpty;
+              elements[name] = customRule;
+            }
+            each$d(children, (element, elmName) => {
+              if (element[cloneName]) {
+                children[elmName] = element = extend$2({}, children[elmName]);
+                element[name] = element[cloneName];
+              }
+            });
+          });
+        }
+      };
+      const addValidChildren = validChildren => {
+        const childRuleRegExp = /^([+\-]?)([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]+)\[([^\]]+)]$/;
+        mapCache[schemaType] = null;
+        if (validChildren) {
+          each$d(split$1(validChildren, ','), rule => {
+            const matches = childRuleRegExp.exec(rule);
+            let parent, prefix;
+            if (matches) {
+              prefix = matches[1];
+              if (prefix) {
+                parent = children[matches[2]];
+              } else {
+                parent = children[matches[2]] = { '#comment': {} };
+              }
+              parent = children[matches[2]];
+              each$d(split$1(matches[3], '|'), child => {
+                if (prefix === '-') {
+                  delete parent[child];
+                } else {
+                  parent[child] = {};
+                }
+              });
+            }
+          });
+        }
+      };
+      const getElementRule = name => {
+        let element = elements[name], i;
+        if (element) {
+          return element;
+        }
+        i = patternElements.length;
+        while (i--) {
+          element = patternElements[i];
+          if (element.pattern.test(name)) {
+            return element;
+          }
+        }
+      };
+      if (!settings.valid_elements) {
+        each$d(schemaItems, (element, name) => {
+          elements[name] = {
+            attributes: element.attributes,
+            attributesOrder: element.attributesOrder
+          };
+          children[name] = element.children;
+        });
+        each$d(split$1('strong/b em/i'), item => {
+          const items = split$1(item, '/');
+          elements[items[1]].outputName = items[0];
+        });
+        each$d(textInlineElementsMap, (_val, name) => {
+          if (elements[name]) {
+            if (settings.padd_empty_block_inline_children) {
+              elements[name].paddInEmptyBlock = true;
+            }
+            elements[name].removeEmpty = true;
+          }
+        });
+        each$d(split$1('ol ul blockquote a table tbody'), name => {
+          if (elements[name]) {
+            elements[name].removeEmpty = true;
+          }
+        });
+        each$d(split$1('p h1 h2 h3 h4 h5 h6 th td pre div address caption li'), name => {
+          elements[name].paddEmpty = true;
+        });
+        each$d(split$1('span'), name => {
+          elements[name].removeEmptyAttrs = true;
+        });
+      } else {
+        setValidElements(settings.valid_elements);
+      }
+      addCustomElements(settings.custom_elements);
+      addValidChildren(settings.valid_children);
+      addValidElements(settings.extended_valid_elements);
+      addValidChildren('+ol[ul|ol],+ul[ul|ol]');
+      each$d({
+        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'
+      }, (parents, item) => {
+        if (elements[item]) {
+          elements[item].parentsRequired = split$1(parents);
+        }
+      });
+      if (settings.invalid_elements) {
+        each$d(explode$2(settings.invalid_elements), item => {
+          if (elements[item]) {
+            delete elements[item];
+          }
+        });
+      }
+      if (!getElementRule('span')) {
+        addValidElements('span[!data-mce-type|*]');
+      }
+      const getValidStyles = constant(validStyles);
+      const getInvalidStyles = constant(invalidStyles);
+      const getValidClasses = constant(validClasses);
+      const getBoolAttrs = constant(boolAttrMap);
+      const getBlockElements = constant(blockElementsMap);
+      const getTextBlockElements = constant(textBlockElementsMap);
+      const getTextInlineElements = constant(textInlineElementsMap);
+      const getVoidElements = constant(Object.seal(voidElementsMap));
+      const getSelfClosingElements = constant(selfClosingElementsMap);
+      const getNonEmptyElements = constant(nonEmptyElementsMap);
+      const getMoveCaretBeforeOnEnterElements = constant(moveCaretBeforeOnEnterElementsMap);
+      const getWhitespaceElements = constant(whitespaceElementsMap);
+      const getSpecialElements = constant(Object.seal(specialElements));
+      const isValidChild = (name, child) => {
+        const parent = children[name.toLowerCase()];
+        return !!(parent && parent[child.toLowerCase()]);
+      };
+      const isValid = (name, attr) => {
+        let attrPatterns, i;
+        const rule = getElementRule(name);
+        if (rule) {
+          if (attr) {
+            if (rule.attributes[attr]) {
+              return true;
+            }
+            attrPatterns = rule.attributePatterns;
+            if (attrPatterns) {
+              i = attrPatterns.length;
+              while (i--) {
+                if (attrPatterns[i].pattern.test(attr)) {
+                  return true;
+                }
+              }
+            }
+          } else {
+            return true;
+          }
+        }
+        return false;
+      };
+      const getCustomElements = constant(customElementsMap);
+      return {
+        type: schemaType,
+        children,
+        elements,
+        getValidStyles,
+        getValidClasses,
+        getBlockElements,
+        getInvalidStyles,
+        getVoidElements,
+        getTextBlockElements,
+        getTextInlineElements,
+        getBoolAttrs,
+        getElementRule,
+        getSelfClosingElements,
+        getNonEmptyElements,
+        getMoveCaretBeforeOnEnterElements,
+        getWhitespaceElements,
+        getSpecialElements,
+        isValidChild,
+        isValid,
+        getCustomElements,
+        addValidElements,
+        setValidElements,
+        addCustomElements,
+        addValidChildren
+      };
+    };
+
+    const Styles = (settings, schema) => {
+      const urlOrStrRegExp = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi;
+      const styleRegExp = /\s*([^:]+):\s*([^;]+);?/g;
+      const trimRightRegExp = /\s+$/;
+      let i;
+      const encodingLookup = {};
+      let validStyles;
+      let invalidStyles;
+      const invisibleChar = zeroWidth;
+      settings = settings || {};
+      if (schema) {
+        validStyles = schema.getValidStyles();
+        invalidStyles = schema.getInvalidStyles();
+      }
+      const encodingItems = (`\\" \\' \\; \\: ; : ` + invisibleChar).split(' ');
+      for (i = 0; i < encodingItems.length; i++) {
+        encodingLookup[encodingItems[i]] = invisibleChar + i;
+        encodingLookup[invisibleChar + i] = encodingItems[i];
+      }
+      const self = {
+        parse: css => {
+          const styles = {};
+          let matches, name, value, isEncoded;
+          const urlConverter = settings.url_converter;
+          const urlConverterScope = settings.url_converter_scope || self;
+          const compress = (prefix, suffix, noJoin) => {
+            const top = styles[prefix + '-top' + suffix];
+            if (!top) {
+              return;
+            }
+            const right = styles[prefix + '-right' + suffix];
+            if (!right) {
+              return;
+            }
+            const bottom = styles[prefix + '-bottom' + suffix];
+            if (!bottom) {
+              return;
+            }
+            const left = styles[prefix + '-left' + suffix];
+            if (!left) {
+              return;
+            }
+            const box = [
+              top,
+              right,
+              bottom,
+              left
+            ];
+            i = box.length - 1;
+            while (i--) {
+              if (box[i] !== box[i + 1]) {
+                break;
+              }
+            }
+            if (i > -1 && noJoin) {
+              return;
+            }
+            styles[prefix + suffix] = i === -1 ? box[0] : box.join(' ');
+            delete styles[prefix + '-top' + suffix];
+            delete styles[prefix + '-right' + suffix];
+            delete styles[prefix + '-bottom' + suffix];
+            delete styles[prefix + '-left' + suffix];
+          };
+          const canCompress = key => {
+            let value = styles[key], i;
+            if (!value) {
+              return;
+            }
+            value = value.split(' ');
+            i = value.length;
+            while (i--) {
+              if (value[i] !== value[0]) {
+                return false;
+              }
+            }
+            styles[key] = value[0];
+            return true;
+          };
+          const compress2 = (target, a, b, c) => {
+            if (!canCompress(a)) {
+              return;
+            }
+            if (!canCompress(b)) {
+              return;
+            }
+            if (!canCompress(c)) {
+              return;
+            }
+            styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c];
+            delete styles[a];
+            delete styles[b];
+            delete styles[c];
+          };
+          const encode = str => {
+            isEncoded = true;
+            return encodingLookup[str];
+          };
+          const decode = (str, keepSlashes) => {
+            if (isEncoded) {
+              str = str.replace(/\uFEFF[0-9]/g, str => {
+                return encodingLookup[str];
+              });
+            }
+            if (!keepSlashes) {
+              str = str.replace(/\\([\'\";:])/g, '$1');
+            }
+            return str;
+          };
+          const decodeSingleHexSequence = escSeq => {
+            return String.fromCharCode(parseInt(escSeq.slice(1), 16));
+          };
+          const decodeHexSequences = value => {
+            return value.replace(/\\[0-9a-f]+/gi, decodeSingleHexSequence);
+          };
+          const processUrl = (match, url, url2, url3, str, str2) => {
+            str = str || str2;
+            if (str) {
+              str = decode(str);
+              return `'` + str.replace(/\'/g, `\\'`) + `'`;
+            }
+            url = decode(url || url2 || url3);
+            if (!settings.allow_script_urls) {
+              const scriptUrl = url.replace(/[\s\r\n]+/g, '');
+              if (/(java|vb)script:/i.test(scriptUrl)) {
+                return '';
+              }
+              if (!settings.allow_svg_data_urls && /^data:image\/svg/i.test(scriptUrl)) {
+                return '';
+              }
+            }
+            if (urlConverter) {
+              url = urlConverter.call(urlConverterScope, url, 'style');
+            }
+            return `url('` + url.replace(/\'/g, `\\'`) + `')`;
+          };
+          if (css) {
+            css = css.replace(/[\u0000-\u001F]/g, '');
+            css = css.replace(/\\[\"\';:\uFEFF]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, str => {
+              return str.replace(/[;:]/g, encode);
+            });
+            while (matches = styleRegExp.exec(css)) {
+              styleRegExp.lastIndex = matches.index + matches[0].length;
+              name = matches[1].replace(trimRightRegExp, '').toLowerCase();
+              value = matches[2].replace(trimRightRegExp, '');
+              if (name && value) {
+                name = decodeHexSequences(name);
+                value = decodeHexSequences(value);
+                if (name.indexOf(invisibleChar) !== -1 || name.indexOf('"') !== -1) {
+                  continue;
+                }
+                if (!settings.allow_script_urls && (name === 'behavior' || /expression\s*\(|\/\*|\*\//.test(value))) {
+                  continue;
+                }
+                if (name === 'font-weight' && value === '700') {
+                  value = 'bold';
+                } else if (name === 'color' || name === 'background-color') {
+                  value = value.toLowerCase();
+                }
+                value = value.replace(urlOrStrRegExp, processUrl);
+                styles[name] = isEncoded ? decode(value, true) : value;
+              }
+            }
+            compress('border', '', true);
+            compress('border', '-width');
+            compress('border', '-color');
+            compress('border', '-style');
+            compress('padding', '');
+            compress('margin', '');
+            compress2('border', 'border-width', 'border-style', 'border-color');
+            if (styles.border === 'medium none') {
+              delete styles.border;
+            }
+            if (styles['border-image'] === 'none') {
+              delete styles['border-image'];
+            }
+          }
+          return styles;
+        },
+        serialize: (styles, elementName) => {
+          let css = '';
+          const serializeStyles = name => {
+            let value;
+            const styleList = validStyles[name];
+            if (styleList) {
+              for (let i = 0, l = styleList.length; i < l; i++) {
+                name = styleList[i];
+                value = styles[name];
+                if (value) {
+                  css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';
+                }
+              }
+            }
+          };
+          const isValid = (name, elementName) => {
+            let styleMap = invalidStyles['*'];
+            if (styleMap && styleMap[name]) {
+              return false;
+            }
+            styleMap = invalidStyles[elementName];
+            return !(styleMap && styleMap[name]);
+          };
+          if (elementName && validStyles) {
+            serializeStyles('*');
+            serializeStyles(elementName);
+          } else {
+            each$f(styles, (value, name) => {
+              if (value && (!invalidStyles || isValid(name, elementName))) {
+                css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';
+              }
+            });
+          }
+          return css;
+        }
+      };
+      return self;
+    };
+
+    const deprecated = {
+      keyLocation: true,
+      layerX: true,
+      layerY: true,
+      returnValue: true,
+      webkitMovementX: true,
+      webkitMovementY: true,
+      keyIdentifier: true,
+      mozPressure: true
+    };
+    const isNativeEvent = event => event instanceof Event || isFunction(event.initEvent);
+    const hasIsDefaultPrevented = event => event.isDefaultPrevented === always || event.isDefaultPrevented === never;
+    const needsNormalizing = event => isNullable(event.preventDefault) || isNativeEvent(event);
+    const clone$3 = (originalEvent, data) => {
+      const event = data !== null && data !== void 0 ? data : {};
+      for (const name in originalEvent) {
+        if (!has$2(deprecated, name)) {
+          event[name] = originalEvent[name];
+        }
+      }
+      if (isNonNullable(event.composedPath)) {
+        event.composedPath = () => originalEvent.composedPath();
+      }
+      return event;
+    };
+    const normalize$3 = (type, originalEvent, fallbackTarget, data) => {
+      var _a;
+      const event = clone$3(originalEvent, data);
+      event.type = type;
+      if (isNullable(event.target)) {
+        event.target = (_a = event.srcElement) !== null && _a !== void 0 ? _a : fallbackTarget;
+      }
+      if (needsNormalizing(originalEvent)) {
+        event.preventDefault = () => {
+          event.defaultPrevented = true;
+          event.isDefaultPrevented = always;
+          if (isFunction(originalEvent.preventDefault)) {
+            originalEvent.preventDefault();
+          }
+        };
+        event.stopPropagation = () => {
+          event.cancelBubble = true;
+          event.isPropagationStopped = always;
+          if (isFunction(originalEvent.stopPropagation)) {
+            originalEvent.stopPropagation();
+          }
+        };
+        event.stopImmediatePropagation = () => {
+          event.isImmediatePropagationStopped = always;
+          event.stopPropagation();
+        };
+        if (!hasIsDefaultPrevented(event)) {
+          event.isDefaultPrevented = event.defaultPrevented === true ? always : never;
+          event.isPropagationStopped = event.cancelBubble === true ? always : never;
+          event.isImmediatePropagationStopped = never;
+        }
+      }
+      return event;
+    };
+
+    const eventExpandoPrefix = 'mce-data-';
+    const mouseEventRe = /^(?:mouse|contextmenu)|click/;
+    const addEvent = (target, name, callback, capture) => {
+      if (target.addEventListener) {
+        target.addEventListener(name, callback, capture || false);
+      } else if (target.attachEvent) {
+        target.attachEvent('on' + name, callback);
+      }
+    };
+    const removeEvent = (target, name, callback, capture) => {
+      if (target.removeEventListener) {
+        target.removeEventListener(name, callback, capture || false);
+      } else if (target.detachEvent) {
+        target.detachEvent('on' + name, callback);
+      }
+    };
+    const isMouseEvent = event => isNonNullable(event) && mouseEventRe.test(event.type);
+    const fix = (originalEvent, data) => {
+      const event = normalize$3(originalEvent.type, originalEvent, document, data);
+      if (isMouseEvent(originalEvent) && isUndefined(originalEvent.pageX) && !isUndefined(originalEvent.clientX)) {
+        const eventDoc = event.target.ownerDocument || document;
+        const doc = eventDoc.documentElement;
+        const body = eventDoc.body;
+        const mouseEvent = event;
+        mouseEvent.pageX = originalEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+        mouseEvent.pageY = originalEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
+      }
+      return event;
+    };
+    const bindOnReady = (win, callback, eventUtils) => {
+      const doc = win.document, event = { type: 'ready' };
+      if (eventUtils.domLoaded) {
+        callback(event);
+        return;
+      }
+      const isDocReady = () => {
+        return doc.readyState === 'complete' || doc.readyState === 'interactive' && doc.body;
+      };
+      const readyHandler = () => {
+        removeEvent(win, 'DOMContentLoaded', readyHandler);
+        removeEvent(win, 'load', readyHandler);
+        if (!eventUtils.domLoaded) {
+          eventUtils.domLoaded = true;
+          callback(event);
+        }
+        win = null;
+      };
+      if (isDocReady()) {
+        readyHandler();
+      } else {
+        addEvent(win, 'DOMContentLoaded', readyHandler);
+      }
+      if (!eventUtils.domLoaded) {
+        addEvent(win, 'load', readyHandler);
+      }
+    };
+    class EventUtils {
+      constructor() {
+        this.domLoaded = false;
+        this.events = {};
+        this.count = 1;
+        this.expando = eventExpandoPrefix + (+new Date()).toString(32);
+        this.hasMouseEnterLeave = 'onmouseenter' in document.documentElement;
+        this.hasFocusIn = 'onfocusin' in document.documentElement;
+        this.count = 1;
+      }
+      bind(target, names, callback, scope) {
+        const self = this;
+        let id, callbackList, i, name, fakeName, nativeHandler, capture;
+        const win = window;
+        const defaultNativeHandler = evt => {
+          self.executeHandlers(fix(evt || win.event), id);
+        };
+        if (!target || target.nodeType === 3 || target.nodeType === 8) {
+          return;
+        }
+        if (!target[self.expando]) {
+          id = self.count++;
+          target[self.expando] = id;
+          self.events[id] = {};
+        } else {
+          id = target[self.expando];
+        }
+        scope = scope || target;
+        const namesList = names.split(' ');
+        i = namesList.length;
+        while (i--) {
+          name = namesList[i];
+          nativeHandler = defaultNativeHandler;
+          fakeName = capture = false;
+          if (name === 'DOMContentLoaded') {
+            name = 'ready';
+          }
+          if (self.domLoaded && name === 'ready' && target.readyState === 'complete') {
+            callback.call(scope, fix({ type: name }));
+            continue;
+          }
+          if (!self.hasMouseEnterLeave) {
+            fakeName = self.mouseEnterLeave[name];
+            if (fakeName) {
+              nativeHandler = evt => {
+                const current = evt.currentTarget;
+                let related = evt.relatedTarget;
+                if (related && current.contains) {
+                  related = current.contains(related);
+                } else {
+                  while (related && related !== current) {
+                    related = related.parentNode;
+                  }
+                }
+                if (!related) {
+                  evt = fix(evt || win.event);
+                  evt.type = evt.type === 'mouseout' ? 'mouseleave' : 'mouseenter';
+                  evt.target = current;
+                  self.executeHandlers(evt, id);
+                }
+              };
+            }
+          }
+          if (!self.hasFocusIn && (name === 'focusin' || name === 'focusout')) {
+            capture = true;
+            fakeName = name === 'focusin' ? 'focus' : 'blur';
+            nativeHandler = evt => {
+              evt = fix(evt || win.event);
+              evt.type = evt.type === 'focus' ? 'focusin' : 'focusout';
+              self.executeHandlers(evt, id);
+            };
+          }
+          callbackList = self.events[id][name];
+          if (!callbackList) {
+            self.events[id][name] = callbackList = [{
+                func: callback,
+                scope
+              }];
+            callbackList.fakeName = fakeName;
+            callbackList.capture = capture;
+            callbackList.nativeHandler = nativeHandler;
+            if (name === 'ready') {
+              bindOnReady(target, nativeHandler, self);
+            } else {
+              addEvent(target, fakeName || name, nativeHandler, capture);
+            }
+          } else {
+            if (name === 'ready' && self.domLoaded) {
+              callback(fix({ type: name }));
+            } else {
+              callbackList.push({
+                func: callback,
+                scope
+              });
+            }
+          }
+        }
+        target = callbackList = null;
+        return callback;
+      }
+      unbind(target, names, callback) {
+        let callbackList, i, ci, name, eventMap;
+        if (!target || target.nodeType === 3 || target.nodeType === 8) {
+          return this;
+        }
+        const id = target[this.expando];
+        if (id) {
+          eventMap = this.events[id];
+          if (names) {
+            const namesList = names.split(' ');
+            i = namesList.length;
+            while (i--) {
+              name = namesList[i];
+              callbackList = eventMap[name];
+              if (callbackList) {
+                if (callback) {
+                  ci = callbackList.length;
+                  while (ci--) {
+                    if (callbackList[ci].func === callback) {
+                      const nativeHandler = callbackList.nativeHandler;
+                      const fakeName = callbackList.fakeName, capture = callbackList.capture;
+                      callbackList = callbackList.slice(0, ci).concat(callbackList.slice(ci + 1));
+                      callbackList.nativeHandler = nativeHandler;
+                      callbackList.fakeName = fakeName;
+                      callbackList.capture = capture;
+                      eventMap[name] = callbackList;
+                    }
+                  }
+                }
+                if (!callback || callbackList.length === 0) {
+                  delete eventMap[name];
+                  removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);
+                }
+              }
+            }
+          } else {
+            each$f(eventMap, (callbackList, name) => {
+              removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);
+            });
+            eventMap = {};
+          }
+          for (name in eventMap) {
+            if (has$2(eventMap, name)) {
+              return this;
+            }
+          }
+          delete this.events[id];
+          try {
+            delete target[this.expando];
+          } catch (ex) {
+            target[this.expando] = null;
+          }
+        }
+        return this;
+      }
+      fire(target, name, args) {
+        return this.dispatch(target, name, args);
+      }
+      dispatch(target, name, args) {
+        let id;
+        if (!target || target.nodeType === 3 || target.nodeType === 8) {
+          return this;
+        }
+        const event = fix({
+          type: name,
+          target
+        }, args);
+        do {
+          id = target[this.expando];
+          if (id) {
+            this.executeHandlers(event, id);
+          }
+          target = target.parentNode || target.ownerDocument || target.defaultView || target.parentWindow;
+        } while (target && !event.isPropagationStopped());
+        return this;
+      }
+      clean(target) {
+        let i, children;
+        if (!target || target.nodeType === 3 || target.nodeType === 8) {
+          return this;
+        }
+        if (target[this.expando]) {
+          this.unbind(target);
+        }
+        if (!target.getElementsByTagName) {
+          target = target.document;
+        }
+        if (target && target.getElementsByTagName) {
+          this.unbind(target);
+          children = target.getElementsByTagName('*');
+          i = children.length;
+          while (i--) {
+            target = children[i];
+            if (target[this.expando]) {
+              this.unbind(target);
+            }
+          }
+        }
+        return this;
+      }
+      destroy() {
+        this.events = {};
+      }
+      cancel(e) {
+        if (e) {
+          e.preventDefault();
+          e.stopImmediatePropagation();
+        }
+        return false;
+      }
+      executeHandlers(evt, id) {
+        const container = this.events[id];
+        const callbackList = container && container[evt.type];
+        if (callbackList) {
+          for (let i = 0, l = callbackList.length; i < l; i++) {
+            const callback = callbackList[i];
+            if (callback && callback.func.call(callback.scope, evt) === false) {
+              evt.preventDefault();
+            }
+            if (evt.isImmediatePropagationStopped()) {
+              return;
+            }
+          }
+        }
+      }
+    }
+    EventUtils.Event = new EventUtils();
+
+    const each$c = Tools.each;
+    const grep = Tools.grep;
+    const internalStyleName = 'data-mce-style';
+    const legacySetAttribute = (elm, name, value) => {
+      if (isNullable(value) || value === '') {
+        remove$a(elm, name);
+      } else {
+        set$2(elm, name, value);
+      }
+    };
+    const setupAttrHooks = (styles, settings, getContext) => {
+      const keepValues = settings.keep_values;
+      const keepUrlHook = {
+        set: (elm, value, name) => {
+          const sugarElm = SugarElement.fromDom(elm);
+          if (isFunction(settings.url_converter) && isNonNullable(value)) {
+            value = settings.url_converter.call(settings.url_converter_scope || getContext(), value, name, elm[0]);
+          }
+          const internalName = 'data-mce-' + name;
+          legacySetAttribute(sugarElm, internalName, value);
+          legacySetAttribute(sugarElm, name, value);
+        },
+        get: (elm, name) => {
+          const sugarElm = SugarElement.fromDom(elm);
+          return get$9(sugarElm, 'data-mce-' + name) || get$9(sugarElm, name);
+        }
+      };
+      const attrHooks = {
+        style: {
+          set: (elm, value) => {
+            const sugarElm = SugarElement.fromDom(elm);
+            if (isObject(value)) {
+              setAll(sugarElm, value);
+              return;
+            }
+            if (keepValues) {
+              legacySetAttribute(sugarElm, internalStyleName, value);
+            }
+            remove$a(sugarElm, 'style');
+            if (isString(value)) {
+              setAll(sugarElm, styles.parse(value));
+            }
+          },
+          get: elm => {
+            const sugarElm = SugarElement.fromDom(elm);
+            const value = get$9(sugarElm, internalStyleName) || get$9(sugarElm, 'style');
+            return styles.serialize(styles.parse(value), name(sugarElm));
+          }
+        }
+      };
+      if (keepValues) {
+        attrHooks.href = attrHooks.src = keepUrlHook;
+      }
+      return attrHooks;
+    };
+    const updateInternalStyleAttr = (styles, elm) => {
+      const rawValue = get$9(elm, 'style');
+      const value = styles.serialize(styles.parse(rawValue), name(elm));
+      legacySetAttribute(elm, internalStyleName, value);
+    };
+    const findNodeIndex = (node, normalized) => {
+      let idx = 0, lastNodeType, nodeType;
+      if (node) {
+        for (lastNodeType = node.nodeType, node = node.previousSibling; node; node = node.previousSibling) {
+          nodeType = node.nodeType;
+          if (normalized && nodeType === 3) {
+            if (nodeType === lastNodeType || !node.nodeValue.length) {
+              continue;
+            }
+          }
+          idx++;
+          lastNodeType = nodeType;
+        }
+      }
+      return idx;
+    };
+    const numericalCssMap = Tools.makeMap('fill-opacity font-weight line-height opacity orphans widows z-index zoom', ' ');
+    const camelCaseToHyphens = name => name.replace(/[A-Z]/g, v => '-' + v.toLowerCase());
+    const DOMUtils = (doc, settings = {}) => {
+      const addedStyles = {};
+      const win = window;
+      const files = {};
+      let counter = 0;
+      const stdMode = true;
+      const boxModel = true;
+      const styleSheetLoader = instance.forElement(SugarElement.fromDom(doc), {
+        contentCssCors: settings.contentCssCors,
+        referrerPolicy: settings.referrerPolicy
+      });
+      const boundEvents = [];
+      const schema = settings.schema ? settings.schema : Schema({});
+      const styles = Styles({
+        url_converter: settings.url_converter,
+        url_converter_scope: settings.url_converter_scope
+      }, settings.schema);
+      const events = settings.ownEvents ? new EventUtils() : EventUtils.Event;
+      const blockElementsMap = schema.getBlockElements();
+      const isBlock = node => {
+        if (isString(node)) {
+          return has$2(blockElementsMap, node);
+        } else {
+          return isElement$6(node) && has$2(blockElementsMap, node.nodeName);
+        }
+      };
+      const get = elm => elm && doc && isString(elm) ? doc.getElementById(elm) : elm;
+      const _get = elm => {
+        const value = get(elm);
+        return isNonNullable(value) ? SugarElement.fromDom(value) : null;
+      };
+      const getAttrib = (elm, name, defaultVal) => {
+        let value;
+        const $elm = _get(elm);
+        if (isNonNullable($elm) && isElement$7($elm)) {
+          const hook = attrHooks[name];
+          if (hook && hook.get) {
+            value = hook.get($elm.dom, name);
+          } else {
+            value = get$9($elm, name);
+          }
+        }
+        return isNonNullable(value) ? value : defaultVal !== null && defaultVal !== void 0 ? defaultVal : '';
+      };
+      const getAttribs = elm => {
+        const node = get(elm);
+        return isNullable(node) ? [] : node.attributes;
+      };
+      const setAttrib = (elm, name, value) => {
+        run(elm, e => {
+          if (isElement$6(e)) {
+            const $elm = SugarElement.fromDom(e);
+            if (value === '') {
+              value = null;
+            }
+            const originalValue = get$9($elm, name);
+            const hook = attrHooks[name];
+            if (hook && hook.set) {
+              hook.set($elm.dom, value, name);
+            } else {
+              legacySetAttribute($elm, name, value);
+            }
+            if (originalValue !== value && settings.onSetAttrib) {
+              settings.onSetAttrib({
+                attrElm: $elm,
+                attrName: name,
+                attrValue: value
+              });
+            }
+          }
+        });
+      };
+      const clone = (node, deep) => {
+        return node.cloneNode(deep);
+      };
+      const getRoot = () => settings.root_element || doc.body;
+      const getViewPort = argWin => {
+        const vp = getBounds(argWin);
+        return {
+          x: vp.x,
+          y: vp.y,
+          w: vp.width,
+          h: vp.height
+        };
+      };
+      const getPos$1 = (elm, rootElm) => getPos(doc.body, get(elm), rootElm);
+      const setStyle = (elm, name, value) => {
+        const convertStyleToString = (cssValue, cssName) => {
+          if (isString(cssValue)) {
+            return cssValue;
+          } else if (isNumber(cssValue)) {
+            return has$2(numericalCssMap, cssName) ? cssValue + '' : cssValue + 'px';
+          } else {
+            return map$2(cssValue, convertStyleToString);
+          }
+        };
+        const applyStyle = ($elm, cssName, cssValue) => {
+          const normalizedName = camelCaseToHyphens(cssName);
+          if (isNullable(cssValue) || cssValue === '') {
+            remove$6($elm, normalizedName);
+          } else {
+            set$1($elm, normalizedName, convertStyleToString(cssValue, normalizedName));
+          }
+        };
+        run(elm, e => {
+          const $elm = SugarElement.fromDom(e);
+          if (isString(name)) {
+            applyStyle($elm, name, value);
+          } else {
+            each$f(name, (v, n) => {
+              applyStyle($elm, n, v);
+            });
+          }
+          if (settings.update_styles) {
+            updateInternalStyleAttr(styles, $elm);
+          }
+        });
+      };
+      const setStyles = (elm, stylesArg) => {
+        setStyle(elm, stylesArg);
+      };
+      const getStyle = (elm, name, computed) => {
+        const $elm = get(elm);
+        if (isNullable($elm) || !isElement$6($elm)) {
+          return undefined;
+        }
+        if (computed) {
+          return get$7(SugarElement.fromDom($elm), camelCaseToHyphens(name));
+        } else {
+          name = name.replace(/-(\D)/g, (a, b) => b.toUpperCase());
+          if (name === 'float') {
+            name = 'cssFloat';
+          }
+          return $elm.style ? $elm.style[name] : undefined;
+        }
+      };
+      const getSize = elm => {
+        let w, h;
+        const $elm = get(elm);
+        w = getStyle($elm, 'width');
+        h = getStyle($elm, 'height');
+        if (w.indexOf('px') === -1) {
+          w = 0;
+        }
+        if (h.indexOf('px') === -1) {
+          h = 0;
+        }
+        return {
+          w: parseInt(w, 10) || $elm.offsetWidth || $elm.clientWidth,
+          h: parseInt(h, 10) || $elm.offsetHeight || $elm.clientHeight
+        };
+      };
+      const getRect = elm => {
+        const $elm = get(elm);
+        const pos = getPos$1($elm);
+        const size = getSize($elm);
+        return {
+          x: pos.x,
+          y: pos.y,
+          w: size.w,
+          h: size.h
+        };
+      };
+      const is = (elm, selector) => {
+        if (!elm) {
+          return false;
+        }
+        const elms = isArray$1(elm) ? elm : [elm];
+        return exists(elms, e => {
+          return is$1(SugarElement.fromDom(e), selector);
+        });
+      };
+      const getParents = (elm, selector, root, collect) => {
+        const result = [];
+        let selectorVal;
+        let node = get(elm);
+        collect = collect === undefined;
+        root = root || (getRoot().nodeName !== 'BODY' ? getRoot().parentNode : null);
+        if (isString(selector)) {
+          selectorVal = selector;
+          if (selector === '*') {
+            selector = isElement$6;
+          } else {
+            selector = node => is(node, selectorVal);
+          }
+        }
+        while (node) {
+          if (node === root || isNullable(node.nodeType) || isDocument$1(node) || isDocumentFragment(node)) {
+            break;
+          }
+          if (!selector || selector(node)) {
+            if (collect) {
+              result.push(node);
+            } else {
+              return [node];
+            }
+          }
+          node = node.parentNode;
+        }
+        return collect ? result : null;
+      };
+      const getParent = (node, selector, root) => {
+        const parents = getParents(node, selector, root, false);
+        return parents && parents.length > 0 ? parents[0] : null;
+      };
+      const _findSib = (node, selector, name) => {
+        let func = selector;
+        if (node) {
+          if (isString(selector)) {
+            func = node => {
+              return is(node, selector);
+            };
+          }
+          for (node = node[name]; node; node = node[name]) {
+            if (isFunction(func) && func(node)) {
+              return node;
+            }
+          }
+        }
+        return null;
+      };
+      const getNext = (node, selector) => _findSib(node, selector, 'nextSibling');
+      const getPrev = (node, selector) => _findSib(node, selector, 'previousSibling');
+      const select = (selector, scope) => {
+        var _a, _b;
+        const elm = (_b = (_a = get(scope)) !== null && _a !== void 0 ? _a : settings.root_element) !== null && _b !== void 0 ? _b : doc;
+        return from(elm.querySelectorAll(selector));
+      };
+      const run = function (elm, func, scope) {
+        const context = scope !== null && scope !== void 0 ? scope : this;
+        const node = isString(elm) ? get(elm) : elm;
+        if (!node) {
+          return false;
+        }
+        if (isArray$1(node) && (node.length || node.length === 0)) {
+          const result = [];
+          each$c(node, (elm, i) => {
+            if (elm) {
+              result.push(func.call(context, isString(elm) ? get(elm) : elm, i));
+            }
+          });
+          return result;
+        } else {
+          return func.call(context, node);
+        }
+      };
+      const setAttribs = (elm, attrs) => {
+        run(elm, $elm => {
+          each$f(attrs, (value, name) => {
+            setAttrib($elm, name, value);
+          });
+        });
+      };
+      const setHTML = (elm, html) => {
+        run(elm, e => {
+          const $elm = SugarElement.fromDom(e);
+          set($elm, html);
+        });
+      };
+      const add = (parentElm, name, attrs, html, create) => run(parentElm, parentElm => {
+        const newElm = isString(name) ? doc.createElement(name) : name;
+        if (isNonNullable(attrs)) {
+          setAttribs(newElm, attrs);
+        }
+        if (html) {
+          if (!isString(html) && html.nodeType) {
+            newElm.appendChild(html);
+          } else if (isString(html)) {
+            setHTML(newElm, html);
+          }
+        }
+        return !create ? parentElm.appendChild(newElm) : newElm;
+      });
+      const create = (name, attrs, html) => add(doc.createElement(name), name, attrs, html, true);
+      const decode = Entities.decode;
+      const encode = Entities.encodeAllRaw;
+      const createHTML = (name, attrs, html = '') => {
+        let outHtml = '', key;
+        outHtml += '<' + name;
+        for (key in attrs) {
+          if (hasNonNullableKey(attrs, key)) {
+            outHtml += ' ' + key + '="' + encode(attrs[key]) + '"';
+          }
+        }
+        if (isEmpty$3(html) && has$2(schema.getVoidElements(), name)) {
+          return outHtml + ' />';
+        } else {
+          return outHtml + '>' + html + '</' + name + '>';
+        }
+      };
+      const createFragment = html => {
+        let node;
+        const container = doc.createElement('div');
+        const frag = doc.createDocumentFragment();
+        frag.appendChild(container);
+        if (html) {
+          container.innerHTML = html;
+        }
+        while (node = container.firstChild) {
+          frag.appendChild(node);
+        }
+        frag.removeChild(container);
+        return frag;
+      };
+      const remove = (node, keepChildren) => {
+        return run(node, n => {
+          const $node = SugarElement.fromDom(n);
+          if (keepChildren) {
+            each$g(children($node), child => {
+              if (isText$9(child) && child.dom.length === 0) {
+                remove$5(child);
+              } else {
+                before$3($node, child);
+              }
+            });
+          }
+          remove$5($node);
+          return $node.dom;
+        });
+      };
+      const removeAllAttribs = e => run(e, e => {
+        const attrs = e.attributes;
+        for (let i = attrs.length - 1; i >= 0; i--) {
+          e.removeAttributeNode(attrs.item(i));
+        }
+      });
+      const parseStyle = cssText => styles.parse(cssText);
+      const serializeStyle = (stylesArg, name) => styles.serialize(stylesArg, name);
+      const addStyle = cssText => {
+        let head, styleElm;
+        if (self !== DOMUtils.DOM && doc === document) {
+          if (addedStyles[cssText]) {
+            return;
+          }
+          addedStyles[cssText] = true;
+        }
+        styleElm = doc.getElementById('mceDefaultStyles');
+        if (!styleElm) {
+          styleElm = doc.createElement('style');
+          styleElm.id = 'mceDefaultStyles';
+          styleElm.type = 'text/css';
+          head = doc.getElementsByTagName('head')[0];
+          if (head.firstChild) {
+            head.insertBefore(styleElm, head.firstChild);
+          } else {
+            head.appendChild(styleElm);
+          }
+        }
+        if (styleElm.styleSheet) {
+          styleElm.styleSheet.cssText += cssText;
+        } else {
+          styleElm.appendChild(doc.createTextNode(cssText));
+        }
+      };
+      const loadCSS = urls => {
+        if (!urls) {
+          urls = '';
+        }
+        each$g(urls.split(','), url => {
+          files[url] = true;
+          styleSheetLoader.load(url).catch(noop);
+        });
+      };
+      const toggleClass = (elm, cls, state) => {
+        run(elm, e => {
+          if (isElement$6(e)) {
+            const $elm = SugarElement.fromDom(e);
+            const classes = cls.split(' ');
+            each$g(classes, c => {
+              if (isNonNullable(state)) {
+                const fn = state ? add$2 : remove$7;
+                fn($elm, c);
+              } else {
+                toggle$1($elm, c);
+              }
+            });
+          }
+        });
+      };
+      const addClass = (elm, cls) => {
+        toggleClass(elm, cls, true);
+      };
+      const removeClass = (elm, cls) => {
+        toggleClass(elm, cls, false);
+      };
+      const hasClass = (elm, cls) => {
+        const $elm = _get(elm);
+        const classes = cls.split(' ');
+        return forall(classes, c => has($elm, c));
+      };
+      const show = elm => {
+        run(elm, e => remove$6(SugarElement.fromDom(e), 'display'));
+      };
+      const hide = elm => {
+        run(elm, e => set$1(SugarElement.fromDom(e), 'display', 'none'));
+      };
+      const isHidden = elm => {
+        const $elm = _get(elm);
+        return is$2(getRaw$1($elm, 'display'), 'none');
+      };
+      const uniqueId = prefix => (!prefix ? 'mce_' : prefix) + counter++;
+      const getOuterHTML = elm => {
+        const $elm = _get(elm);
+        return isElement$6($elm.dom) ? $elm.dom.outerHTML : getOuter($elm);
+      };
+      const setOuterHTML = (elm, html) => {
+        run(elm, $elm => {
+          if (isElement$6($elm)) {
+            $elm.outerHTML = html;
+          }
+        });
+      };
+      const insertAfter = (node, reference) => {
+        const referenceNode = get(reference);
+        return run(node, node => {
+          const parent = referenceNode.parentNode;
+          const nextSibling = referenceNode.nextSibling;
+          if (nextSibling) {
+            parent.insertBefore(node, nextSibling);
+          } else {
+            parent.appendChild(node);
+          }
+          return node;
+        });
+      };
+      const replace = (newElm, oldElm, keepChildren) => run(oldElm, oldElm => {
+        if (isArray$1(oldElm)) {
+          newElm = newElm.cloneNode(true);
+        }
+        if (keepChildren) {
+          each$c(grep(oldElm.childNodes), node => {
+            newElm.appendChild(node);
+          });
+        }
+        return oldElm.parentNode.replaceChild(newElm, oldElm);
+      });
+      const rename = (elm, name) => {
+        let newElm;
+        if (elm.nodeName !== name.toUpperCase()) {
+          newElm = create(name);
+          each$c(getAttribs(elm), attrNode => {
+            setAttrib(newElm, attrNode.nodeName, getAttrib(elm, attrNode.nodeName));
+          });
+          replace(newElm, elm, true);
+        }
+        return newElm || elm;
+      };
+      const findCommonAncestor = (a, b) => {
+        let ps = a, pe;
+        while (ps) {
+          pe = b;
+          while (pe && ps !== pe) {
+            pe = pe.parentNode;
+          }
+          if (ps === pe) {
+            break;
+          }
+          ps = ps.parentNode;
+        }
+        if (!ps && a.ownerDocument) {
+          return a.ownerDocument.documentElement;
+        }
+        return ps;
+      };
+      const isNonEmptyElement = node => {
+        if (isElement$6(node)) {
+          const isNamedAnchor = node.nodeName.toLowerCase() === 'a' && !getAttrib(node, 'href') && getAttrib(node, 'id');
+          if (getAttrib(node, 'name') || getAttrib(node, 'data-mce-bookmark') || isNamedAnchor) {
+            return true;
+          }
+        }
+        return false;
+      };
+      const isEmpty = (node, elements) => {
+        let type, name, brCount = 0;
+        if (isNonEmptyElement(node)) {
+          return false;
+        }
+        node = node.firstChild;
+        if (node) {
+          const walker = new DomTreeWalker(node, node.parentNode);
+          const whitespace = schema ? schema.getWhitespaceElements() : {};
+          elements = elements || (schema ? schema.getNonEmptyElements() : null);
+          do {
+            type = node.nodeType;
+            if (isElement$6(node)) {
+              const bogusVal = node.getAttribute('data-mce-bogus');
+              if (bogusVal) {
+                node = walker.next(bogusVal === 'all');
+                continue;
+              }
+              name = node.nodeName.toLowerCase();
+              if (elements && elements[name]) {
+                if (name === 'br') {
+                  brCount++;
+                  node = walker.next();
+                  continue;
+                }
+                return false;
+              }
+              if (isNonEmptyElement(node)) {
+                return false;
+              }
+            }
+            if (type === 8) {
+              return false;
+            }
+            if (type === 3 && !isWhitespaceText(node.nodeValue)) {
+              return false;
+            }
+            if (type === 3 && node.parentNode && whitespace[node.parentNode.nodeName] && isWhitespaceText(node.nodeValue)) {
+              return false;
+            }
+            node = walker.next();
+          } while (node);
+        }
+        return brCount <= 1;
+      };
+      const createRng = () => doc.createRange();
+      const split = (parentElm, splitElm, replacementElm) => {
+        let range = createRng();
+        let beforeFragment;
+        let afterFragment;
+        let parentNode;
+        if (parentElm && splitElm) {
+          range.setStart(parentElm.parentNode, findNodeIndex(parentElm));
+          range.setEnd(splitElm.parentNode, findNodeIndex(splitElm));
+          beforeFragment = range.extractContents();
+          range = createRng();
+          range.setStart(splitElm.parentNode, findNodeIndex(splitElm) + 1);
+          range.setEnd(parentElm.parentNode, findNodeIndex(parentElm) + 1);
+          afterFragment = range.extractContents();
+          parentNode = parentElm.parentNode;
+          parentNode.insertBefore(trimNode(self, beforeFragment), parentElm);
+          if (replacementElm) {
+            parentNode.insertBefore(replacementElm, parentElm);
+          } else {
+            parentNode.insertBefore(splitElm, parentElm);
+          }
+          parentNode.insertBefore(trimNode(self, afterFragment), parentElm);
+          remove(parentElm);
+          return replacementElm || splitElm;
+        }
+      };
+      const bind = (target, name, func, scope) => {
+        if (isArray$1(target)) {
+          let i = target.length;
+          const rv = [];
+          while (i--) {
+            rv[i] = bind(target[i], name, func, scope);
+          }
+          return rv;
+        } else {
+          if (settings.collect && (target === doc || target === win)) {
+            boundEvents.push([
+              target,
+              name,
+              func,
+              scope
+            ]);
+          }
+          return events.bind(target, name, func, scope || self);
+        }
+      };
+      const unbind = (target, name, func) => {
+        if (isArray$1(target)) {
+          let i = target.length;
+          const rv = [];
+          while (i--) {
+            rv[i] = unbind(target[i], name, func);
+          }
+          return rv;
+        } else {
+          if (boundEvents.length > 0 && (target === doc || target === win)) {
+            let i = boundEvents.length;
+            while (i--) {
+              const item = boundEvents[i];
+              if (target === item[0] && (!name || name === item[1]) && (!func || func === item[2])) {
+                events.unbind(item[0], item[1], item[2]);
+              }
+            }
+          }
+          return events.unbind(target, name, func);
+        }
+      };
+      const dispatch = (target, name, evt) => events.dispatch(target, name, evt);
+      const fire = (target, name, evt) => events.dispatch(target, name, evt);
+      const getContentEditable = node => {
+        if (node && isElement$6(node)) {
+          const contentEditable = node.getAttribute('data-mce-contenteditable');
+          if (contentEditable && contentEditable !== 'inherit') {
+            return contentEditable;
+          }
+          return node.contentEditable !== 'inherit' ? node.contentEditable : null;
+        } else {
+          return null;
+        }
+      };
+      const getContentEditableParent = node => {
+        const root = getRoot();
+        let state = null;
+        for (; node && node !== root; node = node.parentNode) {
+          state = getContentEditable(node);
+          if (state !== null) {
+            break;
+          }
+        }
+        return state;
+      };
+      const destroy = () => {
+        if (boundEvents.length > 0) {
+          let i = boundEvents.length;
+          while (i--) {
+            const item = boundEvents[i];
+            events.unbind(item[0], item[1], item[2]);
+          }
+        }
+        each$f(files, (_, url) => {
+          styleSheetLoader.unload(url);
+          delete files[url];
+        });
+      };
+      const isChildOf = (node, parent) => {
+        return node === parent || parent.contains(node);
+      };
+      const dumpRng = r => 'startContainer: ' + r.startContainer.nodeName + ', startOffset: ' + r.startOffset + ', endContainer: ' + r.endContainer.nodeName + ', endOffset: ' + r.endOffset;
+      const self = {
+        doc,
+        settings,
+        win,
+        files,
+        stdMode,
+        boxModel,
+        styleSheetLoader,
+        boundEvents,
+        styles,
+        schema,
+        events,
+        isBlock,
+        root: null,
+        clone,
+        getRoot,
+        getViewPort,
+        getRect,
+        getSize,
+        getParent,
+        getParents,
+        get,
+        getNext,
+        getPrev,
+        select,
+        is,
+        add,
+        create,
+        createHTML,
+        createFragment,
+        remove,
+        setStyle,
+        getStyle,
+        setStyles,
+        removeAllAttribs,
+        setAttrib,
+        setAttribs,
+        getAttrib,
+        getPos: getPos$1,
+        parseStyle,
+        serializeStyle,
+        addStyle,
+        loadCSS,
+        addClass,
+        removeClass,
+        hasClass,
+        toggleClass,
+        show,
+        hide,
+        isHidden,
+        uniqueId,
+        setHTML,
+        getOuterHTML,
+        setOuterHTML,
+        decode,
+        encode,
+        insertAfter,
+        replace,
+        rename,
+        findCommonAncestor,
+        run,
+        getAttribs,
+        isEmpty,
+        createRng,
+        nodeIndex: findNodeIndex,
+        split,
+        bind: bind,
+        unbind: unbind,
+        fire,
+        dispatch,
+        getContentEditable,
+        getContentEditableParent,
+        destroy,
+        isChildOf,
+        dumpRng
+      };
+      const attrHooks = setupAttrHooks(styles, settings, constant(self));
+      return self;
+    };
+    DOMUtils.DOM = DOMUtils(document);
+    DOMUtils.nodeIndex = findNodeIndex;
+
+    const DOM$b = DOMUtils.DOM;
+    const QUEUED = 0;
+    const LOADING = 1;
+    const LOADED = 2;
+    const FAILED = 3;
+    class ScriptLoader {
+      constructor(settings = {}) {
+        this.states = {};
+        this.queue = [];
+        this.scriptLoadedCallbacks = {};
+        this.queueLoadedCallbacks = [];
+        this.loading = false;
+        this.settings = settings;
+      }
+      _setReferrerPolicy(referrerPolicy) {
+        this.settings.referrerPolicy = referrerPolicy;
+      }
+      loadScript(url) {
+        return new Promise((resolve, reject) => {
+          const dom = DOM$b;
+          let elm;
+          const cleanup = () => {
+            dom.remove(id);
+            if (elm) {
+              elm.onerror = elm.onload = elm = null;
+            }
+          };
+          const done = () => {
+            cleanup();
+            resolve();
+          };
+          const error = () => {
+            cleanup();
+            reject('Failed to load script: ' + url);
+          };
+          const id = dom.uniqueId();
+          elm = document.createElement('script');
+          elm.id = id;
+          elm.type = 'text/javascript';
+          elm.src = Tools._addCacheSuffix(url);
+          if (this.settings.referrerPolicy) {
+            dom.setAttrib(elm, 'referrerpolicy', this.settings.referrerPolicy);
+          }
+          elm.onload = done;
+          elm.onerror = error;
+          (document.getElementsByTagName('head')[0] || document.body).appendChild(elm);
+        });
+      }
+      isDone(url) {
+        return this.states[url] === LOADED;
+      }
+      markDone(url) {
+        this.states[url] = LOADED;
+      }
+      add(url) {
+        const self = this;
+        self.queue.push(url);
+        const state = self.states[url];
+        if (state === undefined) {
+          self.states[url] = QUEUED;
+        }
+        return new Promise((resolve, reject) => {
+          if (!self.scriptLoadedCallbacks[url]) {
+            self.scriptLoadedCallbacks[url] = [];
+          }
+          self.scriptLoadedCallbacks[url].push({
+            resolve,
+            reject
+          });
+        });
+      }
+      load(url) {
+        return this.add(url);
+      }
+      remove(url) {
+        delete this.states[url];
+        delete this.scriptLoadedCallbacks[url];
+      }
+      loadQueue() {
+        const queue = this.queue;
+        this.queue = [];
+        return this.loadScripts(queue);
+      }
+      loadScripts(scripts) {
+        const self = this;
+        const execCallbacks = (name, url) => {
+          get$a(self.scriptLoadedCallbacks, url).each(callbacks => {
+            each$g(callbacks, callback => callback[name](url));
+          });
+          delete self.scriptLoadedCallbacks[url];
+        };
+        const processResults = results => {
+          const failures = filter$6(results, result => result.status === 'rejected');
+          if (failures.length > 0) {
+            return Promise.reject(bind$3(failures, ({reason}) => isArray$1(reason) ? reason : [reason]));
+          } else {
+            return Promise.resolve();
+          }
+        };
+        const load = urls => Promise.allSettled(map$3(urls, url => {
+          if (self.states[url] === LOADED) {
+            execCallbacks('resolve', url);
+            return Promise.resolve();
+          } else if (self.states[url] === FAILED) {
+            execCallbacks('reject', url);
+            return Promise.reject(url);
+          } else {
+            self.states[url] = LOADING;
+            return self.loadScript(url).then(() => {
+              self.states[url] = LOADED;
+              execCallbacks('resolve', url);
+              const queue = self.queue;
+              if (queue.length > 0) {
+                self.queue = [];
+                return load(queue).then(processResults);
+              }
+            }, () => {
+              self.states[url] = FAILED;
+              execCallbacks('reject', url);
+              return Promise.reject(url);
+            });
+          }
+        }));
+        const processQueue = urls => {
+          self.loading = true;
+          return load(urls).then(results => {
+            self.loading = false;
+            const nextQueuedItem = self.queueLoadedCallbacks.shift();
+            Optional.from(nextQueuedItem).each(call);
+            return processResults(results);
+          });
+        };
+        const uniqueScripts = stringArray(scripts);
+        if (self.loading) {
+          return new Promise((resolve, reject) => {
+            self.queueLoadedCallbacks.push(() => processQueue(uniqueScripts).then(resolve, reject));
+          });
+        } else {
+          return processQueue(uniqueScripts);
+        }
+      }
+    }
+    ScriptLoader.ScriptLoader = new ScriptLoader();
+
+    const Cell = initial => {
+      let value = initial;
+      const get = () => {
+        return value;
+      };
+      const set = v => {
+        value = v;
+      };
+      return {
+        get,
+        set
+      };
+    };
+
+    const isRaw = str => isObject(str) && has$2(str, 'raw');
+    const isTokenised = str => isArray$1(str) && str.length > 1;
+    const data = {};
+    const currentCode = Cell('en');
+    const getLanguageData = () => get$a(data, currentCode.get());
+    const getData$1 = () => map$2(data, value => ({ ...value }));
+    const setCode = newCode => {
+      if (newCode) {
+        currentCode.set(newCode);
+      }
+    };
+    const getCode = () => currentCode.get();
+    const add$1 = (code, items) => {
+      let langData = data[code];
+      if (!langData) {
+        data[code] = langData = {};
+      }
+      each$f(items, (translation, name) => {
+        langData[name.toLowerCase()] = translation;
+      });
+    };
+    const translate = text => {
+      const langData = getLanguageData().getOr({});
+      const toString = obj => {
+        if (isFunction(obj)) {
+          return Object.prototype.toString.call(obj);
+        }
+        return !isEmpty(obj) ? '' + obj : '';
+      };
+      const isEmpty = text => text === '' || text === null || text === undefined;
+      const getLangData = text => {
+        const textstr = toString(text);
+        return get$a(langData, textstr.toLowerCase()).map(toString).getOr(textstr);
+      };
+      const removeContext = str => str.replace(/{context:\w+}$/, '');
+      if (isEmpty(text)) {
+        return '';
+      }
+      if (isRaw(text)) {
+        return toString(text.raw);
+      }
+      if (isTokenised(text)) {
+        const values = text.slice(1);
+        const substitued = getLangData(text[0]).replace(/\{([0-9]+)\}/g, ($1, $2) => has$2(values, $2) ? toString(values[$2]) : $1);
+        return removeContext(substitued);
+      }
+      return removeContext(getLangData(text));
+    };
+    const isRtl$1 = () => getLanguageData().bind(items => get$a(items, '_dir')).exists(dir => dir === 'rtl');
+    const hasCode = code => has$2(data, code);
+    const I18n = {
+      getData: getData$1,
+      setCode,
+      getCode,
+      add: add$1,
+      translate,
+      isRtl: isRtl$1,
+      hasCode
+    };
+
+    const AddOnManager = () => {
+      const items = [];
+      const urls = {};
+      const lookup = {};
+      const _listeners = [];
+      const runListeners = (name, state) => {
+        const matchedListeners = filter$6(_listeners, listener => listener.name === name && listener.state === state);
+        each$g(matchedListeners, listener => listener.resolve());
+      };
+      const isLoaded = name => has$2(urls, name);
+      const isAdded = name => has$2(lookup, name);
+      const get = name => {
+        if (lookup[name]) {
+          return lookup[name].instance;
+        }
+        return undefined;
+      };
+      const loadLanguagePack = (name, languages) => {
+        const language = I18n.getCode();
+        const wrappedLanguages = ',' + (languages || '') + ',';
+        if (!language || languages && wrappedLanguages.indexOf(',' + language + ',') === -1) {
+          return;
+        }
+        ScriptLoader.ScriptLoader.add(urls[name] + '/langs/' + language + '.js');
+      };
+      const requireLangPack = (name, languages) => {
+        if (AddOnManager.languageLoad !== false) {
+          if (isLoaded(name)) {
+            loadLanguagePack(name, languages);
+          } else {
+            waitFor(name, 'loaded').then(() => loadLanguagePack(name, languages));
+          }
+        }
+      };
+      const add = (id, addOn) => {
+        items.push(addOn);
+        lookup[id] = { instance: addOn };
+        runListeners(id, 'added');
+        return addOn;
+      };
+      const remove = name => {
+        delete urls[name];
+        delete lookup[name];
+      };
+      const createUrl = (baseUrl, dep) => {
+        if (isString(dep)) {
+          return isString(baseUrl) ? {
+            prefix: '',
+            resource: dep,
+            suffix: ''
+          } : {
+            prefix: baseUrl.prefix,
+            resource: dep,
+            suffix: baseUrl.suffix
+          };
+        } else {
+          return dep;
+        }
+      };
+      const load = (name, addOnUrl) => {
+        if (urls[name]) {
+          return Promise.resolve();
+        }
+        let urlString = isString(addOnUrl) ? addOnUrl : addOnUrl.prefix + addOnUrl.resource + addOnUrl.suffix;
+        if (urlString.indexOf('/') !== 0 && urlString.indexOf('://') === -1) {
+          urlString = AddOnManager.baseURL + '/' + urlString;
+        }
+        urls[name] = urlString.substring(0, urlString.lastIndexOf('/'));
+        const done = () => {
+          runListeners(name, 'loaded');
+          return Promise.resolve();
+        };
+        if (lookup[name]) {
+          return done();
+        } else {
+          return ScriptLoader.ScriptLoader.add(urlString).then(done);
+        }
+      };
+      const waitFor = (name, state = 'added') => {
+        if (state === 'added' && isAdded(name)) {
+          return Promise.resolve();
+        } else if (state === 'loaded' && isLoaded(name)) {
+          return Promise.resolve();
+        } else {
+          return new Promise(resolve => {
+            _listeners.push({
+              name,
+              state,
+              resolve
+            });
+          });
+        }
+      };
+      return {
+        items,
+        urls,
+        lookup,
+        get,
+        requireLangPack,
+        add,
+        remove,
+        createUrl,
+        load,
+        waitFor
+      };
+    };
+    AddOnManager.languageLoad = true;
+    AddOnManager.baseURL = '';
+    AddOnManager.PluginManager = AddOnManager();
+    AddOnManager.ThemeManager = AddOnManager();
+    AddOnManager.ModelManager = AddOnManager();
+
+    const singleton = doRevoke => {
+      const subject = Cell(Optional.none());
+      const revoke = () => subject.get().each(doRevoke);
+      const clear = () => {
+        revoke();
+        subject.set(Optional.none());
+      };
+      const isSet = () => subject.get().isSome();
+      const get = () => subject.get();
+      const set = s => {
+        revoke();
+        subject.set(Optional.some(s));
+      };
+      return {
+        clear,
+        isSet,
+        get,
+        set
+      };
+    };
+    const value$2 = () => {
+      const subject = singleton(noop);
+      const on = f => subject.get().each(f);
+      return {
+        ...subject,
+        on
+      };
+    };
+
+    const first$1 = (fn, rate) => {
+      let timer = null;
+      const cancel = () => {
+        if (!isNull(timer)) {
+          clearTimeout(timer);
+          timer = null;
+        }
+      };
+      const throttle = (...args) => {
+        if (isNull(timer)) {
+          timer = setTimeout(() => {
+            timer = null;
+            fn.apply(null, args);
+          }, rate);
+        }
+      };
+      return {
+        cancel,
+        throttle
+      };
+    };
+    const last$1 = (fn, rate) => {
+      let timer = null;
+      const cancel = () => {
+        if (!isNull(timer)) {
+          clearTimeout(timer);
+          timer = null;
+        }
+      };
+      const throttle = (...args) => {
+        cancel();
+        timer = setTimeout(() => {
+          timer = null;
+          fn.apply(null, args);
+        }, rate);
+      };
+      return {
+        cancel,
+        throttle
+      };
+    };
+
+    const descendants$1 = (scope, predicate) => {
+      let result = [];
+      each$g(children(scope), x => {
+        if (predicate(x)) {
+          result = result.concat([x]);
+        }
+        result = result.concat(descendants$1(x, predicate));
+      });
+      return result;
+    };
+
+    const descendants = (scope, selector) => all(selector, scope);
+
+    const annotation = constant('mce-annotation');
+    const dataAnnotation = constant('data-mce-annotation');
+    const dataAnnotationId = constant('data-mce-annotation-uid');
+    const dataAnnotationActive = constant('data-mce-annotation-active');
+
+    const identify = (editor, annotationName) => {
+      const rng = editor.selection.getRng();
+      const start = SugarElement.fromDom(rng.startContainer);
+      const root = SugarElement.fromDom(editor.getBody());
+      const selector = annotationName.fold(() => '.' + annotation(), an => `[${ dataAnnotation() }="${ an }"]`);
+      const newStart = child$1(start, rng.startOffset).getOr(start);
+      const closest = closest$3(newStart, selector, n => eq(n, root));
+      const getAttr = (c, property) => {
+        if (has$1(c, property)) {
+          return Optional.some(get$9(c, property));
+        } else {
+          return Optional.none();
+        }
+      };
+      return closest.bind(c => getAttr(c, `${ dataAnnotationId() }`).bind(uid => getAttr(c, `${ dataAnnotation() }`).map(name => {
+        const elements = findMarkers(editor, uid);
+        return {
+          uid,
+          name,
+          elements
+        };
+      })));
+    };
+    const isAnnotation = elem => isElement$7(elem) && has(elem, annotation());
+    const findMarkers = (editor, uid) => {
+      const body = SugarElement.fromDom(editor.getBody());
+      return descendants(body, `[${ dataAnnotationId() }="${ uid }"]`);
+    };
+    const findAll = (editor, name) => {
+      const body = SugarElement.fromDom(editor.getBody());
+      const markers = descendants(body, `[${ dataAnnotation() }="${ name }"]`);
+      const directory = {};
+      each$g(markers, m => {
+        const uid = get$9(m, dataAnnotationId());
+        const nodesAlready = get$a(directory, uid).getOr([]);
+        directory[uid] = nodesAlready.concat([m]);
+      });
+      return directory;
+    };
+
+    const setup$x = (editor, registry) => {
+      const changeCallbacks = Cell({});
+      const initData = () => ({
+        listeners: [],
+        previous: value$2()
+      });
+      const withCallbacks = (name, f) => {
+        updateCallbacks(name, data => {
+          f(data);
+          return data;
+        });
+      };
+      const updateCallbacks = (name, f) => {
+        const callbackMap = changeCallbacks.get();
+        const data = get$a(callbackMap, name).getOrThunk(initData);
+        const outputData = f(data);
+        callbackMap[name] = outputData;
+        changeCallbacks.set(callbackMap);
+      };
+      const fireCallbacks = (name, uid, elements) => {
+        withCallbacks(name, data => {
+          each$g(data.listeners, f => f(true, name, {
+            uid,
+            nodes: map$3(elements, elem => elem.dom)
+          }));
+        });
+      };
+      const fireNoAnnotation = name => {
+        withCallbacks(name, data => {
+          each$g(data.listeners, f => f(false, name));
+        });
+      };
+      const toggleActiveAttr = (uid, state) => {
+        each$g(findMarkers(editor, uid), span => {
+          if (state) {
+            set$2(span, dataAnnotationActive(), 'true');
+          } else {
+            remove$a(span, dataAnnotationActive());
+          }
+        });
+      };
+      const onNodeChange = last$1(() => {
+        const annotations = sort(registry.getNames());
+        each$g(annotations, name => {
+          updateCallbacks(name, data => {
+            const prev = data.previous.get();
+            identify(editor, Optional.some(name)).fold(() => {
+              prev.each(uid => {
+                fireNoAnnotation(name);
+                data.previous.clear();
+                toggleActiveAttr(uid, false);
+              });
+            }, ({uid, name, elements}) => {
+              if (!is$2(prev, uid)) {
+                prev.each(uid => toggleActiveAttr(uid, false));
+                fireCallbacks(name, uid, elements);
+                data.previous.set(uid);
+                toggleActiveAttr(uid, true);
+              }
+            });
+            return {
+              previous: data.previous,
+              listeners: data.listeners
+            };
+          });
+        });
+      }, 30);
+      editor.on('remove', () => {
+        onNodeChange.cancel();
+      });
+      editor.on('NodeChange', () => {
+        onNodeChange.throttle();
+      });
+      const addListener = (name, f) => {
+        updateCallbacks(name, data => ({
+          previous: data.previous,
+          listeners: data.listeners.concat([f])
+        }));
+      };
+      return { addListener };
+    };
+
+    const setup$w = (editor, registry) => {
+      const identifyParserNode = span => Optional.from(span.attr(dataAnnotation())).bind(registry.lookup);
+      editor.serializer.addTempAttr(dataAnnotationActive());
+      editor.serializer.addNodeFilter('span', spans => {
+        each$g(spans, span => {
+          identifyParserNode(span).each(settings => {
+            if (settings.persistent === false) {
+              span.unwrap();
+            }
+          });
+        });
+      });
+    };
+
+    const create$b = () => {
+      const annotations = {};
+      const register = (name, settings) => {
+        annotations[name] = {
+          name,
+          settings
+        };
+      };
+      const lookup = name => get$a(annotations, name).map(a => a.settings);
+      const getNames = () => keys(annotations);
+      return {
+        register,
+        lookup,
+        getNames
+      };
+    };
+
+    let unique = 0;
+    const generate$1 = prefix => {
+      const date = new Date();
+      const time = date.getTime();
+      const random = Math.floor(Math.random() * 1000000000);
+      unique++;
+      return prefix + '_' + random + unique + String(time);
+    };
+
+    const add = (element, classes) => {
+      each$g(classes, x => {
+        add$2(element, x);
+      });
+    };
+
+    const clone$2 = (original, isDeep) => SugarElement.fromDom(original.dom.cloneNode(isDeep));
+    const shallow$1 = original => clone$2(original, false);
+    const deep$1 = original => clone$2(original, true);
+    const shallowAs = (original, tag) => {
+      const nu = SugarElement.fromTag(tag);
+      const attributes = clone$4(original);
+      setAll$1(nu, attributes);
+      return nu;
+    };
+    const mutate = (original, tag) => {
+      const nu = shallowAs(original, tag);
+      after$4(original, nu);
+      const children$1 = children(original);
+      append(nu, children$1);
+      remove$5(original);
+      return nu;
+    };
+
+    const TextWalker = (startNode, rootNode, isBoundary = never) => {
+      const walker = new DomTreeWalker(startNode, rootNode);
+      const walk = direction => {
+        let next;
+        do {
+          next = walker[direction]();
+        } while (next && !isText$8(next) && !isBoundary(next));
+        return Optional.from(next).filter(isText$8);
+      };
+      return {
+        current: () => Optional.from(walker.current()).filter(isText$8),
+        next: () => walk('next'),
+        prev: () => walk('prev'),
+        prev2: () => walk('prev2')
+      };
+    };
+
+    const TextSeeker = (dom, isBoundary) => {
+      const isBlockBoundary = isBoundary ? isBoundary : node => dom.isBlock(node) || isBr$5(node) || isContentEditableFalse$a(node);
+      const walk = (node, offset, walker, process) => {
+        if (isText$8(node)) {
+          const newOffset = process(node, offset, node.data);
+          if (newOffset !== -1) {
+            return Optional.some({
+              container: node,
+              offset: newOffset
+            });
+          }
+        }
+        return walker().bind(next => walk(next.container, next.offset, walker, process));
+      };
+      const backwards = (node, offset, process, root) => {
+        const walker = TextWalker(node, root, isBlockBoundary);
+        return walk(node, offset, () => walker.prev().map(prev => ({
+          container: prev,
+          offset: prev.length
+        })), process).getOrNull();
+      };
+      const forwards = (node, offset, process, root) => {
+        const walker = TextWalker(node, root, isBlockBoundary);
+        return walk(node, offset, () => walker.next().map(next => ({
+          container: next,
+          offset: 0
+        })), process).getOrNull();
+      };
+      return {
+        backwards,
+        forwards
+      };
+    };
+
+    const round$1 = Math.round;
+    const clone$1 = rect => {
+      if (!rect) {
+        return {
+          left: 0,
+          top: 0,
+          bottom: 0,
+          right: 0,
+          width: 0,
+          height: 0
+        };
+      }
+      return {
+        left: round$1(rect.left),
+        top: round$1(rect.top),
+        bottom: round$1(rect.bottom),
+        right: round$1(rect.right),
+        width: round$1(rect.width),
+        height: round$1(rect.height)
+      };
+    };
+    const collapse = (rect, toStart) => {
+      rect = clone$1(rect);
+      if (toStart) {
+        rect.right = rect.left;
+      } else {
+        rect.left = rect.left + rect.width;
+        rect.right = rect.left;
+      }
+      rect.width = 0;
+      return rect;
+    };
+    const isEqual = (rect1, rect2) => rect1.left === rect2.left && rect1.top === rect2.top && rect1.bottom === rect2.bottom && rect1.right === rect2.right;
+    const isValidOverflow = (overflowY, rect1, rect2) => overflowY >= 0 && overflowY <= Math.min(rect1.height, rect2.height) / 2;
+    const isAbove$1 = (rect1, rect2) => {
+      const halfHeight = Math.min(rect2.height / 2, rect1.height / 2);
+      if (rect1.bottom - halfHeight < rect2.top) {
+        return true;
+      }
+      if (rect1.top > rect2.bottom) {
+        return false;
+      }
+      return isValidOverflow(rect2.top - rect1.bottom, rect1, rect2);
+    };
+    const isBelow$1 = (rect1, rect2) => {
+      if (rect1.top > rect2.bottom) {
+        return true;
+      }
+      if (rect1.bottom < rect2.top) {
+        return false;
+      }
+      return isValidOverflow(rect2.bottom - rect1.top, rect1, rect2);
+    };
+    const containsXY = (rect, clientX, clientY) => clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;
+    const boundingClientRectFromRects = rects => {
+      return foldl(rects, (acc, rect) => {
+        return acc.fold(() => Optional.some(rect), prevRect => {
+          const left = Math.min(rect.left, prevRect.left);
+          const top = Math.min(rect.top, prevRect.top);
+          const right = Math.max(rect.right, prevRect.right);
+          const bottom = Math.max(rect.bottom, prevRect.bottom);
+          return Optional.some({
+            top,
+            right,
+            bottom,
+            left,
+            width: right - left,
+            height: bottom - top
+          });
+        });
+      }, Optional.none());
+    };
+    const distanceToRectEdgeFromXY = (rect, x, y) => {
+      const cx = Math.max(Math.min(x, rect.left + rect.width), rect.left);
+      const cy = Math.max(Math.min(y, rect.top + rect.height), rect.top);
+      return Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy));
+    };
+    const overlapY = (r1, r2) => Math.max(0, Math.min(r1.bottom, r2.bottom) - Math.max(r1.top, r2.top));
+
+    const clamp$2 = (value, min, max) => Math.min(Math.max(value, min), max);
+
+    const getSelectedNode = range => {
+      const startContainer = range.startContainer, startOffset = range.startOffset;
+      if (startContainer.hasChildNodes() && range.endOffset === startOffset + 1) {
+        return startContainer.childNodes[startOffset];
+      }
+      return null;
+    };
+    const getNode$1 = (container, offset) => {
+      if (isElement$6(container) && container.hasChildNodes()) {
+        const childNodes = container.childNodes;
+        const safeOffset = clamp$2(offset, 0, childNodes.length - 1);
+        return childNodes[safeOffset];
+      } else {
+        return container;
+      }
+    };
+    const getNodeUnsafe = (container, offset) => {
+      if (offset < 0 && isElement$6(container) && container.hasChildNodes()) {
+        return undefined;
+      } else {
+        return getNode$1(container, offset);
+      }
+    };
+
+    const extendingChars = 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]');
+    const isExtendingChar = ch => typeof ch === 'string' && ch.charCodeAt(0) >= 768 && extendingChars.test(ch);
+
+    const or = (...args) => {
+      return x => {
+        for (let i = 0; i < args.length; i++) {
+          if (args[i](x)) {
+            return true;
+          }
+        }
+        return false;
+      };
+    };
+    const and = (...args) => {
+      return x => {
+        for (let i = 0; i < args.length; i++) {
+          if (!args[i](x)) {
+            return false;
+          }
+        }
+        return true;
+      };
+    };
+
+    const isElement$4 = isElement$6;
+    const isCaretCandidate$2 = isCaretCandidate$3;
+    const isBlock$1 = matchStyleValues('display', 'block table');
+    const isFloated = matchStyleValues('float', 'left right');
+    const isValidElementCaretCandidate = and(isElement$4, isCaretCandidate$2, not(isFloated));
+    const isNotPre = not(matchStyleValues('white-space', 'pre pre-line pre-wrap'));
+    const isText$5 = isText$8;
+    const isBr$2 = isBr$5;
+    const nodeIndex$1 = DOMUtils.nodeIndex;
+    const resolveIndex$1 = getNodeUnsafe;
+    const createRange$1 = doc => 'createRange' in doc ? doc.createRange() : DOMUtils.DOM.createRng();
+    const isWhiteSpace$1 = chr => chr && /[\r\n\t ]/.test(chr);
+    const isRange = rng => !!rng.setStart && !!rng.setEnd;
+    const isHiddenWhiteSpaceRange = range => {
+      const container = range.startContainer;
+      const offset = range.startOffset;
+      if (isWhiteSpace$1(range.toString()) && isNotPre(container.parentNode) && isText$8(container)) {
+        const text = container.data;
+        if (isWhiteSpace$1(text[offset - 1]) || isWhiteSpace$1(text[offset + 1])) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const getBrClientRect = brNode => {
+      const doc = brNode.ownerDocument;
+      const rng = createRange$1(doc);
+      const nbsp$1 = doc.createTextNode(nbsp);
+      const parentNode = brNode.parentNode;
+      parentNode.insertBefore(nbsp$1, brNode);
+      rng.setStart(nbsp$1, 0);
+      rng.setEnd(nbsp$1, 1);
+      const clientRect = clone$1(rng.getBoundingClientRect());
+      parentNode.removeChild(nbsp$1);
+      return clientRect;
+    };
+    const getBoundingClientRectWebKitText = rng => {
+      const sc = rng.startContainer;
+      const ec = rng.endContainer;
+      const so = rng.startOffset;
+      const eo = rng.endOffset;
+      if (sc === ec && isText$8(ec) && so === 0 && eo === 1) {
+        const newRng = rng.cloneRange();
+        newRng.setEndAfter(ec);
+        return getBoundingClientRect$1(newRng);
+      } else {
+        return null;
+      }
+    };
+    const isZeroRect = r => r.left === 0 && r.right === 0 && r.top === 0 && r.bottom === 0;
+    const getBoundingClientRect$1 = item => {
+      let clientRect;
+      const clientRects = item.getClientRects();
+      if (clientRects.length > 0) {
+        clientRect = clone$1(clientRects[0]);
+      } else {
+        clientRect = clone$1(item.getBoundingClientRect());
+      }
+      if (!isRange(item) && isBr$2(item) && isZeroRect(clientRect)) {
+        return getBrClientRect(item);
+      }
+      if (isZeroRect(clientRect) && isRange(item)) {
+        return getBoundingClientRectWebKitText(item);
+      }
+      return clientRect;
+    };
+    const collapseAndInflateWidth = (clientRect, toStart) => {
+      const newClientRect = collapse(clientRect, toStart);
+      newClientRect.width = 1;
+      newClientRect.right = newClientRect.left + 1;
+      return newClientRect;
+    };
+    const getCaretPositionClientRects = caretPosition => {
+      const clientRects = [];
+      const addUniqueAndValidRect = clientRect => {
+        if (clientRect.height === 0) {
+          return;
+        }
+        if (clientRects.length > 0) {
+          if (isEqual(clientRect, clientRects[clientRects.length - 1])) {
+            return;
+          }
+        }
+        clientRects.push(clientRect);
+      };
+      const addCharacterOffset = (container, offset) => {
+        const range = createRange$1(container.ownerDocument);
+        if (offset < container.data.length) {
+          if (isExtendingChar(container.data[offset])) {
+            return clientRects;
+          }
+          if (isExtendingChar(container.data[offset - 1])) {
+            range.setStart(container, offset);
+            range.setEnd(container, offset + 1);
+            if (!isHiddenWhiteSpaceRange(range)) {
+              addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(range), false));
+              return clientRects;
+            }
+          }
+        }
+        if (offset > 0) {
+          range.setStart(container, offset - 1);
+          range.setEnd(container, offset);
+          if (!isHiddenWhiteSpaceRange(range)) {
+            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(range), false));
+          }
+        }
+        if (offset < container.data.length) {
+          range.setStart(container, offset);
+          range.setEnd(container, offset + 1);
+          if (!isHiddenWhiteSpaceRange(range)) {
+            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(range), true));
+          }
+        }
+      };
+      const container = caretPosition.container();
+      const offset = caretPosition.offset();
+      if (isText$5(container)) {
+        addCharacterOffset(container, offset);
+        return clientRects;
+      }
+      if (isElement$4(container)) {
+        if (caretPosition.isAtEnd()) {
+          const node = resolveIndex$1(container, offset);
+          if (isText$5(node)) {
+            addCharacterOffset(node, node.data.length);
+          }
+          if (isValidElementCaretCandidate(node) && !isBr$2(node)) {
+            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(node), false));
+          }
+        } else {
+          const node = resolveIndex$1(container, offset);
+          if (isText$5(node)) {
+            addCharacterOffset(node, 0);
+          }
+          if (isValidElementCaretCandidate(node) && caretPosition.isAtEnd()) {
+            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(node), false));
+            return clientRects;
+          }
+          const beforeNode = resolveIndex$1(caretPosition.container(), caretPosition.offset() - 1);
+          if (isValidElementCaretCandidate(beforeNode) && !isBr$2(beforeNode)) {
+            if (isBlock$1(beforeNode) || isBlock$1(node) || !isValidElementCaretCandidate(node)) {
+              addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(beforeNode), false));
+            }
+          }
+          if (isValidElementCaretCandidate(node)) {
+            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(node), true));
+          }
+        }
+      }
+      return clientRects;
+    };
+    const CaretPosition = (container, offset, clientRects) => {
+      const isAtStart = () => {
+        if (isText$5(container)) {
+          return offset === 0;
+        }
+        return offset === 0;
+      };
+      const isAtEnd = () => {
+        if (isText$5(container)) {
+          return offset >= container.data.length;
+        }
+        return offset >= container.childNodes.length;
+      };
+      const toRange = () => {
+        const range = createRange$1(container.ownerDocument);
+        range.setStart(container, offset);
+        range.setEnd(container, offset);
+        return range;
+      };
+      const getClientRects = () => {
+        if (!clientRects) {
+          clientRects = getCaretPositionClientRects(CaretPosition(container, offset));
+        }
+        return clientRects;
+      };
+      const isVisible = () => getClientRects().length > 0;
+      const isEqual = caretPosition => caretPosition && container === caretPosition.container() && offset === caretPosition.offset();
+      const getNode = before => resolveIndex$1(container, before ? offset - 1 : offset);
+      return {
+        container: constant(container),
+        offset: constant(offset),
+        toRange,
+        getClientRects,
+        isVisible,
+        isAtStart,
+        isAtEnd,
+        isEqual,
+        getNode
+      };
+    };
+    CaretPosition.fromRangeStart = range => CaretPosition(range.startContainer, range.startOffset);
+    CaretPosition.fromRangeEnd = range => CaretPosition(range.endContainer, range.endOffset);
+    CaretPosition.after = node => CaretPosition(node.parentNode, nodeIndex$1(node) + 1);
+    CaretPosition.before = node => CaretPosition(node.parentNode, nodeIndex$1(node));
+    CaretPosition.isAbove = (pos1, pos2) => lift2(head(pos2.getClientRects()), last$3(pos1.getClientRects()), isAbove$1).getOr(false);
+    CaretPosition.isBelow = (pos1, pos2) => lift2(last$3(pos2.getClientRects()), head(pos1.getClientRects()), isBelow$1).getOr(false);
+    CaretPosition.isAtStart = pos => pos ? pos.isAtStart() : false;
+    CaretPosition.isAtEnd = pos => pos ? pos.isAtEnd() : false;
+    CaretPosition.isTextPosition = pos => pos ? isText$8(pos.container()) : false;
+    CaretPosition.isElementPosition = pos => CaretPosition.isTextPosition(pos) === false;
+
+    const trimEmptyTextNode$1 = (dom, node) => {
+      if (isText$8(node) && node.data.length === 0) {
+        dom.remove(node);
+      }
+    };
+    const insertNode = (dom, rng, node) => {
+      rng.insertNode(node);
+      trimEmptyTextNode$1(dom, node.previousSibling);
+      trimEmptyTextNode$1(dom, node.nextSibling);
+    };
+    const insertFragment = (dom, rng, frag) => {
+      const firstChild = Optional.from(frag.firstChild);
+      const lastChild = Optional.from(frag.lastChild);
+      rng.insertNode(frag);
+      firstChild.each(child => trimEmptyTextNode$1(dom, child.previousSibling));
+      lastChild.each(child => trimEmptyTextNode$1(dom, child.nextSibling));
+    };
+    const rangeInsertNode = (dom, rng, node) => {
+      if (isDocumentFragment(node)) {
+        insertFragment(dom, rng, node);
+      } else {
+        insertNode(dom, rng, node);
+      }
+    };
+
+    const isText$4 = isText$8;
+    const isBogus = isBogus$2;
+    const nodeIndex = DOMUtils.nodeIndex;
+    const normalizedParent = node => {
+      const parentNode = node.parentNode;
+      if (isBogus(parentNode)) {
+        return normalizedParent(parentNode);
+      }
+      return parentNode;
+    };
+    const getChildNodes = node => {
+      if (!node) {
+        return [];
+      }
+      return reduce(node.childNodes, (result, node) => {
+        if (isBogus(node) && node.nodeName !== 'BR') {
+          result = result.concat(getChildNodes(node));
+        } else {
+          result.push(node);
+        }
+        return result;
+      }, []);
+    };
+    const normalizedTextOffset = (node, offset) => {
+      while (node = node.previousSibling) {
+        if (!isText$4(node)) {
+          break;
+        }
+        offset += node.data.length;
+      }
+      return offset;
+    };
+    const equal = a => b => a === b;
+    const normalizedNodeIndex = node => {
+      let nodes, index;
+      nodes = getChildNodes(normalizedParent(node));
+      index = findIndex$1(nodes, equal(node), node);
+      nodes = nodes.slice(0, index + 1);
+      const numTextFragments = reduce(nodes, (result, node, i) => {
+        if (isText$4(node) && isText$4(nodes[i - 1])) {
+          result++;
+        }
+        return result;
+      }, 0);
+      nodes = filter$4(nodes, matchNodeNames([node.nodeName]));
+      index = findIndex$1(nodes, equal(node), node);
+      return index - numTextFragments;
+    };
+    const createPathItem = node => {
+      let name;
+      if (isText$4(node)) {
+        name = 'text()';
+      } else {
+        name = node.nodeName.toLowerCase();
+      }
+      return name + '[' + normalizedNodeIndex(node) + ']';
+    };
+    const parentsUntil$1 = (root, node, predicate) => {
+      const parents = [];
+      for (node = node.parentNode; node !== root; node = node.parentNode) {
+        if (predicate && predicate(node)) {
+          break;
+        }
+        parents.push(node);
+      }
+      return parents;
+    };
+    const create$a = (root, caretPosition) => {
+      let container, offset, path = [], outputOffset, childNodes, parents;
+      container = caretPosition.container();
+      offset = caretPosition.offset();
+      if (isText$4(container)) {
+        outputOffset = normalizedTextOffset(container, offset);
+      } else {
+        childNodes = container.childNodes;
+        if (offset >= childNodes.length) {
+          outputOffset = 'after';
+          offset = childNodes.length - 1;
+        } else {
+          outputOffset = 'before';
+        }
+        container = childNodes[offset];
+      }
+      path.push(createPathItem(container));
+      parents = parentsUntil$1(root, container);
+      parents = filter$4(parents, not(isBogus$2));
+      path = path.concat(map$1(parents, node => {
+        return createPathItem(node);
+      }));
+      return path.reverse().join('/') + ',' + outputOffset;
+    };
+    const resolvePathItem = (node, name, index) => {
+      let nodes = getChildNodes(node);
+      nodes = filter$4(nodes, (node, index) => {
+        return !isText$4(node) || !isText$4(nodes[index - 1]);
+      });
+      nodes = filter$4(nodes, matchNodeNames([name]));
+      return nodes[index];
+    };
+    const findTextPosition = (container, offset) => {
+      let node = container, targetOffset = 0, dataLen;
+      while (isText$4(node)) {
+        dataLen = node.data.length;
+        if (offset >= targetOffset && offset <= targetOffset + dataLen) {
+          container = node;
+          offset = offset - targetOffset;
+          break;
+        }
+        if (!isText$4(node.nextSibling)) {
+          container = node;
+          offset = dataLen;
+          break;
+        }
+        targetOffset += dataLen;
+        node = node.nextSibling;
+      }
+      if (isText$4(container) && offset > container.data.length) {
+        offset = container.data.length;
+      }
+      return CaretPosition(container, offset);
+    };
+    const resolve$1 = (root, path) => {
+      let offset;
+      if (!path) {
+        return null;
+      }
+      const parts = path.split(',');
+      const paths = parts[0].split('/');
+      offset = parts.length > 1 ? parts[1] : 'before';
+      const container = reduce(paths, (result, value) => {
+        const match = /([\w\-\(\)]+)\[([0-9]+)\]/.exec(value);
+        if (!match) {
+          return null;
+        }
+        if (match[1] === 'text()') {
+          match[1] = '#text';
+        }
+        return resolvePathItem(result, match[1], parseInt(match[2], 10));
+      }, root);
+      if (!container) {
+        return null;
+      }
+      if (!isText$4(container)) {
+        if (offset === 'after') {
+          offset = nodeIndex(container) + 1;
+        } else {
+          offset = nodeIndex(container);
+        }
+        return CaretPosition(container.parentNode, offset);
+      }
+      return findTextPosition(container, parseInt(offset, 10));
+    };
+
+    const isContentEditableFalse$8 = isContentEditableFalse$a;
+    const getNormalizedTextOffset = (trim, container, offset) => {
+      let node, trimmedOffset;
+      trimmedOffset = trim(container.data.slice(0, offset)).length;
+      for (node = container.previousSibling; node && isText$8(node); node = node.previousSibling) {
+        trimmedOffset += trim(node.data).length;
+      }
+      return trimmedOffset;
+    };
+    const getPoint = (dom, trim, normalized, rng, start) => {
+      let container = rng[start ? 'startContainer' : 'endContainer'];
+      let offset = rng[start ? 'startOffset' : 'endOffset'];
+      const point = [];
+      let childNodes, after = 0;
+      const root = dom.getRoot();
+      if (isText$8(container)) {
+        point.push(normalized ? getNormalizedTextOffset(trim, container, offset) : offset);
+      } else {
+        childNodes = container.childNodes;
+        if (offset >= childNodes.length && childNodes.length) {
+          after = 1;
+          offset = Math.max(0, childNodes.length - 1);
+        }
+        point.push(dom.nodeIndex(childNodes[offset], normalized) + after);
+      }
+      for (; container && container !== root; container = container.parentNode) {
+        point.push(dom.nodeIndex(container, normalized));
+      }
+      return point;
+    };
+    const getLocation = (trim, selection, normalized, rng) => {
+      const dom = selection.dom, bookmark = {};
+      bookmark.start = getPoint(dom, trim, normalized, rng, true);
+      if (!selection.isCollapsed()) {
+        bookmark.end = getPoint(dom, trim, normalized, rng, false);
+      }
+      if (isRangeInCaretContainerBlock(rng)) {
+        bookmark.isFakeCaret = true;
+      }
+      return bookmark;
+    };
+    const findIndex = (dom, name, element) => {
+      let count = 0;
+      Tools.each(dom.select(name), node => {
+        if (node.getAttribute('data-mce-bogus') === 'all') {
+          return;
+        }
+        if (node === element) {
+          return false;
+        }
+        count++;
+      });
+      return count;
+    };
+    const moveEndPoint$1 = (rng, start) => {
+      let container, offset, childNodes;
+      const prefix = start ? 'start' : 'end';
+      container = rng[prefix + 'Container'];
+      offset = rng[prefix + 'Offset'];
+      if (isElement$6(container) && container.nodeName === 'TR') {
+        childNodes = container.childNodes;
+        container = childNodes[Math.min(start ? offset : offset - 1, childNodes.length - 1)];
+        if (container) {
+          offset = start ? 0 : container.childNodes.length;
+          rng['set' + (start ? 'Start' : 'End')](container, offset);
+        }
+      }
+    };
+    const normalizeTableCellSelection = rng => {
+      moveEndPoint$1(rng, true);
+      moveEndPoint$1(rng, false);
+      return rng;
+    };
+    const findSibling = (node, offset) => {
+      let sibling;
+      if (isElement$6(node)) {
+        node = getNode$1(node, offset);
+        if (isContentEditableFalse$8(node)) {
+          return node;
+        }
+      }
+      if (isCaretContainer$2(node)) {
+        if (isText$8(node) && isCaretContainerBlock$1(node)) {
+          node = node.parentNode;
+        }
+        sibling = node.previousSibling;
+        if (isContentEditableFalse$8(sibling)) {
+          return sibling;
+        }
+        sibling = node.nextSibling;
+        if (isContentEditableFalse$8(sibling)) {
+          return sibling;
+        }
+      }
+    };
+    const findAdjacentContentEditableFalseElm = rng => {
+      return findSibling(rng.startContainer, rng.startOffset) || findSibling(rng.endContainer, rng.endOffset);
+    };
+    const getOffsetBookmark = (trim, normalized, selection) => {
+      const element = selection.getNode();
+      let name = element ? element.nodeName : null;
+      const rng = selection.getRng();
+      if (isContentEditableFalse$8(element) || name === 'IMG') {
+        return {
+          name,
+          index: findIndex(selection.dom, name, element)
+        };
+      }
+      const sibling = findAdjacentContentEditableFalseElm(rng);
+      if (sibling) {
+        name = sibling.tagName;
+        return {
+          name,
+          index: findIndex(selection.dom, name, sibling)
+        };
+      }
+      return getLocation(trim, selection, normalized, rng);
+    };
+    const getCaretBookmark = selection => {
+      const rng = selection.getRng();
+      return {
+        start: create$a(selection.dom.getRoot(), CaretPosition.fromRangeStart(rng)),
+        end: create$a(selection.dom.getRoot(), CaretPosition.fromRangeEnd(rng))
+      };
+    };
+    const getRangeBookmark = selection => {
+      return { rng: selection.getRng() };
+    };
+    const createBookmarkSpan = (dom, id, filled) => {
+      const args = {
+        'data-mce-type': 'bookmark',
+        id,
+        'style': 'overflow:hidden;line-height:0px'
+      };
+      return filled ? dom.create('span', args, '&#xFEFF;') : dom.create('span', args);
+    };
+    const getPersistentBookmark = (selection, filled) => {
+      const dom = selection.dom;
+      let rng = selection.getRng();
+      const id = dom.uniqueId();
+      const collapsed = selection.isCollapsed();
+      const element = selection.getNode();
+      const name = element.nodeName;
+      if (name === 'IMG') {
+        return {
+          name,
+          index: findIndex(dom, name, element)
+        };
+      }
+      const rng2 = normalizeTableCellSelection(rng.cloneRange());
+      if (!collapsed) {
+        rng2.collapse(false);
+        const endBookmarkNode = createBookmarkSpan(dom, id + '_end', filled);
+        rangeInsertNode(dom, rng2, endBookmarkNode);
+      }
+      rng = normalizeTableCellSelection(rng);
+      rng.collapse(true);
+      const startBookmarkNode = createBookmarkSpan(dom, id + '_start', filled);
+      rangeInsertNode(dom, rng, startBookmarkNode);
+      selection.moveToBookmark({
+        id,
+        keep: true
+      });
+      return { id };
+    };
+    const getBookmark$2 = (selection, type, normalized) => {
+      if (type === 2) {
+        return getOffsetBookmark(trim$1, normalized, selection);
+      } else if (type === 3) {
+        return getCaretBookmark(selection);
+      } else if (type) {
+        return getRangeBookmark(selection);
+      } else {
+        return getPersistentBookmark(selection, false);
+      }
+    };
+    const getUndoBookmark = curry(getOffsetBookmark, identity, true);
+
+    const value$1 = value => {
+      const applyHelper = fn => fn(value);
+      const constHelper = constant(value);
+      const outputHelper = () => output;
+      const output = {
+        tag: true,
+        inner: value,
+        fold: (_onError, onValue) => onValue(value),
+        isValue: always,
+        isError: never,
+        map: mapper => Result.value(mapper(value)),
+        mapError: outputHelper,
+        bind: applyHelper,
+        exists: applyHelper,
+        forall: applyHelper,
+        getOr: constHelper,
+        or: outputHelper,
+        getOrThunk: constHelper,
+        orThunk: outputHelper,
+        getOrDie: constHelper,
+        each: fn => {
+          fn(value);
+        },
+        toOptional: () => Optional.some(value)
+      };
+      return output;
+    };
+    const error = error => {
+      const outputHelper = () => output;
+      const output = {
+        tag: false,
+        inner: error,
+        fold: (onError, _onValue) => onError(error),
+        isValue: never,
+        isError: always,
+        map: outputHelper,
+        mapError: mapper => Result.error(mapper(error)),
+        bind: outputHelper,
+        exists: never,
+        forall: always,
+        getOr: identity,
+        or: identity,
+        getOrThunk: apply$1,
+        orThunk: apply$1,
+        getOrDie: die(String(error)),
+        each: noop,
+        toOptional: Optional.none
+      };
+      return output;
+    };
+    const fromOption = (optional, err) => optional.fold(() => error(err), value$1);
+    const Result = {
+      value: value$1,
+      error,
+      fromOption
+    };
+
+    const generate = cases => {
+      if (!isArray$1(cases)) {
+        throw new Error('cases must be an array');
+      }
+      if (cases.length === 0) {
+        throw new Error('there must be at least one case');
+      }
+      const constructors = [];
+      const adt = {};
+      each$g(cases, (acase, count) => {
+        const keys$1 = keys(acase);
+        if (keys$1.length !== 1) {
+          throw new Error('one and only one name per case');
+        }
+        const key = keys$1[0];
+        const value = acase[key];
+        if (adt[key] !== undefined) {
+          throw new Error('duplicate key detected:' + key);
+        } else if (key === 'cata') {
+          throw new Error('cannot have a case named cata (sorry)');
+        } else if (!isArray$1(value)) {
+          throw new Error('case arguments must be an array');
+        }
+        constructors.push(key);
+        adt[key] = (...args) => {
+          const argLength = args.length;
+          if (argLength !== value.length) {
+            throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);
+          }
+          const match = branches => {
+            const branchKeys = keys(branches);
+            if (constructors.length !== branchKeys.length) {
+              throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(','));
+            }
+            const allReqd = forall(constructors, reqKey => {
+              return contains$2(branchKeys, reqKey);
+            });
+            if (!allReqd) {
+              throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', '));
+            }
+            return branches[key].apply(null, args);
+          };
+          return {
+            fold: (...foldArgs) => {
+              if (foldArgs.length !== cases.length) {
+                throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);
+              }
+              const target = foldArgs[count];
+              return target.apply(null, args);
+            },
+            match,
+            log: label => {
+              console.log(label, {
+                constructors,
+                constructor: key,
+                params: args
+              });
+            }
+          };
+        };
+      });
+      return adt;
+    };
+    const Adt = { generate };
+
+    Adt.generate([
+      {
+        bothErrors: [
+          'error1',
+          'error2'
+        ]
+      },
+      {
+        firstError: [
+          'error1',
+          'value2'
+        ]
+      },
+      {
+        secondError: [
+          'value1',
+          'error2'
+        ]
+      },
+      {
+        bothValues: [
+          'value1',
+          'value2'
+        ]
+      }
+    ]);
+    const partition$1 = results => {
+      const errors = [];
+      const values = [];
+      each$g(results, result => {
+        result.fold(err => {
+          errors.push(err);
+        }, value => {
+          values.push(value);
+        });
+      });
+      return {
+        errors,
+        values
+      };
+    };
+
+    const isInlinePattern = pattern => pattern.type === 'inline-command' || pattern.type === 'inline-format';
+    const isBlockPattern = pattern => pattern.type === 'block-command' || pattern.type === 'block-format';
+    const sortPatterns = patterns => sort(patterns, (a, b) => {
+      if (a.start.length === b.start.length) {
+        return 0;
+      }
+      return a.start.length > b.start.length ? -1 : 1;
+    });
+    const normalizePattern = pattern => {
+      const err = message => Result.error({
+        message,
+        pattern
+      });
+      const formatOrCmd = (name, onFormat, onCommand) => {
+        if (pattern.format !== undefined) {
+          let formats;
+          if (isArray$1(pattern.format)) {
+            if (!forall(pattern.format, isString)) {
+              return err(name + ' pattern has non-string items in the `format` array');
+            }
+            formats = pattern.format;
+          } else if (isString(pattern.format)) {
+            formats = [pattern.format];
+          } else {
+            return err(name + ' pattern has non-string `format` parameter');
+          }
+          return Result.value(onFormat(formats));
+        } else if (pattern.cmd !== undefined) {
+          if (!isString(pattern.cmd)) {
+            return err(name + ' pattern has non-string `cmd` parameter');
+          }
+          return Result.value(onCommand(pattern.cmd, pattern.value));
+        } else {
+          return err(name + ' pattern is missing both `format` and `cmd` parameters');
+        }
+      };
+      if (!isObject(pattern)) {
+        return err('Raw pattern is not an object');
+      }
+      if (!isString(pattern.start)) {
+        return err('Raw pattern is missing `start` parameter');
+      }
+      if (pattern.end !== undefined) {
+        if (!isString(pattern.end)) {
+          return err('Inline pattern has non-string `end` parameter');
+        }
+        if (pattern.start.length === 0 && pattern.end.length === 0) {
+          return err('Inline pattern has empty `start` and `end` parameters');
+        }
+        let start = pattern.start;
+        let end = pattern.end;
+        if (end.length === 0) {
+          end = start;
+          start = '';
+        }
+        return formatOrCmd('Inline', format => ({
+          type: 'inline-format',
+          start,
+          end,
+          format
+        }), (cmd, value) => ({
+          type: 'inline-command',
+          start,
+          end,
+          cmd,
+          value
+        }));
+      } else if (pattern.replacement !== undefined) {
+        if (!isString(pattern.replacement)) {
+          return err('Replacement pattern has non-string `replacement` parameter');
+        }
+        if (pattern.start.length === 0) {
+          return err('Replacement pattern has empty `start` parameter');
+        }
+        return Result.value({
+          type: 'inline-command',
+          start: '',
+          end: pattern.start,
+          cmd: 'mceInsertContent',
+          value: pattern.replacement
+        });
+      } else {
+        if (pattern.start.length === 0) {
+          return err('Block pattern has empty `start` parameter');
+        }
+        return formatOrCmd('Block', formats => ({
+          type: 'block-format',
+          start: pattern.start,
+          format: formats[0]
+        }), (command, commandValue) => ({
+          type: 'block-command',
+          start: pattern.start,
+          cmd: command,
+          value: commandValue
+        }));
+      }
+    };
+    const getBlockPatterns = patterns => sortPatterns(filter$6(patterns, isBlockPattern));
+    const getInlinePatterns = patterns => filter$6(patterns, isInlinePattern);
+    const createPatternSet = patterns => ({
+      inlinePatterns: getInlinePatterns(patterns),
+      blockPatterns: getBlockPatterns(patterns)
+    });
+    const fromRawPatterns = patterns => {
+      const normalized = partition$1(map$3(patterns, normalizePattern));
+      each$g(normalized.errors, err => console.error(err.message, err.pattern));
+      return normalized.values;
+    };
+
+    const deviceDetection$1 = detect$2().deviceType;
+    const isTouch = deviceDetection$1.isTouch();
+    const DOM$a = DOMUtils.DOM;
+    const getHash = value => {
+      const items = value.indexOf('=') > 0 ? value.split(/[;,](?![^=;,]*(?:[;,]|$))/) : value.split(',');
+      return foldl(items, (output, item) => {
+        const arr = item.split('=');
+        const key = arr[0];
+        const val = arr.length > 1 ? arr[1] : key;
+        output[trim$3(key)] = trim$3(val);
+        return output;
+      }, {});
+    };
+    const isRegExp = x => is$4(x, RegExp);
+    const option = name => editor => editor.options.get(name);
+    const stringOrObjectProcessor = value => isString(value) || isObject(value);
+    const bodyOptionProcessor = (editor, defaultValue = '') => value => {
+      const valid = isString(value);
+      if (valid) {
+        if (value.indexOf('=') !== -1) {
+          const bodyObj = getHash(value);
+          return {
+            value: get$a(bodyObj, editor.id).getOr(defaultValue),
+            valid
+          };
+        } else {
+          return {
+            value,
+            valid
+          };
+        }
+      } else {
+        return {
+          valid: false,
+          message: 'Must be a string.'
+        };
+      }
+    };
+    const register$7 = editor => {
+      const registerOption = editor.options.register;
+      registerOption('id', {
+        processor: 'string',
+        default: editor.id
+      });
+      registerOption('selector', { processor: 'string' });
+      registerOption('target', { processor: 'object' });
+      registerOption('suffix', { processor: 'string' });
+      registerOption('cache_suffix', { processor: 'string' });
+      registerOption('base_url', { processor: 'string' });
+      registerOption('referrer_policy', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('language_load', { processor: 'boolean' });
+      registerOption('inline', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('iframe_attrs', {
+        processor: 'object',
+        default: {}
+      });
+      registerOption('doctype', {
+        processor: 'string',
+        default: '<!DOCTYPE html>'
+      });
+      registerOption('document_base_url', {
+        processor: 'string',
+        default: editor.documentBaseUrl
+      });
+      registerOption('body_id', {
+        processor: bodyOptionProcessor(editor, 'tinymce'),
+        default: 'tinymce'
+      });
+      registerOption('body_class', {
+        processor: bodyOptionProcessor(editor),
+        default: ''
+      });
+      registerOption('content_security_policy', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('br_in_pre', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('forced_root_block', {
+        processor: value => {
+          const valid = isString(value) && isNotEmpty(value);
+          if (valid) {
+            return {
+              value,
+              valid
+            };
+          } else {
+            return {
+              valid: false,
+              message: 'Must be a non-empty string.'
+            };
+          }
+        },
+        default: 'p'
+      });
+      registerOption('forced_root_block_attrs', {
+        processor: 'object',
+        default: {}
+      });
+      registerOption('br_newline_selector', {
+        processor: 'string',
+        default: '.mce-toc h2,figcaption,caption'
+      });
+      registerOption('no_newline_selector', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('keep_styles', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('end_container_on_empty_block', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('font_size_style_values', {
+        processor: 'string',
+        default: 'xx-small,x-small,small,medium,large,x-large,xx-large'
+      });
+      registerOption('font_size_legacy_values', {
+        processor: 'string',
+        default: 'xx-small,small,medium,large,x-large,xx-large,300%'
+      });
+      registerOption('font_size_classes', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('automatic_uploads', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('images_reuse_filename', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('images_replace_blob_uris', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('icons', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('icons_url', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('images_upload_url', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('images_upload_base_path', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('images_upload_base_path', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('images_upload_credentials', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('images_upload_handler', { processor: 'function' });
+      registerOption('language', {
+        processor: 'string',
+        default: 'en'
+      });
+      registerOption('language_url', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('entity_encoding', {
+        processor: 'string',
+        default: 'named'
+      });
+      registerOption('indent', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('indent_before', {
+        processor: 'string',
+        default: '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'
+      });
+      registerOption('indent_after', {
+        processor: 'string',
+        default: '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'
+      });
+      registerOption('indent_use_margin', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('indentation', {
+        processor: 'string',
+        default: '40px'
+      });
+      registerOption('content_css', {
+        processor: value => {
+          const valid = value === false || isString(value) || isArrayOf(value, isString);
+          if (valid) {
+            if (isString(value)) {
+              return {
+                value: map$3(value.split(','), trim$3),
+                valid
+              };
+            } else if (isArray$1(value)) {
+              return {
+                value,
+                valid
+              };
+            } else if (value === false) {
+              return {
+                value: [],
+                valid
+              };
+            } else {
+              return {
+                value,
+                valid
+              };
+            }
+          } else {
+            return {
+              valid: false,
+              message: 'Must be false, a string or an array of strings.'
+            };
+          }
+        },
+        default: isInline(editor) ? [] : ['default']
+      });
+      registerOption('content_style', { processor: 'string' });
+      registerOption('content_css_cors', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('font_css', {
+        processor: value => {
+          const valid = isString(value) || isArrayOf(value, isString);
+          if (valid) {
+            const newValue = isArray$1(value) ? value : map$3(value.split(','), trim$3);
+            return {
+              value: newValue,
+              valid
+            };
+          } else {
+            return {
+              valid: false,
+              message: 'Must be a string or an array of strings.'
+            };
+          }
+        },
+        default: []
+      });
+      registerOption('inline_boundaries', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('inline_boundaries_selector', {
+        processor: 'string',
+        default: 'a[href],code,.mce-annotation'
+      });
+      registerOption('object_resizing', {
+        processor: value => {
+          const valid = isBoolean(value) || isString(value);
+          if (valid) {
+            if (value === false || deviceDetection$1.isiPhone() || deviceDetection$1.isiPad()) {
+              return {
+                value: '',
+                valid
+              };
+            } else {
+              return {
+                value: value === true ? 'table,img,figure.image,div,video,iframe' : value,
+                valid
+              };
+            }
+          } else {
+            return {
+              valid: false,
+              message: 'Must be boolean or a string'
+            };
+          }
+        },
+        default: !isTouch
+      });
+      registerOption('resize_img_proportional', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('event_root', { processor: 'object' });
+      registerOption('service_message', { processor: 'string' });
+      registerOption('theme', {
+        processor: value => value === false || isString(value) || isFunction(value),
+        default: 'silver'
+      });
+      registerOption('theme_url', { processor: 'string' });
+      registerOption('formats', { processor: 'object' });
+      registerOption('format_empty_lines', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('preview_styles', {
+        processor: value => {
+          const valid = value === false || isString(value);
+          if (valid) {
+            return {
+              value: value === false ? '' : value,
+              valid
+            };
+          } else {
+            return {
+              valid: false,
+              message: 'Must be false or a string'
+            };
+          }
+        },
+        default: 'font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow'
+      });
+      registerOption('custom_ui_selector', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('hidden_input', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('submit_patch', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('encoding', { processor: 'string' });
+      registerOption('add_form_submit_trigger', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('add_unload_trigger', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('custom_undo_redo_levels', {
+        processor: 'number',
+        default: 0
+      });
+      registerOption('disable_nodechange', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('readonly', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('plugins', {
+        processor: 'string[]',
+        default: []
+      });
+      registerOption('external_plugins', { processor: 'object' });
+      registerOption('forced_plugins', { processor: 'string[]' });
+      registerOption('model', {
+        processor: 'string',
+        default: editor.hasPlugin('rtc') ? 'plugin' : 'dom'
+      });
+      registerOption('model_url', { processor: 'string' });
+      registerOption('block_unsupported_drop', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('visual', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('visual_table_class', {
+        processor: 'string',
+        default: 'mce-item-table'
+      });
+      registerOption('visual_anchor_class', {
+        processor: 'string',
+        default: 'mce-item-anchor'
+      });
+      registerOption('iframe_aria_text', {
+        processor: 'string',
+        default: 'Rich Text Area. Press ALT-0 for help.'
+      });
+      registerOption('setup', { processor: 'function' });
+      registerOption('init_instance_callback', { processor: 'function' });
+      registerOption('url_converter', {
+        processor: 'function',
+        default: editor.convertURL
+      });
+      registerOption('url_converter_scope', {
+        processor: 'object',
+        default: editor
+      });
+      registerOption('urlconverter_callback', { processor: 'function' });
+      registerOption('allow_conditional_comments', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('allow_html_data_urls', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('allow_svg_data_urls', { processor: 'boolean' });
+      registerOption('allow_html_in_named_anchor', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('allow_script_urls', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('allow_unsafe_link_target', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('convert_fonts_to_spans', {
+        processor: 'boolean',
+        default: true,
+        deprecated: true
+      });
+      registerOption('fix_list_elements', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('preserve_cdata', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('remove_trailing_brs', { processor: 'boolean' });
+      registerOption('inline_styles', {
+        processor: 'boolean',
+        default: true,
+        deprecated: true
+      });
+      registerOption('element_format', {
+        processor: 'string',
+        default: 'html'
+      });
+      registerOption('entities', { processor: 'string' });
+      registerOption('schema', {
+        processor: 'string',
+        default: 'html5'
+      });
+      registerOption('convert_urls', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('relative_urls', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('remove_script_host', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('custom_elements', { processor: 'string' });
+      registerOption('extended_valid_elements', { processor: 'string' });
+      registerOption('invalid_elements', { processor: 'string' });
+      registerOption('invalid_styles', { processor: stringOrObjectProcessor });
+      registerOption('valid_children', { processor: 'string' });
+      registerOption('valid_classes', { processor: stringOrObjectProcessor });
+      registerOption('valid_elements', { processor: 'string' });
+      registerOption('valid_styles', { processor: stringOrObjectProcessor });
+      registerOption('verify_html', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('auto_focus', { processor: value => isString(value) || value === true });
+      registerOption('browser_spellcheck', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('protect', { processor: 'array' });
+      registerOption('images_file_types', {
+        processor: 'string',
+        default: 'jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp'
+      });
+      registerOption('deprecation_warnings', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('a11y_advanced_options', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('api_key', { processor: 'string' });
+      registerOption('paste_block_drop', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('paste_data_images', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('paste_preprocess', { processor: 'function' });
+      registerOption('paste_postprocess', { processor: 'function' });
+      registerOption('paste_webkit_styles', {
+        processor: 'string',
+        default: 'none'
+      });
+      registerOption('paste_remove_styles_if_webkit', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('paste_merge_formats', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('smart_paste', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('paste_as_text', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('paste_tab_spaces', {
+        processor: 'number',
+        default: 4
+      });
+      registerOption('text_patterns', {
+        processor: value => {
+          if (isArrayOf(value, isObject) || value === false) {
+            const patterns = value === false ? [] : value;
+            return {
+              value: fromRawPatterns(patterns),
+              valid: true
+            };
+          } else {
+            return {
+              valid: false,
+              message: 'Must be an array of objects or false.'
+            };
+          }
+        },
+        default: [
+          {
+            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'
+          }
+        ]
+      });
+      registerOption('noneditable_class', {
+        processor: 'string',
+        default: 'mceNonEditable'
+      });
+      registerOption('editable_class', {
+        processor: 'string',
+        default: 'mceEditable'
+      });
+      registerOption('noneditable_regexp', {
+        processor: value => {
+          if (isArrayOf(value, isRegExp)) {
+            return {
+              value,
+              valid: true
+            };
+          } else if (isRegExp(value)) {
+            return {
+              value: [value],
+              valid: true
+            };
+          } else {
+            return {
+              valid: false,
+              message: 'Must be a RegExp or an array of RegExp.'
+            };
+          }
+        },
+        default: []
+      });
+      registerOption('table_tab_navigation', {
+        processor: 'boolean',
+        default: true
+      });
+      editor.on('ScriptsLoaded', () => {
+        registerOption('directionality', {
+          processor: 'string',
+          default: I18n.isRtl() ? 'rtl' : undefined
+        });
+        registerOption('placeholder', {
+          processor: 'string',
+          default: DOM$a.getAttrib(editor.getElement(), 'placeholder')
+        });
+      });
+    };
+    const getIframeAttrs = option('iframe_attrs');
+    const getDocType = option('doctype');
+    const getDocumentBaseUrl = option('document_base_url');
+    const getBodyId = option('body_id');
+    const getBodyClass = option('body_class');
+    const getContentSecurityPolicy = option('content_security_policy');
+    const shouldPutBrInPre$1 = option('br_in_pre');
+    const getForcedRootBlock = option('forced_root_block');
+    const getForcedRootBlockAttrs = option('forced_root_block_attrs');
+    const getBrNewLineSelector = option('br_newline_selector');
+    const getNoNewLineSelector = option('no_newline_selector');
+    const shouldKeepStyles = option('keep_styles');
+    const shouldEndContainerOnEmptyBlock = option('end_container_on_empty_block');
+    const isAutomaticUploadsEnabled = option('automatic_uploads');
+    const shouldReuseFileName = option('images_reuse_filename');
+    const shouldReplaceBlobUris = option('images_replace_blob_uris');
+    const getIconPackName = option('icons');
+    const getIconsUrl = option('icons_url');
+    const getImageUploadUrl = option('images_upload_url');
+    const getImageUploadBasePath = option('images_upload_base_path');
+    const getImagesUploadCredentials = option('images_upload_credentials');
+    const getImagesUploadHandler = option('images_upload_handler');
+    const shouldUseContentCssCors = option('content_css_cors');
+    const getReferrerPolicy = option('referrer_policy');
+    const getLanguageCode = option('language');
+    const getLanguageUrl = option('language_url');
+    const shouldIndentUseMargin = option('indent_use_margin');
+    const getIndentation = option('indentation');
+    const getContentCss = option('content_css');
+    const getContentStyle = option('content_style');
+    const getFontCss = option('font_css');
+    const getDirectionality = option('directionality');
+    const getInlineBoundarySelector = option('inline_boundaries_selector');
+    const getObjectResizing = option('object_resizing');
+    const getResizeImgProportional = option('resize_img_proportional');
+    const getPlaceholder = option('placeholder');
+    const getEventRoot = option('event_root');
+    const getServiceMessage = option('service_message');
+    const getTheme = option('theme');
+    const getThemeUrl = option('theme_url');
+    const getModel = option('model');
+    const getModelUrl = option('model_url');
+    const isInlineBoundariesEnabled = option('inline_boundaries');
+    const getFormats = option('formats');
+    const getPreviewStyles = option('preview_styles');
+    const canFormatEmptyLines = option('format_empty_lines');
+    const getCustomUiSelector = option('custom_ui_selector');
+    const isInline = option('inline');
+    const hasHiddenInput = option('hidden_input');
+    const shouldPatchSubmit = option('submit_patch');
+    const shouldAddFormSubmitTrigger = option('add_form_submit_trigger');
+    const shouldAddUnloadTrigger = option('add_unload_trigger');
+    const getCustomUndoRedoLevels = option('custom_undo_redo_levels');
+    const shouldDisableNodeChange = option('disable_nodechange');
+    const isReadOnly$1 = option('readonly');
+    const hasContentCssCors = option('content_css_cors');
+    const getPlugins = option('plugins');
+    const getExternalPlugins$1 = option('external_plugins');
+    const shouldBlockUnsupportedDrop = option('block_unsupported_drop');
+    const isVisualAidsEnabled = option('visual');
+    const getVisualAidsTableClass = option('visual_table_class');
+    const getVisualAidsAnchorClass = option('visual_anchor_class');
+    const getIframeAriaText = option('iframe_aria_text');
+    const getSetupCallback = option('setup');
+    const getInitInstanceCallback = option('init_instance_callback');
+    const getUrlConverterCallback = option('urlconverter_callback');
+    const getAutoFocus = option('auto_focus');
+    const shouldBrowserSpellcheck = option('browser_spellcheck');
+    const getProtect = option('protect');
+    const shouldPasteBlockDrop = option('paste_block_drop');
+    const shouldPasteDataImages = option('paste_data_images');
+    const getPastePreProcess = option('paste_preprocess');
+    const getPastePostProcess = option('paste_postprocess');
+    const getPasteWebkitStyles = option('paste_webkit_styles');
+    const shouldPasteRemoveWebKitStyles = option('paste_remove_styles_if_webkit');
+    const shouldPasteMergeFormats = option('paste_merge_formats');
+    const isSmartPasteEnabled = option('smart_paste');
+    const isPasteAsTextEnabled = option('paste_as_text');
+    const getPasteTabSpaces = option('paste_tab_spaces');
+    const shouldAllowHtmlDataUrls = option('allow_html_data_urls');
+    const getTextPatterns = option('text_patterns');
+    const getNonEditableClass = option('noneditable_class');
+    const getEditableClass = option('editable_class');
+    const getNonEditableRegExps = option('noneditable_regexp');
+    const getFontStyleValues = editor => Tools.explode(editor.options.get('font_size_style_values'));
+    const getFontSizeClasses = editor => Tools.explode(editor.options.get('font_size_classes'));
+    const isEncodingXml = editor => editor.options.get('encoding') === 'xml';
+    const getAllowedImageFileTypes = editor => Tools.explode(editor.options.get('images_file_types'));
+    const hasTableTabNavigation = option('table_tab_navigation');
+
+    const isElement$3 = isElement$6;
+    const isText$3 = isText$8;
+    const removeNode$1 = node => {
+      const parentNode = node.parentNode;
+      if (parentNode) {
+        parentNode.removeChild(node);
+      }
+    };
+    const trimCount = text => {
+      const trimmedText = trim$1(text);
+      return {
+        count: text.length - trimmedText.length,
+        text: trimmedText
+      };
+    };
+    const deleteZwspChars = caretContainer => {
+      let idx;
+      while ((idx = caretContainer.data.lastIndexOf(ZWSP$1)) !== -1) {
+        caretContainer.deleteData(idx, 1);
+      }
+    };
+    const removeUnchanged = (caretContainer, pos) => {
+      remove$4(caretContainer);
+      return pos;
+    };
+    const removeTextAndReposition = (caretContainer, pos) => {
+      const before = trimCount(caretContainer.data.substr(0, pos.offset()));
+      const after = trimCount(caretContainer.data.substr(pos.offset()));
+      const text = before.text + after.text;
+      if (text.length > 0) {
+        deleteZwspChars(caretContainer);
+        return CaretPosition(caretContainer, pos.offset() - before.count);
+      } else {
+        return pos;
+      }
+    };
+    const removeElementAndReposition = (caretContainer, pos) => {
+      const parentNode = pos.container();
+      const newPosition = indexOf$1(from(parentNode.childNodes), caretContainer).map(index => {
+        return index < pos.offset() ? CaretPosition(parentNode, pos.offset() - 1) : pos;
+      }).getOr(pos);
+      remove$4(caretContainer);
+      return newPosition;
+    };
+    const removeTextCaretContainer = (caretContainer, pos) => isText$3(caretContainer) && pos.container() === caretContainer ? removeTextAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);
+    const removeElementCaretContainer = (caretContainer, pos) => pos.container() === caretContainer.parentNode ? removeElementAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);
+    const removeAndReposition = (container, pos) => CaretPosition.isTextPosition(pos) ? removeTextCaretContainer(container, pos) : removeElementCaretContainer(container, pos);
+    const remove$4 = caretContainerNode => {
+      if (isElement$3(caretContainerNode) && isCaretContainer$2(caretContainerNode)) {
+        if (hasContent(caretContainerNode)) {
+          caretContainerNode.removeAttribute('data-mce-caret');
+        } else {
+          removeNode$1(caretContainerNode);
+        }
+      }
+      if (isText$3(caretContainerNode)) {
+        deleteZwspChars(caretContainerNode);
+        if (caretContainerNode.data.length === 0) {
+          removeNode$1(caretContainerNode);
+        }
+      }
+    };
+
+    const isContentEditableFalse$7 = isContentEditableFalse$a;
+    const isMedia$1 = isMedia$2;
+    const isTableCell$3 = isTableCell$5;
+    const inlineFakeCaretSelector = '*[contentEditable=false],video,audio,embed,object';
+    const getAbsoluteClientRect = (root, element, before) => {
+      const clientRect = collapse(element.getBoundingClientRect(), before);
+      let scrollX;
+      let scrollY;
+      if (root.tagName === 'BODY') {
+        const docElm = root.ownerDocument.documentElement;
+        scrollX = root.scrollLeft || docElm.scrollLeft;
+        scrollY = root.scrollTop || docElm.scrollTop;
+      } else {
+        const rootRect = root.getBoundingClientRect();
+        scrollX = root.scrollLeft - rootRect.left;
+        scrollY = root.scrollTop - rootRect.top;
+      }
+      clientRect.left += scrollX;
+      clientRect.right += scrollX;
+      clientRect.top += scrollY;
+      clientRect.bottom += scrollY;
+      clientRect.width = 1;
+      let margin = element.offsetWidth - element.clientWidth;
+      if (margin > 0) {
+        if (before) {
+          margin *= -1;
+        }
+        clientRect.left += margin;
+        clientRect.right += margin;
+      }
+      return clientRect;
+    };
+    const trimInlineCaretContainers = root => {
+      const fakeCaretTargetNodes = descendants(SugarElement.fromDom(root), inlineFakeCaretSelector);
+      for (let i = 0; i < fakeCaretTargetNodes.length; i++) {
+        const node = fakeCaretTargetNodes[i].dom;
+        let sibling = node.previousSibling;
+        if (endsWithCaretContainer$1(sibling)) {
+          const data = sibling.data;
+          if (data.length === 1) {
+            sibling.parentNode.removeChild(sibling);
+          } else {
+            sibling.deleteData(data.length - 1, 1);
+          }
+        }
+        sibling = node.nextSibling;
+        if (startsWithCaretContainer$1(sibling)) {
+          const data = sibling.data;
+          if (data.length === 1) {
+            sibling.parentNode.removeChild(sibling);
+          } else {
+            sibling.deleteData(0, 1);
+          }
+        }
+      }
+    };
+    const FakeCaret = (editor, root, isBlock, hasFocus) => {
+      const lastVisualCaret = value$2();
+      let cursorInterval;
+      let caretContainerNode;
+      const caretBlock = getForcedRootBlock(editor);
+      const dom = editor.dom;
+      const show = (before, element) => {
+        let rng;
+        hide();
+        if (isTableCell$3(element)) {
+          return null;
+        }
+        if (isBlock(element)) {
+          caretContainerNode = insertBlock(caretBlock, element, before);
+          const clientRect = getAbsoluteClientRect(root, element, before);
+          dom.setStyle(caretContainerNode, 'top', clientRect.top);
+          const caret = dom.create('div', {
+            'class': 'mce-visual-caret',
+            'data-mce-bogus': 'all'
+          });
+          dom.setStyles(caret, { ...clientRect });
+          dom.add(root, caret);
+          lastVisualCaret.set({
+            caret,
+            element,
+            before
+          });
+          if (before) {
+            dom.addClass(caret, 'mce-visual-caret-before');
+          }
+          startBlink();
+          rng = element.ownerDocument.createRange();
+          rng.setStart(caretContainerNode, 0);
+          rng.setEnd(caretContainerNode, 0);
+        } else {
+          caretContainerNode = insertInline$1(element, before);
+          rng = element.ownerDocument.createRange();
+          if (isInlineFakeCaretTarget(caretContainerNode.nextSibling)) {
+            rng.setStart(caretContainerNode, 0);
+            rng.setEnd(caretContainerNode, 0);
+          } else {
+            rng.setStart(caretContainerNode, 1);
+            rng.setEnd(caretContainerNode, 1);
+          }
+          return rng;
+        }
+        return rng;
+      };
+      const hide = () => {
+        trimInlineCaretContainers(root);
+        if (caretContainerNode) {
+          remove$4(caretContainerNode);
+          caretContainerNode = null;
+        }
+        lastVisualCaret.on(caretState => {
+          dom.remove(caretState.caret);
+          lastVisualCaret.clear();
+        });
+        if (cursorInterval) {
+          clearInterval(cursorInterval);
+          cursorInterval = undefined;
+        }
+      };
+      const startBlink = () => {
+        cursorInterval = setInterval(() => {
+          lastVisualCaret.on(caretState => {
+            if (hasFocus()) {
+              dom.toggleClass(caretState.caret, 'mce-visual-caret-hidden');
+            } else {
+              dom.addClass(caretState.caret, 'mce-visual-caret-hidden');
+            }
+          });
+        }, 500);
+      };
+      const reposition = () => {
+        lastVisualCaret.on(caretState => {
+          const clientRect = getAbsoluteClientRect(root, caretState.element, caretState.before);
+          dom.setStyles(caretState.caret, { ...clientRect });
+        });
+      };
+      const destroy = () => clearInterval(cursorInterval);
+      const getCss = () => '.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;' + '}';
+      return {
+        show,
+        hide,
+        getCss,
+        reposition,
+        destroy
+      };
+    };
+    const isFakeCaretTableBrowser = () => Env.browser.isFirefox();
+    const isInlineFakeCaretTarget = node => isContentEditableFalse$7(node) || isMedia$1(node);
+    const isFakeCaretTarget = node => isInlineFakeCaretTarget(node) || isTable$3(node) && isFakeCaretTableBrowser();
+
+    const isContentEditableTrue$2 = isContentEditableTrue$4;
+    const isContentEditableFalse$6 = isContentEditableFalse$a;
+    const isMedia = isMedia$2;
+    const isBlockLike = matchStyleValues('display', 'block table table-cell table-caption list-item');
+    const isCaretContainer = isCaretContainer$2;
+    const isCaretContainerBlock = isCaretContainerBlock$1;
+    const isElement$2 = isElement$6;
+    const isCaretCandidate$1 = isCaretCandidate$3;
+    const isForwards = direction => direction > 0;
+    const isBackwards = direction => direction < 0;
+    const skipCaretContainers = (walk, shallow) => {
+      let node;
+      while (node = walk(shallow)) {
+        if (!isCaretContainerBlock(node)) {
+          return node;
+        }
+      }
+      return null;
+    };
+    const findNode = (node, direction, predicateFn, rootNode, shallow) => {
+      const walker = new DomTreeWalker(node, rootNode);
+      const isCefOrCaretContainer = isContentEditableFalse$6(node) || isCaretContainerBlock(node);
+      if (isBackwards(direction)) {
+        if (isCefOrCaretContainer) {
+          node = skipCaretContainers(walker.prev.bind(walker), true);
+          if (predicateFn(node)) {
+            return node;
+          }
+        }
+        while (node = skipCaretContainers(walker.prev.bind(walker), shallow)) {
+          if (predicateFn(node)) {
+            return node;
+          }
+        }
+      }
+      if (isForwards(direction)) {
+        if (isCefOrCaretContainer) {
+          node = skipCaretContainers(walker.next.bind(walker), true);
+          if (predicateFn(node)) {
+            return node;
+          }
+        }
+        while (node = skipCaretContainers(walker.next.bind(walker), shallow)) {
+          if (predicateFn(node)) {
+            return node;
+          }
+        }
+      }
+      return null;
+    };
+    const getEditingHost = (node, rootNode) => {
+      const isCETrue = node => isContentEditableTrue$2(node.dom);
+      const isRoot = node => node.dom === rootNode;
+      return ancestor$3(SugarElement.fromDom(node), isCETrue, isRoot).map(elm => elm.dom).getOr(rootNode);
+    };
+    const getParentBlock$3 = (node, rootNode) => {
+      while (node && node !== rootNode) {
+        if (isBlockLike(node)) {
+          return node;
+        }
+        node = node.parentNode;
+      }
+      return null;
+    };
+    const isInSameBlock = (caretPosition1, caretPosition2, rootNode) => getParentBlock$3(caretPosition1.container(), rootNode) === getParentBlock$3(caretPosition2.container(), rootNode);
+    const getChildNodeAtRelativeOffset = (relativeOffset, caretPosition) => {
+      if (!caretPosition) {
+        return null;
+      }
+      const container = caretPosition.container();
+      const offset = caretPosition.offset();
+      if (!isElement$2(container)) {
+        return null;
+      }
+      return container.childNodes[offset + relativeOffset];
+    };
+    const beforeAfter = (before, node) => {
+      const range = node.ownerDocument.createRange();
+      if (before) {
+        range.setStartBefore(node);
+        range.setEndBefore(node);
+      } else {
+        range.setStartAfter(node);
+        range.setEndAfter(node);
+      }
+      return range;
+    };
+    const isNodesInSameBlock = (root, node1, node2) => getParentBlock$3(node1, root) === getParentBlock$3(node2, root);
+    const lean = (left, root, node) => {
+      const siblingName = left ? 'previousSibling' : 'nextSibling';
+      while (node && node !== root) {
+        let sibling = node[siblingName];
+        if (isCaretContainer(sibling)) {
+          sibling = sibling[siblingName];
+        }
+        if (isContentEditableFalse$6(sibling) || isMedia(sibling)) {
+          if (isNodesInSameBlock(root, sibling, node)) {
+            return sibling;
+          }
+          break;
+        }
+        if (isCaretCandidate$1(sibling)) {
+          break;
+        }
+        node = node.parentNode;
+      }
+      return null;
+    };
+    const before$2 = curry(beforeAfter, true);
+    const after$2 = curry(beforeAfter, false);
+    const normalizeRange = (direction, root, range) => {
+      let node;
+      const leanLeft = curry(lean, true, root);
+      const leanRight = curry(lean, false, root);
+      let container = range.startContainer;
+      const offset = range.startOffset;
+      if (isCaretContainerBlock$1(container)) {
+        if (!isElement$2(container)) {
+          container = container.parentNode;
+        }
+        const location = container.getAttribute('data-mce-caret');
+        if (location === 'before') {
+          node = container.nextSibling;
+          if (isFakeCaretTarget(node)) {
+            return before$2(node);
+          }
+        }
+        if (location === 'after') {
+          node = container.previousSibling;
+          if (isFakeCaretTarget(node)) {
+            return after$2(node);
+          }
+        }
+      }
+      if (!range.collapsed) {
+        return range;
+      }
+      if (isText$8(container)) {
+        if (isCaretContainer(container)) {
+          if (direction === 1) {
+            node = leanRight(container);
+            if (node) {
+              return before$2(node);
+            }
+            node = leanLeft(container);
+            if (node) {
+              return after$2(node);
+            }
+          }
+          if (direction === -1) {
+            node = leanLeft(container);
+            if (node) {
+              return after$2(node);
+            }
+            node = leanRight(container);
+            if (node) {
+              return before$2(node);
+            }
+          }
+          return range;
+        }
+        if (endsWithCaretContainer$1(container) && offset >= container.data.length - 1) {
+          if (direction === 1) {
+            node = leanRight(container);
+            if (node) {
+              return before$2(node);
+            }
+          }
+          return range;
+        }
+        if (startsWithCaretContainer$1(container) && offset <= 1) {
+          if (direction === -1) {
+            node = leanLeft(container);
+            if (node) {
+              return after$2(node);
+            }
+          }
+          return range;
+        }
+        if (offset === container.data.length) {
+          node = leanRight(container);
+          if (node) {
+            return before$2(node);
+          }
+          return range;
+        }
+        if (offset === 0) {
+          node = leanLeft(container);
+          if (node) {
+            return after$2(node);
+          }
+          return range;
+        }
+      }
+      return range;
+    };
+    const getRelativeCefElm = (forward, caretPosition) => Optional.from(getChildNodeAtRelativeOffset(forward ? 0 : -1, caretPosition)).filter(isContentEditableFalse$6);
+    const getNormalizedRangeEndPoint = (direction, root, range) => {
+      const normalizedRange = normalizeRange(direction, root, range);
+      if (direction === -1) {
+        return CaretPosition.fromRangeStart(normalizedRange);
+      }
+      return CaretPosition.fromRangeEnd(normalizedRange);
+    };
+    const getElementFromPosition = pos => Optional.from(pos.getNode()).map(SugarElement.fromDom);
+    const getElementFromPrevPosition = pos => Optional.from(pos.getNode(true)).map(SugarElement.fromDom);
+    const getVisualCaretPosition = (walkFn, caretPosition) => {
+      while (caretPosition = walkFn(caretPosition)) {
+        if (caretPosition.isVisible()) {
+          return caretPosition;
+        }
+      }
+      return caretPosition;
+    };
+    const isMoveInsideSameBlock = (from, to) => {
+      const inSameBlock = isInSameBlock(from, to);
+      if (!inSameBlock && isBr$5(from.getNode())) {
+        return true;
+      }
+      return inSameBlock;
+    };
+
+    var HDirection;
+    (function (HDirection) {
+      HDirection[HDirection['Backwards'] = -1] = 'Backwards';
+      HDirection[HDirection['Forwards'] = 1] = 'Forwards';
+    }(HDirection || (HDirection = {})));
+    const isContentEditableFalse$5 = isContentEditableFalse$a;
+    const isText$2 = isText$8;
+    const isElement$1 = isElement$6;
+    const isBr$1 = isBr$5;
+    const isCaretCandidate = isCaretCandidate$3;
+    const isAtomic = isAtomic$1;
+    const isEditableCaretCandidate = isEditableCaretCandidate$1;
+    const getParents$3 = (node, root) => {
+      const parents = [];
+      while (node && node !== root) {
+        parents.push(node);
+        node = node.parentNode;
+      }
+      return parents;
+    };
+    const nodeAtIndex = (container, offset) => {
+      if (container.hasChildNodes() && offset < container.childNodes.length) {
+        return container.childNodes[offset];
+      }
+      return null;
+    };
+    const getCaretCandidatePosition = (direction, node) => {
+      if (isForwards(direction)) {
+        if (isCaretCandidate(node.previousSibling) && !isText$2(node.previousSibling)) {
+          return CaretPosition.before(node);
+        }
+        if (isText$2(node)) {
+          return CaretPosition(node, 0);
+        }
+      }
+      if (isBackwards(direction)) {
+        if (isCaretCandidate(node.nextSibling) && !isText$2(node.nextSibling)) {
+          return CaretPosition.after(node);
+        }
+        if (isText$2(node)) {
+          return CaretPosition(node, node.data.length);
+        }
+      }
+      if (isBackwards(direction)) {
+        if (isBr$1(node)) {
+          return CaretPosition.before(node);
+        }
+        return CaretPosition.after(node);
+      }
+      return CaretPosition.before(node);
+    };
+    const moveForwardFromBr = (root, nextNode) => {
+      const nextSibling = nextNode.nextSibling;
+      if (nextSibling && isCaretCandidate(nextSibling)) {
+        if (isText$2(nextSibling)) {
+          return CaretPosition(nextSibling, 0);
+        } else {
+          return CaretPosition.before(nextSibling);
+        }
+      } else {
+        return findCaretPosition$1(HDirection.Forwards, CaretPosition.after(nextNode), root);
+      }
+    };
+    const findCaretPosition$1 = (direction, startPos, root) => {
+      let node;
+      let nextNode;
+      let innerNode;
+      let caretPosition;
+      if (!isElement$1(root) || !startPos) {
+        return null;
+      }
+      if (startPos.isEqual(CaretPosition.after(root)) && root.lastChild) {
+        caretPosition = CaretPosition.after(root.lastChild);
+        if (isBackwards(direction) && isCaretCandidate(root.lastChild) && isElement$1(root.lastChild)) {
+          return isBr$1(root.lastChild) ? CaretPosition.before(root.lastChild) : caretPosition;
+        }
+      } else {
+        caretPosition = startPos;
+      }
+      const container = caretPosition.container();
+      let offset = caretPosition.offset();
+      if (isText$2(container)) {
+        if (isBackwards(direction) && offset > 0) {
+          return CaretPosition(container, --offset);
+        }
+        if (isForwards(direction) && offset < container.length) {
+          return CaretPosition(container, ++offset);
+        }
+        node = container;
+      } else {
+        if (isBackwards(direction) && offset > 0) {
+          nextNode = nodeAtIndex(container, offset - 1);
+          if (isCaretCandidate(nextNode)) {
+            if (!isAtomic(nextNode)) {
+              innerNode = findNode(nextNode, direction, isEditableCaretCandidate, nextNode);
+              if (innerNode) {
+                if (isText$2(innerNode)) {
+                  return CaretPosition(innerNode, innerNode.data.length);
+                }
+                return CaretPosition.after(innerNode);
+              }
+            }
+            if (isText$2(nextNode)) {
+              return CaretPosition(nextNode, nextNode.data.length);
+            }
+            return CaretPosition.before(nextNode);
+          }
+        }
+        if (isForwards(direction) && offset < container.childNodes.length) {
+          nextNode = nodeAtIndex(container, offset);
+          if (isCaretCandidate(nextNode)) {
+            if (isBr$1(nextNode)) {
+              return moveForwardFromBr(root, nextNode);
+            }
+            if (!isAtomic(nextNode)) {
+              innerNode = findNode(nextNode, direction, isEditableCaretCandidate, nextNode);
+              if (innerNode) {
+                if (isText$2(innerNode)) {
+                  return CaretPosition(innerNode, 0);
+                }
+                return CaretPosition.before(innerNode);
+              }
+            }
+            if (isText$2(nextNode)) {
+              return CaretPosition(nextNode, 0);
+            }
+            return CaretPosition.after(nextNode);
+          }
+        }
+        node = nextNode ? nextNode : caretPosition.getNode();
+      }
+      if (isForwards(direction) && caretPosition.isAtEnd() || isBackwards(direction) && caretPosition.isAtStart()) {
+        node = findNode(node, direction, always, root, true);
+        if (isEditableCaretCandidate(node, root)) {
+          return getCaretCandidatePosition(direction, node);
+        }
+      }
+      nextNode = findNode(node, direction, isEditableCaretCandidate, root);
+      const rootContentEditableFalseElm = last$2(filter$6(getParents$3(container, root), isContentEditableFalse$5));
+      if (rootContentEditableFalseElm && (!nextNode || !rootContentEditableFalseElm.contains(nextNode))) {
+        if (isForwards(direction)) {
+          caretPosition = CaretPosition.after(rootContentEditableFalseElm);
+        } else {
+          caretPosition = CaretPosition.before(rootContentEditableFalseElm);
+        }
+        return caretPosition;
+      }
+      if (nextNode) {
+        return getCaretCandidatePosition(direction, nextNode);
+      }
+      return null;
+    };
+    const CaretWalker = root => ({
+      next: caretPosition => {
+        return findCaretPosition$1(HDirection.Forwards, caretPosition, root);
+      },
+      prev: caretPosition => {
+        return findCaretPosition$1(HDirection.Backwards, caretPosition, root);
+      }
+    });
+
+    const walkToPositionIn = (forward, root, start) => {
+      const position = forward ? CaretPosition.before(start) : CaretPosition.after(start);
+      return fromPosition(forward, root, position);
+    };
+    const afterElement = node => isBr$5(node) ? CaretPosition.before(node) : CaretPosition.after(node);
+    const isBeforeOrStart = position => {
+      if (CaretPosition.isTextPosition(position)) {
+        return position.offset() === 0;
+      } else {
+        return isCaretCandidate$3(position.getNode());
+      }
+    };
+    const isAfterOrEnd = position => {
+      if (CaretPosition.isTextPosition(position)) {
+        const container = position.container();
+        return position.offset() === container.data.length;
+      } else {
+        return isCaretCandidate$3(position.getNode(true));
+      }
+    };
+    const isBeforeAfterSameElement = (from, to) => !CaretPosition.isTextPosition(from) && !CaretPosition.isTextPosition(to) && from.getNode() === to.getNode(true);
+    const isAtBr = position => !CaretPosition.isTextPosition(position) && isBr$5(position.getNode());
+    const shouldSkipPosition = (forward, from, to) => {
+      if (forward) {
+        return !isBeforeAfterSameElement(from, to) && !isAtBr(from) && isAfterOrEnd(from) && isBeforeOrStart(to);
+      } else {
+        return !isBeforeAfterSameElement(to, from) && isBeforeOrStart(from) && isAfterOrEnd(to);
+      }
+    };
+    const fromPosition = (forward, root, pos) => {
+      const walker = CaretWalker(root);
+      return Optional.from(forward ? walker.next(pos) : walker.prev(pos));
+    };
+    const navigate = (forward, root, from) => fromPosition(forward, root, from).bind(to => {
+      if (isInSameBlock(from, to, root) && shouldSkipPosition(forward, from, to)) {
+        return fromPosition(forward, root, to);
+      } else {
+        return Optional.some(to);
+      }
+    });
+    const navigateIgnore = (forward, root, from, ignoreFilter) => navigate(forward, root, from).bind(pos => ignoreFilter(pos) ? navigateIgnore(forward, root, pos, ignoreFilter) : Optional.some(pos));
+    const positionIn = (forward, element) => {
+      const startNode = forward ? element.firstChild : element.lastChild;
+      if (isText$8(startNode)) {
+        return Optional.some(CaretPosition(startNode, forward ? 0 : startNode.data.length));
+      } else if (startNode) {
+        if (isCaretCandidate$3(startNode)) {
+          return Optional.some(forward ? CaretPosition.before(startNode) : afterElement(startNode));
+        } else {
+          return walkToPositionIn(forward, element, startNode);
+        }
+      } else {
+        return Optional.none();
+      }
+    };
+    const nextPosition = curry(fromPosition, true);
+    const prevPosition = curry(fromPosition, false);
+    const firstPositionIn = curry(positionIn, true);
+    const lastPositionIn = curry(positionIn, false);
+
+    const CARET_ID$1 = '_mce_caret';
+    const isCaretNode = node => isElement$6(node) && node.id === CARET_ID$1;
+    const getParentCaretContainer = (body, node) => {
+      while (node && node !== body) {
+        if (node.id === CARET_ID$1) {
+          return node;
+        }
+        node = node.parentNode;
+      }
+      return null;
+    };
+
+    const isStringPathBookmark = bookmark => isString(bookmark.start);
+    const isRangeBookmark = bookmark => has$2(bookmark, 'rng');
+    const isIdBookmark = bookmark => has$2(bookmark, 'id');
+    const isIndexBookmark = bookmark => has$2(bookmark, 'name');
+    const isPathBookmark = bookmark => Tools.isArray(bookmark.start);
+
+    const addBogus = (dom, node) => {
+      if (isElement$6(node) && dom.isBlock(node) && !node.innerHTML) {
+        node.innerHTML = '<br data-mce-bogus="1" />';
+      }
+      return node;
+    };
+    const resolveCaretPositionBookmark = (dom, bookmark) => {
+      let pos;
+      const rng = dom.createRng();
+      pos = resolve$1(dom.getRoot(), bookmark.start);
+      rng.setStart(pos.container(), pos.offset());
+      pos = resolve$1(dom.getRoot(), bookmark.end);
+      rng.setEnd(pos.container(), pos.offset());
+      return rng;
+    };
+    const insertZwsp = (node, rng) => {
+      const textNode = node.ownerDocument.createTextNode(ZWSP$1);
+      node.appendChild(textNode);
+      rng.setStart(textNode, 0);
+      rng.setEnd(textNode, 0);
+    };
+    const isEmpty$1 = node => node.hasChildNodes() === false;
+    const tryFindRangePosition = (node, rng) => lastPositionIn(node).fold(never, pos => {
+      rng.setStart(pos.container(), pos.offset());
+      rng.setEnd(pos.container(), pos.offset());
+      return true;
+    });
+    const padEmptyCaretContainer = (root, node, rng) => {
+      if (isEmpty$1(node) && getParentCaretContainer(root, node)) {
+        insertZwsp(node, rng);
+        return true;
+      } else {
+        return false;
+      }
+    };
+    const setEndPoint = (dom, start, bookmark, rng) => {
+      const point = bookmark[start ? 'start' : 'end'];
+      let i, node, offset, children;
+      const root = dom.getRoot();
+      if (point) {
+        offset = point[0];
+        for (node = root, i = point.length - 1; i >= 1; i--) {
+          children = node.childNodes;
+          if (padEmptyCaretContainer(root, node, rng)) {
+            return true;
+          }
+          if (point[i] > children.length - 1) {
+            if (padEmptyCaretContainer(root, node, rng)) {
+              return true;
+            }
+            return tryFindRangePosition(node, rng);
+          }
+          node = children[point[i]];
+        }
+        if (node.nodeType === 3) {
+          offset = Math.min(point[0], node.nodeValue.length);
+        }
+        if (node.nodeType === 1) {
+          offset = Math.min(point[0], node.childNodes.length);
+        }
+        if (start) {
+          rng.setStart(node, offset);
+        } else {
+          rng.setEnd(node, offset);
+        }
+      }
+      return true;
+    };
+    const isValidTextNode = node => isText$8(node) && node.data.length > 0;
+    const restoreEndPoint = (dom, suffix, bookmark) => {
+      let marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev;
+      const keep = bookmark.keep;
+      let container, offset;
+      if (marker) {
+        node = marker.parentNode;
+        if (suffix === 'start') {
+          if (!keep) {
+            idx = dom.nodeIndex(marker);
+          } else {
+            if (marker.hasChildNodes()) {
+              node = marker.firstChild;
+              idx = 1;
+            } else if (isValidTextNode(marker.nextSibling)) {
+              node = marker.nextSibling;
+              idx = 0;
+            } else if (isValidTextNode(marker.previousSibling)) {
+              node = marker.previousSibling;
+              idx = marker.previousSibling.data.length;
+            } else {
+              node = marker.parentNode;
+              idx = dom.nodeIndex(marker) + 1;
+            }
+          }
+          container = node;
+          offset = idx;
+        } else {
+          if (!keep) {
+            idx = dom.nodeIndex(marker);
+          } else {
+            if (marker.hasChildNodes()) {
+              node = marker.firstChild;
+              idx = 1;
+            } else if (isValidTextNode(marker.previousSibling)) {
+              node = marker.previousSibling;
+              idx = marker.previousSibling.data.length;
+            } else {
+              node = marker.parentNode;
+              idx = dom.nodeIndex(marker);
+            }
+          }
+          container = node;
+          offset = idx;
+        }
+        if (!keep) {
+          prev = marker.previousSibling;
+          next = marker.nextSibling;
+          Tools.each(Tools.grep(marker.childNodes), node => {
+            if (isText$8(node)) {
+              node.nodeValue = node.nodeValue.replace(/\uFEFF/g, '');
+            }
+          });
+          while (marker = dom.get(bookmark.id + '_' + suffix)) {
+            dom.remove(marker, true);
+          }
+          if (prev && next && prev.nodeType === next.nodeType && isText$8(prev) && !Env.browser.isOpera()) {
+            idx = prev.nodeValue.length;
+            prev.appendData(next.nodeValue);
+            dom.remove(next);
+            container = prev;
+            offset = idx;
+          }
+        }
+        return Optional.some(CaretPosition(container, offset));
+      } else {
+        return Optional.none();
+      }
+    };
+    const resolvePaths = (dom, bookmark) => {
+      const rng = dom.createRng();
+      if (setEndPoint(dom, true, bookmark, rng) && setEndPoint(dom, false, bookmark, rng)) {
+        return Optional.some(rng);
+      } else {
+        return Optional.none();
+      }
+    };
+    const resolveId = (dom, bookmark) => {
+      const startPos = restoreEndPoint(dom, 'start', bookmark);
+      const endPos = restoreEndPoint(dom, 'end', bookmark);
+      return lift2(startPos, endPos.or(startPos), (spos, epos) => {
+        const rng = dom.createRng();
+        rng.setStart(addBogus(dom, spos.container()), spos.offset());
+        rng.setEnd(addBogus(dom, epos.container()), epos.offset());
+        return rng;
+      });
+    };
+    const resolveIndex = (dom, bookmark) => Optional.from(dom.select(bookmark.name)[bookmark.index]).map(elm => {
+      const rng = dom.createRng();
+      rng.selectNode(elm);
+      return rng;
+    });
+    const resolve = (selection, bookmark) => {
+      const dom = selection.dom;
+      if (bookmark) {
+        if (isPathBookmark(bookmark)) {
+          return resolvePaths(dom, bookmark);
+        } else if (isStringPathBookmark(bookmark)) {
+          return Optional.some(resolveCaretPositionBookmark(dom, bookmark));
+        } else if (isIdBookmark(bookmark)) {
+          return resolveId(dom, bookmark);
+        } else if (isIndexBookmark(bookmark)) {
+          return resolveIndex(dom, bookmark);
+        } else if (isRangeBookmark(bookmark)) {
+          return Optional.some(bookmark.rng);
+        }
+      }
+      return Optional.none();
+    };
+
+    const getBookmark$1 = (selection, type, normalized) => {
+      return getBookmark$2(selection, type, normalized);
+    };
+    const moveToBookmark = (selection, bookmark) => {
+      resolve(selection, bookmark).each(rng => {
+        selection.setRng(rng);
+      });
+    };
+    const isBookmarkNode$1 = node => {
+      return isElement$6(node) && node.tagName === 'SPAN' && node.getAttribute('data-mce-type') === 'bookmark';
+    };
+
+    const is = expected => actual => expected === actual;
+    const isNbsp = is(nbsp);
+    const isWhiteSpace = chr => chr !== '' && ' \f\n\r\t\x0B'.indexOf(chr) !== -1;
+    const isContent = chr => !isWhiteSpace(chr) && !isNbsp(chr) && !isZwsp$1(chr);
+
+    const hexColour = value => ({ value });
+    const toHex = component => {
+      const hex = component.toString(16);
+      return (hex.length === 1 ? '0' + hex : hex).toUpperCase();
+    };
+    const fromRgba = rgbaColour => {
+      const value = toHex(rgbaColour.red) + toHex(rgbaColour.green) + toHex(rgbaColour.blue);
+      return hexColour(value);
+    };
+
+    const rgbRegex = /^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/i;
+    const rgbaRegex = /^\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?(?:\.\d+)?)\s*\)\s*$/i;
+    const rgbaColour = (red, green, blue, alpha) => ({
+      red,
+      green,
+      blue,
+      alpha
+    });
+    const fromStringValues = (red, green, blue, alpha) => {
+      const r = parseInt(red, 10);
+      const g = parseInt(green, 10);
+      const b = parseInt(blue, 10);
+      const a = parseFloat(alpha);
+      return rgbaColour(r, g, b, a);
+    };
+    const fromString = rgbaString => {
+      if (rgbaString === 'transparent') {
+        return Optional.some(rgbaColour(0, 0, 0, 0));
+      }
+      const rgbMatch = rgbRegex.exec(rgbaString);
+      if (rgbMatch !== null) {
+        return Optional.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1'));
+      }
+      const rgbaMatch = rgbaRegex.exec(rgbaString);
+      if (rgbaMatch !== null) {
+        return Optional.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4]));
+      }
+      return Optional.none();
+    };
+
+    const rgbaToHexString = color => fromString(color).map(fromRgba).map(h => '#' + h.value).getOr(color);
+
+    const isNode = node => !!node.nodeType;
+    const isInlineBlock = node => {
+      return node && /^(IMG)$/.test(node.nodeName);
+    };
+    const moveStart = (dom, selection, rng) => {
+      const offset = rng.startOffset;
+      let container = rng.startContainer;
+      if (container === rng.endContainer) {
+        if (isInlineBlock(container.childNodes[offset])) {
+          return;
+        }
+      }
+      if (isElement$6(container)) {
+        const nodes = container.childNodes;
+        let walker;
+        if (offset < nodes.length) {
+          container = nodes[offset];
+          walker = new DomTreeWalker(container, dom.getParent(container, dom.isBlock));
+        } else {
+          container = nodes[nodes.length - 1];
+          walker = new DomTreeWalker(container, dom.getParent(container, dom.isBlock));
+          walker.next(true);
+        }
+        for (let node = walker.current(); node; node = walker.next()) {
+          if (isText$8(node) && !isWhiteSpaceNode$1(node)) {
+            rng.setStart(node, 0);
+            selection.setRng(rng);
+            return;
+          }
+        }
+      }
+    };
+    const getNonWhiteSpaceSibling = (node, next, inc) => {
+      if (node) {
+        const nextName = next ? 'nextSibling' : 'previousSibling';
+        for (node = inc ? node : node[nextName]; node; node = node[nextName]) {
+          if (isElement$6(node) || !isWhiteSpaceNode$1(node)) {
+            return node;
+          }
+        }
+      }
+    };
+    const isTextBlock$1 = (editor, name) => {
+      if (isNode(name)) {
+        name = name.nodeName;
+      }
+      return !!editor.schema.getTextBlockElements()[name.toLowerCase()];
+    };
+    const isValid = (ed, parent, child) => {
+      return ed.schema.isValidChild(parent, child);
+    };
+    const isWhiteSpaceNode$1 = (node, allowSpaces = false) => {
+      if (isNonNullable(node) && isText$8(node)) {
+        const data = allowSpaces ? node.data.replace(/ /g, '\xA0') : node.data;
+        return isWhitespaceText(data);
+      } else {
+        return false;
+      }
+    };
+    const isEmptyTextNode$1 = node => {
+      return isNonNullable(node) && isText$8(node) && node.length === 0;
+    };
+    const replaceVars = (value, vars) => {
+      if (isFunction(value)) {
+        value = value(vars);
+      } else if (isNonNullable(vars)) {
+        value = value.replace(/%(\w+)/g, (str, name) => {
+          return vars[name] || str;
+        });
+      }
+      return value;
+    };
+    const isEq$5 = (str1, str2) => {
+      str1 = str1 || '';
+      str2 = str2 || '';
+      str1 = '' + (str1.nodeName || str1);
+      str2 = '' + (str2.nodeName || str2);
+      return str1.toLowerCase() === str2.toLowerCase();
+    };
+    const normalizeStyleValue = (value, name) => {
+      if (name === 'color' || name === 'backgroundColor') {
+        value = rgbaToHexString(value);
+      }
+      if (name === 'fontWeight' && value === 700) {
+        value = 'bold';
+      }
+      if (name === 'fontFamily') {
+        value = value.replace(/[\'\"]/g, '').replace(/,\s+/g, ',');
+      }
+      return '' + value;
+    };
+    const getStyle = (dom, node, name) => {
+      return normalizeStyleValue(dom.getStyle(node, name), name);
+    };
+    const getTextDecoration = (dom, node) => {
+      let decoration;
+      dom.getParent(node, n => {
+        decoration = dom.getStyle(n, 'text-decoration');
+        return decoration && decoration !== 'none';
+      });
+      return decoration;
+    };
+    const getParents$2 = (dom, node, selector) => {
+      return dom.getParents(node, selector, dom.getRoot());
+    };
+    const isVariableFormatName = (editor, formatName) => {
+      const hasVariableValues = format => {
+        const isVariableValue = val => val.length > 1 && val.charAt(0) === '%';
+        return exists([
+          'styles',
+          'attributes'
+        ], key => get$a(format, key).exists(field => {
+          const fieldValues = isArray$1(field) ? field : values(field);
+          return exists(fieldValues, isVariableValue);
+        }));
+      };
+      return exists(editor.formatter.get(formatName), hasVariableValues);
+    };
+    const areSimilarFormats = (editor, formatName, otherFormatName) => {
+      const validKeys = [
+        'inline',
+        'block',
+        'selector',
+        'attributes',
+        'styles',
+        'classes'
+      ];
+      const filterObj = format => filter$5(format, (_, key) => exists(validKeys, validKey => validKey === key));
+      return exists(editor.formatter.get(formatName), fmt1 => {
+        const filteredFmt1 = filterObj(fmt1);
+        return exists(editor.formatter.get(otherFormatName), fmt2 => {
+          const filteredFmt2 = filterObj(fmt2);
+          return equal$1(filteredFmt1, filteredFmt2);
+        });
+      });
+    };
+    const isBlockFormat = format => hasNonNullableKey(format, 'block');
+    const isSelectorFormat = format => hasNonNullableKey(format, 'selector');
+    const isInlineFormat = format => hasNonNullableKey(format, 'inline');
+    const isMixedFormat = format => isSelectorFormat(format) && isInlineFormat(format) && is$2(get$a(format, 'mixed'), true);
+    const shouldExpandToSelector = format => isSelectorFormat(format) && format.expand !== false && !isInlineFormat(format);
+
+    const isBookmarkNode = isBookmarkNode$1;
+    const getParents$1 = getParents$2;
+    const isWhiteSpaceNode = isWhiteSpaceNode$1;
+    const isTextBlock = isTextBlock$1;
+    const isBogusBr = node => {
+      return isBr$5(node) && node.getAttribute('data-mce-bogus') && !node.nextSibling;
+    };
+    const findParentContentEditable = (dom, node) => {
+      let parent = node;
+      while (parent) {
+        if (isElement$6(parent) && dom.getContentEditable(parent)) {
+          return dom.getContentEditable(parent) === 'false' ? parent : node;
+        }
+        parent = parent.parentNode;
+      }
+      return node;
+    };
+    const walkText = (start, node, offset, predicate) => {
+      const str = node.data;
+      for (let i = offset; start ? i >= 0 : i < str.length; start ? i-- : i++) {
+        if (predicate(str.charAt(i))) {
+          return start ? i + 1 : i;
+        }
+      }
+      return -1;
+    };
+    const findSpace = (start, node, offset) => walkText(start, node, offset, c => isNbsp(c) || isWhiteSpace(c));
+    const findContent = (start, node, offset) => walkText(start, node, offset, isContent);
+    const findWordEndPoint = (dom, body, container, offset, start, includeTrailingSpaces) => {
+      let lastTextNode;
+      const rootNode = dom.getParent(container, dom.isBlock) || body;
+      const walk = (container, offset, pred) => {
+        const textSeeker = TextSeeker(dom);
+        const walker = start ? textSeeker.backwards : textSeeker.forwards;
+        return Optional.from(walker(container, offset, (text, textOffset) => {
+          if (isBookmarkNode(text.parentNode)) {
+            return -1;
+          } else {
+            lastTextNode = text;
+            return pred(start, text, textOffset);
+          }
+        }, rootNode));
+      };
+      const spaceResult = walk(container, offset, findSpace);
+      return spaceResult.bind(result => includeTrailingSpaces ? walk(result.container, result.offset + (start ? -1 : 0), findContent) : Optional.some(result)).orThunk(() => lastTextNode ? Optional.some({
+        container: lastTextNode,
+        offset: start ? 0 : lastTextNode.length
+      }) : Optional.none());
+    };
+    const findSelectorEndPoint = (dom, formatList, rng, container, siblingName) => {
+      if (isText$8(container) && isEmpty$3(container.data) && container[siblingName]) {
+        container = container[siblingName];
+      }
+      const parents = getParents$1(dom, container);
+      for (let i = 0; i < parents.length; i++) {
+        for (let y = 0; y < formatList.length; y++) {
+          const curFormat = formatList[y];
+          if (isNonNullable(curFormat.collapsed) && curFormat.collapsed !== rng.collapsed) {
+            continue;
+          }
+          if (isSelectorFormat(curFormat) && dom.is(parents[i], curFormat.selector)) {
+            return parents[i];
+          }
+        }
+      }
+      return container;
+    };
+    const findBlockEndPoint = (editor, formatList, container, siblingName) => {
+      let node = container;
+      const dom = editor.dom;
+      const root = dom.getRoot();
+      const format = formatList[0];
+      if (isBlockFormat(format)) {
+        node = format.wrapper ? null : dom.getParent(container, format.block, root);
+      }
+      if (!node) {
+        const scopeRoot = dom.getParent(container, 'LI,TD,TH');
+        node = dom.getParent(isText$8(container) ? container.parentNode : container, node => node !== root && isTextBlock(editor, node), scopeRoot);
+      }
+      if (node && isBlockFormat(format) && format.wrapper) {
+        node = getParents$1(dom, node, 'ul,ol').reverse()[0] || node;
+      }
+      if (!node) {
+        node = container;
+        while (node[siblingName] && !dom.isBlock(node[siblingName])) {
+          node = node[siblingName];
+          if (isEq$5(node, 'br')) {
+            break;
+          }
+        }
+      }
+      return node || container;
+    };
+    const isAtBlockBoundary$1 = (dom, root, container, siblingName) => {
+      const parent = container.parentNode;
+      if (isNonNullable(container[siblingName])) {
+        return false;
+      } else if (parent === root || isNullable(parent) || dom.isBlock(parent)) {
+        return true;
+      } else {
+        return isAtBlockBoundary$1(dom, root, parent, siblingName);
+      }
+    };
+    const findParentContainer = (dom, formatList, container, offset, start) => {
+      let parent = container;
+      const siblingName = start ? 'previousSibling' : 'nextSibling';
+      const root = dom.getRoot();
+      if (isText$8(container) && !isWhiteSpaceNode(container)) {
+        if (start ? offset > 0 : offset < container.data.length) {
+          return container;
+        }
+      }
+      while (true) {
+        if (!formatList[0].block_expand && dom.isBlock(parent)) {
+          return parent;
+        }
+        for (let sibling = parent[siblingName]; sibling; sibling = sibling[siblingName]) {
+          const allowSpaces = isText$8(sibling) && !isAtBlockBoundary$1(dom, root, sibling, siblingName);
+          if (!isBookmarkNode(sibling) && !isBogusBr(sibling) && !isWhiteSpaceNode(sibling, allowSpaces)) {
+            return parent;
+          }
+        }
+        if (parent === root || parent.parentNode === root) {
+          container = parent;
+          break;
+        }
+        parent = parent.parentNode;
+      }
+      return container;
+    };
+    const isSelfOrParentBookmark = container => isBookmarkNode(container.parentNode) || isBookmarkNode(container);
+    const expandRng = (editor, rng, formatList, includeTrailingSpace = false) => {
+      let {startContainer, startOffset, endContainer, endOffset} = rng;
+      const dom = editor.dom;
+      const format = formatList[0];
+      if (isElement$6(startContainer) && startContainer.hasChildNodes()) {
+        startContainer = getNode$1(startContainer, startOffset);
+        if (isText$8(startContainer)) {
+          startOffset = 0;
+        }
+      }
+      if (isElement$6(endContainer) && endContainer.hasChildNodes()) {
+        endContainer = getNode$1(endContainer, rng.collapsed ? endOffset : endOffset - 1);
+        if (isText$8(endContainer)) {
+          endOffset = endContainer.nodeValue.length;
+        }
+      }
+      startContainer = findParentContentEditable(dom, startContainer);
+      endContainer = findParentContentEditable(dom, endContainer);
+      if (isSelfOrParentBookmark(startContainer)) {
+        startContainer = isBookmarkNode(startContainer) ? startContainer : startContainer.parentNode;
+        if (rng.collapsed) {
+          startContainer = startContainer.previousSibling || startContainer;
+        } else {
+          startContainer = startContainer.nextSibling || startContainer;
+        }
+        if (isText$8(startContainer)) {
+          startOffset = rng.collapsed ? startContainer.length : 0;
+        }
+      }
+      if (isSelfOrParentBookmark(endContainer)) {
+        endContainer = isBookmarkNode(endContainer) ? endContainer : endContainer.parentNode;
+        if (rng.collapsed) {
+          endContainer = endContainer.nextSibling || endContainer;
+        } else {
+          endContainer = endContainer.previousSibling || endContainer;
+        }
+        if (isText$8(endContainer)) {
+          endOffset = rng.collapsed ? 0 : endContainer.length;
+        }
+      }
+      if (rng.collapsed) {
+        const startPoint = findWordEndPoint(dom, editor.getBody(), startContainer, startOffset, true, includeTrailingSpace);
+        startPoint.each(({container, offset}) => {
+          startContainer = container;
+          startOffset = offset;
+        });
+        const endPoint = findWordEndPoint(dom, editor.getBody(), endContainer, endOffset, false, includeTrailingSpace);
+        endPoint.each(({container, offset}) => {
+          endContainer = container;
+          endOffset = offset;
+        });
+      }
+      if (isInlineFormat(format) || format.block_expand) {
+        if (!isInlineFormat(format) || (!isText$8(startContainer) || startOffset === 0)) {
+          startContainer = findParentContainer(dom, formatList, startContainer, startOffset, true);
+        }
+        if (!isInlineFormat(format) || (!isText$8(endContainer) || endOffset === endContainer.nodeValue.length)) {
+          endContainer = findParentContainer(dom, formatList, endContainer, endOffset, false);
+        }
+      }
+      if (shouldExpandToSelector(format)) {
+        startContainer = findSelectorEndPoint(dom, formatList, rng, startContainer, 'previousSibling');
+        endContainer = findSelectorEndPoint(dom, formatList, rng, endContainer, 'nextSibling');
+      }
+      if (isBlockFormat(format) || isSelectorFormat(format)) {
+        startContainer = findBlockEndPoint(editor, formatList, startContainer, 'previousSibling');
+        endContainer = findBlockEndPoint(editor, formatList, endContainer, 'nextSibling');
+        if (isBlockFormat(format)) {
+          if (!dom.isBlock(startContainer)) {
+            startContainer = findParentContainer(dom, formatList, startContainer, startOffset, true);
+          }
+          if (!dom.isBlock(endContainer)) {
+            endContainer = findParentContainer(dom, formatList, endContainer, endOffset, false);
+          }
+        }
+      }
+      if (isElement$6(startContainer)) {
+        startOffset = dom.nodeIndex(startContainer);
+        startContainer = startContainer.parentNode;
+      }
+      if (isElement$6(endContainer)) {
+        endOffset = dom.nodeIndex(endContainer) + 1;
+        endContainer = endContainer.parentNode;
+      }
+      return {
+        startContainer,
+        startOffset,
+        endContainer,
+        endOffset
+      };
+    };
+
+    const walk$3 = (dom, rng, callback) => {
+      const startOffset = rng.startOffset;
+      const startContainer = getNode$1(rng.startContainer, startOffset);
+      const endOffset = rng.endOffset;
+      const endContainer = getNode$1(rng.endContainer, endOffset - 1);
+      const exclude = nodes => {
+        const firstNode = nodes[0];
+        if (isText$8(firstNode) && firstNode === startContainer && startOffset >= firstNode.data.length) {
+          nodes.splice(0, 1);
+        }
+        const lastNode = nodes[nodes.length - 1];
+        if (endOffset === 0 && nodes.length > 0 && lastNode === endContainer && isText$8(lastNode)) {
+          nodes.splice(nodes.length - 1, 1);
+        }
+        return nodes;
+      };
+      const collectSiblings = (node, name, endNode) => {
+        const siblings = [];
+        for (; node && node !== endNode; node = node[name]) {
+          siblings.push(node);
+        }
+        return siblings;
+      };
+      const findEndPoint = (node, root) => dom.getParent(node, node => node.parentNode === root, root);
+      const walkBoundary = (startNode, endNode, next) => {
+        const siblingName = next ? 'nextSibling' : 'previousSibling';
+        for (let node = startNode, parent = node.parentNode; node && node !== endNode; node = parent) {
+          parent = node.parentNode;
+          const siblings = collectSiblings(node === startNode ? node : node[siblingName], siblingName);
+          if (siblings.length) {
+            if (!next) {
+              siblings.reverse();
+            }
+            callback(exclude(siblings));
+          }
+        }
+      };
+      if (startContainer === endContainer) {
+        return callback(exclude([startContainer]));
+      }
+      const ancestor = dom.findCommonAncestor(startContainer, endContainer);
+      if (dom.isChildOf(startContainer, endContainer)) {
+        return walkBoundary(startContainer, ancestor, true);
+      }
+      if (dom.isChildOf(endContainer, startContainer)) {
+        return walkBoundary(endContainer, ancestor);
+      }
+      const startPoint = findEndPoint(startContainer, ancestor) || startContainer;
+      const endPoint = findEndPoint(endContainer, ancestor) || endContainer;
+      walkBoundary(startContainer, startPoint, true);
+      const siblings = collectSiblings(startPoint === startContainer ? startPoint : startPoint.nextSibling, 'nextSibling', endPoint === endContainer ? endPoint.nextSibling : endPoint);
+      if (siblings.length) {
+        callback(exclude(siblings));
+      }
+      walkBoundary(endContainer, endPoint);
+    };
+
+    const getRanges$1 = selection => {
+      const ranges = [];
+      if (selection) {
+        for (let i = 0; i < selection.rangeCount; i++) {
+          ranges.push(selection.getRangeAt(i));
+        }
+      }
+      return ranges;
+    };
+    const getSelectedNodes = ranges => {
+      return bind$3(ranges, range => {
+        const node = getSelectedNode(range);
+        return node ? [SugarElement.fromDom(node)] : [];
+      });
+    };
+    const hasMultipleRanges = selection => {
+      return getRanges$1(selection).length > 1;
+    };
+
+    const getCellsFromRanges = ranges => filter$6(getSelectedNodes(ranges), isTableCell$4);
+    const getCellsFromElement = elm => descendants(elm, 'td[data-mce-selected],th[data-mce-selected]');
+    const getCellsFromElementOrRanges = (ranges, element) => {
+      const selectedCells = getCellsFromElement(element);
+      return selectedCells.length > 0 ? selectedCells : getCellsFromRanges(ranges);
+    };
+    const getCellsFromEditor = editor => getCellsFromElementOrRanges(getRanges$1(editor.selection.getSel()), SugarElement.fromDom(editor.getBody()));
+    const getClosestTable = (cell, isRoot) => ancestor$2(cell, 'table', isRoot);
+
+    const getStartNode = rng => {
+      const sc = rng.startContainer, so = rng.startOffset;
+      if (isText$8(sc)) {
+        return so === 0 ? Optional.some(SugarElement.fromDom(sc)) : Optional.none();
+      } else {
+        return Optional.from(sc.childNodes[so]).map(SugarElement.fromDom);
+      }
+    };
+    const getEndNode = rng => {
+      const ec = rng.endContainer, eo = rng.endOffset;
+      if (isText$8(ec)) {
+        return eo === ec.data.length ? Optional.some(SugarElement.fromDom(ec)) : Optional.none();
+      } else {
+        return Optional.from(ec.childNodes[eo - 1]).map(SugarElement.fromDom);
+      }
+    };
+    const getFirstChildren = node => {
+      return firstChild(node).fold(constant([node]), child => {
+        return [node].concat(getFirstChildren(child));
+      });
+    };
+    const getLastChildren$1 = node => {
+      return lastChild(node).fold(constant([node]), child => {
+        if (name(child) === 'br') {
+          return prevSibling(child).map(sibling => {
+            return [node].concat(getLastChildren$1(sibling));
+          }).getOr([]);
+        } else {
+          return [node].concat(getLastChildren$1(child));
+        }
+      });
+    };
+    const hasAllContentsSelected = (elm, rng) => {
+      return lift2(getStartNode(rng), getEndNode(rng), (startNode, endNode) => {
+        const start = find$2(getFirstChildren(elm), curry(eq, startNode));
+        const end = find$2(getLastChildren$1(elm), curry(eq, endNode));
+        return start.isSome() && end.isSome();
+      }).getOr(false);
+    };
+    const moveEndPoint = (dom, rng, node, start) => {
+      const root = node, walker = new DomTreeWalker(node, root);
+      const moveCaretBeforeOnEnterElementsMap = filter$5(dom.schema.getMoveCaretBeforeOnEnterElements(), (_, name) => !contains$2([
+        'td',
+        'th',
+        'table'
+      ], name.toLowerCase()));
+      do {
+        if (isText$8(node) && Tools.trim(node.nodeValue).length !== 0) {
+          if (start) {
+            rng.setStart(node, 0);
+          } else {
+            rng.setEnd(node, node.nodeValue.length);
+          }
+          return;
+        }
+        if (moveCaretBeforeOnEnterElementsMap[node.nodeName]) {
+          if (start) {
+            rng.setStartBefore(node);
+          } else {
+            if (node.nodeName === 'BR') {
+              rng.setEndBefore(node);
+            } else {
+              rng.setEndAfter(node);
+            }
+          }
+          return;
+        }
+      } while (node = start ? walker.next() : walker.prev());
+      if (root.nodeName === 'BODY') {
+        if (start) {
+          rng.setStart(root, 0);
+        } else {
+          rng.setEnd(root, root.childNodes.length);
+        }
+      }
+    };
+    const hasAnyRanges = editor => {
+      const sel = editor.selection.getSel();
+      return sel && sel.rangeCount > 0;
+    };
+    const runOnRanges = (editor, executor) => {
+      const fakeSelectionNodes = getCellsFromEditor(editor);
+      if (fakeSelectionNodes.length > 0) {
+        each$g(fakeSelectionNodes, elem => {
+          const node = elem.dom;
+          const fakeNodeRng = editor.dom.createRng();
+          fakeNodeRng.setStartBefore(node);
+          fakeNodeRng.setEndAfter(node);
+          executor(fakeNodeRng, true);
+        });
+      } else {
+        executor(editor.selection.getRng(), false);
+      }
+    };
+    const preserve = (selection, fillBookmark, executor) => {
+      const bookmark = getPersistentBookmark(selection, fillBookmark);
+      executor(bookmark);
+      selection.moveToBookmark(bookmark);
+    };
+
+    const NodeValue = (is, name) => {
+      const get = element => {
+        if (!is(element)) {
+          throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
+        }
+        return getOption(element).getOr('');
+      };
+      const getOption = element => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();
+      const set = (element, value) => {
+        if (!is(element)) {
+          throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
+        }
+        element.dom.nodeValue = value;
+      };
+      return {
+        get,
+        getOption,
+        set
+      };
+    };
+
+    const api$1 = NodeValue(isText$9, 'text');
+    const get$3 = element => api$1.get(element);
+    const getOption = element => api$1.getOption(element);
+
+    const isZeroWidth = elem => isText$9(elem) && get$3(elem) === ZWSP$1;
+    const context = (editor, elem, wrapName, nodeName) => parent(elem).fold(() => 'skipping', parent => {
+      if (nodeName === 'br' || isZeroWidth(elem)) {
+        return 'valid';
+      } else if (isAnnotation(elem)) {
+        return 'existing';
+      } else if (isCaretNode(elem.dom)) {
+        return 'caret';
+      } else if (!isValid(editor, wrapName, nodeName) || !isValid(editor, name(parent), wrapName)) {
+        return 'invalid-child';
+      } else {
+        return 'valid';
+      }
+    });
+
+    const applyWordGrab = (editor, rng) => {
+      const r = expandRng(editor, rng, [{ inline: 'span' }]);
+      rng.setStart(r.startContainer, r.startOffset);
+      rng.setEnd(r.endContainer, r.endOffset);
+      editor.selection.setRng(rng);
+    };
+    const makeAnnotation = (eDoc, {uid = generate$1('mce-annotation'), ...data}, annotationName, decorate) => {
+      const master = SugarElement.fromTag('span', eDoc);
+      add$2(master, annotation());
+      set$2(master, `${ dataAnnotationId() }`, uid);
+      set$2(master, `${ dataAnnotation() }`, annotationName);
+      const {attributes = {}, classes = []} = decorate(uid, data);
+      setAll$1(master, attributes);
+      add(master, classes);
+      return master;
+    };
+    const annotate = (editor, rng, annotationName, decorate, data) => {
+      const newWrappers = [];
+      const master = makeAnnotation(editor.getDoc(), data, annotationName, decorate);
+      const wrapper = value$2();
+      const finishWrapper = () => {
+        wrapper.clear();
+      };
+      const getOrOpenWrapper = () => wrapper.get().getOrThunk(() => {
+        const nu = shallow$1(master);
+        newWrappers.push(nu);
+        wrapper.set(nu);
+        return nu;
+      });
+      const processElements = elems => {
+        each$g(elems, processElement);
+      };
+      const processElement = elem => {
+        const ctx = context(editor, elem, 'span', name(elem));
+        switch (ctx) {
+        case 'invalid-child': {
+            finishWrapper();
+            const children$1 = children(elem);
+            processElements(children$1);
+            finishWrapper();
+            break;
+          }
+        case 'valid': {
+            const w = getOrOpenWrapper();
+            wrap$2(elem, w);
+            break;
+          }
+        }
+      };
+      const processNodes = nodes => {
+        const elems = map$3(nodes, SugarElement.fromDom);
+        processElements(elems);
+      };
+      walk$3(editor.dom, rng, nodes => {
+        finishWrapper();
+        processNodes(nodes);
+      });
+      return newWrappers;
+    };
+    const annotateWithBookmark = (editor, name, settings, data) => {
+      editor.undoManager.transact(() => {
+        const selection = editor.selection;
+        const initialRng = selection.getRng();
+        const hasFakeSelection = getCellsFromEditor(editor).length > 0;
+        if (initialRng.collapsed && !hasFakeSelection) {
+          applyWordGrab(editor, initialRng);
+        }
+        if (selection.getRng().collapsed && !hasFakeSelection) {
+          const wrapper = makeAnnotation(editor.getDoc(), data, name, settings.decorate);
+          set(wrapper, nbsp);
+          selection.getRng().insertNode(wrapper.dom);
+          selection.select(wrapper.dom);
+        } else {
+          preserve(selection, false, () => {
+            runOnRanges(editor, selectionRng => {
+              annotate(editor, selectionRng, name, settings.decorate, data);
+            });
+          });
+        }
+      });
+    };
+
+    const Annotator = editor => {
+      const registry = create$b();
+      setup$w(editor, registry);
+      const changes = setup$x(editor, registry);
+      return {
+        register: (name, settings) => {
+          registry.register(name, settings);
+        },
+        annotate: (name, data) => {
+          registry.lookup(name).each(settings => {
+            annotateWithBookmark(editor, name, settings, data);
+          });
+        },
+        annotationChanged: (name, callback) => {
+          changes.addListener(name, callback);
+        },
+        remove: name => {
+          const bookmark = editor.selection.getBookmark();
+          identify(editor, Optional.some(name)).each(({elements}) => {
+            each$g(elements, unwrap);
+          });
+          editor.selection.moveToBookmark(bookmark);
+        },
+        removeAll: name => {
+          const bookmark = editor.selection.getBookmark();
+          each$f(findAll(editor, name), (spans, _) => each$g(spans, unwrap));
+          editor.selection.moveToBookmark(bookmark);
+        },
+        getAll: name => {
+          const directory = findAll(editor, name);
+          return map$2(directory, elems => map$3(elems, elem => elem.dom));
+        }
+      };
+    };
+
+    const BookmarkManager = selection => {
+      return {
+        getBookmark: curry(getBookmark$1, selection),
+        moveToBookmark: curry(moveToBookmark, selection)
+      };
+    };
+    BookmarkManager.isBookmarkNode = isBookmarkNode$1;
+
+    const isXYWithinRange = (clientX, clientY, range) => {
+      if (range.collapsed) {
+        return false;
+      } else {
+        return exists(range.getClientRects(), rect => containsXY(rect, clientX, clientY));
+      }
+    };
+
+    const firePreProcess = (editor, args) => editor.dispatch('PreProcess', args);
+    const firePostProcess = (editor, args) => editor.dispatch('PostProcess', args);
+    const fireRemove = editor => editor.dispatch('remove');
+    const fireDetach = editor => editor.dispatch('detach');
+    const fireSwitchMode = (editor, mode) => editor.dispatch('SwitchMode', { mode });
+    const fireObjectResizeStart = (editor, target, width, height, origin) => {
+      editor.dispatch('ObjectResizeStart', {
+        target,
+        width,
+        height,
+        origin
+      });
+    };
+    const fireObjectResized = (editor, target, width, height, origin) => {
+      editor.dispatch('ObjectResized', {
+        target,
+        width,
+        height,
+        origin
+      });
+    };
+    const firePreInit = editor => editor.dispatch('PreInit');
+    const firePostRender = editor => editor.dispatch('PostRender');
+    const fireInit = editor => editor.dispatch('Init');
+    const firePlaceholderToggle = (editor, state) => editor.dispatch('PlaceholderToggle', { state });
+    const fireError = (editor, errorType, error) => editor.dispatch(errorType, error);
+    const fireFormatApply = (editor, format, node, vars) => editor.dispatch('FormatApply', {
+      format,
+      node,
+      vars
+    });
+    const fireFormatRemove = (editor, format, node, vars) => editor.dispatch('FormatRemove', {
+      format,
+      node,
+      vars
+    });
+    const fireBeforeSetContent = (editor, args) => editor.dispatch('BeforeSetContent', args);
+    const fireSetContent = (editor, args) => editor.dispatch('SetContent', args);
+    const fireBeforeGetContent = (editor, args) => editor.dispatch('BeforeGetContent', args);
+    const fireGetContent = (editor, args) => editor.dispatch('GetContent', args);
+    const fireAutocompleterStart = (editor, args) => editor.dispatch('AutocompleterStart', args);
+    const fireAutocompleterUpdate = (editor, args) => editor.dispatch('AutocompleterUpdate', args);
+    const fireAutocompleterEnd = editor => editor.dispatch('AutocompleterEnd');
+    const firePastePreProcess = (editor, html, internal) => editor.dispatch('PastePreProcess', {
+      content: html,
+      internal
+    });
+    const firePastePostProcess = (editor, node, internal) => editor.dispatch('PastePostProcess', {
+      node,
+      internal
+    });
+    const firePastePlainTextToggle = (editor, state) => editor.dispatch('PastePlainTextToggle', { state });
+
+    const VK = {
+      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: e => {
+        return e.shiftKey || e.ctrlKey || e.altKey || VK.metaKeyPressed(e);
+      },
+      metaKeyPressed: e => {
+        return Env.os.isMacOS() || Env.os.isiOS() ? e.metaKey : e.ctrlKey && !e.altKey;
+      }
+    };
+
+    const ControlSelection = (selection, editor) => {
+      const elementSelectionAttr = 'data-mce-selected';
+      const dom = editor.dom, each = Tools.each;
+      let selectedElm, selectedElmGhost, resizeHelper, selectedHandle, resizeBackdrop;
+      let startX, startY, selectedElmX, selectedElmY, startW, startH, ratio, resizeStarted;
+      let width, height;
+      const editableDoc = editor.getDoc(), rootDocument = document;
+      const abs = Math.abs, round = Math.round, rootElement = editor.getBody();
+      let startScrollWidth, startScrollHeight;
+      const resizeHandles = {
+        nw: [
+          0,
+          0,
+          -1,
+          -1
+        ],
+        ne: [
+          1,
+          0,
+          1,
+          -1
+        ],
+        se: [
+          1,
+          1,
+          1,
+          1
+        ],
+        sw: [
+          0,
+          1,
+          -1,
+          1
+        ]
+      };
+      const isImage = elm => isNonNullable(elm) && (isImg(elm) || editor.dom.is(elm, 'figure.image'));
+      const isMedia = elm => isMedia$2(elm) || dom.hasClass(elm, 'mce-preview-object');
+      const isEventOnImageOutsideRange = (evt, range) => {
+        if (evt.type === 'longpress' || evt.type.indexOf('touch') === 0) {
+          const touch = evt.touches[0];
+          return isImage(evt.target) && !isXYWithinRange(touch.clientX, touch.clientY, range);
+        } else {
+          return isImage(evt.target) && !isXYWithinRange(evt.clientX, evt.clientY, range);
+        }
+      };
+      const contextMenuSelectImage = evt => {
+        const target = evt.target;
+        if (isEventOnImageOutsideRange(evt, editor.selection.getRng()) && !evt.isDefaultPrevented()) {
+          editor.selection.select(target);
+        }
+      };
+      const getResizeTargets = elm => {
+        if (dom.is(elm, 'figure.image')) {
+          return [elm.querySelector('img')];
+        } else if (dom.hasClass(elm, 'mce-preview-object') && isNonNullable(elm.firstElementChild)) {
+          return [
+            elm,
+            elm.firstElementChild
+          ];
+        } else {
+          return [elm];
+        }
+      };
+      const isResizable = elm => {
+        const selector = getObjectResizing(editor);
+        if (!selector) {
+          return false;
+        }
+        if (elm.getAttribute('data-mce-resize') === 'false') {
+          return false;
+        }
+        if (elm === editor.getBody()) {
+          return false;
+        }
+        if (dom.hasClass(elm, 'mce-preview-object')) {
+          return is$1(SugarElement.fromDom(elm.firstElementChild), selector);
+        } else {
+          return is$1(SugarElement.fromDom(elm), selector);
+        }
+      };
+      const createGhostElement = elm => {
+        if (isMedia(elm)) {
+          return dom.create('img', { src: Env.transparentSrc });
+        } else {
+          return elm.cloneNode(true);
+        }
+      };
+      const setSizeProp = (element, name, value) => {
+        if (isNonNullable(value)) {
+          const targets = getResizeTargets(element);
+          each$g(targets, target => {
+            if (target.style[name] || !editor.schema.isValid(target.nodeName.toLowerCase(), name)) {
+              dom.setStyle(target, name, value);
+            } else {
+              dom.setAttrib(target, name, '' + value);
+            }
+          });
+        }
+      };
+      const setGhostElmSize = (ghostElm, width, height) => {
+        setSizeProp(ghostElm, 'width', width);
+        setSizeProp(ghostElm, 'height', height);
+      };
+      const resizeGhostElement = e => {
+        let deltaX, deltaY, proportional;
+        let resizeHelperX, resizeHelperY;
+        deltaX = e.screenX - startX;
+        deltaY = e.screenY - startY;
+        width = deltaX * selectedHandle[2] + startW;
+        height = deltaY * selectedHandle[3] + startH;
+        width = width < 5 ? 5 : width;
+        height = height < 5 ? 5 : height;
+        if ((isImage(selectedElm) || isMedia(selectedElm)) && getResizeImgProportional(editor) !== false) {
+          proportional = !VK.modifierPressed(e);
+        } else {
+          proportional = VK.modifierPressed(e);
+        }
+        if (proportional) {
+          if (abs(deltaX) > abs(deltaY)) {
+            height = round(width * ratio);
+            width = round(height / ratio);
+          } else {
+            width = round(height / ratio);
+            height = round(width * ratio);
+          }
+        }
+        setGhostElmSize(selectedElmGhost, width, height);
+        resizeHelperX = selectedHandle.startPos.x + deltaX;
+        resizeHelperY = selectedHandle.startPos.y + deltaY;
+        resizeHelperX = resizeHelperX > 0 ? resizeHelperX : 0;
+        resizeHelperY = resizeHelperY > 0 ? resizeHelperY : 0;
+        dom.setStyles(resizeHelper, {
+          left: resizeHelperX,
+          top: resizeHelperY,
+          display: 'block'
+        });
+        resizeHelper.innerHTML = width + ' &times; ' + height;
+        if (selectedHandle[2] < 0 && selectedElmGhost.clientWidth <= width) {
+          dom.setStyle(selectedElmGhost, 'left', selectedElmX + (startW - width));
+        }
+        if (selectedHandle[3] < 0 && selectedElmGhost.clientHeight <= height) {
+          dom.setStyle(selectedElmGhost, 'top', selectedElmY + (startH - height));
+        }
+        deltaX = rootElement.scrollWidth - startScrollWidth;
+        deltaY = rootElement.scrollHeight - startScrollHeight;
+        if (deltaX + deltaY !== 0) {
+          dom.setStyles(resizeHelper, {
+            left: resizeHelperX - deltaX,
+            top: resizeHelperY - deltaY
+          });
+        }
+        if (!resizeStarted) {
+          fireObjectResizeStart(editor, selectedElm, startW, startH, 'corner-' + selectedHandle.name);
+          resizeStarted = true;
+        }
+      };
+      const endGhostResize = () => {
+        const wasResizeStarted = resizeStarted;
+        resizeStarted = false;
+        if (wasResizeStarted) {
+          setSizeProp(selectedElm, 'width', width);
+          setSizeProp(selectedElm, 'height', height);
+        }
+        dom.unbind(editableDoc, 'mousemove', resizeGhostElement);
+        dom.unbind(editableDoc, 'mouseup', endGhostResize);
+        if (rootDocument !== editableDoc) {
+          dom.unbind(rootDocument, 'mousemove', resizeGhostElement);
+          dom.unbind(rootDocument, 'mouseup', endGhostResize);
+        }
+        dom.remove(selectedElmGhost);
+        dom.remove(resizeHelper);
+        dom.remove(resizeBackdrop);
+        showResizeRect(selectedElm);
+        if (wasResizeStarted) {
+          fireObjectResized(editor, selectedElm, width, height, 'corner-' + selectedHandle.name);
+          dom.setAttrib(selectedElm, 'style', dom.getAttrib(selectedElm, 'style'));
+        }
+        editor.nodeChanged();
+      };
+      const showResizeRect = targetElm => {
+        unbindResizeHandleEvents();
+        const position = dom.getPos(targetElm, rootElement);
+        const selectedElmX = position.x;
+        const selectedElmY = position.y;
+        const rect = targetElm.getBoundingClientRect();
+        const targetWidth = rect.width || rect.right - rect.left;
+        const targetHeight = rect.height || rect.bottom - rect.top;
+        if (selectedElm !== targetElm) {
+          hideResizeRect();
+          selectedElm = targetElm;
+          width = height = 0;
+        }
+        const e = editor.dispatch('ObjectSelected', { target: targetElm });
+        const selectedValue = dom.getAttrib(selectedElm, elementSelectionAttr, '1');
+        if (isResizable(targetElm) && !e.isDefaultPrevented()) {
+          each(resizeHandles, (handle, name) => {
+            let handleElm;
+            const startDrag = e => {
+              const target = getResizeTargets(selectedElm)[0];
+              startX = e.screenX;
+              startY = e.screenY;
+              startW = target.clientWidth;
+              startH = target.clientHeight;
+              ratio = startH / startW;
+              selectedHandle = handle;
+              selectedHandle.name = name;
+              selectedHandle.startPos = {
+                x: targetWidth * handle[0] + selectedElmX,
+                y: targetHeight * handle[1] + selectedElmY
+              };
+              startScrollWidth = rootElement.scrollWidth;
+              startScrollHeight = rootElement.scrollHeight;
+              resizeBackdrop = dom.add(rootElement, 'div', {
+                'class': 'mce-resize-backdrop',
+                'data-mce-bogus': 'all'
+              });
+              dom.setStyles(resizeBackdrop, {
+                position: 'fixed',
+                left: '0',
+                top: '0',
+                width: '100%',
+                height: '100%'
+              });
+              selectedElmGhost = createGhostElement(selectedElm);
+              dom.addClass(selectedElmGhost, 'mce-clonedresizable');
+              dom.setAttrib(selectedElmGhost, 'data-mce-bogus', 'all');
+              selectedElmGhost.contentEditable = 'false';
+              dom.setStyles(selectedElmGhost, {
+                left: selectedElmX,
+                top: selectedElmY,
+                margin: 0
+              });
+              setGhostElmSize(selectedElmGhost, targetWidth, targetHeight);
+              selectedElmGhost.removeAttribute(elementSelectionAttr);
+              rootElement.appendChild(selectedElmGhost);
+              dom.bind(editableDoc, 'mousemove', resizeGhostElement);
+              dom.bind(editableDoc, 'mouseup', endGhostResize);
+              if (rootDocument !== editableDoc) {
+                dom.bind(rootDocument, 'mousemove', resizeGhostElement);
+                dom.bind(rootDocument, 'mouseup', endGhostResize);
+              }
+              resizeHelper = dom.add(rootElement, 'div', {
+                'class': 'mce-resize-helper',
+                'data-mce-bogus': 'all'
+              }, startW + ' &times; ' + startH);
+            };
+            handleElm = dom.get('mceResizeHandle' + name);
+            if (handleElm) {
+              dom.remove(handleElm);
+            }
+            handleElm = dom.add(rootElement, 'div', {
+              'id': 'mceResizeHandle' + name,
+              'data-mce-bogus': 'all',
+              'class': 'mce-resizehandle',
+              'unselectable': true,
+              'style': 'cursor:' + name + '-resize; margin:0; padding:0'
+            });
+            dom.bind(handleElm, 'mousedown', e => {
+              e.stopImmediatePropagation();
+              e.preventDefault();
+              startDrag(e);
+            });
+            handle.elm = handleElm;
+            dom.setStyles(handleElm, {
+              left: targetWidth * handle[0] + selectedElmX - handleElm.offsetWidth / 2,
+              top: targetHeight * handle[1] + selectedElmY - handleElm.offsetHeight / 2
+            });
+          });
+        } else {
+          hideResizeRect();
+        }
+        if (!dom.getAttrib(selectedElm, elementSelectionAttr)) {
+          selectedElm.setAttribute(elementSelectionAttr, selectedValue);
+        }
+      };
+      const hideResizeRect = () => {
+        unbindResizeHandleEvents();
+        if (selectedElm) {
+          selectedElm.removeAttribute(elementSelectionAttr);
+        }
+        each$f(resizeHandles, (value, name) => {
+          const handleElm = dom.get('mceResizeHandle' + name);
+          if (handleElm) {
+            dom.unbind(handleElm);
+            dom.remove(handleElm);
+          }
+        });
+      };
+      const updateResizeRect = e => {
+        var _a;
+        let startElm, controlElm;
+        const isChildOrEqual = (node, parent) => {
+          if (node) {
+            do {
+              if (node === parent) {
+                return true;
+              }
+            } while (node = node.parentNode);
+          }
+        };
+        if (resizeStarted || editor.removed) {
+          return;
+        }
+        each(dom.select('img[data-mce-selected],hr[data-mce-selected]'), img => {
+          img.removeAttribute(elementSelectionAttr);
+        });
+        controlElm = e.type === 'mousedown' ? e.target : selection.getNode();
+        controlElm = (_a = closest$3(SugarElement.fromDom(controlElm), 'table,img,figure.image,hr,video,span.mce-preview-object').getOrUndefined()) === null || _a === void 0 ? void 0 : _a.dom;
+        if (isChildOrEqual(controlElm, rootElement)) {
+          disableGeckoResize();
+          startElm = selection.getStart(true);
+          if (isChildOrEqual(startElm, controlElm) && isChildOrEqual(selection.getEnd(true), controlElm)) {
+            showResizeRect(controlElm);
+            return;
+          }
+        }
+        hideResizeRect();
+      };
+      const unbindResizeHandleEvents = () => {
+        each$f(resizeHandles, handle => {
+          if (handle.elm) {
+            dom.unbind(handle.elm);
+            delete handle.elm;
+          }
+        });
+      };
+      const disableGeckoResize = () => {
+        try {
+          editor.getDoc().execCommand('enableObjectResizing', false, 'false');
+        } catch (ex) {
+        }
+      };
+      editor.on('init', () => {
+        disableGeckoResize();
+        const throttledUpdateResizeRect = first$1(e => {
+          if (!editor.composing) {
+            updateResizeRect(e);
+          }
+        }, 0);
+        editor.on('nodechange ResizeEditor ResizeWindow ResizeContent drop FullscreenStateChanged', throttledUpdateResizeRect.throttle);
+        editor.on('keyup compositionend', e => {
+          if (selectedElm && selectedElm.nodeName === 'TABLE') {
+            throttledUpdateResizeRect.throttle(e);
+          }
+        });
+        editor.on('hide blur', hideResizeRect);
+        editor.on('contextmenu longpress', contextMenuSelectImage, true);
+      });
+      editor.on('remove', unbindResizeHandleEvents);
+      const destroy = () => {
+        selectedElm = selectedElmGhost = resizeBackdrop = null;
+      };
+      return {
+        isResizable,
+        showResizeRect,
+        hideResizeRect,
+        updateResizeRect,
+        destroy
+      };
+    };
+
+    const setStart = (rng, situ) => {
+      situ.fold(e => {
+        rng.setStartBefore(e.dom);
+      }, (e, o) => {
+        rng.setStart(e.dom, o);
+      }, e => {
+        rng.setStartAfter(e.dom);
+      });
+    };
+    const setFinish = (rng, situ) => {
+      situ.fold(e => {
+        rng.setEndBefore(e.dom);
+      }, (e, o) => {
+        rng.setEnd(e.dom, o);
+      }, e => {
+        rng.setEndAfter(e.dom);
+      });
+    };
+    const relativeToNative = (win, startSitu, finishSitu) => {
+      const range = win.document.createRange();
+      setStart(range, startSitu);
+      setFinish(range, finishSitu);
+      return range;
+    };
+    const exactToNative = (win, start, soffset, finish, foffset) => {
+      const rng = win.document.createRange();
+      rng.setStart(start.dom, soffset);
+      rng.setEnd(finish.dom, foffset);
+      return rng;
+    };
+
+    const adt$3 = Adt.generate([
+      {
+        ltr: [
+          'start',
+          'soffset',
+          'finish',
+          'foffset'
+        ]
+      },
+      {
+        rtl: [
+          'start',
+          'soffset',
+          'finish',
+          'foffset'
+        ]
+      }
+    ]);
+    const fromRange = (win, type, range) => type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);
+    const getRanges = (win, selection) => selection.match({
+      domRange: rng => {
+        return {
+          ltr: constant(rng),
+          rtl: Optional.none
+        };
+      },
+      relative: (startSitu, finishSitu) => {
+        return {
+          ltr: cached(() => relativeToNative(win, startSitu, finishSitu)),
+          rtl: cached(() => Optional.some(relativeToNative(win, finishSitu, startSitu)))
+        };
+      },
+      exact: (start, soffset, finish, foffset) => {
+        return {
+          ltr: cached(() => exactToNative(win, start, soffset, finish, foffset)),
+          rtl: cached(() => Optional.some(exactToNative(win, finish, foffset, start, soffset)))
+        };
+      }
+    });
+    const doDiagnose = (win, ranges) => {
+      const rng = ranges.ltr();
+      if (rng.collapsed) {
+        const reversed = ranges.rtl().filter(rev => rev.collapsed === false);
+        return reversed.map(rev => adt$3.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset)).getOrThunk(() => fromRange(win, adt$3.ltr, rng));
+      } else {
+        return fromRange(win, adt$3.ltr, rng);
+      }
+    };
+    const diagnose = (win, selection) => {
+      const ranges = getRanges(win, selection);
+      return doDiagnose(win, ranges);
+    };
+    adt$3.ltr;
+    adt$3.rtl;
+
+    const create$9 = (start, soffset, finish, foffset) => ({
+      start,
+      soffset,
+      finish,
+      foffset
+    });
+    const SimRange = { create: create$9 };
+
+    const caretPositionFromPoint = (doc, x, y) => {
+      var _a, _b;
+      return Optional.from((_b = (_a = doc.dom).caretPositionFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y)).bind(pos => {
+        if (pos.offsetNode === null) {
+          return Optional.none();
+        }
+        const r = doc.dom.createRange();
+        r.setStart(pos.offsetNode, pos.offset);
+        r.collapse();
+        return Optional.some(r);
+      });
+    };
+    const caretRangeFromPoint = (doc, x, y) => {
+      var _a, _b;
+      return Optional.from((_b = (_a = doc.dom).caretRangeFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y));
+    };
+    const availableSearch = (() => {
+      if (document.caretPositionFromPoint) {
+        return caretPositionFromPoint;
+      } else if (document.caretRangeFromPoint) {
+        return caretRangeFromPoint;
+      } else {
+        return Optional.none;
+      }
+    })();
+    const fromPoint$1 = (win, x, y) => {
+      const doc = SugarElement.fromDom(win.document);
+      return availableSearch(doc, x, y).map(rng => SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset));
+    };
+
+    const adt$2 = Adt.generate([
+      { before: ['element'] },
+      {
+        on: [
+          'element',
+          'offset'
+        ]
+      },
+      { after: ['element'] }
+    ]);
+    const cata = (subject, onBefore, onOn, onAfter) => subject.fold(onBefore, onOn, onAfter);
+    const getStart$2 = situ => situ.fold(identity, identity, identity);
+    const before$1 = adt$2.before;
+    const on = adt$2.on;
+    const after$1 = adt$2.after;
+    const Situ = {
+      before: before$1,
+      on,
+      after: after$1,
+      cata,
+      getStart: getStart$2
+    };
+
+    const adt$1 = Adt.generate([
+      { domRange: ['rng'] },
+      {
+        relative: [
+          'startSitu',
+          'finishSitu'
+        ]
+      },
+      {
+        exact: [
+          'start',
+          'soffset',
+          'finish',
+          'foffset'
+        ]
+      }
+    ]);
+    const exactFromRange = simRange => adt$1.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);
+    const getStart$1 = selection => selection.match({
+      domRange: rng => SugarElement.fromDom(rng.startContainer),
+      relative: (startSitu, _finishSitu) => Situ.getStart(startSitu),
+      exact: (start, _soffset, _finish, _foffset) => start
+    });
+    const domRange = adt$1.domRange;
+    const relative = adt$1.relative;
+    const exact = adt$1.exact;
+    const getWin = selection => {
+      const start = getStart$1(selection);
+      return defaultView(start);
+    };
+    const range = SimRange.create;
+    const SimSelection = {
+      domRange,
+      relative,
+      exact,
+      exactFromRange,
+      getWin,
+      range
+    };
+
+    const beforeSpecial = (element, offset) => {
+      const name$1 = name(element);
+      if ('input' === name$1) {
+        return Situ.after(element);
+      } else if (!contains$2([
+          'br',
+          'img'
+        ], name$1)) {
+        return Situ.on(element, offset);
+      } else {
+        return offset === 0 ? Situ.before(element) : Situ.after(element);
+      }
+    };
+    const preprocessRelative = (startSitu, finishSitu) => {
+      const start = startSitu.fold(Situ.before, beforeSpecial, Situ.after);
+      const finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after);
+      return SimSelection.relative(start, finish);
+    };
+    const preprocessExact = (start, soffset, finish, foffset) => {
+      const startSitu = beforeSpecial(start, soffset);
+      const finishSitu = beforeSpecial(finish, foffset);
+      return SimSelection.relative(startSitu, finishSitu);
+    };
+    const preprocess = selection => selection.match({
+      domRange: rng => {
+        const start = SugarElement.fromDom(rng.startContainer);
+        const finish = SugarElement.fromDom(rng.endContainer);
+        return preprocessExact(start, rng.startOffset, finish, rng.endOffset);
+      },
+      relative: preprocessRelative,
+      exact: preprocessExact
+    });
+
+    const fromElements = (elements, scope) => {
+      const doc = scope || document;
+      const fragment = doc.createDocumentFragment();
+      each$g(elements, element => {
+        fragment.appendChild(element.dom);
+      });
+      return SugarElement.fromDom(fragment);
+    };
+
+    const toNative = selection => {
+      const win = SimSelection.getWin(selection).dom;
+      const getDomRange = (start, soffset, finish, foffset) => exactToNative(win, start, soffset, finish, foffset);
+      const filtered = preprocess(selection);
+      return diagnose(win, filtered).match({
+        ltr: getDomRange,
+        rtl: getDomRange
+      });
+    };
+    const getAtPoint = (win, x, y) => fromPoint$1(win, x, y);
+
+    const fromPoint = (clientX, clientY, doc) => getAtPoint(doc.defaultView, clientX, clientY).map(simRange => {
+      const rng = doc.createRange();
+      rng.setStart(simRange.start.dom, simRange.soffset);
+      rng.setEnd(simRange.finish.dom, simRange.foffset);
+      return rng;
+    }).getOrUndefined();
+
+    const isEq$4 = (rng1, rng2) => {
+      return rng1 && rng2 && (rng1.startContainer === rng2.startContainer && rng1.startOffset === rng2.startOffset) && (rng1.endContainer === rng2.endContainer && rng1.endOffset === rng2.endOffset);
+    };
+
+    const findParent = (node, rootNode, predicate) => {
+      while (node && node !== rootNode) {
+        if (predicate(node)) {
+          return node;
+        }
+        node = node.parentNode;
+      }
+      return null;
+    };
+    const hasParent$1 = (node, rootNode, predicate) => findParent(node, rootNode, predicate) !== null;
+    const hasParentWithName = (node, rootNode, name) => hasParent$1(node, rootNode, node => {
+      return node.nodeName === name;
+    });
+    const isTable = node => node && node.nodeName === 'TABLE';
+    const isTableCell$2 = node => node && /^(TD|TH|CAPTION)$/.test(node.nodeName);
+    const isCeFalseCaretContainer = (node, rootNode) => isCaretContainer$2(node) && hasParent$1(node, rootNode, isCaretNode) === false;
+    const hasBrBeforeAfter = (dom, node, left) => {
+      const walker = new DomTreeWalker(node, dom.getParent(node.parentNode, dom.isBlock) || dom.getRoot());
+      while (node = walker[left ? 'prev' : 'next']()) {
+        if (isBr$5(node)) {
+          return true;
+        }
+      }
+    };
+    const isPrevNode = (node, name) => node.previousSibling && node.previousSibling.nodeName === name;
+    const hasContentEditableFalseParent = (body, node) => {
+      while (node && node !== body) {
+        if (isContentEditableFalse$a(node)) {
+          return true;
+        }
+        node = node.parentNode;
+      }
+      return false;
+    };
+    const findTextNodeRelative = (dom, isAfterNode, collapsed, left, startNode) => {
+      let lastInlineElement;
+      const body = dom.getRoot();
+      let node;
+      const nonEmptyElementsMap = dom.schema.getNonEmptyElements();
+      const parentBlockContainer = dom.getParent(startNode.parentNode, dom.isBlock) || body;
+      if (left && isBr$5(startNode) && isAfterNode && dom.isEmpty(parentBlockContainer)) {
+        return Optional.some(CaretPosition(startNode.parentNode, dom.nodeIndex(startNode)));
+      }
+      const walker = new DomTreeWalker(startNode, parentBlockContainer);
+      while (node = walker[left ? 'prev' : 'next']()) {
+        if (dom.getContentEditableParent(node) === 'false' || isCeFalseCaretContainer(node, body)) {
+          return Optional.none();
+        }
+        if (isText$8(node) && node.nodeValue.length > 0) {
+          if (hasParentWithName(node, body, 'A') === false) {
+            return Optional.some(CaretPosition(node, left ? node.nodeValue.length : 0));
+          }
+          return Optional.none();
+        }
+        if (dom.isBlock(node) || nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
+          return Optional.none();
+        }
+        lastInlineElement = node;
+      }
+      if (collapsed && lastInlineElement) {
+        return Optional.some(CaretPosition(lastInlineElement, 0));
+      }
+      return Optional.none();
+    };
+    const normalizeEndPoint = (dom, collapsed, start, rng) => {
+      let container, offset;
+      const body = dom.getRoot();
+      let node;
+      let directionLeft, normalized = false;
+      container = rng[(start ? 'start' : 'end') + 'Container'];
+      offset = rng[(start ? 'start' : 'end') + 'Offset'];
+      const isAfterNode = isElement$6(container) && offset === container.childNodes.length;
+      const nonEmptyElementsMap = dom.schema.getNonEmptyElements();
+      directionLeft = start;
+      if (isCaretContainer$2(container)) {
+        return Optional.none();
+      }
+      if (isElement$6(container) && offset > container.childNodes.length - 1) {
+        directionLeft = false;
+      }
+      if (isDocument$1(container)) {
+        container = body;
+        offset = 0;
+      }
+      if (container === body) {
+        if (directionLeft) {
+          node = container.childNodes[offset > 0 ? offset - 1 : 0];
+          if (node) {
+            if (isCaretContainer$2(node)) {
+              return Optional.none();
+            }
+            if (nonEmptyElementsMap[node.nodeName] || isTable(node)) {
+              return Optional.none();
+            }
+          }
+        }
+        if (container.hasChildNodes()) {
+          offset = Math.min(!directionLeft && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1);
+          container = container.childNodes[offset];
+          offset = isText$8(container) && isAfterNode ? container.data.length : 0;
+          if (!collapsed && container === body.lastChild && isTable(container)) {
+            return Optional.none();
+          }
+          if (hasContentEditableFalseParent(body, container) || isCaretContainer$2(container)) {
+            return Optional.none();
+          }
+          if (container.hasChildNodes() && isTable(container) === false) {
+            node = container;
+            const walker = new DomTreeWalker(container, body);
+            do {
+              if (isContentEditableFalse$a(node) || isCaretContainer$2(node)) {
+                normalized = false;
+                break;
+              }
+              if (isText$8(node) && node.nodeValue.length > 0) {
+                offset = directionLeft ? 0 : node.nodeValue.length;
+                container = node;
+                normalized = true;
+                break;
+              }
+              if (nonEmptyElementsMap[node.nodeName.toLowerCase()] && !isTableCell$2(node)) {
+                offset = dom.nodeIndex(node);
+                container = node.parentNode;
+                if (!directionLeft) {
+                  offset++;
+                }
+                normalized = true;
+                break;
+              }
+            } while (node = directionLeft ? walker.next() : walker.prev());
+          }
+        }
+      }
+      if (collapsed) {
+        if (isText$8(container) && offset === 0) {
+          findTextNodeRelative(dom, isAfterNode, collapsed, true, container).each(pos => {
+            container = pos.container();
+            offset = pos.offset();
+            normalized = true;
+          });
+        }
+        if (isElement$6(container)) {
+          node = container.childNodes[offset];
+          if (!node) {
+            node = container.childNodes[offset - 1];
+          }
+          if (node && isBr$5(node) && !isPrevNode(node, 'A') && !hasBrBeforeAfter(dom, node, false) && !hasBrBeforeAfter(dom, node, true)) {
+            findTextNodeRelative(dom, isAfterNode, collapsed, true, node).each(pos => {
+              container = pos.container();
+              offset = pos.offset();
+              normalized = true;
+            });
+          }
+        }
+      }
+      if (directionLeft && !collapsed && isText$8(container) && offset === container.nodeValue.length) {
+        findTextNodeRelative(dom, isAfterNode, collapsed, false, container).each(pos => {
+          container = pos.container();
+          offset = pos.offset();
+          normalized = true;
+        });
+      }
+      return normalized ? Optional.some(CaretPosition(container, offset)) : Optional.none();
+    };
+    const normalize$2 = (dom, rng) => {
+      const collapsed = rng.collapsed, normRng = rng.cloneRange();
+      const startPos = CaretPosition.fromRangeStart(rng);
+      normalizeEndPoint(dom, collapsed, true, normRng).each(pos => {
+        if (!collapsed || !CaretPosition.isAbove(startPos, pos)) {
+          normRng.setStart(pos.container(), pos.offset());
+        }
+      });
+      if (!collapsed) {
+        normalizeEndPoint(dom, collapsed, false, normRng).each(pos => {
+          normRng.setEnd(pos.container(), pos.offset());
+        });
+      }
+      if (collapsed) {
+        normRng.collapse(true);
+      }
+      return isEq$4(rng, normRng) ? Optional.none() : Optional.some(normRng);
+    };
+
+    const splitText = (node, offset) => {
+      return node.splitText(offset);
+    };
+    const split = rng => {
+      let startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset;
+      if (startContainer === endContainer && isText$8(startContainer)) {
+        if (startOffset > 0 && startOffset < startContainer.nodeValue.length) {
+          endContainer = splitText(startContainer, startOffset);
+          startContainer = endContainer.previousSibling;
+          if (endOffset > startOffset) {
+            endOffset = endOffset - startOffset;
+            startContainer = endContainer = splitText(endContainer, endOffset).previousSibling;
+            endOffset = endContainer.nodeValue.length;
+            startOffset = 0;
+          } else {
+            endOffset = 0;
+          }
+        }
+      } else {
+        if (isText$8(startContainer) && startOffset > 0 && startOffset < startContainer.nodeValue.length) {
+          startContainer = splitText(startContainer, startOffset);
+          startOffset = 0;
+        }
+        if (isText$8(endContainer) && endOffset > 0 && endOffset < endContainer.nodeValue.length) {
+          endContainer = splitText(endContainer, endOffset).previousSibling;
+          endOffset = endContainer.nodeValue.length;
+        }
+      }
+      return {
+        startContainer,
+        startOffset,
+        endContainer,
+        endOffset
+      };
+    };
+
+    const RangeUtils = dom => {
+      const walk = (rng, callback) => {
+        return walk$3(dom, rng, callback);
+      };
+      const split$1 = split;
+      const normalize = rng => {
+        return normalize$2(dom, rng).fold(never, normalizedRng => {
+          rng.setStart(normalizedRng.startContainer, normalizedRng.startOffset);
+          rng.setEnd(normalizedRng.endContainer, normalizedRng.endOffset);
+          return true;
+        });
+      };
+      return {
+        walk,
+        split: split$1,
+        normalize
+      };
+    };
+    RangeUtils.compareRanges = isEq$4;
+    RangeUtils.getCaretRangeFromPoint = fromPoint;
+    RangeUtils.getSelectedNode = getSelectedNode;
+    RangeUtils.getNode = getNode$1;
+
+    const Dimension = (name, getOffset) => {
+      const set = (element, h) => {
+        if (!isNumber(h) && !h.match(/^[0-9]+$/)) {
+          throw new Error(name + '.set accepts only positive integer values. Value was ' + h);
+        }
+        const dom = element.dom;
+        if (isSupported$1(dom)) {
+          dom.style[name] = h + 'px';
+        }
+      };
+      const get = element => {
+        const r = getOffset(element);
+        if (r <= 0 || r === null) {
+          const css = get$7(element, name);
+          return parseFloat(css) || 0;
+        }
+        return r;
+      };
+      const getOuter = get;
+      const aggregate = (element, properties) => foldl(properties, (acc, property) => {
+        const val = get$7(element, property);
+        const value = val === undefined ? 0 : parseInt(val, 10);
+        return isNaN(value) ? acc : acc + value;
+      }, 0);
+      const max = (element, value, properties) => {
+        const cumulativeInclusions = aggregate(element, properties);
+        const absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;
+        return absoluteMax;
+      };
+      return {
+        set,
+        get,
+        getOuter,
+        aggregate,
+        max
+      };
+    };
+
+    const api = Dimension('height', element => {
+      const dom = element.dom;
+      return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;
+    });
+    const get$2 = element => api.get(element);
+
+    const getDocument = () => SugarElement.fromDom(document);
+
+    const walkUp = (navigation, doc) => {
+      const frame = navigation.view(doc);
+      return frame.fold(constant([]), f => {
+        const parent = navigation.owner(f);
+        const rest = walkUp(navigation, parent);
+        return [f].concat(rest);
+      });
+    };
+    const pathTo = (element, navigation) => {
+      const d = navigation.owner(element);
+      return walkUp(navigation, d);
+    };
+
+    const view = doc => {
+      var _a;
+      const element = doc.dom === document ? Optional.none() : Optional.from((_a = doc.dom.defaultView) === null || _a === void 0 ? void 0 : _a.frameElement);
+      return element.map(SugarElement.fromDom);
+    };
+    const owner = element => documentOrOwner(element);
+
+    var Navigation = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        view: view,
+        owner: owner
+    });
+
+    const find = element => {
+      const doc = getDocument();
+      const scroll = get$5(doc);
+      const frames = pathTo(element, Navigation);
+      const offset = viewport(element);
+      const r = foldr(frames, (b, a) => {
+        const loc = viewport(a);
+        return {
+          left: b.left + loc.left,
+          top: b.top + loc.top
+        };
+      }, {
+        left: 0,
+        top: 0
+      });
+      return SugarPosition(r.left + offset.left + scroll.left, r.top + offset.top + scroll.top);
+    };
+
+    const excludeFromDescend = element => name(element) === 'textarea';
+    const fireScrollIntoViewEvent = (editor, data) => {
+      const scrollEvent = editor.dispatch('ScrollIntoView', data);
+      return scrollEvent.isDefaultPrevented();
+    };
+    const fireAfterScrollIntoViewEvent = (editor, data) => {
+      editor.dispatch('AfterScrollIntoView', data);
+    };
+    const descend = (element, offset) => {
+      const children$1 = children(element);
+      if (children$1.length === 0 || excludeFromDescend(element)) {
+        return {
+          element,
+          offset
+        };
+      } else if (offset < children$1.length && !excludeFromDescend(children$1[offset])) {
+        return {
+          element: children$1[offset],
+          offset: 0
+        };
+      } else {
+        const last = children$1[children$1.length - 1];
+        if (excludeFromDescend(last)) {
+          return {
+            element,
+            offset
+          };
+        } else {
+          if (name(last) === 'img') {
+            return {
+              element: last,
+              offset: 1
+            };
+          } else if (isText$9(last)) {
+            return {
+              element: last,
+              offset: get$3(last).length
+            };
+          } else {
+            return {
+              element: last,
+              offset: children(last).length
+            };
+          }
+        }
+      }
+    };
+    const markerInfo = (element, cleanupFun) => {
+      const pos = absolute(element);
+      const height = get$2(element);
+      return {
+        element,
+        bottom: pos.top + height,
+        height,
+        pos,
+        cleanup: cleanupFun
+      };
+    };
+    const createMarker$1 = (element, offset) => {
+      const startPoint = descend(element, offset);
+      const span = SugarElement.fromHtml('<span data-mce-bogus="all" style="display: inline-block;">' + ZWSP$1 + '</span>');
+      before$3(startPoint.element, span);
+      return markerInfo(span, () => remove$5(span));
+    };
+    const elementMarker = element => markerInfo(SugarElement.fromDom(element), noop);
+    const withMarker = (editor, f, rng, alignToTop) => {
+      preserveWith(editor, (_s, _e) => applyWithMarker(editor, f, rng, alignToTop), rng);
+    };
+    const withScrollEvents = (editor, doc, f, marker, alignToTop) => {
+      const data = {
+        elm: marker.element.dom,
+        alignToTop
+      };
+      if (fireScrollIntoViewEvent(editor, data)) {
+        return;
+      }
+      const scrollTop = get$5(doc).top;
+      f(doc, scrollTop, marker, alignToTop);
+      fireAfterScrollIntoViewEvent(editor, data);
+    };
+    const applyWithMarker = (editor, f, rng, alignToTop) => {
+      const body = SugarElement.fromDom(editor.getBody());
+      const doc = SugarElement.fromDom(editor.getDoc());
+      reflow(body);
+      const marker = createMarker$1(SugarElement.fromDom(rng.startContainer), rng.startOffset);
+      withScrollEvents(editor, doc, f, marker, alignToTop);
+      marker.cleanup();
+    };
+    const withElement = (editor, element, f, alignToTop) => {
+      const doc = SugarElement.fromDom(editor.getDoc());
+      withScrollEvents(editor, doc, f, elementMarker(element), alignToTop);
+    };
+    const preserveWith = (editor, f, rng) => {
+      const startElement = rng.startContainer;
+      const startOffset = rng.startOffset;
+      const endElement = rng.endContainer;
+      const endOffset = rng.endOffset;
+      f(SugarElement.fromDom(startElement), SugarElement.fromDom(endElement));
+      const newRng = editor.dom.createRng();
+      newRng.setStart(startElement, startOffset);
+      newRng.setEnd(endElement, endOffset);
+      editor.selection.setRng(rng);
+    };
+    const scrollToMarker = (marker, viewHeight, alignToTop, doc) => {
+      const pos = marker.pos;
+      if (alignToTop) {
+        to(pos.left, pos.top, doc);
+      } else {
+        const y = pos.top - viewHeight + marker.height;
+        to(pos.left, y, doc);
+      }
+    };
+    const intoWindowIfNeeded = (doc, scrollTop, viewHeight, marker, alignToTop) => {
+      const viewportBottom = viewHeight + scrollTop;
+      const markerTop = marker.pos.top;
+      const markerBottom = marker.bottom;
+      const largerThanViewport = markerBottom - markerTop >= viewHeight;
+      if (markerTop < scrollTop) {
+        scrollToMarker(marker, viewHeight, alignToTop !== false, doc);
+      } else if (markerTop > viewportBottom) {
+        const align = largerThanViewport ? alignToTop !== false : alignToTop === true;
+        scrollToMarker(marker, viewHeight, align, doc);
+      } else if (markerBottom > viewportBottom && !largerThanViewport) {
+        scrollToMarker(marker, viewHeight, alignToTop === true, doc);
+      }
+    };
+    const intoWindow = (doc, scrollTop, marker, alignToTop) => {
+      const viewHeight = doc.dom.defaultView.innerHeight;
+      intoWindowIfNeeded(doc, scrollTop, viewHeight, marker, alignToTop);
+    };
+    const intoFrame = (doc, scrollTop, marker, alignToTop) => {
+      const frameViewHeight = doc.dom.defaultView.innerHeight;
+      intoWindowIfNeeded(doc, scrollTop, frameViewHeight, marker, alignToTop);
+      const op = find(marker.element);
+      const viewportBounds = getBounds(window);
+      if (op.top < viewportBounds.y) {
+        intoView(marker.element, alignToTop !== false);
+      } else if (op.top > viewportBounds.bottom) {
+        intoView(marker.element, alignToTop === true);
+      }
+    };
+    const rangeIntoWindow = (editor, rng, alignToTop) => withMarker(editor, intoWindow, rng, alignToTop);
+    const elementIntoWindow = (editor, element, alignToTop) => withElement(editor, element, intoWindow, alignToTop);
+    const rangeIntoFrame = (editor, rng, alignToTop) => withMarker(editor, intoFrame, rng, alignToTop);
+    const elementIntoFrame = (editor, element, alignToTop) => withElement(editor, element, intoFrame, alignToTop);
+    const scrollElementIntoView = (editor, element, alignToTop) => {
+      const scroller = editor.inline ? elementIntoWindow : elementIntoFrame;
+      scroller(editor, element, alignToTop);
+    };
+    const scrollRangeIntoView = (editor, rng, alignToTop) => {
+      const scroller = editor.inline ? rangeIntoWindow : rangeIntoFrame;
+      scroller(editor, rng, alignToTop);
+    };
+
+    const focus$1 = element => element.dom.focus();
+    const hasFocus$1 = element => {
+      const root = getRootNode(element).dom;
+      return element.dom === root.activeElement;
+    };
+    const active$1 = (root = getDocument()) => Optional.from(root.dom.activeElement).map(SugarElement.fromDom);
+    const search = element => active$1(getRootNode(element)).filter(e => element.dom.contains(e.dom));
+
+    const clamp$1 = (offset, element) => {
+      const max = isText$9(element) ? get$3(element).length : children(element).length + 1;
+      if (offset > max) {
+        return max;
+      } else if (offset < 0) {
+        return 0;
+      }
+      return offset;
+    };
+    const normalizeRng = rng => SimSelection.range(rng.start, clamp$1(rng.soffset, rng.start), rng.finish, clamp$1(rng.foffset, rng.finish));
+    const isOrContains = (root, elm) => !isRestrictedNode(elm.dom) && (contains(root, elm) || eq(root, elm));
+    const isRngInRoot = root => rng => isOrContains(root, rng.start) && isOrContains(root, rng.finish);
+    const shouldStore = editor => editor.inline;
+    const nativeRangeToSelectionRange = r => SimSelection.range(SugarElement.fromDom(r.startContainer), r.startOffset, SugarElement.fromDom(r.endContainer), r.endOffset);
+    const readRange = win => {
+      const selection = win.getSelection();
+      const rng = !selection || selection.rangeCount === 0 ? Optional.none() : Optional.from(selection.getRangeAt(0));
+      return rng.map(nativeRangeToSelectionRange);
+    };
+    const getBookmark = root => {
+      const win = defaultView(root);
+      return readRange(win.dom).filter(isRngInRoot(root));
+    };
+    const validate = (root, bookmark) => Optional.from(bookmark).filter(isRngInRoot(root)).map(normalizeRng);
+    const bookmarkToNativeRng = bookmark => {
+      const rng = document.createRange();
+      try {
+        rng.setStart(bookmark.start.dom, bookmark.soffset);
+        rng.setEnd(bookmark.finish.dom, bookmark.foffset);
+        return Optional.some(rng);
+      } catch (_) {
+        return Optional.none();
+      }
+    };
+    const store = editor => {
+      const newBookmark = shouldStore(editor) ? getBookmark(SugarElement.fromDom(editor.getBody())) : Optional.none();
+      editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark;
+    };
+    const getRng = editor => {
+      const bookmark = editor.bookmark ? editor.bookmark : Optional.none();
+      return bookmark.bind(x => validate(SugarElement.fromDom(editor.getBody()), x)).bind(bookmarkToNativeRng);
+    };
+    const restore = editor => {
+      getRng(editor).each(rng => editor.selection.setRng(rng));
+    };
+
+    const isEditorUIElement$1 = elm => {
+      const className = elm.className.toString();
+      return className.indexOf('tox-') !== -1 || className.indexOf('mce-') !== -1;
+    };
+    const FocusManager = { isEditorUIElement: isEditorUIElement$1 };
+
+    const wrappedSetTimeout = (callback, time) => {
+      if (!isNumber(time)) {
+        time = 0;
+      }
+      return setTimeout(callback, time);
+    };
+    const wrappedSetInterval = (callback, time) => {
+      if (!isNumber(time)) {
+        time = 0;
+      }
+      return setInterval(callback, time);
+    };
+    const Delay = {
+      setEditorTimeout: (editor, callback, time) => {
+        return wrappedSetTimeout(() => {
+          if (!editor.removed) {
+            callback();
+          }
+        }, time);
+      },
+      setEditorInterval: (editor, callback, time) => {
+        const timer = wrappedSetInterval(() => {
+          if (!editor.removed) {
+            callback();
+          } else {
+            clearInterval(timer);
+          }
+        }, time);
+        return timer;
+      }
+    };
+
+    const isManualNodeChange = e => {
+      return e.type === 'nodechange' && e.selectionChange;
+    };
+    const registerPageMouseUp = (editor, throttledStore) => {
+      const mouseUpPage = () => {
+        throttledStore.throttle();
+      };
+      DOMUtils.DOM.bind(document, 'mouseup', mouseUpPage);
+      editor.on('remove', () => {
+        DOMUtils.DOM.unbind(document, 'mouseup', mouseUpPage);
+      });
+    };
+    const registerMouseUp = (editor, throttledStore) => {
+      editor.on('mouseup touchend', _e => {
+        throttledStore.throttle();
+      });
+    };
+    const registerEditorEvents = (editor, throttledStore) => {
+      registerMouseUp(editor, throttledStore);
+      editor.on('keyup NodeChange AfterSetSelectionRange', e => {
+        if (!isManualNodeChange(e)) {
+          store(editor);
+        }
+      });
+    };
+    const register$6 = editor => {
+      const throttledStore = first$1(() => {
+        store(editor);
+      }, 0);
+      editor.on('init', () => {
+        if (editor.inline) {
+          registerPageMouseUp(editor, throttledStore);
+        }
+        registerEditorEvents(editor, throttledStore);
+      });
+      editor.on('remove', () => {
+        throttledStore.cancel();
+      });
+    };
+
+    let documentFocusInHandler;
+    const DOM$9 = DOMUtils.DOM;
+    const isEditorUIElement = elm => {
+      return FocusManager.isEditorUIElement(elm);
+    };
+    const isEditorContentAreaElement = elm => {
+      const classList = elm.classList;
+      if (classList !== undefined) {
+        return classList.contains('tox-edit-area') || classList.contains('tox-edit-area__iframe') || classList.contains('mce-content-body');
+      } else {
+        return false;
+      }
+    };
+    const isUIElement = (editor, elm) => {
+      const customSelector = getCustomUiSelector(editor);
+      const parent = DOM$9.getParent(elm, elm => {
+        return isEditorUIElement(elm) || (customSelector ? editor.dom.is(elm, customSelector) : false);
+      });
+      return parent !== null;
+    };
+    const getActiveElement = editor => {
+      try {
+        const root = getRootNode(SugarElement.fromDom(editor.getElement()));
+        return active$1(root).fold(() => document.body, x => x.dom);
+      } catch (ex) {
+        return document.body;
+      }
+    };
+    const registerEvents$1 = (editorManager, e) => {
+      const editor = e.editor;
+      register$6(editor);
+      editor.on('focusin', () => {
+        const focusedEditor = editorManager.focusedEditor;
+        if (focusedEditor !== editor) {
+          if (focusedEditor) {
+            focusedEditor.dispatch('blur', { focusedEditor: editor });
+          }
+          editorManager.setActive(editor);
+          editorManager.focusedEditor = editor;
+          editor.dispatch('focus', { blurredEditor: focusedEditor });
+          editor.focus(true);
+        }
+      });
+      editor.on('focusout', () => {
+        Delay.setEditorTimeout(editor, () => {
+          const focusedEditor = editorManager.focusedEditor;
+          if (!isUIElement(editor, getActiveElement(editor)) && focusedEditor === editor) {
+            editor.dispatch('blur', { focusedEditor: null });
+            editorManager.focusedEditor = null;
+          }
+        });
+      });
+      if (!documentFocusInHandler) {
+        documentFocusInHandler = e => {
+          const activeEditor = editorManager.activeEditor;
+          if (activeEditor) {
+            getOriginalEventTarget(e).each(target => {
+              if (target.ownerDocument === document) {
+                if (target !== document.body && !isUIElement(activeEditor, target) && editorManager.focusedEditor === activeEditor) {
+                  activeEditor.dispatch('blur', { focusedEditor: null });
+                  editorManager.focusedEditor = null;
+                }
+              }
+            });
+          }
+        };
+        DOM$9.bind(document, 'focusin', documentFocusInHandler);
+      }
+    };
+    const unregisterDocumentEvents = (editorManager, e) => {
+      if (editorManager.focusedEditor === e.editor) {
+        editorManager.focusedEditor = null;
+      }
+      if (!editorManager.activeEditor) {
+        DOM$9.unbind(document, 'focusin', documentFocusInHandler);
+        documentFocusInHandler = null;
+      }
+    };
+    const setup$v = editorManager => {
+      editorManager.on('AddEditor', curry(registerEvents$1, editorManager));
+      editorManager.on('RemoveEditor', curry(unregisterDocumentEvents, editorManager));
+    };
+
+    const getContentEditableHost = (editor, node) => editor.dom.getParent(node, node => editor.dom.getContentEditable(node) === 'true');
+    const getCollapsedNode = rng => rng.collapsed ? Optional.from(getNode$1(rng.startContainer, rng.startOffset)).map(SugarElement.fromDom) : Optional.none();
+    const getFocusInElement = (root, rng) => getCollapsedNode(rng).bind(node => {
+      if (isTableSection(node)) {
+        return Optional.some(node);
+      } else if (contains(root, node) === false) {
+        return Optional.some(root);
+      } else {
+        return Optional.none();
+      }
+    });
+    const normalizeSelection$1 = (editor, rng) => {
+      getFocusInElement(SugarElement.fromDom(editor.getBody()), rng).bind(elm => {
+        return firstPositionIn(elm.dom);
+      }).fold(() => {
+        editor.selection.normalize();
+        return;
+      }, caretPos => editor.selection.setRng(caretPos.toRange()));
+    };
+    const focusBody = body => {
+      if (body.setActive) {
+        try {
+          body.setActive();
+        } catch (ex) {
+          body.focus();
+        }
+      } else {
+        body.focus();
+      }
+    };
+    const hasElementFocus = elm => hasFocus$1(elm) || search(elm).isSome();
+    const hasIframeFocus = editor => editor.iframeElement && hasFocus$1(SugarElement.fromDom(editor.iframeElement));
+    const hasInlineFocus = editor => {
+      const rawBody = editor.getBody();
+      return rawBody && hasElementFocus(SugarElement.fromDom(rawBody));
+    };
+    const hasUiFocus = editor => {
+      const dos = getRootNode(SugarElement.fromDom(editor.getElement()));
+      return active$1(dos).filter(elem => !isEditorContentAreaElement(elem.dom) && isUIElement(editor, elem.dom)).isSome();
+    };
+    const hasFocus = editor => editor.inline ? hasInlineFocus(editor) : hasIframeFocus(editor);
+    const hasEditorOrUiFocus = editor => hasFocus(editor) || hasUiFocus(editor);
+    const focusEditor = editor => {
+      const selection = editor.selection;
+      const body = editor.getBody();
+      let rng = selection.getRng();
+      editor.quirks.refreshContentEditable();
+      if (editor.bookmark !== undefined && hasFocus(editor) === false) {
+        getRng(editor).each(bookmarkRng => {
+          editor.selection.setRng(bookmarkRng);
+          rng = bookmarkRng;
+        });
+      }
+      const contentEditableHost = getContentEditableHost(editor, selection.getNode());
+      if (editor.dom.isChildOf(contentEditableHost, body)) {
+        focusBody(contentEditableHost);
+        normalizeSelection$1(editor, rng);
+        activateEditor(editor);
+        return;
+      }
+      if (!editor.inline) {
+        if (!Env.browser.isOpera()) {
+          focusBody(body);
+        }
+        editor.getWin().focus();
+      }
+      if (Env.browser.isFirefox() || editor.inline) {
+        focusBody(body);
+        normalizeSelection$1(editor, rng);
+      }
+      activateEditor(editor);
+    };
+    const activateEditor = editor => editor.editorManager.setActive(editor);
+    const focus = (editor, skipFocus) => {
+      if (editor.removed) {
+        return;
+      }
+      if (skipFocus) {
+        activateEditor(editor);
+      } else {
+        focusEditor(editor);
+      }
+    };
+
+    const getEndpointElement = (root, rng, start, real, resolve) => {
+      const container = start ? rng.startContainer : rng.endContainer;
+      const offset = start ? rng.startOffset : rng.endOffset;
+      return Optional.from(container).map(SugarElement.fromDom).map(elm => !real || !rng.collapsed ? child$1(elm, resolve(elm, offset)).getOr(elm) : elm).bind(elm => isElement$7(elm) ? Optional.some(elm) : parent(elm).filter(isElement$7)).map(elm => elm.dom).getOr(root);
+    };
+    const getStart = (root, rng, real) => getEndpointElement(root, rng, true, real, (elm, offset) => Math.min(childNodesCount(elm), offset));
+    const getEnd$1 = (root, rng, real) => getEndpointElement(root, rng, false, real, (elm, offset) => offset > 0 ? offset - 1 : offset);
+    const skipEmptyTextNodes = (node, forwards) => {
+      const orig = node;
+      while (node && isText$8(node) && node.length === 0) {
+        node = forwards ? node.nextSibling : node.previousSibling;
+      }
+      return node || orig;
+    };
+    const getNode = (root, rng) => {
+      let elm, startContainer, endContainer;
+      if (!rng) {
+        return root;
+      }
+      startContainer = rng.startContainer;
+      endContainer = rng.endContainer;
+      const startOffset = rng.startOffset;
+      const endOffset = rng.endOffset;
+      elm = rng.commonAncestorContainer;
+      if (!rng.collapsed) {
+        if (startContainer === endContainer) {
+          if (endOffset - startOffset < 2) {
+            if (startContainer.hasChildNodes()) {
+              elm = startContainer.childNodes[startOffset];
+            }
+          }
+        }
+        if (startContainer.nodeType === 3 && endContainer.nodeType === 3) {
+          if (startContainer.length === startOffset) {
+            startContainer = skipEmptyTextNodes(startContainer.nextSibling, true);
+          } else {
+            startContainer = startContainer.parentNode;
+          }
+          if (endOffset === 0) {
+            endContainer = skipEmptyTextNodes(endContainer.previousSibling, false);
+          } else {
+            endContainer = endContainer.parentNode;
+          }
+          if (startContainer && startContainer === endContainer) {
+            return startContainer;
+          }
+        }
+      }
+      if (elm && elm.nodeType === 3) {
+        return elm.parentNode;
+      }
+      return elm;
+    };
+    const getSelectedBlocks = (dom, rng, startElm, endElm) => {
+      let node;
+      const selectedBlocks = [];
+      const root = dom.getRoot();
+      startElm = dom.getParent(startElm || getStart(root, rng, rng.collapsed), dom.isBlock);
+      endElm = dom.getParent(endElm || getEnd$1(root, rng, rng.collapsed), dom.isBlock);
+      if (startElm && startElm !== root) {
+        selectedBlocks.push(startElm);
+      }
+      if (startElm && endElm && startElm !== endElm) {
+        node = startElm;
+        const walker = new DomTreeWalker(startElm, root);
+        while ((node = walker.next()) && node !== endElm) {
+          if (dom.isBlock(node)) {
+            selectedBlocks.push(node);
+          }
+        }
+      }
+      if (endElm && startElm !== endElm && endElm !== root) {
+        selectedBlocks.push(endElm);
+      }
+      return selectedBlocks;
+    };
+    const select = (dom, node, content) => Optional.from(node).map(node => {
+      const idx = dom.nodeIndex(node);
+      const rng = dom.createRng();
+      rng.setStart(node.parentNode, idx);
+      rng.setEnd(node.parentNode, idx + 1);
+      if (content) {
+        moveEndPoint(dom, rng, node, true);
+        moveEndPoint(dom, rng, node, false);
+      }
+      return rng;
+    });
+
+    const processRanges = (editor, ranges) => map$3(ranges, range => {
+      const evt = editor.dispatch('GetSelectionRange', { range });
+      return evt.range !== range ? evt.range : range;
+    });
+
+    const getEnd = element => name(element) === 'img' ? 1 : getOption(element).fold(() => children(element).length, v => v.length);
+    const isTextNodeWithCursorPosition = el => getOption(el).filter(text => text.trim().length !== 0 || text.indexOf(nbsp) > -1).isSome();
+    const elementsWithCursorPosition = [
+      'img',
+      'br'
+    ];
+    const isCursorPosition = elem => {
+      const hasCursorPosition = isTextNodeWithCursorPosition(elem);
+      return hasCursorPosition || contains$2(elementsWithCursorPosition, name(elem));
+    };
+
+    const first = element => descendant$1(element, isCursorPosition);
+    const last = element => descendantRtl(element, isCursorPosition);
+    const descendantRtl = (scope, predicate) => {
+      const descend = element => {
+        const children$1 = children(element);
+        for (let i = children$1.length - 1; i >= 0; i--) {
+          const child = children$1[i];
+          if (predicate(child)) {
+            return Optional.some(child);
+          }
+          const res = descend(child);
+          if (res.isSome()) {
+            return res;
+          }
+        }
+        return Optional.none();
+      };
+      return descend(scope);
+    };
+
+    const autocompleteSelector = '[data-mce-autocompleter]';
+    const create$8 = (editor, range) => {
+      if (findIn(SugarElement.fromDom(editor.getBody())).isNone()) {
+        const wrapper = SugarElement.fromHtml('<span data-mce-autocompleter="1" data-mce-bogus="1"></span>', editor.getDoc());
+        append$1(wrapper, SugarElement.fromDom(range.extractContents()));
+        range.insertNode(wrapper.dom);
+        parent(wrapper).each(elm => elm.dom.normalize());
+        last(wrapper).map(last => {
+          editor.selection.setCursorLocation(last.dom, getEnd(last));
+        });
+      }
+    };
+    const detect$1 = elm => closest$3(elm, autocompleteSelector);
+    const findIn = elm => descendant(elm, autocompleteSelector);
+    const remove$3 = (editor, elm) => findIn(elm).each(wrapper => {
+      const bookmark = editor.selection.getBookmark();
+      unwrap(wrapper);
+      editor.selection.moveToBookmark(bookmark);
+    });
+
+    const typeLookup = {
+      '#text': 3,
+      '#comment': 8,
+      '#cdata': 4,
+      '#pi': 7,
+      '#doctype': 10,
+      '#document-fragment': 11
+    };
+    const walk$2 = (node, root, prev) => {
+      const startName = prev ? 'lastChild' : 'firstChild';
+      const siblingName = prev ? 'prev' : 'next';
+      if (node[startName]) {
+        return node[startName];
+      }
+      if (node !== root) {
+        let sibling = node[siblingName];
+        if (sibling) {
+          return sibling;
+        }
+        for (let parent = node.parent; parent && parent !== root; parent = parent.parent) {
+          sibling = parent[siblingName];
+          if (sibling) {
+            return sibling;
+          }
+        }
+      }
+    };
+    const isEmptyTextNode = node => {
+      if (!isWhitespaceText(node.value)) {
+        return false;
+      }
+      const parentNode = node.parent;
+      if (parentNode && (parentNode.name !== 'span' || parentNode.attr('style')) && /^[ ]+$/.test(node.value)) {
+        return false;
+      }
+      return true;
+    };
+    const isNonEmptyElement = node => {
+      const isNamedAnchor = node.name === 'a' && !node.attr('href') && node.attr('id');
+      return node.attr('name') || node.attr('id') && !node.firstChild || node.attr('data-mce-bookmark') || isNamedAnchor;
+    };
+    class AstNode {
+      constructor(name, type) {
+        this.name = name;
+        this.type = type;
+        if (type === 1) {
+          this.attributes = [];
+          this.attributes.map = {};
+        }
+      }
+      static create(name, attrs) {
+        const node = new AstNode(name, typeLookup[name] || 1);
+        if (attrs) {
+          each$f(attrs, (value, attrName) => {
+            node.attr(attrName, value);
+          });
+        }
+        return node;
+      }
+      replace(node) {
+        const self = this;
+        if (node.parent) {
+          node.remove();
+        }
+        self.insert(node, self);
+        self.remove();
+        return self;
+      }
+      attr(name, value) {
+        const self = this;
+        let attrs;
+        if (typeof name !== 'string') {
+          if (name !== undefined && name !== null) {
+            each$f(name, (value, key) => {
+              self.attr(key, value);
+            });
+          }
+          return self;
+        }
+        if (attrs = self.attributes) {
+          if (value !== undefined) {
+            if (value === null) {
+              if (name in attrs.map) {
+                delete attrs.map[name];
+                let i = attrs.length;
+                while (i--) {
+                  if (attrs[i].name === name) {
+                    attrs.splice(i, 1);
+                    return self;
+                  }
+                }
+              }
+              return self;
+            }
+            if (name in attrs.map) {
+              let i = attrs.length;
+              while (i--) {
+                if (attrs[i].name === name) {
+                  attrs[i].value = value;
+                  break;
+                }
+              }
+            } else {
+              attrs.push({
+                name,
+                value
+              });
+            }
+            attrs.map[name] = value;
+            return self;
+          }
+          return attrs.map[name];
+        }
+      }
+      clone() {
+        const self = this;
+        const clone = new AstNode(self.name, self.type);
+        let selfAttrs;
+        if (selfAttrs = self.attributes) {
+          const cloneAttrs = [];
+          cloneAttrs.map = {};
+          for (let i = 0, l = selfAttrs.length; i < l; i++) {
+            const selfAttr = selfAttrs[i];
+            if (selfAttr.name !== 'id') {
+              cloneAttrs[cloneAttrs.length] = {
+                name: selfAttr.name,
+                value: selfAttr.value
+              };
+              cloneAttrs.map[selfAttr.name] = selfAttr.value;
+            }
+          }
+          clone.attributes = cloneAttrs;
+        }
+        clone.value = self.value;
+        return clone;
+      }
+      wrap(wrapper) {
+        const self = this;
+        self.parent.insert(wrapper, self);
+        wrapper.append(self);
+        return self;
+      }
+      unwrap() {
+        const self = this;
+        for (let node = self.firstChild; node;) {
+          const next = node.next;
+          self.insert(node, self, true);
+          node = next;
+        }
+        self.remove();
+      }
+      remove() {
+        const self = this, parent = self.parent, next = self.next, prev = self.prev;
+        if (parent) {
+          if (parent.firstChild === self) {
+            parent.firstChild = next;
+            if (next) {
+              next.prev = null;
+            }
+          } else {
+            prev.next = next;
+          }
+          if (parent.lastChild === self) {
+            parent.lastChild = prev;
+            if (prev) {
+              prev.next = null;
+            }
+          } else {
+            next.prev = prev;
+          }
+          self.parent = self.next = self.prev = null;
+        }
+        return self;
+      }
+      append(node) {
+        const self = this;
+        if (node.parent) {
+          node.remove();
+        }
+        const last = self.lastChild;
+        if (last) {
+          last.next = node;
+          node.prev = last;
+          self.lastChild = node;
+        } else {
+          self.lastChild = self.firstChild = node;
+        }
+        node.parent = self;
+        return node;
+      }
+      insert(node, refNode, before) {
+        if (node.parent) {
+          node.remove();
+        }
+        const parent = refNode.parent || this;
+        if (before) {
+          if (refNode === parent.firstChild) {
+            parent.firstChild = node;
+          } else {
+            refNode.prev.next = node;
+          }
+          node.prev = refNode.prev;
+          node.next = refNode;
+          refNode.prev = node;
+        } else {
+          if (refNode === parent.lastChild) {
+            parent.lastChild = node;
+          } else {
+            refNode.next.prev = node;
+          }
+          node.next = refNode.next;
+          node.prev = refNode;
+          refNode.next = node;
+        }
+        node.parent = parent;
+        return node;
+      }
+      getAll(name) {
+        const self = this;
+        const collection = [];
+        for (let node = self.firstChild; node; node = walk$2(node, self)) {
+          if (node.name === name) {
+            collection.push(node);
+          }
+        }
+        return collection;
+      }
+      children() {
+        const self = this;
+        const collection = [];
+        for (let node = self.firstChild; node; node = node.next) {
+          collection.push(node);
+        }
+        return collection;
+      }
+      empty() {
+        const self = this;
+        if (self.firstChild) {
+          const nodes = [];
+          for (let node = self.firstChild; node; node = walk$2(node, self)) {
+            nodes.push(node);
+          }
+          let i = nodes.length;
+          while (i--) {
+            const node = nodes[i];
+            node.parent = node.firstChild = node.lastChild = node.next = node.prev = null;
+          }
+        }
+        self.firstChild = self.lastChild = null;
+        return self;
+      }
+      isEmpty(elements, whitespace = {}, predicate) {
+        const self = this;
+        let node = self.firstChild;
+        if (isNonEmptyElement(self)) {
+          return false;
+        }
+        if (node) {
+          do {
+            if (node.type === 1) {
+              if (node.attr('data-mce-bogus')) {
+                continue;
+              }
+              if (elements[node.name]) {
+                return false;
+              }
+              if (isNonEmptyElement(node)) {
+                return false;
+              }
+            }
+            if (node.type === 8) {
+              return false;
+            }
+            if (node.type === 3 && !isEmptyTextNode(node)) {
+              return false;
+            }
+            if (node.type === 3 && node.parent && whitespace[node.parent.name] && isWhitespaceText(node.value)) {
+              return false;
+            }
+            if (predicate && predicate(node)) {
+              return false;
+            }
+          } while (node = walk$2(node, self));
+        }
+        return true;
+      }
+      walk(prev) {
+        return walk$2(this, null, prev);
+      }
+    }
+
+    const isConditionalComment = (html, startIndex) => /^\s*\[if [\w\W]+\]>.*<!\[endif\](--!?)?>/.test(html.substr(startIndex));
+    const findCommentEndIndex = (html, isBogus, startIndex = 0) => {
+      const lcHtml = html.toLowerCase();
+      if (lcHtml.indexOf('[if ', startIndex) !== -1 && isConditionalComment(lcHtml, startIndex)) {
+        const endIfIndex = lcHtml.indexOf('[endif]', startIndex);
+        return lcHtml.indexOf('>', endIfIndex);
+      } else {
+        if (isBogus) {
+          const endIndex = lcHtml.indexOf('>', startIndex);
+          return endIndex !== -1 ? endIndex : lcHtml.length;
+        } else {
+          const endCommentRegexp = /--!?>/g;
+          endCommentRegexp.lastIndex = startIndex;
+          const match = endCommentRegexp.exec(html);
+          return match ? match.index + match[0].length : lcHtml.length;
+        }
+      }
+    };
+    const findMatchingEndTagIndex = (schema, html, startIndex) => {
+      const startTagRegExp = /<([!?\/])?([A-Za-z0-9\-_:.]+)/g;
+      const endTagRegExp = /(?:\s(?:[^'">]+(?:"[^"]*"|'[^']*'))*[^"'>]*(?:"[^">]*|'[^'>]*)?|\s*|\/)>/g;
+      const voidElements = schema.getVoidElements();
+      let count = 1, index = startIndex;
+      while (count !== 0) {
+        startTagRegExp.lastIndex = index;
+        while (true) {
+          const startMatch = startTagRegExp.exec(html);
+          if (startMatch === null) {
+            return index;
+          } else if (startMatch[1] === '!') {
+            if (startsWith(startMatch[2], '--')) {
+              index = findCommentEndIndex(html, false, startMatch.index + '!--'.length);
+            } else {
+              index = findCommentEndIndex(html, true, startMatch.index + 1);
+            }
+            break;
+          } else {
+            endTagRegExp.lastIndex = startTagRegExp.lastIndex;
+            const endMatch = endTagRegExp.exec(html);
+            if (isNull(endMatch) || endMatch.index !== startTagRegExp.lastIndex) {
+              continue;
+            }
+            if (startMatch[1] === '/') {
+              count -= 1;
+            } else if (!has$2(voidElements, startMatch[2])) {
+              count += 1;
+            }
+            index = startTagRegExp.lastIndex + endMatch[0].length;
+            break;
+          }
+        }
+      }
+      return index;
+    };
+    const trimHtml$1 = (tempAttrs, html) => {
+      const trimContentRegExp = new RegExp(['\\s?(' + tempAttrs.join('|') + ')="[^"]+"'].join('|'), 'gi');
+      return html.replace(trimContentRegExp, '');
+    };
+    const trimInternal = (serializer, html) => {
+      const bogusAllRegExp = /<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g;
+      const schema = serializer.schema;
+      let content = trimHtml$1(serializer.getTempAttrs(), html);
+      const voidElements = schema.getVoidElements();
+      let matches;
+      while (matches = bogusAllRegExp.exec(content)) {
+        const index = bogusAllRegExp.lastIndex;
+        const matchLength = matches[0].length;
+        let endTagIndex;
+        if (voidElements[matches[1]]) {
+          endTagIndex = index;
+        } else {
+          endTagIndex = findMatchingEndTagIndex(schema, content, index);
+        }
+        content = content.substring(0, index - matchLength) + content.substring(endTagIndex);
+        bogusAllRegExp.lastIndex = index - matchLength;
+      }
+      return trim$1(content);
+    };
+    const trimExternal = trimInternal;
+
+    const trimEmptyContents = (editor, html) => {
+      const blockName = getForcedRootBlock(editor);
+      const emptyRegExp = new RegExp(`^(<${ blockName }[^>]*>(&nbsp;|&#160;|\\s|\u00a0|<br \\/>|)<\\/${ blockName }>[\r\n]*|<br \\/>[\r\n]*)$`);
+      return html.replace(emptyRegExp, '');
+    };
+    const getContentFromBody = (editor, args, body) => {
+      let content;
+      if (args.format === 'raw') {
+        content = Tools.trim(trimExternal(editor.serializer, body.innerHTML));
+      } else if (args.format === 'text') {
+        content = editor.dom.isEmpty(body) ? '' : trim$1(body.innerText || body.textContent);
+      } else if (args.format === 'tree') {
+        content = editor.serializer.serialize(body, args);
+      } else {
+        content = trimEmptyContents(editor, editor.serializer.serialize(body, args));
+      }
+      const shouldTrim = args.format !== 'text' && !isWsPreserveElement(SugarElement.fromDom(body));
+      return shouldTrim && isString(content) ? Tools.trim(content) : content;
+    };
+    const getContentInternal = (editor, args) => Optional.from(editor.getBody()).fold(constant(args.format === 'tree' ? new AstNode('body', 11) : ''), body => getContentFromBody(editor, args, body));
+
+    const each$b = Tools.each;
+    const ElementUtils = dom => {
+      const compare = (node1, node2) => {
+        if (node1.nodeName !== node2.nodeName) {
+          return false;
+        }
+        const getAttribs = node => {
+          const attribs = {};
+          each$b(dom.getAttribs(node), attr => {
+            const name = attr.nodeName.toLowerCase();
+            if (name.indexOf('_') !== 0 && name !== 'style' && name.indexOf('data-') !== 0) {
+              attribs[name] = dom.getAttrib(node, name);
+            }
+          });
+          return attribs;
+        };
+        const compareObjects = (obj1, obj2) => {
+          let value, name;
+          for (name in obj1) {
+            if (has$2(obj1, name)) {
+              value = obj2[name];
+              if (typeof value === 'undefined') {
+                return false;
+              }
+              if (obj1[name] !== value) {
+                return false;
+              }
+              delete obj2[name];
+            }
+          }
+          for (name in obj2) {
+            if (has$2(obj2, name)) {
+              return false;
+            }
+          }
+          return true;
+        };
+        if (!compareObjects(getAttribs(node1), getAttribs(node2))) {
+          return false;
+        }
+        if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) {
+          return false;
+        }
+        return !isBookmarkNode$1(node1) && !isBookmarkNode$1(node2);
+      };
+      return { compare };
+    };
+
+    const makeMap$1 = Tools.makeMap;
+    const Writer = settings => {
+      const html = [];
+      settings = settings || {};
+      const indent = settings.indent;
+      const indentBefore = makeMap$1(settings.indent_before || '');
+      const indentAfter = makeMap$1(settings.indent_after || '');
+      const encode = Entities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities);
+      const htmlOutput = settings.element_format !== 'xhtml';
+      return {
+        start: (name, attrs, empty) => {
+          let i, l, attr, value;
+          if (indent && indentBefore[name] && html.length > 0) {
+            value = html[html.length - 1];
+            if (value.length > 0 && value !== '\n') {
+              html.push('\n');
+            }
+          }
+          html.push('<', name);
+          if (attrs) {
+            for (i = 0, l = attrs.length; i < l; i++) {
+              attr = attrs[i];
+              html.push(' ', attr.name, '="', encode(attr.value, true), '"');
+            }
+          }
+          if (!empty || htmlOutput) {
+            html[html.length] = '>';
+          } else {
+            html[html.length] = ' />';
+          }
+          if (empty && indent && indentAfter[name] && html.length > 0) {
+            value = html[html.length - 1];
+            if (value.length > 0 && value !== '\n') {
+              html.push('\n');
+            }
+          }
+        },
+        end: name => {
+          let value;
+          html.push('</', name, '>');
+          if (indent && indentAfter[name] && html.length > 0) {
+            value = html[html.length - 1];
+            if (value.length > 0 && value !== '\n') {
+              html.push('\n');
+            }
+          }
+        },
+        text: (text, raw) => {
+          if (text.length > 0) {
+            html[html.length] = raw ? text : encode(text);
+          }
+        },
+        cdata: text => {
+          html.push('<![CDATA[', text, ']]>');
+        },
+        comment: text => {
+          html.push('<!--', text, '-->');
+        },
+        pi: (name, text) => {
+          if (text) {
+            html.push('<?', name, ' ', encode(text), '?>');
+          } else {
+            html.push('<?', name, '?>');
+          }
+          if (indent) {
+            html.push('\n');
+          }
+        },
+        doctype: text => {
+          html.push('<!DOCTYPE', text, '>', indent ? '\n' : '');
+        },
+        reset: () => {
+          html.length = 0;
+        },
+        getContent: () => {
+          return html.join('').replace(/\n$/, '');
+        }
+      };
+    };
+
+    const HtmlSerializer = (settings, schema = Schema()) => {
+      const writer = Writer(settings);
+      settings = settings || {};
+      settings.validate = 'validate' in settings ? settings.validate : true;
+      const serialize = node => {
+        const validate = settings.validate;
+        const handlers = {
+          3: node => {
+            writer.text(node.value, node.raw);
+          },
+          8: node => {
+            writer.comment(node.value);
+          },
+          7: node => {
+            writer.pi(node.name, node.value);
+          },
+          10: node => {
+            writer.doctype(node.value);
+          },
+          4: node => {
+            writer.cdata(node.value);
+          },
+          11: node => {
+            if (node = node.firstChild) {
+              do {
+                walk(node);
+              } while (node = node.next);
+            }
+          }
+        };
+        writer.reset();
+        const walk = node => {
+          const handler = handlers[node.type];
+          if (!handler) {
+            const name = node.name;
+            const isEmpty = name in schema.getVoidElements();
+            let attrs = node.attributes;
+            if (validate && attrs && attrs.length > 1) {
+              const sortedAttrs = [];
+              sortedAttrs.map = {};
+              const elementRule = schema.getElementRule(node.name);
+              if (elementRule) {
+                for (let i = 0, l = elementRule.attributesOrder.length; i < l; i++) {
+                  const attrName = elementRule.attributesOrder[i];
+                  if (attrName in attrs.map) {
+                    const attrValue = attrs.map[attrName];
+                    sortedAttrs.map[attrName] = attrValue;
+                    sortedAttrs.push({
+                      name: attrName,
+                      value: attrValue
+                    });
+                  }
+                }
+                for (let i = 0, l = attrs.length; i < l; i++) {
+                  const attrName = attrs[i].name;
+                  if (!(attrName in sortedAttrs.map)) {
+                    const attrValue = attrs.map[attrName];
+                    sortedAttrs.map[attrName] = attrValue;
+                    sortedAttrs.push({
+                      name: attrName,
+                      value: attrValue
+                    });
+                  }
+                }
+                attrs = sortedAttrs;
+              }
+            }
+            writer.start(name, attrs, isEmpty);
+            if (!isEmpty) {
+              let child = node.firstChild;
+              if (child) {
+                if ((name === 'pre' || name === 'textarea') && child.type === 3 && child.value[0] === '\n') {
+                  writer.text('\n', true);
+                }
+                do {
+                  walk(child);
+                } while (child = child.next);
+              }
+              writer.end(name);
+            }
+          } else {
+            handler(node);
+          }
+        };
+        if (node.type === 1 && !settings.inner) {
+          walk(node);
+        } else if (node.type === 3) {
+          handlers[3](node);
+        } else {
+          handlers[11](node);
+        }
+        return writer.getContent();
+      };
+      return { serialize };
+    };
+
+    const nonInheritableStyles = new Set();
+    (() => {
+      const nonInheritableStylesArr = [
+        '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'
+      ];
+      each$g(nonInheritableStylesArr, style => {
+        nonInheritableStyles.add(style);
+      });
+    })();
+    const shorthandStyleProps = [
+      'font',
+      'text-decoration',
+      'text-emphasis'
+    ];
+    const getStyleProps = (dom, node) => keys(dom.parseStyle(dom.getAttrib(node, 'style')));
+    const isNonInheritableStyle = style => nonInheritableStyles.has(style);
+    const hasInheritableStyles = (dom, node) => forall(getStyleProps(dom, node), style => !isNonInheritableStyle(style));
+    const getLonghandStyleProps = styles => filter$6(styles, style => exists(shorthandStyleProps, prop => startsWith(style, prop)));
+    const hasStyleConflict = (dom, node, parentNode) => {
+      const nodeStyleProps = getStyleProps(dom, node);
+      const parentNodeStyleProps = getStyleProps(dom, parentNode);
+      const valueMismatch = prop => {
+        var _a, _b;
+        const nodeValue = (_a = dom.getStyle(node, prop)) !== null && _a !== void 0 ? _a : '';
+        const parentValue = (_b = dom.getStyle(parentNode, prop)) !== null && _b !== void 0 ? _b : '';
+        return isNotEmpty(nodeValue) && isNotEmpty(parentValue) && nodeValue !== parentValue;
+      };
+      return exists(nodeStyleProps, nodeStyleProp => {
+        const propExists = props => exists(props, prop => prop === nodeStyleProp);
+        if (!propExists(parentNodeStyleProps) && propExists(shorthandStyleProps)) {
+          const longhandProps = getLonghandStyleProps(parentNodeStyleProps);
+          return exists(longhandProps, valueMismatch);
+        } else {
+          return valueMismatch(nodeStyleProp);
+        }
+      });
+    };
+
+    const isChar = (forward, predicate, pos) => Optional.from(pos.container()).filter(isText$8).exists(text => {
+      const delta = forward ? 0 : -1;
+      return predicate(text.data.charAt(pos.offset() + delta));
+    });
+    const isBeforeSpace = curry(isChar, true, isWhiteSpace);
+    const isAfterSpace = curry(isChar, false, isWhiteSpace);
+    const isEmptyText = pos => {
+      const container = pos.container();
+      return isText$8(container) && (container.data.length === 0 || isZwsp(container.data) && BookmarkManager.isBookmarkNode(container.parentNode));
+    };
+    const matchesElementPosition = (before, predicate) => pos => Optional.from(getChildNodeAtRelativeOffset(before ? 0 : -1, pos)).filter(predicate).isSome();
+    const isImageBlock = node => isImg(node) && get$7(SugarElement.fromDom(node), 'display') === 'block';
+    const isCefNode = node => isContentEditableFalse$a(node) && !isBogusAll$1(node);
+    const isBeforeImageBlock = matchesElementPosition(true, isImageBlock);
+    const isAfterImageBlock = matchesElementPosition(false, isImageBlock);
+    const isBeforeMedia = matchesElementPosition(true, isMedia$2);
+    const isAfterMedia = matchesElementPosition(false, isMedia$2);
+    const isBeforeTable = matchesElementPosition(true, isTable$3);
+    const isAfterTable = matchesElementPosition(false, isTable$3);
+    const isBeforeContentEditableFalse = matchesElementPosition(true, isCefNode);
+    const isAfterContentEditableFalse = matchesElementPosition(false, isCefNode);
+
+    const getLastChildren = elm => {
+      const children = [];
+      let rawNode = elm.dom;
+      while (rawNode) {
+        children.push(SugarElement.fromDom(rawNode));
+        rawNode = rawNode.lastChild;
+      }
+      return children;
+    };
+    const removeTrailingBr = elm => {
+      const allBrs = descendants(elm, 'br');
+      const brs = filter$6(getLastChildren(elm).slice(-1), isBr$4);
+      if (allBrs.length === brs.length) {
+        each$g(brs, remove$5);
+      }
+    };
+    const fillWithPaddingBr = elm => {
+      empty(elm);
+      append$1(elm, SugarElement.fromHtml('<br data-mce-bogus="1">'));
+    };
+    const trimBlockTrailingBr = elm => {
+      lastChild(elm).each(lastChild => {
+        prevSibling(lastChild).each(lastChildPrevSibling => {
+          if (isBlock$2(elm) && isBr$4(lastChild) && isBlock$2(lastChildPrevSibling)) {
+            remove$5(lastChild);
+          }
+        });
+      });
+    };
+
+    const dropLast = xs => xs.slice(0, -1);
+    const parentsUntil = (start, root, predicate) => {
+      if (contains(root, start)) {
+        return dropLast(parents$1(start, elm => {
+          return predicate(elm) || eq(elm, root);
+        }));
+      } else {
+        return [];
+      }
+    };
+    const parents = (start, root) => parentsUntil(start, root, never);
+    const parentsAndSelf = (start, root) => [start].concat(parents(start, root));
+
+    const navigateIgnoreEmptyTextNodes = (forward, root, from) => navigateIgnore(forward, root, from, isEmptyText);
+    const getClosestBlock$1 = (root, pos) => find$2(parentsAndSelf(SugarElement.fromDom(pos.container()), root), isBlock$2);
+    const isAtBeforeAfterBlockBoundary = (forward, root, pos) => navigateIgnoreEmptyTextNodes(forward, root.dom, pos).forall(newPos => getClosestBlock$1(root, pos).fold(() => isInSameBlock(newPos, pos, root.dom) === false, fromBlock => isInSameBlock(newPos, pos, root.dom) === false && contains(fromBlock, SugarElement.fromDom(newPos.container()))));
+    const isAtBlockBoundary = (forward, root, pos) => getClosestBlock$1(root, pos).fold(() => navigateIgnoreEmptyTextNodes(forward, root.dom, pos).forall(newPos => isInSameBlock(newPos, pos, root.dom) === false), parent => navigateIgnoreEmptyTextNodes(forward, parent.dom, pos).isNone());
+    const isAtStartOfBlock = curry(isAtBlockBoundary, false);
+    const isAtEndOfBlock = curry(isAtBlockBoundary, true);
+    const isBeforeBlock = curry(isAtBeforeAfterBlockBoundary, false);
+    const isAfterBlock = curry(isAtBeforeAfterBlockBoundary, true);
+
+    const isBr = pos => getElementFromPosition(pos).exists(isBr$4);
+    const findBr = (forward, root, pos) => {
+      const parentBlocks = filter$6(parentsAndSelf(SugarElement.fromDom(pos.container()), root), isBlock$2);
+      const scope = head(parentBlocks).getOr(root);
+      return fromPosition(forward, scope.dom, pos).filter(isBr);
+    };
+    const isBeforeBr$1 = (root, pos) => getElementFromPosition(pos).exists(isBr$4) || findBr(true, root, pos).isSome();
+    const isAfterBr = (root, pos) => getElementFromPrevPosition(pos).exists(isBr$4) || findBr(false, root, pos).isSome();
+    const findPreviousBr = curry(findBr, false);
+    const findNextBr = curry(findBr, true);
+
+    const isInMiddleOfText = pos => CaretPosition.isTextPosition(pos) && !pos.isAtStart() && !pos.isAtEnd();
+    const getClosestBlock = (root, pos) => {
+      const parentBlocks = filter$6(parentsAndSelf(SugarElement.fromDom(pos.container()), root), isBlock$2);
+      return head(parentBlocks).getOr(root);
+    };
+    const hasSpaceBefore = (root, pos) => {
+      if (isInMiddleOfText(pos)) {
+        return isAfterSpace(pos);
+      } else {
+        return isAfterSpace(pos) || prevPosition(getClosestBlock(root, pos).dom, pos).exists(isAfterSpace);
+      }
+    };
+    const hasSpaceAfter = (root, pos) => {
+      if (isInMiddleOfText(pos)) {
+        return isBeforeSpace(pos);
+      } else {
+        return isBeforeSpace(pos) || nextPosition(getClosestBlock(root, pos).dom, pos).exists(isBeforeSpace);
+      }
+    };
+    const isPreValue = value => contains$2([
+      'pre',
+      'pre-wrap'
+    ], value);
+    const isInPre = pos => getElementFromPosition(pos).bind(elm => closest$4(elm, isElement$7)).exists(elm => isPreValue(get$7(elm, 'white-space')));
+    const isAtBeginningOfBody = (root, pos) => prevPosition(root.dom, pos).isNone();
+    const isAtEndOfBody = (root, pos) => nextPosition(root.dom, pos).isNone();
+    const isAtLineBoundary = (root, pos) => isAtBeginningOfBody(root, pos) || isAtEndOfBody(root, pos) || isAtStartOfBlock(root, pos) || isAtEndOfBlock(root, pos) || isAfterBr(root, pos) || isBeforeBr$1(root, pos);
+    const needsToHaveNbsp = (root, pos) => {
+      if (isInPre(pos)) {
+        return false;
+      } else {
+        return isAtLineBoundary(root, pos) || hasSpaceBefore(root, pos) || hasSpaceAfter(root, pos);
+      }
+    };
+    const needsToBeNbspLeft = (root, pos) => {
+      if (isInPre(pos)) {
+        return false;
+      } else {
+        return isAtStartOfBlock(root, pos) || isBeforeBlock(root, pos) || isAfterBr(root, pos) || hasSpaceBefore(root, pos);
+      }
+    };
+    const leanRight = pos => {
+      const container = pos.container();
+      const offset = pos.offset();
+      if (isText$8(container) && offset < container.data.length) {
+        return CaretPosition(container, offset + 1);
+      } else {
+        return pos;
+      }
+    };
+    const needsToBeNbspRight = (root, pos) => {
+      if (isInPre(pos)) {
+        return false;
+      } else {
+        return isAtEndOfBlock(root, pos) || isAfterBlock(root, pos) || isBeforeBr$1(root, pos) || hasSpaceAfter(root, pos);
+      }
+    };
+    const needsToBeNbsp = (root, pos) => needsToBeNbspLeft(root, pos) || needsToBeNbspRight(root, leanRight(pos));
+    const isNbspAt = (text, offset) => isNbsp(text.charAt(offset));
+    const hasNbsp = pos => {
+      const container = pos.container();
+      return isText$8(container) && contains$1(container.data, nbsp);
+    };
+    const normalizeNbspMiddle = text => {
+      const chars = text.split('');
+      return map$3(chars, (chr, i) => {
+        if (isNbsp(chr) && i > 0 && i < chars.length - 1 && isContent(chars[i - 1]) && isContent(chars[i + 1])) {
+          return ' ';
+        } else {
+          return chr;
+        }
+      }).join('');
+    };
+    const normalizeNbspAtStart = (root, node) => {
+      const text = node.data;
+      const firstPos = CaretPosition(node, 0);
+      if (isNbspAt(text, 0) && !needsToBeNbsp(root, firstPos)) {
+        node.data = ' ' + text.slice(1);
+        return true;
+      } else {
+        return false;
+      }
+    };
+    const normalizeNbspInMiddleOfTextNode = node => {
+      const text = node.data;
+      const newText = normalizeNbspMiddle(text);
+      if (newText !== text) {
+        node.data = newText;
+        return true;
+      } else {
+        return false;
+      }
+    };
+    const normalizeNbspAtEnd = (root, node) => {
+      const text = node.data;
+      const lastPos = CaretPosition(node, text.length - 1);
+      if (isNbspAt(text, text.length - 1) && !needsToBeNbsp(root, lastPos)) {
+        node.data = text.slice(0, -1) + ' ';
+        return true;
+      } else {
+        return false;
+      }
+    };
+    const normalizeNbsps = (root, pos) => Optional.some(pos).filter(hasNbsp).bind(pos => {
+      const container = pos.container();
+      const normalized = normalizeNbspAtStart(root, container) || normalizeNbspInMiddleOfTextNode(container) || normalizeNbspAtEnd(root, container);
+      return normalized ? Optional.some(pos) : Optional.none();
+    });
+    const normalizeNbspsInEditor = editor => {
+      const root = SugarElement.fromDom(editor.getBody());
+      if (editor.selection.isCollapsed()) {
+        normalizeNbsps(root, CaretPosition.fromRangeStart(editor.selection.getRng())).each(pos => {
+          editor.selection.setRng(pos.toRange());
+        });
+      }
+    };
+
+    const normalize$1 = (node, offset, count) => {
+      if (count === 0) {
+        return;
+      }
+      const elm = SugarElement.fromDom(node);
+      const root = ancestor$3(elm, isBlock$2).getOr(elm);
+      const whitespace = node.data.slice(offset, offset + count);
+      const isEndOfContent = offset + count >= node.data.length && needsToBeNbspRight(root, CaretPosition(node, node.data.length));
+      const isStartOfContent = offset === 0 && needsToBeNbspLeft(root, CaretPosition(node, 0));
+      node.replaceData(offset, count, normalize$4(whitespace, 4, isStartOfContent, isEndOfContent));
+    };
+    const normalizeWhitespaceAfter = (node, offset) => {
+      const content = node.data.slice(offset);
+      const whitespaceCount = content.length - lTrim(content).length;
+      normalize$1(node, offset, whitespaceCount);
+    };
+    const normalizeWhitespaceBefore = (node, offset) => {
+      const content = node.data.slice(0, offset);
+      const whitespaceCount = content.length - rTrim(content).length;
+      normalize$1(node, offset - whitespaceCount, whitespaceCount);
+    };
+    const mergeTextNodes = (prevNode, nextNode, normalizeWhitespace, mergeToPrev = true) => {
+      const whitespaceOffset = rTrim(prevNode.data).length;
+      const newNode = mergeToPrev ? prevNode : nextNode;
+      const removeNode = mergeToPrev ? nextNode : prevNode;
+      if (mergeToPrev) {
+        newNode.appendData(removeNode.data);
+      } else {
+        newNode.insertData(0, removeNode.data);
+      }
+      remove$5(SugarElement.fromDom(removeNode));
+      if (normalizeWhitespace) {
+        normalizeWhitespaceAfter(newNode, whitespaceOffset);
+      }
+      return newNode;
+    };
+
+    const needsReposition = (pos, elm) => {
+      const container = pos.container();
+      const offset = pos.offset();
+      return CaretPosition.isTextPosition(pos) === false && container === elm.parentNode && offset > CaretPosition.before(elm).offset();
+    };
+    const reposition = (elm, pos) => needsReposition(pos, elm) ? CaretPosition(pos.container(), pos.offset() - 1) : pos;
+    const beforeOrStartOf = node => isText$8(node) ? CaretPosition(node, 0) : CaretPosition.before(node);
+    const afterOrEndOf = node => isText$8(node) ? CaretPosition(node, node.data.length) : CaretPosition.after(node);
+    const getPreviousSiblingCaretPosition = elm => {
+      if (isCaretCandidate$3(elm.previousSibling)) {
+        return Optional.some(afterOrEndOf(elm.previousSibling));
+      } else {
+        return elm.previousSibling ? lastPositionIn(elm.previousSibling) : Optional.none();
+      }
+    };
+    const getNextSiblingCaretPosition = elm => {
+      if (isCaretCandidate$3(elm.nextSibling)) {
+        return Optional.some(beforeOrStartOf(elm.nextSibling));
+      } else {
+        return elm.nextSibling ? firstPositionIn(elm.nextSibling) : Optional.none();
+      }
+    };
+    const findCaretPositionBackwardsFromElm = (rootElement, elm) => {
+      const startPosition = CaretPosition.before(elm.previousSibling ? elm.previousSibling : elm.parentNode);
+      return prevPosition(rootElement, startPosition).fold(() => nextPosition(rootElement, CaretPosition.after(elm)), Optional.some);
+    };
+    const findCaretPositionForwardsFromElm = (rootElement, elm) => nextPosition(rootElement, CaretPosition.after(elm)).fold(() => prevPosition(rootElement, CaretPosition.before(elm)), Optional.some);
+    const findCaretPositionBackwards = (rootElement, elm) => getPreviousSiblingCaretPosition(elm).orThunk(() => getNextSiblingCaretPosition(elm)).orThunk(() => findCaretPositionBackwardsFromElm(rootElement, elm));
+    const findCaretPositionForward = (rootElement, elm) => getNextSiblingCaretPosition(elm).orThunk(() => getPreviousSiblingCaretPosition(elm)).orThunk(() => findCaretPositionForwardsFromElm(rootElement, elm));
+    const findCaretPosition = (forward, rootElement, elm) => forward ? findCaretPositionForward(rootElement, elm) : findCaretPositionBackwards(rootElement, elm);
+    const findCaretPosOutsideElmAfterDelete = (forward, rootElement, elm) => findCaretPosition(forward, rootElement, elm).map(curry(reposition, elm));
+    const setSelection$1 = (editor, forward, pos) => {
+      pos.fold(() => {
+        editor.focus();
+      }, pos => {
+        editor.selection.setRng(pos.toRange(), forward);
+      });
+    };
+    const eqRawNode = rawNode => elm => elm.dom === rawNode;
+    const isBlock = (editor, elm) => elm && has$2(editor.schema.getBlockElements(), name(elm));
+    const paddEmptyBlock = elm => {
+      if (isEmpty$2(elm)) {
+        const br = SugarElement.fromHtml('<br data-mce-bogus="1">');
+        empty(elm);
+        append$1(elm, br);
+        return Optional.some(CaretPosition.before(br.dom));
+      } else {
+        return Optional.none();
+      }
+    };
+    const deleteNormalized = (elm, afterDeletePosOpt, normalizeWhitespace) => {
+      const prevTextOpt = prevSibling(elm).filter(isText$9);
+      const nextTextOpt = nextSibling(elm).filter(isText$9);
+      remove$5(elm);
+      return lift3(prevTextOpt, nextTextOpt, afterDeletePosOpt, (prev, next, pos) => {
+        const prevNode = prev.dom, nextNode = next.dom;
+        const offset = prevNode.data.length;
+        mergeTextNodes(prevNode, nextNode, normalizeWhitespace);
+        return pos.container() === nextNode ? CaretPosition(prevNode, offset) : pos;
+      }).orThunk(() => {
+        if (normalizeWhitespace) {
+          prevTextOpt.each(elm => normalizeWhitespaceBefore(elm.dom, elm.dom.length));
+          nextTextOpt.each(elm => normalizeWhitespaceAfter(elm.dom, 0));
+        }
+        return afterDeletePosOpt;
+      });
+    };
+    const isInlineElement = (editor, element) => has$2(editor.schema.getTextInlineElements(), name(element));
+    const deleteElement$2 = (editor, forward, elm, moveCaret = true) => {
+      const afterDeletePos = findCaretPosOutsideElmAfterDelete(forward, editor.getBody(), elm.dom);
+      const parentBlock = ancestor$3(elm, curry(isBlock, editor), eqRawNode(editor.getBody()));
+      const normalizedAfterDeletePos = deleteNormalized(elm, afterDeletePos, isInlineElement(editor, elm));
+      if (editor.dom.isEmpty(editor.getBody())) {
+        editor.setContent('');
+        editor.selection.setCursorLocation();
+      } else {
+        parentBlock.bind(paddEmptyBlock).fold(() => {
+          if (moveCaret) {
+            setSelection$1(editor, forward, normalizedAfterDeletePos);
+          }
+        }, paddPos => {
+          if (moveCaret) {
+            setSelection$1(editor, forward, Optional.some(paddPos));
+          }
+        });
+      }
+    };
+
+    const isRootFromElement = root => cur => eq(root, cur);
+    const getTableCells = table => descendants(table, 'td,th');
+    const getTableDetailsFromRange = (rng, isRoot) => {
+      const getTable = node => getClosestTable(SugarElement.fromDom(node), isRoot);
+      const startTable = getTable(rng.startContainer);
+      const endTable = getTable(rng.endContainer);
+      const isStartInTable = startTable.isSome();
+      const isEndInTable = endTable.isSome();
+      const isSameTable = lift2(startTable, endTable, eq).getOr(false);
+      const isMultiTable = !isSameTable && isStartInTable && isEndInTable;
+      return {
+        startTable,
+        endTable,
+        isStartInTable,
+        isEndInTable,
+        isSameTable,
+        isMultiTable
+      };
+    };
+
+    const tableCellRng = (start, end) => ({
+      start,
+      end
+    });
+    const tableSelection = (rng, table, cells) => ({
+      rng,
+      table,
+      cells
+    });
+    const deleteAction = Adt.generate([
+      {
+        singleCellTable: [
+          'rng',
+          'cell'
+        ]
+      },
+      { fullTable: ['table'] },
+      {
+        partialTable: [
+          'cells',
+          'outsideDetails'
+        ]
+      },
+      {
+        multiTable: [
+          'startTableCells',
+          'endTableCells',
+          'betweenRng'
+        ]
+      }
+    ]);
+    const getClosestCell$1 = (container, isRoot) => closest$3(SugarElement.fromDom(container), 'td,th', isRoot);
+    const isExpandedCellRng = cellRng => !eq(cellRng.start, cellRng.end);
+    const getTableFromCellRng = (cellRng, isRoot) => getClosestTable(cellRng.start, isRoot).bind(startParentTable => getClosestTable(cellRng.end, isRoot).bind(endParentTable => someIf(eq(startParentTable, endParentTable), startParentTable)));
+    const isSingleCellTable = (cellRng, isRoot) => !isExpandedCellRng(cellRng) && getTableFromCellRng(cellRng, isRoot).exists(table => {
+      const rows = table.dom.rows;
+      return rows.length === 1 && rows[0].cells.length === 1;
+    });
+    const getCellRng = (rng, isRoot) => {
+      const startCell = getClosestCell$1(rng.startContainer, isRoot);
+      const endCell = getClosestCell$1(rng.endContainer, isRoot);
+      return lift2(startCell, endCell, tableCellRng);
+    };
+    const getCellRangeFromStartTable = isRoot => startCell => getClosestTable(startCell, isRoot).bind(table => last$3(getTableCells(table)).map(endCell => tableCellRng(startCell, endCell)));
+    const getCellRangeFromEndTable = isRoot => endCell => getClosestTable(endCell, isRoot).bind(table => head(getTableCells(table)).map(startCell => tableCellRng(startCell, endCell)));
+    const getTableSelectionFromCellRng = isRoot => cellRng => getTableFromCellRng(cellRng, isRoot).map(table => tableSelection(cellRng, table, getTableCells(table)));
+    const getTableSelections = (cellRng, selectionDetails, rng, isRoot) => {
+      if (rng.collapsed || !cellRng.forall(isExpandedCellRng)) {
+        return Optional.none();
+      } else if (selectionDetails.isSameTable) {
+        const sameTableSelection = cellRng.bind(getTableSelectionFromCellRng(isRoot));
+        return Optional.some({
+          start: sameTableSelection,
+          end: sameTableSelection
+        });
+      } else {
+        const startCell = getClosestCell$1(rng.startContainer, isRoot);
+        const endCell = getClosestCell$1(rng.endContainer, isRoot);
+        const startTableSelection = startCell.bind(getCellRangeFromStartTable(isRoot)).bind(getTableSelectionFromCellRng(isRoot));
+        const endTableSelection = endCell.bind(getCellRangeFromEndTable(isRoot)).bind(getTableSelectionFromCellRng(isRoot));
+        return Optional.some({
+          start: startTableSelection,
+          end: endTableSelection
+        });
+      }
+    };
+    const getCellIndex = (cells, cell) => findIndex$2(cells, x => eq(x, cell));
+    const getSelectedCells = tableSelection => lift2(getCellIndex(tableSelection.cells, tableSelection.rng.start), getCellIndex(tableSelection.cells, tableSelection.rng.end), (startIndex, endIndex) => tableSelection.cells.slice(startIndex, endIndex + 1));
+    const isSingleCellTableContentSelected = (optCellRng, rng, isRoot) => optCellRng.exists(cellRng => isSingleCellTable(cellRng, isRoot) && hasAllContentsSelected(cellRng.start, rng));
+    const unselectCells = (rng, selectionDetails) => {
+      const {startTable, endTable} = selectionDetails;
+      const otherContentRng = rng.cloneRange();
+      startTable.each(table => otherContentRng.setStartAfter(table.dom));
+      endTable.each(table => otherContentRng.setEndBefore(table.dom));
+      return otherContentRng;
+    };
+    const handleSingleTable = (cellRng, selectionDetails, rng, isRoot) => getTableSelections(cellRng, selectionDetails, rng, isRoot).bind(({start, end}) => start.or(end)).bind(tableSelection => {
+      const {isSameTable} = selectionDetails;
+      const selectedCells = getSelectedCells(tableSelection).getOr([]);
+      if (isSameTable && tableSelection.cells.length === selectedCells.length) {
+        return Optional.some(deleteAction.fullTable(tableSelection.table));
+      } else if (selectedCells.length > 0) {
+        if (isSameTable) {
+          return Optional.some(deleteAction.partialTable(selectedCells, Optional.none()));
+        } else {
+          const otherContentRng = unselectCells(rng, selectionDetails);
+          return Optional.some(deleteAction.partialTable(selectedCells, Optional.some({
+            ...selectionDetails,
+            rng: otherContentRng
+          })));
+        }
+      } else {
+        return Optional.none();
+      }
+    });
+    const handleMultiTable = (cellRng, selectionDetails, rng, isRoot) => getTableSelections(cellRng, selectionDetails, rng, isRoot).bind(({start, end}) => {
+      const startTableSelectedCells = start.bind(getSelectedCells).getOr([]);
+      const endTableSelectedCells = end.bind(getSelectedCells).getOr([]);
+      if (startTableSelectedCells.length > 0 && endTableSelectedCells.length > 0) {
+        const otherContentRng = unselectCells(rng, selectionDetails);
+        return Optional.some(deleteAction.multiTable(startTableSelectedCells, endTableSelectedCells, otherContentRng));
+      } else {
+        return Optional.none();
+      }
+    });
+    const getActionFromRange = (root, rng) => {
+      const isRoot = isRootFromElement(root);
+      const optCellRng = getCellRng(rng, isRoot);
+      const selectionDetails = getTableDetailsFromRange(rng, isRoot);
+      if (isSingleCellTableContentSelected(optCellRng, rng, isRoot)) {
+        return optCellRng.map(cellRng => deleteAction.singleCellTable(rng, cellRng.start));
+      } else if (selectionDetails.isMultiTable) {
+        return handleMultiTable(optCellRng, selectionDetails, rng, isRoot);
+      } else {
+        return handleSingleTable(optCellRng, selectionDetails, rng, isRoot);
+      }
+    };
+
+    const freefallRtl = root => {
+      const child = isComment$1(root) ? prevSibling(root) : lastChild(root);
+      return child.bind(freefallRtl).orThunk(() => Optional.some(root));
+    };
+    const cleanCells = cells => each$g(cells, cell => {
+      remove$a(cell, 'contenteditable');
+      fillWithPaddingBr(cell);
+    });
+    const getOutsideBlock = (editor, container) => Optional.from(editor.dom.getParent(container, editor.dom.isBlock)).map(SugarElement.fromDom);
+    const handleEmptyBlock = (editor, startInTable, emptyBlock) => {
+      emptyBlock.each(block => {
+        if (startInTable) {
+          remove$5(block);
+        } else {
+          fillWithPaddingBr(block);
+          editor.selection.setCursorLocation(block.dom, 0);
+        }
+      });
+    };
+    const deleteContentInsideCell = (editor, cell, rng, isFirstCellInSelection) => {
+      const insideTableRng = rng.cloneRange();
+      if (isFirstCellInSelection) {
+        insideTableRng.setStart(rng.startContainer, rng.startOffset);
+        insideTableRng.setEndAfter(cell.dom.lastChild);
+      } else {
+        insideTableRng.setStartBefore(cell.dom.firstChild);
+        insideTableRng.setEnd(rng.endContainer, rng.endOffset);
+      }
+      deleteCellContents(editor, insideTableRng, cell, false).each(action => action());
+    };
+    const collapseAndRestoreCellSelection = editor => {
+      const selectedCells = getCellsFromEditor(editor);
+      const selectedNode = SugarElement.fromDom(editor.selection.getNode());
+      if (isTableCell$5(selectedNode.dom) && isEmpty$2(selectedNode)) {
+        editor.selection.setCursorLocation(selectedNode.dom, 0);
+      } else {
+        editor.selection.collapse(true);
+      }
+      if (selectedCells.length > 1 && exists(selectedCells, cell => eq(cell, selectedNode))) {
+        set$2(selectedNode, 'data-mce-selected', '1');
+      }
+    };
+    const emptySingleTableCells = (editor, cells, outsideDetails) => Optional.some(() => {
+      const editorRng = editor.selection.getRng();
+      const cellsToClean = outsideDetails.bind(({rng, isStartInTable}) => {
+        const outsideBlock = getOutsideBlock(editor, isStartInTable ? rng.endContainer : rng.startContainer);
+        rng.deleteContents();
+        handleEmptyBlock(editor, isStartInTable, outsideBlock.filter(isEmpty$2));
+        const endPointCell = isStartInTable ? cells[0] : cells[cells.length - 1];
+        deleteContentInsideCell(editor, endPointCell, editorRng, isStartInTable);
+        if (!isEmpty$2(endPointCell)) {
+          return Optional.some(isStartInTable ? cells.slice(1) : cells.slice(0, -1));
+        } else {
+          return Optional.none();
+        }
+      }).getOr(cells);
+      cleanCells(cellsToClean);
+      collapseAndRestoreCellSelection(editor);
+    });
+    const emptyMultiTableCells = (editor, startTableCells, endTableCells, betweenRng) => Optional.some(() => {
+      const rng = editor.selection.getRng();
+      const startCell = startTableCells[0];
+      const endCell = endTableCells[endTableCells.length - 1];
+      deleteContentInsideCell(editor, startCell, rng, true);
+      deleteContentInsideCell(editor, endCell, rng, false);
+      const startTableCellsToClean = isEmpty$2(startCell) ? startTableCells : startTableCells.slice(1);
+      const endTableCellsToClean = isEmpty$2(endCell) ? endTableCells : endTableCells.slice(0, -1);
+      cleanCells(startTableCellsToClean.concat(endTableCellsToClean));
+      betweenRng.deleteContents();
+      collapseAndRestoreCellSelection(editor);
+    });
+    const deleteCellContents = (editor, rng, cell, moveSelection = true) => Optional.some(() => {
+      rng.deleteContents();
+      const lastNode = freefallRtl(cell).getOr(cell);
+      const lastBlock = SugarElement.fromDom(editor.dom.getParent(lastNode.dom, editor.dom.isBlock));
+      if (isEmpty$2(lastBlock)) {
+        fillWithPaddingBr(lastBlock);
+        if (moveSelection) {
+          editor.selection.setCursorLocation(lastBlock.dom, 0);
+        }
+      }
+      if (!eq(cell, lastBlock)) {
+        const additionalCleanupNodes = is$2(parent(lastBlock), cell) ? [] : siblings(lastBlock);
+        each$g(additionalCleanupNodes.concat(children(cell)), node => {
+          if (!eq(node, lastBlock) && !contains(node, lastBlock) && isEmpty$2(node)) {
+            remove$5(node);
+          }
+        });
+      }
+    });
+    const deleteTableElement = (editor, table) => Optional.some(() => deleteElement$2(editor, false, table));
+    const deleteCellRange = (editor, rootElm, rng) => getActionFromRange(rootElm, rng).bind(action => action.fold(curry(deleteCellContents, editor), curry(deleteTableElement, editor), curry(emptySingleTableCells, editor), curry(emptyMultiTableCells, editor)));
+    const deleteCaptionRange = (editor, caption) => emptyElement(editor, caption);
+    const deleteTableRange = (editor, rootElm, rng, startElm) => getParentCaption(rootElm, startElm).fold(() => deleteCellRange(editor, rootElm, rng), caption => deleteCaptionRange(editor, caption));
+    const deleteRange$2 = (editor, startElm, selectedCells) => {
+      const rootNode = SugarElement.fromDom(editor.getBody());
+      const rng = editor.selection.getRng();
+      return selectedCells.length !== 0 ? emptySingleTableCells(editor, selectedCells, Optional.none()) : deleteTableRange(editor, rootNode, rng, startElm);
+    };
+    const getParentCell = (rootElm, elm) => find$2(parentsAndSelf(elm, rootElm), isTableCell$4);
+    const getParentCaption = (rootElm, elm) => find$2(parentsAndSelf(elm, rootElm), isTag('caption'));
+    const deleteBetweenCells = (editor, rootElm, forward, fromCell, from) => navigate(forward, editor.getBody(), from).bind(to => getParentCell(rootElm, SugarElement.fromDom(to.getNode())).bind(toCell => eq(toCell, fromCell) ? Optional.none() : Optional.some(noop)));
+    const emptyElement = (editor, elm) => Optional.some(() => {
+      fillWithPaddingBr(elm);
+      editor.selection.setCursorLocation(elm.dom, 0);
+    });
+    const isDeleteOfLastCharPos = (fromCaption, forward, from, to) => firstPositionIn(fromCaption.dom).bind(first => lastPositionIn(fromCaption.dom).map(last => forward ? from.isEqual(first) && to.isEqual(last) : from.isEqual(last) && to.isEqual(first))).getOr(true);
+    const emptyCaretCaption = (editor, elm) => emptyElement(editor, elm);
+    const validateCaretCaption = (rootElm, fromCaption, to) => getParentCaption(rootElm, SugarElement.fromDom(to.getNode())).fold(() => Optional.some(noop), toCaption => someIf(!eq(toCaption, fromCaption), noop));
+    const deleteCaretInsideCaption = (editor, rootElm, forward, fromCaption, from) => navigate(forward, editor.getBody(), from).fold(() => Optional.some(noop), to => isDeleteOfLastCharPos(fromCaption, forward, from, to) ? emptyCaretCaption(editor, fromCaption) : validateCaretCaption(rootElm, fromCaption, to));
+    const deleteCaretCells = (editor, forward, rootElm, startElm) => {
+      const from = CaretPosition.fromRangeStart(editor.selection.getRng());
+      return getParentCell(rootElm, startElm).bind(fromCell => isEmpty$2(fromCell) ? emptyElement(editor, fromCell) : deleteBetweenCells(editor, rootElm, forward, fromCell, from));
+    };
+    const deleteCaretCaption = (editor, forward, rootElm, fromCaption) => {
+      const from = CaretPosition.fromRangeStart(editor.selection.getRng());
+      return isEmpty$2(fromCaption) ? emptyElement(editor, fromCaption) : deleteCaretInsideCaption(editor, rootElm, forward, fromCaption, from);
+    };
+    const isNearTable = (forward, pos) => forward ? isBeforeTable(pos) : isAfterTable(pos);
+    const isBeforeOrAfterTable = (editor, forward) => {
+      const fromPos = CaretPosition.fromRangeStart(editor.selection.getRng());
+      return isNearTable(forward, fromPos) || fromPosition(forward, editor.getBody(), fromPos).exists(pos => isNearTable(forward, pos));
+    };
+    const deleteCaret$3 = (editor, forward, startElm) => {
+      const rootElm = SugarElement.fromDom(editor.getBody());
+      return getParentCaption(rootElm, startElm).fold(() => deleteCaretCells(editor, forward, rootElm, startElm).orThunk(() => someIf(isBeforeOrAfterTable(editor, forward), noop)), fromCaption => deleteCaretCaption(editor, forward, rootElm, fromCaption));
+    };
+    const backspaceDelete$9 = (editor, forward) => {
+      const startElm = SugarElement.fromDom(editor.selection.getStart(true));
+      const cells = getCellsFromEditor(editor);
+      return editor.selection.isCollapsed() && cells.length === 0 ? deleteCaret$3(editor, forward, startElm) : deleteRange$2(editor, startElm, cells);
+    };
+
+    const getContentEditableRoot$1 = (root, node) => {
+      while (node && node !== root) {
+        if (isContentEditableTrue$4(node) || isContentEditableFalse$a(node)) {
+          return node;
+        }
+        node = node.parentNode;
+      }
+      return null;
+    };
+
+    const traverse = (node, fn) => {
+      fn(node);
+      if (node.firstChild) {
+        traverse(node.firstChild, fn);
+      }
+      if (node.next) {
+        traverse(node.next, fn);
+      }
+    };
+    const matchNode$1 = (nodeFilters, attributeFilters, node, matches) => {
+      const name = node.name;
+      for (let ni = 0, nl = nodeFilters.length; ni < nl; ni++) {
+        const filter = nodeFilters[ni];
+        if (filter.name === name) {
+          const match = matches.nodes[name];
+          if (match) {
+            match.nodes.push(node);
+          } else {
+            matches.nodes[name] = {
+              filter,
+              nodes: [node]
+            };
+          }
+        }
+      }
+      if (node.attributes) {
+        for (let ai = 0, al = attributeFilters.length; ai < al; ai++) {
+          const filter = attributeFilters[ai];
+          const attrName = filter.name;
+          if (attrName in node.attributes.map) {
+            const match = matches.attributes[attrName];
+            if (match) {
+              match.nodes.push(node);
+            } else {
+              matches.attributes[attrName] = {
+                filter,
+                nodes: [node]
+              };
+            }
+          }
+        }
+      }
+    };
+    const findMatchingNodes = (nodeFilters, attributeFilters, node) => {
+      const matches = {
+        nodes: {},
+        attributes: {}
+      };
+      if (node.firstChild) {
+        traverse(node.firstChild, node => {
+          matchNode$1(nodeFilters, attributeFilters, node, matches);
+        });
+      }
+      return matches;
+    };
+    const runFilters = (matches, args) => {
+      const run = matchRecord => {
+        each$f(matchRecord, match => {
+          const nodes = filter$6(match.nodes, node => isNonNullable(node.parent));
+          each$g(match.filter.callbacks, callback => {
+            callback(nodes, match.filter.name, args);
+          });
+        });
+      };
+      run(matches.nodes);
+      run(matches.attributes);
+    };
+    const filter$3 = (nodeFilters, attributeFilters, node, args = {}) => {
+      const matches = findMatchingNodes(nodeFilters, attributeFilters, node);
+      runFilters(matches, args);
+    };
+
+    const paddEmptyNode = (settings, args, blockElements, node) => {
+      if (args.insert && blockElements[node.name]) {
+        node.empty().append(new AstNode('br', 1));
+      } else {
+        node.empty().append(new AstNode('#text', 3)).value = nbsp;
+      }
+    };
+    const isPaddedWithNbsp = node => hasOnlyChild(node, '#text') && node.firstChild.value === nbsp;
+    const hasOnlyChild = (node, name) => node && node.firstChild && node.firstChild === node.lastChild && node.firstChild.name === name;
+    const isPadded = (schema, node) => {
+      const rule = schema.getElementRule(node.name);
+      return rule && rule.paddEmpty;
+    };
+    const isEmpty = (schema, nonEmptyElements, whitespaceElements, node) => node.isEmpty(nonEmptyElements, whitespaceElements, node => isPadded(schema, node));
+    const isLineBreakNode = (node, blockElements) => node && (node.name in blockElements || node.name === 'br');
+
+    const removeOrUnwrapInvalidNode = (node, schema, originalNodeParent = node.parent) => {
+      if (schema.getSpecialElements()[node.name]) {
+        node.empty().remove();
+      } else {
+        const children = node.children();
+        for (const childNode of children) {
+          if (!schema.isValidChild(originalNodeParent.name, childNode.name)) {
+            removeOrUnwrapInvalidNode(childNode, schema, originalNodeParent);
+          }
+        }
+        node.unwrap();
+      }
+    };
+    const cleanInvalidNodes = (nodes, schema, onCreate = noop) => {
+      const textBlockElements = schema.getTextBlockElements();
+      const nonEmptyElements = schema.getNonEmptyElements();
+      const whitespaceElements = schema.getWhitespaceElements();
+      const nonSplittableElements = Tools.makeMap('tr,td,th,tbody,thead,tfoot,table');
+      const fixed = new Set();
+      for (let ni = 0; ni < nodes.length; ni++) {
+        const node = nodes[ni];
+        let parent;
+        let newParent;
+        let tempNode;
+        if (!node.parent || fixed.has(node)) {
+          continue;
+        }
+        if (textBlockElements[node.name] && node.parent.name === 'li') {
+          let sibling = node.next;
+          while (sibling) {
+            if (textBlockElements[sibling.name]) {
+              sibling.name = 'li';
+              fixed.add(sibling);
+              node.parent.insert(sibling, node.parent);
+            } else {
+              break;
+            }
+            sibling = sibling.next;
+          }
+          node.unwrap();
+          continue;
+        }
+        const parents = [node];
+        for (parent = node.parent; parent && !schema.isValidChild(parent.name, node.name) && !nonSplittableElements[parent.name]; parent = parent.parent) {
+          parents.push(parent);
+        }
+        if (parent && parents.length > 1) {
+          if (schema.isValidChild(parent.name, node.name)) {
+            parents.reverse();
+            newParent = parents[0].clone();
+            onCreate(newParent);
+            let currentNode = newParent;
+            for (let i = 0; i < parents.length - 1; i++) {
+              if (schema.isValidChild(currentNode.name, parents[i].name)) {
+                tempNode = parents[i].clone();
+                onCreate(tempNode);
+                currentNode.append(tempNode);
+              } else {
+                tempNode = currentNode;
+              }
+              for (let childNode = parents[i].firstChild; childNode && childNode !== parents[i + 1];) {
+                const nextNode = childNode.next;
+                tempNode.append(childNode);
+                childNode = nextNode;
+              }
+              currentNode = tempNode;
+            }
+            if (!isEmpty(schema, nonEmptyElements, whitespaceElements, newParent)) {
+              parent.insert(newParent, parents[0], true);
+              parent.insert(node, newParent);
+            } else {
+              parent.insert(node, parents[0], true);
+            }
+            parent = parents[0];
+            if (isEmpty(schema, nonEmptyElements, whitespaceElements, parent) || hasOnlyChild(parent, 'br')) {
+              parent.empty().remove();
+            }
+          } else {
+            removeOrUnwrapInvalidNode(node, schema);
+          }
+        } else if (node.parent) {
+          if (node.name === 'li') {
+            let sibling = node.prev;
+            if (sibling && (sibling.name === 'ul' || sibling.name === 'ol')) {
+              sibling.append(node);
+              continue;
+            }
+            sibling = node.next;
+            if (sibling && (sibling.name === 'ul' || sibling.name === 'ol')) {
+              sibling.insert(node, sibling.firstChild, true);
+              continue;
+            }
+            const wrapper = new AstNode('ul', 1);
+            onCreate(wrapper);
+            node.wrap(wrapper);
+            continue;
+          }
+          if (schema.isValidChild(node.parent.name, 'div') && schema.isValidChild('div', node.name)) {
+            const wrapper = new AstNode('div', 1);
+            onCreate(wrapper);
+            node.wrap(wrapper);
+          } else {
+            removeOrUnwrapInvalidNode(node, schema);
+          }
+        }
+      }
+    };
+
+    const createRange = (sc, so, ec, eo) => {
+      const rng = document.createRange();
+      rng.setStart(sc, so);
+      rng.setEnd(ec, eo);
+      return rng;
+    };
+    const normalizeBlockSelectionRange = rng => {
+      const startPos = CaretPosition.fromRangeStart(rng);
+      const endPos = CaretPosition.fromRangeEnd(rng);
+      const rootNode = rng.commonAncestorContainer;
+      return fromPosition(false, rootNode, endPos).map(newEndPos => {
+        if (!isInSameBlock(startPos, endPos, rootNode) && isInSameBlock(startPos, newEndPos, rootNode)) {
+          return createRange(startPos.container(), startPos.offset(), newEndPos.container(), newEndPos.offset());
+        } else {
+          return rng;
+        }
+      }).getOr(rng);
+    };
+    const normalize = rng => rng.collapsed ? rng : normalizeBlockSelectionRange(rng);
+
+    const hasOnlyOneChild$1 = node => {
+      return node.firstChild && node.firstChild === node.lastChild;
+    };
+    const isPaddingNode = node => {
+      return node.name === 'br' || node.value === nbsp;
+    };
+    const isPaddedEmptyBlock = (schema, node) => {
+      const blockElements = schema.getBlockElements();
+      return blockElements[node.name] && hasOnlyOneChild$1(node) && isPaddingNode(node.firstChild);
+    };
+    const isEmptyFragmentElement = (schema, node) => {
+      const nonEmptyElements = schema.getNonEmptyElements();
+      return node && (node.isEmpty(nonEmptyElements) || isPaddedEmptyBlock(schema, node));
+    };
+    const isListFragment = (schema, fragment) => {
+      let firstChild = fragment.firstChild;
+      let lastChild = fragment.lastChild;
+      if (firstChild && firstChild.name === 'meta') {
+        firstChild = firstChild.next;
+      }
+      if (lastChild && lastChild.attr('id') === 'mce_marker') {
+        lastChild = lastChild.prev;
+      }
+      if (isEmptyFragmentElement(schema, lastChild)) {
+        lastChild = lastChild.prev;
+      }
+      if (!firstChild || firstChild !== lastChild) {
+        return false;
+      }
+      return firstChild.name === 'ul' || firstChild.name === 'ol';
+    };
+    const cleanupDomFragment = domFragment => {
+      const firstChild = domFragment.firstChild;
+      const lastChild = domFragment.lastChild;
+      if (firstChild && firstChild.nodeName === 'META') {
+        firstChild.parentNode.removeChild(firstChild);
+      }
+      if (lastChild && lastChild.id === 'mce_marker') {
+        lastChild.parentNode.removeChild(lastChild);
+      }
+      return domFragment;
+    };
+    const toDomFragment = (dom, serializer, fragment) => {
+      const html = serializer.serialize(fragment);
+      const domFragment = dom.createFragment(html);
+      return cleanupDomFragment(domFragment);
+    };
+    const listItems = elm => {
+      return filter$6(elm.childNodes, child => {
+        return child.nodeName === 'LI';
+      });
+    };
+    const isPadding = node => {
+      return node.data === nbsp || isBr$5(node);
+    };
+    const isListItemPadded = node => {
+      return node && node.firstChild && node.firstChild === node.lastChild && isPadding(node.firstChild);
+    };
+    const isEmptyOrPadded = elm => {
+      return !elm.firstChild || isListItemPadded(elm);
+    };
+    const trimListItems = elms => {
+      return elms.length > 0 && isEmptyOrPadded(elms[elms.length - 1]) ? elms.slice(0, -1) : elms;
+    };
+    const getParentLi = (dom, node) => {
+      const parentBlock = dom.getParent(node, dom.isBlock);
+      return parentBlock && parentBlock.nodeName === 'LI' ? parentBlock : null;
+    };
+    const isParentBlockLi = (dom, node) => {
+      return !!getParentLi(dom, node);
+    };
+    const getSplit = (parentNode, rng) => {
+      const beforeRng = rng.cloneRange();
+      const afterRng = rng.cloneRange();
+      beforeRng.setStartBefore(parentNode);
+      afterRng.setEndAfter(parentNode);
+      return [
+        beforeRng.cloneContents(),
+        afterRng.cloneContents()
+      ];
+    };
+    const findFirstIn = (node, rootNode) => {
+      const caretPos = CaretPosition.before(node);
+      const caretWalker = CaretWalker(rootNode);
+      const newCaretPos = caretWalker.next(caretPos);
+      return newCaretPos ? newCaretPos.toRange() : null;
+    };
+    const findLastOf = (node, rootNode) => {
+      const caretPos = CaretPosition.after(node);
+      const caretWalker = CaretWalker(rootNode);
+      const newCaretPos = caretWalker.prev(caretPos);
+      return newCaretPos ? newCaretPos.toRange() : null;
+    };
+    const insertMiddle = (target, elms, rootNode, rng) => {
+      const parts = getSplit(target, rng);
+      const parentElm = target.parentNode;
+      parentElm.insertBefore(parts[0], target);
+      Tools.each(elms, li => {
+        parentElm.insertBefore(li, target);
+      });
+      parentElm.insertBefore(parts[1], target);
+      parentElm.removeChild(target);
+      return findLastOf(elms[elms.length - 1], rootNode);
+    };
+    const insertBefore$1 = (target, elms, rootNode) => {
+      const parentElm = target.parentNode;
+      Tools.each(elms, elm => {
+        parentElm.insertBefore(elm, target);
+      });
+      return findFirstIn(target, rootNode);
+    };
+    const insertAfter$1 = (target, elms, rootNode, dom) => {
+      dom.insertAfter(elms.reverse(), target);
+      return findLastOf(elms[0], rootNode);
+    };
+    const insertAtCaret$1 = (serializer, dom, rng, fragment) => {
+      const domFragment = toDomFragment(dom, serializer, fragment);
+      const liTarget = getParentLi(dom, rng.startContainer);
+      const liElms = trimListItems(listItems(domFragment.firstChild));
+      const BEGINNING = 1, END = 2;
+      const rootNode = dom.getRoot();
+      const isAt = location => {
+        const caretPos = CaretPosition.fromRangeStart(rng);
+        const caretWalker = CaretWalker(dom.getRoot());
+        const newPos = location === BEGINNING ? caretWalker.prev(caretPos) : caretWalker.next(caretPos);
+        return newPos ? getParentLi(dom, newPos.getNode()) !== liTarget : true;
+      };
+      if (isAt(BEGINNING)) {
+        return insertBefore$1(liTarget, liElms, rootNode);
+      } else if (isAt(END)) {
+        return insertAfter$1(liTarget, liElms, rootNode, dom);
+      }
+      return insertMiddle(liTarget, liElms, rootNode, rng);
+    };
+
+    const isTableCell$1 = isTableCell$5;
+    const isTableCellContentSelected = (dom, rng, cell) => {
+      if (cell !== null) {
+        const endCell = dom.getParent(rng.endContainer, isTableCell$1);
+        return cell === endCell && hasAllContentsSelected(SugarElement.fromDom(cell), rng);
+      } else {
+        return false;
+      }
+    };
+    const validInsertion = (editor, value, parentNode) => {
+      if (parentNode.getAttribute('data-mce-bogus') === 'all') {
+        parentNode.parentNode.insertBefore(editor.dom.createFragment(value), parentNode);
+      } else {
+        const node = parentNode.firstChild;
+        const node2 = parentNode.lastChild;
+        if (!node || node === node2 && node.nodeName === 'BR') {
+          editor.dom.setHTML(parentNode, value);
+        } else {
+          editor.selection.setContent(value, { no_events: true });
+        }
+      }
+    };
+    const trimBrsFromTableCell = (dom, elm) => {
+      Optional.from(dom.getParent(elm, 'td,th')).map(SugarElement.fromDom).each(trimBlockTrailingBr);
+    };
+    const reduceInlineTextElements = (editor, merge) => {
+      const textInlineElements = editor.schema.getTextInlineElements();
+      const dom = editor.dom;
+      if (merge) {
+        const root = editor.getBody();
+        const elementUtils = ElementUtils(dom);
+        Tools.each(dom.select('*[data-mce-fragment]'), node => {
+          const isInline = isNonNullable(textInlineElements[node.nodeName.toLowerCase()]);
+          if (isInline && hasInheritableStyles(dom, node)) {
+            for (let parentNode = node.parentNode; isNonNullable(parentNode) && parentNode !== root; parentNode = parentNode.parentNode) {
+              const styleConflict = hasStyleConflict(dom, node, parentNode);
+              if (styleConflict) {
+                break;
+              }
+              if (elementUtils.compare(parentNode, node)) {
+                dom.remove(node, true);
+                break;
+              }
+            }
+          }
+        });
+      }
+    };
+    const markFragmentElements = fragment => {
+      let node = fragment;
+      while (node = node.walk()) {
+        if (node.type === 1) {
+          node.attr('data-mce-fragment', '1');
+        }
+      }
+    };
+    const unmarkFragmentElements = elm => {
+      Tools.each(elm.getElementsByTagName('*'), elm => {
+        elm.removeAttribute('data-mce-fragment');
+      });
+    };
+    const isPartOfFragment = node => {
+      return !!node.getAttribute('data-mce-fragment');
+    };
+    const canHaveChildren = (editor, node) => {
+      return node && !editor.schema.getVoidElements()[node.nodeName];
+    };
+    const moveSelectionToMarker = (editor, marker) => {
+      let nextRng;
+      const dom = editor.dom;
+      const selection = editor.selection;
+      if (!marker) {
+        return;
+      }
+      selection.scrollIntoView(marker);
+      const parentEditableElm = getContentEditableRoot$1(editor.getBody(), marker);
+      if (dom.getContentEditable(parentEditableElm) === 'false') {
+        dom.remove(marker);
+        selection.select(parentEditableElm);
+        return;
+      }
+      let rng = dom.createRng();
+      const node = marker.previousSibling;
+      if (isText$8(node)) {
+        rng.setStart(node, node.nodeValue.length);
+        const node2 = marker.nextSibling;
+        if (isText$8(node2)) {
+          node.appendData(node2.data);
+          node2.parentNode.removeChild(node2);
+        }
+      } else {
+        rng.setStartBefore(marker);
+        rng.setEndBefore(marker);
+      }
+      const findNextCaretRng = rng => {
+        let caretPos = CaretPosition.fromRangeStart(rng);
+        const caretWalker = CaretWalker(editor.getBody());
+        caretPos = caretWalker.next(caretPos);
+        if (caretPos) {
+          return caretPos.toRange();
+        }
+      };
+      const parentBlock = dom.getParent(marker, dom.isBlock);
+      dom.remove(marker);
+      if (parentBlock && dom.isEmpty(parentBlock)) {
+        empty(SugarElement.fromDom(parentBlock));
+        rng.setStart(parentBlock, 0);
+        rng.setEnd(parentBlock, 0);
+        if (!isTableCell$1(parentBlock) && !isPartOfFragment(parentBlock) && (nextRng = findNextCaretRng(rng))) {
+          rng = nextRng;
+          dom.remove(parentBlock);
+        } else {
+          dom.add(parentBlock, dom.create('br', { 'data-mce-bogus': '1' }));
+        }
+      }
+      selection.setRng(rng);
+    };
+    const deleteSelectedContent = editor => {
+      const dom = editor.dom;
+      const rng = normalize(editor.selection.getRng());
+      editor.selection.setRng(rng);
+      const startCell = dom.getParent(rng.startContainer, isTableCell$1);
+      if (isTableCellContentSelected(dom, rng, startCell)) {
+        deleteCellContents(editor, rng, SugarElement.fromDom(startCell));
+      } else {
+        editor.getDoc().execCommand('Delete', false, null);
+      }
+    };
+    const insertHtmlAtCaret = (editor, value, details) => {
+      let parentNode;
+      let rng, node;
+      const selection = editor.selection;
+      const dom = editor.dom;
+      const parser = editor.parser;
+      const merge = details.merge;
+      const serializer = HtmlSerializer({ validate: true }, editor.schema);
+      const bookmarkHtml = '<span id="mce_marker" data-mce-type="bookmark">&#xFEFF;</span>';
+      if (value.indexOf('{$caret}') === -1) {
+        value += '{$caret}';
+      }
+      value = value.replace(/\{\$caret\}/, bookmarkHtml);
+      rng = selection.getRng();
+      const caretElement = rng.startContainer || (rng.parentElement ? rng.parentElement() : null);
+      const body = editor.getBody();
+      if (caretElement === body && selection.isCollapsed()) {
+        if (dom.isBlock(body.firstChild) && canHaveChildren(editor, body.firstChild) && dom.isEmpty(body.firstChild)) {
+          rng = dom.createRng();
+          rng.setStart(body.firstChild, 0);
+          rng.setEnd(body.firstChild, 0);
+          selection.setRng(rng);
+        }
+      }
+      if (!selection.isCollapsed()) {
+        deleteSelectedContent(editor);
+      }
+      parentNode = selection.getNode();
+      const parserArgs = {
+        context: parentNode.nodeName.toLowerCase(),
+        data: details.data,
+        insert: true
+      };
+      const fragment = parser.parse(value, parserArgs);
+      if (details.paste === true && isListFragment(editor.schema, fragment) && isParentBlockLi(dom, parentNode)) {
+        rng = insertAtCaret$1(serializer, dom, selection.getRng(), fragment);
+        selection.setRng(rng);
+        return value;
+      }
+      markFragmentElements(fragment);
+      node = fragment.lastChild;
+      if (node.attr('id') === 'mce_marker') {
+        const marker = node;
+        for (node = node.prev; node; node = node.walk(true)) {
+          if (node.type === 3 || !dom.isBlock(node.name)) {
+            if (editor.schema.isValidChild(node.parent.name, 'span')) {
+              node.parent.insert(marker, node, node.name === 'br');
+            }
+            break;
+          }
+        }
+      }
+      editor._selectionOverrides.showBlockCaretContainer(parentNode);
+      if (!parserArgs.invalid) {
+        value = serializer.serialize(fragment);
+        validInsertion(editor, value, parentNode);
+      } else {
+        editor.selection.setContent(bookmarkHtml);
+        parentNode = selection.getNode();
+        const rootNode = editor.getBody();
+        if (parentNode.nodeType === 9) {
+          parentNode = node = rootNode;
+        } else {
+          node = parentNode;
+        }
+        while (node !== rootNode) {
+          parentNode = node;
+          node = node.parentNode;
+        }
+        value = parentNode === rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode);
+        const root = parser.parse(value);
+        for (let markerNode = root; markerNode; markerNode = markerNode.walk()) {
+          if (markerNode.attr('id') === 'mce_marker') {
+            markerNode.replace(fragment);
+            break;
+          }
+        }
+        const toExtract = fragment.children();
+        const parent = fragment.parent.name;
+        fragment.unwrap();
+        const invalidChildren = filter$6(toExtract, node => !editor.schema.isValidChild(parent, node.name));
+        cleanInvalidNodes(invalidChildren, editor.schema);
+        filter$3(parser.getNodeFilters(), parser.getAttributeFilters(), root);
+        value = serializer.serialize(root);
+        if (parentNode === rootNode) {
+          dom.setHTML(rootNode, value);
+        } else {
+          dom.setOuterHTML(parentNode, value);
+        }
+      }
+      reduceInlineTextElements(editor, merge);
+      moveSelectionToMarker(editor, dom.get('mce_marker'));
+      unmarkFragmentElements(editor.getBody());
+      trimBrsFromTableCell(dom, selection.getStart());
+      return value;
+    };
+
+    const isTreeNode = content => content instanceof AstNode;
+
+    const moveSelection = editor => {
+      if (hasFocus(editor)) {
+        firstPositionIn(editor.getBody()).each(pos => {
+          const node = pos.getNode();
+          const caretPos = isTable$3(node) ? firstPositionIn(node).getOr(pos) : pos;
+          editor.selection.setRng(caretPos.toRange());
+        });
+      }
+    };
+    const setEditorHtml = (editor, html, noSelection) => {
+      editor.dom.setHTML(editor.getBody(), html);
+      if (noSelection !== true) {
+        moveSelection(editor);
+      }
+    };
+    const setContentString = (editor, body, content, args) => {
+      if (content.length === 0 || /^\s+$/.test(content)) {
+        const padd = '<br data-mce-bogus="1">';
+        if (body.nodeName === 'TABLE') {
+          content = '<tr><td>' + padd + '</td></tr>';
+        } else if (/^(UL|OL)$/.test(body.nodeName)) {
+          content = '<li>' + padd + '</li>';
+        }
+        const forcedRootBlockName = getForcedRootBlock(editor);
+        if (editor.schema.isValidChild(body.nodeName.toLowerCase(), forcedRootBlockName.toLowerCase())) {
+          content = padd;
+          content = editor.dom.createHTML(forcedRootBlockName, getForcedRootBlockAttrs(editor), content);
+        } else if (!content) {
+          content = padd;
+        }
+        setEditorHtml(editor, content, args.no_selection);
+        return {
+          content,
+          html: content
+        };
+      } else {
+        if (args.format !== 'raw') {
+          content = HtmlSerializer({ validate: false }, editor.schema).serialize(editor.parser.parse(content, {
+            isRootContent: true,
+            insert: true
+          }));
+        }
+        const trimmedHtml = isWsPreserveElement(SugarElement.fromDom(body)) ? content : Tools.trim(content);
+        setEditorHtml(editor, trimmedHtml, args.no_selection);
+        return {
+          content: trimmedHtml,
+          html: trimmedHtml
+        };
+      }
+    };
+    const setContentTree = (editor, body, content, args) => {
+      filter$3(editor.parser.getNodeFilters(), editor.parser.getAttributeFilters(), content);
+      const html = HtmlSerializer({ validate: false }, editor.schema).serialize(content);
+      const trimmedHtml = isWsPreserveElement(SugarElement.fromDom(body)) ? html : Tools.trim(html);
+      setEditorHtml(editor, trimmedHtml, args.no_selection);
+      return {
+        content,
+        html: trimmedHtml
+      };
+    };
+    const setContentInternal = (editor, content, args) => {
+      return Optional.from(editor.getBody()).map(body => {
+        if (isTreeNode(content)) {
+          return setContentTree(editor, body, content, args);
+        } else {
+          return setContentString(editor, body, content, args);
+        }
+      }).getOr({
+        content,
+        html: isTreeNode(args.content) ? '' : args.content
+      });
+    };
+
+    const sibling = (scope, predicate) => sibling$1(scope, predicate).isSome();
+
+    const ensureIsRoot = isRoot => isFunction(isRoot) ? isRoot : never;
+    const ancestor = (scope, transform, isRoot) => {
+      let element = scope.dom;
+      const stop = ensureIsRoot(isRoot);
+      while (element.parentNode) {
+        element = element.parentNode;
+        const el = SugarElement.fromDom(element);
+        const transformed = transform(el);
+        if (transformed.isSome()) {
+          return transformed;
+        } else if (stop(el)) {
+          break;
+        }
+      }
+      return Optional.none();
+    };
+    const closest$2 = (scope, transform, isRoot) => {
+      const current = transform(scope);
+      const stop = ensureIsRoot(isRoot);
+      return current.orThunk(() => stop(scope) ? Optional.none() : ancestor(scope, transform, stop));
+    };
+
+    const isEq$3 = isEq$5;
+    const matchesUnInheritedFormatSelector = (ed, node, name) => {
+      const formatList = ed.formatter.get(name);
+      if (formatList) {
+        for (let i = 0; i < formatList.length; i++) {
+          const format = formatList[i];
+          if (isSelectorFormat(format) && format.inherit === false && ed.dom.is(node, format.selector)) {
+            return true;
+          }
+        }
+      }
+      return false;
+    };
+    const matchParents = (editor, node, name, vars, similar) => {
+      const root = editor.dom.getRoot();
+      if (node === root) {
+        return false;
+      }
+      node = editor.dom.getParent(node, node => {
+        if (matchesUnInheritedFormatSelector(editor, node, name)) {
+          return true;
+        }
+        return node.parentNode === root || !!matchNode(editor, node, name, vars, true);
+      });
+      return !!matchNode(editor, node, name, vars, similar);
+    };
+    const matchName = (dom, node, format) => {
+      if (isInlineFormat(format) && isEq$3(node, format.inline)) {
+        return true;
+      }
+      if (isBlockFormat(format) && isEq$3(node, format.block)) {
+        return true;
+      }
+      if (isSelectorFormat(format)) {
+        return isElement$6(node) && dom.is(node, format.selector);
+      }
+      return false;
+    };
+    const matchItems = (dom, node, format, itemName, similar, vars) => {
+      const items = format[itemName];
+      if (isFunction(format.onmatch)) {
+        return format.onmatch(node, format, itemName);
+      }
+      if (items) {
+        if (isUndefined(items.length)) {
+          for (const key in items) {
+            if (has$2(items, key)) {
+              const value = itemName === 'attributes' ? dom.getAttrib(node, key) : getStyle(dom, node, key);
+              const expectedValue = replaceVars(items[key], vars);
+              const isEmptyValue = isNullable(value) || isEmpty$3(value);
+              if (isEmptyValue && isNullable(expectedValue)) {
+                continue;
+              }
+              if (similar && isEmptyValue && !format.exact) {
+                return false;
+              }
+              if ((!similar || format.exact) && !isEq$3(value, normalizeStyleValue(expectedValue, key))) {
+                return false;
+              }
+            }
+          }
+        } else {
+          for (let i = 0; i < items.length; i++) {
+            if (itemName === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(dom, node, items[i])) {
+              return true;
+            }
+          }
+        }
+      }
+      return true;
+    };
+    const matchNode = (ed, node, name, vars, similar) => {
+      const formatList = ed.formatter.get(name);
+      const dom = ed.dom;
+      if (formatList && node) {
+        for (let i = 0; i < formatList.length; i++) {
+          const format = formatList[i];
+          if (matchName(ed.dom, node, format) && matchItems(dom, node, format, 'attributes', similar, vars) && matchItems(dom, node, format, 'styles', similar, vars)) {
+            const classes = format.classes;
+            if (classes) {
+              for (let x = 0; x < classes.length; x++) {
+                if (!ed.dom.hasClass(node, replaceVars(classes[x], vars))) {
+                  return;
+                }
+              }
+            }
+            return format;
+          }
+        }
+      }
+    };
+    const match$2 = (editor, name, vars, node, similar) => {
+      if (node) {
+        return matchParents(editor, node, name, vars, similar);
+      }
+      node = editor.selection.getNode();
+      if (matchParents(editor, node, name, vars, similar)) {
+        return true;
+      }
+      const startNode = editor.selection.getStart();
+      if (startNode !== node) {
+        if (matchParents(editor, startNode, name, vars, similar)) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const matchAll = (editor, names, vars) => {
+      const matchedFormatNames = [];
+      const checkedMap = {};
+      const startElement = editor.selection.getStart();
+      editor.dom.getParent(startElement, node => {
+        for (let i = 0; i < names.length; i++) {
+          const name = names[i];
+          if (!checkedMap[name] && matchNode(editor, node, name, vars)) {
+            checkedMap[name] = true;
+            matchedFormatNames.push(name);
+          }
+        }
+      }, editor.dom.getRoot());
+      return matchedFormatNames;
+    };
+    const closest$1 = (editor, names) => {
+      const isRoot = elm => eq(elm, SugarElement.fromDom(editor.getBody()));
+      const match = (elm, name) => matchNode(editor, elm.dom, name) ? Optional.some(name) : Optional.none();
+      return Optional.from(editor.selection.getStart(true)).bind(rawElm => closest$2(SugarElement.fromDom(rawElm), elm => findMap(names, name => match(elm, name)), isRoot)).getOrNull();
+    };
+    const canApply = (editor, name) => {
+      const formatList = editor.formatter.get(name);
+      const dom = editor.dom;
+      if (formatList) {
+        const startNode = editor.selection.getStart();
+        const parents = getParents$2(dom, startNode);
+        for (let x = formatList.length - 1; x >= 0; x--) {
+          const format = formatList[x];
+          if (!isSelectorFormat(format)) {
+            return true;
+          }
+          for (let i = parents.length - 1; i >= 0; i--) {
+            if (dom.is(parents[i], format.selector)) {
+              return true;
+            }
+          }
+        }
+      }
+      return false;
+    };
+    const matchAllOnNode = (editor, node, formatNames) => foldl(formatNames, (acc, name) => {
+      const matchSimilar = isVariableFormatName(editor, name);
+      if (editor.formatter.matchNode(node, name, {}, matchSimilar)) {
+        return acc.concat([name]);
+      } else {
+        return acc;
+      }
+    }, []);
+
+    const ZWSP = ZWSP$1, CARET_ID = '_mce_caret';
+    const importNode = (ownerDocument, node) => {
+      return ownerDocument.importNode(node, true);
+    };
+    const getEmptyCaretContainers = node => {
+      const nodes = [];
+      while (node) {
+        if (node.nodeType === 3 && node.nodeValue !== ZWSP || node.childNodes.length > 1) {
+          return [];
+        }
+        if (node.nodeType === 1) {
+          nodes.push(node);
+        }
+        node = node.firstChild;
+      }
+      return nodes;
+    };
+    const isCaretContainerEmpty = node => {
+      return getEmptyCaretContainers(node).length > 0;
+    };
+    const findFirstTextNode = node => {
+      if (node) {
+        const walker = new DomTreeWalker(node, node);
+        for (node = walker.current(); node; node = walker.next()) {
+          if (isText$8(node)) {
+            return node;
+          }
+        }
+      }
+      return null;
+    };
+    const createCaretContainer = fill => {
+      const caretContainer = SugarElement.fromTag('span');
+      setAll$1(caretContainer, {
+        'id': CARET_ID,
+        'data-mce-bogus': '1',
+        'data-mce-type': 'format-caret'
+      });
+      if (fill) {
+        append$1(caretContainer, SugarElement.fromText(ZWSP));
+      }
+      return caretContainer;
+    };
+    const trimZwspFromCaretContainer = caretContainerNode => {
+      const textNode = findFirstTextNode(caretContainerNode);
+      if (textNode && textNode.nodeValue.charAt(0) === ZWSP) {
+        textNode.deleteData(0, 1);
+      }
+      return textNode;
+    };
+    const removeCaretContainerNode = (editor, node, moveCaret = true) => {
+      const dom = editor.dom, selection = editor.selection;
+      if (isCaretContainerEmpty(node)) {
+        deleteElement$2(editor, false, SugarElement.fromDom(node), moveCaret);
+      } else {
+        const rng = selection.getRng();
+        const block = dom.getParent(node, dom.isBlock);
+        const startContainer = rng.startContainer;
+        const startOffset = rng.startOffset;
+        const endContainer = rng.endContainer;
+        const endOffset = rng.endOffset;
+        const textNode = trimZwspFromCaretContainer(node);
+        dom.remove(node, true);
+        if (startContainer === textNode && startOffset > 0) {
+          rng.setStart(textNode, startOffset - 1);
+        }
+        if (endContainer === textNode && endOffset > 0) {
+          rng.setEnd(textNode, endOffset - 1);
+        }
+        if (block && dom.isEmpty(block)) {
+          fillWithPaddingBr(SugarElement.fromDom(block));
+        }
+        selection.setRng(rng);
+      }
+    };
+    const removeCaretContainer = (editor, node, moveCaret = true) => {
+      const dom = editor.dom, selection = editor.selection;
+      if (!node) {
+        node = getParentCaretContainer(editor.getBody(), selection.getStart());
+        if (!node) {
+          while (node = dom.get(CARET_ID)) {
+            removeCaretContainerNode(editor, node, false);
+          }
+        }
+      } else {
+        removeCaretContainerNode(editor, node, moveCaret);
+      }
+    };
+    const insertCaretContainerNode = (editor, caretContainer, formatNode) => {
+      const dom = editor.dom, block = dom.getParent(formatNode, curry(isTextBlock$1, editor));
+      if (block && dom.isEmpty(block)) {
+        formatNode.parentNode.replaceChild(caretContainer, formatNode);
+      } else {
+        removeTrailingBr(SugarElement.fromDom(formatNode));
+        if (dom.isEmpty(formatNode)) {
+          formatNode.parentNode.replaceChild(caretContainer, formatNode);
+        } else {
+          dom.insertAfter(caretContainer, formatNode);
+        }
+      }
+    };
+    const appendNode = (parentNode, node) => {
+      parentNode.appendChild(node);
+      return node;
+    };
+    const insertFormatNodesIntoCaretContainer = (formatNodes, caretContainer) => {
+      const innerMostFormatNode = foldr(formatNodes, (parentNode, formatNode) => {
+        return appendNode(parentNode, formatNode.cloneNode(false));
+      }, caretContainer);
+      return appendNode(innerMostFormatNode, innerMostFormatNode.ownerDocument.createTextNode(ZWSP));
+    };
+    const cleanFormatNode = (editor, caretContainer, formatNode, name, vars, similar) => {
+      const formatter = editor.formatter;
+      const dom = editor.dom;
+      const validFormats = filter$6(keys(formatter.get()), formatName => formatName !== name && !contains$1(formatName, 'removeformat'));
+      const matchedFormats = matchAllOnNode(editor, formatNode, validFormats);
+      const uniqueFormats = filter$6(matchedFormats, fmtName => !areSimilarFormats(editor, fmtName, name));
+      if (uniqueFormats.length > 0) {
+        const clonedFormatNode = formatNode.cloneNode(false);
+        dom.add(caretContainer, clonedFormatNode);
+        formatter.remove(name, vars, clonedFormatNode, similar);
+        dom.remove(clonedFormatNode);
+        return Optional.some(clonedFormatNode);
+      } else {
+        return Optional.none();
+      }
+    };
+    const applyCaretFormat = (editor, name, vars) => {
+      let caretContainer, textNode;
+      const selection = editor.selection;
+      const selectionRng = selection.getRng();
+      let offset = selectionRng.startOffset;
+      const container = selectionRng.startContainer;
+      const text = container.nodeValue;
+      caretContainer = getParentCaretContainer(editor.getBody(), selection.getStart());
+      if (caretContainer) {
+        textNode = findFirstTextNode(caretContainer);
+      }
+      const wordcharRegex = /[^\s\u00a0\u00ad\u200b\ufeff]/;
+      if (text && offset > 0 && offset < text.length && wordcharRegex.test(text.charAt(offset)) && wordcharRegex.test(text.charAt(offset - 1))) {
+        const bookmark = selection.getBookmark();
+        selectionRng.collapse(true);
+        let rng = expandRng(editor, selectionRng, editor.formatter.get(name));
+        rng = split(rng);
+        editor.formatter.apply(name, vars, rng);
+        selection.moveToBookmark(bookmark);
+      } else {
+        if (!caretContainer || textNode.nodeValue !== ZWSP) {
+          caretContainer = importNode(editor.getDoc(), createCaretContainer(true).dom);
+          textNode = caretContainer.firstChild;
+          selectionRng.insertNode(caretContainer);
+          offset = 1;
+          editor.formatter.apply(name, vars, caretContainer);
+        } else {
+          editor.formatter.apply(name, vars, caretContainer);
+        }
+        selection.setCursorLocation(textNode, offset);
+      }
+    };
+    const removeCaretFormat = (editor, name, vars, similar) => {
+      const dom = editor.dom;
+      const selection = editor.selection;
+      let hasContentAfter, node, formatNode;
+      const parents = [];
+      const rng = selection.getRng();
+      const container = rng.startContainer;
+      const offset = rng.startOffset;
+      node = container;
+      if (container.nodeType === 3) {
+        if (offset !== container.nodeValue.length) {
+          hasContentAfter = true;
+        }
+        node = node.parentNode;
+      }
+      while (node) {
+        if (matchNode(editor, node, name, vars, similar)) {
+          formatNode = node;
+          break;
+        }
+        if (node.nextSibling) {
+          hasContentAfter = true;
+        }
+        parents.push(node);
+        node = node.parentNode;
+      }
+      if (!formatNode) {
+        return;
+      }
+      if (hasContentAfter) {
+        const bookmark = selection.getBookmark();
+        rng.collapse(true);
+        let expandedRng = expandRng(editor, rng, editor.formatter.get(name), true);
+        expandedRng = split(expandedRng);
+        editor.formatter.remove(name, vars, expandedRng, similar);
+        selection.moveToBookmark(bookmark);
+      } else {
+        const caretContainer = getParentCaretContainer(editor.getBody(), formatNode);
+        const newCaretContainer = createCaretContainer(false).dom;
+        insertCaretContainerNode(editor, newCaretContainer, caretContainer !== null ? caretContainer : formatNode);
+        const cleanedFormatNode = cleanFormatNode(editor, newCaretContainer, formatNode, name, vars, similar);
+        const caretTextNode = insertFormatNodesIntoCaretContainer(parents.concat(cleanedFormatNode.toArray()), newCaretContainer);
+        removeCaretContainerNode(editor, caretContainer, false);
+        selection.setCursorLocation(caretTextNode, 1);
+        if (dom.isEmpty(formatNode)) {
+          dom.remove(formatNode);
+        }
+      }
+    };
+    const disableCaretContainer = (editor, keyCode) => {
+      const selection = editor.selection, body = editor.getBody();
+      removeCaretContainer(editor, null, false);
+      if ((keyCode === 8 || keyCode === 46) && selection.isCollapsed() && selection.getStart().innerHTML === ZWSP) {
+        removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()));
+      }
+      if (keyCode === 37 || keyCode === 39) {
+        removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()));
+      }
+    };
+    const setup$u = editor => {
+      editor.on('mouseup keydown', e => {
+        disableCaretContainer(editor, e.keyCode);
+      });
+    };
+    const replaceWithCaretFormat = (targetNode, formatNodes) => {
+      const caretContainer = createCaretContainer(false);
+      const innerMost = insertFormatNodesIntoCaretContainer(formatNodes, caretContainer.dom);
+      before$3(SugarElement.fromDom(targetNode), caretContainer);
+      remove$5(SugarElement.fromDom(targetNode));
+      return CaretPosition(innerMost, 0);
+    };
+    const isFormatElement = (editor, element) => {
+      const inlineElements = editor.schema.getTextInlineElements();
+      return has$2(inlineElements, name(element)) && !isCaretNode(element.dom) && !isBogus$2(element.dom);
+    };
+    const isEmptyCaretFormatElement = element => {
+      return isCaretNode(element.dom) && isCaretContainerEmpty(element.dom);
+    };
+
+    const postProcessHooks = {};
+    const filter$2 = filter$4;
+    const each$a = each$e;
+    const addPostProcessHook = (name, hook) => {
+      const hooks = postProcessHooks[name];
+      if (!hooks) {
+        postProcessHooks[name] = [];
+      }
+      postProcessHooks[name].push(hook);
+    };
+    const postProcess$1 = (name, editor) => {
+      each$a(postProcessHooks[name], hook => {
+        hook(editor);
+      });
+    };
+    addPostProcessHook('pre', editor => {
+      const rng = editor.selection.getRng();
+      let blocks;
+      const hasPreSibling = pre => {
+        return isPre(pre.previousSibling) && indexOf(blocks, pre.previousSibling) !== -1;
+      };
+      const joinPre = (pre1, pre2) => {
+        const sPre2 = SugarElement.fromDom(pre2);
+        const doc = documentOrOwner(sPre2).dom;
+        remove$5(sPre2);
+        append(SugarElement.fromDom(pre1), [
+          SugarElement.fromTag('br', doc),
+          SugarElement.fromTag('br', doc),
+          ...children(sPre2)
+        ]);
+      };
+      const isPre = matchNodeNames(['pre']);
+      if (!rng.collapsed) {
+        blocks = editor.selection.getSelectedBlocks();
+        each$a(filter$2(filter$2(blocks, isPre), hasPreSibling), pre => {
+          joinPre(pre.previousSibling, pre);
+        });
+      }
+    });
+
+    const each$9 = Tools.each;
+    const isElementNode$1 = node => isElement$6(node) && !isBookmarkNode$1(node) && !isCaretNode(node) && !isBogus$2(node);
+    const findElementSibling = (node, siblingName) => {
+      for (let sibling = node; sibling; sibling = sibling[siblingName]) {
+        if (isText$8(sibling) && isNotEmpty(sibling.data)) {
+          return node;
+        }
+        if (isElement$6(sibling) && !isBookmarkNode$1(sibling)) {
+          return sibling;
+        }
+      }
+      return node;
+    };
+    const mergeSiblingsNodes = (dom, prev, next) => {
+      const elementUtils = ElementUtils(dom);
+      if (prev && next) {
+        prev = findElementSibling(prev, 'previousSibling');
+        next = findElementSibling(next, 'nextSibling');
+        if (elementUtils.compare(prev, next)) {
+          for (let sibling = prev.nextSibling; sibling && sibling !== next;) {
+            const tmpSibling = sibling;
+            sibling = sibling.nextSibling;
+            prev.appendChild(tmpSibling);
+          }
+          dom.remove(next);
+          Tools.each(Tools.grep(next.childNodes), node => {
+            prev.appendChild(node);
+          });
+          return prev;
+        }
+      }
+      return next;
+    };
+    const mergeSiblings = (dom, format, vars, node) => {
+      if (node && format.merge_siblings !== false) {
+        const newNode = mergeSiblingsNodes(dom, getNonWhiteSpaceSibling(node), node);
+        mergeSiblingsNodes(dom, newNode, getNonWhiteSpaceSibling(newNode, true));
+      }
+    };
+    const clearChildStyles = (dom, format, node) => {
+      if (format.clear_child_styles) {
+        const selector = format.links ? '*:not(a)' : '*';
+        each$9(dom.select(selector, node), node => {
+          if (isElementNode$1(node)) {
+            each$9(format.styles, (value, name) => {
+              dom.setStyle(node, name, '');
+            });
+          }
+        });
+      }
+    };
+    const processChildElements = (node, filter, process) => {
+      each$9(node.childNodes, node => {
+        if (isElementNode$1(node)) {
+          if (filter(node)) {
+            process(node);
+          }
+          if (node.hasChildNodes()) {
+            processChildElements(node, filter, process);
+          }
+        }
+      });
+    };
+    const unwrapEmptySpan = (dom, node) => {
+      if (node.nodeName === 'SPAN' && dom.getAttribs(node).length === 0) {
+        dom.remove(node, true);
+      }
+    };
+    const hasStyle = (dom, name) => node => !!(node && getStyle(dom, node, name));
+    const applyStyle = (dom, name, value) => node => {
+      dom.setStyle(node, name, value);
+      if (node.getAttribute('style') === '') {
+        node.removeAttribute('style');
+      }
+      unwrapEmptySpan(dom, node);
+    };
+
+    const removeResult = Adt.generate([
+      { keep: [] },
+      { rename: ['name'] },
+      { removed: [] }
+    ]);
+    const MCE_ATTR_RE = /^(src|href|style)$/;
+    const each$8 = Tools.each;
+    const isEq$2 = isEq$5;
+    const isTableCellOrRow = node => /^(TR|TH|TD)$/.test(node.nodeName);
+    const isChildOfInlineParent = (dom, node, parent) => dom.isChildOf(node, parent) && node !== parent && !dom.isBlock(parent);
+    const getContainer = (ed, rng, start) => {
+      let container = rng[start ? 'startContainer' : 'endContainer'];
+      let offset = rng[start ? 'startOffset' : 'endOffset'];
+      if (isElement$6(container)) {
+        const lastIdx = container.childNodes.length - 1;
+        if (!start && offset) {
+          offset--;
+        }
+        container = container.childNodes[offset > lastIdx ? lastIdx : offset];
+      }
+      if (isText$8(container) && start && offset >= container.nodeValue.length) {
+        container = new DomTreeWalker(container, ed.getBody()).next() || container;
+      }
+      if (isText$8(container) && !start && offset === 0) {
+        container = new DomTreeWalker(container, ed.getBody()).prev() || container;
+      }
+      return container;
+    };
+    const normalizeTableSelection = (node, start) => {
+      const prop = start ? 'firstChild' : 'lastChild';
+      if (isTableCellOrRow(node) && node[prop]) {
+        const childNode = node[prop];
+        if (node.nodeName === 'TR') {
+          return childNode[prop] || childNode;
+        } else {
+          return childNode;
+        }
+      }
+      return node;
+    };
+    const wrap$1 = (dom, node, name, attrs) => {
+      const wrapper = dom.create(name, attrs);
+      node.parentNode.insertBefore(wrapper, node);
+      wrapper.appendChild(node);
+      return wrapper;
+    };
+    const wrapWithSiblings = (dom, node, next, name, attrs) => {
+      const start = SugarElement.fromDom(node);
+      const wrapper = SugarElement.fromDom(dom.create(name, attrs));
+      const siblings = next ? nextSiblings(start) : prevSiblings(start);
+      append(wrapper, siblings);
+      if (next) {
+        before$3(start, wrapper);
+        prepend(wrapper, start);
+      } else {
+        after$4(start, wrapper);
+        append$1(wrapper, start);
+      }
+      return wrapper.dom;
+    };
+    const isColorFormatAndAnchor = (node, format) => format.links && node.nodeName === 'A';
+    const removeNode = (ed, node, format) => {
+      const parentNode = node.parentNode;
+      let rootBlockElm;
+      const dom = ed.dom;
+      const forcedRootBlock = getForcedRootBlock(ed);
+      if (isBlockFormat(format)) {
+        if (parentNode === dom.getRoot()) {
+          if (!format.list_block || !isEq$2(node, format.list_block)) {
+            each$g(from(node.childNodes), node => {
+              if (isValid(ed, forcedRootBlock, node.nodeName.toLowerCase())) {
+                if (!rootBlockElm) {
+                  rootBlockElm = wrap$1(dom, node, forcedRootBlock);
+                  dom.setAttribs(rootBlockElm, getForcedRootBlockAttrs(ed));
+                } else {
+                  rootBlockElm.appendChild(node);
+                }
+              } else {
+                rootBlockElm = null;
+              }
+            });
+          }
+        }
+      }
+      if (isMixedFormat(format) && !isEq$2(format.inline, node)) {
+        return;
+      }
+      dom.remove(node, true);
+    };
+    const removeFormatInternal = (ed, format, vars, node, compareNode) => {
+      let stylesModified;
+      const dom = ed.dom;
+      if (!matchName(dom, node, format) && !isColorFormatAndAnchor(node, format)) {
+        return removeResult.keep();
+      }
+      const elm = node;
+      if (isInlineFormat(format) && format.remove === 'all' && isArray$1(format.preserve_attributes)) {
+        const attrsToPreserve = filter$6(dom.getAttribs(elm), attr => contains$2(format.preserve_attributes, attr.name.toLowerCase()));
+        dom.removeAllAttribs(elm);
+        each$g(attrsToPreserve, attr => dom.setAttrib(elm, attr.name, attr.value));
+        if (attrsToPreserve.length > 0) {
+          return removeResult.rename('span');
+        }
+      }
+      if (format.remove !== 'all') {
+        each$8(format.styles, (value, name) => {
+          value = normalizeStyleValue(replaceVars(value, vars), name + '');
+          if (isNumber(name)) {
+            name = value;
+            compareNode = null;
+          }
+          if (format.remove_similar || (!compareNode || isEq$2(getStyle(dom, compareNode, name), value))) {
+            dom.setStyle(elm, name, '');
+          }
+          stylesModified = true;
+        });
+        if (stylesModified && dom.getAttrib(elm, 'style') === '') {
+          elm.removeAttribute('style');
+          elm.removeAttribute('data-mce-style');
+        }
+        each$8(format.attributes, (value, name) => {
+          let valueOut;
+          value = replaceVars(value, vars);
+          if (isNumber(name)) {
+            name = value;
+            compareNode = null;
+          }
+          if (format.remove_similar || (!compareNode || isEq$2(dom.getAttrib(compareNode, name), value))) {
+            if (name === 'class') {
+              value = dom.getAttrib(elm, name);
+              if (value) {
+                valueOut = '';
+                each$g(value.split(/\s+/), cls => {
+                  if (/mce\-\w+/.test(cls)) {
+                    valueOut += (valueOut ? ' ' : '') + cls;
+                  }
+                });
+                if (valueOut) {
+                  dom.setAttrib(elm, name, valueOut);
+                  return;
+                }
+              }
+            }
+            if (MCE_ATTR_RE.test(name)) {
+              elm.removeAttribute('data-mce-' + name);
+            }
+            if (name === 'style' && matchNodeNames(['li'])(elm) && dom.getStyle(elm, 'list-style-type') === 'none') {
+              elm.removeAttribute(name);
+              dom.setStyle(elm, 'list-style-type', 'none');
+              return;
+            }
+            if (name === 'class') {
+              elm.removeAttribute('className');
+            }
+            elm.removeAttribute(name);
+          }
+        });
+        each$8(format.classes, value => {
+          value = replaceVars(value, vars);
+          if (!compareNode || dom.hasClass(compareNode, value)) {
+            dom.removeClass(elm, value);
+          }
+        });
+        const attrs = dom.getAttribs(elm);
+        for (let i = 0; i < attrs.length; i++) {
+          const attrName = attrs[i].nodeName;
+          if (attrName.indexOf('_') !== 0 && attrName.indexOf('data-') !== 0) {
+            return removeResult.keep();
+          }
+        }
+      }
+      if (format.remove !== 'none') {
+        removeNode(ed, elm, format);
+        return removeResult.removed();
+      }
+      return removeResult.keep();
+    };
+    const removeFormat$1 = (ed, format, vars, node, compareNode) => removeFormatInternal(ed, format, vars, node, compareNode).fold(never, newName => {
+      ed.dom.rename(node, newName);
+      return true;
+    }, always);
+    const findFormatRoot = (editor, container, name, vars, similar) => {
+      let formatRoot;
+      each$g(getParents$2(editor.dom, container.parentNode).reverse(), parent => {
+        if (!formatRoot && parent.id !== '_start' && parent.id !== '_end') {
+          const format = matchNode(editor, parent, name, vars, similar);
+          if (format && format.split !== false) {
+            formatRoot = parent;
+          }
+        }
+      });
+      return formatRoot;
+    };
+    const removeFormatFromClone = (editor, format, vars, clone) => removeFormatInternal(editor, format, vars, clone, clone).fold(constant(clone), newName => {
+      const fragment = editor.dom.createFragment();
+      fragment.appendChild(clone);
+      return editor.dom.rename(clone, newName);
+    }, constant(null));
+    const wrapAndSplit = (editor, formatList, formatRoot, container, target, split, format, vars) => {
+      let clone, lastClone, firstClone;
+      const dom = editor.dom;
+      if (formatRoot) {
+        const formatRootParent = formatRoot.parentNode;
+        for (let parent = container.parentNode; parent && parent !== formatRootParent; parent = parent.parentNode) {
+          clone = dom.clone(parent, false);
+          for (let i = 0; i < formatList.length; i++) {
+            clone = removeFormatFromClone(editor, formatList[i], vars, clone);
+            if (clone === null) {
+              break;
+            }
+          }
+          if (clone) {
+            if (lastClone) {
+              clone.appendChild(lastClone);
+            }
+            if (!firstClone) {
+              firstClone = clone;
+            }
+            lastClone = clone;
+          }
+        }
+        if (split && (!format.mixed || !dom.isBlock(formatRoot))) {
+          container = dom.split(formatRoot, container);
+        }
+        if (lastClone) {
+          target.parentNode.insertBefore(lastClone, target);
+          firstClone.appendChild(target);
+          if (isInlineFormat(format)) {
+            mergeSiblings(dom, format, vars, lastClone);
+          }
+        }
+      }
+      return container;
+    };
+    const remove$2 = (ed, name, vars, node, similar) => {
+      const formatList = ed.formatter.get(name);
+      const format = formatList[0];
+      let contentEditable = true;
+      const dom = ed.dom;
+      const selection = ed.selection;
+      const splitToFormatRoot = container => {
+        const formatRoot = findFormatRoot(ed, container, name, vars, similar);
+        return wrapAndSplit(ed, formatList, formatRoot, container, container, true, format, vars);
+      };
+      const isRemoveBookmarkNode = node => isBookmarkNode$1(node) && isElement$6(node) && (node.id === '_start' || node.id === '_end');
+      const removeNodeFormat = node => exists(formatList, fmt => removeFormat$1(ed, fmt, vars, node, node));
+      const process = node => {
+        let lastContentEditable = true;
+        let hasContentEditableState = false;
+        if (isElement$6(node) && dom.getContentEditable(node)) {
+          lastContentEditable = contentEditable;
+          contentEditable = dom.getContentEditable(node) === 'true';
+          hasContentEditableState = true;
+        }
+        const children = from(node.childNodes);
+        if (contentEditable && !hasContentEditableState) {
+          const removed = removeNodeFormat(node);
+          const currentNodeMatches = removed || exists(formatList, f => matchName(dom, node, f));
+          const parentNode = node.parentNode;
+          if (!currentNodeMatches && isNonNullable(parentNode) && shouldExpandToSelector(format)) {
+            removeNodeFormat(parentNode);
+          }
+        }
+        if (format.deep) {
+          if (children.length) {
+            for (let i = 0; i < children.length; i++) {
+              process(children[i]);
+            }
+            if (hasContentEditableState) {
+              contentEditable = lastContentEditable;
+            }
+          }
+        }
+        const textDecorations = [
+          'underline',
+          'line-through',
+          'overline'
+        ];
+        each$g(textDecorations, decoration => {
+          if (isElement$6(node) && ed.dom.getStyle(node, 'text-decoration') === decoration && node.parentNode && getTextDecoration(dom, node.parentNode) === decoration) {
+            removeFormat$1(ed, {
+              deep: false,
+              exact: true,
+              inline: 'span',
+              styles: { textDecoration: decoration }
+            }, null, node);
+          }
+        });
+      };
+      const unwrap = start => {
+        const node = dom.get(start ? '_start' : '_end');
+        let out = node[start ? 'firstChild' : 'lastChild'];
+        if (isRemoveBookmarkNode(out)) {
+          out = out[start ? 'firstChild' : 'lastChild'];
+        }
+        if (isText$8(out) && out.data.length === 0) {
+          out = start ? node.previousSibling || node.nextSibling : node.nextSibling || node.previousSibling;
+        }
+        dom.remove(node, true);
+        return out;
+      };
+      const removeRngStyle = rng => {
+        let startContainer, endContainer;
+        let expandedRng = expandRng(ed, rng, formatList, rng.collapsed);
+        if (format.split) {
+          expandedRng = split(expandedRng);
+          startContainer = getContainer(ed, expandedRng, true);
+          endContainer = getContainer(ed, expandedRng);
+          if (startContainer !== endContainer) {
+            startContainer = normalizeTableSelection(startContainer, true);
+            endContainer = normalizeTableSelection(endContainer, false);
+            if (isChildOfInlineParent(dom, startContainer, endContainer)) {
+              const marker = Optional.from(startContainer.firstChild).getOr(startContainer);
+              splitToFormatRoot(wrapWithSiblings(dom, marker, true, 'span', {
+                'id': '_start',
+                'data-mce-type': 'bookmark'
+              }));
+              unwrap(true);
+              return;
+            }
+            if (isChildOfInlineParent(dom, endContainer, startContainer)) {
+              const marker = Optional.from(endContainer.lastChild).getOr(endContainer);
+              splitToFormatRoot(wrapWithSiblings(dom, marker, false, 'span', {
+                'id': '_end',
+                'data-mce-type': 'bookmark'
+              }));
+              unwrap(false);
+              return;
+            }
+            startContainer = wrap$1(dom, startContainer, 'span', {
+              'id': '_start',
+              'data-mce-type': 'bookmark'
+            });
+            endContainer = wrap$1(dom, endContainer, 'span', {
+              'id': '_end',
+              'data-mce-type': 'bookmark'
+            });
+            const newRng = dom.createRng();
+            newRng.setStartAfter(startContainer);
+            newRng.setEndBefore(endContainer);
+            walk$3(dom, newRng, nodes => {
+              each$g(nodes, n => {
+                if (!isBookmarkNode$1(n) && !isBookmarkNode$1(n.parentNode)) {
+                  splitToFormatRoot(n);
+                }
+              });
+            });
+            splitToFormatRoot(startContainer);
+            splitToFormatRoot(endContainer);
+            startContainer = unwrap(true);
+            endContainer = unwrap();
+          } else {
+            startContainer = endContainer = splitToFormatRoot(startContainer);
+          }
+          expandedRng.startContainer = startContainer.parentNode ? startContainer.parentNode : startContainer;
+          expandedRng.startOffset = dom.nodeIndex(startContainer);
+          expandedRng.endContainer = endContainer.parentNode ? endContainer.parentNode : endContainer;
+          expandedRng.endOffset = dom.nodeIndex(endContainer) + 1;
+        }
+        walk$3(dom, expandedRng, nodes => {
+          each$g(nodes, process);
+        });
+      };
+      if (node) {
+        if (isNode(node)) {
+          const rng = dom.createRng();
+          rng.setStartBefore(node);
+          rng.setEndAfter(node);
+          removeRngStyle(rng);
+        } else {
+          removeRngStyle(node);
+        }
+        fireFormatRemove(ed, name, node, vars);
+        return;
+      }
+      if (dom.getContentEditable(selection.getNode()) === 'false') {
+        node = selection.getNode();
+        for (let i = 0; i < formatList.length; i++) {
+          if (formatList[i].ceFalseOverride) {
+            if (removeFormat$1(ed, formatList[i], vars, node, node)) {
+              break;
+            }
+          }
+        }
+        fireFormatRemove(ed, name, node, vars);
+        return;
+      }
+      if (!selection.isCollapsed() || !isInlineFormat(format) || getCellsFromEditor(ed).length) {
+        preserve(selection, true, () => {
+          runOnRanges(ed, removeRngStyle);
+        });
+        if (isInlineFormat(format) && match$2(ed, name, vars, selection.getStart())) {
+          moveStart(dom, selection, selection.getRng());
+        }
+        ed.nodeChanged();
+      } else {
+        removeCaretFormat(ed, name, vars, similar);
+      }
+      fireFormatRemove(ed, name, node, vars);
+    };
+
+    const each$7 = Tools.each;
+    const mergeTextDecorationsAndColor = (dom, format, vars, node) => {
+      const processTextDecorationsAndColor = n => {
+        if (n.nodeType === 1 && n.parentNode && n.parentNode.nodeType === 1) {
+          const textDecoration = getTextDecoration(dom, n.parentNode);
+          if (dom.getStyle(n, 'color') && textDecoration) {
+            dom.setStyle(n, 'text-decoration', textDecoration);
+          } else if (dom.getStyle(n, 'text-decoration') === textDecoration) {
+            dom.setStyle(n, 'text-decoration', null);
+          }
+        }
+      };
+      if (format.styles && (format.styles.color || format.styles.textDecoration)) {
+        Tools.walk(node, processTextDecorationsAndColor, 'childNodes');
+        processTextDecorationsAndColor(node);
+      }
+    };
+    const mergeBackgroundColorAndFontSize = (dom, format, vars, node) => {
+      if (format.styles && format.styles.backgroundColor) {
+        processChildElements(node, hasStyle(dom, 'fontSize'), applyStyle(dom, 'backgroundColor', replaceVars(format.styles.backgroundColor, vars)));
+      }
+    };
+    const mergeSubSup = (dom, format, vars, node) => {
+      if (isInlineFormat(format) && (format.inline === 'sub' || format.inline === 'sup')) {
+        processChildElements(node, hasStyle(dom, 'fontSize'), applyStyle(dom, 'fontSize', ''));
+        dom.remove(dom.select(format.inline === 'sup' ? 'sub' : 'sup', node), true);
+      }
+    };
+    const mergeWithChildren = (editor, formatList, vars, node) => {
+      each$7(formatList, format => {
+        if (isInlineFormat(format)) {
+          each$7(editor.dom.select(format.inline, node), child => {
+            if (!isElementNode$1(child)) {
+              return;
+            }
+            removeFormat$1(editor, format, vars, child, format.exact ? child : null);
+          });
+        }
+        clearChildStyles(editor.dom, format, node);
+      });
+    };
+    const mergeWithParents = (editor, format, name, vars, node) => {
+      if (matchNode(editor, node.parentNode, name, vars)) {
+        if (removeFormat$1(editor, format, vars, node)) {
+          return;
+        }
+      }
+      if (format.merge_with_parents) {
+        editor.dom.getParent(node.parentNode, parent => {
+          if (matchNode(editor, parent, name, vars)) {
+            removeFormat$1(editor, format, vars, node);
+            return true;
+          }
+        });
+      }
+    };
+
+    const each$6 = Tools.each;
+    const isElementNode = node => {
+      return isElement$6(node) && !isBookmarkNode$1(node) && !isCaretNode(node) && !isBogus$2(node);
+    };
+    const canFormatBR = (editor, format, node, parentName) => {
+      if (canFormatEmptyLines(editor) && isInlineFormat(format)) {
+        const validBRParentElements = getTextRootBlockElements(editor.schema);
+        const hasCaretNodeSibling = sibling(SugarElement.fromDom(node), sibling => isCaretNode(sibling.dom));
+        return hasNonNullableKey(validBRParentElements, parentName) && isEmpty$2(SugarElement.fromDom(node.parentNode), false) && !hasCaretNodeSibling;
+      } else {
+        return false;
+      }
+    };
+    const applyFormat$1 = (ed, name, vars, node) => {
+      const formatList = ed.formatter.get(name);
+      const format = formatList[0];
+      const isCollapsed = !node && ed.selection.isCollapsed();
+      const dom = ed.dom;
+      const selection = ed.selection;
+      const setElementFormat = (elm, fmt = format) => {
+        if (isFunction(fmt.onformat)) {
+          fmt.onformat(elm, fmt, vars, node);
+        }
+        each$6(fmt.styles, (value, name) => {
+          dom.setStyle(elm, name, replaceVars(value, vars));
+        });
+        if (fmt.styles) {
+          const styleVal = dom.getAttrib(elm, 'style');
+          if (styleVal) {
+            dom.setAttrib(elm, 'data-mce-style', styleVal);
+          }
+        }
+        each$6(fmt.attributes, (value, name) => {
+          dom.setAttrib(elm, name, replaceVars(value, vars));
+        });
+        each$6(fmt.classes, value => {
+          value = replaceVars(value, vars);
+          if (!dom.hasClass(elm, value)) {
+            dom.addClass(elm, value);
+          }
+        });
+      };
+      const applyNodeStyle = (formatList, node) => {
+        let found = false;
+        each$6(formatList, format => {
+          if (!isSelectorFormat(format)) {
+            return false;
+          }
+          if (isNonNullable(format.collapsed) && format.collapsed !== isCollapsed) {
+            return;
+          }
+          if (dom.is(node, format.selector) && !isCaretNode(node)) {
+            setElementFormat(node, format);
+            found = true;
+            return false;
+          }
+        });
+        return found;
+      };
+      const createWrapElement = wrapName => {
+        if (isString(wrapName)) {
+          const wrapElm = dom.create(wrapName);
+          setElementFormat(wrapElm);
+          return wrapElm;
+        } else {
+          return null;
+        }
+      };
+      const applyRngStyle = (dom, rng, nodeSpecific) => {
+        const newWrappers = [];
+        let contentEditable = true;
+        const wrapName = format.inline || format.block;
+        const wrapElm = createWrapElement(wrapName);
+        walk$3(dom, rng, nodes => {
+          let currentWrapElm;
+          const process = node => {
+            let hasContentEditableState = false;
+            let lastContentEditable = contentEditable;
+            const nodeName = node.nodeName.toLowerCase();
+            const parentNode = node.parentNode;
+            const parentName = parentNode.nodeName.toLowerCase();
+            if (isElement$6(node) && dom.getContentEditable(node)) {
+              lastContentEditable = contentEditable;
+              contentEditable = dom.getContentEditable(node) === 'true';
+              hasContentEditableState = true;
+            }
+            if (isBr$5(node) && !canFormatBR(ed, format, node, parentName)) {
+              currentWrapElm = null;
+              if (isBlockFormat(format)) {
+                dom.remove(node);
+              }
+              return;
+            }
+            if (isBlockFormat(format) && format.wrapper && matchNode(ed, node, name, vars)) {
+              currentWrapElm = null;
+              return;
+            }
+            if (contentEditable && !hasContentEditableState && isBlockFormat(format) && !format.wrapper && isTextBlock$1(ed, nodeName) && isValid(ed, parentName, wrapName)) {
+              const elm = dom.rename(node, wrapName);
+              setElementFormat(elm);
+              newWrappers.push(elm);
+              currentWrapElm = null;
+              return;
+            }
+            if (isSelectorFormat(format)) {
+              let found = applyNodeStyle(formatList, node);
+              if (!found && isNonNullable(parentNode) && shouldExpandToSelector(format)) {
+                found = applyNodeStyle(formatList, parentNode);
+              }
+              if (!isInlineFormat(format) || found) {
+                currentWrapElm = null;
+                return;
+              }
+            }
+            if (contentEditable && !hasContentEditableState && isValid(ed, wrapName, nodeName) && isValid(ed, parentName, wrapName) && !(!nodeSpecific && isText$8(node) && isZwsp(node.data)) && !isCaretNode(node) && (!isInlineFormat(format) || !dom.isBlock(node))) {
+              if (!currentWrapElm) {
+                currentWrapElm = dom.clone(wrapElm, false);
+                node.parentNode.insertBefore(currentWrapElm, node);
+                newWrappers.push(currentWrapElm);
+              }
+              currentWrapElm.appendChild(node);
+            } else {
+              currentWrapElm = null;
+              each$g(from(node.childNodes), process);
+              if (hasContentEditableState) {
+                contentEditable = lastContentEditable;
+              }
+              currentWrapElm = null;
+            }
+          };
+          each$g(nodes, process);
+        });
+        if (format.links === true) {
+          each$g(newWrappers, node => {
+            const process = node => {
+              if (node.nodeName === 'A') {
+                setElementFormat(node, format);
+              }
+              each$g(from(node.childNodes), process);
+            };
+            process(node);
+          });
+        }
+        each$g(newWrappers, node => {
+          const getChildCount = node => {
+            let count = 0;
+            each$g(node.childNodes, node => {
+              if (!isEmptyTextNode$1(node) && !isBookmarkNode$1(node)) {
+                count++;
+              }
+            });
+            return count;
+          };
+          const mergeStyles = node => {
+            const childElement = find$2(node.childNodes, isElementNode).filter(child => matchName(dom, child, format));
+            return childElement.map(child => {
+              const clone = dom.clone(child, false);
+              setElementFormat(clone);
+              dom.replace(clone, node, true);
+              dom.remove(child, true);
+              return clone;
+            }).getOr(node);
+          };
+          const childCount = getChildCount(node);
+          if ((newWrappers.length > 1 || !dom.isBlock(node)) && childCount === 0) {
+            dom.remove(node, true);
+            return;
+          }
+          if (isInlineFormat(format) || isBlockFormat(format) && format.wrapper) {
+            if (!format.exact && childCount === 1) {
+              node = mergeStyles(node);
+            }
+            mergeWithChildren(ed, formatList, vars, node);
+            mergeWithParents(ed, format, name, vars, node);
+            mergeBackgroundColorAndFontSize(dom, format, vars, node);
+            mergeTextDecorationsAndColor(dom, format, vars, node);
+            mergeSubSup(dom, format, vars, node);
+            mergeSiblings(dom, format, vars, node);
+          }
+        });
+      };
+      if (dom.getContentEditable(selection.getNode()) === 'false') {
+        node = selection.getNode();
+        for (let i = 0, l = formatList.length; i < l; i++) {
+          const formatItem = formatList[i];
+          if (formatItem.ceFalseOverride && isSelectorFormat(formatItem) && dom.is(node, formatItem.selector)) {
+            setElementFormat(node, formatItem);
+            break;
+          }
+        }
+        fireFormatApply(ed, name, node, vars);
+        return;
+      }
+      if (format) {
+        if (node) {
+          if (isNode(node)) {
+            if (!applyNodeStyle(formatList, node)) {
+              const rng = dom.createRng();
+              rng.setStartBefore(node);
+              rng.setEndAfter(node);
+              applyRngStyle(dom, expandRng(ed, rng, formatList), true);
+            }
+          } else {
+            applyRngStyle(dom, node, true);
+          }
+        } else {
+          if (!isCollapsed || !isInlineFormat(format) || getCellsFromEditor(ed).length) {
+            selection.setRng(normalize(selection.getRng()));
+            preserve(selection, true, () => {
+              runOnRanges(ed, (selectionRng, fake) => {
+                const expandedRng = fake ? selectionRng : expandRng(ed, selectionRng, formatList);
+                applyRngStyle(dom, expandedRng, false);
+              });
+            });
+            moveStart(dom, selection, selection.getRng());
+            ed.nodeChanged();
+          } else {
+            applyCaretFormat(ed, name, vars);
+          }
+        }
+        postProcess$1(name, ed);
+      }
+      fireFormatApply(ed, name, node, vars);
+    };
+
+    const hasVars = value => has$2(value, 'vars');
+    const setup$t = (registeredFormatListeners, editor) => {
+      registeredFormatListeners.set({});
+      editor.on('NodeChange', e => {
+        updateAndFireChangeCallbacks(editor, e.element, registeredFormatListeners.get());
+      });
+      editor.on('FormatApply FormatRemove', e => {
+        const element = Optional.from(e.node).map(nodeOrRange => isNode(nodeOrRange) ? nodeOrRange : nodeOrRange.startContainer).bind(node => isElement$6(node) ? Optional.some(node) : Optional.from(node.parentElement)).getOrThunk(() => fallbackElement(editor));
+        updateAndFireChangeCallbacks(editor, element, registeredFormatListeners.get());
+      });
+    };
+    const fallbackElement = editor => editor.selection.getStart();
+    const matchingNode = (editor, parents, format, similar, vars) => {
+      const isMatchingNode = node => {
+        const matchingFormat = editor.formatter.matchNode(node, format, vars !== null && vars !== void 0 ? vars : {}, similar);
+        return !isUndefined(matchingFormat);
+      };
+      const isUnableToMatch = node => {
+        if (matchesUnInheritedFormatSelector(editor, node, format)) {
+          return true;
+        } else {
+          if (!similar) {
+            return isNonNullable(editor.formatter.matchNode(node, format, vars, true));
+          } else {
+            return false;
+          }
+        }
+      };
+      return findUntil$1(parents, isMatchingNode, isUnableToMatch);
+    };
+    const getParents = (editor, elm) => {
+      const element = elm !== null && elm !== void 0 ? elm : fallbackElement(editor);
+      return filter$6(getParents$2(editor.dom, element), node => isElement$6(node) && !isBogus$2(node));
+    };
+    const updateAndFireChangeCallbacks = (editor, elm, registeredCallbacks) => {
+      const parents = getParents(editor, elm);
+      each$f(registeredCallbacks, (data, format) => {
+        const runIfChanged = spec => {
+          const match = matchingNode(editor, parents, format, spec.similar, hasVars(spec) ? spec.vars : undefined);
+          const isSet = match.isSome();
+          if (spec.state.get() !== isSet) {
+            spec.state.set(isSet);
+            const node = match.getOr(elm);
+            if (hasVars(spec)) {
+              spec.callback(isSet, {
+                node,
+                format,
+                parents
+              });
+            } else {
+              each$g(spec.callbacks, callback => callback(isSet, {
+                node,
+                format,
+                parents
+              }));
+            }
+          }
+        };
+        each$g([
+          data.withSimilar,
+          data.withoutSimilar
+        ], runIfChanged);
+        each$g(data.withVars, runIfChanged);
+      });
+    };
+    const addListeners = (editor, registeredFormatListeners, formats, callback, similar, vars) => {
+      const formatChangeItems = registeredFormatListeners.get();
+      each$g(formats.split(','), format => {
+        const group = get$a(formatChangeItems, format).getOrThunk(() => {
+          const base = {
+            withSimilar: {
+              state: Cell(false),
+              similar: true,
+              callbacks: []
+            },
+            withoutSimilar: {
+              state: Cell(false),
+              similar: false,
+              callbacks: []
+            },
+            withVars: []
+          };
+          formatChangeItems[format] = base;
+          return base;
+        });
+        const getCurrent = () => {
+          const parents = getParents(editor);
+          return matchingNode(editor, parents, format, similar, vars).isSome();
+        };
+        if (isUndefined(vars)) {
+          const toAppendTo = similar ? group.withSimilar : group.withoutSimilar;
+          toAppendTo.callbacks.push(callback);
+          if (toAppendTo.callbacks.length === 1) {
+            toAppendTo.state.set(getCurrent());
+          }
+        } else {
+          group.withVars.push({
+            state: Cell(getCurrent()),
+            similar,
+            vars,
+            callback
+          });
+        }
+      });
+      registeredFormatListeners.set(formatChangeItems);
+    };
+    const removeListeners = (registeredFormatListeners, formats, callback) => {
+      const formatChangeItems = registeredFormatListeners.get();
+      each$g(formats.split(','), format => get$a(formatChangeItems, format).each(group => {
+        formatChangeItems[format] = {
+          withSimilar: {
+            ...group.withSimilar,
+            callbacks: filter$6(group.withSimilar.callbacks, cb => cb !== callback)
+          },
+          withoutSimilar: {
+            ...group.withoutSimilar,
+            callbacks: filter$6(group.withoutSimilar.callbacks, cb => cb !== callback)
+          },
+          withVars: filter$6(group.withVars, item => item.callback !== callback)
+        };
+      }));
+      registeredFormatListeners.set(formatChangeItems);
+    };
+    const formatChangedInternal = (editor, registeredFormatListeners, formats, callback, similar, vars) => {
+      if (registeredFormatListeners.get() === null) {
+        setup$t(registeredFormatListeners, editor);
+      }
+      addListeners(editor, registeredFormatListeners, formats, callback, similar, vars);
+      return { unbind: () => removeListeners(registeredFormatListeners, formats, callback) };
+    };
+
+    const toggle = (editor, name, vars, node) => {
+      const fmt = editor.formatter.get(name);
+      if (match$2(editor, name, vars, node) && (!('toggle' in fmt[0]) || fmt[0].toggle)) {
+        remove$2(editor, name, vars, node);
+      } else {
+        applyFormat$1(editor, name, vars, node);
+      }
+    };
+
+    function _toConsumableArray(arr) {
+      if (Array.isArray(arr)) {
+        for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
+          arr2[i] = arr[i];
+        }
+        return arr2;
+      } else {
+        return Array.from(arr);
+      }
+    }
+    var hasOwnProperty = Object.hasOwnProperty, setPrototypeOf = Object.setPrototypeOf, isFrozen = Object.isFrozen, getPrototypeOf = Object.getPrototypeOf, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+    var freeze = Object.freeze, seal = Object.seal, create$7 = Object.create;
+    var _ref = typeof Reflect !== 'undefined' && Reflect, apply = _ref.apply, construct = _ref.construct;
+    if (!apply) {
+      apply = function apply(fun, thisValue, args) {
+        return fun.apply(thisValue, args);
+      };
+    }
+    if (!freeze) {
+      freeze = function freeze(x) {
+        return x;
+      };
+    }
+    if (!seal) {
+      seal = function seal(x) {
+        return x;
+      };
+    }
+    if (!construct) {
+      construct = function construct(Func, args) {
+        return new (Function.prototype.bind.apply(Func, [null].concat(_toConsumableArray(args))))();
+      };
+    }
+    var arrayForEach = unapply(Array.prototype.forEach);
+    var arrayPop = unapply(Array.prototype.pop);
+    var arrayPush = unapply(Array.prototype.push);
+    var stringToLowerCase = unapply(String.prototype.toLowerCase);
+    var stringMatch = unapply(String.prototype.match);
+    var stringReplace = unapply(String.prototype.replace);
+    var stringIndexOf = unapply(String.prototype.indexOf);
+    var stringTrim = unapply(String.prototype.trim);
+    var regExpTest = unapply(RegExp.prototype.test);
+    var typeErrorCreate = unconstruct(TypeError);
+    function unapply(func) {
+      return function (thisArg) {
+        for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+          args[_key - 1] = arguments[_key];
+        }
+        return apply(func, thisArg, args);
+      };
+    }
+    function unconstruct(func) {
+      return function () {
+        for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+          args[_key2] = arguments[_key2];
+        }
+        return construct(func, args);
+      };
+    }
+    function addToSet(set, array) {
+      if (setPrototypeOf) {
+        setPrototypeOf(set, null);
+      }
+      var l = array.length;
+      while (l--) {
+        var element = array[l];
+        if (typeof element === 'string') {
+          var lcElement = stringToLowerCase(element);
+          if (lcElement !== element) {
+            if (!isFrozen(array)) {
+              array[l] = lcElement;
+            }
+            element = lcElement;
+          }
+        }
+        set[element] = true;
+      }
+      return set;
+    }
+    function clone(object) {
+      var newObject = create$7(null);
+      var property = void 0;
+      for (property in object) {
+        if (apply(hasOwnProperty, object, [property])) {
+          newObject[property] = object[property];
+        }
+      }
+      return newObject;
+    }
+    function lookupGetter(object, prop) {
+      while (object !== null) {
+        var desc = getOwnPropertyDescriptor(object, prop);
+        if (desc) {
+          if (desc.get) {
+            return unapply(desc.get);
+          }
+          if (typeof desc.value === 'function') {
+            return unapply(desc.value);
+          }
+        }
+        object = getPrototypeOf(object);
+      }
+      function fallbackValue(element) {
+        console.warn('fallback value for', element);
+        return null;
+      }
+      return fallbackValue;
+    }
+    var html = freeze([
+      'a',
+      'abbr',
+      'acronym',
+      'address',
+      'area',
+      'article',
+      'aside',
+      'audio',
+      'b',
+      'bdi',
+      'bdo',
+      'big',
+      'blink',
+      'blockquote',
+      'body',
+      'br',
+      'button',
+      'canvas',
+      'caption',
+      'center',
+      'cite',
+      'code',
+      'col',
+      'colgroup',
+      'content',
+      'data',
+      'datalist',
+      'dd',
+      'decorator',
+      'del',
+      'details',
+      'dfn',
+      'dialog',
+      'dir',
+      'div',
+      'dl',
+      'dt',
+      'element',
+      'em',
+      'fieldset',
+      'figcaption',
+      'figure',
+      'font',
+      'footer',
+      'form',
+      'h1',
+      'h2',
+      'h3',
+      'h4',
+      'h5',
+      'h6',
+      'head',
+      'header',
+      'hgroup',
+      'hr',
+      'html',
+      'i',
+      'img',
+      'input',
+      'ins',
+      'kbd',
+      'label',
+      'legend',
+      'li',
+      'main',
+      'map',
+      'mark',
+      'marquee',
+      'menu',
+      'menuitem',
+      'meter',
+      'nav',
+      'nobr',
+      'ol',
+      'optgroup',
+      'option',
+      'output',
+      'p',
+      'picture',
+      'pre',
+      'progress',
+      'q',
+      'rp',
+      'rt',
+      'ruby',
+      's',
+      'samp',
+      'section',
+      'select',
+      'shadow',
+      'small',
+      'source',
+      'spacer',
+      'span',
+      'strike',
+      'strong',
+      'style',
+      'sub',
+      'summary',
+      'sup',
+      'table',
+      'tbody',
+      'td',
+      'template',
+      'textarea',
+      'tfoot',
+      'th',
+      'thead',
+      'time',
+      'tr',
+      'track',
+      'tt',
+      'u',
+      'ul',
+      'var',
+      'video',
+      'wbr'
+    ]);
+    var svg = freeze([
+      'svg',
+      'a',
+      'altglyph',
+      'altglyphdef',
+      'altglyphitem',
+      'animatecolor',
+      'animatemotion',
+      'animatetransform',
+      'circle',
+      'clippath',
+      'defs',
+      'desc',
+      'ellipse',
+      'filter',
+      'font',
+      'g',
+      'glyph',
+      'glyphref',
+      'hkern',
+      'image',
+      'line',
+      'lineargradient',
+      'marker',
+      'mask',
+      'metadata',
+      'mpath',
+      'path',
+      'pattern',
+      'polygon',
+      'polyline',
+      'radialgradient',
+      'rect',
+      'stop',
+      'style',
+      'switch',
+      'symbol',
+      'text',
+      'textpath',
+      'title',
+      'tref',
+      'tspan',
+      'view',
+      'vkern'
+    ]);
+    var svgFilters = freeze([
+      'feBlend',
+      'feColorMatrix',
+      'feComponentTransfer',
+      'feComposite',
+      'feConvolveMatrix',
+      'feDiffuseLighting',
+      'feDisplacementMap',
+      'feDistantLight',
+      'feFlood',
+      'feFuncA',
+      'feFuncB',
+      'feFuncG',
+      'feFuncR',
+      'feGaussianBlur',
+      'feImage',
+      'feMerge',
+      'feMergeNode',
+      'feMorphology',
+      'feOffset',
+      'fePointLight',
+      'feSpecularLighting',
+      'feSpotLight',
+      'feTile',
+      'feTurbulence'
+    ]);
+    var svgDisallowed = freeze([
+      'animate',
+      'color-profile',
+      'cursor',
+      'discard',
+      'fedropshadow',
+      'font-face',
+      'font-face-format',
+      'font-face-name',
+      'font-face-src',
+      'font-face-uri',
+      'foreignobject',
+      'hatch',
+      'hatchpath',
+      'mesh',
+      'meshgradient',
+      'meshpatch',
+      'meshrow',
+      'missing-glyph',
+      'script',
+      'set',
+      'solidcolor',
+      'unknown',
+      'use'
+    ]);
+    var mathMl = freeze([
+      'math',
+      'menclose',
+      'merror',
+      'mfenced',
+      'mfrac',
+      'mglyph',
+      'mi',
+      'mlabeledtr',
+      'mmultiscripts',
+      'mn',
+      'mo',
+      'mover',
+      'mpadded',
+      'mphantom',
+      'mroot',
+      'mrow',
+      'ms',
+      'mspace',
+      'msqrt',
+      'mstyle',
+      'msub',
+      'msup',
+      'msubsup',
+      'mtable',
+      'mtd',
+      'mtext',
+      'mtr',
+      'munder',
+      'munderover'
+    ]);
+    var mathMlDisallowed = freeze([
+      'maction',
+      'maligngroup',
+      'malignmark',
+      'mlongdiv',
+      'mscarries',
+      'mscarry',
+      'msgroup',
+      'mstack',
+      'msline',
+      'msrow',
+      'semantics',
+      'annotation',
+      'annotation-xml',
+      'mprescripts',
+      'none'
+    ]);
+    var text = freeze(['#text']);
+    var html$1 = freeze([
+      'accept',
+      'action',
+      'align',
+      'alt',
+      'autocapitalize',
+      'autocomplete',
+      'autopictureinpicture',
+      'autoplay',
+      'background',
+      'bgcolor',
+      'border',
+      'capture',
+      'cellpadding',
+      'cellspacing',
+      'checked',
+      'cite',
+      'class',
+      'clear',
+      'color',
+      'cols',
+      'colspan',
+      'controls',
+      'controlslist',
+      'coords',
+      'crossorigin',
+      'datetime',
+      'decoding',
+      'default',
+      'dir',
+      'disabled',
+      'disablepictureinpicture',
+      'disableremoteplayback',
+      'download',
+      'draggable',
+      'enctype',
+      'enterkeyhint',
+      'face',
+      'for',
+      'headers',
+      'height',
+      'hidden',
+      'high',
+      'href',
+      'hreflang',
+      'id',
+      'inputmode',
+      'integrity',
+      'ismap',
+      'kind',
+      'label',
+      'lang',
+      'list',
+      'loading',
+      'loop',
+      'low',
+      'max',
+      'maxlength',
+      'media',
+      'method',
+      'min',
+      'minlength',
+      'multiple',
+      'muted',
+      'name',
+      'nonce',
+      'noshade',
+      'novalidate',
+      'nowrap',
+      'open',
+      'optimum',
+      'pattern',
+      'placeholder',
+      'playsinline',
+      'poster',
+      'preload',
+      'pubdate',
+      'radiogroup',
+      'readonly',
+      'rel',
+      'required',
+      'rev',
+      'reversed',
+      'role',
+      'rows',
+      'rowspan',
+      'spellcheck',
+      'scope',
+      'selected',
+      'shape',
+      'size',
+      'sizes',
+      'span',
+      'srclang',
+      'start',
+      'src',
+      'srcset',
+      'step',
+      'style',
+      'summary',
+      'tabindex',
+      'title',
+      'translate',
+      'type',
+      'usemap',
+      'valign',
+      'value',
+      'width',
+      'xmlns',
+      'slot'
+    ]);
+    var svg$1 = freeze([
+      'accent-height',
+      'accumulate',
+      'additive',
+      'alignment-baseline',
+      'ascent',
+      'attributename',
+      'attributetype',
+      'azimuth',
+      'basefrequency',
+      'baseline-shift',
+      'begin',
+      'bias',
+      'by',
+      'class',
+      'clip',
+      'clippathunits',
+      'clip-path',
+      'clip-rule',
+      'color',
+      'color-interpolation',
+      'color-interpolation-filters',
+      'color-profile',
+      'color-rendering',
+      'cx',
+      'cy',
+      'd',
+      'dx',
+      'dy',
+      'diffuseconstant',
+      'direction',
+      'display',
+      'divisor',
+      'dur',
+      'edgemode',
+      'elevation',
+      'end',
+      'fill',
+      'fill-opacity',
+      'fill-rule',
+      'filter',
+      'filterunits',
+      'flood-color',
+      'flood-opacity',
+      'font-family',
+      'font-size',
+      'font-size-adjust',
+      'font-stretch',
+      'font-style',
+      'font-variant',
+      'font-weight',
+      'fx',
+      'fy',
+      'g1',
+      'g2',
+      'glyph-name',
+      'glyphref',
+      'gradientunits',
+      'gradienttransform',
+      'height',
+      'href',
+      'id',
+      'image-rendering',
+      'in',
+      'in2',
+      'k',
+      'k1',
+      'k2',
+      'k3',
+      'k4',
+      'kerning',
+      'keypoints',
+      'keysplines',
+      'keytimes',
+      'lang',
+      'lengthadjust',
+      'letter-spacing',
+      'kernelmatrix',
+      'kernelunitlength',
+      'lighting-color',
+      'local',
+      'marker-end',
+      'marker-mid',
+      'marker-start',
+      'markerheight',
+      'markerunits',
+      'markerwidth',
+      'maskcontentunits',
+      'maskunits',
+      'max',
+      'mask',
+      'media',
+      'method',
+      'mode',
+      'min',
+      'name',
+      'numoctaves',
+      'offset',
+      'operator',
+      'opacity',
+      'order',
+      'orient',
+      'orientation',
+      'origin',
+      'overflow',
+      'paint-order',
+      'path',
+      'pathlength',
+      'patterncontentunits',
+      'patterntransform',
+      'patternunits',
+      'points',
+      'preservealpha',
+      'preserveaspectratio',
+      'primitiveunits',
+      'r',
+      'rx',
+      'ry',
+      'radius',
+      'refx',
+      'refy',
+      'repeatcount',
+      'repeatdur',
+      'restart',
+      'result',
+      'rotate',
+      'scale',
+      'seed',
+      'shape-rendering',
+      'specularconstant',
+      'specularexponent',
+      'spreadmethod',
+      'startoffset',
+      'stddeviation',
+      'stitchtiles',
+      'stop-color',
+      'stop-opacity',
+      'stroke-dasharray',
+      'stroke-dashoffset',
+      'stroke-linecap',
+      'stroke-linejoin',
+      'stroke-miterlimit',
+      'stroke-opacity',
+      'stroke',
+      'stroke-width',
+      'style',
+      'surfacescale',
+      'systemlanguage',
+      'tabindex',
+      'targetx',
+      'targety',
+      'transform',
+      'transform-origin',
+      'text-anchor',
+      'text-decoration',
+      'text-rendering',
+      'textlength',
+      'type',
+      'u1',
+      'u2',
+      'unicode',
+      'values',
+      'viewbox',
+      'visibility',
+      'version',
+      'vert-adv-y',
+      'vert-origin-x',
+      'vert-origin-y',
+      'width',
+      'word-spacing',
+      'wrap',
+      'writing-mode',
+      'xchannelselector',
+      'ychannelselector',
+      'x',
+      'x1',
+      'x2',
+      'xmlns',
+      'y',
+      'y1',
+      'y2',
+      'z',
+      'zoomandpan'
+    ]);
+    var mathMl$1 = freeze([
+      'accent',
+      'accentunder',
+      'align',
+      'bevelled',
+      'close',
+      'columnsalign',
+      'columnlines',
+      'columnspan',
+      'denomalign',
+      'depth',
+      'dir',
+      'display',
+      'displaystyle',
+      'encoding',
+      'fence',
+      'frame',
+      'height',
+      'href',
+      'id',
+      'largeop',
+      'length',
+      'linethickness',
+      'lspace',
+      'lquote',
+      'mathbackground',
+      'mathcolor',
+      'mathsize',
+      'mathvariant',
+      'maxsize',
+      'minsize',
+      'movablelimits',
+      'notation',
+      'numalign',
+      'open',
+      'rowalign',
+      'rowlines',
+      'rowspacing',
+      'rowspan',
+      'rspace',
+      'rquote',
+      'scriptlevel',
+      'scriptminsize',
+      'scriptsizemultiplier',
+      'selection',
+      'separator',
+      'separators',
+      'stretchy',
+      'subscriptshift',
+      'supscriptshift',
+      'symmetric',
+      'voffset',
+      'width',
+      'xmlns'
+    ]);
+    var xml = freeze([
+      'xlink:href',
+      'xml:id',
+      'xlink:title',
+      'xml:space',
+      'xmlns:xlink'
+    ]);
+    var MUSTACHE_EXPR = seal(/\{\{[\s\S]*|[\s\S]*\}\}/gm);
+    var ERB_EXPR = seal(/<%[\s\S]*|[\s\S]*%>/gm);
+    var DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/);
+    var ARIA_ATTR = seal(/^aria-[\-\w]+$/);
+    var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i);
+    var IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
+    var ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g);
+    var DOCTYPE_NAME = seal(/^html$/i);
+    var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function (obj) {
+      return typeof obj;
+    } : function (obj) {
+      return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+    };
+    function _toConsumableArray$1(arr) {
+      if (Array.isArray(arr)) {
+        for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
+          arr2[i] = arr[i];
+        }
+        return arr2;
+      } else {
+        return Array.from(arr);
+      }
+    }
+    var getGlobal = function getGlobal() {
+      return typeof window === 'undefined' ? null : window;
+    };
+    var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {
+      if ((typeof trustedTypes === 'undefined' ? 'undefined' : _typeof(trustedTypes)) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {
+        return null;
+      }
+      var suffix = null;
+      var ATTR_NAME = 'data-tt-policy-suffix';
+      if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {
+        suffix = document.currentScript.getAttribute(ATTR_NAME);
+      }
+      var policyName = 'dompurify' + (suffix ? '#' + suffix : '');
+      try {
+        return trustedTypes.createPolicy(policyName, {
+          createHTML: function createHTML(html$$1) {
+            return html$$1;
+          }
+        });
+      } catch (_) {
+        console.warn('TrustedTypes policy ' + policyName + ' could not be created.');
+        return null;
+      }
+    };
+    function createDOMPurify() {
+      var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
+      var DOMPurify = function DOMPurify(root) {
+        return createDOMPurify(root);
+      };
+      DOMPurify.version = '2.3.6';
+      DOMPurify.removed = [];
+      if (!window || !window.document || window.document.nodeType !== 9) {
+        DOMPurify.isSupported = false;
+        return DOMPurify;
+      }
+      var originalDocument = window.document;
+      var document = window.document;
+      var DocumentFragment = window.DocumentFragment, HTMLTemplateElement = window.HTMLTemplateElement, Node = window.Node, Element = window.Element, NodeFilter = window.NodeFilter, _window$NamedNodeMap = window.NamedNodeMap, NamedNodeMap = _window$NamedNodeMap === undefined ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap, HTMLFormElement = window.HTMLFormElement, DOMParser = window.DOMParser, trustedTypes = window.trustedTypes;
+      var ElementPrototype = Element.prototype;
+      var cloneNode = lookupGetter(ElementPrototype, 'cloneNode');
+      var getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');
+      var getChildNodes = lookupGetter(ElementPrototype, 'childNodes');
+      var getParentNode = lookupGetter(ElementPrototype, 'parentNode');
+      if (typeof HTMLTemplateElement === 'function') {
+        var template = document.createElement('template');
+        if (template.content && template.content.ownerDocument) {
+          document = template.content.ownerDocument;
+        }
+      }
+      var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);
+      var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';
+      var _document = document, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;
+      var importNode = originalDocument.importNode;
+      var documentMode = {};
+      try {
+        documentMode = clone(document).documentMode ? document.documentMode : {};
+      } catch (_) {
+      }
+      var hooks = {};
+      DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9;
+      var MUSTACHE_EXPR$$1 = MUSTACHE_EXPR, ERB_EXPR$$1 = ERB_EXPR, DATA_ATTR$$1 = DATA_ATTR, ARIA_ATTR$$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$$1 = ATTR_WHITESPACE;
+      var IS_ALLOWED_URI$$1 = IS_ALLOWED_URI;
+      var ALLOWED_TAGS = null;
+      var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray$1(html), _toConsumableArray$1(svg), _toConsumableArray$1(svgFilters), _toConsumableArray$1(mathMl), _toConsumableArray$1(text)));
+      var ALLOWED_ATTR = null;
+      var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray$1(html$1), _toConsumableArray$1(svg$1), _toConsumableArray$1(mathMl$1), _toConsumableArray$1(xml)));
+      var CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {
+        tagNameCheck: {
+          writable: true,
+          configurable: false,
+          enumerable: true,
+          value: null
+        },
+        attributeNameCheck: {
+          writable: true,
+          configurable: false,
+          enumerable: true,
+          value: null
+        },
+        allowCustomizedBuiltInElements: {
+          writable: true,
+          configurable: false,
+          enumerable: true,
+          value: false
+        }
+      }));
+      var FORBID_TAGS = null;
+      var FORBID_ATTR = null;
+      var ALLOW_ARIA_ATTR = true;
+      var ALLOW_DATA_ATTR = true;
+      var ALLOW_UNKNOWN_PROTOCOLS = false;
+      var SAFE_FOR_TEMPLATES = false;
+      var WHOLE_DOCUMENT = false;
+      var SET_CONFIG = false;
+      var FORCE_BODY = false;
+      var RETURN_DOM = false;
+      var RETURN_DOM_FRAGMENT = false;
+      var RETURN_TRUSTED_TYPE = false;
+      var SANITIZE_DOM = true;
+      var KEEP_CONTENT = true;
+      var IN_PLACE = false;
+      var USE_PROFILES = {};
+      var FORBID_CONTENTS = null;
+      var DEFAULT_FORBID_CONTENTS = addToSet({}, [
+        'annotation-xml',
+        'audio',
+        'colgroup',
+        'desc',
+        'foreignobject',
+        'head',
+        'iframe',
+        'math',
+        'mi',
+        'mn',
+        'mo',
+        'ms',
+        'mtext',
+        'noembed',
+        'noframes',
+        'noscript',
+        'plaintext',
+        'script',
+        'style',
+        'svg',
+        'template',
+        'thead',
+        'title',
+        'video',
+        'xmp'
+      ]);
+      var DATA_URI_TAGS = null;
+      var DEFAULT_DATA_URI_TAGS = addToSet({}, [
+        'audio',
+        'video',
+        'img',
+        'source',
+        'image',
+        'track'
+      ]);
+      var URI_SAFE_ATTRIBUTES = null;
+      var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [
+        'alt',
+        'class',
+        'for',
+        'id',
+        'label',
+        'name',
+        'pattern',
+        'placeholder',
+        'role',
+        'summary',
+        'title',
+        'value',
+        'style',
+        'xmlns'
+      ]);
+      var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
+      var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
+      var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
+      var NAMESPACE = HTML_NAMESPACE;
+      var IS_EMPTY_INPUT = false;
+      var PARSER_MEDIA_TYPE = void 0;
+      var SUPPORTED_PARSER_MEDIA_TYPES = [
+        'application/xhtml+xml',
+        'text/html'
+      ];
+      var DEFAULT_PARSER_MEDIA_TYPE = 'text/html';
+      var transformCaseFunc = void 0;
+      var CONFIG = null;
+      var formElement = document.createElement('form');
+      var isRegexOrFunction = function isRegexOrFunction(testValue) {
+        return testValue instanceof RegExp || testValue instanceof Function;
+      };
+      var _parseConfig = function _parseConfig(cfg) {
+        if (CONFIG && CONFIG === cfg) {
+          return;
+        }
+        if (!cfg || (typeof cfg === 'undefined' ? 'undefined' : _typeof(cfg)) !== 'object') {
+          cfg = {};
+        }
+        cfg = clone(cfg);
+        ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS;
+        ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR;
+        URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR) : DEFAULT_URI_SAFE_ATTRIBUTES;
+        DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS) : DEFAULT_DATA_URI_TAGS;
+        FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS) : DEFAULT_FORBID_CONTENTS;
+        FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS) : {};
+        FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR) : {};
+        USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;
+        ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;
+        ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;
+        ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;
+        SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;
+        WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;
+        RETURN_DOM = cfg.RETURN_DOM || false;
+        RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;
+        RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;
+        FORCE_BODY = cfg.FORCE_BODY || false;
+        SANITIZE_DOM = cfg.SANITIZE_DOM !== false;
+        KEEP_CONTENT = cfg.KEEP_CONTENT !== false;
+        IN_PLACE = cfg.IN_PLACE || false;
+        IS_ALLOWED_URI$$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$$1;
+        NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;
+        if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {
+          CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;
+        }
+        if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {
+          CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;
+        }
+        if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {
+          CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;
+        }
+        PARSER_MEDIA_TYPE = SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE;
+        transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? function (x) {
+          return x;
+        } : stringToLowerCase;
+        if (SAFE_FOR_TEMPLATES) {
+          ALLOW_DATA_ATTR = false;
+        }
+        if (RETURN_DOM_FRAGMENT) {
+          RETURN_DOM = true;
+        }
+        if (USE_PROFILES) {
+          ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray$1(text)));
+          ALLOWED_ATTR = [];
+          if (USE_PROFILES.html === true) {
+            addToSet(ALLOWED_TAGS, html);
+            addToSet(ALLOWED_ATTR, html$1);
+          }
+          if (USE_PROFILES.svg === true) {
+            addToSet(ALLOWED_TAGS, svg);
+            addToSet(ALLOWED_ATTR, svg$1);
+            addToSet(ALLOWED_ATTR, xml);
+          }
+          if (USE_PROFILES.svgFilters === true) {
+            addToSet(ALLOWED_TAGS, svgFilters);
+            addToSet(ALLOWED_ATTR, svg$1);
+            addToSet(ALLOWED_ATTR, xml);
+          }
+          if (USE_PROFILES.mathMl === true) {
+            addToSet(ALLOWED_TAGS, mathMl);
+            addToSet(ALLOWED_ATTR, mathMl$1);
+            addToSet(ALLOWED_ATTR, xml);
+          }
+        }
+        if (cfg.ADD_TAGS) {
+          if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
+            ALLOWED_TAGS = clone(ALLOWED_TAGS);
+          }
+          addToSet(ALLOWED_TAGS, cfg.ADD_TAGS);
+        }
+        if (cfg.ADD_ATTR) {
+          if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
+            ALLOWED_ATTR = clone(ALLOWED_ATTR);
+          }
+          addToSet(ALLOWED_ATTR, cfg.ADD_ATTR);
+        }
+        if (cfg.ADD_URI_SAFE_ATTR) {
+          addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR);
+        }
+        if (cfg.FORBID_CONTENTS) {
+          if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
+            FORBID_CONTENTS = clone(FORBID_CONTENTS);
+          }
+          addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS);
+        }
+        if (KEEP_CONTENT) {
+          ALLOWED_TAGS['#text'] = true;
+        }
+        if (WHOLE_DOCUMENT) {
+          addToSet(ALLOWED_TAGS, [
+            'html',
+            'head',
+            'body'
+          ]);
+        }
+        if (ALLOWED_TAGS.table) {
+          addToSet(ALLOWED_TAGS, ['tbody']);
+          delete FORBID_TAGS.tbody;
+        }
+        if (freeze) {
+          freeze(cfg);
+        }
+        CONFIG = cfg;
+      };
+      var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [
+        'mi',
+        'mo',
+        'mn',
+        'ms',
+        'mtext'
+      ]);
+      var HTML_INTEGRATION_POINTS = addToSet({}, [
+        'foreignobject',
+        'desc',
+        'title',
+        'annotation-xml'
+      ]);
+      var COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [
+        'title',
+        'style',
+        'font',
+        'a',
+        'script'
+      ]);
+      var ALL_SVG_TAGS = addToSet({}, svg);
+      addToSet(ALL_SVG_TAGS, svgFilters);
+      addToSet(ALL_SVG_TAGS, svgDisallowed);
+      var ALL_MATHML_TAGS = addToSet({}, mathMl);
+      addToSet(ALL_MATHML_TAGS, mathMlDisallowed);
+      var _checkValidNamespace = function _checkValidNamespace(element) {
+        var parent = getParentNode(element);
+        if (!parent || !parent.tagName) {
+          parent = {
+            namespaceURI: HTML_NAMESPACE,
+            tagName: 'template'
+          };
+        }
+        var tagName = stringToLowerCase(element.tagName);
+        var parentTagName = stringToLowerCase(parent.tagName);
+        if (element.namespaceURI === SVG_NAMESPACE) {
+          if (parent.namespaceURI === HTML_NAMESPACE) {
+            return tagName === 'svg';
+          }
+          if (parent.namespaceURI === MATHML_NAMESPACE) {
+            return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
+          }
+          return Boolean(ALL_SVG_TAGS[tagName]);
+        }
+        if (element.namespaceURI === MATHML_NAMESPACE) {
+          if (parent.namespaceURI === HTML_NAMESPACE) {
+            return tagName === 'math';
+          }
+          if (parent.namespaceURI === SVG_NAMESPACE) {
+            return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];
+          }
+          return Boolean(ALL_MATHML_TAGS[tagName]);
+        }
+        if (element.namespaceURI === HTML_NAMESPACE) {
+          if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {
+            return false;
+          }
+          if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {
+            return false;
+          }
+          return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
+        }
+        return false;
+      };
+      var _forceRemove = function _forceRemove(node) {
+        arrayPush(DOMPurify.removed, { element: node });
+        try {
+          node.parentNode.removeChild(node);
+        } catch (_) {
+          try {
+            node.outerHTML = emptyHTML;
+          } catch (_) {
+            node.remove();
+          }
+        }
+      };
+      var _removeAttribute = function _removeAttribute(name, node) {
+        try {
+          arrayPush(DOMPurify.removed, {
+            attribute: node.getAttributeNode(name),
+            from: node
+          });
+        } catch (_) {
+          arrayPush(DOMPurify.removed, {
+            attribute: null,
+            from: node
+          });
+        }
+        node.removeAttribute(name);
+        if (name === 'is' && !ALLOWED_ATTR[name]) {
+          if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
+            try {
+              _forceRemove(node);
+            } catch (_) {
+            }
+          } else {
+            try {
+              node.setAttribute(name, '');
+            } catch (_) {
+            }
+          }
+        }
+      };
+      var _initDocument = function _initDocument(dirty) {
+        var doc = void 0;
+        var leadingWhitespace = void 0;
+        if (FORCE_BODY) {
+          dirty = '<remove></remove>' + dirty;
+        } else {
+          var matches = stringMatch(dirty, /^[\r\n\t ]+/);
+          leadingWhitespace = matches && matches[0];
+        }
+        if (PARSER_MEDIA_TYPE === 'application/xhtml+xml') {
+          dirty = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + dirty + '</body></html>';
+        }
+        var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;
+        if (NAMESPACE === HTML_NAMESPACE) {
+          try {
+            doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
+          } catch (_) {
+          }
+        }
+        if (!doc || !doc.documentElement) {
+          doc = implementation.createDocument(NAMESPACE, 'template', null);
+          try {
+            doc.documentElement.innerHTML = IS_EMPTY_INPUT ? '' : dirtyPayload;
+          } catch (_) {
+          }
+        }
+        var body = doc.body || doc.documentElement;
+        if (dirty && leadingWhitespace) {
+          body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);
+        }
+        if (NAMESPACE === HTML_NAMESPACE) {
+          return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];
+        }
+        return WHOLE_DOCUMENT ? doc.documentElement : body;
+      };
+      var _createIterator = function _createIterator(root) {
+        return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);
+      };
+      var _isClobbered = function _isClobbered(elm) {
+        return elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function');
+      };
+      var _isNode = function _isNode(object) {
+        return (typeof Node === 'undefined' ? 'undefined' : _typeof(Node)) === 'object' ? object instanceof Node : object && (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';
+      };
+      var _executeHook = function _executeHook(entryPoint, currentNode, data) {
+        if (!hooks[entryPoint]) {
+          return;
+        }
+        arrayForEach(hooks[entryPoint], function (hook) {
+          hook.call(DOMPurify, currentNode, data, CONFIG);
+        });
+      };
+      var _sanitizeElements = function _sanitizeElements(currentNode) {
+        var content = void 0;
+        _executeHook('beforeSanitizeElements', currentNode, null);
+        if (_isClobbered(currentNode)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        if (regExpTest(/[\u0080-\uFFFF]/, currentNode.nodeName)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        var tagName = transformCaseFunc(currentNode.nodeName);
+        _executeHook('uponSanitizeElement', currentNode, {
+          tagName: tagName,
+          allowedTags: ALLOWED_TAGS
+        });
+        if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        if (tagName === 'select' && regExpTest(/<template/i, currentNode.innerHTML)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
+          if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {
+            if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName))
+              return false;
+            if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName))
+              return false;
+          }
+          if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
+            var parentNode = getParentNode(currentNode) || currentNode.parentNode;
+            var childNodes = getChildNodes(currentNode) || currentNode.childNodes;
+            if (childNodes && parentNode) {
+              var childCount = childNodes.length;
+              for (var i = childCount - 1; i >= 0; --i) {
+                parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));
+              }
+            }
+          }
+          _forceRemove(currentNode);
+          return true;
+        }
+        if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\/no(script|embed)/i, currentNode.innerHTML)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
+          content = currentNode.textContent;
+          content = stringReplace(content, MUSTACHE_EXPR$$1, ' ');
+          content = stringReplace(content, ERB_EXPR$$1, ' ');
+          if (currentNode.textContent !== content) {
+            arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });
+            currentNode.textContent = content;
+          }
+        }
+        _executeHook('afterSanitizeElements', currentNode, null);
+        return false;
+      };
+      var _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
+        if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
+          return false;
+        }
+        if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR$$1, lcName));
+        else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$$1, lcName));
+        else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {
+          if (_basicCustomElementTest(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value)));
+          else {
+            return false;
+          }
+        } else if (URI_SAFE_ATTRIBUTES[lcName]);
+        else if (regExpTest(IS_ALLOWED_URI$$1, stringReplace(value, ATTR_WHITESPACE$$1, '')));
+        else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]);
+        else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$$1, stringReplace(value, ATTR_WHITESPACE$$1, '')));
+        else if (!value);
+        else {
+          return false;
+        }
+        return true;
+      };
+      var _basicCustomElementTest = function _basicCustomElementTest(tagName) {
+        return tagName.indexOf('-') > 0;
+      };
+      var _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
+        var attr = void 0;
+        var value = void 0;
+        var lcName = void 0;
+        var l = void 0;
+        _executeHook('beforeSanitizeAttributes', currentNode, null);
+        var attributes = currentNode.attributes;
+        if (!attributes) {
+          return;
+        }
+        var hookEvent = {
+          attrName: '',
+          attrValue: '',
+          keepAttr: true,
+          allowedAttributes: ALLOWED_ATTR
+        };
+        l = attributes.length;
+        while (l--) {
+          attr = attributes[l];
+          var _attr = attr, name = _attr.name, namespaceURI = _attr.namespaceURI;
+          value = stringTrim(attr.value);
+          lcName = transformCaseFunc(name);
+          var initValue = value;
+          hookEvent.attrName = lcName;
+          hookEvent.attrValue = value;
+          hookEvent.keepAttr = true;
+          hookEvent.forceKeepAttr = undefined;
+          _executeHook('uponSanitizeAttribute', currentNode, hookEvent);
+          value = hookEvent.attrValue;
+          if (hookEvent.forceKeepAttr) {
+            continue;
+          }
+          if (!hookEvent.keepAttr) {
+            _removeAttribute(name, currentNode);
+            continue;
+          }
+          if (regExpTest(/\/>/i, value)) {
+            _removeAttribute(name, currentNode);
+            continue;
+          }
+          if (SAFE_FOR_TEMPLATES) {
+            value = stringReplace(value, MUSTACHE_EXPR$$1, ' ');
+            value = stringReplace(value, ERB_EXPR$$1, ' ');
+          }
+          var lcTag = transformCaseFunc(currentNode.nodeName);
+          if (!_isValidAttribute(lcTag, lcName, value)) {
+            _removeAttribute(name, currentNode);
+            continue;
+          }
+          if (value !== initValue) {
+            try {
+              if (namespaceURI) {
+                currentNode.setAttributeNS(namespaceURI, name, value);
+              } else {
+                currentNode.setAttribute(name, value);
+              }
+            } catch (_) {
+              _removeAttribute(name, currentNode);
+            }
+          }
+        }
+        _executeHook('afterSanitizeAttributes', currentNode, null);
+      };
+      var _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {
+        var shadowNode = void 0;
+        var shadowIterator = _createIterator(fragment);
+        _executeHook('beforeSanitizeShadowDOM', fragment, null);
+        while (shadowNode = shadowIterator.nextNode()) {
+          _executeHook('uponSanitizeShadowNode', shadowNode, null);
+          if (_sanitizeElements(shadowNode)) {
+            continue;
+          }
+          if (shadowNode.content instanceof DocumentFragment) {
+            _sanitizeShadowDOM(shadowNode.content);
+          }
+          _sanitizeAttributes(shadowNode);
+        }
+        _executeHook('afterSanitizeShadowDOM', fragment, null);
+      };
+      DOMPurify.sanitize = function (dirty, cfg) {
+        var body = void 0;
+        var importedNode = void 0;
+        var currentNode = void 0;
+        var oldNode = void 0;
+        var returnNode = void 0;
+        IS_EMPTY_INPUT = !dirty;
+        if (IS_EMPTY_INPUT) {
+          dirty = '<!-->';
+        }
+        if (typeof dirty !== 'string' && !_isNode(dirty)) {
+          if (typeof dirty.toString !== 'function') {
+            throw typeErrorCreate('toString is not a function');
+          } else {
+            dirty = dirty.toString();
+            if (typeof dirty !== 'string') {
+              throw typeErrorCreate('dirty is not a string, aborting');
+            }
+          }
+        }
+        if (!DOMPurify.isSupported) {
+          if (_typeof(window.toStaticHTML) === 'object' || typeof window.toStaticHTML === 'function') {
+            if (typeof dirty === 'string') {
+              return window.toStaticHTML(dirty);
+            }
+            if (_isNode(dirty)) {
+              return window.toStaticHTML(dirty.outerHTML);
+            }
+          }
+          return dirty;
+        }
+        if (!SET_CONFIG) {
+          _parseConfig(cfg);
+        }
+        DOMPurify.removed = [];
+        if (typeof dirty === 'string') {
+          IN_PLACE = false;
+        }
+        if (IN_PLACE) {
+          if (dirty.nodeName) {
+            var tagName = transformCaseFunc(dirty.nodeName);
+            if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
+              throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');
+            }
+          }
+        } else if (dirty instanceof Node) {
+          body = _initDocument('<!---->');
+          importedNode = body.ownerDocument.importNode(dirty, true);
+          if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {
+            body = importedNode;
+          } else if (importedNode.nodeName === 'HTML') {
+            body = importedNode;
+          } else {
+            body.appendChild(importedNode);
+          }
+        } else {
+          if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && dirty.indexOf('<') === -1) {
+            return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;
+          }
+          body = _initDocument(dirty);
+          if (!body) {
+            return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';
+          }
+        }
+        if (body && FORCE_BODY) {
+          _forceRemove(body.firstChild);
+        }
+        var nodeIterator = _createIterator(IN_PLACE ? dirty : body);
+        while (currentNode = nodeIterator.nextNode()) {
+          if (currentNode.nodeType === 3 && currentNode === oldNode) {
+            continue;
+          }
+          if (_sanitizeElements(currentNode)) {
+            continue;
+          }
+          if (currentNode.content instanceof DocumentFragment) {
+            _sanitizeShadowDOM(currentNode.content);
+          }
+          _sanitizeAttributes(currentNode);
+          oldNode = currentNode;
+        }
+        oldNode = null;
+        if (IN_PLACE) {
+          return dirty;
+        }
+        if (RETURN_DOM) {
+          if (RETURN_DOM_FRAGMENT) {
+            returnNode = createDocumentFragment.call(body.ownerDocument);
+            while (body.firstChild) {
+              returnNode.appendChild(body.firstChild);
+            }
+          } else {
+            returnNode = body;
+          }
+          if (ALLOWED_ATTR.shadowroot) {
+            returnNode = importNode.call(originalDocument, returnNode, true);
+          }
+          return returnNode;
+        }
+        var serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
+        if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {
+          serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\n' + serializedHTML;
+        }
+        if (SAFE_FOR_TEMPLATES) {
+          serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR$$1, ' ');
+          serializedHTML = stringReplace(serializedHTML, ERB_EXPR$$1, ' ');
+        }
+        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;
+      };
+      DOMPurify.setConfig = function (cfg) {
+        _parseConfig(cfg);
+        SET_CONFIG = true;
+      };
+      DOMPurify.clearConfig = function () {
+        CONFIG = null;
+        SET_CONFIG = false;
+      };
+      DOMPurify.isValidAttribute = function (tag, attr, value) {
+        if (!CONFIG) {
+          _parseConfig({});
+        }
+        var lcTag = transformCaseFunc(tag);
+        var lcName = transformCaseFunc(attr);
+        return _isValidAttribute(lcTag, lcName, value);
+      };
+      DOMPurify.addHook = function (entryPoint, hookFunction) {
+        if (typeof hookFunction !== 'function') {
+          return;
+        }
+        hooks[entryPoint] = hooks[entryPoint] || [];
+        arrayPush(hooks[entryPoint], hookFunction);
+      };
+      DOMPurify.removeHook = function (entryPoint) {
+        if (hooks[entryPoint]) {
+          arrayPop(hooks[entryPoint]);
+        }
+      };
+      DOMPurify.removeHooks = function (entryPoint) {
+        if (hooks[entryPoint]) {
+          hooks[entryPoint] = [];
+        }
+      };
+      DOMPurify.removeAllHooks = function () {
+        hooks = {};
+      };
+      return DOMPurify;
+    }
+    var purify = createDOMPurify();
+
+    const removeAttrs = (node, names) => {
+      each$g(names, name => {
+        node.attr(name, null);
+      });
+    };
+    const addFontToSpansFilter = (domParser, styles, fontSizes) => {
+      domParser.addNodeFilter('font', nodes => {
+        each$g(nodes, node => {
+          const props = styles.parse(node.attr('style'));
+          const color = node.attr('color');
+          const face = node.attr('face');
+          const size = node.attr('size');
+          if (color) {
+            props.color = color;
+          }
+          if (face) {
+            props['font-family'] = face;
+          }
+          if (size) {
+            props['font-size'] = fontSizes[parseInt(node.attr('size'), 10) - 1];
+          }
+          node.name = 'span';
+          node.attr('style', styles.serialize(props));
+          removeAttrs(node, [
+            'color',
+            'face',
+            'size'
+          ]);
+        });
+      });
+    };
+    const addStrikeFilter = (domParser, schema, styles) => {
+      domParser.addNodeFilter('strike', nodes => {
+        const convertToSTag = schema.type !== 'html4';
+        each$g(nodes, node => {
+          if (convertToSTag) {
+            node.name = 's';
+          } else {
+            const props = styles.parse(node.attr('style'));
+            props['text-decoration'] = 'line-through';
+            node.name = 'span';
+            node.attr('style', styles.serialize(props));
+          }
+        });
+      });
+    };
+    const addFilters = (domParser, settings, schema) => {
+      const styles = Styles();
+      if (settings.convert_fonts_to_spans) {
+        addFontToSpansFilter(domParser, styles, Tools.explode(settings.font_size_legacy_values));
+      }
+      addStrikeFilter(domParser, schema, styles);
+    };
+    const register$5 = (domParser, settings, schema) => {
+      if (settings.inline_styles) {
+        addFilters(domParser, settings, schema);
+      }
+    };
+
+    const blobUriToBlob = url => {
+      return new Promise((resolve, reject) => {
+        const rejectWithError = () => {
+          reject('Cannot convert ' + url + ' to Blob. Resource might not exist or is inaccessible.');
+        };
+        try {
+          const xhr = new XMLHttpRequest();
+          xhr.open('GET', url, true);
+          xhr.responseType = 'blob';
+          xhr.onload = () => {
+            if (xhr.status === 200) {
+              resolve(xhr.response);
+            } else {
+              rejectWithError();
+            }
+          };
+          xhr.onerror = rejectWithError;
+          xhr.send();
+        } catch (ex) {
+          rejectWithError();
+        }
+      });
+    };
+    const parseDataUri$1 = uri => {
+      let type;
+      const uriParts = decodeURIComponent(uri).split(',');
+      const matches = /data:([^;]+)/.exec(uriParts[0]);
+      if (matches) {
+        type = matches[1];
+      }
+      return {
+        type,
+        data: uriParts[1]
+      };
+    };
+    const buildBlob = (type, data) => {
+      let str;
+      try {
+        str = atob(data);
+      } catch (e) {
+        return Optional.none();
+      }
+      const arr = new Uint8Array(str.length);
+      for (let i = 0; i < arr.length; i++) {
+        arr[i] = str.charCodeAt(i);
+      }
+      return Optional.some(new Blob([arr], { type }));
+    };
+    const dataUriToBlob = uri => {
+      return new Promise(resolve => {
+        const {type, data} = parseDataUri$1(uri);
+        buildBlob(type, data).fold(() => resolve(new Blob([])), resolve);
+      });
+    };
+    const uriToBlob = url => {
+      if (url.indexOf('blob:') === 0) {
+        return blobUriToBlob(url);
+      }
+      if (url.indexOf('data:') === 0) {
+        return dataUriToBlob(url);
+      }
+      return null;
+    };
+    const blobToDataUri = blob => {
+      return new Promise(resolve => {
+        const reader = new FileReader();
+        reader.onloadend = () => {
+          resolve(reader.result);
+        };
+        reader.readAsDataURL(blob);
+      });
+    };
+
+    let count$1 = 0;
+    const uniqueId$1 = prefix => {
+      return (prefix || 'blobid') + count$1++;
+    };
+    const imageToBlobInfo = (blobCache, img, resolve, reject) => {
+      let base64, blobInfo;
+      if (img.src.indexOf('blob:') === 0) {
+        blobInfo = blobCache.getByUri(img.src);
+        if (blobInfo) {
+          resolve({
+            image: img,
+            blobInfo
+          });
+        } else {
+          uriToBlob(img.src).then(blob => {
+            blobToDataUri(blob).then(dataUri => {
+              base64 = parseDataUri$1(dataUri).data;
+              blobInfo = blobCache.create(uniqueId$1(), blob, base64);
+              blobCache.add(blobInfo);
+              resolve({
+                image: img,
+                blobInfo
+              });
+            });
+          }, err => {
+            reject(err);
+          });
+        }
+        return;
+      }
+      const {data, type} = parseDataUri$1(img.src);
+      base64 = data;
+      blobInfo = blobCache.getByData(base64, type);
+      if (blobInfo) {
+        resolve({
+          image: img,
+          blobInfo
+        });
+      } else {
+        uriToBlob(img.src).then(blob => {
+          blobInfo = blobCache.create(uniqueId$1(), blob, base64);
+          blobCache.add(blobInfo);
+          resolve({
+            image: img,
+            blobInfo
+          });
+        }, err => {
+          reject(err);
+        });
+      }
+    };
+    const getAllImages = elm => {
+      return elm ? from(elm.getElementsByTagName('img')) : [];
+    };
+    const ImageScanner = (uploadStatus, blobCache) => {
+      const cachedPromises = {};
+      const findAll = (elm, predicate) => {
+        if (!predicate) {
+          predicate = always;
+        }
+        const images = filter$6(getAllImages(elm), img => {
+          const src = img.src;
+          if (img.hasAttribute('data-mce-bogus')) {
+            return false;
+          }
+          if (img.hasAttribute('data-mce-placeholder')) {
+            return false;
+          }
+          if (!src || src === Env.transparentSrc) {
+            return false;
+          }
+          if (src.indexOf('blob:') === 0) {
+            return !uploadStatus.isUploaded(src) && predicate(img);
+          }
+          if (src.indexOf('data:') === 0) {
+            return predicate(img);
+          }
+          return false;
+        });
+        const promises = map$3(images, img => {
+          if (cachedPromises[img.src] !== undefined) {
+            return new Promise(resolve => {
+              cachedPromises[img.src].then(imageInfo => {
+                if (typeof imageInfo === 'string') {
+                  return imageInfo;
+                }
+                resolve({
+                  image: img,
+                  blobInfo: imageInfo.blobInfo
+                });
+              });
+            });
+          }
+          const newPromise = new Promise((resolve, reject) => {
+            imageToBlobInfo(blobCache, img, resolve, reject);
+          }).then(result => {
+            delete cachedPromises[result.image.src];
+            return result;
+          }).catch(error => {
+            delete cachedPromises[img.src];
+            return error;
+          });
+          cachedPromises[img.src] = newPromise;
+          return newPromise;
+        });
+        return Promise.all(promises);
+      };
+      return { findAll };
+    };
+
+    const parseDataUri = uri => {
+      const matches = /data:([^;]+);base64,([a-z0-9\+\/=\s]+)/i.exec(uri);
+      if (matches) {
+        return Optional.some({
+          type: matches[1],
+          data: decodeURIComponent(matches[2])
+        });
+      } else {
+        return Optional.none();
+      }
+    };
+
+    const isBogusImage = img => isNonNullable(img.attr('data-mce-bogus'));
+    const isInternalImageSource = img => img.attr('src') === Env.transparentSrc || isNonNullable(img.attr('data-mce-placeholder'));
+    const registerBase64ImageFilter = (parser, settings) => {
+      const {blob_cache: blobCache} = settings;
+      const processImage = img => {
+        const inputSrc = img.attr('src');
+        if (isInternalImageSource(img) || isBogusImage(img)) {
+          return;
+        }
+        parseDataUri(inputSrc).bind(({type, data}) => Optional.from(blobCache.getByData(data, type)).orThunk(() => buildBlob(type, data).map(blob => {
+          const blobInfo = blobCache.create(uniqueId$1(), blob, data);
+          blobCache.add(blobInfo);
+          return blobInfo;
+        }))).each(blobInfo => {
+          img.attr('src', blobInfo.blobUri());
+        });
+      };
+      if (blobCache) {
+        parser.addAttributeFilter('src', nodes => each$g(nodes, processImage));
+      }
+    };
+    const register$4 = (parser, settings) => {
+      const schema = parser.schema;
+      if (settings.remove_trailing_brs) {
+        parser.addNodeFilter('br', (nodes, _, args) => {
+          const blockElements = Tools.extend({}, schema.getBlockElements());
+          const nonEmptyElements = schema.getNonEmptyElements();
+          const whitespaceElements = schema.getWhitespaceElements();
+          blockElements.body = 1;
+          for (let i = 0, l = nodes.length; i < l; i++) {
+            let node = nodes[i];
+            let parent = node.parent;
+            if (blockElements[node.parent.name] && node === parent.lastChild) {
+              let prev = node.prev;
+              while (prev) {
+                const prevName = prev.name;
+                if (prevName !== 'span' || prev.attr('data-mce-type') !== 'bookmark') {
+                  if (prevName === 'br') {
+                    node = null;
+                  }
+                  break;
+                }
+                prev = prev.prev;
+              }
+              if (node) {
+                node.remove();
+                if (isEmpty(schema, nonEmptyElements, whitespaceElements, parent)) {
+                  const elementRule = schema.getElementRule(parent.name);
+                  if (elementRule) {
+                    if (elementRule.removeEmpty) {
+                      parent.remove();
+                    } else if (elementRule.paddEmpty) {
+                      paddEmptyNode(settings, args, blockElements, parent);
+                    }
+                  }
+                }
+              }
+            } else {
+              let lastParent = node;
+              while (parent && parent.firstChild === lastParent && parent.lastChild === lastParent) {
+                lastParent = parent;
+                if (blockElements[parent.name]) {
+                  break;
+                }
+                parent = parent.parent;
+              }
+              if (lastParent === parent) {
+                const textNode = new AstNode('#text', 3);
+                textNode.value = nbsp;
+                node.replace(textNode);
+              }
+            }
+          }
+        });
+      }
+      parser.addAttributeFilter('href', nodes => {
+        let i = nodes.length;
+        const appendRel = rel => {
+          const parts = rel.split(' ').filter(p => p.length > 0);
+          return parts.concat(['noopener']).sort().join(' ');
+        };
+        const addNoOpener = rel => {
+          const newRel = rel ? Tools.trim(rel) : '';
+          if (!/\b(noopener)\b/g.test(newRel)) {
+            return appendRel(newRel);
+          } else {
+            return newRel;
+          }
+        };
+        if (!settings.allow_unsafe_link_target) {
+          while (i--) {
+            const node = nodes[i];
+            if (node.name === 'a' && node.attr('target') === '_blank') {
+              node.attr('rel', addNoOpener(node.attr('rel')));
+            }
+          }
+        }
+      });
+      if (!settings.allow_html_in_named_anchor) {
+        parser.addAttributeFilter('id,name', nodes => {
+          let i = nodes.length, sibling, prevSibling, parent, node;
+          while (i--) {
+            node = nodes[i];
+            if (node.name === 'a' && node.firstChild && !node.attr('href')) {
+              parent = node.parent;
+              sibling = node.lastChild;
+              do {
+                prevSibling = sibling.prev;
+                parent.insert(sibling, node);
+                sibling = prevSibling;
+              } while (sibling);
+            }
+          }
+        });
+      }
+      if (settings.fix_list_elements) {
+        parser.addNodeFilter('ul,ol', nodes => {
+          let i = nodes.length, node, parentNode;
+          while (i--) {
+            node = nodes[i];
+            parentNode = node.parent;
+            if (parentNode.name === 'ul' || parentNode.name === 'ol') {
+              if (node.prev && node.prev.name === 'li') {
+                node.prev.append(node);
+              } else {
+                const li = new AstNode('li', 1);
+                li.attr('style', 'list-style-type: none');
+                node.wrap(li);
+              }
+            }
+          }
+        });
+      }
+      if (settings.validate && schema.getValidClasses()) {
+        parser.addAttributeFilter('class', nodes => {
+          const validClasses = schema.getValidClasses();
+          let i = nodes.length;
+          while (i--) {
+            const node = nodes[i];
+            const classList = node.attr('class').split(' ');
+            let classValue = '';
+            for (let ci = 0; ci < classList.length; ci++) {
+              const className = classList[ci];
+              let valid = false;
+              let validClassesMap = validClasses['*'];
+              if (validClassesMap && validClassesMap[className]) {
+                valid = true;
+              }
+              validClassesMap = validClasses[node.name];
+              if (!valid && validClassesMap && validClassesMap[className]) {
+                valid = true;
+              }
+              if (valid) {
+                if (classValue) {
+                  classValue += ' ';
+                }
+                classValue += className;
+              }
+            }
+            if (!classValue.length) {
+              classValue = null;
+            }
+            node.attr('class', classValue);
+          }
+        });
+      }
+      registerBase64ImageFilter(parser, settings);
+    };
+
+    const each$5 = Tools.each, trim = Tools.trim;
+    const queryParts = 'source protocol authority userInfo user password host port relative path directory file query anchor'.split(' ');
+    const DEFAULT_PORTS = {
+      ftp: 21,
+      http: 80,
+      https: 443,
+      mailto: 25
+    };
+    const safeSvgDataUrlElements = [
+      'img',
+      'video'
+    ];
+    const blockSvgDataUris = (allowSvgDataUrls, tagName) => {
+      if (isNonNullable(allowSvgDataUrls)) {
+        return !allowSvgDataUrls;
+      } else {
+        return isNonNullable(tagName) ? !contains$2(safeSvgDataUrlElements, tagName) : true;
+      }
+    };
+    const decodeUri = encodedUri => {
+      try {
+        return decodeURIComponent(encodedUri);
+      } catch (ex) {
+        return unescape(encodedUri);
+      }
+    };
+    const isInvalidUri = (settings, uri, tagName) => {
+      const decodedUri = decodeUri(uri);
+      if (settings.allow_script_urls) {
+        return false;
+      } else if (/((java|vb)script|mhtml):/i.test(decodedUri)) {
+        return true;
+      } else if (settings.allow_html_data_urls) {
+        return false;
+      } else if (/^data:image\//i.test(decodedUri)) {
+        return blockSvgDataUris(settings.allow_svg_data_urls, tagName) && /^data:image\/svg\+xml/i.test(decodedUri);
+      } else {
+        return /^data:/i.test(decodedUri);
+      }
+    };
+    class URI {
+      constructor(url, settings) {
+        url = trim(url);
+        this.settings = settings || {};
+        const baseUri = this.settings.base_uri;
+        const self = this;
+        if (/^([\w\-]+):([^\/]{2})/i.test(url) || /^\s*#/.test(url)) {
+          self.source = url;
+          return;
+        }
+        const isProtocolRelative = url.indexOf('//') === 0;
+        if (url.indexOf('/') === 0 && !isProtocolRelative) {
+          url = (baseUri ? baseUri.protocol || 'http' : 'http') + '://mce_host' + url;
+        }
+        if (!/^[\w\-]*:?\/\//.test(url)) {
+          const baseUrl = this.settings.base_uri ? this.settings.base_uri.path : new URI(document.location.href).directory;
+          if (this.settings.base_uri && this.settings.base_uri.protocol == '') {
+            url = '//mce_host' + self.toAbsPath(baseUrl, url);
+          } else {
+            const match = /([^#?]*)([#?]?.*)/.exec(url);
+            url = (baseUri && baseUri.protocol || 'http') + '://mce_host' + self.toAbsPath(baseUrl, match[1]) + match[2];
+          }
+        }
+        url = url.replace(/@@/g, '(mce_at)');
+        const urlMatch = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?(\[[a-zA-Z0-9:.%]+\]|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(url);
+        each$5(queryParts, (v, i) => {
+          let part = urlMatch[i];
+          if (part) {
+            part = part.replace(/\(mce_at\)/g, '@@');
+          }
+          self[v] = part;
+        });
+        if (baseUri) {
+          if (!self.protocol) {
+            self.protocol = baseUri.protocol;
+          }
+          if (!self.userInfo) {
+            self.userInfo = baseUri.userInfo;
+          }
+          if (!self.port && self.host === 'mce_host') {
+            self.port = baseUri.port;
+          }
+          if (!self.host || self.host === 'mce_host') {
+            self.host = baseUri.host;
+          }
+          self.source = '';
+        }
+        if (isProtocolRelative) {
+          self.protocol = '';
+        }
+      }
+      static parseDataUri(uri) {
+        let type;
+        const uriComponents = decodeURIComponent(uri).split(',');
+        const matches = /data:([^;]+)/.exec(uriComponents[0]);
+        if (matches) {
+          type = matches[1];
+        }
+        return {
+          type,
+          data: uriComponents[1]
+        };
+      }
+      static isDomSafe(uri, context, options = {}) {
+        if (options.allow_script_urls) {
+          return true;
+        } else {
+          const decodedUri = Entities.decode(uri).replace(/[\s\u0000-\u001F]+/g, '');
+          return !isInvalidUri(options, decodedUri, context);
+        }
+      }
+      static getDocumentBaseUrl(loc) {
+        let baseUrl;
+        if (loc.protocol.indexOf('http') !== 0 && loc.protocol !== 'file:') {
+          baseUrl = loc.href;
+        } else {
+          baseUrl = loc.protocol + '//' + loc.host + loc.pathname;
+        }
+        if (/^[^:]+:\/\/\/?[^\/]+\//.test(baseUrl)) {
+          baseUrl = baseUrl.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
+          if (!/[\/\\]$/.test(baseUrl)) {
+            baseUrl += '/';
+          }
+        }
+        return baseUrl;
+      }
+      setPath(path) {
+        const pathMatch = /^(.*?)\/?(\w+)?$/.exec(path);
+        this.path = pathMatch[0];
+        this.directory = pathMatch[1];
+        this.file = pathMatch[2];
+        this.source = '';
+        this.getURI();
+      }
+      toRelative(uri) {
+        let output;
+        if (uri === './') {
+          return uri;
+        }
+        const relativeUri = new URI(uri, { base_uri: this });
+        if (relativeUri.host !== 'mce_host' && this.host !== relativeUri.host && relativeUri.host || this.port !== relativeUri.port || this.protocol !== relativeUri.protocol && relativeUri.protocol !== '') {
+          return relativeUri.getURI();
+        }
+        const tu = this.getURI(), uu = relativeUri.getURI();
+        if (tu === uu || tu.charAt(tu.length - 1) === '/' && tu.substr(0, tu.length - 1) === uu) {
+          return tu;
+        }
+        output = this.toRelPath(this.path, relativeUri.path);
+        if (relativeUri.query) {
+          output += '?' + relativeUri.query;
+        }
+        if (relativeUri.anchor) {
+          output += '#' + relativeUri.anchor;
+        }
+        return output;
+      }
+      toAbsolute(uri, noHost) {
+        const absoluteUri = new URI(uri, { base_uri: this });
+        return absoluteUri.getURI(noHost && this.isSameOrigin(absoluteUri));
+      }
+      isSameOrigin(uri) {
+        if (this.host == uri.host && this.protocol == uri.protocol) {
+          if (this.port == uri.port) {
+            return true;
+          }
+          const defaultPort = DEFAULT_PORTS[this.protocol];
+          if (defaultPort && (this.port || defaultPort) == (uri.port || defaultPort)) {
+            return true;
+          }
+        }
+        return false;
+      }
+      toRelPath(base, path) {
+        let breakPoint = 0, out = '', i, l;
+        const normalizedBase = base.substring(0, base.lastIndexOf('/')).split('/');
+        const items = path.split('/');
+        if (normalizedBase.length >= items.length) {
+          for (i = 0, l = normalizedBase.length; i < l; i++) {
+            if (i >= items.length || normalizedBase[i] !== items[i]) {
+              breakPoint = i + 1;
+              break;
+            }
+          }
+        }
+        if (normalizedBase.length < items.length) {
+          for (i = 0, l = items.length; i < l; i++) {
+            if (i >= normalizedBase.length || normalizedBase[i] !== items[i]) {
+              breakPoint = i + 1;
+              break;
+            }
+          }
+        }
+        if (breakPoint === 1) {
+          return path;
+        }
+        for (i = 0, l = normalizedBase.length - (breakPoint - 1); i < l; i++) {
+          out += '../';
+        }
+        for (i = breakPoint - 1, l = items.length; i < l; i++) {
+          if (i !== breakPoint - 1) {
+            out += '/' + items[i];
+          } else {
+            out += items[i];
+          }
+        }
+        return out;
+      }
+      toAbsPath(base, path) {
+        let i, nb = 0, o = [], outPath;
+        const tr = /\/$/.test(path) ? '/' : '';
+        let normalizedBase = base.split('/');
+        const normalizedPath = path.split('/');
+        each$5(normalizedBase, k => {
+          if (k) {
+            o.push(k);
+          }
+        });
+        normalizedBase = o;
+        for (i = normalizedPath.length - 1, o = []; i >= 0; i--) {
+          if (normalizedPath[i].length === 0 || normalizedPath[i] === '.') {
+            continue;
+          }
+          if (normalizedPath[i] === '..') {
+            nb++;
+            continue;
+          }
+          if (nb > 0) {
+            nb--;
+            continue;
+          }
+          o.push(normalizedPath[i]);
+        }
+        i = normalizedBase.length - nb;
+        if (i <= 0) {
+          outPath = reverse(o).join('/');
+        } else {
+          outPath = normalizedBase.slice(0, i).join('/') + '/' + reverse(o).join('/');
+        }
+        if (outPath.indexOf('/') !== 0) {
+          outPath = '/' + outPath;
+        }
+        if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) {
+          outPath += tr;
+        }
+        return outPath;
+      }
+      getURI(noProtoHost = false) {
+        let s;
+        if (!this.source || noProtoHost) {
+          s = '';
+          if (!noProtoHost) {
+            if (this.protocol) {
+              s += this.protocol + '://';
+            } else {
+              s += '//';
+            }
+            if (this.userInfo) {
+              s += this.userInfo + '@';
+            }
+            if (this.host) {
+              s += this.host;
+            }
+            if (this.port) {
+              s += ':' + this.port;
+            }
+          }
+          if (this.path) {
+            s += this.path;
+          }
+          if (this.query) {
+            s += '?' + this.query;
+          }
+          if (this.anchor) {
+            s += '#' + this.anchor;
+          }
+          this.source = s;
+        }
+        return this.source;
+      }
+    }
+
+    const makeMap = Tools.makeMap, each$4 = Tools.each, explode$1 = Tools.explode, extend$1 = Tools.extend;
+    const basePurifyConfig = {
+      IN_PLACE: true,
+      ALLOW_UNKNOWN_PROTOCOLS: true,
+      ALLOWED_TAGS: [
+        '#comment',
+        '#cdata-section',
+        'body'
+      ],
+      ALLOWED_ATTR: []
+    };
+    const filteredUrlAttrs = Tools.makeMap('src,href,data,background,action,formaction,poster,xlink:href');
+    const internalElementAttr = 'data-mce-type';
+    const getPurifyConfig = (settings, mimeType) => {
+      const config = { ...basePurifyConfig };
+      config.PARSER_MEDIA_TYPE = mimeType;
+      if (settings.allow_script_urls) {
+        config.ALLOWED_URI_REGEXP = /.*/;
+      } else if (settings.allow_html_data_urls) {
+        config.ALLOWED_URI_REGEXP = /^(?!(\w+script|mhtml):)/i;
+      }
+      return config;
+    };
+    const setupPurify = (settings, schema) => {
+      const purify$1 = purify();
+      const validate = settings.validate;
+      let uid = 0;
+      purify$1.addHook('uponSanitizeElement', (ele, evt) => {
+        var _a, _b;
+        if (ele.nodeType === COMMENT && !settings.allow_conditional_comments && /^\[if/i.test(ele.nodeValue)) {
+          ele.nodeValue = ' ' + ele.nodeValue;
+        }
+        const tagName = evt.tagName;
+        if (ele.nodeType !== ELEMENT || tagName === 'body') {
+          return;
+        }
+        const element = SugarElement.fromDom(ele);
+        const isInternalElement = has$1(element, internalElementAttr);
+        const bogus = get$9(element, 'data-mce-bogus');
+        if (!isInternalElement && isString(bogus)) {
+          if (bogus === 'all') {
+            remove$5(element);
+          } else {
+            unwrap(element);
+          }
+          return;
+        }
+        const rule = schema.getElementRule(tagName.toLowerCase());
+        if (validate && !rule) {
+          unwrap(element);
+          return;
+        } else {
+          evt.allowedTags[tagName] = true;
+        }
+        if (validate && !isInternalElement) {
+          each$g((_a = rule.attributesForced) !== null && _a !== void 0 ? _a : [], attr => {
+            set$2(element, attr.name, attr.value === '{$uid}' ? `mce_${ uid++ }` : attr.value);
+          });
+          each$g((_b = rule.attributesDefault) !== null && _b !== void 0 ? _b : [], attr => {
+            if (!has$1(element, attr.name)) {
+              set$2(element, attr.name, attr.value === '{$uid}' ? `mce_${ uid++ }` : attr.value);
+            }
+          });
+          if (rule.attributesRequired && !exists(rule.attributesRequired, attr => has$1(element, attr))) {
+            unwrap(element);
+            return;
+          }
+          if (rule.removeEmptyAttrs && hasNone(element)) {
+            unwrap(element);
+            return;
+          }
+          if (rule.outputName && rule.outputName !== tagName.toLowerCase()) {
+            mutate(element, rule.outputName);
+          }
+        }
+      });
+      purify$1.addHook('uponSanitizeAttribute', (ele, evt) => {
+        const tagName = ele.tagName.toLowerCase();
+        const {attrName, attrValue} = evt;
+        evt.keepAttr = !validate || schema.isValid(tagName, attrName) || startsWith(attrName, 'data-') || startsWith(attrName, 'aria-');
+        if (attrName in filteredUrlAttrs && isInvalidUri(settings, attrValue, tagName)) {
+          evt.keepAttr = false;
+        }
+        if (evt.keepAttr) {
+          evt.allowedAttributes[attrName] = true;
+          if (attrName in schema.getBoolAttrs()) {
+            evt.attrValue = attrName;
+          }
+          if (settings.allow_svg_data_urls && startsWith(attrValue, 'data:image/svg+xml')) {
+            evt.forceKeepAttr = true;
+          }
+        } else if (ele.hasAttribute(internalElementAttr) && (attrName === 'id' || attrName === 'class' || attrName === 'style')) {
+          evt.forceKeepAttr = true;
+        }
+      });
+      return purify$1;
+    };
+    const transferChildren = (parent, nativeParent, specialElements) => {
+      const parentName = parent.name;
+      const isSpecial = parentName in specialElements && parentName !== 'title' && parentName !== 'textarea';
+      const childNodes = nativeParent.childNodes;
+      for (let ni = 0, nl = childNodes.length; ni < nl; ni++) {
+        const nativeChild = childNodes[ni];
+        const child = new AstNode(nativeChild.nodeName.toLowerCase(), nativeChild.nodeType);
+        if (isElement$6(nativeChild)) {
+          const attributes = nativeChild.attributes;
+          for (let ai = 0, al = attributes.length; ai < al; ai++) {
+            const attr = attributes[ai];
+            child.attr(attr.name, attr.value);
+          }
+        } else if (isText$8(nativeChild)) {
+          child.value = nativeChild.data;
+          if (isSpecial) {
+            child.raw = true;
+          }
+        } else if (isComment(nativeChild) || isCData(nativeChild) || isPi(nativeChild)) {
+          child.value = nativeChild.data;
+        }
+        transferChildren(child, nativeChild, specialElements);
+        parent.append(child);
+      }
+    };
+    const walkTree = (root, preprocessors, postprocessors) => {
+      const traverseOrder = [];
+      for (let node = root, lastNode = node; isNonNullable(node); lastNode = node, node = node.walk()) {
+        each$g(preprocessors, preprocess => preprocess(node));
+        if (isNullable(node.parent) && node !== root) {
+          node = lastNode;
+        } else {
+          traverseOrder.push(node);
+        }
+      }
+      for (let i = traverseOrder.length - 1; i >= 0; i--) {
+        const node = traverseOrder[i];
+        each$g(postprocessors, postprocess => postprocess(node));
+      }
+    };
+    const whitespaceCleaner = (root, schema, settings, args) => {
+      const validate = settings.validate;
+      const nonEmptyElements = schema.getNonEmptyElements();
+      const whitespaceElements = schema.getWhitespaceElements();
+      const blockElements = extend$1(makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements());
+      const textRootBlockElements = getTextRootBlockElements(schema);
+      const allWhiteSpaceRegExp = /[ \t\r\n]+/g;
+      const startWhiteSpaceRegExp = /^[ \t\r\n]+/;
+      const endWhiteSpaceRegExp = /[ \t\r\n]+$/;
+      const hasWhitespaceParent = node => {
+        node = node.parent;
+        while (isNonNullable(node)) {
+          if (node.name in whitespaceElements) {
+            return true;
+          } else {
+            node = node.parent;
+          }
+        }
+        return false;
+      };
+      const isTextRootBlockEmpty = node => {
+        let tempNode = node;
+        while (isNonNullable(tempNode)) {
+          if (tempNode.name in textRootBlockElements) {
+            return isEmpty(schema, nonEmptyElements, whitespaceElements, tempNode);
+          } else {
+            tempNode = tempNode.parent;
+          }
+        }
+        return false;
+      };
+      const isAtEdgeOfBlock = (node, start) => {
+        const neighbour = start ? node.prev : node.next;
+        if (isNonNullable(neighbour)) {
+          return false;
+        }
+        return node.parent.name in blockElements && (node.parent !== root || args.isRootContent);
+      };
+      const preprocess = node => {
+        if (node.type === 3) {
+          if (!hasWhitespaceParent(node)) {
+            let text = node.value;
+            text = text.replace(allWhiteSpaceRegExp, ' ');
+            if (isLineBreakNode(node.prev, blockElements) || isAtEdgeOfBlock(node, true)) {
+              text = text.replace(startWhiteSpaceRegExp, '');
+            }
+            if (text.length === 0) {
+              node.remove();
+            } else {
+              node.value = text;
+            }
+          }
+        }
+      };
+      const postprocess = node => {
+        var _a;
+        if (node.type === 1) {
+          const elementRule = schema.getElementRule(node.name);
+          if (validate && elementRule) {
+            const isNodeEmpty = isEmpty(schema, nonEmptyElements, whitespaceElements, node);
+            if (elementRule.paddInEmptyBlock && isNodeEmpty && isTextRootBlockEmpty(node)) {
+              paddEmptyNode(settings, args, blockElements, node);
+            } else if (elementRule.removeEmpty && isNodeEmpty) {
+              if (blockElements[node.name]) {
+                node.remove();
+              } else {
+                node.unwrap();
+              }
+            } else if (elementRule.paddEmpty && (isNodeEmpty || isPaddedWithNbsp(node))) {
+              paddEmptyNode(settings, args, blockElements, node);
+            }
+          }
+        } else if (node.type === 3) {
+          if (!hasWhitespaceParent(node)) {
+            let text = node.value;
+            if (blockElements[(_a = node.next) === null || _a === void 0 ? void 0 : _a.name] || isAtEdgeOfBlock(node, false)) {
+              text = text.replace(endWhiteSpaceRegExp, '');
+            }
+            if (text.length === 0) {
+              node.remove();
+            } else {
+              node.value = text;
+            }
+          }
+        }
+      };
+      return [
+        preprocess,
+        postprocess
+      ];
+    };
+    const getRootBlockName = (settings, args) => {
+      var _a;
+      const name = (_a = args.forced_root_block) !== null && _a !== void 0 ? _a : settings.forced_root_block;
+      if (name === false) {
+        return '';
+      } else if (name === true) {
+        return 'p';
+      } else {
+        return name;
+      }
+    };
+    const DomParser = (settings = {}, schema = Schema()) => {
+      const nodeFilters = {};
+      const attributeFilters = [];
+      const defaultedSettings = {
+        validate: true,
+        root_name: 'body',
+        ...settings
+      };
+      const parser = new DOMParser();
+      const purify = setupPurify(defaultedSettings, schema);
+      const parseAndSanitizeWithContext = (html, rootName, format = 'html') => {
+        const mimeType = format === 'xhtml' ? 'application/xhtml+xml' : 'text/html';
+        const isSpecialRoot = has$2(schema.getSpecialElements(), rootName.toLowerCase());
+        const content = isSpecialRoot ? `<${ rootName }>${ html }</${ rootName }>` : html;
+        const wrappedHtml = format === 'xhtml' ? `<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>${ content }</body></html>` : `<body>${ content }</body>`;
+        const body = parser.parseFromString(wrappedHtml, mimeType).body;
+        purify.sanitize(body, getPurifyConfig(defaultedSettings, mimeType));
+        purify.removed = [];
+        return isSpecialRoot ? body.firstChild : body;
+      };
+      const addNodeFilter = (name, callback) => {
+        each$4(explode$1(name), name => {
+          let list = nodeFilters[name];
+          if (!list) {
+            nodeFilters[name] = list = [];
+          }
+          list.push(callback);
+        });
+      };
+      const getNodeFilters = () => {
+        const out = [];
+        for (const name in nodeFilters) {
+          if (has$2(nodeFilters, name)) {
+            out.push({
+              name,
+              callbacks: nodeFilters[name]
+            });
+          }
+        }
+        return out;
+      };
+      const addAttributeFilter = (name, callback) => {
+        each$4(explode$1(name), name => {
+          let i;
+          for (i = 0; i < attributeFilters.length; i++) {
+            if (attributeFilters[i].name === name) {
+              attributeFilters[i].callbacks.push(callback);
+              return;
+            }
+          }
+          attributeFilters.push({
+            name,
+            callbacks: [callback]
+          });
+        });
+      };
+      const getAttributeFilters = () => [].concat(attributeFilters);
+      const findInvalidChildren = (node, invalidChildren) => {
+        const parent = node.parent;
+        if (parent && schema.children[node.name] && !schema.isValidChild(parent.name, node.name)) {
+          invalidChildren.push(node);
+        }
+      };
+      const addRootBlocks = (rootNode, rootBlockName) => {
+        const blockElements = extend$1(makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements());
+        const startWhiteSpaceRegExp = /^[ \t\r\n]+/;
+        const endWhiteSpaceRegExp = /[ \t\r\n]+$/;
+        let node = rootNode.firstChild, rootBlockNode = null;
+        const trim = rootBlock => {
+          if (rootBlock) {
+            node = rootBlock.firstChild;
+            if (node && node.type === 3) {
+              node.value = node.value.replace(startWhiteSpaceRegExp, '');
+            }
+            node = rootBlock.lastChild;
+            if (node && node.type === 3) {
+              node.value = node.value.replace(endWhiteSpaceRegExp, '');
+            }
+          }
+        };
+        if (!schema.isValidChild(rootNode.name, rootBlockName.toLowerCase())) {
+          return;
+        }
+        while (node) {
+          const next = node.next;
+          if (node.type === 3 || node.type === 1 && node.name !== 'p' && !blockElements[node.name] && !node.attr(internalElementAttr)) {
+            if (!rootBlockNode) {
+              rootBlockNode = new AstNode(rootBlockName, 1);
+              rootBlockNode.attr(defaultedSettings.forced_root_block_attrs);
+              rootNode.insert(rootBlockNode, node);
+              rootBlockNode.append(node);
+            } else {
+              rootBlockNode.append(node);
+            }
+          } else {
+            trim(rootBlockNode);
+            rootBlockNode = null;
+          }
+          node = next;
+        }
+        trim(rootBlockNode);
+      };
+      const parse = (html, args = {}) => {
+        var _a;
+        const validate = defaultedSettings.validate;
+        const rootName = (_a = args.context) !== null && _a !== void 0 ? _a : defaultedSettings.root_name;
+        const element = parseAndSanitizeWithContext(html, rootName, args.format);
+        const rootNode = new AstNode(rootName, 11);
+        transferChildren(rootNode, element, schema.getSpecialElements());
+        const [whitespacePre, whitespacePost] = whitespaceCleaner(rootNode, schema, defaultedSettings, args);
+        const invalidChildren = [];
+        const invalidFinder = validate ? node => findInvalidChildren(node, invalidChildren) : noop;
+        const nodeFilters = getNodeFilters();
+        const matches = {
+          nodes: {},
+          attributes: {}
+        };
+        const matchFinder = node => matchNode$1(nodeFilters, attributeFilters, node, matches);
+        walkTree(rootNode, [
+          whitespacePre,
+          matchFinder
+        ], [
+          whitespacePost,
+          invalidFinder
+        ]);
+        invalidChildren.reverse();
+        if (validate && invalidChildren.length > 0) {
+          if (args.context) {
+            const {
+              pass: topLevelChildren,
+              fail: otherChildren
+            } = partition$2(invalidChildren, child => child.parent === rootNode);
+            cleanInvalidNodes(otherChildren, schema, matchFinder);
+            args.invalid = topLevelChildren.length > 0;
+          } else {
+            cleanInvalidNodes(invalidChildren, schema, matchFinder);
+          }
+        }
+        const rootBlockName = getRootBlockName(defaultedSettings, args);
+        if (rootBlockName && (rootNode.name === 'body' || args.isRootContent)) {
+          addRootBlocks(rootNode, rootBlockName);
+        }
+        if (!args.invalid) {
+          runFilters(matches, args);
+        }
+        return rootNode;
+      };
+      const exports = {
+        schema,
+        addAttributeFilter,
+        getAttributeFilters,
+        addNodeFilter,
+        getNodeFilters,
+        parse
+      };
+      register$4(exports, defaultedSettings);
+      register$5(exports, defaultedSettings, schema);
+      return exports;
+    };
+
+    const serializeContent = content => isTreeNode(content) ? HtmlSerializer({ validate: false }).serialize(content) : content;
+    const withSerializedContent = (content, fireEvent) => {
+      const serializedContent = serializeContent(content);
+      const eventArgs = fireEvent(serializedContent);
+      if (eventArgs.isDefaultPrevented()) {
+        return eventArgs;
+      } else if (isTreeNode(content)) {
+        if (eventArgs.content !== serializedContent) {
+          const rootNode = DomParser({
+            validate: false,
+            forced_root_block: false
+          }).parse(eventArgs.content, { context: content.name });
+          return {
+            ...eventArgs,
+            content: rootNode
+          };
+        } else {
+          return {
+            ...eventArgs,
+            content
+          };
+        }
+      } else {
+        return eventArgs;
+      }
+    };
+    const preProcessGetContent = (editor, args) => {
+      if (args.no_events) {
+        return Result.value(args);
+      } else {
+        const eventArgs = fireBeforeGetContent(editor, args);
+        if (eventArgs.isDefaultPrevented()) {
+          return Result.error(fireGetContent(editor, {
+            content: '',
+            ...eventArgs
+          }).content);
+        } else {
+          return Result.value(eventArgs);
+        }
+      }
+    };
+    const postProcessGetContent = (editor, content, args) => {
+      if (args.no_events) {
+        return content;
+      } else {
+        const processedEventArgs = withSerializedContent(content, c => fireGetContent(editor, {
+          ...args,
+          content: c
+        }));
+        return processedEventArgs.content;
+      }
+    };
+    const preProcessSetContent = (editor, args) => {
+      if (args.no_events) {
+        return Result.value(args);
+      } else {
+        const processedEventArgs = withSerializedContent(args.content, content => fireBeforeSetContent(editor, {
+          ...args,
+          content
+        }));
+        if (processedEventArgs.isDefaultPrevented()) {
+          fireSetContent(editor, processedEventArgs);
+          return Result.error(undefined);
+        } else {
+          return Result.value(processedEventArgs);
+        }
+      }
+    };
+    const postProcessSetContent = (editor, content, args) => {
+      if (!args.no_events) {
+        fireSetContent(editor, {
+          ...args,
+          content
+        });
+      }
+    };
+
+    const tableModel = (element, width, rows) => ({
+      element,
+      width,
+      rows
+    });
+    const tableRow = (element, cells) => ({
+      element,
+      cells
+    });
+    const cellPosition = (x, y) => ({
+      x,
+      y
+    });
+    const getSpan = (td, key) => {
+      const value = parseInt(get$9(td, key), 10);
+      return isNaN(value) ? 1 : value;
+    };
+    const fillout = (table, x, y, tr, td) => {
+      const rowspan = getSpan(td, 'rowspan');
+      const colspan = getSpan(td, 'colspan');
+      const rows = table.rows;
+      for (let y2 = y; y2 < y + rowspan; y2++) {
+        if (!rows[y2]) {
+          rows[y2] = tableRow(deep$1(tr), []);
+        }
+        for (let x2 = x; x2 < x + colspan; x2++) {
+          const cells = rows[y2].cells;
+          cells[x2] = y2 === y && x2 === x ? td : shallow$1(td);
+        }
+      }
+    };
+    const cellExists = (table, x, y) => {
+      const rows = table.rows;
+      const cells = rows[y] ? rows[y].cells : [];
+      return !!cells[x];
+    };
+    const skipCellsX = (table, x, y) => {
+      while (cellExists(table, x, y)) {
+        x++;
+      }
+      return x;
+    };
+    const getWidth = rows => {
+      return foldl(rows, (acc, row) => {
+        return row.cells.length > acc ? row.cells.length : acc;
+      }, 0);
+    };
+    const findElementPos = (table, element) => {
+      const rows = table.rows;
+      for (let y = 0; y < rows.length; y++) {
+        const cells = rows[y].cells;
+        for (let x = 0; x < cells.length; x++) {
+          if (eq(cells[x], element)) {
+            return Optional.some(cellPosition(x, y));
+          }
+        }
+      }
+      return Optional.none();
+    };
+    const extractRows = (table, sx, sy, ex, ey) => {
+      const newRows = [];
+      const rows = table.rows;
+      for (let y = sy; y <= ey; y++) {
+        const cells = rows[y].cells;
+        const slice = sx < ex ? cells.slice(sx, ex + 1) : cells.slice(ex, sx + 1);
+        newRows.push(tableRow(rows[y].element, slice));
+      }
+      return newRows;
+    };
+    const subTable = (table, startPos, endPos) => {
+      const sx = startPos.x, sy = startPos.y;
+      const ex = endPos.x, ey = endPos.y;
+      const newRows = sy < ey ? extractRows(table, sx, sy, ex, ey) : extractRows(table, sx, ey, ex, sy);
+      return tableModel(table.element, getWidth(newRows), newRows);
+    };
+    const createDomTable = (table, rows) => {
+      const tableElement = shallow$1(table.element);
+      const tableBody = SugarElement.fromTag('tbody');
+      append(tableBody, rows);
+      append$1(tableElement, tableBody);
+      return tableElement;
+    };
+    const modelRowsToDomRows = table => {
+      return map$3(table.rows, row => {
+        const cells = map$3(row.cells, cell => {
+          const td = deep$1(cell);
+          remove$a(td, 'colspan');
+          remove$a(td, 'rowspan');
+          return td;
+        });
+        const tr = shallow$1(row.element);
+        append(tr, cells);
+        return tr;
+      });
+    };
+    const fromDom = tableElm => {
+      const table = tableModel(shallow$1(tableElm), 0, []);
+      each$g(descendants(tableElm, 'tr'), (tr, y) => {
+        each$g(descendants(tr, 'td,th'), (td, x) => {
+          fillout(table, skipCellsX(table, x, y), y, tr, td);
+        });
+      });
+      return tableModel(table.element, getWidth(table.rows), table.rows);
+    };
+    const toDom = table => {
+      return createDomTable(table, modelRowsToDomRows(table));
+    };
+    const subsection = (table, startElement, endElement) => {
+      return findElementPos(table, startElement).bind(startPos => {
+        return findElementPos(table, endElement).map(endPos => {
+          return subTable(table, startPos, endPos);
+        });
+      });
+    };
+
+    const findParentListContainer = parents => find$2(parents, elm => name(elm) === 'ul' || name(elm) === 'ol');
+    const getFullySelectedListWrappers = (parents, rng) => find$2(parents, elm => name(elm) === 'li' && hasAllContentsSelected(elm, rng)).fold(constant([]), _li => findParentListContainer(parents).map(listCont => {
+      const listElm = SugarElement.fromTag(name(listCont));
+      const listStyles = filter$5(getAllRaw(listCont), (_style, name) => startsWith(name, 'list-style'));
+      setAll(listElm, listStyles);
+      return [
+        SugarElement.fromTag('li'),
+        listElm
+      ];
+    }).getOr([]));
+    const wrap = (innerElm, elms) => {
+      const wrapped = foldl(elms, (acc, elm) => {
+        append$1(elm, acc);
+        return elm;
+      }, innerElm);
+      return elms.length > 0 ? fromElements([wrapped]) : wrapped;
+    };
+    const directListWrappers = commonAnchorContainer => {
+      if (isListItem(commonAnchorContainer)) {
+        return parent(commonAnchorContainer).filter(isList).fold(constant([]), listElm => [
+          commonAnchorContainer,
+          listElm
+        ]);
+      } else {
+        return isList(commonAnchorContainer) ? [commonAnchorContainer] : [];
+      }
+    };
+    const getWrapElements = (rootNode, rng) => {
+      const commonAnchorContainer = SugarElement.fromDom(rng.commonAncestorContainer);
+      const parents = parentsAndSelf(commonAnchorContainer, rootNode);
+      const wrapElements = filter$6(parents, elm => isInline$1(elm) || isHeading(elm));
+      const listWrappers = getFullySelectedListWrappers(parents, rng);
+      const allWrappers = wrapElements.concat(listWrappers.length ? listWrappers : directListWrappers(commonAnchorContainer));
+      return map$3(allWrappers, shallow$1);
+    };
+    const emptyFragment = () => fromElements([]);
+    const getFragmentFromRange = (rootNode, rng) => wrap(SugarElement.fromDom(rng.cloneContents()), getWrapElements(rootNode, rng));
+    const getParentTable = (rootElm, cell) => ancestor$2(cell, 'table', curry(eq, rootElm));
+    const getTableFragment = (rootNode, selectedTableCells) => getParentTable(rootNode, selectedTableCells[0]).bind(tableElm => {
+      const firstCell = selectedTableCells[0];
+      const lastCell = selectedTableCells[selectedTableCells.length - 1];
+      const fullTableModel = fromDom(tableElm);
+      return subsection(fullTableModel, firstCell, lastCell).map(sectionedTableModel => fromElements([toDom(sectionedTableModel)]));
+    }).getOrThunk(emptyFragment);
+    const getSelectionFragment = (rootNode, ranges) => ranges.length > 0 && ranges[0].collapsed ? emptyFragment() : getFragmentFromRange(rootNode, ranges[0]);
+    const read$3 = (rootNode, ranges) => {
+      const selectedCells = getCellsFromElementOrRanges(ranges, rootNode);
+      return selectedCells.length > 0 ? getTableFragment(rootNode, selectedCells) : getSelectionFragment(rootNode, ranges);
+    };
+
+    const isCollapsibleWhitespace = (text, index) => index >= 0 && index < text.length && isWhiteSpace(text.charAt(index));
+    const getInnerText = bin => {
+      return trim$1(bin.innerText);
+    };
+    const getContextNodeName = parentBlockOpt => parentBlockOpt.map(block => block.nodeName).getOr('div').toLowerCase();
+    const getTextContent = editor => Optional.from(editor.selection.getRng()).map(rng => {
+      const parentBlockOpt = Optional.from(editor.dom.getParent(rng.commonAncestorContainer, editor.dom.isBlock));
+      const body = editor.getBody();
+      const contextNodeName = getContextNodeName(parentBlockOpt);
+      const bin = editor.dom.add(body, contextNodeName, {
+        'data-mce-bogus': 'all',
+        'style': 'overflow: hidden; opacity: 0;'
+      }, rng.cloneContents());
+      const text = getInnerText(bin);
+      const nonRenderedText = trim$1(bin.textContent);
+      editor.dom.remove(bin);
+      if (isCollapsibleWhitespace(nonRenderedText, 0) || isCollapsibleWhitespace(nonRenderedText, nonRenderedText.length - 1)) {
+        const parentBlock = parentBlockOpt.getOr(body);
+        const parentBlockText = getInnerText(parentBlock);
+        const textIndex = parentBlockText.indexOf(text);
+        if (textIndex === -1) {
+          return text;
+        } else {
+          const hasProceedingSpace = isCollapsibleWhitespace(parentBlockText, textIndex - 1);
+          const hasTrailingSpace = isCollapsibleWhitespace(parentBlockText, textIndex + text.length);
+          return (hasProceedingSpace ? ' ' : '') + text + (hasTrailingSpace ? ' ' : '');
+        }
+      } else {
+        return text;
+      }
+    }).getOr('');
+    const getSerializedContent = (editor, args) => {
+      const rng = editor.selection.getRng(), tmpElm = editor.dom.create('body');
+      const sel = editor.selection.getSel();
+      const ranges = processRanges(editor, getRanges$1(sel));
+      const fragment = args.contextual ? read$3(SugarElement.fromDom(editor.getBody()), ranges).dom : rng.cloneContents();
+      if (fragment) {
+        tmpElm.appendChild(fragment);
+      }
+      return editor.selection.serializer.serialize(tmpElm, args);
+    };
+    const extractSelectedContent = (editor, args) => {
+      if (args.format === 'text') {
+        return getTextContent(editor);
+      } else {
+        const content = getSerializedContent(editor, args);
+        if (args.format === 'tree') {
+          return content;
+        } else {
+          return editor.selection.isCollapsed() ? '' : content;
+        }
+      }
+    };
+    const setupArgs$3 = (args, format) => ({
+      ...args,
+      format,
+      get: true,
+      selection: true,
+      getInner: true
+    });
+    const getSelectedContentInternal = (editor, format, args = {}) => {
+      const defaultedArgs = setupArgs$3(args, format);
+      return preProcessGetContent(editor, defaultedArgs).fold(identity, updatedArgs => {
+        const content = extractSelectedContent(editor, updatedArgs);
+        return postProcessGetContent(editor, content, updatedArgs);
+      });
+    };
+
+    const KEEP = 0, INSERT = 1, DELETE = 2;
+    const diff = (left, right) => {
+      const size = left.length + right.length + 2;
+      const vDown = new Array(size);
+      const vUp = new Array(size);
+      const snake = (start, end, diag) => {
+        return {
+          start,
+          end,
+          diag
+        };
+      };
+      const buildScript = (start1, end1, start2, end2, script) => {
+        const middle = getMiddleSnake(start1, end1, start2, end2);
+        if (middle === null || middle.start === end1 && middle.diag === end1 - end2 || middle.end === start1 && middle.diag === start1 - start2) {
+          let i = start1;
+          let j = start2;
+          while (i < end1 || j < end2) {
+            if (i < end1 && j < end2 && left[i] === right[j]) {
+              script.push([
+                KEEP,
+                left[i]
+              ]);
+              ++i;
+              ++j;
+            } else {
+              if (end1 - start1 > end2 - start2) {
+                script.push([
+                  DELETE,
+                  left[i]
+                ]);
+                ++i;
+              } else {
+                script.push([
+                  INSERT,
+                  right[j]
+                ]);
+                ++j;
+              }
+            }
+          }
+        } else {
+          buildScript(start1, middle.start, start2, middle.start - middle.diag, script);
+          for (let i2 = middle.start; i2 < middle.end; ++i2) {
+            script.push([
+              KEEP,
+              left[i2]
+            ]);
+          }
+          buildScript(middle.end, end1, middle.end - middle.diag, end2, script);
+        }
+      };
+      const buildSnake = (start, diag, end1, end2) => {
+        let end = start;
+        while (end - diag < end2 && end < end1 && left[end] === right[end - diag]) {
+          ++end;
+        }
+        return snake(start, end, diag);
+      };
+      const getMiddleSnake = (start1, end1, start2, end2) => {
+        const m = end1 - start1;
+        const n = end2 - start2;
+        if (m === 0 || n === 0) {
+          return null;
+        }
+        const delta = m - n;
+        const sum = n + m;
+        const offset = (sum % 2 === 0 ? sum : sum + 1) / 2;
+        vDown[1 + offset] = start1;
+        vUp[1 + offset] = end1 + 1;
+        let d, k, i, x, y;
+        for (d = 0; d <= offset; ++d) {
+          for (k = -d; k <= d; k += 2) {
+            i = k + offset;
+            if (k === -d || k !== d && vDown[i - 1] < vDown[i + 1]) {
+              vDown[i] = vDown[i + 1];
+            } else {
+              vDown[i] = vDown[i - 1] + 1;
+            }
+            x = vDown[i];
+            y = x - start1 + start2 - k;
+            while (x < end1 && y < end2 && left[x] === right[y]) {
+              vDown[i] = ++x;
+              ++y;
+            }
+            if (delta % 2 !== 0 && delta - d <= k && k <= delta + d) {
+              if (vUp[i - delta] <= vDown[i]) {
+                return buildSnake(vUp[i - delta], k + start1 - start2, end1, end2);
+              }
+            }
+          }
+          for (k = delta - d; k <= delta + d; k += 2) {
+            i = k + offset - delta;
+            if (k === delta - d || k !== delta + d && vUp[i + 1] <= vUp[i - 1]) {
+              vUp[i] = vUp[i + 1] - 1;
+            } else {
+              vUp[i] = vUp[i - 1];
+            }
+            x = vUp[i] - 1;
+            y = x - start1 + start2 - k;
+            while (x >= start1 && y >= start2 && left[x] === right[y]) {
+              vUp[i] = x--;
+              y--;
+            }
+            if (delta % 2 === 0 && -d <= k && k <= d) {
+              if (vUp[i] <= vDown[i + delta]) {
+                return buildSnake(vUp[i], k + start1 - start2, end1, end2);
+              }
+            }
+          }
+        }
+      };
+      const script = [];
+      buildScript(0, left.length, 0, right.length, script);
+      return script;
+    };
+
+    const getOuterHtml = elm => {
+      if (isElement$6(elm)) {
+        return elm.outerHTML;
+      } else if (isText$8(elm)) {
+        return Entities.encodeRaw(elm.data, false);
+      } else if (isComment(elm)) {
+        return '<!--' + elm.data + '-->';
+      }
+      return '';
+    };
+    const createFragment = html => {
+      let node;
+      const container = document.createElement('div');
+      const frag = document.createDocumentFragment();
+      if (html) {
+        container.innerHTML = html;
+      }
+      while (node = container.firstChild) {
+        frag.appendChild(node);
+      }
+      return frag;
+    };
+    const insertAt = (elm, html, index) => {
+      const fragment = createFragment(html);
+      if (elm.hasChildNodes() && index < elm.childNodes.length) {
+        const target = elm.childNodes[index];
+        target.parentNode.insertBefore(fragment, target);
+      } else {
+        elm.appendChild(fragment);
+      }
+    };
+    const removeAt = (elm, index) => {
+      if (elm.hasChildNodes() && index < elm.childNodes.length) {
+        const target = elm.childNodes[index];
+        target.parentNode.removeChild(target);
+      }
+    };
+    const applyDiff = (diff, elm) => {
+      let index = 0;
+      each$g(diff, action => {
+        if (action[0] === KEEP) {
+          index++;
+        } else if (action[0] === INSERT) {
+          insertAt(elm, action[1], index);
+          index++;
+        } else if (action[0] === DELETE) {
+          removeAt(elm, index);
+        }
+      });
+    };
+    const read$2 = elm => {
+      return filter$6(map$3(from(elm.childNodes), getOuterHtml), item => {
+        return item.length > 0;
+      });
+    };
+    const write = (fragments, elm) => {
+      const currentFragments = map$3(from(elm.childNodes), getOuterHtml);
+      applyDiff(diff(currentFragments, fragments), elm);
+      return elm;
+    };
+
+    const lazyTempDocument = cached(() => document.implementation.createHTMLDocument('undo'));
+    const hasIframes = html => {
+      return html.indexOf('</iframe>') !== -1;
+    };
+    const createFragmentedLevel = fragments => {
+      return {
+        type: 'fragmented',
+        fragments,
+        content: '',
+        bookmark: null,
+        beforeBookmark: null
+      };
+    };
+    const createCompleteLevel = content => {
+      return {
+        type: 'complete',
+        fragments: null,
+        content,
+        bookmark: null,
+        beforeBookmark: null
+      };
+    };
+    const createFromEditor = editor => {
+      const fragments = read$2(editor.getBody());
+      const trimmedFragments = bind$3(fragments, html => {
+        const trimmed = trimInternal(editor.serializer, html);
+        return trimmed.length > 0 ? [trimmed] : [];
+      });
+      const content = trimmedFragments.join('');
+      return hasIframes(content) ? createFragmentedLevel(trimmedFragments) : createCompleteLevel(content);
+    };
+    const applyToEditor = (editor, level, before) => {
+      const bookmark = before ? level.beforeBookmark : level.bookmark;
+      if (level.type === 'fragmented') {
+        write(level.fragments, editor.getBody());
+      } else {
+        editor.setContent(level.content, {
+          format: 'raw',
+          no_selection: isNonNullable(bookmark) && isPathBookmark(bookmark) ? !bookmark.isFakeCaret : true
+        });
+      }
+      editor.selection.moveToBookmark(bookmark);
+    };
+    const getLevelContent = level => {
+      return level.type === 'fragmented' ? level.fragments.join('') : level.content;
+    };
+    const getCleanLevelContent = level => {
+      const elm = SugarElement.fromTag('body', lazyTempDocument());
+      set(elm, getLevelContent(level));
+      each$g(descendants(elm, '*[data-mce-bogus]'), unwrap);
+      return get$6(elm);
+    };
+    const hasEqualContent = (level1, level2) => getLevelContent(level1) === getLevelContent(level2);
+    const hasEqualCleanedContent = (level1, level2) => getCleanLevelContent(level1) === getCleanLevelContent(level2);
+    const isEq$1 = (level1, level2) => {
+      if (!level1 || !level2) {
+        return false;
+      } else if (hasEqualContent(level1, level2)) {
+        return true;
+      } else {
+        return hasEqualCleanedContent(level1, level2);
+      }
+    };
+
+    const isUnlocked = locks => locks.get() === 0;
+
+    const setTyping = (undoManager, typing, locks) => {
+      if (isUnlocked(locks)) {
+        undoManager.typing = typing;
+      }
+    };
+    const endTyping = (undoManager, locks) => {
+      if (undoManager.typing) {
+        setTyping(undoManager, false, locks);
+        undoManager.add();
+      }
+    };
+    const endTypingLevelIgnoreLocks = undoManager => {
+      if (undoManager.typing) {
+        undoManager.typing = false;
+        undoManager.add();
+      }
+    };
+
+    const beforeChange$1 = (editor, locks, beforeBookmark) => {
+      if (isUnlocked(locks)) {
+        beforeBookmark.set(getUndoBookmark(editor.selection));
+      }
+    };
+    const addUndoLevel$1 = (editor, undoManager, index, locks, beforeBookmark, level, event) => {
+      const currentLevel = createFromEditor(editor);
+      level = level || {};
+      level = Tools.extend(level, currentLevel);
+      if (isUnlocked(locks) === false || editor.removed) {
+        return null;
+      }
+      const lastLevel = undoManager.data[index.get()];
+      if (editor.dispatch('BeforeAddUndo', {
+          level,
+          lastLevel,
+          originalEvent: event
+        }).isDefaultPrevented()) {
+        return null;
+      }
+      if (lastLevel && isEq$1(lastLevel, level)) {
+        return null;
+      }
+      if (undoManager.data[index.get()]) {
+        beforeBookmark.get().each(bm => {
+          undoManager.data[index.get()].beforeBookmark = bm;
+        });
+      }
+      const customUndoRedoLevels = getCustomUndoRedoLevels(editor);
+      if (customUndoRedoLevels) {
+        if (undoManager.data.length > customUndoRedoLevels) {
+          for (let i = 0; i < undoManager.data.length - 1; i++) {
+            undoManager.data[i] = undoManager.data[i + 1];
+          }
+          undoManager.data.length--;
+          index.set(undoManager.data.length);
+        }
+      }
+      level.bookmark = getUndoBookmark(editor.selection);
+      if (index.get() < undoManager.data.length - 1) {
+        undoManager.data.length = index.get() + 1;
+      }
+      undoManager.data.push(level);
+      index.set(undoManager.data.length - 1);
+      const args = {
+        level,
+        lastLevel,
+        originalEvent: event
+      };
+      if (index.get() > 0) {
+        editor.setDirty(true);
+        editor.dispatch('AddUndo', args);
+        editor.dispatch('change', args);
+      } else {
+        editor.dispatch('AddUndo', args);
+      }
+      return level;
+    };
+    const clear$1 = (editor, undoManager, index) => {
+      undoManager.data = [];
+      index.set(0);
+      undoManager.typing = false;
+      editor.dispatch('ClearUndos');
+    };
+    const extra$1 = (editor, undoManager, index, callback1, callback2) => {
+      if (undoManager.transact(callback1)) {
+        const bookmark = undoManager.data[index.get()].bookmark;
+        const lastLevel = undoManager.data[index.get() - 1];
+        applyToEditor(editor, lastLevel, true);
+        if (undoManager.transact(callback2)) {
+          undoManager.data[index.get() - 1].beforeBookmark = bookmark;
+        }
+      }
+    };
+    const redo$1 = (editor, index, data) => {
+      let level;
+      if (index.get() < data.length - 1) {
+        index.set(index.get() + 1);
+        level = data[index.get()];
+        applyToEditor(editor, level, false);
+        editor.setDirty(true);
+        editor.dispatch('Redo', { level });
+      }
+      return level;
+    };
+    const undo$1 = (editor, undoManager, locks, index) => {
+      let level;
+      if (undoManager.typing) {
+        undoManager.add();
+        undoManager.typing = false;
+        setTyping(undoManager, false, locks);
+      }
+      if (index.get() > 0) {
+        index.set(index.get() - 1);
+        level = undoManager.data[index.get()];
+        applyToEditor(editor, level, true);
+        editor.setDirty(true);
+        editor.dispatch('Undo', { level });
+      }
+      return level;
+    };
+    const reset$1 = undoManager => {
+      undoManager.clear();
+      undoManager.add();
+    };
+    const hasUndo$1 = (editor, undoManager, index) => index.get() > 0 || undoManager.typing && undoManager.data[0] && !isEq$1(createFromEditor(editor), undoManager.data[0]);
+    const hasRedo$1 = (undoManager, index) => index.get() < undoManager.data.length - 1 && !undoManager.typing;
+    const transact$1 = (undoManager, locks, callback) => {
+      endTyping(undoManager, locks);
+      undoManager.beforeChange();
+      undoManager.ignore(callback);
+      return undoManager.add();
+    };
+    const ignore$1 = (locks, callback) => {
+      try {
+        locks.set(locks.get() + 1);
+        callback();
+      } finally {
+        locks.set(locks.get() - 1);
+      }
+    };
+
+    const addVisualInternal = (editor, elm) => {
+      const dom = editor.dom;
+      const scope = isNonNullable(elm) ? elm : editor.getBody();
+      if (isUndefined(editor.hasVisual)) {
+        editor.hasVisual = isVisualAidsEnabled(editor);
+      }
+      each$g(dom.select('table,a', scope), matchedElm => {
+        switch (matchedElm.nodeName) {
+        case 'TABLE':
+          const cls = getVisualAidsTableClass(editor);
+          const value = dom.getAttrib(matchedElm, 'border');
+          if ((!value || value === '0') && editor.hasVisual) {
+            dom.addClass(matchedElm, cls);
+          } else {
+            dom.removeClass(matchedElm, cls);
+          }
+          break;
+        case 'A':
+          if (!dom.getAttrib(matchedElm, 'href')) {
+            const value = dom.getAttrib(matchedElm, 'name') || matchedElm.id;
+            const cls = getVisualAidsAnchorClass(editor);
+            if (value && editor.hasVisual) {
+              dom.addClass(matchedElm, cls);
+            } else {
+              dom.removeClass(matchedElm, cls);
+            }
+          }
+          break;
+        }
+      });
+      editor.dispatch('VisualAid', {
+        element: elm,
+        hasVisual: editor.hasVisual
+      });
+    };
+
+    const makePlainAdaptor = editor => ({
+      init: { bindEvents: noop },
+      undoManager: {
+        beforeChange: (locks, beforeBookmark) => beforeChange$1(editor, locks, beforeBookmark),
+        add: (undoManager, index, locks, beforeBookmark, level, event) => addUndoLevel$1(editor, undoManager, index, locks, beforeBookmark, level, event),
+        undo: (undoManager, locks, index) => undo$1(editor, undoManager, locks, index),
+        redo: (index, data) => redo$1(editor, index, data),
+        clear: (undoManager, index) => clear$1(editor, undoManager, index),
+        reset: undoManager => reset$1(undoManager),
+        hasUndo: (undoManager, index) => hasUndo$1(editor, undoManager, index),
+        hasRedo: (undoManager, index) => hasRedo$1(undoManager, index),
+        transact: (undoManager, locks, callback) => transact$1(undoManager, locks, callback),
+        ignore: (locks, callback) => ignore$1(locks, callback),
+        extra: (undoManager, index, callback1, callback2) => extra$1(editor, undoManager, index, callback1, callback2)
+      },
+      formatter: {
+        match: (name, vars, node, similar) => match$2(editor, name, vars, node, similar),
+        matchAll: (names, vars) => matchAll(editor, names, vars),
+        matchNode: (node, name, vars, similar) => matchNode(editor, node, name, vars, similar),
+        canApply: name => canApply(editor, name),
+        closest: names => closest$1(editor, names),
+        apply: (name, vars, node) => applyFormat$1(editor, name, vars, node),
+        remove: (name, vars, node, similar) => remove$2(editor, name, vars, node, similar),
+        toggle: (name, vars, node) => toggle(editor, name, vars, node),
+        formatChanged: (registeredFormatListeners, formats, callback, similar, vars) => formatChangedInternal(editor, registeredFormatListeners, formats, callback, similar, vars)
+      },
+      editor: {
+        getContent: args => getContentInternal(editor, args),
+        setContent: (content, args) => setContentInternal(editor, content, args),
+        insertContent: (value, details) => insertHtmlAtCaret(editor, value, details),
+        addVisual: elm => addVisualInternal(editor, elm)
+      },
+      selection: { getContent: (format, args) => getSelectedContentInternal(editor, format, args) },
+      autocompleter: {
+        addDecoration: range => create$8(editor, range),
+        removeDecoration: () => remove$3(editor, SugarElement.fromDom(editor.getBody()))
+      },
+      raw: { getModel: () => Optional.none() }
+    });
+    const makeRtcAdaptor = rtcEditor => {
+      const defaultVars = vars => isObject(vars) ? vars : {};
+      const {init, undoManager, formatter, editor, selection, autocompleter, raw} = rtcEditor;
+      return {
+        init: { bindEvents: init.bindEvents },
+        undoManager: {
+          beforeChange: undoManager.beforeChange,
+          add: undoManager.add,
+          undo: undoManager.undo,
+          redo: undoManager.redo,
+          clear: undoManager.clear,
+          reset: undoManager.reset,
+          hasUndo: undoManager.hasUndo,
+          hasRedo: undoManager.hasRedo,
+          transact: (_undoManager, _locks, fn) => undoManager.transact(fn),
+          ignore: (_locks, callback) => undoManager.ignore(callback),
+          extra: (_undoManager, _index, callback1, callback2) => undoManager.extra(callback1, callback2)
+        },
+        formatter: {
+          match: (name, vars, _node, similar) => formatter.match(name, defaultVars(vars), similar),
+          matchAll: formatter.matchAll,
+          matchNode: formatter.matchNode,
+          canApply: name => formatter.canApply(name),
+          closest: names => formatter.closest(names),
+          apply: (name, vars, _node) => formatter.apply(name, defaultVars(vars)),
+          remove: (name, vars, _node, _similar) => formatter.remove(name, defaultVars(vars)),
+          toggle: (name, vars, _node) => formatter.toggle(name, defaultVars(vars)),
+          formatChanged: (_rfl, formats, callback, similar, vars) => formatter.formatChanged(formats, callback, similar, vars)
+        },
+        editor: {
+          getContent: args => editor.getContent(args),
+          setContent: (content, args) => {
+            return {
+              content: editor.setContent(content, args),
+              html: ''
+            };
+          },
+          insertContent: (content, _details) => {
+            editor.insertContent(content);
+            return '';
+          },
+          addVisual: editor.addVisual
+        },
+        selection: { getContent: (_format, args) => selection.getContent(args) },
+        autocompleter: {
+          addDecoration: autocompleter.addDecoration,
+          removeDecoration: autocompleter.removeDecoration
+        },
+        raw: { getModel: () => Optional.some(raw.getRawModel()) }
+      };
+    };
+    const makeNoopAdaptor = () => {
+      const nul = constant(null);
+      const empty = constant('');
+      return {
+        init: { bindEvents: noop },
+        undoManager: {
+          beforeChange: noop,
+          add: nul,
+          undo: nul,
+          redo: nul,
+          clear: noop,
+          reset: noop,
+          hasUndo: never,
+          hasRedo: never,
+          transact: nul,
+          ignore: noop,
+          extra: noop
+        },
+        formatter: {
+          match: never,
+          matchAll: constant([]),
+          matchNode: constant(undefined),
+          canApply: never,
+          closest: empty,
+          apply: noop,
+          remove: noop,
+          toggle: noop,
+          formatChanged: constant({ unbind: noop })
+        },
+        editor: {
+          getContent: empty,
+          setContent: constant({
+            content: '',
+            html: ''
+          }),
+          insertContent: constant(''),
+          addVisual: noop
+        },
+        selection: { getContent: empty },
+        autocompleter: {
+          addDecoration: noop,
+          removeDecoration: noop
+        },
+        raw: { getModel: constant(Optional.none()) }
+      };
+    };
+    const isRtc = editor => has$2(editor.plugins, 'rtc');
+    const getRtcSetup = editor => get$a(editor.plugins, 'rtc').bind(rtcPlugin => Optional.from(rtcPlugin.setup));
+    const setup$s = editor => {
+      const editorCast = editor;
+      return getRtcSetup(editor).fold(() => {
+        editorCast.rtcInstance = makePlainAdaptor(editor);
+        return Optional.none();
+      }, setup => {
+        editorCast.rtcInstance = makeNoopAdaptor();
+        return Optional.some(() => setup().then(rtcEditor => {
+          editorCast.rtcInstance = makeRtcAdaptor(rtcEditor);
+          return rtcEditor.rtc.isRemote;
+        }));
+      });
+    };
+    const getRtcInstanceWithFallback = editor => editor.rtcInstance ? editor.rtcInstance : makePlainAdaptor(editor);
+    const getRtcInstanceWithError = editor => {
+      const rtcInstance = editor.rtcInstance;
+      if (!rtcInstance) {
+        throw new Error('Failed to get RTC instance not yet initialized.');
+      } else {
+        return rtcInstance;
+      }
+    };
+    const beforeChange = (editor, locks, beforeBookmark) => {
+      getRtcInstanceWithError(editor).undoManager.beforeChange(locks, beforeBookmark);
+    };
+    const addUndoLevel = (editor, undoManager, index, locks, beforeBookmark, level, event) => getRtcInstanceWithError(editor).undoManager.add(undoManager, index, locks, beforeBookmark, level, event);
+    const undo = (editor, undoManager, locks, index) => getRtcInstanceWithError(editor).undoManager.undo(undoManager, locks, index);
+    const redo = (editor, index, data) => getRtcInstanceWithError(editor).undoManager.redo(index, data);
+    const clear = (editor, undoManager, index) => {
+      getRtcInstanceWithError(editor).undoManager.clear(undoManager, index);
+    };
+    const reset = (editor, undoManager) => {
+      getRtcInstanceWithError(editor).undoManager.reset(undoManager);
+    };
+    const hasUndo = (editor, undoManager, index) => getRtcInstanceWithError(editor).undoManager.hasUndo(undoManager, index);
+    const hasRedo = (editor, undoManager, index) => getRtcInstanceWithError(editor).undoManager.hasRedo(undoManager, index);
+    const transact = (editor, undoManager, locks, callback) => getRtcInstanceWithError(editor).undoManager.transact(undoManager, locks, callback);
+    const ignore = (editor, locks, callback) => {
+      getRtcInstanceWithError(editor).undoManager.ignore(locks, callback);
+    };
+    const extra = (editor, undoManager, index, callback1, callback2) => {
+      getRtcInstanceWithError(editor).undoManager.extra(undoManager, index, callback1, callback2);
+    };
+    const matchFormat = (editor, name, vars, node, similar) => getRtcInstanceWithError(editor).formatter.match(name, vars, node, similar);
+    const matchAllFormats = (editor, names, vars) => getRtcInstanceWithError(editor).formatter.matchAll(names, vars);
+    const matchNodeFormat = (editor, node, name, vars, similar) => getRtcInstanceWithError(editor).formatter.matchNode(node, name, vars, similar);
+    const canApplyFormat = (editor, name) => getRtcInstanceWithError(editor).formatter.canApply(name);
+    const closestFormat = (editor, names) => getRtcInstanceWithError(editor).formatter.closest(names);
+    const applyFormat = (editor, name, vars, node) => {
+      getRtcInstanceWithError(editor).formatter.apply(name, vars, node);
+    };
+    const removeFormat = (editor, name, vars, node, similar) => {
+      getRtcInstanceWithError(editor).formatter.remove(name, vars, node, similar);
+    };
+    const toggleFormat = (editor, name, vars, node) => {
+      getRtcInstanceWithError(editor).formatter.toggle(name, vars, node);
+    };
+    const formatChanged = (editor, registeredFormatListeners, formats, callback, similar, vars) => getRtcInstanceWithError(editor).formatter.formatChanged(registeredFormatListeners, formats, callback, similar, vars);
+    const getContent$2 = (editor, args) => getRtcInstanceWithFallback(editor).editor.getContent(args);
+    const setContent$2 = (editor, content, args) => getRtcInstanceWithFallback(editor).editor.setContent(content, args);
+    const insertContent$1 = (editor, value, details) => getRtcInstanceWithFallback(editor).editor.insertContent(value, details);
+    const getSelectedContent = (editor, format, args) => getRtcInstanceWithError(editor).selection.getContent(format, args);
+    const addVisual$1 = (editor, elm) => getRtcInstanceWithError(editor).editor.addVisual(elm);
+    const bindEvents = editor => getRtcInstanceWithError(editor).init.bindEvents();
+    const addAutocompleterDecoration = (editor, range) => getRtcInstanceWithError(editor).autocompleter.addDecoration(range);
+    const removeAutocompleterDecoration = editor => getRtcInstanceWithError(editor).autocompleter.removeDecoration();
+
+    const getContent$1 = (editor, args = {}) => {
+      const format = args.format ? args.format : 'html';
+      return getSelectedContent(editor, format, args);
+    };
+
+    const removeEmpty = text => {
+      if (text.dom.length === 0) {
+        remove$5(text);
+        return Optional.none();
+      } else {
+        return Optional.some(text);
+      }
+    };
+    const walkPastBookmark = (node, start) => node.filter(elm => BookmarkManager.isBookmarkNode(elm.dom)).bind(start ? nextSibling : prevSibling);
+    const merge$1 = (outer, inner, rng, start) => {
+      const outerElm = outer.dom;
+      const innerElm = inner.dom;
+      const oldLength = start ? outerElm.length : innerElm.length;
+      if (start) {
+        mergeTextNodes(outerElm, innerElm, false, !start);
+        rng.setStart(innerElm, oldLength);
+      } else {
+        mergeTextNodes(innerElm, outerElm, false, !start);
+        rng.setEnd(innerElm, oldLength);
+      }
+    };
+    const normalizeTextIfRequired = (inner, start) => {
+      parent(inner).each(root => {
+        const text = inner.dom;
+        if (start && needsToBeNbspLeft(root, CaretPosition(text, 0))) {
+          normalizeWhitespaceAfter(text, 0);
+        } else if (!start && needsToBeNbspRight(root, CaretPosition(text, text.length))) {
+          normalizeWhitespaceBefore(text, text.length);
+        }
+      });
+    };
+    const mergeAndNormalizeText = (outerNode, innerNode, rng, start) => {
+      outerNode.bind(outer => {
+        const normalizer = start ? normalizeWhitespaceBefore : normalizeWhitespaceAfter;
+        normalizer(outer.dom, start ? outer.dom.length : 0);
+        return innerNode.filter(isText$9).map(inner => merge$1(outer, inner, rng, start));
+      }).orThunk(() => {
+        const innerTextNode = walkPastBookmark(innerNode, start).or(innerNode).filter(isText$9);
+        return innerTextNode.map(inner => normalizeTextIfRequired(inner, start));
+      });
+    };
+    const rngSetContent = (rng, fragment) => {
+      const firstChild = Optional.from(fragment.firstChild).map(SugarElement.fromDom);
+      const lastChild = Optional.from(fragment.lastChild).map(SugarElement.fromDom);
+      rng.deleteContents();
+      rng.insertNode(fragment);
+      const prevText = firstChild.bind(prevSibling).filter(isText$9).bind(removeEmpty);
+      const nextText = lastChild.bind(nextSibling).filter(isText$9).bind(removeEmpty);
+      mergeAndNormalizeText(prevText, firstChild, rng, true);
+      mergeAndNormalizeText(nextText, lastChild, rng, false);
+      rng.collapse(false);
+    };
+    const setupArgs$2 = (args, content) => ({
+      format: 'html',
+      ...args,
+      set: true,
+      selection: true,
+      content
+    });
+    const cleanContent = (editor, args) => {
+      if (args.format !== 'raw') {
+        const rng = editor.selection.getRng();
+        const contextBlock = editor.dom.getParent(rng.commonAncestorContainer, editor.dom.isBlock);
+        const contextArgs = contextBlock ? { context: contextBlock.nodeName.toLowerCase() } : {};
+        const node = editor.parser.parse(args.content, {
+          forced_root_block: false,
+          ...contextArgs,
+          ...args
+        });
+        return HtmlSerializer({ validate: false }, editor.schema).serialize(node);
+      } else {
+        return args.content;
+      }
+    };
+    const setContent$1 = (editor, content, args = {}) => {
+      const defaultedArgs = setupArgs$2(args, content);
+      preProcessSetContent(editor, defaultedArgs).each(updatedArgs => {
+        const cleanedContent = cleanContent(editor, updatedArgs);
+        const rng = editor.selection.getRng();
+        rngSetContent(rng, rng.createContextualFragment(cleanedContent));
+        editor.selection.setRng(rng);
+        scrollRangeIntoView(editor, rng);
+        postProcessSetContent(editor, cleanedContent, updatedArgs);
+      });
+    };
+
+    const deleteFromCallbackMap = (callbackMap, selector, callback) => {
+      if (callbackMap && has$2(callbackMap, selector)) {
+        const newCallbacks = filter$6(callbackMap[selector], cb => cb !== callback);
+        if (newCallbacks.length === 0) {
+          delete callbackMap[selector];
+        } else {
+          callbackMap[selector] = newCallbacks;
+        }
+      }
+    };
+    var SelectorChanged = (dom, editor) => {
+      let selectorChangedData;
+      let currentSelectors;
+      const findMatchingNode = (selector, nodes) => find$2(nodes, node => dom.is(node, selector));
+      const getParents = elem => dom.getParents(elem, null, dom.getRoot());
+      return {
+        selectorChangedWithUnbind: (selector, callback) => {
+          if (!selectorChangedData) {
+            selectorChangedData = {};
+            currentSelectors = {};
+            editor.on('NodeChange', e => {
+              const node = e.element;
+              const parents = getParents(node);
+              const matchedSelectors = {};
+              Tools.each(selectorChangedData, (callbacks, selector) => {
+                findMatchingNode(selector, parents).each(node => {
+                  if (!currentSelectors[selector]) {
+                    each$g(callbacks, callback => {
+                      callback(true, {
+                        node,
+                        selector,
+                        parents
+                      });
+                    });
+                    currentSelectors[selector] = callbacks;
+                  }
+                  matchedSelectors[selector] = callbacks;
+                });
+              });
+              Tools.each(currentSelectors, (callbacks, selector) => {
+                if (!matchedSelectors[selector]) {
+                  delete currentSelectors[selector];
+                  Tools.each(callbacks, callback => {
+                    callback(false, {
+                      node,
+                      selector,
+                      parents
+                    });
+                  });
+                }
+              });
+            });
+          }
+          if (!selectorChangedData[selector]) {
+            selectorChangedData[selector] = [];
+          }
+          selectorChangedData[selector].push(callback);
+          findMatchingNode(selector, getParents(editor.selection.getStart())).each(() => {
+            currentSelectors[selector] = selectorChangedData[selector];
+          });
+          return {
+            unbind: () => {
+              deleteFromCallbackMap(selectorChangedData, selector, callback);
+              deleteFromCallbackMap(currentSelectors, selector, callback);
+            }
+          };
+        }
+      };
+    };
+
+    const isAttachedToDom = node => {
+      return !!(node && node.ownerDocument) && contains(SugarElement.fromDom(node.ownerDocument), SugarElement.fromDom(node));
+    };
+    const isValidRange = rng => {
+      if (!rng) {
+        return false;
+      } else {
+        return isAttachedToDom(rng.startContainer) && isAttachedToDom(rng.endContainer);
+      }
+    };
+    const EditorSelection = (dom, win, serializer, editor) => {
+      let selectedRange;
+      let explicitRange;
+      const {selectorChangedWithUnbind} = SelectorChanged(dom, editor);
+      const setCursorLocation = (node, offset) => {
+        const rng = dom.createRng();
+        if (isNonNullable(node) && isNonNullable(offset)) {
+          rng.setStart(node, offset);
+          rng.setEnd(node, offset);
+          setRng(rng);
+          collapse(false);
+        } else {
+          moveEndPoint(dom, rng, editor.getBody(), true);
+          setRng(rng);
+        }
+      };
+      const getContent = args => getContent$1(editor, args);
+      const setContent = (content, args) => setContent$1(editor, content, args);
+      const getStart$1 = real => getStart(editor.getBody(), getRng$1(), real);
+      const getEnd = real => getEnd$1(editor.getBody(), getRng$1(), real);
+      const getBookmark = (type, normalized) => bookmarkManager.getBookmark(type, normalized);
+      const moveToBookmark = bookmark => bookmarkManager.moveToBookmark(bookmark);
+      const select$1 = (node, content) => {
+        select(dom, node, content).each(setRng);
+        return node;
+      };
+      const isCollapsed = () => {
+        const rng = getRng$1(), sel = getSel();
+        if (!rng || rng.item) {
+          return false;
+        }
+        if (rng.compareEndPoints) {
+          return rng.compareEndPoints('StartToEnd', rng) === 0;
+        }
+        return !sel || rng.collapsed;
+      };
+      const collapse = toStart => {
+        const rng = getRng$1();
+        rng.collapse(!!toStart);
+        setRng(rng);
+      };
+      const getSel = () => win.getSelection ? win.getSelection() : win.document.selection;
+      const getRng$1 = () => {
+        let selection, rng, elm;
+        const tryCompareBoundaryPoints = (how, sourceRange, destinationRange) => {
+          try {
+            return sourceRange.compareBoundaryPoints(how, destinationRange);
+          } catch (ex) {
+            return -1;
+          }
+        };
+        const doc = win.document;
+        if (editor.bookmark !== undefined && hasFocus(editor) === false) {
+          const bookmark = getRng(editor);
+          if (bookmark.isSome()) {
+            return bookmark.map(r => processRanges(editor, [r])[0]).getOr(doc.createRange());
+          }
+        }
+        try {
+          if ((selection = getSel()) && !isRestrictedNode(selection.anchorNode)) {
+            if (selection.rangeCount > 0) {
+              rng = selection.getRangeAt(0);
+            } else {
+              rng = selection.createRange ? selection.createRange() : doc.createRange();
+            }
+            rng = processRanges(editor, [rng])[0];
+          }
+        } catch (ex) {
+        }
+        if (!rng) {
+          rng = doc.createRange();
+        }
+        if (rng.setStart && rng.startContainer.nodeType === 9 && rng.collapsed) {
+          elm = dom.getRoot();
+          rng.setStart(elm, 0);
+          rng.setEnd(elm, 0);
+        }
+        if (selectedRange && explicitRange) {
+          if (tryCompareBoundaryPoints(rng.START_TO_START, rng, selectedRange) === 0 && tryCompareBoundaryPoints(rng.END_TO_END, rng, selectedRange) === 0) {
+            rng = explicitRange;
+          } else {
+            selectedRange = null;
+            explicitRange = null;
+          }
+        }
+        return rng;
+      };
+      const setRng = (rng, forward) => {
+        let node;
+        if (!isValidRange(rng)) {
+          return;
+        }
+        const sel = getSel();
+        const evt = editor.dispatch('SetSelectionRange', {
+          range: rng,
+          forward
+        });
+        rng = evt.range;
+        if (sel) {
+          explicitRange = rng;
+          try {
+            sel.removeAllRanges();
+            sel.addRange(rng);
+          } catch (ex) {
+          }
+          if (forward === false && sel.extend) {
+            sel.collapse(rng.endContainer, rng.endOffset);
+            sel.extend(rng.startContainer, rng.startOffset);
+          }
+          selectedRange = sel.rangeCount > 0 ? sel.getRangeAt(0) : null;
+        }
+        if (!rng.collapsed && rng.startContainer === rng.endContainer && sel.setBaseAndExtent) {
+          if (rng.endOffset - rng.startOffset < 2) {
+            if (rng.startContainer.hasChildNodes()) {
+              node = rng.startContainer.childNodes[rng.startOffset];
+              if (node && node.tagName === 'IMG') {
+                sel.setBaseAndExtent(rng.startContainer, rng.startOffset, rng.endContainer, rng.endOffset);
+                if (sel.anchorNode !== rng.startContainer || sel.focusNode !== rng.endContainer) {
+                  sel.setBaseAndExtent(node, 0, node, 1);
+                }
+              }
+            }
+          }
+        }
+        editor.dispatch('AfterSetSelectionRange', {
+          range: rng,
+          forward
+        });
+      };
+      const setNode = elm => {
+        setContent(dom.getOuterHTML(elm));
+        return elm;
+      };
+      const getNode$1 = () => getNode(editor.getBody(), getRng$1());
+      const getSelectedBlocks$1 = (startElm, endElm) => getSelectedBlocks(dom, getRng$1(), startElm, endElm);
+      const isForward = () => {
+        const sel = getSel();
+        const anchorNode = sel === null || sel === void 0 ? void 0 : sel.anchorNode;
+        const focusNode = sel === null || sel === void 0 ? void 0 : sel.focusNode;
+        if (!sel || !anchorNode || !focusNode || isRestrictedNode(anchorNode) || isRestrictedNode(focusNode)) {
+          return true;
+        }
+        const anchorRange = dom.createRng();
+        anchorRange.setStart(anchorNode, sel.anchorOffset);
+        anchorRange.collapse(true);
+        const focusRange = dom.createRng();
+        focusRange.setStart(focusNode, sel.focusOffset);
+        focusRange.collapse(true);
+        return anchorRange.compareBoundaryPoints(anchorRange.START_TO_START, focusRange) <= 0;
+      };
+      const normalize = () => {
+        const rng = getRng$1();
+        const sel = getSel();
+        if (!hasMultipleRanges(sel) && hasAnyRanges(editor)) {
+          const normRng = normalize$2(dom, rng);
+          normRng.each(normRng => {
+            setRng(normRng, isForward());
+          });
+          return normRng.getOr(rng);
+        }
+        return rng;
+      };
+      const selectorChanged = (selector, callback) => {
+        selectorChangedWithUnbind(selector, callback);
+        return exports;
+      };
+      const getScrollContainer = () => {
+        let scrollContainer;
+        let node = dom.getRoot();
+        while (node && node.nodeName !== 'BODY') {
+          if (node.scrollHeight > node.clientHeight) {
+            scrollContainer = node;
+            break;
+          }
+          node = node.parentNode;
+        }
+        return scrollContainer;
+      };
+      const scrollIntoView = (elm, alignToTop) => {
+        if (isNonNullable(elm)) {
+          scrollElementIntoView(editor, elm, alignToTop);
+        } else {
+          scrollRangeIntoView(editor, getRng$1(), alignToTop);
+        }
+      };
+      const placeCaretAt = (clientX, clientY) => setRng(fromPoint(clientX, clientY, editor.getDoc()));
+      const getBoundingClientRect = () => {
+        const rng = getRng$1();
+        return rng.collapsed ? CaretPosition.fromRangeStart(rng).getClientRects()[0] : rng.getBoundingClientRect();
+      };
+      const destroy = () => {
+        win = selectedRange = explicitRange = null;
+        controlSelection.destroy();
+      };
+      const exports = {
+        bookmarkManager: null,
+        controlSelection: null,
+        dom,
+        win,
+        serializer,
+        editor,
+        collapse,
+        setCursorLocation,
+        getContent,
+        setContent,
+        getBookmark,
+        moveToBookmark,
+        select: select$1,
+        isCollapsed,
+        isForward,
+        setNode,
+        getNode: getNode$1,
+        getSel,
+        setRng,
+        getRng: getRng$1,
+        getStart: getStart$1,
+        getEnd,
+        getSelectedBlocks: getSelectedBlocks$1,
+        normalize,
+        selectorChanged,
+        selectorChangedWithUnbind,
+        getScrollContainer,
+        scrollIntoView,
+        placeCaretAt,
+        getBoundingClientRect,
+        destroy
+      };
+      const bookmarkManager = BookmarkManager(exports);
+      const controlSelection = ControlSelection(exports, editor);
+      exports.bookmarkManager = bookmarkManager;
+      exports.controlSelection = controlSelection;
+      return exports;
+    };
+
+    const register$3 = (htmlParser, settings, dom) => {
+      htmlParser.addAttributeFilter('data-mce-tabindex', (nodes, name) => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          node.attr('tabindex', node.attr('data-mce-tabindex'));
+          node.attr(name, null);
+        }
+      });
+      htmlParser.addAttributeFilter('src,href,style', (nodes, name) => {
+        const internalName = 'data-mce-' + name;
+        const urlConverter = settings.url_converter;
+        const urlConverterScope = settings.url_converter_scope;
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          let value = node.attr(internalName);
+          if (value !== undefined) {
+            node.attr(name, value.length > 0 ? value : null);
+            node.attr(internalName, null);
+          } else {
+            value = node.attr(name);
+            if (name === 'style') {
+              value = dom.serializeStyle(dom.parseStyle(value), node.name);
+            } else if (urlConverter) {
+              value = urlConverter.call(urlConverterScope, value, name, node.name);
+            }
+            node.attr(name, value.length > 0 ? value : null);
+          }
+        }
+      });
+      htmlParser.addAttributeFilter('class', nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          let value = node.attr('class');
+          if (value) {
+            value = node.attr('class').replace(/(?:^|\s)mce-item-\w+(?!\S)/g, '');
+            node.attr('class', value.length > 0 ? value : null);
+          }
+        }
+      });
+      htmlParser.addAttributeFilter('data-mce-type', (nodes, name, args) => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          if (node.attr('data-mce-type') === 'bookmark' && !args.cleanup) {
+            const hasChildren = Optional.from(node.firstChild).exists(firstChild => !isZwsp(firstChild.value));
+            if (hasChildren) {
+              node.unwrap();
+            } else {
+              node.remove();
+            }
+          }
+        }
+      });
+      htmlParser.addNodeFilter('noscript', nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i].firstChild;
+          if (node) {
+            node.value = Entities.decode(node.value);
+          }
+        }
+      });
+      htmlParser.addNodeFilter('script,style', (nodes, name) => {
+        const trim = value => {
+          return value.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, '');
+        };
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          const value = node.firstChild ? node.firstChild.value : '';
+          if (name === 'script') {
+            const type = node.attr('type');
+            if (type) {
+              node.attr('type', type === 'mce-no/type' ? null : type.replace(/^mce\-/, ''));
+            }
+            if (settings.element_format === 'xhtml' && value.length > 0) {
+              node.firstChild.value = '// <![CDATA[\n' + trim(value) + '\n// ]]>';
+            }
+          } else {
+            if (settings.element_format === 'xhtml' && value.length > 0) {
+              node.firstChild.value = '<!--\n' + trim(value) + '\n-->';
+            }
+          }
+        }
+      });
+      htmlParser.addNodeFilter('#comment', nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          if (settings.preserve_cdata && node.value.indexOf('[CDATA[') === 0) {
+            node.name = '#cdata';
+            node.type = 4;
+            node.value = dom.decode(node.value.replace(/^\[CDATA\[|\]\]$/g, ''));
+          } else if (node.value.indexOf('mce:protected ') === 0) {
+            node.name = '#text';
+            node.type = 3;
+            node.raw = true;
+            node.value = unescape(node.value).substr(14);
+          }
+        }
+      });
+      htmlParser.addNodeFilter('xml:namespace,input', (nodes, name) => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          if (node.type === 7) {
+            node.remove();
+          } else if (node.type === 1) {
+            if (name === 'input' && !node.attr('type')) {
+              node.attr('type', 'text');
+            }
+          }
+        }
+      });
+      htmlParser.addAttributeFilter('data-mce-type', nodes => {
+        each$g(nodes, node => {
+          if (node.attr('data-mce-type') === 'format-caret') {
+            if (node.isEmpty(htmlParser.schema.getNonEmptyElements())) {
+              node.remove();
+            } else {
+              node.unwrap();
+            }
+          }
+        });
+      });
+      htmlParser.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', (nodes, name) => {
+        let i = nodes.length;
+        while (i--) {
+          nodes[i].attr(name, null);
+        }
+      });
+    };
+    const trimTrailingBr = rootNode => {
+      const isBr = node => {
+        return node && node.name === 'br';
+      };
+      const brNode1 = rootNode.lastChild;
+      if (isBr(brNode1)) {
+        const brNode2 = brNode1.prev;
+        if (isBr(brNode2)) {
+          brNode1.remove();
+          brNode2.remove();
+        }
+      }
+    };
+
+    const preProcess$1 = (editor, node, args) => {
+      let oldDoc;
+      const dom = editor.dom;
+      let clonedNode = node.cloneNode(true);
+      const impl = document.implementation;
+      if (impl.createHTMLDocument) {
+        const doc = impl.createHTMLDocument('');
+        Tools.each(clonedNode.nodeName === 'BODY' ? clonedNode.childNodes : [clonedNode], node => {
+          doc.body.appendChild(doc.importNode(node, true));
+        });
+        if (clonedNode.nodeName !== 'BODY') {
+          clonedNode = doc.body.firstChild;
+        } else {
+          clonedNode = doc.body;
+        }
+        oldDoc = dom.doc;
+        dom.doc = doc;
+      }
+      firePreProcess(editor, {
+        ...args,
+        node: clonedNode
+      });
+      if (oldDoc) {
+        dom.doc = oldDoc;
+      }
+      return clonedNode;
+    };
+    const shouldFireEvent = (editor, args) => {
+      return editor && editor.hasEventListeners('PreProcess') && !args.no_events;
+    };
+    const process$1 = (editor, node, args) => {
+      return shouldFireEvent(editor, args) ? preProcess$1(editor, node, args) : node;
+    };
+
+    const addTempAttr = (htmlParser, tempAttrs, name) => {
+      if (Tools.inArray(tempAttrs, name) === -1) {
+        htmlParser.addAttributeFilter(name, (nodes, name) => {
+          let i = nodes.length;
+          while (i--) {
+            nodes[i].attr(name, null);
+          }
+        });
+        tempAttrs.push(name);
+      }
+    };
+    const postProcess = (editor, args, content) => {
+      if (!args.no_events && editor) {
+        const outArgs = firePostProcess(editor, {
+          ...args,
+          content
+        });
+        return outArgs.content;
+      } else {
+        return content;
+      }
+    };
+    const getHtmlFromNode = (dom, node, args) => {
+      const html = trim$1(args.getInner ? node.innerHTML : dom.getOuterHTML(node));
+      return args.selection || isWsPreserveElement(SugarElement.fromDom(node)) ? html : Tools.trim(html);
+    };
+    const parseHtml = (htmlParser, html, args) => {
+      const parserArgs = args.selection ? {
+        forced_root_block: false,
+        ...args
+      } : args;
+      const rootNode = htmlParser.parse(html, parserArgs);
+      trimTrailingBr(rootNode);
+      return rootNode;
+    };
+    const serializeNode = (settings, schema, node) => {
+      const htmlSerializer = HtmlSerializer(settings, schema);
+      return htmlSerializer.serialize(node);
+    };
+    const toHtml = (editor, settings, schema, rootNode, args) => {
+      const content = serializeNode(settings, schema, rootNode);
+      return postProcess(editor, args, content);
+    };
+    const DomSerializerImpl = (settings, editor) => {
+      const tempAttrs = ['data-mce-selected'];
+      const dom = editor && editor.dom ? editor.dom : DOMUtils.DOM;
+      const schema = editor && editor.schema ? editor.schema : Schema(settings);
+      settings.entity_encoding = settings.entity_encoding || 'named';
+      settings.remove_trailing_brs = 'remove_trailing_brs' in settings ? settings.remove_trailing_brs : true;
+      const htmlParser = DomParser(settings, schema);
+      register$3(htmlParser, settings, dom);
+      const serialize = (node, parserArgs = {}) => {
+        const args = {
+          format: 'html',
+          ...parserArgs
+        };
+        const targetNode = process$1(editor, node, args);
+        const html = getHtmlFromNode(dom, targetNode, args);
+        const rootNode = parseHtml(htmlParser, html, args);
+        return args.format === 'tree' ? rootNode : toHtml(editor, settings, schema, rootNode, args);
+      };
+      return {
+        schema,
+        addNodeFilter: htmlParser.addNodeFilter,
+        addAttributeFilter: htmlParser.addAttributeFilter,
+        serialize: serialize,
+        addRules: schema.addValidElements,
+        setRules: schema.setValidElements,
+        addTempAttr: curry(addTempAttr, htmlParser, tempAttrs),
+        getTempAttrs: constant(tempAttrs),
+        getNodeFilters: htmlParser.getNodeFilters,
+        getAttributeFilters: htmlParser.getAttributeFilters
+      };
+    };
+
+    const DomSerializer = (settings, editor) => {
+      const domSerializer = DomSerializerImpl(settings, editor);
+      return {
+        schema: domSerializer.schema,
+        addNodeFilter: domSerializer.addNodeFilter,
+        addAttributeFilter: domSerializer.addAttributeFilter,
+        serialize: domSerializer.serialize,
+        addRules: domSerializer.addRules,
+        setRules: domSerializer.setRules,
+        addTempAttr: domSerializer.addTempAttr,
+        getTempAttrs: domSerializer.getTempAttrs,
+        getNodeFilters: domSerializer.getNodeFilters,
+        getAttributeFilters: domSerializer.getAttributeFilters
+      };
+    };
+
+    const defaultFormat$1 = 'html';
+    const setupArgs$1 = (args, format) => ({
+      ...args,
+      format,
+      get: true,
+      getInner: true
+    });
+    const getContent = (editor, args = {}) => {
+      const format = args.format ? args.format : defaultFormat$1;
+      const defaultedArgs = setupArgs$1(args, format);
+      return preProcessGetContent(editor, defaultedArgs).fold(identity, updatedArgs => {
+        const content = getContent$2(editor, updatedArgs);
+        return postProcessGetContent(editor, content, updatedArgs);
+      });
+    };
+
+    const defaultFormat = 'html';
+    const setupArgs = (args, content) => ({
+      format: defaultFormat,
+      ...args,
+      set: true,
+      content
+    });
+    const setContent = (editor, content, args = {}) => {
+      const defaultedArgs = setupArgs(args, content);
+      return preProcessSetContent(editor, defaultedArgs).map(updatedArgs => {
+        const result = setContent$2(editor, updatedArgs.content, updatedArgs);
+        postProcessSetContent(editor, result.html, updatedArgs);
+        return result.content;
+      }).getOr(content);
+    };
+
+    const removedOptions = ('autoresize_on_init,content_editable_state,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,tabfocus_elements,table_responsive_width,text_block_elements,text_inline_elements,toolbar_drawer,types,validate,whitespace_elements,' + 'paste_enable_default_filters,paste_filter_drop,paste_word_valid_elements,paste_retain_style_properties,paste_convert_word_fake_lists').split(',');
+    const removedPlugins = 'bbcode,colorpicker,contextmenu,fullpage,legacyoutput,spellchecker,textcolor'.split(',');
+    const getRemovedOptions = options => {
+      const settingNames = filter$6(removedOptions, setting => has$2(options, setting));
+      const forcedRootBlock = options.forced_root_block;
+      if (forcedRootBlock === false || forcedRootBlock === '') {
+        settingNames.push('forced_root_block (false only)');
+      }
+      return sort(settingNames);
+    };
+    const getRemovedPlugins = options => {
+      const plugins = Tools.makeMap(options.plugins, ' ');
+      const hasPlugin = plugin => has$2(plugins, plugin);
+      const pluginNames = filter$6(removedPlugins, hasPlugin);
+      return sort(pluginNames);
+    };
+    const logRemovedWarnings = (rawOptions, normalizedOptions) => {
+      const removedOptions = getRemovedOptions(rawOptions);
+      const removedPlugins = getRemovedPlugins(normalizedOptions);
+      const hasRemovedPlugins = removedPlugins.length > 0;
+      const hasRemovedOptions = removedOptions.length > 0;
+      const isLegacyMobileTheme = normalizedOptions.theme === 'mobile';
+      if (hasRemovedPlugins || hasRemovedOptions || isLegacyMobileTheme) {
+        const listJoiner = '\n- ';
+        const themesMessage = isLegacyMobileTheme ? `\n\nThemes:${ listJoiner }mobile` : '';
+        const pluginsMessage = hasRemovedPlugins ? `\n\nPlugins:${ listJoiner }${ removedPlugins.join(listJoiner) }` : '';
+        const optionsMessage = hasRemovedOptions ? `\n\nOptions:${ listJoiner }${ removedOptions.join(listJoiner) }` : '';
+        console.warn('The following deprecated features are currently enabled and have been removed in TinyMCE 6.0. These features will no longer work and should be removed from the TinyMCE configuration. ' + 'See https://www.tiny.cloud/docs/tinymce/6/migration-from-5x/ for more information.' + themesMessage + pluginsMessage + optionsMessage);
+      }
+    };
+    const logWarnings = (rawOptions, normalizedOptions) => {
+      logRemovedWarnings(rawOptions, normalizedOptions);
+    };
+
+    const DOM$8 = DOMUtils.DOM;
+    const restoreOriginalStyles = editor => {
+      DOM$8.setStyle(editor.id, 'display', editor.orgDisplay);
+    };
+    const safeDestroy = x => Optional.from(x).each(x => x.destroy());
+    const clearDomReferences = editor => {
+      editor.contentAreaContainer = editor.formElement = editor.container = editor.editorContainer = null;
+      editor.bodyElement = editor.contentDocument = editor.contentWindow = null;
+      editor.iframeElement = editor.targetElm = null;
+      if (editor.selection) {
+        editor.selection = editor.selection.win = editor.selection.dom = editor.selection.dom.doc = null;
+      }
+    };
+    const restoreForm = editor => {
+      const form = editor.formElement;
+      if (form) {
+        if (form._mceOldSubmit) {
+          form.submit = form._mceOldSubmit;
+          form._mceOldSubmit = null;
+        }
+        DOM$8.unbind(form, 'submit reset', editor.formEventDelegate);
+      }
+    };
+    const remove$1 = editor => {
+      if (!editor.removed) {
+        const {_selectionOverrides, editorUpload} = editor;
+        const body = editor.getBody();
+        const element = editor.getElement();
+        if (body) {
+          editor.save({ is_removing: true });
+        }
+        editor.removed = true;
+        editor.unbindAllNativeEvents();
+        if (editor.hasHiddenInput && element) {
+          DOM$8.remove(element.nextSibling);
+        }
+        fireRemove(editor);
+        editor.editorManager.remove(editor);
+        if (!editor.inline && body) {
+          restoreOriginalStyles(editor);
+        }
+        fireDetach(editor);
+        DOM$8.remove(editor.getContainer());
+        safeDestroy(_selectionOverrides);
+        safeDestroy(editorUpload);
+        editor.destroy();
+      }
+    };
+    const destroy = (editor, automatic) => {
+      const {selection, dom} = editor;
+      if (editor.destroyed) {
+        return;
+      }
+      if (!automatic && !editor.removed) {
+        editor.remove();
+        return;
+      }
+      if (!automatic) {
+        editor.editorManager.off('beforeunload', editor._beforeUnload);
+        if (editor.theme && editor.theme.destroy) {
+          editor.theme.destroy();
+        }
+        safeDestroy(selection);
+        safeDestroy(dom);
+      }
+      restoreForm(editor);
+      clearDomReferences(editor);
+      editor.destroyed = true;
+    };
+
+    const CreateIconManager = () => {
+      const lookup = {};
+      const add = (id, iconPack) => {
+        lookup[id] = iconPack;
+      };
+      const get = id => {
+        if (lookup[id]) {
+          return lookup[id];
+        }
+        return { icons: {} };
+      };
+      const has = id => has$2(lookup, id);
+      return {
+        add,
+        get,
+        has
+      };
+    };
+    const IconManager = CreateIconManager();
+
+    const ModelManager = AddOnManager.ModelManager;
+
+    const getProp = (propName, elm) => {
+      const rawElm = elm.dom;
+      return rawElm[propName];
+    };
+    const getComputedSizeProp = (propName, elm) => parseInt(get$7(elm, propName), 10);
+    const getClientWidth = curry(getProp, 'clientWidth');
+    const getClientHeight = curry(getProp, 'clientHeight');
+    const getMarginTop = curry(getComputedSizeProp, 'margin-top');
+    const getMarginLeft = curry(getComputedSizeProp, 'margin-left');
+    const getBoundingClientRect = elm => elm.dom.getBoundingClientRect();
+    const isInsideElementContentArea = (bodyElm, clientX, clientY) => {
+      const clientWidth = getClientWidth(bodyElm);
+      const clientHeight = getClientHeight(bodyElm);
+      return clientX >= 0 && clientY >= 0 && clientX <= clientWidth && clientY <= clientHeight;
+    };
+    const transpose = (inline, elm, clientX, clientY) => {
+      const clientRect = getBoundingClientRect(elm);
+      const deltaX = inline ? clientRect.left + elm.dom.clientLeft + getMarginLeft(elm) : 0;
+      const deltaY = inline ? clientRect.top + elm.dom.clientTop + getMarginTop(elm) : 0;
+      const x = clientX - deltaX;
+      const y = clientY - deltaY;
+      return {
+        x,
+        y
+      };
+    };
+    const isXYInContentArea = (editor, clientX, clientY) => {
+      const bodyElm = SugarElement.fromDom(editor.getBody());
+      const targetElm = editor.inline ? bodyElm : documentElement(bodyElm);
+      const transposedPoint = transpose(editor.inline, targetElm, clientX, clientY);
+      return isInsideElementContentArea(targetElm, transposedPoint.x, transposedPoint.y);
+    };
+    const fromDomSafe = node => Optional.from(node).map(SugarElement.fromDom);
+    const isEditorAttachedToDom = editor => {
+      const rawContainer = editor.inline ? editor.getBody() : editor.getContentAreaContainer();
+      return fromDomSafe(rawContainer).map(inBody).getOr(false);
+    };
+
+    const NotificationManagerImpl = () => {
+      const unimplemented = () => {
+        throw new Error('Theme did not provide a NotificationManager implementation.');
+      };
+      return {
+        open: unimplemented,
+        close: unimplemented,
+        getArgs: unimplemented
+      };
+    };
+
+    const NotificationManager = editor => {
+      const notifications = [];
+      const getImplementation = () => {
+        const theme = editor.theme;
+        return theme && theme.getNotificationManagerImpl ? theme.getNotificationManagerImpl() : NotificationManagerImpl();
+      };
+      const getTopNotification = () => {
+        return Optional.from(notifications[0]);
+      };
+      const isEqual = (a, b) => {
+        return a.type === b.type && a.text === b.text && !a.progressBar && !a.timeout && !b.progressBar && !b.timeout;
+      };
+      const reposition = () => {
+        each$g(notifications, notification => {
+          notification.reposition();
+        });
+      };
+      const addNotification = notification => {
+        notifications.push(notification);
+      };
+      const closeNotification = notification => {
+        findIndex$2(notifications, otherNotification => {
+          return otherNotification === notification;
+        }).each(index => {
+          notifications.splice(index, 1);
+        });
+      };
+      const open = (spec, fireEvent = true) => {
+        if (editor.removed || !isEditorAttachedToDom(editor)) {
+          return;
+        }
+        if (fireEvent) {
+          editor.dispatch('BeforeOpenNotification', { notification: spec });
+        }
+        return find$2(notifications, notification => {
+          return isEqual(getImplementation().getArgs(notification), spec);
+        }).getOrThunk(() => {
+          editor.editorManager.setActive(editor);
+          const notification = getImplementation().open(spec, () => {
+            closeNotification(notification);
+            reposition();
+            getTopNotification().fold(() => editor.focus(), top => focus$1(SugarElement.fromDom(top.getEl())));
+          });
+          addNotification(notification);
+          reposition();
+          editor.dispatch('OpenNotification', { notification: { ...notification } });
+          return notification;
+        });
+      };
+      const close = () => {
+        getTopNotification().each(notification => {
+          getImplementation().close(notification);
+          closeNotification(notification);
+          reposition();
+        });
+      };
+      const getNotifications = constant(notifications);
+      const registerEvents = editor => {
+        editor.on('SkinLoaded', () => {
+          const serviceMessage = getServiceMessage(editor);
+          if (serviceMessage) {
+            open({
+              text: serviceMessage,
+              type: 'warning',
+              timeout: 0
+            }, false);
+          }
+          reposition();
+        });
+        editor.on('show ResizeEditor ResizeWindow NodeChange', () => {
+          requestAnimationFrame(reposition);
+        });
+        editor.on('remove', () => {
+          each$g(notifications.slice(), notification => {
+            getImplementation().close(notification);
+          });
+        });
+      };
+      registerEvents(editor);
+      return {
+        open,
+        close,
+        getNotifications
+      };
+    };
+
+    const PluginManager = AddOnManager.PluginManager;
+
+    const ThemeManager = AddOnManager.ThemeManager;
+
+    var WindowManagerImpl = () => {
+      const unimplemented = () => {
+        throw new Error('Theme did not provide a WindowManager implementation.');
+      };
+      return {
+        open: unimplemented,
+        openUrl: unimplemented,
+        alert: unimplemented,
+        confirm: unimplemented,
+        close: unimplemented,
+        getParams: unimplemented,
+        setParams: unimplemented
+      };
+    };
+
+    const WindowManager = editor => {
+      let dialogs = [];
+      const getImplementation = () => {
+        const theme = editor.theme;
+        return theme && theme.getWindowManagerImpl ? theme.getWindowManagerImpl() : WindowManagerImpl();
+      };
+      const funcBind = (scope, f) => {
+        return (...args) => {
+          return f ? f.apply(scope, args) : undefined;
+        };
+      };
+      const fireOpenEvent = dialog => {
+        editor.dispatch('OpenWindow', { dialog });
+      };
+      const fireCloseEvent = dialog => {
+        editor.dispatch('CloseWindow', { dialog });
+      };
+      const addDialog = dialog => {
+        dialogs.push(dialog);
+        fireOpenEvent(dialog);
+      };
+      const closeDialog = dialog => {
+        fireCloseEvent(dialog);
+        dialogs = filter$6(dialogs, otherDialog => {
+          return otherDialog !== dialog;
+        });
+        if (dialogs.length === 0) {
+          editor.focus();
+        }
+      };
+      const getTopDialog = () => {
+        return Optional.from(dialogs[dialogs.length - 1]);
+      };
+      const storeSelectionAndOpenDialog = openDialog => {
+        editor.editorManager.setActive(editor);
+        store(editor);
+        editor.ui.show();
+        const dialog = openDialog();
+        addDialog(dialog);
+        return dialog;
+      };
+      const open = (args, params) => {
+        return storeSelectionAndOpenDialog(() => getImplementation().open(args, params, closeDialog));
+      };
+      const openUrl = args => {
+        return storeSelectionAndOpenDialog(() => getImplementation().openUrl(args, closeDialog));
+      };
+      const alert = (message, callback, scope) => {
+        const windowManagerImpl = getImplementation();
+        windowManagerImpl.alert(message, funcBind(scope ? scope : windowManagerImpl, callback));
+      };
+      const confirm = (message, callback, scope) => {
+        const windowManagerImpl = getImplementation();
+        windowManagerImpl.confirm(message, funcBind(scope ? scope : windowManagerImpl, callback));
+      };
+      const close = () => {
+        getTopDialog().each(dialog => {
+          getImplementation().close(dialog);
+          closeDialog(dialog);
+        });
+      };
+      editor.on('remove', () => {
+        each$g(dialogs, dialog => {
+          getImplementation().close(dialog);
+        });
+      });
+      return {
+        open,
+        openUrl,
+        alert,
+        confirm,
+        close
+      };
+    };
+
+    const displayNotification = (editor, message) => {
+      editor.notificationManager.open({
+        type: 'error',
+        text: message
+      });
+    };
+    const displayError = (editor, message) => {
+      if (editor._skinLoaded) {
+        displayNotification(editor, message);
+      } else {
+        editor.on('SkinLoaded', () => {
+          displayNotification(editor, message);
+        });
+      }
+    };
+    const uploadError = (editor, message) => {
+      displayError(editor, I18n.translate([
+        'Failed to upload image: {0}',
+        message
+      ]));
+    };
+    const logError = (editor, errorType, msg) => {
+      fireError(editor, errorType, { message: msg });
+      console.error(msg);
+    };
+    const createLoadError = (type, url, name) => name ? `Failed to load ${ type }: ${ name } from url ${ url }` : `Failed to load ${ type } url: ${ url }`;
+    const pluginLoadError = (editor, url, name) => {
+      logError(editor, 'PluginLoadError', createLoadError('plugin', url, name));
+    };
+    const iconsLoadError = (editor, url, name) => {
+      logError(editor, 'IconsLoadError', createLoadError('icons', url, name));
+    };
+    const languageLoadError = (editor, url, name) => {
+      logError(editor, 'LanguageLoadError', createLoadError('language', url, name));
+    };
+    const themeLoadError = (editor, url, name) => {
+      logError(editor, 'ThemeLoadError', createLoadError('theme', url, name));
+    };
+    const modelLoadError = (editor, url, name) => {
+      logError(editor, 'ModelLoadError', createLoadError('model', url, name));
+    };
+    const pluginInitError = (editor, name, err) => {
+      const message = I18n.translate([
+        'Failed to initialize plugin: {0}',
+        name
+      ]);
+      fireError(editor, 'PluginLoadError', { message });
+      initError(message, err);
+      displayError(editor, message);
+    };
+    const initError = (message, ...x) => {
+      const console = window.console;
+      if (console) {
+        if (console.error) {
+          console.error(message, ...x);
+        } else {
+          console.log(message, ...x);
+        }
+      }
+    };
+
+    const isContentCssSkinName = url => /^[a-z0-9\-]+$/i.test(url);
+    const getContentCssUrls = editor => {
+      return transformToUrls(editor, getContentCss(editor));
+    };
+    const getFontCssUrls = editor => {
+      return transformToUrls(editor, getFontCss(editor));
+    };
+    const transformToUrls = (editor, cssLinks) => {
+      const skinUrl = editor.editorManager.baseURL + '/skins/content';
+      const suffix = editor.editorManager.suffix;
+      const contentCssFile = `content${ suffix }.css`;
+      const inline = editor.inline === true;
+      return map$3(cssLinks, url => {
+        if (isContentCssSkinName(url) && !inline) {
+          return `${ skinUrl }/${ url }/${ contentCssFile }`;
+        } else {
+          return editor.documentBaseURI.toAbsolute(url);
+        }
+      });
+    };
+    const appendContentCssFromSettings = editor => {
+      editor.contentCSS = editor.contentCSS.concat(getContentCssUrls(editor), getFontCssUrls(editor));
+    };
+
+    const filter$1 = always;
+    const bind$1 = (element, event, handler) => bind$2(element, event, filter$1, handler);
+
+    const UploadStatus = () => {
+      const PENDING = 1, UPLOADED = 2;
+      let blobUriStatuses = {};
+      const createStatus = (status, resultUri) => {
+        return {
+          status,
+          resultUri
+        };
+      };
+      const hasBlobUri = blobUri => {
+        return blobUri in blobUriStatuses;
+      };
+      const getResultUri = blobUri => {
+        const result = blobUriStatuses[blobUri];
+        return result ? result.resultUri : null;
+      };
+      const isPending = blobUri => {
+        return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === PENDING : false;
+      };
+      const isUploaded = blobUri => {
+        return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === UPLOADED : false;
+      };
+      const markPending = blobUri => {
+        blobUriStatuses[blobUri] = createStatus(PENDING, null);
+      };
+      const markUploaded = (blobUri, resultUri) => {
+        blobUriStatuses[blobUri] = createStatus(UPLOADED, resultUri);
+      };
+      const removeFailed = blobUri => {
+        delete blobUriStatuses[blobUri];
+      };
+      const destroy = () => {
+        blobUriStatuses = {};
+      };
+      return {
+        hasBlobUri,
+        getResultUri,
+        isPending,
+        isUploaded,
+        markPending,
+        markUploaded,
+        removeFailed,
+        destroy
+      };
+    };
+
+    let count = 0;
+    const seed = () => {
+      const rnd = () => {
+        return Math.round(Math.random() * 4294967295).toString(36);
+      };
+      const now = new Date().getTime();
+      return 's' + now.toString(36) + rnd() + rnd() + rnd();
+    };
+    const uuid = prefix => {
+      return prefix + count++ + seed();
+    };
+
+    const BlobCache = () => {
+      let cache = [];
+      const mimeToExt = mime => {
+        const mimes = {
+          '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'
+        };
+        return mimes[mime.toLowerCase()] || 'dat';
+      };
+      const create = (o, blob, base64, name, filename) => {
+        if (isString(o)) {
+          const id = o;
+          return toBlobInfo({
+            id,
+            name,
+            filename,
+            blob,
+            base64
+          });
+        } else if (isObject(o)) {
+          return toBlobInfo(o);
+        } else {
+          throw new Error('Unknown input type');
+        }
+      };
+      const toBlobInfo = o => {
+        if (!o.blob || !o.base64) {
+          throw new Error('blob and base64 representations of the image are required for BlobInfo to be created');
+        }
+        const id = o.id || uuid('blobid');
+        const name = o.name || id;
+        const blob = o.blob;
+        return {
+          id: constant(id),
+          name: constant(name),
+          filename: constant(o.filename || name + '.' + mimeToExt(blob.type)),
+          blob: constant(blob),
+          base64: constant(o.base64),
+          blobUri: constant(o.blobUri || URL.createObjectURL(blob)),
+          uri: constant(o.uri)
+        };
+      };
+      const add = blobInfo => {
+        if (!get(blobInfo.id())) {
+          cache.push(blobInfo);
+        }
+      };
+      const findFirst = predicate => find$2(cache, predicate).getOrUndefined();
+      const get = id => findFirst(cachedBlobInfo => cachedBlobInfo.id() === id);
+      const getByUri = blobUri => findFirst(blobInfo => blobInfo.blobUri() === blobUri);
+      const getByData = (base64, type) => findFirst(blobInfo => blobInfo.base64() === base64 && blobInfo.blob().type === type);
+      const removeByUri = blobUri => {
+        cache = filter$6(cache, blobInfo => {
+          if (blobInfo.blobUri() === blobUri) {
+            URL.revokeObjectURL(blobInfo.blobUri());
+            return false;
+          }
+          return true;
+        });
+      };
+      const destroy = () => {
+        each$g(cache, cachedBlobInfo => {
+          URL.revokeObjectURL(cachedBlobInfo.blobUri());
+        });
+        cache = [];
+      };
+      return {
+        create,
+        add,
+        get,
+        getByUri,
+        getByData,
+        findFirst,
+        removeByUri,
+        destroy
+      };
+    };
+
+    const Uploader = (uploadStatus, settings) => {
+      const pendingPromises = {};
+      const pathJoin = (path1, path2) => {
+        if (path1) {
+          return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, '');
+        }
+        return path2;
+      };
+      const defaultHandler = (blobInfo, progress) => new Promise((success, failure) => {
+        const xhr = new XMLHttpRequest();
+        xhr.open('POST', settings.url);
+        xhr.withCredentials = settings.credentials;
+        xhr.upload.onprogress = e => {
+          progress(e.loaded / e.total * 100);
+        };
+        xhr.onerror = () => {
+          failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status);
+        };
+        xhr.onload = () => {
+          if (xhr.status < 200 || xhr.status >= 300) {
+            failure('HTTP Error: ' + xhr.status);
+            return;
+          }
+          const json = JSON.parse(xhr.responseText);
+          if (!json || !isString(json.location)) {
+            failure('Invalid JSON: ' + xhr.responseText);
+            return;
+          }
+          success(pathJoin(settings.basePath, json.location));
+        };
+        const formData = new FormData();
+        formData.append('file', blobInfo.blob(), blobInfo.filename());
+        xhr.send(formData);
+      });
+      const noUpload = () => new Promise(resolve => {
+        resolve([]);
+      });
+      const handlerSuccess = (blobInfo, url) => ({
+        url,
+        blobInfo,
+        status: true
+      });
+      const handlerFailure = (blobInfo, error) => ({
+        url: '',
+        blobInfo,
+        status: false,
+        error
+      });
+      const resolvePending = (blobUri, result) => {
+        Tools.each(pendingPromises[blobUri], resolve => {
+          resolve(result);
+        });
+        delete pendingPromises[blobUri];
+      };
+      const uploadBlobInfo = (blobInfo, handler, openNotification) => {
+        uploadStatus.markPending(blobInfo.blobUri());
+        return new Promise(resolve => {
+          let notification;
+          let progress;
+          try {
+            const closeNotification = () => {
+              if (notification) {
+                notification.close();
+                progress = noop;
+              }
+            };
+            const success = url => {
+              closeNotification();
+              uploadStatus.markUploaded(blobInfo.blobUri(), url);
+              resolvePending(blobInfo.blobUri(), handlerSuccess(blobInfo, url));
+              resolve(handlerSuccess(blobInfo, url));
+            };
+            const failure = error => {
+              closeNotification();
+              uploadStatus.removeFailed(blobInfo.blobUri());
+              resolvePending(blobInfo.blobUri(), handlerFailure(blobInfo, error));
+              resolve(handlerFailure(blobInfo, error));
+            };
+            progress = percent => {
+              if (percent < 0 || percent > 100) {
+                return;
+              }
+              Optional.from(notification).orThunk(() => Optional.from(openNotification).map(apply$1)).each(n => {
+                notification = n;
+                n.progressBar.value(percent);
+              });
+            };
+            handler(blobInfo, progress).then(success, err => {
+              failure(isString(err) ? { message: err } : err);
+            });
+          } catch (ex) {
+            resolve(handlerFailure(blobInfo, ex));
+          }
+        });
+      };
+      const isDefaultHandler = handler => handler === defaultHandler;
+      const pendingUploadBlobInfo = blobInfo => {
+        const blobUri = blobInfo.blobUri();
+        return new Promise(resolve => {
+          pendingPromises[blobUri] = pendingPromises[blobUri] || [];
+          pendingPromises[blobUri].push(resolve);
+        });
+      };
+      const uploadBlobs = (blobInfos, openNotification) => {
+        blobInfos = Tools.grep(blobInfos, blobInfo => !uploadStatus.isUploaded(blobInfo.blobUri()));
+        return Promise.all(Tools.map(blobInfos, blobInfo => uploadStatus.isPending(blobInfo.blobUri()) ? pendingUploadBlobInfo(blobInfo) : uploadBlobInfo(blobInfo, settings.handler, openNotification)));
+      };
+      const upload = (blobInfos, openNotification) => !settings.url && isDefaultHandler(settings.handler) ? noUpload() : uploadBlobs(blobInfos, openNotification);
+      if (isFunction(settings.handler) === false) {
+        settings.handler = defaultHandler;
+      }
+      return { upload };
+    };
+
+    const openNotification = editor => () => editor.notificationManager.open({
+      text: editor.translate('Image uploading...'),
+      type: 'info',
+      timeout: -1,
+      progressBar: true
+    });
+    const createUploader = (editor, uploadStatus) => Uploader(uploadStatus, {
+      url: getImageUploadUrl(editor),
+      basePath: getImageUploadBasePath(editor),
+      credentials: getImagesUploadCredentials(editor),
+      handler: getImagesUploadHandler(editor)
+    });
+    const ImageUploader = editor => {
+      const uploadStatus = UploadStatus();
+      const uploader = createUploader(editor, uploadStatus);
+      return { upload: (blobInfos, showNotification = true) => uploader.upload(blobInfos, showNotification ? openNotification(editor) : undefined) };
+    };
+
+    const UploadChangeHandler = editor => {
+      const lastChangedLevel = Cell(null);
+      editor.on('change AddUndo', e => {
+        lastChangedLevel.set({ ...e.level });
+      });
+      const fireIfChanged = () => {
+        const data = editor.undoManager.data;
+        last$3(data).filter(level => {
+          return !isEq$1(lastChangedLevel.get(), level);
+        }).each(level => {
+          editor.setDirty(true);
+          editor.dispatch('change', {
+            level,
+            lastLevel: get$b(data, data.length - 2).getOrNull()
+          });
+        });
+      };
+      return { fireIfChanged };
+    };
+    const EditorUpload = editor => {
+      const blobCache = BlobCache();
+      let uploader, imageScanner;
+      const uploadStatus = UploadStatus();
+      const urlFilters = [];
+      const changeHandler = UploadChangeHandler(editor);
+      const aliveGuard = callback => {
+        return result => {
+          if (editor.selection) {
+            return callback(result);
+          }
+          return [];
+        };
+      };
+      const cacheInvalidator = url => url + (url.indexOf('?') === -1 ? '?' : '&') + new Date().getTime();
+      const replaceString = (content, search, replace) => {
+        let index = 0;
+        do {
+          index = content.indexOf(search, index);
+          if (index !== -1) {
+            content = content.substring(0, index) + replace + content.substr(index + search.length);
+            index += replace.length - search.length + 1;
+          }
+        } while (index !== -1);
+        return content;
+      };
+      const replaceImageUrl = (content, targetUrl, replacementUrl) => {
+        const replacementString = `src="${ replacementUrl }"${ replacementUrl === Env.transparentSrc ? ' data-mce-placeholder="1"' : '' }`;
+        content = replaceString(content, `src="${ targetUrl }"`, replacementString);
+        content = replaceString(content, 'data-mce-src="' + targetUrl + '"', 'data-mce-src="' + replacementUrl + '"');
+        return content;
+      };
+      const replaceUrlInUndoStack = (targetUrl, replacementUrl) => {
+        each$g(editor.undoManager.data, level => {
+          if (level.type === 'fragmented') {
+            level.fragments = map$3(level.fragments, fragment => replaceImageUrl(fragment, targetUrl, replacementUrl));
+          } else {
+            level.content = replaceImageUrl(level.content, targetUrl, replacementUrl);
+          }
+        });
+      };
+      const replaceImageUriInView = (image, resultUri) => {
+        const src = editor.convertURL(resultUri, 'src');
+        replaceUrlInUndoStack(image.src, resultUri);
+        setAll$1(SugarElement.fromDom(image), {
+          'src': shouldReuseFileName(editor) ? cacheInvalidator(resultUri) : resultUri,
+          'data-mce-src': src
+        });
+      };
+      const uploadImages = () => {
+        if (!uploader) {
+          uploader = createUploader(editor, uploadStatus);
+        }
+        return scanForImages().then(aliveGuard(imageInfos => {
+          const blobInfos = map$3(imageInfos, imageInfo => imageInfo.blobInfo);
+          return uploader.upload(blobInfos, openNotification(editor)).then(aliveGuard(result => {
+            const imagesToRemove = [];
+            const filteredResult = map$3(result, (uploadInfo, index) => {
+              const blobInfo = imageInfos[index].blobInfo;
+              const image = imageInfos[index].image;
+              let removed = false;
+              if (uploadInfo.status && shouldReplaceBlobUris(editor)) {
+                blobCache.removeByUri(image.src);
+                if (isRtc(editor)) ; else {
+                  replaceImageUriInView(image, uploadInfo.url);
+                }
+              } else if (uploadInfo.error) {
+                if (uploadInfo.error.remove) {
+                  replaceUrlInUndoStack(image.getAttribute('src'), Env.transparentSrc);
+                  imagesToRemove.push(image);
+                  removed = true;
+                }
+                uploadError(editor, uploadInfo.error.message);
+              }
+              return {
+                element: image,
+                status: uploadInfo.status,
+                uploadUri: uploadInfo.url,
+                blobInfo,
+                removed
+              };
+            });
+            if (filteredResult.length > 0) {
+              changeHandler.fireIfChanged();
+            }
+            if (imagesToRemove.length > 0 && !isRtc(editor)) {
+              editor.undoManager.transact(() => {
+                each$g(imagesToRemove, element => {
+                  editor.dom.remove(element);
+                  blobCache.removeByUri(element.src);
+                });
+              });
+            }
+            return filteredResult;
+          }));
+        }));
+      };
+      const uploadImagesAuto = () => isAutomaticUploadsEnabled(editor) ? uploadImages() : Promise.resolve([]);
+      const isValidDataUriImage = imgElm => forall(urlFilters, filter => filter(imgElm));
+      const addFilter = filter => {
+        urlFilters.push(filter);
+      };
+      const scanForImages = () => {
+        if (!imageScanner) {
+          imageScanner = ImageScanner(uploadStatus, blobCache);
+        }
+        return imageScanner.findAll(editor.getBody(), isValidDataUriImage).then(aliveGuard(result => {
+          result = filter$6(result, resultItem => {
+            if (typeof resultItem === 'string') {
+              displayError(editor, resultItem);
+              return false;
+            }
+            return true;
+          });
+          if (isRtc(editor)) ; else {
+            each$g(result, resultItem => {
+              replaceUrlInUndoStack(resultItem.image.src, resultItem.blobInfo.blobUri());
+              resultItem.image.src = resultItem.blobInfo.blobUri();
+              resultItem.image.removeAttribute('data-mce-src');
+            });
+          }
+          return result;
+        }));
+      };
+      const destroy = () => {
+        blobCache.destroy();
+        uploadStatus.destroy();
+        imageScanner = uploader = null;
+      };
+      const replaceBlobUris = content => {
+        return content.replace(/src="(blob:[^"]+)"/g, (match, blobUri) => {
+          const resultUri = uploadStatus.getResultUri(blobUri);
+          if (resultUri) {
+            return 'src="' + resultUri + '"';
+          }
+          let blobInfo = blobCache.getByUri(blobUri);
+          if (!blobInfo) {
+            blobInfo = foldl(editor.editorManager.get(), (result, editor) => {
+              return result || editor.editorUpload && editor.editorUpload.blobCache.getByUri(blobUri);
+            }, null);
+          }
+          if (blobInfo) {
+            const blob = blobInfo.blob();
+            return 'src="data:' + blob.type + ';base64,' + blobInfo.base64() + '"';
+          }
+          return match;
+        });
+      };
+      editor.on('SetContent', () => {
+        if (isAutomaticUploadsEnabled(editor)) {
+          uploadImagesAuto();
+        } else {
+          scanForImages();
+        }
+      });
+      editor.on('RawSaveContent', e => {
+        e.content = replaceBlobUris(e.content);
+      });
+      editor.on('GetContent', e => {
+        if (e.source_view || e.format === 'raw' || e.format === 'tree') {
+          return;
+        }
+        e.content = replaceBlobUris(e.content);
+      });
+      editor.on('PostRender', () => {
+        editor.parser.addNodeFilter('img', images => {
+          each$g(images, img => {
+            const src = img.attr('src');
+            if (blobCache.getByUri(src)) {
+              return;
+            }
+            const resultUri = uploadStatus.getResultUri(src);
+            if (resultUri) {
+              img.attr('src', resultUri);
+            }
+          });
+        });
+      });
+      return {
+        blobCache,
+        addFilter,
+        uploadImages,
+        uploadImagesAuto,
+        scanForImages,
+        destroy
+      };
+    };
+
+    const get$1 = editor => {
+      const dom = editor.dom;
+      const schemaType = editor.schema.type;
+      const formats = {
+        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: false,
+            classes: 'align-left',
+            ceFalseOverride: true,
+            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: false,
+            preview: false
+          },
+          {
+            selector: 'img,audio,video',
+            collapsed: false,
+            styles: { float: 'left' },
+            preview: 'font-family font-size'
+          },
+          {
+            selector: 'table',
+            collapsed: false,
+            styles: {
+              marginLeft: '0px',
+              marginRight: 'auto'
+            },
+            onformat: table => {
+              dom.setStyle(table, 'float', null);
+            },
+            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: false,
+            preview: 'font-family font-size'
+          },
+          {
+            selector: 'figure.image',
+            collapsed: false,
+            classes: 'align-center',
+            ceFalseOverride: true,
+            preview: 'font-family font-size'
+          },
+          {
+            selector: 'img,audio,video',
+            collapsed: false,
+            styles: {
+              display: 'block',
+              marginLeft: 'auto',
+              marginRight: 'auto'
+            },
+            preview: false
+          },
+          {
+            selector: 'table',
+            collapsed: false,
+            styles: {
+              marginLeft: 'auto',
+              marginRight: 'auto'
+            },
+            preview: 'font-family font-size'
+          }
+        ],
+        alignright: [
+          {
+            selector: 'figure.image',
+            collapsed: false,
+            classes: 'align-right',
+            ceFalseOverride: true,
+            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: false,
+            preview: 'font-family font-size'
+          },
+          {
+            selector: 'img,audio,video',
+            collapsed: false,
+            styles: { float: 'right' },
+            preview: 'font-family font-size'
+          },
+          {
+            selector: 'table',
+            collapsed: false,
+            styles: {
+              marginRight: '0px',
+              marginLeft: 'auto'
+            },
+            onformat: table => {
+              dom.setStyle(table, 'float', null);
+            },
+            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: false,
+            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: true
+          },
+          {
+            inline: 'u',
+            remove: 'all',
+            preserve_attributes: [
+              'class',
+              'style'
+            ]
+          }
+        ],
+        strikethrough: (() => {
+          const span = {
+            inline: 'span',
+            styles: { textDecoration: 'line-through' },
+            exact: true
+          };
+          const strike = {
+            inline: 'strike',
+            remove: 'all',
+            preserve_attributes: [
+              'class',
+              'style'
+            ]
+          };
+          const s = {
+            inline: 's',
+            remove: 'all',
+            preserve_attributes: [
+              'class',
+              'style'
+            ]
+          };
+          return schemaType !== 'html4' ? [
+            s,
+            span,
+            strike
+          ] : [
+            span,
+            s,
+            strike
+          ];
+        })(),
+        forecolor: {
+          inline: 'span',
+          styles: { color: '%value' },
+          links: true,
+          remove_similar: true,
+          clear_child_styles: true
+        },
+        hilitecolor: {
+          inline: 'span',
+          styles: { backgroundColor: '%value' },
+          links: true,
+          remove_similar: true,
+          clear_child_styles: true
+        },
+        fontname: {
+          inline: 'span',
+          toggle: false,
+          styles: { fontFamily: '%value' },
+          clear_child_styles: true
+        },
+        fontsize: {
+          inline: 'span',
+          toggle: false,
+          styles: { fontSize: '%value' },
+          clear_child_styles: true
+        },
+        lineheight: {
+          selector: 'h1,h2,h3,h4,h5,h6,p,li,td,th,div',
+          styles: { lineHeight: '%value' }
+        },
+        fontsize_class: {
+          inline: 'span',
+          attributes: { class: '%value' }
+        },
+        blockquote: {
+          block: 'blockquote',
+          wrapper: true,
+          remove: 'all'
+        },
+        subscript: { inline: 'sub' },
+        superscript: { inline: 'sup' },
+        code: { inline: 'code' },
+        link: {
+          inline: 'a',
+          selector: 'a',
+          remove: 'all',
+          split: true,
+          deep: true,
+          onmatch: (node, _fmt, _itemName) => {
+            return isElement$6(node) && node.hasAttribute('href');
+          },
+          onformat: (elm, _fmt, vars) => {
+            Tools.each(vars, (value, key) => {
+              dom.setAttrib(elm, key, value);
+            });
+          }
+        },
+        lang: {
+          inline: 'span',
+          clear_child_styles: true,
+          remove_similar: true,
+          attributes: {
+            'lang': '%value',
+            'data-mce-lang': vars => {
+              var _a;
+              return (_a = vars === null || vars === void 0 ? void 0 : vars.customValue) !== null && _a !== void 0 ? _a : 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: true,
+            expand: false,
+            block_expand: true,
+            deep: true
+          },
+          {
+            selector: 'span',
+            attributes: [
+              'style',
+              'class'
+            ],
+            remove: 'empty',
+            split: true,
+            expand: false,
+            deep: true
+          },
+          {
+            selector: '*',
+            attributes: [
+              'style',
+              'class'
+            ],
+            split: false,
+            expand: false,
+            deep: true
+          }
+        ]
+      };
+      Tools.each('p h1 h2 h3 h4 h5 h6 div address pre dt dd samp'.split(/\s/), name => {
+        formats[name] = {
+          block: name,
+          remove: 'all'
+        };
+      });
+      return formats;
+    };
+
+    const genericBase = {
+      remove_similar: true,
+      inherit: false
+    };
+    const cellBase = {
+      selector: 'td,th',
+      ...genericBase
+    };
+    const cellFormats = {
+      tablecellbackgroundcolor: {
+        styles: { backgroundColor: '%value' },
+        ...cellBase
+      },
+      tablecellverticalalign: {
+        styles: { 'vertical-align': '%value' },
+        ...cellBase
+      },
+      tablecellbordercolor: {
+        styles: { borderColor: '%value' },
+        ...cellBase
+      },
+      tablecellclass: {
+        classes: ['%value'],
+        ...cellBase
+      },
+      tableclass: {
+        selector: 'table',
+        classes: ['%value'],
+        ...genericBase
+      },
+      tablecellborderstyle: {
+        styles: { borderStyle: '%value' },
+        ...cellBase
+      },
+      tablecellborderwidth: {
+        styles: { borderWidth: '%value' },
+        ...cellBase
+      }
+    };
+    const get = constant(cellFormats);
+
+    const FormatRegistry = editor => {
+      const formats = {};
+      const get$2 = name => isNonNullable(name) ? formats[name] : formats;
+      const has = name => has$2(formats, name);
+      const register = (name, format) => {
+        if (name) {
+          if (!isString(name)) {
+            each$f(name, (format, name) => {
+              register(name, format);
+            });
+          } else {
+            if (!isArray$1(format)) {
+              format = [format];
+            }
+            each$g(format, format => {
+              if (isUndefined(format.deep)) {
+                format.deep = !isSelectorFormat(format);
+              }
+              if (isUndefined(format.split)) {
+                format.split = !isSelectorFormat(format) || isInlineFormat(format);
+              }
+              if (isUndefined(format.remove) && isSelectorFormat(format) && !isInlineFormat(format)) {
+                format.remove = 'none';
+              }
+              if (isSelectorFormat(format) && isInlineFormat(format)) {
+                format.mixed = true;
+                format.block_expand = true;
+              }
+              if (isString(format.classes)) {
+                format.classes = format.classes.split(/\s+/);
+              }
+            });
+            formats[name] = format;
+          }
+        }
+      };
+      const unregister = name => {
+        if (name && formats[name]) {
+          delete formats[name];
+        }
+        return formats;
+      };
+      register(get$1(editor));
+      register(get());
+      register(getFormats(editor));
+      return {
+        get: get$2,
+        has,
+        register,
+        unregister
+      };
+    };
+
+    const each$3 = Tools.each;
+    const dom = DOMUtils.DOM;
+    const parsedSelectorToHtml = (ancestry, editor) => {
+      let elm, item, fragment;
+      const schema = editor && editor.schema || Schema({});
+      const decorate = (elm, item) => {
+        if (item.classes.length) {
+          dom.addClass(elm, item.classes.join(' '));
+        }
+        dom.setAttribs(elm, item.attrs);
+      };
+      const createElement = sItem => {
+        item = typeof sItem === 'string' ? {
+          name: sItem,
+          classes: [],
+          attrs: {}
+        } : sItem;
+        const elm = dom.create(item.name);
+        decorate(elm, item);
+        return elm;
+      };
+      const getRequiredParent = (elm, candidate) => {
+        const name = typeof elm !== 'string' ? elm.nodeName.toLowerCase() : elm;
+        const elmRule = schema.getElementRule(name);
+        const parentsRequired = elmRule && elmRule.parentsRequired;
+        if (parentsRequired && parentsRequired.length) {
+          return candidate && Tools.inArray(parentsRequired, candidate) !== -1 ? candidate : parentsRequired[0];
+        } else {
+          return false;
+        }
+      };
+      const wrapInHtml = (elm, ancestry, siblings) => {
+        let parent, parentCandidate;
+        const ancestor = ancestry.length > 0 && ancestry[0];
+        const ancestorName = ancestor && ancestor.name;
+        const parentRequired = getRequiredParent(elm, ancestorName);
+        if (parentRequired) {
+          if (ancestorName === parentRequired) {
+            parentCandidate = ancestry[0];
+            ancestry = ancestry.slice(1);
+          } else {
+            parentCandidate = parentRequired;
+          }
+        } else if (ancestor) {
+          parentCandidate = ancestry[0];
+          ancestry = ancestry.slice(1);
+        } else if (!siblings) {
+          return elm;
+        }
+        if (parentCandidate) {
+          parent = createElement(parentCandidate);
+          parent.appendChild(elm);
+        }
+        if (siblings) {
+          if (!parent) {
+            parent = dom.create('div');
+            parent.appendChild(elm);
+          }
+          Tools.each(siblings, sibling => {
+            const siblingElm = createElement(sibling);
+            parent.insertBefore(siblingElm, elm);
+          });
+        }
+        return wrapInHtml(parent, ancestry, parentCandidate && parentCandidate.siblings);
+      };
+      if (ancestry && ancestry.length) {
+        item = ancestry[0];
+        elm = createElement(item);
+        fragment = dom.create('div');
+        fragment.appendChild(wrapInHtml(elm, ancestry.slice(1), item.siblings));
+        return fragment;
+      } else {
+        return '';
+      }
+    };
+    const parseSelectorItem = item => {
+      let tagName;
+      const obj = {
+        classes: [],
+        attrs: {}
+      };
+      item = obj.selector = Tools.trim(item);
+      if (item !== '*') {
+        tagName = item.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g, ($0, $1, $2, $3, $4) => {
+          switch ($1) {
+          case '#':
+            obj.attrs.id = $2;
+            break;
+          case '.':
+            obj.classes.push($2);
+            break;
+          case ':':
+            if (Tools.inArray('checked disabled enabled read-only required'.split(' '), $2) !== -1) {
+              obj.attrs[$2] = $2;
+            }
+            break;
+          }
+          if ($3 === '[') {
+            const m = $4.match(/([\w\-]+)(?:\=\"([^\"]+))?/);
+            if (m) {
+              obj.attrs[m[1]] = m[2];
+            }
+          }
+          return '';
+        });
+      }
+      obj.name = tagName || 'div';
+      return obj;
+    };
+    const parseSelector = selector => {
+      if (!selector || typeof selector !== 'string') {
+        return [];
+      }
+      selector = selector.split(/\s*,\s*/)[0];
+      selector = selector.replace(/\s*(~\+|~|\+|>)\s*/g, '$1');
+      return Tools.map(selector.split(/(?:>|\s+(?![^\[\]]+\]))/), item => {
+        const siblings = Tools.map(item.split(/(?:~\+|~|\+)/), parseSelectorItem);
+        const obj = siblings.pop();
+        if (siblings.length) {
+          obj.siblings = siblings;
+        }
+        return obj;
+      }).reverse();
+    };
+    const getCssText = (editor, format) => {
+      let name, previewFrag;
+      let previewCss = '', parentFontSize;
+      let previewStyles = getPreviewStyles(editor);
+      if (previewStyles === '') {
+        return '';
+      }
+      const removeVars = val => {
+        return val.replace(/%(\w+)/g, '');
+      };
+      if (typeof format === 'string') {
+        format = editor.formatter.get(format);
+        if (!format) {
+          return;
+        }
+        format = format[0];
+      }
+      if ('preview' in format) {
+        const previewOpt = get$a(format, 'preview');
+        if (is$2(previewOpt, false)) {
+          return '';
+        } else {
+          previewStyles = previewOpt.getOr(previewStyles);
+        }
+      }
+      name = format.block || format.inline || 'span';
+      const items = parseSelector(format.selector);
+      if (items.length) {
+        if (!items[0].name) {
+          items[0].name = name;
+        }
+        name = format.selector;
+        previewFrag = parsedSelectorToHtml(items, editor);
+      } else {
+        previewFrag = parsedSelectorToHtml([name], editor);
+      }
+      const previewElm = dom.select(name, previewFrag)[0] || previewFrag.firstChild;
+      each$3(format.styles, (value, name) => {
+        const newValue = removeVars(value);
+        if (newValue) {
+          dom.setStyle(previewElm, name, newValue);
+        }
+      });
+      each$3(format.attributes, (value, name) => {
+        const newValue = removeVars(value);
+        if (newValue) {
+          dom.setAttrib(previewElm, name, newValue);
+        }
+      });
+      each$3(format.classes, value => {
+        const newValue = removeVars(value);
+        if (!dom.hasClass(previewElm, newValue)) {
+          dom.addClass(previewElm, newValue);
+        }
+      });
+      editor.dispatch('PreviewFormats');
+      dom.setStyles(previewFrag, {
+        position: 'absolute',
+        left: -65535
+      });
+      editor.getBody().appendChild(previewFrag);
+      parentFontSize = dom.getStyle(editor.getBody(), 'fontSize', true);
+      parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;
+      each$3(previewStyles.split(' '), name => {
+        let value = dom.getStyle(previewElm, name, true);
+        if (name === 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) {
+          value = dom.getStyle(editor.getBody(), name, true);
+          if (rgbaToHexString(value).toLowerCase() === '#ffffff') {
+            return;
+          }
+        }
+        if (name === 'color') {
+          if (rgbaToHexString(value).toLowerCase() === '#000000') {
+            return;
+          }
+        }
+        if (name === 'font-size') {
+          if (/em|%$/.test(value)) {
+            if (parentFontSize === 0) {
+              return;
+            }
+            const numValue = parseFloat(value) / (/%$/.test(value) ? 100 : 1);
+            value = numValue * parentFontSize + 'px';
+          }
+        }
+        if (name === 'border' && value) {
+          previewCss += 'padding:0 2px;';
+        }
+        previewCss += name + ':' + value + ';';
+      });
+      editor.dispatch('AfterPreviewFormats');
+      dom.remove(previewFrag);
+      return previewCss;
+    };
+
+    const setup$r = editor => {
+      editor.addShortcut('meta+b', '', 'Bold');
+      editor.addShortcut('meta+i', '', 'Italic');
+      editor.addShortcut('meta+u', '', 'Underline');
+      for (let i = 1; i <= 6; i++) {
+        editor.addShortcut('access+' + i, '', [
+          'FormatBlock',
+          false,
+          'h' + i
+        ]);
+      }
+      editor.addShortcut('access+7', '', [
+        'FormatBlock',
+        false,
+        'p'
+      ]);
+      editor.addShortcut('access+8', '', [
+        'FormatBlock',
+        false,
+        'div'
+      ]);
+      editor.addShortcut('access+9', '', [
+        'FormatBlock',
+        false,
+        'address'
+      ]);
+    };
+
+    const Formatter = editor => {
+      const formats = FormatRegistry(editor);
+      const formatChangeState = Cell(null);
+      setup$r(editor);
+      setup$u(editor);
+      return {
+        get: formats.get,
+        has: formats.has,
+        register: formats.register,
+        unregister: formats.unregister,
+        apply: (name, vars, node) => {
+          applyFormat(editor, name, vars, node);
+        },
+        remove: (name, vars, node, similar) => {
+          removeFormat(editor, name, vars, node, similar);
+        },
+        toggle: (name, vars, node) => {
+          toggleFormat(editor, name, vars, node);
+        },
+        match: (name, vars, node, similar) => matchFormat(editor, name, vars, node, similar),
+        closest: names => closestFormat(editor, names),
+        matchAll: (names, vars) => matchAllFormats(editor, names, vars),
+        matchNode: (node, name, vars, similar) => matchNodeFormat(editor, node, name, vars, similar),
+        canApply: name => canApplyFormat(editor, name),
+        formatChanged: (formats, callback, similar, vars) => formatChanged(editor, formatChangeState, formats, callback, similar, vars),
+        getCssText: curry(getCssText, editor)
+      };
+    };
+
+    const shouldIgnoreCommand = cmd => {
+      switch (cmd.toLowerCase()) {
+      case 'undo':
+      case 'redo':
+      case 'mcefocus':
+        return true;
+      default:
+        return false;
+      }
+    };
+    const registerEvents = (editor, undoManager, locks) => {
+      const isFirstTypedCharacter = Cell(false);
+      const addNonTypingUndoLevel = e => {
+        setTyping(undoManager, false, locks);
+        undoManager.add({}, e);
+      };
+      editor.on('init', () => {
+        undoManager.add();
+      });
+      editor.on('BeforeExecCommand', e => {
+        const cmd = e.command;
+        if (!shouldIgnoreCommand(cmd)) {
+          endTyping(undoManager, locks);
+          undoManager.beforeChange();
+        }
+      });
+      editor.on('ExecCommand', e => {
+        const cmd = e.command;
+        if (!shouldIgnoreCommand(cmd)) {
+          addNonTypingUndoLevel(e);
+        }
+      });
+      editor.on('ObjectResizeStart cut', () => {
+        undoManager.beforeChange();
+      });
+      editor.on('SaveContent ObjectResized blur', addNonTypingUndoLevel);
+      editor.on('dragend', addNonTypingUndoLevel);
+      editor.on('keyup', e => {
+        const keyCode = e.keyCode;
+        if (e.isDefaultPrevented()) {
+          return;
+        }
+        if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45 || e.ctrlKey) {
+          addNonTypingUndoLevel();
+          editor.nodeChanged();
+        }
+        if (keyCode === 46 || keyCode === 8) {
+          editor.nodeChanged();
+        }
+        if (isFirstTypedCharacter.get() && undoManager.typing && isEq$1(createFromEditor(editor), undoManager.data[0]) === false) {
+          if (editor.isDirty() === false) {
+            editor.setDirty(true);
+          }
+          editor.dispatch('TypingUndo');
+          isFirstTypedCharacter.set(false);
+          editor.nodeChanged();
+        }
+      });
+      editor.on('keydown', e => {
+        const keyCode = e.keyCode;
+        if (e.isDefaultPrevented()) {
+          return;
+        }
+        if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45) {
+          if (undoManager.typing) {
+            addNonTypingUndoLevel(e);
+          }
+          return;
+        }
+        const modKey = e.ctrlKey && !e.altKey || e.metaKey;
+        if ((keyCode < 16 || keyCode > 20) && keyCode !== 224 && keyCode !== 91 && !undoManager.typing && !modKey) {
+          undoManager.beforeChange();
+          setTyping(undoManager, true, locks);
+          undoManager.add({}, e);
+          isFirstTypedCharacter.set(true);
+        }
+      });
+      editor.on('mousedown', e => {
+        if (undoManager.typing) {
+          addNonTypingUndoLevel(e);
+        }
+      });
+      const isInsertReplacementText = event => event.inputType === 'insertReplacementText';
+      const isInsertTextDataNull = event => event.inputType === 'insertText' && event.data === null;
+      const isInsertFromPasteOrDrop = event => event.inputType === 'insertFromPaste' || event.inputType === 'insertFromDrop';
+      editor.on('input', e => {
+        if (e.inputType && (isInsertReplacementText(e) || isInsertTextDataNull(e) || isInsertFromPasteOrDrop(e))) {
+          addNonTypingUndoLevel(e);
+        }
+      });
+      editor.on('AddUndo Undo Redo ClearUndos', e => {
+        if (!e.isDefaultPrevented()) {
+          editor.nodeChanged();
+        }
+      });
+    };
+    const addKeyboardShortcuts = editor => {
+      editor.addShortcut('meta+z', '', 'Undo');
+      editor.addShortcut('meta+y,meta+shift+z', '', 'Redo');
+    };
+
+    const UndoManager = editor => {
+      const beforeBookmark = value$2();
+      const locks = Cell(0);
+      const index = Cell(0);
+      const undoManager = {
+        data: [],
+        typing: false,
+        beforeChange: () => {
+          beforeChange(editor, locks, beforeBookmark);
+        },
+        add: (level, event) => {
+          return addUndoLevel(editor, undoManager, index, locks, beforeBookmark, level, event);
+        },
+        undo: () => {
+          return undo(editor, undoManager, locks, index);
+        },
+        redo: () => {
+          return redo(editor, index, undoManager.data);
+        },
+        clear: () => {
+          clear(editor, undoManager, index);
+        },
+        reset: () => {
+          reset(editor, undoManager);
+        },
+        hasUndo: () => {
+          return hasUndo(editor, undoManager, index);
+        },
+        hasRedo: () => {
+          return hasRedo(editor, undoManager, index);
+        },
+        transact: callback => {
+          return transact(editor, undoManager, locks, callback);
+        },
+        ignore: callback => {
+          ignore(editor, locks, callback);
+        },
+        extra: (callback1, callback2) => {
+          extra(editor, undoManager, index, callback1, callback2);
+        }
+      };
+      if (!isRtc(editor)) {
+        registerEvents(editor, undoManager, locks);
+      }
+      addKeyboardShortcuts(editor);
+      return undoManager;
+    };
+
+    const nonTypingKeycodes = [
+      9,
+      27,
+      VK.HOME,
+      VK.END,
+      19,
+      20,
+      44,
+      144,
+      145,
+      33,
+      34,
+      45,
+      16,
+      17,
+      18,
+      91,
+      92,
+      93,
+      VK.DOWN,
+      VK.UP,
+      VK.LEFT,
+      VK.RIGHT
+    ].concat(Env.browser.isFirefox() ? [224] : []);
+    const placeholderAttr = 'data-mce-placeholder';
+    const isKeyboardEvent = e => e.type === 'keydown' || e.type === 'keyup';
+    const isDeleteEvent = e => {
+      const keyCode = e.keyCode;
+      return keyCode === VK.BACKSPACE || keyCode === VK.DELETE;
+    };
+    const isNonTypingKeyboardEvent = e => {
+      if (isKeyboardEvent(e)) {
+        const keyCode = e.keyCode;
+        return !isDeleteEvent(e) && (VK.metaKeyPressed(e) || e.altKey || keyCode >= 112 && keyCode <= 123 || contains$2(nonTypingKeycodes, keyCode));
+      } else {
+        return false;
+      }
+    };
+    const isTypingKeyboardEvent = e => isKeyboardEvent(e) && !(isDeleteEvent(e) || e.type === 'keyup' && e.keyCode === 229);
+    const isVisuallyEmpty = (dom, rootElm, forcedRootBlock) => {
+      if (isEmpty$2(SugarElement.fromDom(rootElm), false)) {
+        const firstElement = rootElm.firstElementChild;
+        if (!firstElement) {
+          return true;
+        } else if (dom.getStyle(rootElm.firstElementChild, 'padding-left') || dom.getStyle(rootElm.firstElementChild, 'padding-right')) {
+          return false;
+        } else {
+          return forcedRootBlock === firstElement.nodeName.toLowerCase();
+        }
+      } else {
+        return false;
+      }
+    };
+    const setup$q = editor => {
+      const dom = editor.dom;
+      const rootBlock = getForcedRootBlock(editor);
+      const placeholder = getPlaceholder(editor);
+      const updatePlaceholder = (e, initial) => {
+        if (isNonTypingKeyboardEvent(e)) {
+          return;
+        }
+        const body = editor.getBody();
+        const showPlaceholder = isTypingKeyboardEvent(e) ? false : isVisuallyEmpty(dom, body, rootBlock);
+        const isPlaceholderShown = dom.getAttrib(body, placeholderAttr) !== '';
+        if (isPlaceholderShown !== showPlaceholder || initial) {
+          dom.setAttrib(body, placeholderAttr, showPlaceholder ? placeholder : null);
+          dom.setAttrib(body, 'aria-placeholder', showPlaceholder ? placeholder : null);
+          firePlaceholderToggle(editor, showPlaceholder);
+          editor.on(showPlaceholder ? 'keydown' : 'keyup', updatePlaceholder);
+          editor.off(showPlaceholder ? 'keyup' : 'keydown', updatePlaceholder);
+        }
+      };
+      if (placeholder) {
+        editor.on('init', e => {
+          updatePlaceholder(e, true);
+          editor.on('change SetContent ExecCommand', updatePlaceholder);
+          editor.on('paste', e => Delay.setEditorTimeout(editor, () => updatePlaceholder(e)));
+        });
+      }
+    };
+
+    const strongRtl = /[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/;
+    const hasStrongRtl = text => strongRtl.test(text);
+
+    const isInlineTarget = (editor, elm) => is$1(SugarElement.fromDom(elm), getInlineBoundarySelector(editor));
+    const isRtl = element => DOMUtils.DOM.getStyle(element, 'direction', true) === 'rtl' || hasStrongRtl(element.textContent);
+    const findInlineParents = (isInlineTarget, rootNode, pos) => filter$6(DOMUtils.DOM.getParents(pos.container(), '*', rootNode), isInlineTarget);
+    const findRootInline = (isInlineTarget, rootNode, pos) => {
+      const parents = findInlineParents(isInlineTarget, rootNode, pos);
+      return Optional.from(parents[parents.length - 1]);
+    };
+    const hasSameParentBlock = (rootNode, node1, node2) => {
+      const block1 = getParentBlock$3(node1, rootNode);
+      const block2 = getParentBlock$3(node2, rootNode);
+      return block1 && block1 === block2;
+    };
+    const isAtZwsp = pos => isBeforeInline(pos) || isAfterInline(pos);
+    const normalizePosition = (forward, pos) => {
+      if (!pos) {
+        return pos;
+      }
+      const container = pos.container(), offset = pos.offset();
+      if (forward) {
+        if (isCaretContainerInline(container)) {
+          if (isText$8(container.nextSibling)) {
+            return CaretPosition(container.nextSibling, 0);
+          } else {
+            return CaretPosition.after(container);
+          }
+        } else {
+          return isBeforeInline(pos) ? CaretPosition(container, offset + 1) : pos;
+        }
+      } else {
+        if (isCaretContainerInline(container)) {
+          if (isText$8(container.previousSibling)) {
+            return CaretPosition(container.previousSibling, container.previousSibling.data.length);
+          } else {
+            return CaretPosition.before(container);
+          }
+        } else {
+          return isAfterInline(pos) ? CaretPosition(container, offset - 1) : pos;
+        }
+      }
+    };
+    const normalizeForwards = curry(normalizePosition, true);
+    const normalizeBackwards = curry(normalizePosition, false);
+
+    const execCommandIgnoreInputEvents = (editor, command) => {
+      const inputBlocker = e => e.stopImmediatePropagation();
+      editor.on('beforeinput input', inputBlocker, true);
+      editor.getDoc().execCommand(command);
+      editor.off('beforeinput input', inputBlocker);
+    };
+    const execDeleteCommand = editor => execCommandIgnoreInputEvents(editor, 'Delete');
+    const execForwardDeleteCommand = editor => execCommandIgnoreInputEvents(editor, 'ForwardDelete');
+    const isBeforeRoot = rootNode => elm => eq(rootNode, SugarElement.fromDom(elm.dom.parentNode));
+    const isTextBlockOrListItem = element => isTextBlock$2(element) || isListItem(element);
+    const getParentBlock$2 = (rootNode, elm) => {
+      if (contains(rootNode, elm)) {
+        return closest$4(elm, isTextBlockOrListItem, isBeforeRoot(rootNode));
+      } else {
+        return Optional.none();
+      }
+    };
+    const placeCaretInEmptyBody = editor => {
+      const body = editor.getBody();
+      const node = body.firstChild && editor.dom.isBlock(body.firstChild) ? body.firstChild : body;
+      editor.selection.setCursorLocation(node, 0);
+    };
+    const paddEmptyBody = editor => {
+      if (editor.dom.isEmpty(editor.getBody())) {
+        editor.setContent('');
+        placeCaretInEmptyBody(editor);
+      }
+    };
+    const willDeleteLastPositionInElement = (forward, fromPos, elm) => lift2(firstPositionIn(elm), lastPositionIn(elm), (firstPos, lastPos) => {
+      const normalizedFirstPos = normalizePosition(true, firstPos);
+      const normalizedLastPos = normalizePosition(false, lastPos);
+      const normalizedFromPos = normalizePosition(false, fromPos);
+      if (forward) {
+        return nextPosition(elm, normalizedFromPos).exists(nextPos => nextPos.isEqual(normalizedLastPos) && fromPos.isEqual(normalizedFirstPos));
+      } else {
+        return prevPosition(elm, normalizedFromPos).exists(prevPos => prevPos.isEqual(normalizedFirstPos) && fromPos.isEqual(normalizedLastPos));
+      }
+    }).getOr(true);
+
+    const blockPosition = (block, position) => ({
+      block,
+      position
+    });
+    const blockBoundary = (from, to) => ({
+      from,
+      to
+    });
+    const getBlockPosition = (rootNode, pos) => {
+      const rootElm = SugarElement.fromDom(rootNode);
+      const containerElm = SugarElement.fromDom(pos.container());
+      return getParentBlock$2(rootElm, containerElm).map(block => blockPosition(block, pos));
+    };
+    const isDifferentBlocks = blockBoundary => eq(blockBoundary.from.block, blockBoundary.to.block) === false;
+    const hasSameParent = blockBoundary => parent(blockBoundary.from.block).bind(parent1 => parent(blockBoundary.to.block).filter(parent2 => eq(parent1, parent2))).isSome();
+    const isEditable$2 = blockBoundary => isContentEditableFalse$a(blockBoundary.from.block.dom) === false && isContentEditableFalse$a(blockBoundary.to.block.dom) === false;
+    const skipLastBr = (rootNode, forward, blockPosition) => {
+      if (isBr$5(blockPosition.position.getNode()) && isEmpty$2(blockPosition.block) === false) {
+        return positionIn(false, blockPosition.block.dom).bind(lastPositionInBlock => {
+          if (lastPositionInBlock.isEqual(blockPosition.position)) {
+            return fromPosition(forward, rootNode, lastPositionInBlock).bind(to => getBlockPosition(rootNode, to));
+          } else {
+            return Optional.some(blockPosition);
+          }
+        }).getOr(blockPosition);
+      } else {
+        return blockPosition;
+      }
+    };
+    const readFromRange = (rootNode, forward, rng) => {
+      const fromBlockPos = getBlockPosition(rootNode, CaretPosition.fromRangeStart(rng));
+      const toBlockPos = fromBlockPos.bind(blockPos => fromPosition(forward, rootNode, blockPos.position).bind(to => getBlockPosition(rootNode, to).map(blockPos => skipLastBr(rootNode, forward, blockPos))));
+      return lift2(fromBlockPos, toBlockPos, blockBoundary).filter(blockBoundary => isDifferentBlocks(blockBoundary) && hasSameParent(blockBoundary) && isEditable$2(blockBoundary));
+    };
+    const read$1 = (rootNode, forward, rng) => rng.collapsed ? readFromRange(rootNode, forward, rng) : Optional.none();
+
+    const getChildrenUntilBlockBoundary = block => {
+      const children$1 = children(block);
+      return findIndex$2(children$1, isBlock$2).fold(constant(children$1), index => children$1.slice(0, index));
+    };
+    const extractChildren = block => {
+      const children = getChildrenUntilBlockBoundary(block);
+      each$g(children, remove$5);
+      return children;
+    };
+    const removeEmptyRoot = (rootNode, block) => {
+      const parents = parentsAndSelf(block, rootNode);
+      return find$2(parents.reverse(), element => isEmpty$2(element)).each(remove$5);
+    };
+    const isEmptyBefore = el => filter$6(prevSiblings(el), el => !isEmpty$2(el)).length === 0;
+    const nestedBlockMerge = (rootNode, fromBlock, toBlock, insertionPoint) => {
+      if (isEmpty$2(toBlock)) {
+        fillWithPaddingBr(toBlock);
+        return firstPositionIn(toBlock.dom);
+      }
+      if (isEmptyBefore(insertionPoint) && isEmpty$2(fromBlock)) {
+        before$3(insertionPoint, SugarElement.fromTag('br'));
+      }
+      const position = prevPosition(toBlock.dom, CaretPosition.before(insertionPoint.dom));
+      each$g(extractChildren(fromBlock), child => {
+        before$3(insertionPoint, child);
+      });
+      removeEmptyRoot(rootNode, fromBlock);
+      return position;
+    };
+    const sidelongBlockMerge = (rootNode, fromBlock, toBlock) => {
+      if (isEmpty$2(toBlock)) {
+        remove$5(toBlock);
+        if (isEmpty$2(fromBlock)) {
+          fillWithPaddingBr(fromBlock);
+        }
+        return firstPositionIn(fromBlock.dom);
+      }
+      const position = lastPositionIn(toBlock.dom);
+      each$g(extractChildren(fromBlock), child => {
+        append$1(toBlock, child);
+      });
+      removeEmptyRoot(rootNode, fromBlock);
+      return position;
+    };
+    const findInsertionPoint = (toBlock, block) => {
+      const parentsAndSelf$1 = parentsAndSelf(block, toBlock);
+      return Optional.from(parentsAndSelf$1[parentsAndSelf$1.length - 1]);
+    };
+    const getInsertionPoint = (fromBlock, toBlock) => contains(toBlock, fromBlock) ? findInsertionPoint(toBlock, fromBlock) : Optional.none();
+    const trimBr = (first, block) => {
+      positionIn(first, block.dom).map(position => position.getNode()).map(SugarElement.fromDom).filter(isBr$4).each(remove$5);
+    };
+    const mergeBlockInto = (rootNode, fromBlock, toBlock) => {
+      trimBr(true, fromBlock);
+      trimBr(false, toBlock);
+      return getInsertionPoint(fromBlock, toBlock).fold(curry(sidelongBlockMerge, rootNode, fromBlock, toBlock), curry(nestedBlockMerge, rootNode, fromBlock, toBlock));
+    };
+    const mergeBlocks = (rootNode, forward, block1, block2) => forward ? mergeBlockInto(rootNode, block2, block1) : mergeBlockInto(rootNode, block1, block2);
+
+    const backspaceDelete$8 = (editor, forward) => {
+      const rootNode = SugarElement.fromDom(editor.getBody());
+      const position = read$1(rootNode.dom, forward, editor.selection.getRng()).map(blockBoundary => () => {
+        mergeBlocks(rootNode, forward, blockBoundary.from.block, blockBoundary.to.block).each(pos => {
+          editor.selection.setRng(pos.toRange());
+        });
+      });
+      return position;
+    };
+
+    const deleteRangeMergeBlocks = (rootNode, selection) => {
+      const rng = selection.getRng();
+      return lift2(getParentBlock$2(rootNode, SugarElement.fromDom(rng.startContainer)), getParentBlock$2(rootNode, SugarElement.fromDom(rng.endContainer)), (block1, block2) => {
+        if (eq(block1, block2) === false) {
+          return Optional.some(() => {
+            rng.deleteContents();
+            mergeBlocks(rootNode, true, block1, block2).each(pos => {
+              selection.setRng(pos.toRange());
+            });
+          });
+        } else {
+          return Optional.none();
+        }
+      }).getOr(Optional.none());
+    };
+    const isRawNodeInTable = (root, rawNode) => {
+      const node = SugarElement.fromDom(rawNode);
+      const isRoot = curry(eq, root);
+      return ancestor$3(node, isTableCell$4, isRoot).isSome();
+    };
+    const isSelectionInTable = (root, rng) => isRawNodeInTable(root, rng.startContainer) || isRawNodeInTable(root, rng.endContainer);
+    const isEverythingSelected = (root, rng) => {
+      const noPrevious = prevPosition(root.dom, CaretPosition.fromRangeStart(rng)).isNone();
+      const noNext = nextPosition(root.dom, CaretPosition.fromRangeEnd(rng)).isNone();
+      return !isSelectionInTable(root, rng) && noPrevious && noNext;
+    };
+    const emptyEditor = editor => {
+      return Optional.some(() => {
+        editor.setContent('');
+        editor.selection.setCursorLocation();
+      });
+    };
+    const deleteRange$1 = editor => {
+      const rootNode = SugarElement.fromDom(editor.getBody());
+      const rng = editor.selection.getRng();
+      return isEverythingSelected(rootNode, rng) ? emptyEditor(editor) : deleteRangeMergeBlocks(rootNode, editor.selection);
+    };
+    const backspaceDelete$7 = (editor, _forward) => editor.selection.isCollapsed() ? Optional.none() : deleteRange$1(editor);
+
+    const isContentEditableTrue$1 = isContentEditableTrue$4;
+    const isContentEditableFalse$4 = isContentEditableFalse$a;
+    const showCaret = (direction, editor, node, before, scrollIntoView) => Optional.from(editor._selectionOverrides.showCaret(direction, node, before, scrollIntoView));
+    const getNodeRange = node => {
+      const rng = node.ownerDocument.createRange();
+      rng.selectNode(node);
+      return rng;
+    };
+    const selectNode = (editor, node) => {
+      const e = editor.dispatch('BeforeObjectSelected', { target: node });
+      if (e.isDefaultPrevented()) {
+        return Optional.none();
+      }
+      return Optional.some(getNodeRange(node));
+    };
+    const renderCaretAtRange = (editor, range, scrollIntoView) => {
+      const normalizedRange = normalizeRange(1, editor.getBody(), range);
+      const caretPosition = CaretPosition.fromRangeStart(normalizedRange);
+      const caretPositionNode = caretPosition.getNode();
+      if (isInlineFakeCaretTarget(caretPositionNode)) {
+        return showCaret(1, editor, caretPositionNode, !caretPosition.isAtEnd(), false);
+      }
+      const caretPositionBeforeNode = caretPosition.getNode(true);
+      if (isInlineFakeCaretTarget(caretPositionBeforeNode)) {
+        return showCaret(1, editor, caretPositionBeforeNode, false, false);
+      }
+      const ceRoot = editor.dom.getParent(caretPosition.getNode(), node => isContentEditableFalse$4(node) || isContentEditableTrue$1(node));
+      if (isInlineFakeCaretTarget(ceRoot)) {
+        return showCaret(1, editor, ceRoot, false, scrollIntoView);
+      }
+      return Optional.none();
+    };
+    const renderRangeCaret = (editor, range, scrollIntoView) => range.collapsed ? renderCaretAtRange(editor, range, scrollIntoView).getOr(range) : range;
+
+    const isBeforeBoundary = pos => isBeforeContentEditableFalse(pos) || isBeforeMedia(pos);
+    const isAfterBoundary = pos => isAfterContentEditableFalse(pos) || isAfterMedia(pos);
+    const trimEmptyTextNode = (dom, node) => {
+      if (isText$8(node) && node.data.length === 0) {
+        dom.remove(node);
+      }
+    };
+    const deleteContentAndShowCaret = (editor, range, node, direction, forward, peekCaretPosition) => {
+      showCaret(direction, editor, peekCaretPosition.getNode(!forward), forward, true).each(caretRange => {
+        if (range.collapsed) {
+          const deleteRange = range.cloneRange();
+          if (forward) {
+            deleteRange.setEnd(caretRange.startContainer, caretRange.startOffset);
+          } else {
+            deleteRange.setStart(caretRange.endContainer, caretRange.endOffset);
+          }
+          deleteRange.deleteContents();
+        } else {
+          range.deleteContents();
+        }
+        editor.selection.setRng(caretRange);
+      });
+      trimEmptyTextNode(editor.dom, node);
+    };
+    const deleteBoundaryText = (editor, forward) => {
+      const range = editor.selection.getRng();
+      if (!isText$8(range.commonAncestorContainer)) {
+        return Optional.none();
+      }
+      const direction = forward ? HDirection.Forwards : HDirection.Backwards;
+      const caretWalker = CaretWalker(editor.getBody());
+      const getNextPosFn = curry(getVisualCaretPosition, forward ? caretWalker.next : caretWalker.prev);
+      const isBeforeFn = forward ? isBeforeBoundary : isAfterBoundary;
+      const caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);
+      const nextCaretPosition = normalizePosition(forward, getNextPosFn(caretPosition));
+      if (!nextCaretPosition || !isMoveInsideSameBlock(caretPosition, nextCaretPosition)) {
+        return Optional.none();
+      } else if (isBeforeFn(nextCaretPosition)) {
+        return Optional.some(() => deleteContentAndShowCaret(editor, range, caretPosition.getNode(), direction, forward, nextCaretPosition));
+      }
+      const peekCaretPosition = getNextPosFn(nextCaretPosition);
+      if (peekCaretPosition && isBeforeFn(peekCaretPosition)) {
+        if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {
+          return Optional.some(() => deleteContentAndShowCaret(editor, range, caretPosition.getNode(), direction, forward, peekCaretPosition));
+        }
+      }
+      return Optional.none();
+    };
+    const backspaceDelete$6 = (editor, forward) => deleteBoundaryText(editor, forward);
+
+    const isCompoundElement = node => isTableCell$4(SugarElement.fromDom(node)) || isListItem(SugarElement.fromDom(node));
+    const DeleteAction = Adt.generate([
+      { remove: ['element'] },
+      { moveToElement: ['element'] },
+      { moveToPosition: ['position'] }
+    ]);
+    const isAtContentEditableBlockCaret = (forward, from) => {
+      const elm = from.getNode(forward === false);
+      const caretLocation = forward ? 'after' : 'before';
+      return isElement$6(elm) && elm.getAttribute('data-mce-caret') === caretLocation;
+    };
+    const isDeleteFromCefDifferentBlocks = (root, forward, from, to) => {
+      const inSameBlock = elm => isInline$1(SugarElement.fromDom(elm)) && !isInSameBlock(from, to, root);
+      return getRelativeCefElm(!forward, from).fold(() => getRelativeCefElm(forward, to).fold(never, inSameBlock), inSameBlock);
+    };
+    const deleteEmptyBlockOrMoveToCef = (root, forward, from, to) => {
+      const toCefElm = to.getNode(forward === false);
+      return getParentBlock$2(SugarElement.fromDom(root), SugarElement.fromDom(from.getNode())).map(blockElm => isEmpty$2(blockElm) ? DeleteAction.remove(blockElm.dom) : DeleteAction.moveToElement(toCefElm)).orThunk(() => Optional.some(DeleteAction.moveToElement(toCefElm)));
+    };
+    const findCefPosition = (root, forward, from) => fromPosition(forward, root, from).bind(to => {
+      if (isCompoundElement(to.getNode())) {
+        return Optional.none();
+      } else if (isDeleteFromCefDifferentBlocks(root, forward, from, to)) {
+        return Optional.none();
+      } else if (forward && isContentEditableFalse$a(to.getNode())) {
+        return deleteEmptyBlockOrMoveToCef(root, forward, from, to);
+      } else if (forward === false && isContentEditableFalse$a(to.getNode(true))) {
+        return deleteEmptyBlockOrMoveToCef(root, forward, from, to);
+      } else if (forward && isAfterContentEditableFalse(from)) {
+        return Optional.some(DeleteAction.moveToPosition(to));
+      } else if (forward === false && isBeforeContentEditableFalse(from)) {
+        return Optional.some(DeleteAction.moveToPosition(to));
+      } else {
+        return Optional.none();
+      }
+    });
+    const getContentEditableBlockAction = (forward, elm) => {
+      if (forward && isContentEditableFalse$a(elm.nextSibling)) {
+        return Optional.some(DeleteAction.moveToElement(elm.nextSibling));
+      } else if (forward === false && isContentEditableFalse$a(elm.previousSibling)) {
+        return Optional.some(DeleteAction.moveToElement(elm.previousSibling));
+      } else {
+        return Optional.none();
+      }
+    };
+    const skipMoveToActionFromInlineCefToContent = (root, from, deleteAction) => deleteAction.fold(elm => Optional.some(DeleteAction.remove(elm)), elm => Optional.some(DeleteAction.moveToElement(elm)), to => {
+      if (isInSameBlock(from, to, root)) {
+        return Optional.none();
+      } else {
+        return Optional.some(DeleteAction.moveToPosition(to));
+      }
+    });
+    const getContentEditableAction = (root, forward, from) => {
+      if (isAtContentEditableBlockCaret(forward, from)) {
+        return getContentEditableBlockAction(forward, from.getNode(forward === false)).fold(() => findCefPosition(root, forward, from), Optional.some);
+      } else {
+        return findCefPosition(root, forward, from).bind(deleteAction => skipMoveToActionFromInlineCefToContent(root, from, deleteAction));
+      }
+    };
+    const read = (root, forward, rng) => {
+      const normalizedRange = normalizeRange(forward ? 1 : -1, root, rng);
+      const from = CaretPosition.fromRangeStart(normalizedRange);
+      const rootElement = SugarElement.fromDom(root);
+      if (forward === false && isAfterContentEditableFalse(from)) {
+        return Optional.some(DeleteAction.remove(from.getNode(true)));
+      } else if (forward && isBeforeContentEditableFalse(from)) {
+        return Optional.some(DeleteAction.remove(from.getNode()));
+      } else if (forward === false && isBeforeContentEditableFalse(from) && isAfterBr(rootElement, from)) {
+        return findPreviousBr(rootElement, from).map(br => DeleteAction.remove(br.getNode()));
+      } else if (forward && isAfterContentEditableFalse(from) && isBeforeBr$1(rootElement, from)) {
+        return findNextBr(rootElement, from).map(br => DeleteAction.remove(br.getNode()));
+      } else {
+        return getContentEditableAction(root, forward, from);
+      }
+    };
+
+    const deleteElement$1 = (editor, forward) => element => {
+      editor._selectionOverrides.hideFakeCaret();
+      deleteElement$2(editor, forward, SugarElement.fromDom(element));
+      return true;
+    };
+    const moveToElement = (editor, forward) => element => {
+      const pos = forward ? CaretPosition.before(element) : CaretPosition.after(element);
+      editor.selection.setRng(pos.toRange());
+      return true;
+    };
+    const moveToPosition = editor => pos => {
+      editor.selection.setRng(pos.toRange());
+      return true;
+    };
+    const getAncestorCe = (editor, node) => Optional.from(getContentEditableRoot$1(editor.getBody(), node));
+    const backspaceDeleteCaret = (editor, forward) => {
+      const selectedNode = editor.selection.getNode();
+      return getAncestorCe(editor, selectedNode).filter(isContentEditableFalse$a).fold(() => read(editor.getBody(), forward, editor.selection.getRng()).map(deleteAction => () => deleteAction.fold(deleteElement$1(editor, forward), moveToElement(editor, forward), moveToPosition(editor))), () => Optional.some(noop));
+    };
+    const deleteOffscreenSelection = rootElement => {
+      each$g(descendants(rootElement, '.mce-offscreen-selection'), remove$5);
+    };
+    const backspaceDeleteRange = (editor, forward) => {
+      const selectedNode = editor.selection.getNode();
+      if (isContentEditableFalse$a(selectedNode) && !isTableCell$5(selectedNode)) {
+        const hasCefAncestor = getAncestorCe(editor, selectedNode.parentNode).filter(isContentEditableFalse$a);
+        return hasCefAncestor.fold(() => Optional.some(() => {
+          deleteOffscreenSelection(SugarElement.fromDom(editor.getBody()));
+          deleteElement$2(editor, forward, SugarElement.fromDom(editor.selection.getNode()));
+          paddEmptyBody(editor);
+        }), () => Optional.some(noop));
+      }
+      return Optional.none();
+    };
+    const paddEmptyElement = editor => {
+      const dom = editor.dom, selection = editor.selection;
+      const ceRoot = getContentEditableRoot$1(editor.getBody(), selection.getNode());
+      if (isContentEditableTrue$4(ceRoot) && dom.isBlock(ceRoot) && dom.isEmpty(ceRoot)) {
+        const br = dom.create('br', { 'data-mce-bogus': '1' });
+        dom.setHTML(ceRoot, '');
+        ceRoot.appendChild(br);
+        selection.setRng(CaretPosition.before(br).toRange());
+      }
+      return true;
+    };
+    const backspaceDelete$5 = (editor, forward) => {
+      if (editor.selection.isCollapsed()) {
+        return backspaceDeleteCaret(editor, forward);
+      } else {
+        return backspaceDeleteRange(editor, forward);
+      }
+    };
+
+    const deleteCaret$2 = (editor, forward) => {
+      const fromPos = CaretPosition.fromRangeStart(editor.selection.getRng());
+      return fromPosition(forward, editor.getBody(), fromPos).filter(pos => forward ? isBeforeImageBlock(pos) : isAfterImageBlock(pos)).bind(pos => Optional.from(getChildNodeAtRelativeOffset(forward ? 0 : -1, pos))).map(elm => () => editor.selection.select(elm));
+    };
+    const backspaceDelete$4 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret$2(editor, forward) : Optional.none();
+
+    const isText$1 = isText$8;
+    const startsWithCaretContainer = node => isText$1(node) && node.data[0] === ZWSP$1;
+    const endsWithCaretContainer = node => isText$1(node) && node.data[node.data.length - 1] === ZWSP$1;
+    const createZwsp = node => node.ownerDocument.createTextNode(ZWSP$1);
+    const insertBefore = node => {
+      if (isText$1(node.previousSibling)) {
+        if (endsWithCaretContainer(node.previousSibling)) {
+          return node.previousSibling;
+        } else {
+          node.previousSibling.appendData(ZWSP$1);
+          return node.previousSibling;
+        }
+      } else if (isText$1(node)) {
+        if (startsWithCaretContainer(node)) {
+          return node;
+        } else {
+          node.insertData(0, ZWSP$1);
+          return node;
+        }
+      } else {
+        const newNode = createZwsp(node);
+        node.parentNode.insertBefore(newNode, node);
+        return newNode;
+      }
+    };
+    const insertAfter = node => {
+      if (isText$1(node.nextSibling)) {
+        if (startsWithCaretContainer(node.nextSibling)) {
+          return node.nextSibling;
+        } else {
+          node.nextSibling.insertData(0, ZWSP$1);
+          return node.nextSibling;
+        }
+      } else if (isText$1(node)) {
+        if (endsWithCaretContainer(node)) {
+          return node;
+        } else {
+          node.appendData(ZWSP$1);
+          return node;
+        }
+      } else {
+        const newNode = createZwsp(node);
+        if (node.nextSibling) {
+          node.parentNode.insertBefore(newNode, node.nextSibling);
+        } else {
+          node.parentNode.appendChild(newNode);
+        }
+        return newNode;
+      }
+    };
+    const insertInline = (before, node) => before ? insertBefore(node) : insertAfter(node);
+    const insertInlineBefore = curry(insertInline, true);
+    const insertInlineAfter = curry(insertInline, false);
+
+    const insertInlinePos = (pos, before) => {
+      if (isText$8(pos.container())) {
+        return insertInline(before, pos.container());
+      } else {
+        return insertInline(before, pos.getNode());
+      }
+    };
+    const isPosCaretContainer = (pos, caret) => {
+      const caretNode = caret.get();
+      return caretNode && pos.container() === caretNode && isCaretContainerInline(caretNode);
+    };
+    const renderCaret = (caret, location) => location.fold(element => {
+      remove$4(caret.get());
+      const text = insertInlineBefore(element);
+      caret.set(text);
+      return Optional.some(CaretPosition(text, text.length - 1));
+    }, element => firstPositionIn(element).map(pos => {
+      if (!isPosCaretContainer(pos, caret)) {
+        remove$4(caret.get());
+        const text = insertInlinePos(pos, true);
+        caret.set(text);
+        return CaretPosition(text, 1);
+      } else {
+        return CaretPosition(caret.get(), 1);
+      }
+    }), element => lastPositionIn(element).map(pos => {
+      if (!isPosCaretContainer(pos, caret)) {
+        remove$4(caret.get());
+        const text = insertInlinePos(pos, false);
+        caret.set(text);
+        return CaretPosition(text, text.length - 1);
+      } else {
+        return CaretPosition(caret.get(), caret.get().length - 1);
+      }
+    }), element => {
+      remove$4(caret.get());
+      const text = insertInlineAfter(element);
+      caret.set(text);
+      return Optional.some(CaretPosition(text, 1));
+    });
+
+    const evaluateUntil = (fns, args) => {
+      for (let i = 0; i < fns.length; i++) {
+        const result = fns[i].apply(null, args);
+        if (result.isSome()) {
+          return result;
+        }
+      }
+      return Optional.none();
+    };
+
+    const Location = Adt.generate([
+      { before: ['element'] },
+      { start: ['element'] },
+      { end: ['element'] },
+      { after: ['element'] }
+    ]);
+    const rescope$1 = (rootNode, node) => {
+      const parentBlock = getParentBlock$3(node, rootNode);
+      return parentBlock ? parentBlock : rootNode;
+    };
+    const before = (isInlineTarget, rootNode, pos) => {
+      const nPos = normalizeForwards(pos);
+      const scope = rescope$1(rootNode, nPos.container());
+      return findRootInline(isInlineTarget, scope, nPos).fold(() => nextPosition(scope, nPos).bind(curry(findRootInline, isInlineTarget, scope)).map(inline => Location.before(inline)), Optional.none);
+    };
+    const isNotInsideFormatCaretContainer = (rootNode, elm) => getParentCaretContainer(rootNode, elm) === null;
+    const findInsideRootInline = (isInlineTarget, rootNode, pos) => findRootInline(isInlineTarget, rootNode, pos).filter(curry(isNotInsideFormatCaretContainer, rootNode));
+    const start$1 = (isInlineTarget, rootNode, pos) => {
+      const nPos = normalizeBackwards(pos);
+      return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(inline => {
+        const prevPos = prevPosition(inline, nPos);
+        return prevPos.isNone() ? Optional.some(Location.start(inline)) : Optional.none();
+      });
+    };
+    const end = (isInlineTarget, rootNode, pos) => {
+      const nPos = normalizeForwards(pos);
+      return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(inline => {
+        const nextPos = nextPosition(inline, nPos);
+        return nextPos.isNone() ? Optional.some(Location.end(inline)) : Optional.none();
+      });
+    };
+    const after = (isInlineTarget, rootNode, pos) => {
+      const nPos = normalizeBackwards(pos);
+      const scope = rescope$1(rootNode, nPos.container());
+      return findRootInline(isInlineTarget, scope, nPos).fold(() => prevPosition(scope, nPos).bind(curry(findRootInline, isInlineTarget, scope)).map(inline => Location.after(inline)), Optional.none);
+    };
+    const isValidLocation = location => isRtl(getElement(location)) === false;
+    const readLocation = (isInlineTarget, rootNode, pos) => {
+      const location = evaluateUntil([
+        before,
+        start$1,
+        end,
+        after
+      ], [
+        isInlineTarget,
+        rootNode,
+        pos
+      ]);
+      return location.filter(isValidLocation);
+    };
+    const getElement = location => location.fold(identity, identity, identity, identity);
+    const getName = location => location.fold(constant('before'), constant('start'), constant('end'), constant('after'));
+    const outside = location => location.fold(Location.before, Location.before, Location.after, Location.after);
+    const inside = location => location.fold(Location.start, Location.start, Location.end, Location.end);
+    const isEq = (location1, location2) => getName(location1) === getName(location2) && getElement(location1) === getElement(location2);
+    const betweenInlines = (forward, isInlineTarget, rootNode, from, to, location) => lift2(findRootInline(isInlineTarget, rootNode, from), findRootInline(isInlineTarget, rootNode, to), (fromInline, toInline) => {
+      if (fromInline !== toInline && hasSameParentBlock(rootNode, fromInline, toInline)) {
+        return Location.after(forward ? fromInline : toInline);
+      } else {
+        return location;
+      }
+    }).getOr(location);
+    const skipNoMovement = (fromLocation, toLocation) => fromLocation.fold(always, fromLocation => !isEq(fromLocation, toLocation));
+    const findLocationTraverse = (forward, isInlineTarget, rootNode, fromLocation, pos) => {
+      const from = normalizePosition(forward, pos);
+      const to = fromPosition(forward, rootNode, from).map(curry(normalizePosition, forward));
+      const location = to.fold(() => fromLocation.map(outside), to => readLocation(isInlineTarget, rootNode, to).map(curry(betweenInlines, forward, isInlineTarget, rootNode, from, to)).filter(curry(skipNoMovement, fromLocation)));
+      return location.filter(isValidLocation);
+    };
+    const findLocationSimple = (forward, location) => {
+      if (forward) {
+        return location.fold(compose(Optional.some, Location.start), Optional.none, compose(Optional.some, Location.after), Optional.none);
+      } else {
+        return location.fold(Optional.none, compose(Optional.some, Location.before), Optional.none, compose(Optional.some, Location.end));
+      }
+    };
+    const findLocation$1 = (forward, isInlineTarget, rootNode, pos) => {
+      const from = normalizePosition(forward, pos);
+      const fromLocation = readLocation(isInlineTarget, rootNode, from);
+      return readLocation(isInlineTarget, rootNode, from).bind(curry(findLocationSimple, forward)).orThunk(() => findLocationTraverse(forward, isInlineTarget, rootNode, fromLocation, pos));
+    };
+
+    const hasSelectionModifyApi = editor => {
+      return isFunction(editor.selection.getSel().modify);
+    };
+    const moveRel = (forward, selection, pos) => {
+      const delta = forward ? 1 : -1;
+      selection.setRng(CaretPosition(pos.container(), pos.offset() + delta).toRange());
+      selection.getSel().modify('move', forward ? 'forward' : 'backward', 'word');
+      return true;
+    };
+    const moveByWord = (forward, editor) => {
+      const rng = editor.selection.getRng();
+      const pos = forward ? CaretPosition.fromRangeEnd(rng) : CaretPosition.fromRangeStart(rng);
+      if (!hasSelectionModifyApi(editor)) {
+        return false;
+      } else if (forward && isBeforeInline(pos)) {
+        return moveRel(true, editor.selection, pos);
+      } else if (!forward && isAfterInline(pos)) {
+        return moveRel(false, editor.selection, pos);
+      } else {
+        return false;
+      }
+    };
+
+    var BreakType;
+    (function (BreakType) {
+      BreakType[BreakType['Br'] = 0] = 'Br';
+      BreakType[BreakType['Block'] = 1] = 'Block';
+      BreakType[BreakType['Wrap'] = 2] = 'Wrap';
+      BreakType[BreakType['Eol'] = 3] = 'Eol';
+    }(BreakType || (BreakType = {})));
+    const flip = (direction, positions) => direction === HDirection.Backwards ? reverse(positions) : positions;
+    const walk$1 = (direction, caretWalker, pos) => direction === HDirection.Forwards ? caretWalker.next(pos) : caretWalker.prev(pos);
+    const getBreakType = (scope, direction, currentPos, nextPos) => {
+      if (isBr$5(nextPos.getNode(direction === HDirection.Forwards))) {
+        return BreakType.Br;
+      } else if (isInSameBlock(currentPos, nextPos) === false) {
+        return BreakType.Block;
+      } else {
+        return BreakType.Wrap;
+      }
+    };
+    const getPositionsUntil = (predicate, direction, scope, start) => {
+      const caretWalker = CaretWalker(scope);
+      let currentPos = start;
+      const positions = [];
+      while (currentPos) {
+        const nextPos = walk$1(direction, caretWalker, currentPos);
+        if (!nextPos) {
+          break;
+        }
+        if (isBr$5(nextPos.getNode(false))) {
+          if (direction === HDirection.Forwards) {
+            return {
+              positions: flip(direction, positions).concat([nextPos]),
+              breakType: BreakType.Br,
+              breakAt: Optional.some(nextPos)
+            };
+          } else {
+            return {
+              positions: flip(direction, positions),
+              breakType: BreakType.Br,
+              breakAt: Optional.some(nextPos)
+            };
+          }
+        }
+        if (!nextPos.isVisible()) {
+          currentPos = nextPos;
+          continue;
+        }
+        if (predicate(currentPos, nextPos)) {
+          const breakType = getBreakType(scope, direction, currentPos, nextPos);
+          return {
+            positions: flip(direction, positions),
+            breakType,
+            breakAt: Optional.some(nextPos)
+          };
+        }
+        positions.push(nextPos);
+        currentPos = nextPos;
+      }
+      return {
+        positions: flip(direction, positions),
+        breakType: BreakType.Eol,
+        breakAt: Optional.none()
+      };
+    };
+    const getAdjacentLinePositions = (direction, getPositionsUntilBreak, scope, start) => getPositionsUntilBreak(scope, start).breakAt.map(pos => {
+      const positions = getPositionsUntilBreak(scope, pos).positions;
+      return direction === HDirection.Backwards ? positions.concat(pos) : [pos].concat(positions);
+    }).getOr([]);
+    const findClosestHorizontalPositionFromPoint = (positions, x) => foldl(positions, (acc, newPos) => acc.fold(() => Optional.some(newPos), lastPos => lift2(head(lastPos.getClientRects()), head(newPos.getClientRects()), (lastRect, newRect) => {
+      const lastDist = Math.abs(x - lastRect.left);
+      const newDist = Math.abs(x - newRect.left);
+      return newDist <= lastDist ? newPos : lastPos;
+    }).or(acc)), Optional.none());
+    const findClosestHorizontalPosition = (positions, pos) => head(pos.getClientRects()).bind(targetRect => findClosestHorizontalPositionFromPoint(positions, targetRect.left));
+    const getPositionsUntilPreviousLine = curry(getPositionsUntil, CaretPosition.isAbove, -1);
+    const getPositionsUntilNextLine = curry(getPositionsUntil, CaretPosition.isBelow, 1);
+    const getPositionsAbove = curry(getAdjacentLinePositions, -1, getPositionsUntilPreviousLine);
+    const getPositionsBelow = curry(getAdjacentLinePositions, 1, getPositionsUntilNextLine);
+    const isAtFirstLine = (scope, pos) => getPositionsUntilPreviousLine(scope, pos).breakAt.isNone();
+    const isAtLastLine = (scope, pos) => getPositionsUntilNextLine(scope, pos).breakAt.isNone();
+    const getFirstLinePositions = scope => firstPositionIn(scope).map(pos => [pos].concat(getPositionsUntilNextLine(scope, pos).positions)).getOr([]);
+    const getLastLinePositions = scope => lastPositionIn(scope).map(pos => getPositionsUntilPreviousLine(scope, pos).positions.concat(pos)).getOr([]);
+
+    const isContentEditableFalse$3 = isContentEditableFalse$a;
+    const distanceToRectLeft$1 = (clientRect, clientX) => Math.abs(clientRect.left - clientX);
+    const distanceToRectRight$1 = (clientRect, clientX) => Math.abs(clientRect.right - clientX);
+    const isNodeClientRect = rect => hasNonNullableKey(rect, 'node');
+    const findClosestClientRect = (clientRects, clientX) => reduce(clientRects, (oldClientRect, clientRect) => {
+      const oldDistance = Math.min(distanceToRectLeft$1(oldClientRect, clientX), distanceToRectRight$1(oldClientRect, clientX));
+      const newDistance = Math.min(distanceToRectLeft$1(clientRect, clientX), distanceToRectRight$1(clientRect, clientX));
+      if (newDistance === oldDistance && isNodeClientRect(clientRect) && isContentEditableFalse$3(clientRect.node)) {
+        return clientRect;
+      }
+      if (newDistance < oldDistance) {
+        return clientRect;
+      }
+      return oldClientRect;
+    });
+
+    const getNodeClientRects = node => {
+      const toArrayWithNode = clientRects => {
+        return map$3(clientRects, rect => {
+          const clientRect = clone$1(rect);
+          clientRect.node = node;
+          return clientRect;
+        });
+      };
+      if (isElement$6(node)) {
+        return toArrayWithNode(node.getClientRects());
+      } else if (isText$8(node)) {
+        const rng = node.ownerDocument.createRange();
+        rng.setStart(node, 0);
+        rng.setEnd(node, node.data.length);
+        return toArrayWithNode(rng.getClientRects());
+      } else {
+        return [];
+      }
+    };
+    const getClientRects = nodes => bind$3(nodes, getNodeClientRects);
+
+    var VDirection;
+    (function (VDirection) {
+      VDirection[VDirection['Up'] = -1] = 'Up';
+      VDirection[VDirection['Down'] = 1] = 'Down';
+    }(VDirection || (VDirection = {})));
+    const findUntil = (direction, root, predicateFn, node) => {
+      while (node = findNode(node, direction, isEditableCaretCandidate$1, root)) {
+        if (predicateFn(node)) {
+          return;
+        }
+      }
+    };
+    const walkUntil = (direction, isAboveFn, isBeflowFn, root, predicateFn, caretPosition) => {
+      let line = 0;
+      const result = [];
+      const add = node => {
+        let clientRects = getClientRects([node]);
+        if (direction === -1) {
+          clientRects = clientRects.reverse();
+        }
+        for (let i = 0; i < clientRects.length; i++) {
+          const clientRect = clientRects[i];
+          if (isBeflowFn(clientRect, targetClientRect)) {
+            continue;
+          }
+          if (result.length > 0 && isAboveFn(clientRect, last$2(result))) {
+            line++;
+          }
+          clientRect.line = line;
+          if (predicateFn(clientRect)) {
+            return true;
+          }
+          result.push(clientRect);
+        }
+      };
+      const targetClientRect = last$2(caretPosition.getClientRects());
+      if (!targetClientRect) {
+        return result;
+      }
+      const node = caretPosition.getNode();
+      add(node);
+      findUntil(direction, root, add, node);
+      return result;
+    };
+    const aboveLineNumber = (lineNumber, clientRect) => clientRect.line > lineNumber;
+    const isLineNumber = (lineNumber, clientRect) => clientRect.line === lineNumber;
+    const upUntil = curry(walkUntil, VDirection.Up, isAbove$1, isBelow$1);
+    const downUntil = curry(walkUntil, VDirection.Down, isBelow$1, isAbove$1);
+    const positionsUntil = (direction, root, predicateFn, node) => {
+      const caretWalker = CaretWalker(root);
+      let walkFn;
+      let isBelowFn;
+      let isAboveFn;
+      let caretPosition;
+      const result = [];
+      let line = 0;
+      const getClientRect = caretPosition => {
+        if (direction === 1) {
+          return last$2(caretPosition.getClientRects());
+        }
+        return last$2(caretPosition.getClientRects());
+      };
+      if (direction === 1) {
+        walkFn = caretWalker.next;
+        isBelowFn = isBelow$1;
+        isAboveFn = isAbove$1;
+        caretPosition = CaretPosition.after(node);
+      } else {
+        walkFn = caretWalker.prev;
+        isBelowFn = isAbove$1;
+        isAboveFn = isBelow$1;
+        caretPosition = CaretPosition.before(node);
+      }
+      const targetClientRect = getClientRect(caretPosition);
+      do {
+        if (!caretPosition.isVisible()) {
+          continue;
+        }
+        const rect = getClientRect(caretPosition);
+        if (isAboveFn(rect, targetClientRect)) {
+          continue;
+        }
+        if (result.length > 0 && isBelowFn(rect, last$2(result))) {
+          line++;
+        }
+        const clientRect = clone$1(rect);
+        clientRect.position = caretPosition;
+        clientRect.line = line;
+        if (predicateFn(clientRect)) {
+          return result;
+        }
+        result.push(clientRect);
+      } while (caretPosition = walkFn(caretPosition));
+      return result;
+    };
+    const isAboveLine = lineNumber => clientRect => aboveLineNumber(lineNumber, clientRect);
+    const isLine = lineNumber => clientRect => isLineNumber(lineNumber, clientRect);
+
+    const moveToRange = (editor, rng) => {
+      editor.selection.setRng(rng);
+      scrollRangeIntoView(editor, editor.selection.getRng());
+    };
+    const renderRangeCaretOpt = (editor, range, scrollIntoView) => Optional.some(renderRangeCaret(editor, range, scrollIntoView));
+    const moveHorizontally = (editor, direction, range, isBefore, isAfter, isElement) => {
+      const forwards = direction === HDirection.Forwards;
+      const caretWalker = CaretWalker(editor.getBody());
+      const getNextPosFn = curry(getVisualCaretPosition, forwards ? caretWalker.next : caretWalker.prev);
+      const isBeforeFn = forwards ? isBefore : isAfter;
+      if (!range.collapsed) {
+        const node = getSelectedNode(range);
+        if (isElement(node)) {
+          return showCaret(direction, editor, node, direction === HDirection.Backwards, false);
+        }
+      }
+      const caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);
+      if (isBeforeFn(caretPosition)) {
+        return selectNode(editor, caretPosition.getNode(!forwards));
+      }
+      const nextCaretPosition = normalizePosition(forwards, getNextPosFn(caretPosition));
+      const rangeIsInContainerBlock = isRangeInCaretContainerBlock(range);
+      if (!nextCaretPosition) {
+        return rangeIsInContainerBlock ? Optional.some(range) : Optional.none();
+      }
+      if (isBeforeFn(nextCaretPosition)) {
+        return showCaret(direction, editor, nextCaretPosition.getNode(!forwards), forwards, false);
+      }
+      const peekCaretPosition = getNextPosFn(nextCaretPosition);
+      if (peekCaretPosition && isBeforeFn(peekCaretPosition)) {
+        if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {
+          return showCaret(direction, editor, peekCaretPosition.getNode(!forwards), forwards, false);
+        }
+      }
+      if (rangeIsInContainerBlock) {
+        return renderRangeCaretOpt(editor, nextCaretPosition.toRange(), false);
+      }
+      return Optional.none();
+    };
+    const moveVertically = (editor, direction, range, isBefore, isAfter, isElement) => {
+      const caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);
+      const caretClientRect = last$2(caretPosition.getClientRects());
+      const forwards = direction === VDirection.Down;
+      if (!caretClientRect) {
+        return Optional.none();
+      }
+      const walkerFn = forwards ? downUntil : upUntil;
+      const linePositions = walkerFn(editor.getBody(), isAboveLine(1), caretPosition);
+      const nextLinePositions = filter$6(linePositions, isLine(1));
+      const clientX = caretClientRect.left;
+      const nextLineRect = findClosestClientRect(nextLinePositions, clientX);
+      if (nextLineRect && isElement(nextLineRect.node)) {
+        const dist1 = Math.abs(clientX - nextLineRect.left);
+        const dist2 = Math.abs(clientX - nextLineRect.right);
+        return showCaret(direction, editor, nextLineRect.node, dist1 < dist2, false);
+      }
+      let currentNode;
+      if (isBefore(caretPosition)) {
+        currentNode = caretPosition.getNode();
+      } else if (isAfter(caretPosition)) {
+        currentNode = caretPosition.getNode(true);
+      } else {
+        currentNode = getSelectedNode(range);
+      }
+      if (currentNode) {
+        const caretPositions = positionsUntil(direction, editor.getBody(), isAboveLine(1), currentNode);
+        let closestNextLineRect = findClosestClientRect(filter$6(caretPositions, isLine(1)), clientX);
+        if (closestNextLineRect) {
+          return renderRangeCaretOpt(editor, closestNextLineRect.position.toRange(), false);
+        }
+        closestNextLineRect = last$2(filter$6(caretPositions, isLine(0)));
+        if (closestNextLineRect) {
+          return renderRangeCaretOpt(editor, closestNextLineRect.position.toRange(), false);
+        }
+      }
+      if (nextLinePositions.length === 0) {
+        return getLineEndPoint(editor, forwards).filter(forwards ? isAfter : isBefore).map(pos => renderRangeCaret(editor, pos.toRange(), false));
+      }
+      return Optional.none();
+    };
+    const getLineEndPoint = (editor, forward) => {
+      const rng = editor.selection.getRng();
+      const from = forward ? CaretPosition.fromRangeEnd(rng) : CaretPosition.fromRangeStart(rng);
+      const host = getEditingHost(from.container(), editor.getBody());
+      if (forward) {
+        const lineInfo = getPositionsUntilNextLine(host, from);
+        return last$3(lineInfo.positions);
+      } else {
+        const lineInfo = getPositionsUntilPreviousLine(host, from);
+        return head(lineInfo.positions);
+      }
+    };
+    const moveToLineEndPoint$3 = (editor, forward, isElementPosition) => getLineEndPoint(editor, forward).filter(isElementPosition).exists(pos => {
+      editor.selection.setRng(pos.toRange());
+      return true;
+    });
+
+    const setCaretPosition = (editor, pos) => {
+      const rng = editor.dom.createRng();
+      rng.setStart(pos.container(), pos.offset());
+      rng.setEnd(pos.container(), pos.offset());
+      editor.selection.setRng(rng);
+    };
+    const setSelected = (state, elm) => {
+      if (state) {
+        elm.setAttribute('data-mce-selected', 'inline-boundary');
+      } else {
+        elm.removeAttribute('data-mce-selected');
+      }
+    };
+    const renderCaretLocation = (editor, caret, location) => renderCaret(caret, location).map(pos => {
+      setCaretPosition(editor, pos);
+      return location;
+    });
+    const findLocation = (editor, caret, forward) => {
+      const rootNode = editor.getBody();
+      const from = CaretPosition.fromRangeStart(editor.selection.getRng());
+      const isInlineTarget$1 = curry(isInlineTarget, editor);
+      const location = findLocation$1(forward, isInlineTarget$1, rootNode, from);
+      return location.bind(location => renderCaretLocation(editor, caret, location));
+    };
+    const toggleInlines = (isInlineTarget, dom, elms) => {
+      const inlineBoundaries = map$3(descendants(SugarElement.fromDom(dom.getRoot()), '*[data-mce-selected="inline-boundary"]'), e => e.dom);
+      const selectedInlines = filter$6(inlineBoundaries, isInlineTarget);
+      const targetInlines = filter$6(elms, isInlineTarget);
+      each$g(difference(selectedInlines, targetInlines), curry(setSelected, false));
+      each$g(difference(targetInlines, selectedInlines), curry(setSelected, true));
+    };
+    const safeRemoveCaretContainer = (editor, caret) => {
+      if (editor.selection.isCollapsed() && editor.composing !== true && caret.get()) {
+        const pos = CaretPosition.fromRangeStart(editor.selection.getRng());
+        if (CaretPosition.isTextPosition(pos) && isAtZwsp(pos) === false) {
+          setCaretPosition(editor, removeAndReposition(caret.get(), pos));
+          caret.set(null);
+        }
+      }
+    };
+    const renderInsideInlineCaret = (isInlineTarget, editor, caret, elms) => {
+      if (editor.selection.isCollapsed()) {
+        const inlines = filter$6(elms, isInlineTarget);
+        each$g(inlines, _inline => {
+          const pos = CaretPosition.fromRangeStart(editor.selection.getRng());
+          readLocation(isInlineTarget, editor.getBody(), pos).bind(location => renderCaretLocation(editor, caret, location));
+        });
+      }
+    };
+    const move$2 = (editor, caret, forward) => isInlineBoundariesEnabled(editor) ? findLocation(editor, caret, forward).isSome() : false;
+    const moveWord = (forward, editor, _caret) => isInlineBoundariesEnabled(editor) ? moveByWord(forward, editor) : false;
+    const setupSelectedState = editor => {
+      const caret = Cell(null);
+      const isInlineTarget$1 = curry(isInlineTarget, editor);
+      editor.on('NodeChange', e => {
+        if (isInlineBoundariesEnabled(editor)) {
+          toggleInlines(isInlineTarget$1, editor.dom, e.parents);
+          safeRemoveCaretContainer(editor, caret);
+          renderInsideInlineCaret(isInlineTarget$1, editor, caret, e.parents);
+        }
+      });
+      return caret;
+    };
+    const moveNextWord = curry(moveWord, true);
+    const movePrevWord = curry(moveWord, false);
+    const moveToLineEndPoint$2 = (editor, forward, caret) => {
+      if (isInlineBoundariesEnabled(editor)) {
+        const linePoint = getLineEndPoint(editor, forward).getOrThunk(() => {
+          const rng = editor.selection.getRng();
+          return forward ? CaretPosition.fromRangeEnd(rng) : CaretPosition.fromRangeStart(rng);
+        });
+        return readLocation(curry(isInlineTarget, editor), editor.getBody(), linePoint).exists(loc => {
+          const outsideLoc = outside(loc);
+          return renderCaret(caret, outsideLoc).exists(pos => {
+            setCaretPosition(editor, pos);
+            return true;
+          });
+        });
+      } else {
+        return false;
+      }
+    };
+
+    const rangeFromPositions = (from, to) => {
+      const range = document.createRange();
+      range.setStart(from.container(), from.offset());
+      range.setEnd(to.container(), to.offset());
+      return range;
+    };
+    const hasOnlyTwoOrLessPositionsLeft = elm => lift2(firstPositionIn(elm), lastPositionIn(elm), (firstPos, lastPos) => {
+      const normalizedFirstPos = normalizePosition(true, firstPos);
+      const normalizedLastPos = normalizePosition(false, lastPos);
+      return nextPosition(elm, normalizedFirstPos).forall(pos => pos.isEqual(normalizedLastPos));
+    }).getOr(true);
+    const setCaretLocation = (editor, caret) => location => renderCaret(caret, location).map(pos => () => setCaretPosition(editor, pos));
+    const deleteFromTo = (editor, caret, from, to) => {
+      const rootNode = editor.getBody();
+      const isInlineTarget$1 = curry(isInlineTarget, editor);
+      editor.undoManager.ignore(() => {
+        editor.selection.setRng(rangeFromPositions(from, to));
+        execDeleteCommand(editor);
+        readLocation(isInlineTarget$1, rootNode, CaretPosition.fromRangeStart(editor.selection.getRng())).map(inside).bind(setCaretLocation(editor, caret)).each(call);
+      });
+      editor.nodeChanged();
+    };
+    const rescope = (rootNode, node) => {
+      const parentBlock = getParentBlock$3(node, rootNode);
+      return parentBlock ? parentBlock : rootNode;
+    };
+    const backspaceDeleteCollapsed = (editor, caret, forward, from) => {
+      const rootNode = rescope(editor.getBody(), from.container());
+      const isInlineTarget$1 = curry(isInlineTarget, editor);
+      const fromLocation = readLocation(isInlineTarget$1, rootNode, from);
+      const location = fromLocation.bind(location => {
+        if (forward) {
+          return location.fold(constant(Optional.some(inside(location))), Optional.none, constant(Optional.some(outside(location))), Optional.none);
+        } else {
+          return location.fold(Optional.none, constant(Optional.some(outside(location))), Optional.none, constant(Optional.some(inside(location))));
+        }
+      });
+      return location.map(setCaretLocation(editor, caret)).getOrThunk(() => {
+        const toPosition = navigate(forward, rootNode, from);
+        const toLocation = toPosition.bind(pos => readLocation(isInlineTarget$1, rootNode, pos));
+        return lift2(fromLocation, toLocation, () => findRootInline(isInlineTarget$1, rootNode, from).bind(elm => {
+          if (hasOnlyTwoOrLessPositionsLeft(elm)) {
+            return Optional.some(() => {
+              deleteElement$2(editor, forward, SugarElement.fromDom(elm));
+            });
+          } else {
+            return Optional.none();
+          }
+        })).getOrThunk(() => toLocation.bind(() => toPosition.map(to => {
+          return () => {
+            if (forward) {
+              deleteFromTo(editor, caret, from, to);
+            } else {
+              deleteFromTo(editor, caret, to, from);
+            }
+          };
+        })));
+      });
+    };
+    const backspaceDelete$3 = (editor, caret, forward) => {
+      if (editor.selection.isCollapsed() && isInlineBoundariesEnabled(editor)) {
+        const from = CaretPosition.fromRangeStart(editor.selection.getRng());
+        return backspaceDeleteCollapsed(editor, caret, forward, from);
+      }
+      return Optional.none();
+    };
+
+    const getParentInlines = (rootElm, startElm) => {
+      const parents = parentsAndSelf(startElm, rootElm);
+      return findIndex$2(parents, isBlock$2).fold(constant(parents), index => parents.slice(0, index));
+    };
+    const hasOnlyOneChild = elm => childNodesCount(elm) === 1;
+    const deleteLastPosition = (forward, editor, target, parentInlines) => {
+      const isFormatElement$1 = curry(isFormatElement, editor);
+      const formatNodes = map$3(filter$6(parentInlines, isFormatElement$1), elm => elm.dom);
+      if (formatNodes.length === 0) {
+        deleteElement$2(editor, forward, target);
+      } else {
+        const pos = replaceWithCaretFormat(target.dom, formatNodes);
+        editor.selection.setRng(pos.toRange());
+      }
+    };
+    const deleteCaret$1 = (editor, forward) => {
+      const rootElm = SugarElement.fromDom(editor.getBody());
+      const startElm = SugarElement.fromDom(editor.selection.getStart());
+      const parentInlines = filter$6(getParentInlines(rootElm, startElm), hasOnlyOneChild);
+      return last$3(parentInlines).bind(target => {
+        const fromPos = CaretPosition.fromRangeStart(editor.selection.getRng());
+        if (willDeleteLastPositionInElement(forward, fromPos, target.dom) && !isEmptyCaretFormatElement(target)) {
+          return Optional.some(() => deleteLastPosition(forward, editor, target, parentInlines));
+        } else {
+          return Optional.none();
+        }
+      });
+    };
+    const backspaceDelete$2 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret$1(editor, forward) : Optional.none();
+
+    const deleteElement = (editor, forward, element) => {
+      return Optional.some(() => {
+        editor._selectionOverrides.hideFakeCaret();
+        deleteElement$2(editor, forward, SugarElement.fromDom(element));
+      });
+    };
+    const deleteCaret = (editor, forward) => {
+      const isNearMedia = forward ? isBeforeMedia : isAfterMedia;
+      const direction = forward ? HDirection.Forwards : HDirection.Backwards;
+      const fromPos = getNormalizedRangeEndPoint(direction, editor.getBody(), editor.selection.getRng());
+      if (isNearMedia(fromPos)) {
+        return deleteElement(editor, forward, fromPos.getNode(!forward));
+      } else {
+        return Optional.from(normalizePosition(forward, fromPos)).filter(pos => isNearMedia(pos) && isMoveInsideSameBlock(fromPos, pos)).map(pos => () => deleteElement(editor, forward, pos.getNode(!forward)));
+      }
+    };
+    const deleteRange = (editor, forward) => {
+      const selectedNode = editor.selection.getNode();
+      return isMedia$2(selectedNode) ? deleteElement(editor, forward, selectedNode) : Optional.none();
+    };
+    const backspaceDelete$1 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret(editor, forward) : deleteRange(editor, forward);
+
+    const isEditable$1 = target => closest$4(target, elm => isContentEditableTrue$4(elm.dom) || isContentEditableFalse$a(elm.dom)).exists(elm => isContentEditableTrue$4(elm.dom));
+    const parseIndentValue = value => {
+      const number = parseInt(value, 10);
+      return isNaN(number) ? 0 : number;
+    };
+    const getIndentStyleName = (useMargin, element) => {
+      const indentStyleName = useMargin || isTable$2(element) ? 'margin' : 'padding';
+      const suffix = get$7(element, 'direction') === 'rtl' ? '-right' : '-left';
+      return indentStyleName + suffix;
+    };
+    const indentElement = (dom, command, useMargin, value, unit, element) => {
+      const indentStyleName = getIndentStyleName(useMargin, SugarElement.fromDom(element));
+      if (command === 'outdent') {
+        const styleValue = Math.max(0, parseIndentValue(element.style[indentStyleName]) - value);
+        dom.setStyle(element, indentStyleName, styleValue ? styleValue + unit : '');
+      } else {
+        const styleValue = parseIndentValue(element.style[indentStyleName]) + value + unit;
+        dom.setStyle(element, indentStyleName, styleValue);
+      }
+    };
+    const validateBlocks = (editor, blocks) => forall(blocks, block => {
+      const indentStyleName = getIndentStyleName(shouldIndentUseMargin(editor), block);
+      const intentValue = getRaw$1(block, indentStyleName).map(parseIndentValue).getOr(0);
+      const contentEditable = editor.dom.getContentEditable(block.dom);
+      return contentEditable !== 'false' && intentValue > 0;
+    });
+    const canOutdent = editor => {
+      const blocks = getBlocksToIndent(editor);
+      return !editor.mode.isReadOnly() && (blocks.length > 1 || validateBlocks(editor, blocks));
+    };
+    const isListComponent = el => isList(el) || isListItem(el);
+    const parentIsListComponent = el => parent(el).exists(isListComponent);
+    const getBlocksToIndent = editor => filter$6(fromDom$1(editor.selection.getSelectedBlocks()), el => !isListComponent(el) && !parentIsListComponent(el) && isEditable$1(el));
+    const handle = (editor, command) => {
+      const {dom} = editor;
+      const indentation = getIndentation(editor);
+      const indentUnit = /[a-z%]+$/i.exec(indentation)[0];
+      const indentValue = parseInt(indentation, 10);
+      const useMargin = shouldIndentUseMargin(editor);
+      each$g(getBlocksToIndent(editor), block => {
+        indentElement(dom, command, useMargin, indentValue, indentUnit, block.dom);
+      });
+    };
+    const indent = editor => handle(editor, 'indent');
+    const outdent = editor => handle(editor, 'outdent');
+
+    const backspaceDelete = editor => {
+      if (editor.selection.isCollapsed() && canOutdent(editor)) {
+        const dom = editor.dom;
+        const rng = editor.selection.getRng();
+        const pos = CaretPosition.fromRangeStart(rng);
+        const block = dom.getParent(rng.startContainer, dom.isBlock);
+        if (block !== null && isAtStartOfBlock(SugarElement.fromDom(block), pos)) {
+          return Optional.some(() => outdent(editor));
+        }
+      }
+      return Optional.none();
+    };
+
+    const findAction = (editor, caret, forward) => findMap([
+      backspaceDelete,
+      backspaceDelete$5,
+      backspaceDelete$6,
+      (editor, forward) => backspaceDelete$3(editor, caret, forward),
+      backspaceDelete$8,
+      backspaceDelete$9,
+      backspaceDelete$4,
+      backspaceDelete$1,
+      backspaceDelete$7,
+      backspaceDelete$2
+    ], item => item(editor, forward));
+    const deleteCommand = (editor, caret) => {
+      const result = findAction(editor, caret, false);
+      result.fold(() => {
+        execDeleteCommand(editor);
+        paddEmptyBody(editor);
+      }, call);
+    };
+    const forwardDeleteCommand = (editor, caret) => {
+      const result = findAction(editor, caret, true);
+      result.fold(() => execForwardDeleteCommand(editor), call);
+    };
+    const setup$p = (editor, caret) => {
+      editor.addCommand('delete', () => {
+        deleteCommand(editor, caret);
+      });
+      editor.addCommand('forwardDelete', () => {
+        forwardDeleteCommand(editor, caret);
+      });
+    };
+
+    const SIGNIFICANT_MOVE = 5;
+    const LONGPRESS_DELAY = 400;
+    const getTouch = event => {
+      if (event.touches === undefined || event.touches.length !== 1) {
+        return Optional.none();
+      }
+      return Optional.some(event.touches[0]);
+    };
+    const isFarEnough = (touch, data) => {
+      const distX = Math.abs(touch.clientX - data.x);
+      const distY = Math.abs(touch.clientY - data.y);
+      return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE;
+    };
+    const setup$o = editor => {
+      const startData = value$2();
+      const longpressFired = Cell(false);
+      const debounceLongpress = last$1(e => {
+        editor.dispatch('longpress', {
+          ...e,
+          type: 'longpress'
+        });
+        longpressFired.set(true);
+      }, LONGPRESS_DELAY);
+      editor.on('touchstart', e => {
+        getTouch(e).each(touch => {
+          debounceLongpress.cancel();
+          const data = {
+            x: touch.clientX,
+            y: touch.clientY,
+            target: e.target
+          };
+          debounceLongpress.throttle(e);
+          longpressFired.set(false);
+          startData.set(data);
+        });
+      }, true);
+      editor.on('touchmove', e => {
+        debounceLongpress.cancel();
+        getTouch(e).each(touch => {
+          startData.on(data => {
+            if (isFarEnough(touch, data)) {
+              startData.clear();
+              longpressFired.set(false);
+              editor.dispatch('longpresscancel');
+            }
+          });
+        });
+      }, true);
+      editor.on('touchend touchcancel', e => {
+        debounceLongpress.cancel();
+        if (e.type === 'touchcancel') {
+          return;
+        }
+        startData.get().filter(data => data.target.isEqualNode(e.target)).each(() => {
+          if (longpressFired.get()) {
+            e.preventDefault();
+          } else {
+            editor.dispatch('tap', {
+              ...e,
+              type: 'tap'
+            });
+          }
+        });
+      }, true);
+    };
+
+    const isBlockElement = (blockElements, node) => has$2(blockElements, node.nodeName);
+    const isValidTarget = (blockElements, node) => {
+      if (isText$8(node)) {
+        return true;
+      } else if (isElement$6(node)) {
+        return !isBlockElement(blockElements, node) && !isBookmarkNode$1(node);
+      } else {
+        return false;
+      }
+    };
+    const hasBlockParent = (blockElements, root, node) => {
+      return exists(parents(SugarElement.fromDom(node), SugarElement.fromDom(root)), elm => {
+        return isBlockElement(blockElements, elm.dom);
+      });
+    };
+    const shouldRemoveTextNode = (blockElements, node) => {
+      if (isText$8(node)) {
+        if (node.nodeValue.length === 0) {
+          return true;
+        } else if (/^\s+$/.test(node.nodeValue) && (!node.nextSibling || isBlockElement(blockElements, node.nextSibling))) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const addRootBlocks = editor => {
+      const dom = editor.dom, selection = editor.selection;
+      const schema = editor.schema, blockElements = schema.getBlockElements();
+      let node = selection.getStart();
+      const rootNode = editor.getBody();
+      let rootBlockNode, tempNode, wrapped;
+      const forcedRootBlock = getForcedRootBlock(editor);
+      if (!node || !isElement$6(node)) {
+        return;
+      }
+      const rootNodeName = rootNode.nodeName.toLowerCase();
+      if (!schema.isValidChild(rootNodeName, forcedRootBlock.toLowerCase()) || hasBlockParent(blockElements, rootNode, node)) {
+        return;
+      }
+      const rng = selection.getRng();
+      const startContainer = rng.startContainer;
+      const startOffset = rng.startOffset;
+      const endContainer = rng.endContainer;
+      const endOffset = rng.endOffset;
+      const restoreSelection = hasFocus(editor);
+      node = rootNode.firstChild;
+      while (node) {
+        if (isValidTarget(blockElements, node)) {
+          if (shouldRemoveTextNode(blockElements, node)) {
+            tempNode = node;
+            node = node.nextSibling;
+            dom.remove(tempNode);
+            continue;
+          }
+          if (!rootBlockNode) {
+            rootBlockNode = dom.create(forcedRootBlock, getForcedRootBlockAttrs(editor));
+            node.parentNode.insertBefore(rootBlockNode, node);
+            wrapped = true;
+          }
+          tempNode = node;
+          node = node.nextSibling;
+          rootBlockNode.appendChild(tempNode);
+        } else {
+          rootBlockNode = null;
+          node = node.nextSibling;
+        }
+      }
+      if (wrapped && restoreSelection) {
+        rng.setStart(startContainer, startOffset);
+        rng.setEnd(endContainer, endOffset);
+        selection.setRng(rng);
+        editor.nodeChanged();
+      }
+    };
+    const setup$n = editor => {
+      editor.on('NodeChange', curry(addRootBlocks, editor));
+    };
+
+    const hasClass = checkClassName => node => (' ' + node.attr('class') + ' ').indexOf(checkClassName) !== -1;
+    const replaceMatchWithSpan = (editor, content, cls) => {
+      return function (match) {
+        const args = arguments, index = args[args.length - 2];
+        const prevChar = index > 0 ? content.charAt(index - 1) : '';
+        if (prevChar === '"') {
+          return match;
+        }
+        if (prevChar === '>') {
+          const findStartTagIndex = content.lastIndexOf('<', index);
+          if (findStartTagIndex !== -1) {
+            const tagHtml = content.substring(findStartTagIndex, index);
+            if (tagHtml.indexOf('contenteditable="false"') !== -1) {
+              return match;
+            }
+          }
+        }
+        return '<span class="' + cls + '" data-mce-content="' + editor.dom.encode(args[0]) + '">' + editor.dom.encode(typeof args[1] === 'string' ? args[1] : args[0]) + '</span>';
+      };
+    };
+    const convertRegExpsToNonEditable = (editor, nonEditableRegExps, e) => {
+      let i = nonEditableRegExps.length, content = e.content;
+      if (e.format === 'raw') {
+        return;
+      }
+      while (i--) {
+        content = content.replace(nonEditableRegExps[i], replaceMatchWithSpan(editor, content, getNonEditableClass(editor)));
+      }
+      e.content = content;
+    };
+    const setup$m = editor => {
+      const contentEditableAttrName = 'contenteditable';
+      const editClass = ' ' + Tools.trim(getEditableClass(editor)) + ' ';
+      const nonEditClass = ' ' + Tools.trim(getNonEditableClass(editor)) + ' ';
+      const hasEditClass = hasClass(editClass);
+      const hasNonEditClass = hasClass(nonEditClass);
+      const nonEditableRegExps = getNonEditableRegExps(editor);
+      if (nonEditableRegExps.length > 0) {
+        editor.on('BeforeSetContent', e => {
+          convertRegExpsToNonEditable(editor, nonEditableRegExps, e);
+        });
+      }
+      editor.parser.addAttributeFilter('class', nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          if (hasEditClass(node)) {
+            node.attr(contentEditableAttrName, 'true');
+          } else if (hasNonEditClass(node)) {
+            node.attr(contentEditableAttrName, 'false');
+          }
+        }
+      });
+      editor.serializer.addAttributeFilter(contentEditableAttrName, nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          if (!hasEditClass(node) && !hasNonEditClass(node)) {
+            continue;
+          }
+          if (nonEditableRegExps.length > 0 && node.attr('data-mce-content')) {
+            node.name = '#text';
+            node.type = 3;
+            node.raw = true;
+            node.value = node.attr('data-mce-content');
+          } else {
+            node.attr(contentEditableAttrName, null);
+          }
+        }
+      });
+    };
+
+    const findBlockCaretContainer = editor => descendant(SugarElement.fromDom(editor.getBody()), '*[data-mce-caret]').map(elm => elm.dom).getOrNull();
+    const showBlockCaretContainer = (editor, blockCaretContainer) => {
+      if (blockCaretContainer.hasAttribute('data-mce-caret')) {
+        showCaretContainerBlock(blockCaretContainer);
+        editor.selection.setRng(editor.selection.getRng());
+        editor.selection.scrollIntoView(blockCaretContainer);
+      }
+    };
+    const handleBlockContainer = (editor, e) => {
+      const blockCaretContainer = findBlockCaretContainer(editor);
+      if (!blockCaretContainer) {
+        return;
+      }
+      if (e.type === 'compositionstart') {
+        e.preventDefault();
+        e.stopPropagation();
+        showBlockCaretContainer(editor, blockCaretContainer);
+        return;
+      }
+      if (hasContent(blockCaretContainer)) {
+        showBlockCaretContainer(editor, blockCaretContainer);
+        editor.undoManager.add();
+      }
+    };
+    const setup$l = editor => {
+      editor.on('keyup compositionstart', curry(handleBlockContainer, editor));
+    };
+
+    const isContentEditableFalse$2 = isContentEditableFalse$a;
+    const moveToCeFalseHorizontally = (direction, editor, range) => moveHorizontally(editor, direction, range, isBeforeContentEditableFalse, isAfterContentEditableFalse, isContentEditableFalse$2);
+    const moveToCeFalseVertically = (direction, editor, range) => {
+      const isBefore = caretPosition => isBeforeContentEditableFalse(caretPosition) || isBeforeTable(caretPosition);
+      const isAfter = caretPosition => isAfterContentEditableFalse(caretPosition) || isAfterTable(caretPosition);
+      return moveVertically(editor, direction, range, isBefore, isAfter, isContentEditableFalse$2);
+    };
+    const createTextBlock = editor => {
+      const textBlock = editor.dom.create(getForcedRootBlock(editor));
+      textBlock.innerHTML = '<br data-mce-bogus="1">';
+      return textBlock;
+    };
+    const exitPreBlock = (editor, direction, range) => {
+      const caretWalker = CaretWalker(editor.getBody());
+      const getVisualCaretPosition$1 = curry(getVisualCaretPosition, direction === 1 ? caretWalker.next : caretWalker.prev);
+      if (range.collapsed) {
+        const pre = editor.dom.getParent(range.startContainer, 'PRE');
+        if (!pre) {
+          return;
+        }
+        const caretPos = getVisualCaretPosition$1(CaretPosition.fromRangeStart(range));
+        if (!caretPos) {
+          const newBlock = SugarElement.fromDom(createTextBlock(editor));
+          if (direction === 1) {
+            after$4(SugarElement.fromDom(pre), newBlock);
+          } else {
+            before$3(SugarElement.fromDom(pre), newBlock);
+          }
+          editor.selection.select(newBlock.dom, true);
+          editor.selection.collapse();
+        }
+      }
+    };
+    const getHorizontalRange = (editor, forward) => {
+      const direction = forward ? HDirection.Forwards : HDirection.Backwards;
+      const range = editor.selection.getRng();
+      return moveToCeFalseHorizontally(direction, editor, range).orThunk(() => {
+        exitPreBlock(editor, direction, range);
+        return Optional.none();
+      });
+    };
+    const getVerticalRange = (editor, down) => {
+      const direction = down ? 1 : -1;
+      const range = editor.selection.getRng();
+      return moveToCeFalseVertically(direction, editor, range).orThunk(() => {
+        exitPreBlock(editor, direction, range);
+        return Optional.none();
+      });
+    };
+    const moveH$2 = (editor, forward) => getHorizontalRange(editor, forward).exists(newRange => {
+      moveToRange(editor, newRange);
+      return true;
+    });
+    const moveV$3 = (editor, down) => getVerticalRange(editor, down).exists(newRange => {
+      moveToRange(editor, newRange);
+      return true;
+    });
+    const moveToLineEndPoint$1 = (editor, forward) => {
+      const isCefPosition = forward ? isAfterContentEditableFalse : isBeforeContentEditableFalse;
+      return moveToLineEndPoint$3(editor, forward, isCefPosition);
+    };
+
+    const isTarget = node => contains$2(['figcaption'], name(node));
+    const rangeBefore = target => {
+      const rng = document.createRange();
+      rng.setStartBefore(target.dom);
+      rng.setEndBefore(target.dom);
+      return rng;
+    };
+    const insertElement = (root, elm, forward) => {
+      if (forward) {
+        append$1(root, elm);
+      } else {
+        prepend(root, elm);
+      }
+    };
+    const insertEmptyLine = (root, forward, blockName, attrs) => {
+      const block = SugarElement.fromTag(blockName);
+      const br = SugarElement.fromTag('br');
+      setAll$1(block, attrs);
+      append$1(block, br);
+      insertElement(root, block, forward);
+      return rangeBefore(br);
+    };
+    const getClosestTargetBlock = (pos, root) => {
+      const isRoot = curry(eq, root);
+      return closest$4(SugarElement.fromDom(pos.container()), isBlock$2, isRoot).filter(isTarget);
+    };
+    const isAtFirstOrLastLine = (root, forward, pos) => forward ? isAtLastLine(root.dom, pos) : isAtFirstLine(root.dom, pos);
+    const moveCaretToNewEmptyLine = (editor, forward) => {
+      const root = SugarElement.fromDom(editor.getBody());
+      const pos = CaretPosition.fromRangeStart(editor.selection.getRng());
+      const rootBlock = getForcedRootBlock(editor);
+      const rootBlockAttrs = getForcedRootBlockAttrs(editor);
+      return getClosestTargetBlock(pos, root).exists(() => {
+        if (isAtFirstOrLastLine(root, forward, pos)) {
+          const rng = insertEmptyLine(root, forward, rootBlock, rootBlockAttrs);
+          editor.selection.setRng(rng);
+          return true;
+        } else {
+          return false;
+        }
+      });
+    };
+    const moveV$2 = (editor, forward) => {
+      if (editor.selection.isCollapsed()) {
+        return moveCaretToNewEmptyLine(editor, forward);
+      } else {
+        return false;
+      }
+    };
+
+    const baseKeyPattern = {
+      shiftKey: false,
+      altKey: false,
+      ctrlKey: false,
+      metaKey: false,
+      keyCode: 0
+    };
+    const defaultPatterns = patterns => map$3(patterns, pattern => ({
+      ...baseKeyPattern,
+      action: noop,
+      ...pattern
+    }));
+    const defaultDelayedPatterns = patterns => map$3(patterns, pattern => ({
+      ...baseKeyPattern,
+      action: () => Optional.none(),
+      ...pattern
+    }));
+    const matchesEvent = (pattern, evt) => evt.keyCode === pattern.keyCode && evt.shiftKey === pattern.shiftKey && evt.altKey === pattern.altKey && evt.ctrlKey === pattern.ctrlKey && evt.metaKey === pattern.metaKey;
+    const match$1 = (patterns, evt) => bind$3(defaultPatterns(patterns), pattern => matchesEvent(pattern, evt) ? [pattern] : []);
+    const matchDelayed = (patterns, evt) => bind$3(defaultDelayedPatterns(patterns), pattern => matchesEvent(pattern, evt) ? [pattern] : []);
+    const action = (f, ...x) => () => f.apply(null, x);
+    const execute = (patterns, evt) => find$2(match$1(patterns, evt), pattern => pattern.action());
+    const executeWithDelayedAction = (patterns, evt) => findMap(matchDelayed(patterns, evt), pattern => pattern.action());
+
+    const moveH$1 = (editor, forward) => {
+      const direction = forward ? HDirection.Forwards : HDirection.Backwards;
+      const range = editor.selection.getRng();
+      return moveHorizontally(editor, direction, range, isBeforeMedia, isAfterMedia, isMedia$2).exists(newRange => {
+        moveToRange(editor, newRange);
+        return true;
+      });
+    };
+    const moveV$1 = (editor, down) => {
+      const direction = down ? 1 : -1;
+      const range = editor.selection.getRng();
+      return moveVertically(editor, direction, range, isBeforeMedia, isAfterMedia, isMedia$2).exists(newRange => {
+        moveToRange(editor, newRange);
+        return true;
+      });
+    };
+    const moveToLineEndPoint = (editor, forward) => {
+      const isNearMedia = forward ? isAfterMedia : isBeforeMedia;
+      return moveToLineEndPoint$3(editor, forward, isNearMedia);
+    };
+
+    const adt = Adt.generate([
+      { none: ['current'] },
+      { first: ['current'] },
+      {
+        middle: [
+          'current',
+          'target'
+        ]
+      },
+      { last: ['current'] }
+    ]);
+    const none = current => adt.none(current);
+    const CellLocation = {
+      ...adt,
+      none
+    };
+
+    const firstLayer = (scope, selector) => {
+      return filterFirstLayer(scope, selector, always);
+    };
+    const filterFirstLayer = (scope, selector, predicate) => {
+      return bind$3(children(scope), x => {
+        if (is$1(x, selector)) {
+          return predicate(x) ? [x] : [];
+        } else {
+          return filterFirstLayer(x, selector, predicate);
+        }
+      });
+    };
+
+    const lookup$1 = (tags, element, isRoot = never) => {
+      if (isRoot(element)) {
+        return Optional.none();
+      }
+      if (contains$2(tags, name(element))) {
+        return Optional.some(element);
+      }
+      const isRootOrUpperTable = elm => is$1(elm, 'table') || isRoot(elm);
+      return ancestor$2(element, tags.join(','), isRootOrUpperTable);
+    };
+    const cell = (element, isRoot) => lookup$1([
+      'td',
+      'th'
+    ], element, isRoot);
+    const cells = ancestor => firstLayer(ancestor, 'th,td');
+    const table = (element, isRoot) => closest$3(element, 'table', isRoot);
+
+    const walk = (all, current, index, direction, isEligible = always) => {
+      const forwards = direction === 1;
+      if (!forwards && index <= 0) {
+        return CellLocation.first(all[0]);
+      } else if (forwards && index >= all.length - 1) {
+        return CellLocation.last(all[all.length - 1]);
+      } else {
+        const newIndex = index + direction;
+        const elem = all[newIndex];
+        return isEligible(elem) ? CellLocation.middle(current, elem) : walk(all, current, newIndex, direction, isEligible);
+      }
+    };
+    const detect = (current, isRoot) => {
+      return table(current, isRoot).bind(table => {
+        const all = cells(table);
+        const index = findIndex$2(all, x => eq(current, x));
+        return index.map(index => ({
+          index,
+          all
+        }));
+      });
+    };
+    const next = (current, isEligible, isRoot) => {
+      const detection = detect(current, isRoot);
+      return detection.fold(() => {
+        return CellLocation.none(current);
+      }, info => {
+        return walk(info.all, current, info.index, 1, isEligible);
+      });
+    };
+    const prev = (current, isEligible, isRoot) => {
+      const detection = detect(current, isRoot);
+      return detection.fold(() => {
+        return CellLocation.none();
+      }, info => {
+        return walk(info.all, current, info.index, -1, isEligible);
+      });
+    };
+
+    const closest = target => closest$3(target, '[contenteditable]');
+    const isEditable = (element, assumeEditable = false) => {
+      if (inBody(element)) {
+        return element.dom.isContentEditable;
+      } else {
+        return closest(element).fold(constant(assumeEditable), editable => getRaw(editable) === 'true');
+      }
+    };
+    const getRaw = element => element.dom.contentEditable;
+
+    const deflate = (rect, delta) => ({
+      left: rect.left - delta,
+      top: rect.top - delta,
+      right: rect.right + delta * 2,
+      bottom: rect.bottom + delta * 2,
+      width: rect.width + delta,
+      height: rect.height + delta
+    });
+    const getCorners = (getYAxisValue, tds) => bind$3(tds, td => {
+      const rect = deflate(clone$1(td.getBoundingClientRect()), -1);
+      return [
+        {
+          x: rect.left,
+          y: getYAxisValue(rect),
+          cell: td
+        },
+        {
+          x: rect.right,
+          y: getYAxisValue(rect),
+          cell: td
+        }
+      ];
+    });
+    const findClosestCorner = (corners, x, y) => foldl(corners, (acc, newCorner) => acc.fold(() => Optional.some(newCorner), oldCorner => {
+      const oldDist = Math.sqrt(Math.abs(oldCorner.x - x) + Math.abs(oldCorner.y - y));
+      const newDist = Math.sqrt(Math.abs(newCorner.x - x) + Math.abs(newCorner.y - y));
+      return Optional.some(newDist < oldDist ? newCorner : oldCorner);
+    }), Optional.none());
+    const getClosestCell = (getYAxisValue, isTargetCorner, table, x, y) => {
+      const cells = descendants(SugarElement.fromDom(table), 'td,th,caption').map(e => e.dom);
+      const corners = filter$6(getCorners(getYAxisValue, cells), corner => isTargetCorner(corner, y));
+      return findClosestCorner(corners, x, y).map(corner => corner.cell);
+    };
+    const getBottomValue = rect => rect.bottom;
+    const getTopValue = rect => rect.top;
+    const isAbove = (corner, y) => corner.y < y;
+    const isBelow = (corner, y) => corner.y > y;
+    const getClosestCellAbove = curry(getClosestCell, getBottomValue, isAbove);
+    const getClosestCellBelow = curry(getClosestCell, getTopValue, isBelow);
+    const findClosestPositionInAboveCell = (table, pos) => head(pos.getClientRects()).bind(rect => getClosestCellAbove(table, rect.left, rect.top)).bind(cell => findClosestHorizontalPosition(getLastLinePositions(cell), pos));
+    const findClosestPositionInBelowCell = (table, pos) => last$3(pos.getClientRects()).bind(rect => getClosestCellBelow(table, rect.left, rect.top)).bind(cell => findClosestHorizontalPosition(getFirstLinePositions(cell), pos));
+
+    const hasNextBreak = (getPositionsUntil, scope, lineInfo) => lineInfo.breakAt.exists(breakPos => getPositionsUntil(scope, breakPos).breakAt.isSome());
+    const startsWithWrapBreak = lineInfo => lineInfo.breakType === BreakType.Wrap && lineInfo.positions.length === 0;
+    const startsWithBrBreak = lineInfo => lineInfo.breakType === BreakType.Br && lineInfo.positions.length === 1;
+    const isAtTableCellLine = (getPositionsUntil, scope, pos) => {
+      const lineInfo = getPositionsUntil(scope, pos);
+      if (startsWithWrapBreak(lineInfo) || !isBr$5(pos.getNode()) && startsWithBrBreak(lineInfo)) {
+        return !hasNextBreak(getPositionsUntil, scope, lineInfo);
+      } else {
+        return lineInfo.breakAt.isNone();
+      }
+    };
+    const isAtFirstTableCellLine = curry(isAtTableCellLine, getPositionsUntilPreviousLine);
+    const isAtLastTableCellLine = curry(isAtTableCellLine, getPositionsUntilNextLine);
+    const isCaretAtStartOrEndOfTable = (forward, rng, table) => {
+      const caretPos = CaretPosition.fromRangeStart(rng);
+      return positionIn(!forward, table).exists(pos => pos.isEqual(caretPos));
+    };
+    const navigateHorizontally = (editor, forward, table, _td) => {
+      const rng = editor.selection.getRng();
+      const direction = forward ? 1 : -1;
+      if (isFakeCaretTableBrowser() && isCaretAtStartOrEndOfTable(forward, rng, table)) {
+        showCaret(direction, editor, table, !forward, false).each(newRng => {
+          moveToRange(editor, newRng);
+        });
+        return true;
+      }
+      return false;
+    };
+    const getClosestAbovePosition = (root, table, start) => findClosestPositionInAboveCell(table, start).orThunk(() => head(start.getClientRects()).bind(rect => findClosestHorizontalPositionFromPoint(getPositionsAbove(root, CaretPosition.before(table)), rect.left))).getOr(CaretPosition.before(table));
+    const getClosestBelowPosition = (root, table, start) => findClosestPositionInBelowCell(table, start).orThunk(() => head(start.getClientRects()).bind(rect => findClosestHorizontalPositionFromPoint(getPositionsBelow(root, CaretPosition.after(table)), rect.left))).getOr(CaretPosition.after(table));
+    const getTable = (previous, pos) => {
+      const node = pos.getNode(previous);
+      return isElement$6(node) && node.nodeName === 'TABLE' ? Optional.some(node) : Optional.none();
+    };
+    const renderBlock = (down, editor, table) => {
+      const forcedRootBlock = getForcedRootBlock(editor);
+      editor.undoManager.transact(() => {
+        const element = SugarElement.fromTag(forcedRootBlock);
+        setAll$1(element, getForcedRootBlockAttrs(editor));
+        append$1(element, SugarElement.fromTag('br'));
+        if (down) {
+          after$4(SugarElement.fromDom(table), element);
+        } else {
+          before$3(SugarElement.fromDom(table), element);
+        }
+        const rng = editor.dom.createRng();
+        rng.setStart(element.dom, 0);
+        rng.setEnd(element.dom, 0);
+        moveToRange(editor, rng);
+      });
+    };
+    const moveCaret = (editor, down, pos) => {
+      const table = down ? getTable(true, pos) : getTable(false, pos);
+      const last = down === false;
+      table.fold(() => moveToRange(editor, pos.toRange()), table => positionIn(last, editor.getBody()).filter(lastPos => lastPos.isEqual(pos)).fold(() => moveToRange(editor, pos.toRange()), _ => renderBlock(down, editor, table)));
+    };
+    const navigateVertically = (editor, down, table, td) => {
+      const rng = editor.selection.getRng();
+      const pos = CaretPosition.fromRangeStart(rng);
+      const root = editor.getBody();
+      if (!down && isAtFirstTableCellLine(td, pos)) {
+        const newPos = getClosestAbovePosition(root, table, pos);
+        moveCaret(editor, down, newPos);
+        return true;
+      } else if (down && isAtLastTableCellLine(td, pos)) {
+        const newPos = getClosestBelowPosition(root, table, pos);
+        moveCaret(editor, down, newPos);
+        return true;
+      } else {
+        return false;
+      }
+    };
+    const move$1 = (editor, forward, mover) => Optional.from(editor.dom.getParent(editor.selection.getNode(), 'td,th')).bind(td => Optional.from(editor.dom.getParent(td, 'table')).map(table => mover(editor, forward, table, td))).getOr(false);
+    const moveH = (editor, forward) => move$1(editor, forward, navigateHorizontally);
+    const moveV = (editor, forward) => move$1(editor, forward, navigateVertically);
+    const getCellFirstCursorPosition = cell => {
+      const selection = SimSelection.exact(cell, 0, cell, 0);
+      return toNative(selection);
+    };
+    const tabGo = (editor, isRoot, cell) => {
+      return cell.fold(Optional.none, Optional.none, (_current, next) => {
+        return first(next).map(cell => {
+          return getCellFirstCursorPosition(cell);
+        });
+      }, current => {
+        editor.execCommand('mceTableInsertRowAfter');
+        return tabForward(editor, isRoot, current);
+      });
+    };
+    const tabForward = (editor, isRoot, cell) => tabGo(editor, isRoot, next(cell, isEditable));
+    const tabBackward = (editor, isRoot, cell) => tabGo(editor, isRoot, prev(cell, isEditable));
+    const handleTab = (editor, forward) => {
+      const rootElements = [
+        'table',
+        'li',
+        'dl'
+      ];
+      const body = SugarElement.fromDom(editor.getBody());
+      const isRoot = element => {
+        const name$1 = name(element);
+        return eq(element, body) || contains$2(rootElements, name$1);
+      };
+      const rng = editor.selection.getRng();
+      const container = SugarElement.fromDom(!forward ? rng.startContainer : rng.endContainer);
+      return cell(container, isRoot).map(cell => {
+        table(cell, isRoot).each(table => {
+          editor.model.table.clearSelectedCells(table.dom);
+        });
+        editor.selection.collapse(!forward);
+        const navigation = !forward ? tabBackward : tabForward;
+        const rng = navigation(editor, isRoot, cell);
+        rng.each(range => {
+          editor.selection.setRng(range);
+        });
+        return true;
+      }).getOr(false);
+    };
+
+    const executeKeydownOverride$4 = (editor, caret, evt) => {
+      const os = detect$2().os;
+      execute([
+        {
+          keyCode: VK.RIGHT,
+          action: action(moveH$2, editor, true)
+        },
+        {
+          keyCode: VK.LEFT,
+          action: action(moveH$2, editor, false)
+        },
+        {
+          keyCode: VK.UP,
+          action: action(moveV$3, editor, false)
+        },
+        {
+          keyCode: VK.DOWN,
+          action: action(moveV$3, editor, true)
+        },
+        {
+          keyCode: VK.RIGHT,
+          action: action(moveH, editor, true)
+        },
+        {
+          keyCode: VK.LEFT,
+          action: action(moveH, editor, false)
+        },
+        {
+          keyCode: VK.UP,
+          action: action(moveV, editor, false)
+        },
+        {
+          keyCode: VK.DOWN,
+          action: action(moveV, editor, true)
+        },
+        {
+          keyCode: VK.RIGHT,
+          action: action(moveH$1, editor, true)
+        },
+        {
+          keyCode: VK.LEFT,
+          action: action(moveH$1, editor, false)
+        },
+        {
+          keyCode: VK.UP,
+          action: action(moveV$1, editor, false)
+        },
+        {
+          keyCode: VK.DOWN,
+          action: action(moveV$1, editor, true)
+        },
+        {
+          keyCode: VK.RIGHT,
+          action: action(move$2, editor, caret, true)
+        },
+        {
+          keyCode: VK.LEFT,
+          action: action(move$2, editor, caret, false)
+        },
+        {
+          keyCode: VK.RIGHT,
+          ctrlKey: !os.isMacOS(),
+          altKey: os.isMacOS(),
+          action: action(moveNextWord, editor, caret)
+        },
+        {
+          keyCode: VK.LEFT,
+          ctrlKey: !os.isMacOS(),
+          altKey: os.isMacOS(),
+          action: action(movePrevWord, editor, caret)
+        },
+        {
+          keyCode: VK.UP,
+          action: action(moveV$2, editor, false)
+        },
+        {
+          keyCode: VK.DOWN,
+          action: action(moveV$2, editor, true)
+        }
+      ], evt).each(_ => {
+        evt.preventDefault();
+      });
+    };
+    const setup$k = (editor, caret) => {
+      editor.on('keydown', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeydownOverride$4(editor, caret, evt);
+        }
+      });
+    };
+
+    const point = (container, offset) => ({
+      container,
+      offset
+    });
+
+    const DOM$7 = DOMUtils.DOM;
+    const alwaysNext = startNode => node => startNode === node ? -1 : 0;
+    const isBoundary = dom => node => dom.isBlock(node) || contains$2([
+      'BR',
+      'IMG',
+      'HR',
+      'INPUT'
+    ], node.nodeName) || dom.getContentEditable(node) === 'false';
+    const textBefore = (node, offset, rootNode) => {
+      if (isText$8(node) && offset >= 0) {
+        return Optional.some(point(node, offset));
+      } else {
+        const textSeeker = TextSeeker(DOM$7);
+        return Optional.from(textSeeker.backwards(node, offset, alwaysNext(node), rootNode)).map(prev => point(prev.container, prev.container.data.length));
+      }
+    };
+    const textAfter = (node, offset, rootNode) => {
+      if (isText$8(node) && offset >= node.length) {
+        return Optional.some(point(node, offset));
+      } else {
+        const textSeeker = TextSeeker(DOM$7);
+        return Optional.from(textSeeker.forwards(node, offset, alwaysNext(node), rootNode)).map(prev => point(prev.container, 0));
+      }
+    };
+    const scanLeft = (node, offset, rootNode) => {
+      if (!isText$8(node)) {
+        return Optional.none();
+      }
+      const text = node.textContent;
+      if (offset >= 0 && offset <= text.length) {
+        return Optional.some(point(node, offset));
+      } else {
+        const textSeeker = TextSeeker(DOM$7);
+        return Optional.from(textSeeker.backwards(node, offset, alwaysNext(node), rootNode)).bind(prev => {
+          const prevText = prev.container.data;
+          return scanLeft(prev.container, offset + prevText.length, rootNode);
+        });
+      }
+    };
+    const scanRight = (node, offset, rootNode) => {
+      if (!isText$8(node)) {
+        return Optional.none();
+      }
+      const text = node.textContent;
+      if (offset <= text.length) {
+        return Optional.some(point(node, offset));
+      } else {
+        const textSeeker = TextSeeker(DOM$7);
+        return Optional.from(textSeeker.forwards(node, offset, alwaysNext(node), rootNode)).bind(next => scanRight(next.container, offset - text.length, rootNode));
+      }
+    };
+    const repeatLeft = (dom, node, offset, process, rootNode) => {
+      const search = TextSeeker(dom, isBoundary(dom));
+      return Optional.from(search.backwards(node, offset, process, rootNode));
+    };
+
+    const isValidTextRange = rng => rng.collapsed && rng.startContainer.nodeType === 3;
+    const getText = rng => rng.toString().replace(/\u00A0/g, ' ').replace(/\uFEFF/g, '');
+    const isWhitespace = chr => chr !== '' && ' \xA0\f\n\r\t\x0B'.indexOf(chr) !== -1;
+
+    const stripTriggerChar = (text, triggerCh) => text.substring(triggerCh.length);
+    const findChar = (text, index, ch) => {
+      let i;
+      for (i = index - 1; i >= 0; i--) {
+        const char = text.charAt(i);
+        if (isWhitespace(char)) {
+          return Optional.none();
+        }
+        if (char === ch) {
+          break;
+        }
+      }
+      return Optional.some(i);
+    };
+    const findStart = (dom, initRange, ch, minChars = 0) => {
+      if (!isValidTextRange(initRange)) {
+        return Optional.none();
+      }
+      const findTriggerChIndex = (element, offset, text) => findChar(text, offset, ch).getOr(offset);
+      const root = dom.getParent(initRange.startContainer, dom.isBlock) || dom.getRoot();
+      return repeatLeft(dom, initRange.startContainer, initRange.startOffset, findTriggerChIndex, root).bind(spot => {
+        const range = initRange.cloneRange();
+        range.setStart(spot.container, spot.offset);
+        range.setEnd(initRange.endContainer, initRange.endOffset);
+        if (range.collapsed) {
+          return Optional.none();
+        }
+        const text = getText(range);
+        const triggerCharIndex = text.lastIndexOf(ch);
+        if (triggerCharIndex !== 0 || stripTriggerChar(text, ch).length < minChars) {
+          return Optional.none();
+        } else {
+          return Optional.some({
+            text: stripTriggerChar(text, ch),
+            range,
+            triggerChar: ch
+          });
+        }
+      });
+    };
+    const getContext = (dom, initRange, ch, minChars = 0) => detect$1(SugarElement.fromDom(initRange.startContainer)).fold(() => findStart(dom, initRange, ch, minChars), elm => {
+      const range = dom.createRng();
+      range.selectNode(elm.dom);
+      const text = getText(range);
+      return Optional.some({
+        range,
+        text: stripTriggerChar(text, ch),
+        triggerChar: ch
+      });
+    });
+
+    const isText = node => node.nodeType === TEXT;
+    const isElement = node => node.nodeType === ELEMENT;
+    const toLast = node => {
+      if (isText(node)) {
+        return point(node, node.data.length);
+      } else {
+        const children = node.childNodes;
+        return children.length > 0 ? toLast(children[children.length - 1]) : point(node, children.length);
+      }
+    };
+    const toLeaf = (node, offset) => {
+      const children = node.childNodes;
+      if (children.length > 0 && offset < children.length) {
+        return toLeaf(children[offset], 0);
+      } else if (children.length > 0 && isElement(node) && children.length === offset) {
+        return toLast(children[children.length - 1]);
+      } else {
+        return point(node, offset);
+      }
+    };
+
+    const isPreviousCharContent = (dom, leaf) => repeatLeft(dom, leaf.container, leaf.offset, (element, offset) => offset === 0 ? -1 : offset, dom.getRoot()).filter(spot => {
+      const char = spot.container.data.charAt(spot.offset - 1);
+      return !isWhitespace(char);
+    }).isSome();
+    const isStartOfWord = dom => rng => {
+      const leaf = toLeaf(rng.startContainer, rng.startOffset);
+      return !isPreviousCharContent(dom, leaf);
+    };
+    const getTriggerContext = (dom, initRange, database) => findMap(database.triggerChars, ch => getContext(dom, initRange, ch));
+    const lookup = (editor, getDatabase) => {
+      const database = getDatabase();
+      const rng = editor.selection.getRng();
+      return getTriggerContext(editor.dom, rng, database).bind(context => lookupWithContext(editor, getDatabase, context));
+    };
+    const lookupWithContext = (editor, getDatabase, context, fetchOptions = {}) => {
+      const database = getDatabase();
+      const rng = editor.selection.getRng();
+      const startText = rng.startContainer.nodeValue;
+      const autocompleters = filter$6(database.lookupByChar(context.triggerChar), autocompleter => context.text.length >= autocompleter.minChars && autocompleter.matches.getOrThunk(() => isStartOfWord(editor.dom))(context.range, startText, context.text));
+      if (autocompleters.length === 0) {
+        return Optional.none();
+      }
+      const lookupData = Promise.all(map$3(autocompleters, ac => {
+        const fetchResult = ac.fetch(context.text, ac.maxResults, fetchOptions);
+        return fetchResult.then(results => ({
+          matchText: context.text,
+          items: results,
+          columns: ac.columns,
+          onAction: ac.onAction,
+          highlightOn: ac.highlightOn
+        }));
+      }));
+      return Optional.some({
+        lookupData,
+        context
+      });
+    };
+
+    var SimpleResultType;
+    (function (SimpleResultType) {
+      SimpleResultType[SimpleResultType['Error'] = 0] = 'Error';
+      SimpleResultType[SimpleResultType['Value'] = 1] = 'Value';
+    }(SimpleResultType || (SimpleResultType = {})));
+    const fold$1 = (res, onError, onValue) => res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue);
+    const partition = results => {
+      const values = [];
+      const errors = [];
+      each$g(results, obj => {
+        fold$1(obj, err => errors.push(err), val => values.push(val));
+      });
+      return {
+        values,
+        errors
+      };
+    };
+    const mapError = (res, f) => {
+      if (res.stype === SimpleResultType.Error) {
+        return {
+          stype: SimpleResultType.Error,
+          serror: f(res.serror)
+        };
+      } else {
+        return res;
+      }
+    };
+    const map = (res, f) => {
+      if (res.stype === SimpleResultType.Value) {
+        return {
+          stype: SimpleResultType.Value,
+          svalue: f(res.svalue)
+        };
+      } else {
+        return res;
+      }
+    };
+    const bind = (res, f) => {
+      if (res.stype === SimpleResultType.Value) {
+        return f(res.svalue);
+      } else {
+        return res;
+      }
+    };
+    const bindError = (res, f) => {
+      if (res.stype === SimpleResultType.Error) {
+        return f(res.serror);
+      } else {
+        return res;
+      }
+    };
+    const svalue = v => ({
+      stype: SimpleResultType.Value,
+      svalue: v
+    });
+    const serror = e => ({
+      stype: SimpleResultType.Error,
+      serror: e
+    });
+    const toResult = res => fold$1(res, Result.error, Result.value);
+    const fromResult = res => res.fold(serror, svalue);
+    const SimpleResult = {
+      fromResult,
+      toResult,
+      svalue,
+      partition,
+      serror,
+      bind,
+      bindError,
+      map,
+      mapError,
+      fold: fold$1
+    };
+
+    const formatObj = input => {
+      return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2);
+    };
+    const formatErrors = errors => {
+      const es = errors.length > 10 ? errors.slice(0, 10).concat([{
+          path: [],
+          getErrorInfo: constant('... (only showing first ten failures)')
+        }]) : errors;
+      return map$3(es, e => {
+        return 'Failed path: (' + e.path.join(' > ') + ')\n' + e.getErrorInfo();
+      });
+    };
+
+    const nu = (path, getErrorInfo) => {
+      return SimpleResult.serror([{
+          path,
+          getErrorInfo
+        }]);
+    };
+    const missingRequired = (path, key, obj) => nu(path, () => 'Could not find valid *required* value for "' + key + '" in ' + formatObj(obj));
+    const missingKey = (path, key) => nu(path, () => 'Choice schema did not contain choice key: "' + key + '"');
+    const missingBranch = (path, branches, branch) => nu(path, () => 'The chosen schema: "' + branch + '" did not exist in branches: ' + formatObj(branches));
+    const custom = (path, err) => nu(path, constant(err));
+
+    const chooseFrom = (path, input, branches, ch) => {
+      const fields = get$a(branches, ch);
+      return fields.fold(() => missingBranch(path, branches, ch), vp => vp.extract(path.concat(['branch: ' + ch]), input));
+    };
+    const choose$1 = (key, branches) => {
+      const extract = (path, input) => {
+        const choice = get$a(input, key);
+        return choice.fold(() => missingKey(path, key), chosen => chooseFrom(path, input, branches, chosen));
+      };
+      const toString = () => 'chooseOn(' + key + '). Possible values: ' + keys(branches);
+      return {
+        extract,
+        toString
+      };
+    };
+
+    const shallow = (old, nu) => {
+      return nu;
+    };
+    const deep = (old, nu) => {
+      const bothObjects = isPlainObject(old) && isPlainObject(nu);
+      return bothObjects ? deepMerge(old, nu) : nu;
+    };
+    const baseMerge = merger => {
+      return (...objects) => {
+        if (objects.length === 0) {
+          throw new Error(`Can't merge zero objects`);
+        }
+        const ret = {};
+        for (let j = 0; j < objects.length; j++) {
+          const curObject = objects[j];
+          for (const key in curObject) {
+            if (has$2(curObject, key)) {
+              ret[key] = merger(ret[key], curObject[key]);
+            }
+          }
+        }
+        return ret;
+      };
+    };
+    const deepMerge = baseMerge(deep);
+    const merge = baseMerge(shallow);
+
+    const required = () => ({
+      tag: 'required',
+      process: {}
+    });
+    const defaultedThunk = fallbackThunk => ({
+      tag: 'defaultedThunk',
+      process: fallbackThunk
+    });
+    const defaulted$1 = fallback => defaultedThunk(constant(fallback));
+    const asOption = () => ({
+      tag: 'option',
+      process: {}
+    });
+
+    const mergeValues = (values, base) => values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge.apply(undefined, values))) : SimpleResult.svalue(base);
+    const mergeErrors = errors => compose(SimpleResult.serror, flatten)(errors);
+    const consolidateObj = (objects, base) => {
+      const partition = SimpleResult.partition(objects);
+      return partition.errors.length > 0 ? mergeErrors(partition.errors) : mergeValues(partition.values, base);
+    };
+    const consolidateArr = objects => {
+      const partitions = SimpleResult.partition(objects);
+      return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : SimpleResult.svalue(partitions.values);
+    };
+    const ResultCombine = {
+      consolidateObj,
+      consolidateArr
+    };
+
+    const field$1 = (key, newKey, presence, prop) => ({
+      tag: 'field',
+      key,
+      newKey,
+      presence,
+      prop
+    });
+    const customField$1 = (newKey, instantiator) => ({
+      tag: 'custom',
+      newKey,
+      instantiator
+    });
+    const fold = (value, ifField, ifCustom) => {
+      switch (value.tag) {
+      case 'field':
+        return ifField(value.key, value.newKey, value.presence, value.prop);
+      case 'custom':
+        return ifCustom(value.newKey, value.instantiator);
+      }
+    };
+
+    const value = validator => {
+      const extract = (path, val) => {
+        return SimpleResult.bindError(validator(val), err => custom(path, err));
+      };
+      const toString = constant('val');
+      return {
+        extract,
+        toString
+      };
+    };
+    const anyValue$1 = value(SimpleResult.svalue);
+
+    const requiredAccess = (path, obj, key, bundle) => get$a(obj, key).fold(() => missingRequired(path, key, obj), bundle);
+    const fallbackAccess = (obj, key, fallback, bundle) => {
+      const v = get$a(obj, key).getOrThunk(() => fallback(obj));
+      return bundle(v);
+    };
+    const optionAccess = (obj, key, bundle) => bundle(get$a(obj, key));
+    const optionDefaultedAccess = (obj, key, fallback, bundle) => {
+      const opt = get$a(obj, key).map(val => val === true ? fallback(obj) : val);
+      return bundle(opt);
+    };
+    const extractField = (field, path, obj, key, prop) => {
+      const bundle = av => prop.extract(path.concat([key]), av);
+      const bundleAsOption = optValue => optValue.fold(() => SimpleResult.svalue(Optional.none()), ov => {
+        const result = prop.extract(path.concat([key]), ov);
+        return SimpleResult.map(result, Optional.some);
+      });
+      switch (field.tag) {
+      case 'required':
+        return requiredAccess(path, obj, key, bundle);
+      case 'defaultedThunk':
+        return fallbackAccess(obj, key, field.process, bundle);
+      case 'option':
+        return optionAccess(obj, key, bundleAsOption);
+      case 'defaultedOptionThunk':
+        return optionDefaultedAccess(obj, key, field.process, bundleAsOption);
+      case 'mergeWithThunk': {
+          return fallbackAccess(obj, key, constant({}), v => {
+            const result = deepMerge(field.process(obj), v);
+            return bundle(result);
+          });
+        }
+      }
+    };
+    const extractFields = (path, obj, fields) => {
+      const success = {};
+      const errors = [];
+      for (const field of fields) {
+        fold(field, (key, newKey, presence, prop) => {
+          const result = extractField(presence, path, obj, key, prop);
+          SimpleResult.fold(result, err => {
+            errors.push(...err);
+          }, res => {
+            success[newKey] = res;
+          });
+        }, (newKey, instantiator) => {
+          success[newKey] = instantiator(obj);
+        });
+      }
+      return errors.length > 0 ? SimpleResult.serror(errors) : SimpleResult.svalue(success);
+    };
+    const objOf = values => {
+      const extract = (path, o) => extractFields(path, o, values);
+      const toString = () => {
+        const fieldStrings = map$3(values, value => fold(value, (key, _okey, _presence, prop) => key + ' -> ' + prop.toString(), (newKey, _instantiator) => 'state(' + newKey + ')'));
+        return 'obj{\n' + fieldStrings.join('\n') + '}';
+      };
+      return {
+        extract,
+        toString
+      };
+    };
+    const arrOf = prop => {
+      const extract = (path, array) => {
+        const results = map$3(array, (a, i) => prop.extract(path.concat(['[' + i + ']']), a));
+        return ResultCombine.consolidateArr(results);
+      };
+      const toString = () => 'array(' + prop.toString() + ')';
+      return {
+        extract,
+        toString
+      };
+    };
+
+    const valueOf = validator => value(v => validator(v).fold(SimpleResult.serror, SimpleResult.svalue));
+    const extractValue = (label, prop, obj) => {
+      const res = prop.extract([label], obj);
+      return SimpleResult.mapError(res, errs => ({
+        input: obj,
+        errors: errs
+      }));
+    };
+    const asRaw = (label, prop, obj) => SimpleResult.toResult(extractValue(label, prop, obj));
+    const formatError = errInfo => {
+      return 'Errors: \n' + formatErrors(errInfo.errors).join('\n') + '\n\nInput object: ' + formatObj(errInfo.input);
+    };
+    const choose = (key, branches) => choose$1(key, map$2(branches, objOf));
+
+    const anyValue = constant(anyValue$1);
+    const typedValue = (validator, expectedType) => value(a => {
+      const actualType = typeof a;
+      return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror(`Expected type: ${ expectedType } but got: ${ actualType }`);
+    });
+    const number = typedValue(isNumber, 'number');
+    const string = typedValue(isString, 'string');
+    const boolean = typedValue(isBoolean, 'boolean');
+    const functionProcessor = typedValue(isFunction, 'function');
+
+    const field = field$1;
+    const customField = customField$1;
+    const validateEnum = values => valueOf(value => contains$2(values, value) ? Result.value(value) : Result.error(`Unsupported value: "${ value }", choose one of "${ values.join(', ') }".`));
+    const requiredOf = (key, schema) => field(key, key, required(), schema);
+    const requiredString = key => requiredOf(key, string);
+    const requiredFunction = key => requiredOf(key, functionProcessor);
+    const requiredArrayOf = (key, schema) => field(key, key, required(), arrOf(schema));
+    const optionOf = (key, schema) => field(key, key, asOption(), schema);
+    const optionString = key => optionOf(key, string);
+    const optionFunction = key => optionOf(key, functionProcessor);
+    const defaulted = (key, fallback) => field(key, key, defaulted$1(fallback), anyValue());
+    const defaultedOf = (key, fallback, schema) => field(key, key, defaulted$1(fallback), schema);
+    const defaultedNumber = (key, fallback) => defaultedOf(key, fallback, number);
+    const defaultedString = (key, fallback) => defaultedOf(key, fallback, string);
+    const defaultedStringEnum = (key, fallback, values) => defaultedOf(key, fallback, validateEnum(values));
+    const defaultedBoolean = (key, fallback) => defaultedOf(key, fallback, boolean);
+    const defaultedFunction = (key, fallback) => defaultedOf(key, fallback, functionProcessor);
+    const defaultedArrayOf = (key, fallback, schema) => defaultedOf(key, fallback, arrOf(schema));
+
+    const type = requiredString('type');
+    const fetch = requiredFunction('fetch');
+    const onAction = requiredFunction('onAction');
+    const onSetup = defaultedFunction('onSetup', () => noop);
+    const optionalText = optionString('text');
+    const optionalIcon = optionString('icon');
+    const optionalTooltip = optionString('tooltip');
+    const optionalLabel = optionString('label');
+    const active = defaultedBoolean('active', false);
+    const enabled = defaultedBoolean('enabled', true);
+    const primary = defaultedBoolean('primary', false);
+    const defaultedColumns = num => defaulted('columns', num);
+    const defaultedType = type => defaultedString('type', type);
+
+    const autocompleterSchema = objOf([
+      type,
+      requiredString('ch'),
+      defaultedNumber('minChars', 1),
+      defaultedColumns(1),
+      defaultedNumber('maxResults', 10),
+      optionFunction('matches'),
+      fetch,
+      onAction,
+      defaultedArrayOf('highlightOn', [], string)
+    ]);
+    const createAutocompleter = spec => asRaw('Autocompleter', autocompleterSchema, spec);
+
+    const baseToolbarButtonFields = [
+      enabled,
+      optionalTooltip,
+      optionalIcon,
+      optionalText,
+      onSetup
+    ];
+
+    const baseToolbarToggleButtonFields = [active].concat(baseToolbarButtonFields);
+
+    const contextBarFields = [
+      defaultedFunction('predicate', never),
+      defaultedStringEnum('scope', 'node', [
+        'node',
+        'editor'
+      ]),
+      defaultedStringEnum('position', 'selection', [
+        'node',
+        'selection',
+        'line'
+      ])
+    ];
+
+    const contextButtonFields = baseToolbarButtonFields.concat([
+      defaultedType('contextformbutton'),
+      primary,
+      onAction,
+      customField('original', identity)
+    ]);
+    const contextToggleButtonFields = baseToolbarToggleButtonFields.concat([
+      defaultedType('contextformbutton'),
+      primary,
+      onAction,
+      customField('original', identity)
+    ]);
+    const launchButtonFields = baseToolbarButtonFields.concat([defaultedType('contextformbutton')]);
+    const launchToggleButtonFields = baseToolbarToggleButtonFields.concat([defaultedType('contextformtogglebutton')]);
+    const toggleOrNormal = choose('type', {
+      contextformbutton: contextButtonFields,
+      contextformtogglebutton: contextToggleButtonFields
+    });
+    objOf([
+      defaultedType('contextform'),
+      defaultedFunction('initValue', constant('')),
+      optionalLabel,
+      requiredArrayOf('commands', toggleOrNormal),
+      optionOf('launch', choose('type', {
+        contextformbutton: launchButtonFields,
+        contextformtogglebutton: launchToggleButtonFields
+      }))
+    ].concat(contextBarFields));
+
+    const register$2 = editor => {
+      const popups = editor.ui.registry.getAll().popups;
+      const dataset = map$2(popups, popup => createAutocompleter(popup).fold(err => {
+        throw new Error(formatError(err));
+      }, identity));
+      const triggerChars = stringArray(mapToArray(dataset, v => v.ch));
+      const datasetValues = values(dataset);
+      const lookupByChar = ch => filter$6(datasetValues, dv => dv.ch === ch);
+      return {
+        dataset,
+        triggerChars,
+        lookupByChar
+      };
+    };
+
+    const setupEditorInput = (editor, api) => {
+      const update = last$1(api.load, 50);
+      editor.on('keypress compositionend', e => {
+        if (e.which === 27) {
+          return;
+        }
+        update.throttle();
+      });
+      editor.on('keydown', e => {
+        const keyCode = e.which;
+        if (keyCode === 8) {
+          update.throttle();
+        } else if (keyCode === 27) {
+          api.cancelIfNecessary();
+        }
+      });
+      editor.on('remove', update.cancel);
+    };
+    const setup$j = editor => {
+      const activeAutocompleter = value$2();
+      const uiActive = Cell(false);
+      const isActive = activeAutocompleter.isSet;
+      const cancelIfNecessary = () => {
+        if (isActive()) {
+          removeAutocompleterDecoration(editor);
+          fireAutocompleterEnd(editor);
+          uiActive.set(false);
+          activeAutocompleter.clear();
+        }
+      };
+      const commenceIfNecessary = context => {
+        if (!isActive()) {
+          addAutocompleterDecoration(editor, context.range);
+          activeAutocompleter.set({
+            triggerChar: context.triggerChar,
+            matchLength: context.text.length
+          });
+        }
+      };
+      const getAutocompleters = cached(() => register$2(editor));
+      const doLookup = fetchOptions => activeAutocompleter.get().map(ac => getContext(editor.dom, editor.selection.getRng(), ac.triggerChar).bind(newContext => lookupWithContext(editor, getAutocompleters, newContext, fetchOptions))).getOrThunk(() => lookup(editor, getAutocompleters));
+      const load = fetchOptions => {
+        doLookup(fetchOptions).fold(cancelIfNecessary, lookupInfo => {
+          commenceIfNecessary(lookupInfo.context);
+          lookupInfo.lookupData.then(lookupData => {
+            activeAutocompleter.get().map(ac => {
+              const context = lookupInfo.context;
+              if (ac.triggerChar === context.triggerChar) {
+                if (context.text.length - ac.matchLength >= 10) {
+                  cancelIfNecessary();
+                } else {
+                  activeAutocompleter.set({
+                    ...ac,
+                    matchLength: context.text.length
+                  });
+                  if (uiActive.get()) {
+                    fireAutocompleterUpdate(editor, { lookupData });
+                  } else {
+                    uiActive.set(true);
+                    fireAutocompleterStart(editor, { lookupData });
+                  }
+                }
+              }
+            });
+          });
+        });
+      };
+      editor.addCommand('mceAutocompleterReload', (_ui, value) => {
+        const fetchOptions = isObject(value) ? value.fetchOptions : {};
+        load(fetchOptions);
+      });
+      editor.addCommand('mceAutocompleterClose', cancelIfNecessary);
+      setupEditorInput(editor, {
+        cancelIfNecessary,
+        load
+      });
+    };
+
+    const createAndFireInputEvent = eventType => (editor, inputType, specifics = {}) => {
+      const target = editor.getBody();
+      const overrides = {
+        bubbles: true,
+        composed: true,
+        data: null,
+        isComposing: false,
+        detail: 0,
+        view: null,
+        target,
+        currentTarget: target,
+        eventPhase: Event.AT_TARGET,
+        originalTarget: target,
+        explicitOriginalTarget: target,
+        isTrusted: false,
+        srcElement: target,
+        cancelable: false,
+        preventDefault: noop,
+        inputType
+      };
+      const input = clone$3(new InputEvent(eventType));
+      return editor.dispatch(eventType, {
+        ...input,
+        ...overrides,
+        ...specifics
+      });
+    };
+    const fireFakeInputEvent = createAndFireInputEvent('input');
+    const fireFakeBeforeInputEvent = createAndFireInputEvent('beforeinput');
+
+    const executeKeydownOverride$3 = (editor, caret, evt) => {
+      const inputType = evt.keyCode === VK.BACKSPACE ? 'deleteContentBackward' : 'deleteContentForward';
+      executeWithDelayedAction([
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete, editor)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$5, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$5, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$6, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$6, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$3, editor, caret, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$3, editor, caret, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$9, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$9, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$4, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$4, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$1, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$1, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$7, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$7, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$8, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$8, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$2, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$2, editor, true)
+        }
+      ], evt).each(applyAction => {
+        evt.preventDefault();
+        const beforeInput = fireFakeBeforeInputEvent(editor, inputType);
+        if (!beforeInput.isDefaultPrevented()) {
+          applyAction();
+          fireFakeInputEvent(editor, inputType);
+        }
+      });
+    };
+    const executeKeyupOverride = (editor, evt) => {
+      execute([
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(paddEmptyElement, editor)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(paddEmptyElement, editor)
+        }
+      ], evt);
+    };
+    const setup$i = (editor, caret) => {
+      editor.on('keydown', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeydownOverride$3(editor, caret, evt);
+        }
+      });
+      editor.on('keyup', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeyupOverride(editor, evt);
+        }
+      });
+    };
+
+    const firstNonWhiteSpaceNodeSibling = node => {
+      while (node) {
+        if (node.nodeType === 1 || node.nodeType === 3 && node.data && /[\r\n\s]/.test(node.data)) {
+          return node;
+        }
+        node = node.nextSibling;
+      }
+    };
+    const moveToCaretPosition = (editor, root) => {
+      let node, lastNode = root;
+      const dom = editor.dom;
+      const moveCaretBeforeOnEnterElementsMap = editor.schema.getMoveCaretBeforeOnEnterElements();
+      if (!root) {
+        return;
+      }
+      if (/^(LI|DT|DD)$/.test(root.nodeName)) {
+        const firstChild = firstNonWhiteSpaceNodeSibling(root.firstChild);
+        if (firstChild && /^(UL|OL|DL)$/.test(firstChild.nodeName)) {
+          root.insertBefore(dom.doc.createTextNode(nbsp), root.firstChild);
+        }
+      }
+      const rng = dom.createRng();
+      root.normalize();
+      if (root.hasChildNodes()) {
+        const walker = new DomTreeWalker(root, root);
+        while (node = walker.current()) {
+          if (isText$8(node)) {
+            rng.setStart(node, 0);
+            rng.setEnd(node, 0);
+            break;
+          }
+          if (moveCaretBeforeOnEnterElementsMap[node.nodeName.toLowerCase()]) {
+            rng.setStartBefore(node);
+            rng.setEndBefore(node);
+            break;
+          }
+          lastNode = node;
+          node = walker.next();
+        }
+        if (!node) {
+          rng.setStart(lastNode, 0);
+          rng.setEnd(lastNode, 0);
+        }
+      } else {
+        if (isBr$5(root)) {
+          if (root.nextSibling && dom.isBlock(root.nextSibling)) {
+            rng.setStartBefore(root);
+            rng.setEndBefore(root);
+          } else {
+            rng.setStartAfter(root);
+            rng.setEndAfter(root);
+          }
+        } else {
+          rng.setStart(root, 0);
+          rng.setEnd(root, 0);
+        }
+      }
+      editor.selection.setRng(rng);
+      scrollRangeIntoView(editor, rng);
+    };
+    const getEditableRoot$1 = (dom, node) => {
+      const root = dom.getRoot();
+      let parent, editableRoot;
+      parent = node;
+      while (parent !== root && dom.getContentEditable(parent) !== 'false') {
+        if (dom.getContentEditable(parent) === 'true') {
+          editableRoot = parent;
+        }
+        parent = parent.parentNode;
+      }
+      return parent !== root ? editableRoot : root;
+    };
+    const getParentBlock$1 = editor => {
+      return Optional.from(editor.dom.getParent(editor.selection.getStart(true), editor.dom.isBlock));
+    };
+    const getParentBlockName = editor => {
+      return getParentBlock$1(editor).fold(constant(''), parentBlock => {
+        return parentBlock.nodeName.toUpperCase();
+      });
+    };
+    const isListItemParentBlock = editor => {
+      return getParentBlock$1(editor).filter(elm => {
+        return isListItem(SugarElement.fromDom(elm));
+      }).isSome();
+    };
+
+    const hasFirstChild = (elm, name) => {
+      return elm.firstChild && elm.firstChild.nodeName === name;
+    };
+    const isFirstChild = elm => {
+      var _a;
+      return ((_a = elm.parentNode) === null || _a === void 0 ? void 0 : _a.firstChild) === elm;
+    };
+    const hasParent = (elm, parentName) => {
+      return elm && elm.parentNode && elm.parentNode.nodeName === parentName;
+    };
+    const isListBlock = elm => {
+      return elm && /^(OL|UL|LI)$/.test(elm.nodeName);
+    };
+    const isNestedList = elm => {
+      return isListBlock(elm) && isListBlock(elm.parentNode);
+    };
+    const getContainerBlock = containerBlock => {
+      const containerBlockParent = containerBlock.parentNode;
+      if (/^(LI|DT|DD)$/.test(containerBlockParent.nodeName)) {
+        return containerBlockParent;
+      }
+      return containerBlock;
+    };
+    const isFirstOrLastLi = (containerBlock, parentBlock, first) => {
+      let node = containerBlock[first ? 'firstChild' : 'lastChild'];
+      while (node) {
+        if (isElement$6(node)) {
+          break;
+        }
+        node = node[first ? 'nextSibling' : 'previousSibling'];
+      }
+      return node === parentBlock;
+    };
+    const insert$3 = (editor, createNewBlock, containerBlock, parentBlock, newBlockName) => {
+      const dom = editor.dom;
+      const rng = editor.selection.getRng();
+      if (containerBlock === editor.getBody()) {
+        return;
+      }
+      if (isNestedList(containerBlock)) {
+        newBlockName = 'LI';
+      }
+      let newBlock = createNewBlock(newBlockName);
+      if (isFirstOrLastLi(containerBlock, parentBlock, true) && isFirstOrLastLi(containerBlock, parentBlock, false)) {
+        if (hasParent(containerBlock, 'LI')) {
+          const containerBlockParent = getContainerBlock(containerBlock);
+          dom.insertAfter(newBlock, containerBlockParent);
+          if (isFirstChild(containerBlock)) {
+            dom.remove(containerBlockParent);
+          } else {
+            dom.remove(containerBlock);
+          }
+        } else {
+          dom.replace(newBlock, containerBlock);
+        }
+      } else if (isFirstOrLastLi(containerBlock, parentBlock, true)) {
+        if (hasParent(containerBlock, 'LI')) {
+          dom.insertAfter(newBlock, getContainerBlock(containerBlock));
+          newBlock.appendChild(dom.doc.createTextNode(' '));
+          newBlock.appendChild(containerBlock);
+        } else {
+          containerBlock.parentNode.insertBefore(newBlock, containerBlock);
+        }
+        dom.remove(parentBlock);
+      } else if (isFirstOrLastLi(containerBlock, parentBlock, false)) {
+        dom.insertAfter(newBlock, getContainerBlock(containerBlock));
+        dom.remove(parentBlock);
+      } else {
+        containerBlock = getContainerBlock(containerBlock);
+        const tmpRng = rng.cloneRange();
+        tmpRng.setStartAfter(parentBlock);
+        tmpRng.setEndAfter(containerBlock);
+        const fragment = tmpRng.extractContents();
+        if (newBlockName === 'LI' && hasFirstChild(fragment, 'LI')) {
+          newBlock = fragment.firstChild;
+          dom.insertAfter(fragment, containerBlock);
+        } else {
+          dom.insertAfter(fragment, containerBlock);
+          dom.insertAfter(newBlock, containerBlock);
+        }
+        dom.remove(parentBlock);
+      }
+      moveToCaretPosition(editor, newBlock);
+    };
+
+    const trimZwsp = fragment => {
+      each$g(descendants$1(SugarElement.fromDom(fragment), isText$9), text => {
+        const rawNode = text.dom;
+        rawNode.nodeValue = trim$1(rawNode.nodeValue);
+      });
+    };
+    const isEmptyAnchor = (dom, elm) => {
+      return elm && elm.nodeName === 'A' && dom.isEmpty(elm);
+    };
+    const isTableCell = node => {
+      return node && /^(TD|TH|CAPTION)$/.test(node.nodeName);
+    };
+    const emptyBlock = elm => {
+      elm.innerHTML = '<br data-mce-bogus="1">';
+    };
+    const containerAndSiblingName = (container, nodeName) => {
+      return container.nodeName === nodeName || container.previousSibling && container.previousSibling.nodeName === nodeName;
+    };
+    const canSplitBlock = (dom, node) => {
+      return node && dom.isBlock(node) && !/^(TD|TH|CAPTION|FORM)$/.test(node.nodeName) && !/^(fixed|absolute)/i.test(node.style.position) && dom.getContentEditable(node) !== 'true';
+    };
+    const trimInlineElementsOnLeftSideOfBlock = (dom, nonEmptyElementsMap, block) => {
+      let node = block;
+      const firstChilds = [];
+      let i;
+      if (!node) {
+        return;
+      }
+      while (node = node.firstChild) {
+        if (dom.isBlock(node)) {
+          return;
+        }
+        if (isElement$6(node) && !nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
+          firstChilds.push(node);
+        }
+      }
+      i = firstChilds.length;
+      while (i--) {
+        node = firstChilds[i];
+        if (!node.hasChildNodes() || node.firstChild === node.lastChild && node.firstChild.nodeValue === '') {
+          dom.remove(node);
+        } else {
+          if (isEmptyAnchor(dom, node)) {
+            dom.remove(node);
+          }
+        }
+      }
+    };
+    const normalizeZwspOffset = (start, container, offset) => {
+      if (isText$8(container) === false) {
+        return offset;
+      } else if (start) {
+        return offset === 1 && container.data.charAt(offset - 1) === ZWSP$1 ? 0 : offset;
+      } else {
+        return offset === container.data.length - 1 && container.data.charAt(offset) === ZWSP$1 ? container.data.length : offset;
+      }
+    };
+    const includeZwspInRange = rng => {
+      const newRng = rng.cloneRange();
+      newRng.setStart(rng.startContainer, normalizeZwspOffset(true, rng.startContainer, rng.startOffset));
+      newRng.setEnd(rng.endContainer, normalizeZwspOffset(false, rng.endContainer, rng.endOffset));
+      return newRng;
+    };
+    const trimLeadingLineBreaks = node => {
+      do {
+        if (isText$8(node)) {
+          node.nodeValue = node.nodeValue.replace(/^[\r\n]+/, '');
+        }
+        node = node.firstChild;
+      } while (node);
+    };
+    const getEditableRoot = (dom, node) => {
+      const root = dom.getRoot();
+      let parent, editableRoot;
+      parent = node;
+      while (parent !== root && dom.getContentEditable(parent) !== 'false') {
+        if (dom.getContentEditable(parent) === 'true') {
+          editableRoot = parent;
+        }
+        parent = parent.parentNode;
+      }
+      return parent !== root ? editableRoot : root;
+    };
+    const applyAttributes = (editor, node, forcedRootBlockAttrs) => {
+      const dom = editor.dom;
+      Optional.from(forcedRootBlockAttrs.style).map(dom.parseStyle).each(attrStyles => {
+        const currentStyles = getAllRaw(SugarElement.fromDom(node));
+        const newStyles = {
+          ...currentStyles,
+          ...attrStyles
+        };
+        dom.setStyles(node, newStyles);
+      });
+      const attrClassesOpt = Optional.from(forcedRootBlockAttrs.class).map(attrClasses => attrClasses.split(/\s+/));
+      const currentClassesOpt = Optional.from(node.className).map(currentClasses => filter$6(currentClasses.split(/\s+/), clazz => clazz !== ''));
+      lift2(attrClassesOpt, currentClassesOpt, (attrClasses, currentClasses) => {
+        const filteredClasses = filter$6(currentClasses, clazz => !contains$2(attrClasses, clazz));
+        const newClasses = [
+          ...attrClasses,
+          ...filteredClasses
+        ];
+        dom.setAttrib(node, 'class', newClasses.join(' '));
+      });
+      const appliedAttrs = [
+        'style',
+        'class'
+      ];
+      const remainingAttrs = filter$5(forcedRootBlockAttrs, (_, attrs) => !contains$2(appliedAttrs, attrs));
+      dom.setAttribs(node, remainingAttrs);
+    };
+    const setForcedBlockAttrs = (editor, node) => {
+      const forcedRootBlockName = getForcedRootBlock(editor);
+      if (forcedRootBlockName.toLowerCase() === node.tagName.toLowerCase()) {
+        const forcedRootBlockAttrs = getForcedRootBlockAttrs(editor);
+        applyAttributes(editor, node, forcedRootBlockAttrs);
+      }
+    };
+    const wrapSelfAndSiblingsInDefaultBlock = (editor, newBlockName, rng, container, offset) => {
+      let newBlock, parentBlock, startNode, node, next, rootBlockName;
+      const dom = editor.dom, editableRoot = getEditableRoot(dom, container);
+      parentBlock = dom.getParent(container, dom.isBlock);
+      if (!parentBlock || !canSplitBlock(dom, parentBlock)) {
+        parentBlock = parentBlock || editableRoot;
+        if (parentBlock === editor.getBody() || isTableCell(parentBlock)) {
+          rootBlockName = parentBlock.nodeName.toLowerCase();
+        } else {
+          rootBlockName = parentBlock.parentNode.nodeName.toLowerCase();
+        }
+        if (!parentBlock.hasChildNodes()) {
+          newBlock = dom.create(newBlockName);
+          setForcedBlockAttrs(editor, newBlock);
+          parentBlock.appendChild(newBlock);
+          rng.setStart(newBlock, 0);
+          rng.setEnd(newBlock, 0);
+          return newBlock;
+        }
+        node = container;
+        while (node.parentNode !== parentBlock) {
+          node = node.parentNode;
+        }
+        while (node && !dom.isBlock(node)) {
+          startNode = node;
+          node = node.previousSibling;
+        }
+        if (startNode && editor.schema.isValidChild(rootBlockName, newBlockName.toLowerCase())) {
+          newBlock = dom.create(newBlockName);
+          setForcedBlockAttrs(editor, newBlock);
+          startNode.parentNode.insertBefore(newBlock, startNode);
+          node = startNode;
+          while (node && !dom.isBlock(node)) {
+            next = node.nextSibling;
+            newBlock.appendChild(node);
+            node = next;
+          }
+          rng.setStart(container, offset);
+          rng.setEnd(container, offset);
+        }
+      }
+      return container;
+    };
+    const addBrToBlockIfNeeded = (dom, block) => {
+      block.normalize();
+      const lastChild = block.lastChild;
+      if (!lastChild || /^(left|right)$/gi.test(dom.getStyle(lastChild, 'float', true))) {
+        dom.add(block, 'br');
+      }
+    };
+    const insert$2 = (editor, evt) => {
+      let tmpRng, container, offset, parentBlock;
+      let newBlock, fragment, containerBlock, parentBlockName, isAfterLastNodeInContainer;
+      const dom = editor.dom;
+      const schema = editor.schema, nonEmptyElementsMap = schema.getNonEmptyElements();
+      const rng = editor.selection.getRng();
+      const newBlockName = getForcedRootBlock(editor);
+      const createNewBlock = name => {
+        let node = container, block, clonedNode, caretNode;
+        const textInlineElements = schema.getTextInlineElements();
+        if (name || parentBlockName === 'TABLE' || parentBlockName === 'HR') {
+          block = dom.create(name || newBlockName);
+        } else {
+          block = parentBlock.cloneNode(false);
+        }
+        caretNode = block;
+        if (shouldKeepStyles(editor) === false) {
+          dom.setAttrib(block, 'style', null);
+          dom.setAttrib(block, 'class', null);
+        } else {
+          do {
+            if (textInlineElements[node.nodeName]) {
+              if (isCaretNode(node) || isBookmarkNode$1(node)) {
+                continue;
+              }
+              clonedNode = node.cloneNode(false);
+              dom.setAttrib(clonedNode, 'id', '');
+              if (block.hasChildNodes()) {
+                clonedNode.appendChild(block.firstChild);
+                block.appendChild(clonedNode);
+              } else {
+                caretNode = clonedNode;
+                block.appendChild(clonedNode);
+              }
+            }
+          } while ((node = node.parentNode) && node !== editableRoot);
+        }
+        setForcedBlockAttrs(editor, block);
+        emptyBlock(caretNode);
+        return block;
+      };
+      const isCaretAtStartOrEndOfBlock = start => {
+        let node, name;
+        const normalizedOffset = normalizeZwspOffset(start, container, offset);
+        if (isText$8(container) && (start ? normalizedOffset > 0 : normalizedOffset < container.nodeValue.length)) {
+          return false;
+        }
+        if (container.parentNode === parentBlock && isAfterLastNodeInContainer && !start) {
+          return true;
+        }
+        if (start && isElement$6(container) && container === parentBlock.firstChild) {
+          return true;
+        }
+        if (containerAndSiblingName(container, 'TABLE') || containerAndSiblingName(container, 'HR')) {
+          return isAfterLastNodeInContainer && !start || !isAfterLastNodeInContainer && start;
+        }
+        const walker = new DomTreeWalker(container, parentBlock);
+        if (isText$8(container)) {
+          if (start && normalizedOffset === 0) {
+            walker.prev();
+          } else if (!start && normalizedOffset === container.nodeValue.length) {
+            walker.next();
+          }
+        }
+        while (node = walker.current()) {
+          if (isElement$6(node)) {
+            if (!node.getAttribute('data-mce-bogus')) {
+              name = node.nodeName.toLowerCase();
+              if (nonEmptyElementsMap[name] && name !== 'br') {
+                return false;
+              }
+            }
+          } else if (isText$8(node) && !isWhitespaceText(node.nodeValue)) {
+            return false;
+          }
+          if (start) {
+            walker.prev();
+          } else {
+            walker.next();
+          }
+        }
+        return true;
+      };
+      const insertNewBlockAfter = () => {
+        if (/^(H[1-6]|PRE|FIGURE)$/.test(parentBlockName) && containerBlockName !== 'HGROUP') {
+          newBlock = createNewBlock(newBlockName);
+        } else {
+          newBlock = createNewBlock();
+        }
+        if (shouldEndContainerOnEmptyBlock(editor) && canSplitBlock(dom, containerBlock) && dom.isEmpty(parentBlock)) {
+          newBlock = dom.split(containerBlock, parentBlock);
+        } else {
+          dom.insertAfter(newBlock, parentBlock);
+        }
+        moveToCaretPosition(editor, newBlock);
+      };
+      normalize$2(dom, rng).each(normRng => {
+        rng.setStart(normRng.startContainer, normRng.startOffset);
+        rng.setEnd(normRng.endContainer, normRng.endOffset);
+      });
+      container = rng.startContainer;
+      offset = rng.startOffset;
+      const shiftKey = !!(evt && evt.shiftKey);
+      const ctrlKey = !!(evt && evt.ctrlKey);
+      if (isElement$6(container) && container.hasChildNodes()) {
+        isAfterLastNodeInContainer = offset > container.childNodes.length - 1;
+        container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
+        if (isAfterLastNodeInContainer && isText$8(container)) {
+          offset = container.nodeValue.length;
+        } else {
+          offset = 0;
+        }
+      }
+      const editableRoot = getEditableRoot(dom, container);
+      if (!editableRoot) {
+        return;
+      }
+      if (!shiftKey) {
+        container = wrapSelfAndSiblingsInDefaultBlock(editor, newBlockName, rng, container, offset);
+      }
+      parentBlock = dom.getParent(container, dom.isBlock);
+      containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;
+      parentBlockName = parentBlock ? parentBlock.nodeName.toUpperCase() : '';
+      const containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : '';
+      if (containerBlockName === 'LI' && !ctrlKey) {
+        parentBlock = containerBlock;
+        containerBlock = containerBlock.parentNode;
+        parentBlockName = containerBlockName;
+      }
+      if (/^(LI|DT|DD)$/.test(parentBlockName)) {
+        if (dom.isEmpty(parentBlock)) {
+          insert$3(editor, createNewBlock, containerBlock, parentBlock, newBlockName);
+          return;
+        }
+      }
+      if (parentBlock === editor.getBody()) {
+        return;
+      }
+      if (isCaretContainerBlock$1(parentBlock)) {
+        newBlock = showCaretContainerBlock(parentBlock);
+        if (dom.isEmpty(parentBlock)) {
+          emptyBlock(parentBlock);
+        }
+        setForcedBlockAttrs(editor, newBlock);
+        moveToCaretPosition(editor, newBlock);
+      } else if (isCaretAtStartOrEndOfBlock()) {
+        insertNewBlockAfter();
+      } else if (isCaretAtStartOrEndOfBlock(true)) {
+        newBlock = parentBlock.parentNode.insertBefore(createNewBlock(), parentBlock);
+        moveToCaretPosition(editor, containerAndSiblingName(parentBlock, 'HR') ? newBlock : parentBlock);
+      } else {
+        tmpRng = includeZwspInRange(rng).cloneRange();
+        tmpRng.setEndAfter(parentBlock);
+        fragment = tmpRng.extractContents();
+        trimZwsp(fragment);
+        trimLeadingLineBreaks(fragment);
+        newBlock = fragment.firstChild;
+        dom.insertAfter(fragment, parentBlock);
+        trimInlineElementsOnLeftSideOfBlock(dom, nonEmptyElementsMap, newBlock);
+        addBrToBlockIfNeeded(dom, parentBlock);
+        if (dom.isEmpty(parentBlock)) {
+          emptyBlock(parentBlock);
+        }
+        newBlock.normalize();
+        if (dom.isEmpty(newBlock)) {
+          dom.remove(newBlock);
+          insertNewBlockAfter();
+        } else {
+          setForcedBlockAttrs(editor, newBlock);
+          moveToCaretPosition(editor, newBlock);
+        }
+      }
+      dom.setAttrib(newBlock, 'id', '');
+      editor.dispatch('NewBlock', { newBlock });
+    };
+
+    const hasRightSideContent = (schema, container, parentBlock) => {
+      const walker = new DomTreeWalker(container, parentBlock);
+      let node;
+      const nonEmptyElementsMap = schema.getNonEmptyElements();
+      while (node = walker.next()) {
+        if (nonEmptyElementsMap[node.nodeName.toLowerCase()] || node.length > 0) {
+          return true;
+        }
+      }
+    };
+    const moveSelectionToBr = (editor, brElm, extraBr) => {
+      const rng = editor.dom.createRng();
+      if (!extraBr) {
+        rng.setStartAfter(brElm);
+        rng.setEndAfter(brElm);
+      } else {
+        rng.setStartBefore(brElm);
+        rng.setEndBefore(brElm);
+      }
+      editor.selection.setRng(rng);
+      scrollRangeIntoView(editor, rng);
+    };
+    const insertBrAtCaret = (editor, evt) => {
+      const selection = editor.selection;
+      const dom = editor.dom;
+      const rng = selection.getRng();
+      let brElm;
+      let extraBr;
+      normalize$2(dom, rng).each(normRng => {
+        rng.setStart(normRng.startContainer, normRng.startOffset);
+        rng.setEnd(normRng.endContainer, normRng.endOffset);
+      });
+      let offset = rng.startOffset;
+      let container = rng.startContainer;
+      if (container.nodeType === 1 && container.hasChildNodes()) {
+        const isAfterLastNodeInContainer = offset > container.childNodes.length - 1;
+        container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
+        if (isAfterLastNodeInContainer && container.nodeType === 3) {
+          offset = container.nodeValue.length;
+        } else {
+          offset = 0;
+        }
+      }
+      let parentBlock = dom.getParent(container, dom.isBlock);
+      const containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;
+      const containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : '';
+      const isControlKey = !!(evt && evt.ctrlKey);
+      if (containerBlockName === 'LI' && !isControlKey) {
+        parentBlock = containerBlock;
+      }
+      if (container && container.nodeType === 3 && offset >= container.nodeValue.length) {
+        if (!hasRightSideContent(editor.schema, container, parentBlock)) {
+          brElm = dom.create('br');
+          rng.insertNode(brElm);
+          rng.setStartAfter(brElm);
+          rng.setEndAfter(brElm);
+          extraBr = true;
+        }
+      }
+      brElm = dom.create('br');
+      rangeInsertNode(dom, rng, brElm);
+      moveSelectionToBr(editor, brElm, extraBr);
+      editor.undoManager.add();
+    };
+    const insertBrBefore = (editor, inline) => {
+      const br = SugarElement.fromTag('br');
+      before$3(SugarElement.fromDom(inline), br);
+      editor.undoManager.add();
+    };
+    const insertBrAfter = (editor, inline) => {
+      if (!hasBrAfter(editor.getBody(), inline)) {
+        after$4(SugarElement.fromDom(inline), SugarElement.fromTag('br'));
+      }
+      const br = SugarElement.fromTag('br');
+      after$4(SugarElement.fromDom(inline), br);
+      moveSelectionToBr(editor, br.dom, false);
+      editor.undoManager.add();
+    };
+    const isBeforeBr = pos => {
+      return isBr$5(pos.getNode());
+    };
+    const hasBrAfter = (rootNode, startNode) => {
+      if (isBeforeBr(CaretPosition.after(startNode))) {
+        return true;
+      } else {
+        return nextPosition(rootNode, CaretPosition.after(startNode)).map(pos => {
+          return isBr$5(pos.getNode());
+        }).getOr(false);
+      }
+    };
+    const isAnchorLink = elm => {
+      return elm && elm.nodeName === 'A' && 'href' in elm;
+    };
+    const isInsideAnchor = location => {
+      return location.fold(never, isAnchorLink, isAnchorLink, never);
+    };
+    const readInlineAnchorLocation = editor => {
+      const isInlineTarget$1 = curry(isInlineTarget, editor);
+      const position = CaretPosition.fromRangeStart(editor.selection.getRng());
+      return readLocation(isInlineTarget$1, editor.getBody(), position).filter(isInsideAnchor);
+    };
+    const insertBrOutsideAnchor = (editor, location) => {
+      location.fold(noop, curry(insertBrBefore, editor), curry(insertBrAfter, editor), noop);
+    };
+    const insert$1 = (editor, evt) => {
+      const anchorLocation = readInlineAnchorLocation(editor);
+      if (anchorLocation.isSome()) {
+        anchorLocation.each(curry(insertBrOutsideAnchor, editor));
+      } else {
+        insertBrAtCaret(editor, evt);
+      }
+    };
+
+    const matchesSelector = (editor, selector) => {
+      return getParentBlock$1(editor).filter(parentBlock => {
+        return selector.length > 0 && is$1(SugarElement.fromDom(parentBlock), selector);
+      }).isSome();
+    };
+    const shouldInsertBr = editor => {
+      return matchesSelector(editor, getBrNewLineSelector(editor));
+    };
+    const shouldBlockNewLine$1 = editor => {
+      return matchesSelector(editor, getNoNewLineSelector(editor));
+    };
+
+    const newLineAction = Adt.generate([
+      { br: [] },
+      { block: [] },
+      { none: [] }
+    ]);
+    const shouldBlockNewLine = (editor, _shiftKey) => {
+      return shouldBlockNewLine$1(editor);
+    };
+    const inListBlock = requiredState => {
+      return (editor, _shiftKey) => {
+        return isListItemParentBlock(editor) === requiredState;
+      };
+    };
+    const inBlock = (blockName, requiredState) => (editor, _shiftKey) => {
+      const state = getParentBlockName(editor) === blockName.toUpperCase();
+      return state === requiredState;
+    };
+    const inPreBlock = requiredState => inBlock('pre', requiredState);
+    const inSummaryBlock = () => inBlock('summary', true);
+    const shouldPutBrInPre = requiredState => {
+      return (editor, _shiftKey) => {
+        return shouldPutBrInPre$1(editor) === requiredState;
+      };
+    };
+    const inBrContext = (editor, _shiftKey) => {
+      return shouldInsertBr(editor);
+    };
+    const hasShiftKey = (_editor, shiftKey) => {
+      return shiftKey;
+    };
+    const canInsertIntoEditableRoot = editor => {
+      const forcedRootBlock = getForcedRootBlock(editor);
+      const rootEditable = getEditableRoot$1(editor.dom, editor.selection.getStart());
+      return rootEditable && editor.schema.isValidChild(rootEditable.nodeName, forcedRootBlock);
+    };
+    const match = (predicates, action) => {
+      return (editor, shiftKey) => {
+        const isMatch = foldl(predicates, (res, p) => {
+          return res && p(editor, shiftKey);
+        }, true);
+        return isMatch ? Optional.some(action) : Optional.none();
+      };
+    };
+    const getAction = (editor, evt) => {
+      return evaluateUntil([
+        match([shouldBlockNewLine], newLineAction.none()),
+        match([inSummaryBlock()], newLineAction.br()),
+        match([
+          inPreBlock(true),
+          shouldPutBrInPre(false),
+          hasShiftKey
+        ], newLineAction.br()),
+        match([
+          inPreBlock(true),
+          shouldPutBrInPre(false)
+        ], newLineAction.block()),
+        match([
+          inPreBlock(true),
+          shouldPutBrInPre(true),
+          hasShiftKey
+        ], newLineAction.block()),
+        match([
+          inPreBlock(true),
+          shouldPutBrInPre(true)
+        ], newLineAction.br()),
+        match([
+          inListBlock(true),
+          hasShiftKey
+        ], newLineAction.br()),
+        match([inListBlock(true)], newLineAction.block()),
+        match([inBrContext], newLineAction.br()),
+        match([hasShiftKey], newLineAction.br()),
+        match([canInsertIntoEditableRoot], newLineAction.block())
+      ], [
+        editor,
+        !!(evt && evt.shiftKey)
+      ]).getOr(newLineAction.none());
+    };
+
+    const insert = (editor, evt) => {
+      getAction(editor, evt).fold(() => {
+        if (isNonNullable(evt)) {
+          const event = fireFakeBeforeInputEvent(editor, 'insertLineBreak');
+          if (event.isDefaultPrevented()) {
+            return;
+          }
+        }
+        insert$1(editor, evt);
+        if (isNonNullable(evt)) {
+          fireFakeInputEvent(editor, 'insertLineBreak');
+        }
+      }, () => {
+        if (isNonNullable(evt)) {
+          const event = fireFakeBeforeInputEvent(editor, 'insertParagraph');
+          if (event.isDefaultPrevented()) {
+            return;
+          }
+        }
+        insert$2(editor, evt);
+        if (isNonNullable(evt)) {
+          fireFakeInputEvent(editor, 'insertParagraph');
+        }
+      }, noop);
+    };
+
+    const handleEnterKeyEvent = (editor, event) => {
+      if (event.isDefaultPrevented()) {
+        return;
+      }
+      event.preventDefault();
+      endTypingLevelIgnoreLocks(editor.undoManager);
+      editor.undoManager.transact(() => {
+        if (editor.selection.isCollapsed() === false) {
+          execDeleteCommand(editor);
+        }
+        insert(editor, event);
+      });
+    };
+    const setup$h = editor => {
+      editor.on('keydown', event => {
+        if (event.keyCode === VK.ENTER) {
+          handleEnterKeyEvent(editor, event);
+        }
+      });
+    };
+
+    const executeKeydownOverride$2 = (editor, caret, evt) => {
+      execute([
+        {
+          keyCode: VK.END,
+          action: action(moveToLineEndPoint$1, editor, true)
+        },
+        {
+          keyCode: VK.HOME,
+          action: action(moveToLineEndPoint$1, editor, false)
+        },
+        {
+          keyCode: VK.END,
+          action: action(moveToLineEndPoint, editor, true)
+        },
+        {
+          keyCode: VK.HOME,
+          action: action(moveToLineEndPoint, editor, false)
+        },
+        {
+          keyCode: VK.END,
+          action: action(moveToLineEndPoint$2, editor, true, caret)
+        },
+        {
+          keyCode: VK.HOME,
+          action: action(moveToLineEndPoint$2, editor, false, caret)
+        }
+      ], evt).each(_ => {
+        evt.preventDefault();
+      });
+    };
+    const setup$g = (editor, caret) => {
+      editor.on('keydown', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeydownOverride$2(editor, caret, evt);
+        }
+      });
+    };
+
+    const setup$f = editor => {
+      editor.on('input', e => {
+        if (e.isComposing === false) {
+          normalizeNbspsInEditor(editor);
+        }
+      });
+    };
+
+    const platform = detect$2();
+    const executeKeyupAction = (editor, caret, evt) => {
+      execute([
+        {
+          keyCode: VK.PAGE_UP,
+          action: action(moveToLineEndPoint$2, editor, false, caret)
+        },
+        {
+          keyCode: VK.PAGE_DOWN,
+          action: action(moveToLineEndPoint$2, editor, true, caret)
+        }
+      ], evt);
+    };
+    const stopImmediatePropagation = e => e.stopImmediatePropagation();
+    const isPageUpDown = evt => evt.keyCode === VK.PAGE_UP || evt.keyCode === VK.PAGE_DOWN;
+    const setNodeChangeBlocker = (blocked, editor, block) => {
+      if (block && !blocked.get()) {
+        editor.on('NodeChange', stopImmediatePropagation, true);
+      } else if (!block && blocked.get()) {
+        editor.off('NodeChange', stopImmediatePropagation);
+      }
+      blocked.set(block);
+    };
+    const setup$e = (editor, caret) => {
+      if (platform.os.isMacOS()) {
+        return;
+      }
+      const blocked = Cell(false);
+      editor.on('keydown', evt => {
+        if (isPageUpDown(evt)) {
+          setNodeChangeBlocker(blocked, editor, true);
+        }
+      });
+      editor.on('keyup', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeyupAction(editor, caret, evt);
+        }
+        if (isPageUpDown(evt) && blocked.get()) {
+          setNodeChangeBlocker(blocked, editor, false);
+          editor.nodeChanged();
+        }
+      });
+    };
+
+    const insertTextAtPosition = (text, pos) => {
+      const container = pos.container();
+      const offset = pos.offset();
+      if (isText$8(container)) {
+        container.insertData(offset, text);
+        return Optional.some(CaretPosition(container, offset + text.length));
+      } else {
+        return getElementFromPosition(pos).map(elm => {
+          const textNode = SugarElement.fromText(text);
+          if (pos.isAtEnd()) {
+            after$4(elm, textNode);
+          } else {
+            before$3(elm, textNode);
+          }
+          return CaretPosition(textNode.dom, text.length);
+        });
+      }
+    };
+    const insertNbspAtPosition = curry(insertTextAtPosition, nbsp);
+    const insertSpaceAtPosition = curry(insertTextAtPosition, ' ');
+
+    const locationToCaretPosition = root => location => location.fold(element => prevPosition(root.dom, CaretPosition.before(element)), element => firstPositionIn(element), element => lastPositionIn(element), element => nextPosition(root.dom, CaretPosition.after(element)));
+    const insertInlineBoundarySpaceOrNbsp = (root, pos) => checkPos => needsToHaveNbsp(root, checkPos) ? insertNbspAtPosition(pos) : insertSpaceAtPosition(pos);
+    const setSelection = editor => pos => {
+      editor.selection.setRng(pos.toRange());
+      editor.nodeChanged();
+      return true;
+    };
+    const insertSpaceOrNbspAtSelection = editor => {
+      const pos = CaretPosition.fromRangeStart(editor.selection.getRng());
+      const root = SugarElement.fromDom(editor.getBody());
+      if (editor.selection.isCollapsed()) {
+        const isInlineTarget$1 = curry(isInlineTarget, editor);
+        const caretPosition = CaretPosition.fromRangeStart(editor.selection.getRng());
+        return readLocation(isInlineTarget$1, editor.getBody(), caretPosition).bind(locationToCaretPosition(root)).map(checkPos => () => insertInlineBoundarySpaceOrNbsp(root, pos)(checkPos).each(setSelection(editor)));
+      } else {
+        return Optional.none();
+      }
+    };
+
+    const executeKeydownOverride$1 = (editor, evt) => {
+      executeWithDelayedAction([{
+          keyCode: VK.SPACEBAR,
+          action: action(insertSpaceOrNbspAtSelection, editor)
+        }], evt).each(applyAction => {
+        evt.preventDefault();
+        const event = fireFakeBeforeInputEvent(editor, 'insertText', { data: ' ' });
+        if (!event.isDefaultPrevented()) {
+          applyAction();
+          fireFakeInputEvent(editor, 'insertText', { data: ' ' });
+        }
+      });
+    };
+    const setup$d = editor => {
+      editor.on('keydown', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeydownOverride$1(editor, evt);
+        }
+      });
+    };
+
+    const tableTabNavigation = editor => {
+      if (hasTableTabNavigation(editor)) {
+        return [
+          {
+            keyCode: VK.TAB,
+            action: action(handleTab, editor, true)
+          },
+          {
+            keyCode: VK.TAB,
+            shiftKey: true,
+            action: action(handleTab, editor, false)
+          }
+        ];
+      } else {
+        return [];
+      }
+    };
+    const executeKeydownOverride = (editor, evt) => {
+      execute([...tableTabNavigation(editor)], evt).each(_ => {
+        evt.preventDefault();
+      });
+    };
+    const setup$c = editor => {
+      editor.on('keydown', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeydownOverride(editor, evt);
+        }
+      });
+    };
+
+    const setup$b = editor => {
+      editor.addShortcut('Meta+P', '', 'mcePrint');
+      setup$j(editor);
+      if (isRtc(editor)) {
+        return Cell(null);
+      } else {
+        const caret = setupSelectedState(editor);
+        setup$l(editor);
+        setup$k(editor, caret);
+        setup$i(editor, caret);
+        setup$h(editor);
+        setup$d(editor);
+        setup$f(editor);
+        setup$c(editor);
+        setup$g(editor, caret);
+        setup$e(editor, caret);
+        return caret;
+      }
+    };
+
+    class NodeChange {
+      constructor(editor) {
+        this.lastPath = [];
+        this.editor = editor;
+        let lastRng;
+        const self = this;
+        if (!('onselectionchange' in editor.getDoc())) {
+          editor.on('NodeChange click mouseup keyup focus', e => {
+            const nativeRng = editor.selection.getRng();
+            const fakeRng = {
+              startContainer: nativeRng.startContainer,
+              startOffset: nativeRng.startOffset,
+              endContainer: nativeRng.endContainer,
+              endOffset: nativeRng.endOffset
+            };
+            if (e.type === 'nodechange' || !isEq$4(fakeRng, lastRng)) {
+              editor.dispatch('SelectionChange');
+            }
+            lastRng = fakeRng;
+          });
+        }
+        editor.on('contextmenu', () => {
+          editor.dispatch('SelectionChange');
+        });
+        editor.on('SelectionChange', () => {
+          const startElm = editor.selection.getStart(true);
+          if (!startElm) {
+            return;
+          }
+          if (hasAnyRanges(editor) && !self.isSameElementPath(startElm) && editor.dom.isChildOf(startElm, editor.getBody())) {
+            editor.nodeChanged({ selectionChange: true });
+          }
+        });
+        editor.on('mouseup', e => {
+          if (!e.isDefaultPrevented() && hasAnyRanges(editor)) {
+            if (editor.selection.getNode().nodeName === 'IMG') {
+              Delay.setEditorTimeout(editor, () => {
+                editor.nodeChanged();
+              });
+            } else {
+              editor.nodeChanged();
+            }
+          }
+        });
+      }
+      nodeChanged(args) {
+        const selection = this.editor.selection;
+        let node, parents, root;
+        if (this.editor.initialized && selection && !shouldDisableNodeChange(this.editor) && !this.editor.mode.isReadOnly()) {
+          root = this.editor.getBody();
+          node = selection.getStart(true) || root;
+          if (node.ownerDocument !== this.editor.getDoc() || !this.editor.dom.isChildOf(node, root)) {
+            node = root;
+          }
+          parents = [];
+          this.editor.dom.getParent(node, node => {
+            if (node === root) {
+              return true;
+            }
+            parents.push(node);
+          });
+          args = args || {};
+          args.element = node;
+          args.parents = parents;
+          this.editor.dispatch('NodeChange', args);
+        }
+      }
+      isSameElementPath(startElm) {
+        let i;
+        const editor = this.editor;
+        const currentPath = reverse(editor.dom.getParents(startElm, always, editor.getBody()));
+        if (currentPath.length === this.lastPath.length) {
+          for (i = currentPath.length; i >= 0; i--) {
+            if (currentPath[i] !== this.lastPath[i]) {
+              break;
+            }
+          }
+          if (i === -1) {
+            this.lastPath = currentPath;
+            return true;
+          }
+        }
+        this.lastPath = currentPath;
+        return false;
+      }
+    }
+
+    const internalMimeType = 'x-tinymce/html';
+    const internalHtmlMime = constant(internalMimeType);
+    const internalMark = '<!-- ' + internalMimeType + ' -->';
+    const mark = html => internalMark + html;
+    const unmark = html => html.replace(internalMark, '');
+    const isMarked = html => html.indexOf(internalMark) !== -1;
+
+    const isPlainText = text => {
+      return !/<(?:\/?(?!(?:div|p|br|span)>)\w+|(?:(?!(?:span style="white-space:\s?pre;?">)|br\s?\/>))\w+\s[^>]+)>/i.test(text);
+    };
+    const openContainer = (rootTag, rootAttrs) => {
+      let tag = '<' + rootTag;
+      const attrs = mapToArray(rootAttrs, (value, key) => key + '="' + Entities.encodeAllRaw(value) + '"');
+      if (attrs.length) {
+        tag += ' ' + attrs.join(' ');
+      }
+      return tag + '>';
+    };
+    const toBlockElements = (text, rootTag, rootAttrs) => {
+      const blocks = text.split(/\n\n/);
+      const tagOpen = openContainer(rootTag, rootAttrs);
+      const tagClose = '</' + rootTag + '>';
+      const paragraphs = map$3(blocks, p => {
+        return p.split(/\n/).join('<br />');
+      });
+      const stitch = p => {
+        return tagOpen + p + tagClose;
+      };
+      return paragraphs.length === 1 ? paragraphs[0] : map$3(paragraphs, stitch).join('');
+    };
+
+    const pasteBinDefaultContent = '%MCEPASTEBIN%';
+    const create$6 = (editor, lastRngCell) => {
+      const {dom, selection} = editor;
+      const body = editor.getBody();
+      lastRngCell.set(selection.getRng());
+      const pasteBinElm = dom.add(editor.getBody(), 'div', {
+        'id': 'mcepastebin',
+        'class': 'mce-pastebin',
+        'contentEditable': true,
+        'data-mce-bogus': 'all',
+        'style': 'position: fixed; top: 50%; width: 10px; height: 10px; overflow: hidden; opacity: 0'
+      }, pasteBinDefaultContent);
+      if (Env.browser.isFirefox()) {
+        dom.setStyle(pasteBinElm, 'left', dom.getStyle(body, 'direction', true) === 'rtl' ? 65535 : -65535);
+      }
+      dom.bind(pasteBinElm, 'beforedeactivate focusin focusout', e => {
+        e.stopPropagation();
+      });
+      pasteBinElm.focus();
+      selection.select(pasteBinElm, true);
+    };
+    const remove = (editor, lastRngCell) => {
+      const dom = editor.dom;
+      if (getEl(editor)) {
+        let pasteBinClone;
+        const lastRng = lastRngCell.get();
+        while (pasteBinClone = getEl(editor)) {
+          dom.remove(pasteBinClone);
+          dom.unbind(pasteBinClone);
+        }
+        if (lastRng) {
+          editor.selection.setRng(lastRng);
+        }
+      }
+      lastRngCell.set(null);
+    };
+    const getEl = editor => editor.dom.get('mcepastebin');
+    const isPasteBin = elm => elm && elm.id === 'mcepastebin';
+    const getHtml = editor => {
+      const dom = editor.dom;
+      const copyAndRemove = (toElm, fromElm) => {
+        toElm.appendChild(fromElm);
+        dom.remove(fromElm, true);
+      };
+      const [pasteBinElm, ...pasteBinClones] = filter$6(editor.getBody().childNodes, isPasteBin);
+      each$g(pasteBinClones, pasteBinClone => {
+        copyAndRemove(pasteBinElm, pasteBinClone);
+      });
+      const dirtyWrappers = dom.select('div[id=mcepastebin]', pasteBinElm);
+      for (let i = dirtyWrappers.length - 1; i >= 0; i--) {
+        const cleanWrapper = dom.create('div');
+        pasteBinElm.insertBefore(cleanWrapper, dirtyWrappers[i]);
+        copyAndRemove(cleanWrapper, dirtyWrappers[i]);
+      }
+      return pasteBinElm ? pasteBinElm.innerHTML : '';
+    };
+    const isDefaultPasteBinContent = content => content === pasteBinDefaultContent;
+    const PasteBin = editor => {
+      const lastRng = Cell(null);
+      return {
+        create: () => create$6(editor, lastRng),
+        remove: () => remove(editor, lastRng),
+        getEl: () => getEl(editor),
+        getHtml: () => getHtml(editor),
+        getLastRng: lastRng.get
+      };
+    };
+
+    const filter = (content, items) => {
+      Tools.each(items, v => {
+        if (is$4(v, RegExp)) {
+          content = content.replace(v, '');
+        } else {
+          content = content.replace(v[0], v[1]);
+        }
+      });
+      return content;
+    };
+    const innerText = html => {
+      const schema = Schema();
+      const domParser = DomParser({}, schema);
+      let text = '';
+      const voidElements = schema.getVoidElements();
+      const ignoreElements = Tools.makeMap('script noscript style textarea video audio iframe object', ' ');
+      const blockElements = schema.getBlockElements();
+      const walk = node => {
+        const name = node.name, currentNode = node;
+        if (name === 'br') {
+          text += '\n';
+          return;
+        }
+        if (name === 'wbr') {
+          return;
+        }
+        if (voidElements[name]) {
+          text += ' ';
+        }
+        if (ignoreElements[name]) {
+          text += ' ';
+          return;
+        }
+        if (node.type === 3) {
+          text += node.value;
+        }
+        if (!(node.name in schema.getVoidElements())) {
+          if (node = node.firstChild) {
+            do {
+              walk(node);
+            } while (node = node.next);
+          }
+        }
+        if (blockElements[name] && currentNode.next) {
+          text += '\n';
+          if (name === 'p') {
+            text += '\n';
+          }
+        }
+      };
+      html = filter(html, [/<!\[[^\]]+\]>/g]);
+      walk(domParser.parse(html));
+      return text;
+    };
+    const trimHtml = html => {
+      const trimSpaces = (all, s1, s2) => {
+        if (!s1 && !s2) {
+          return ' ';
+        }
+        return nbsp;
+      };
+      html = filter(html, [
+        /^[\s\S]*<body[^>]*>\s*|\s*<\/body[^>]*>[\s\S]*$/ig,
+        /<!--StartFragment-->|<!--EndFragment-->/g,
+        [
+          /( ?)<span class="Apple-converted-space">\u00a0<\/span>( ?)/g,
+          trimSpaces
+        ],
+        /<br class="Apple-interchange-newline">/g,
+        /<br>$/i
+      ]);
+      return html;
+    };
+    const createIdGenerator = prefix => {
+      let count = 0;
+      return () => {
+        return prefix + count++;
+      };
+    };
+    const getImageMimeType = ext => {
+      const lowerExt = ext.toLowerCase();
+      const mimeOverrides = {
+        jpg: 'jpeg',
+        jpe: 'jpeg',
+        jfi: 'jpeg',
+        jif: 'jpeg',
+        jfif: 'jpeg',
+        pjpeg: 'jpeg',
+        pjp: 'jpeg',
+        svg: 'svg+xml'
+      };
+      return Tools.hasOwn(mimeOverrides, lowerExt) ? 'image/' + mimeOverrides[lowerExt] : 'image/' + lowerExt;
+    };
+
+    const preProcess = (editor, html) => {
+      const parser = DomParser({}, editor.schema);
+      parser.addNodeFilter('meta', nodes => {
+        Tools.each(nodes, node => {
+          node.remove();
+        });
+      });
+      const fragment = parser.parse(html, {
+        forced_root_block: false,
+        isRootContent: true
+      });
+      return HtmlSerializer({ validate: true }, editor.schema).serialize(fragment);
+    };
+    const processResult = (content, cancelled) => ({
+      content,
+      cancelled
+    });
+    const postProcessFilter = (editor, html, internal) => {
+      const tempBody = editor.dom.create('div', { style: 'display:none' }, html);
+      const postProcessArgs = firePastePostProcess(editor, tempBody, internal);
+      return processResult(postProcessArgs.node.innerHTML, postProcessArgs.isDefaultPrevented());
+    };
+    const filterContent = (editor, content, internal) => {
+      const preProcessArgs = firePastePreProcess(editor, content, internal);
+      const filteredContent = preProcess(editor, preProcessArgs.content);
+      if (editor.hasEventListeners('PastePostProcess') && !preProcessArgs.isDefaultPrevented()) {
+        return postProcessFilter(editor, filteredContent, internal);
+      } else {
+        return processResult(filteredContent, preProcessArgs.isDefaultPrevented());
+      }
+    };
+    const process = (editor, html, internal) => {
+      return filterContent(editor, html, internal);
+    };
+
+    const pasteHtml$1 = (editor, html) => {
+      editor.insertContent(html, {
+        merge: shouldPasteMergeFormats(editor),
+        paste: true
+      });
+      return true;
+    };
+    const isAbsoluteUrl = url => /^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(url);
+    const isImageUrl = (editor, url) => {
+      return isAbsoluteUrl(url) && exists(getAllowedImageFileTypes(editor), type => endsWith(url.toLowerCase(), `.${ type.toLowerCase() }`));
+    };
+    const createImage = (editor, url, pasteHtmlFn) => {
+      editor.undoManager.extra(() => {
+        pasteHtmlFn(editor, url);
+      }, () => {
+        editor.insertContent('<img src="' + url + '">');
+      });
+      return true;
+    };
+    const createLink = (editor, url, pasteHtmlFn) => {
+      editor.undoManager.extra(() => {
+        pasteHtmlFn(editor, url);
+      }, () => {
+        editor.execCommand('mceInsertLink', false, url);
+      });
+      return true;
+    };
+    const linkSelection = (editor, html, pasteHtmlFn) => !editor.selection.isCollapsed() && isAbsoluteUrl(html) ? createLink(editor, html, pasteHtmlFn) : false;
+    const insertImage = (editor, html, pasteHtmlFn) => isImageUrl(editor, html) ? createImage(editor, html, pasteHtmlFn) : false;
+    const smartInsertContent = (editor, html) => {
+      Tools.each([
+        linkSelection,
+        insertImage,
+        pasteHtml$1
+      ], action => {
+        return action(editor, html, pasteHtml$1) !== true;
+      });
+    };
+    const insertContent = (editor, html, pasteAsText) => {
+      if (pasteAsText || !isSmartPasteEnabled(editor)) {
+        pasteHtml$1(editor, html);
+      } else {
+        smartInsertContent(editor, html);
+      }
+    };
+
+    const uniqueId = createIdGenerator('mceclip');
+    const doPaste = (editor, content, internal, pasteAsText) => {
+      const args = process(editor, content, internal);
+      if (args.cancelled === false) {
+        insertContent(editor, args.content, pasteAsText);
+      }
+    };
+    const pasteHtml = (editor, html, internalFlag) => {
+      const internal = internalFlag ? internalFlag : isMarked(html);
+      doPaste(editor, unmark(html), internal, false);
+    };
+    const pasteText = (editor, text) => {
+      const encodedText = editor.dom.encode(text).replace(/\r\n/g, '\n');
+      const normalizedText = normalize$4(encodedText, getPasteTabSpaces(editor));
+      const html = toBlockElements(normalizedText, getForcedRootBlock(editor), getForcedRootBlockAttrs(editor));
+      doPaste(editor, html, false, true);
+    };
+    const getDataTransferItems = dataTransfer => {
+      const items = {};
+      if (dataTransfer && dataTransfer.types) {
+        for (let i = 0; i < dataTransfer.types.length; i++) {
+          const contentType = dataTransfer.types[i];
+          try {
+            items[contentType] = dataTransfer.getData(contentType);
+          } catch (ex) {
+            items[contentType] = '';
+          }
+        }
+      }
+      return items;
+    };
+    const hasContentType = (clipboardContent, mimeType) => mimeType in clipboardContent && clipboardContent[mimeType].length > 0;
+    const hasHtmlOrText = content => hasContentType(content, 'text/html') || hasContentType(content, 'text/plain');
+    const extractFilename = (editor, str) => {
+      const m = str.match(/([\s\S]+?)(?:\.[a-z0-9.]+)$/i);
+      return isNonNullable(m) ? editor.dom.encode(m[1]) : null;
+    };
+    const createBlobInfo = (editor, blobCache, file, base64) => {
+      const id = uniqueId();
+      const useFileName = shouldReuseFileName(editor) && isNonNullable(file.name);
+      const name = useFileName ? extractFilename(editor, file.name) : id;
+      const filename = useFileName ? file.name : undefined;
+      const blobInfo = blobCache.create(id, file, base64, name, filename);
+      blobCache.add(blobInfo);
+      return blobInfo;
+    };
+    const pasteImage = (editor, imageItem) => {
+      const {
+        data: base64,
+        type
+      } = parseDataUri$1(imageItem.uri);
+      const file = imageItem.file;
+      const blobCache = editor.editorUpload.blobCache;
+      const existingBlobInfo = blobCache.getByData(base64, type);
+      const blobInfo = existingBlobInfo !== null && existingBlobInfo !== void 0 ? existingBlobInfo : createBlobInfo(editor, blobCache, file, base64);
+      pasteHtml(editor, `<img src="${ blobInfo.blobUri() }">`, false);
+    };
+    const isClipboardEvent = event => event.type === 'paste';
+    const readFilesAsDataUris = items => Promise.all(map$3(items, file => {
+      return blobToDataUri(file).then(uri => ({
+        file,
+        uri
+      }));
+    }));
+    const isImage = editor => {
+      const allowedExtensions = getAllowedImageFileTypes(editor);
+      return file => startsWith(file.type, 'image/') && exists(allowedExtensions, extension => {
+        return getImageMimeType(extension) === file.type;
+      });
+    };
+    const getImagesFromDataTransfer = (editor, dataTransfer) => {
+      const items = dataTransfer.items ? bind$3(from(dataTransfer.items), item => {
+        return item.kind === 'file' ? [item.getAsFile()] : [];
+      }) : [];
+      const files = dataTransfer.files ? from(dataTransfer.files) : [];
+      return filter$6(items.length > 0 ? items : files, isImage(editor));
+    };
+    const pasteImageData = (editor, e, rng) => {
+      const dataTransfer = isClipboardEvent(e) ? e.clipboardData : e.dataTransfer;
+      if (shouldPasteDataImages(editor) && dataTransfer) {
+        const images = getImagesFromDataTransfer(editor, dataTransfer);
+        if (images.length > 0) {
+          e.preventDefault();
+          readFilesAsDataUris(images).then(fileResults => {
+            if (rng) {
+              editor.selection.setRng(rng);
+            }
+            each$g(fileResults, result => {
+              pasteImage(editor, result);
+            });
+          });
+          return true;
+        }
+      }
+      return false;
+    };
+    const isBrokenAndroidClipboardEvent = e => {
+      var _a, _b;
+      return Env.os.isAndroid() && ((_b = (_a = e.clipboardData) === null || _a === void 0 ? void 0 : _a.items) === null || _b === void 0 ? void 0 : _b.length) === 0;
+    };
+    const isKeyboardPasteEvent = e => VK.metaKeyPressed(e) && e.keyCode === 86 || e.shiftKey && e.keyCode === 45;
+    const insertClipboardContent = (editor, clipboardContent, html, plainTextMode) => {
+      let content = trimHtml(html);
+      const isInternal = hasContentType(clipboardContent, internalHtmlMime()) || isMarked(html);
+      const isPlainTextHtml = !isInternal && isPlainText(content);
+      const isAbsoluteUrl$1 = isAbsoluteUrl(content);
+      if (isDefaultPasteBinContent(content) || !content.length || isPlainTextHtml && !isAbsoluteUrl$1) {
+        plainTextMode = true;
+      }
+      if (plainTextMode || isAbsoluteUrl$1) {
+        if (hasContentType(clipboardContent, 'text/plain') && isPlainTextHtml) {
+          content = clipboardContent['text/plain'];
+        } else {
+          content = innerText(content);
+        }
+      }
+      if (isDefaultPasteBinContent(content)) {
+        return;
+      }
+      if (plainTextMode) {
+        pasteText(editor, content);
+      } else {
+        pasteHtml(editor, content, isInternal);
+      }
+    };
+    const registerEventHandlers = (editor, pasteBin, pasteFormat) => {
+      let keyboardPastePlainTextState;
+      const getLastRng = () => pasteBin.getLastRng() || editor.selection.getRng();
+      editor.on('keydown', e => {
+        if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) {
+          keyboardPastePlainTextState = e.shiftKey && e.keyCode === 86;
+        }
+      });
+      editor.on('paste', e => {
+        if (e.isDefaultPrevented() || isBrokenAndroidClipboardEvent(e)) {
+          return;
+        }
+        const plainTextMode = pasteFormat.get() === 'text' || keyboardPastePlainTextState;
+        keyboardPastePlainTextState = false;
+        const clipboardContent = getDataTransferItems(e.clipboardData);
+        if (!hasHtmlOrText(clipboardContent) && pasteImageData(editor, e, getLastRng())) {
+          return;
+        }
+        if (hasContentType(clipboardContent, 'text/html')) {
+          e.preventDefault();
+          insertClipboardContent(editor, clipboardContent, clipboardContent['text/html'], plainTextMode);
+        } else {
+          pasteBin.create();
+          Delay.setEditorTimeout(editor, () => {
+            const html = pasteBin.getHtml();
+            pasteBin.remove();
+            insertClipboardContent(editor, clipboardContent, html, plainTextMode);
+          }, 0);
+        }
+      });
+    };
+    const registerDataImageFilter = editor => {
+      const isWebKitFakeUrl = src => startsWith(src, 'webkit-fake-url');
+      const isDataUri = src => startsWith(src, 'data:');
+      const isPasteInsert = args => {
+        var _a;
+        return ((_a = args.data) === null || _a === void 0 ? void 0 : _a.paste) === true;
+      };
+      editor.parser.addNodeFilter('img', (nodes, name, args) => {
+        if (!shouldPasteDataImages(editor) && isPasteInsert(args)) {
+          for (const node of nodes) {
+            const src = node.attr('src');
+            if (isString(src) && !node.attr('data-mce-object') && src !== Env.transparentSrc) {
+              if (isWebKitFakeUrl(src)) {
+                node.remove();
+              } else if (!shouldAllowHtmlDataUrls(editor) && isDataUri(src)) {
+                node.remove();
+              }
+            }
+          }
+        }
+      });
+    };
+    const registerEventsAndFilters = (editor, pasteBin, pasteFormat) => {
+      registerEventHandlers(editor, pasteBin, pasteFormat);
+      registerDataImageFilter(editor);
+    };
+
+    const togglePlainTextPaste = (editor, pasteFormat) => {
+      if (pasteFormat.get() === 'text') {
+        pasteFormat.set('html');
+        firePastePlainTextToggle(editor, false);
+      } else {
+        pasteFormat.set('text');
+        firePastePlainTextToggle(editor, true);
+      }
+      editor.focus();
+    };
+    const register$1 = (editor, pasteFormat) => {
+      editor.addCommand('mceTogglePlainTextPaste', () => {
+        togglePlainTextPaste(editor, pasteFormat);
+      });
+      editor.addCommand('mceInsertClipboardContent', (ui, value) => {
+        if (value.html) {
+          pasteHtml(editor, value.html, value.internal);
+        }
+        if (value.text) {
+          pasteText(editor, value.text);
+        }
+      });
+    };
+
+    const setHtml5Clipboard = (clipboardData, html, text) => {
+      try {
+        clipboardData.clearData();
+        clipboardData.setData('text/html', html);
+        clipboardData.setData('text/plain', text);
+        clipboardData.setData(internalHtmlMime(), html);
+        return true;
+      } catch (e) {
+        return false;
+      }
+    };
+    const setClipboardData = (evt, data, fallback, done) => {
+      if (setHtml5Clipboard(evt.clipboardData, data.html, data.text)) {
+        evt.preventDefault();
+        done();
+      } else {
+        fallback(data.html, done);
+      }
+    };
+    const fallback = editor => (html, done) => {
+      const {dom, selection} = editor;
+      const outer = dom.create('div', {
+        'contenteditable': 'false',
+        'data-mce-bogus': 'all'
+      });
+      const inner = dom.create('div', { contenteditable: 'true' }, html);
+      dom.setStyles(outer, {
+        position: 'fixed',
+        top: '0',
+        left: '-3000px',
+        width: '1000px',
+        overflow: 'hidden'
+      });
+      outer.appendChild(inner);
+      dom.add(editor.getBody(), outer);
+      const range = selection.getRng();
+      inner.focus();
+      const offscreenRange = dom.createRng();
+      offscreenRange.selectNodeContents(inner);
+      selection.setRng(offscreenRange);
+      Delay.setEditorTimeout(editor, () => {
+        selection.setRng(range);
+        dom.remove(outer);
+        done();
+      }, 0);
+    };
+    const getData = editor => ({
+      html: mark(editor.selection.getContent({ contextual: true })),
+      text: editor.selection.getContent({ format: 'text' })
+    });
+    const isTableSelection = editor => !!editor.dom.getParent(editor.selection.getStart(), 'td[data-mce-selected],th[data-mce-selected]', editor.getBody());
+    const hasSelectedContent = editor => !editor.selection.isCollapsed() || isTableSelection(editor);
+    const cut = editor => evt => {
+      if (!evt.isDefaultPrevented() && hasSelectedContent(editor)) {
+        setClipboardData(evt, getData(editor), fallback(editor), () => {
+          if (Env.browser.isChromium() || Env.browser.isFirefox()) {
+            const rng = editor.selection.getRng();
+            Delay.setEditorTimeout(editor, () => {
+              editor.selection.setRng(rng);
+              editor.execCommand('Delete');
+            }, 0);
+          } else {
+            editor.execCommand('Delete');
+          }
+        });
+      }
+    };
+    const copy = editor => evt => {
+      if (!evt.isDefaultPrevented() && hasSelectedContent(editor)) {
+        setClipboardData(evt, getData(editor), fallback(editor), noop);
+      }
+    };
+    const register = editor => {
+      editor.on('cut', cut(editor));
+      editor.on('copy', copy(editor));
+    };
+
+    const getCaretRangeFromEvent = (editor, e) => {
+      var _a, _b;
+      return RangeUtils.getCaretRangeFromPoint((_a = e.clientX) !== null && _a !== void 0 ? _a : 0, (_b = e.clientY) !== null && _b !== void 0 ? _b : 0, editor.getDoc());
+    };
+    const isPlainTextFileUrl = content => {
+      const plainTextContent = content['text/plain'];
+      return plainTextContent ? plainTextContent.indexOf('file://') === 0 : false;
+    };
+    const setFocusedRange = (editor, rng) => {
+      editor.focus();
+      if (rng) {
+        editor.selection.setRng(rng);
+      }
+    };
+    const hasImage = dataTransfer => exists(dataTransfer.files, file => /^image\//.test(file.type));
+    const setup$a = (editor, draggingInternallyState) => {
+      if (shouldPasteBlockDrop(editor)) {
+        editor.on('dragend dragover draggesture dragdrop drop drag', e => {
+          e.preventDefault();
+          e.stopPropagation();
+        });
+      }
+      if (!shouldPasteDataImages(editor)) {
+        editor.on('drop', e => {
+          const dataTransfer = e.dataTransfer;
+          if (dataTransfer && hasImage(dataTransfer)) {
+            e.preventDefault();
+          }
+        });
+      }
+      editor.on('drop', e => {
+        if (e.isDefaultPrevented() || draggingInternallyState.get()) {
+          return;
+        }
+        const rng = getCaretRangeFromEvent(editor, e);
+        if (isNullable(rng)) {
+          return;
+        }
+        const dropContent = getDataTransferItems(e.dataTransfer);
+        const internal = hasContentType(dropContent, internalHtmlMime());
+        if ((!hasHtmlOrText(dropContent) || isPlainTextFileUrl(dropContent)) && pasteImageData(editor, e, rng)) {
+          return;
+        }
+        const internalContent = dropContent[internalHtmlMime()];
+        const content = internalContent || dropContent['text/html'] || dropContent['text/plain'];
+        if (content) {
+          e.preventDefault();
+          Delay.setEditorTimeout(editor, () => {
+            editor.undoManager.transact(() => {
+              if (internalContent) {
+                editor.execCommand('Delete');
+              }
+              setFocusedRange(editor, rng);
+              const trimmedContent = trimHtml(content);
+              if (dropContent['text/html']) {
+                pasteHtml(editor, trimmedContent, internal);
+              } else {
+                pasteText(editor, trimmedContent);
+              }
+            });
+          });
+        }
+      });
+      editor.on('dragstart', _e => {
+        draggingInternallyState.set(true);
+      });
+      editor.on('dragover dragend', e => {
+        if (shouldPasteDataImages(editor) && draggingInternallyState.get() === false) {
+          e.preventDefault();
+          setFocusedRange(editor, getCaretRangeFromEvent(editor, e));
+        }
+        if (e.type === 'dragend') {
+          draggingInternallyState.set(false);
+        }
+      });
+    };
+
+    const setup$9 = editor => {
+      const processEvent = f => e => {
+        f(editor, e);
+      };
+      const preProcess = getPastePreProcess(editor);
+      if (isFunction(preProcess)) {
+        editor.on('PastePreProcess', processEvent(preProcess));
+      }
+      const postProcess = getPastePostProcess(editor);
+      if (isFunction(postProcess)) {
+        editor.on('PastePostProcess', processEvent(postProcess));
+      }
+    };
+
+    const addPreProcessFilter = (editor, filterFunc) => {
+      editor.on('PastePreProcess', e => {
+        e.content = filterFunc(editor, e.content, e.internal);
+      });
+    };
+    const rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi;
+    const rgbToHex = value => Tools.trim(value).replace(rgbRegExp, rgbaToHexString).toLowerCase();
+    const removeWebKitStyles = (editor, content, internal) => {
+      const webKitStylesOption = getPasteWebkitStyles(editor);
+      if (internal || webKitStylesOption === 'all' || !shouldPasteRemoveWebKitStyles(editor)) {
+        return content;
+      }
+      const webKitStyles = webKitStylesOption ? webKitStylesOption.split(/[, ]/) : [];
+      if (webKitStyles && webKitStylesOption !== 'none') {
+        const dom = editor.dom, node = editor.selection.getNode();
+        content = content.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi, (all, before, value, after) => {
+          const inputStyles = dom.parseStyle(dom.decode(value));
+          const outputStyles = {};
+          for (let i = 0; i < webKitStyles.length; i++) {
+            const inputValue = inputStyles[webKitStyles[i]];
+            let compareInput = inputValue;
+            let currentValue = dom.getStyle(node, webKitStyles[i], true);
+            if (/color/.test(webKitStyles[i])) {
+              compareInput = rgbToHex(compareInput);
+              currentValue = rgbToHex(currentValue);
+            }
+            if (currentValue !== compareInput) {
+              outputStyles[webKitStyles[i]] = inputValue;
+            }
+          }
+          const outputStyle = dom.serializeStyle(outputStyles, 'span');
+          if (outputStyle) {
+            return before + ' style="' + outputStyle + '"' + after;
+          }
+          return before + after;
+        });
+      } else {
+        content = content.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi, '$1$3');
+      }
+      content = content.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi, (all, before, value, after) => {
+        return before + ' style="' + value + '"' + after;
+      });
+      return content;
+    };
+    const setup$8 = editor => {
+      if (Env.browser.isChromium() || Env.browser.isSafari()) {
+        addPreProcessFilter(editor, removeWebKitStyles);
+      }
+    };
+
+    const setup$7 = editor => {
+      const draggingInternallyState = Cell(false);
+      const pasteFormat = Cell(isPasteAsTextEnabled(editor) ? 'text' : 'html');
+      const pasteBin = PasteBin(editor);
+      setup$8(editor);
+      register$1(editor, pasteFormat);
+      setup$9(editor);
+      editor.on('PreInit', () => {
+        register(editor);
+        setup$a(editor, draggingInternallyState);
+        registerEventsAndFilters(editor, pasteBin, pasteFormat);
+      });
+    };
+
+    const preventSummaryToggle = editor => {
+      editor.on('click', e => {
+        if (editor.dom.getParent(e.target, 'details')) {
+          e.preventDefault();
+        }
+      });
+    };
+    const filterDetails = editor => {
+      editor.parser.addNodeFilter('details', elms => {
+        each$g(elms, details => {
+          details.attr('data-mce-open', details.attr('open'));
+          details.attr('open', 'open');
+        });
+      });
+      editor.serializer.addNodeFilter('details', elms => {
+        each$g(elms, details => {
+          const open = details.attr('data-mce-open');
+          details.attr('open', isString(open) ? open : null);
+          details.attr('data-mce-open', null);
+        });
+      });
+    };
+    const setup$6 = editor => {
+      preventSummaryToggle(editor);
+      filterDetails(editor);
+    };
+
+    const isTextBlockNode = node => isElement$6(node) && isTextBlock$2(SugarElement.fromDom(node));
+    const normalizeSelection = editor => {
+      const rng = editor.selection.getRng();
+      const startPos = CaretPosition.fromRangeStart(rng);
+      const endPos = CaretPosition.fromRangeEnd(rng);
+      if (CaretPosition.isElementPosition(startPos)) {
+        const container = startPos.container();
+        if (isTextBlockNode(container)) {
+          firstPositionIn(container).each(pos => rng.setStart(pos.container(), pos.offset()));
+        }
+      }
+      if (CaretPosition.isElementPosition(endPos)) {
+        const container = startPos.container();
+        if (isTextBlockNode(container)) {
+          lastPositionIn(container).each(pos => rng.setEnd(pos.container(), pos.offset()));
+        }
+      }
+      editor.selection.setRng(normalize(rng));
+    };
+    const setup$5 = editor => {
+      editor.on('click', e => {
+        if (e.detail >= 3) {
+          normalizeSelection(editor);
+        }
+      });
+    };
+
+    var FakeCaretPosition;
+    (function (FakeCaretPosition) {
+      FakeCaretPosition['Before'] = 'before';
+      FakeCaretPosition['After'] = 'after';
+    }(FakeCaretPosition || (FakeCaretPosition = {})));
+    const distanceToRectLeft = (clientRect, clientX) => Math.abs(clientRect.left - clientX);
+    const distanceToRectRight = (clientRect, clientX) => Math.abs(clientRect.right - clientX);
+    const isInsideY = (clientY, clientRect) => clientY >= clientRect.top && clientY <= clientRect.bottom;
+    const collidesY = (r1, r2) => r1.top < r2.bottom && r1.bottom > r2.top;
+    const isOverlapping = (r1, r2) => {
+      const overlap = overlapY(r1, r2) / Math.min(r1.height, r2.height);
+      return collidesY(r1, r2) && overlap > 0.5;
+    };
+    const splitRectsPerAxis = (rects, y) => {
+      const intersectingRects = filter$6(rects, rect => isInsideY(y, rect));
+      return boundingClientRectFromRects(intersectingRects).fold(() => [
+        [],
+        rects
+      ], boundingRect => {
+        const {
+          pass: horizontal,
+          fail: vertical
+        } = partition$2(rects, rect => isOverlapping(rect, boundingRect));
+        return [
+          horizontal,
+          vertical
+        ];
+      });
+    };
+    const clientInfo = (rect, clientX) => {
+      return {
+        node: rect.node,
+        position: distanceToRectLeft(rect, clientX) < distanceToRectRight(rect, clientX) ? FakeCaretPosition.Before : FakeCaretPosition.After
+      };
+    };
+    const horizontalDistance = (rect, x, _y) => x > rect.left && x < rect.right ? 0 : Math.min(Math.abs(rect.left - x), Math.abs(rect.right - x));
+    const closestChildCaretCandidateNodeRect = (children, clientX, clientY) => {
+      const caretCandidateRect = rect => {
+        if (isCaretCandidate$3(rect.node)) {
+          return Optional.some(rect);
+        } else if (isElement$6(rect.node)) {
+          return closestChildCaretCandidateNodeRect(from(rect.node.childNodes), clientX, clientY);
+        } else {
+          return Optional.none();
+        }
+      };
+      const getClosestTextNode = (rects, distance) => {
+        if (rects.length >= 2) {
+          const r1 = caretCandidateRect(rects[0]).getOr(rects[0]);
+          const r2 = caretCandidateRect(rects[1]).getOr(rects[1]);
+          const deltaDistance = Math.abs(distance(r1, clientX, clientY) - distance(r2, clientX, clientY));
+          if (deltaDistance < 2) {
+            if (isText$8(r1.node)) {
+              return Optional.some(r1);
+            } else if (isText$8(r2.node)) {
+              return Optional.some(r2);
+            }
+          }
+        }
+        return Optional.none();
+      };
+      const findClosestCaretCandidateNodeRect = (rects, distance) => {
+        const sortedRects = sort(rects, (r1, r2) => distance(r1, clientX, clientY) - distance(r2, clientX, clientY));
+        return getClosestTextNode(sortedRects, distance).orThunk(() => findMap(sortedRects, caretCandidateRect));
+      };
+      const [horizontalRects, verticalRects] = splitRectsPerAxis(getClientRects(children), clientY);
+      const {
+        pass: above,
+        fail: below
+      } = partition$2(verticalRects, rect => rect.top < clientY);
+      return findClosestCaretCandidateNodeRect(horizontalRects, horizontalDistance).orThunk(() => findClosestCaretCandidateNodeRect(below, distanceToRectEdgeFromXY)).orThunk(() => findClosestCaretCandidateNodeRect(above, distanceToRectEdgeFromXY));
+    };
+    const traverseUp = (rootElm, scope, clientX, clientY) => {
+      const helper = (scope, prevScope) => {
+        return prevScope.fold(() => closestChildCaretCandidateNodeRect(from(scope.dom.childNodes), clientX, clientY), prevScope => {
+          const uncheckedChildren = filter$6(from(scope.dom.childNodes), node => node !== prevScope.dom);
+          return closestChildCaretCandidateNodeRect(uncheckedChildren, clientX, clientY);
+        }).orThunk(() => {
+          const parent = eq(scope, rootElm) ? Optional.none() : parentElement(scope);
+          return parent.bind(newScope => helper(newScope, Optional.some(scope)));
+        });
+      };
+      return helper(scope, Optional.none());
+    };
+    const closestCaretCandidateNodeRect = (root, clientX, clientY) => {
+      const rootElm = SugarElement.fromDom(root);
+      const ownerDoc = documentOrOwner(rootElm);
+      const elementAtPoint = SugarElement.fromPoint(ownerDoc, clientX, clientY).filter(elm => contains(rootElm, elm));
+      const element = elementAtPoint.getOr(rootElm);
+      return traverseUp(rootElm, element, clientX, clientY);
+    };
+    const closestFakeCaretCandidate = (root, clientX, clientY) => closestCaretCandidateNodeRect(root, clientX, clientY).filter(rect => isFakeCaretTarget(rect.node)).map(rect => clientInfo(rect, clientX));
+
+    const getAbsolutePosition = elm => {
+      const clientRect = elm.getBoundingClientRect();
+      const doc = elm.ownerDocument;
+      const docElem = doc.documentElement;
+      const win = doc.defaultView;
+      return {
+        top: clientRect.top + win.pageYOffset - docElem.clientTop,
+        left: clientRect.left + win.pageXOffset - docElem.clientLeft
+      };
+    };
+    const getBodyPosition = editor => editor.inline ? getAbsolutePosition(editor.getBody()) : {
+      left: 0,
+      top: 0
+    };
+    const getScrollPosition = editor => {
+      const body = editor.getBody();
+      return editor.inline ? {
+        left: body.scrollLeft,
+        top: body.scrollTop
+      } : {
+        left: 0,
+        top: 0
+      };
+    };
+    const getBodyScroll = editor => {
+      const body = editor.getBody(), docElm = editor.getDoc().documentElement;
+      const inlineScroll = {
+        left: body.scrollLeft,
+        top: body.scrollTop
+      };
+      const iframeScroll = {
+        left: body.scrollLeft || docElm.scrollLeft,
+        top: body.scrollTop || docElm.scrollTop
+      };
+      return editor.inline ? inlineScroll : iframeScroll;
+    };
+    const getMousePosition = (editor, event) => {
+      if (event.target.ownerDocument !== editor.getDoc()) {
+        const iframePosition = getAbsolutePosition(editor.getContentAreaContainer());
+        const scrollPosition = getBodyScroll(editor);
+        return {
+          left: event.pageX - iframePosition.left + scrollPosition.left,
+          top: event.pageY - iframePosition.top + scrollPosition.top
+        };
+      }
+      return {
+        left: event.pageX,
+        top: event.pageY
+      };
+    };
+    const calculatePosition = (bodyPosition, scrollPosition, mousePosition) => ({
+      pageX: mousePosition.left - bodyPosition.left + scrollPosition.left,
+      pageY: mousePosition.top - bodyPosition.top + scrollPosition.top
+    });
+    const calc = (editor, event) => calculatePosition(getBodyPosition(editor), getScrollPosition(editor), getMousePosition(editor, event));
+
+    const isContentEditableFalse$1 = isContentEditableFalse$a, isContentEditableTrue = isContentEditableTrue$4;
+    const isDraggable = (rootElm, elm) => isContentEditableFalse$1(elm) && elm !== rootElm;
+    const isValidDropTarget = (editor, targetElement, dragElement) => {
+      if (targetElement === dragElement || editor.dom.isChildOf(targetElement, dragElement)) {
+        return false;
+      }
+      return !isContentEditableFalse$1(targetElement);
+    };
+    const cloneElement = elm => {
+      const cloneElm = elm.cloneNode(true);
+      cloneElm.removeAttribute('data-mce-selected');
+      return cloneElm;
+    };
+    const createGhost = (editor, elm, width, height) => {
+      const dom = editor.dom;
+      const clonedElm = elm.cloneNode(true);
+      dom.setStyles(clonedElm, {
+        width,
+        height
+      });
+      dom.setAttrib(clonedElm, 'data-mce-selected', null);
+      const ghostElm = dom.create('div', {
+        'class': 'mce-drag-container',
+        'data-mce-bogus': 'all',
+        'unselectable': 'on',
+        'contenteditable': 'false'
+      });
+      dom.setStyles(ghostElm, {
+        position: 'absolute',
+        opacity: 0.5,
+        overflow: 'hidden',
+        border: 0,
+        padding: 0,
+        margin: 0,
+        width,
+        height
+      });
+      dom.setStyles(clonedElm, {
+        margin: 0,
+        boxSizing: 'border-box'
+      });
+      ghostElm.appendChild(clonedElm);
+      return ghostElm;
+    };
+    const appendGhostToBody = (ghostElm, bodyElm) => {
+      if (ghostElm.parentNode !== bodyElm) {
+        bodyElm.appendChild(ghostElm);
+      }
+    };
+    const moveGhost = (ghostElm, position, width, height, maxX, maxY) => {
+      let overflowX = 0, overflowY = 0;
+      ghostElm.style.left = position.pageX + 'px';
+      ghostElm.style.top = position.pageY + 'px';
+      if (position.pageX + width > maxX) {
+        overflowX = position.pageX + width - maxX;
+      }
+      if (position.pageY + height > maxY) {
+        overflowY = position.pageY + height - maxY;
+      }
+      ghostElm.style.width = width - overflowX + 'px';
+      ghostElm.style.height = height - overflowY + 'px';
+    };
+    const removeElement = elm => {
+      if (elm && elm.parentNode) {
+        elm.parentNode.removeChild(elm);
+      }
+    };
+    const isLeftMouseButtonPressed = e => e.button === 0;
+    const applyRelPos = (state, position) => ({
+      pageX: position.pageX - state.relX,
+      pageY: position.pageY + 5
+    });
+    const start = (state, editor) => e => {
+      if (isLeftMouseButtonPressed(e)) {
+        const ceElm = find$2(editor.dom.getParents(e.target), or(isContentEditableFalse$1, isContentEditableTrue)).getOr(null);
+        if (isDraggable(editor.getBody(), ceElm)) {
+          const elmPos = editor.dom.getPos(ceElm);
+          const bodyElm = editor.getBody();
+          const docElm = editor.getDoc().documentElement;
+          state.set({
+            element: ceElm,
+            dragging: false,
+            screenX: e.screenX,
+            screenY: e.screenY,
+            maxX: (editor.inline ? bodyElm.scrollWidth : docElm.offsetWidth) - 2,
+            maxY: (editor.inline ? bodyElm.scrollHeight : docElm.offsetHeight) - 2,
+            relX: e.pageX - elmPos.x,
+            relY: e.pageY - elmPos.y,
+            width: ceElm.offsetWidth,
+            height: ceElm.offsetHeight,
+            ghost: createGhost(editor, ceElm, ceElm.offsetWidth, ceElm.offsetHeight)
+          });
+        }
+      }
+    };
+    const move = (state, editor) => {
+      const throttledPlaceCaretAt = first$1((clientX, clientY) => {
+        editor._selectionOverrides.hideFakeCaret();
+        editor.selection.placeCaretAt(clientX, clientY);
+      }, 0);
+      editor.on('remove', throttledPlaceCaretAt.cancel);
+      return e => state.on(state => {
+        const movement = Math.max(Math.abs(e.screenX - state.screenX), Math.abs(e.screenY - state.screenY));
+        if (!state.dragging && movement > 10) {
+          const args = editor.dispatch('dragstart', { target: state.element });
+          if (args.isDefaultPrevented()) {
+            return;
+          }
+          state.dragging = true;
+          editor.focus();
+        }
+        if (state.dragging) {
+          const targetPos = applyRelPos(state, calc(editor, e));
+          appendGhostToBody(state.ghost, editor.getBody());
+          moveGhost(state.ghost, targetPos, state.width, state.height, state.maxX, state.maxY);
+          throttledPlaceCaretAt.throttle(e.clientX, e.clientY);
+        }
+      });
+    };
+    const getRawTarget = selection => {
+      const rng = selection.getSel().getRangeAt(0);
+      const startContainer = rng.startContainer;
+      return startContainer.nodeType === 3 ? startContainer.parentNode : startContainer;
+    };
+    const drop = (state, editor) => e => {
+      state.on(state => {
+        if (state.dragging) {
+          if (isValidDropTarget(editor, getRawTarget(editor.selection), state.element)) {
+            const targetClone = cloneElement(state.element);
+            const args = editor.dispatch('drop', {
+              clientX: e.clientX,
+              clientY: e.clientY
+            });
+            if (!args.isDefaultPrevented()) {
+              editor.undoManager.transact(() => {
+                removeElement(state.element);
+                editor.insertContent(editor.dom.getOuterHTML(targetClone));
+                editor._selectionOverrides.hideFakeCaret();
+              });
+            }
+          }
+          editor.dispatch('dragend');
+        }
+      });
+      removeDragState(state);
+    };
+    const stop = (state, editor) => () => {
+      state.on(state => {
+        if (state.dragging) {
+          editor.dispatch('dragend');
+        }
+      });
+      removeDragState(state);
+    };
+    const removeDragState = state => {
+      state.on(state => {
+        removeElement(state.ghost);
+      });
+      state.clear();
+    };
+    const bindFakeDragEvents = editor => {
+      const state = value$2();
+      const pageDom = DOMUtils.DOM;
+      const rootDocument = document;
+      const dragStartHandler = start(state, editor);
+      const dragHandler = move(state, editor);
+      const dropHandler = drop(state, editor);
+      const dragEndHandler = stop(state, editor);
+      editor.on('mousedown', dragStartHandler);
+      editor.on('mousemove', dragHandler);
+      editor.on('mouseup', dropHandler);
+      pageDom.bind(rootDocument, 'mousemove', dragHandler);
+      pageDom.bind(rootDocument, 'mouseup', dragEndHandler);
+      editor.on('remove', () => {
+        pageDom.unbind(rootDocument, 'mousemove', dragHandler);
+        pageDom.unbind(rootDocument, 'mouseup', dragEndHandler);
+      });
+      editor.on('keydown', e => {
+        if (e.keyCode === VK.ESC) {
+          dragEndHandler();
+        }
+      });
+    };
+    const blockUnsupportedFileDrop = editor => {
+      const preventFileDrop = e => {
+        if (!e.isDefaultPrevented()) {
+          const dataTransfer = e.dataTransfer;
+          if (dataTransfer && (contains$2(dataTransfer.types, 'Files') || dataTransfer.files.length > 0)) {
+            e.preventDefault();
+            if (e.type === 'drop') {
+              displayError(editor, 'Dropped file type is not supported');
+            }
+          }
+        }
+      };
+      const preventFileDropIfUIElement = e => {
+        if (isUIElement(editor, e.target)) {
+          preventFileDrop(e);
+        }
+      };
+      const setup = () => {
+        const pageDom = DOMUtils.DOM;
+        const dom = editor.dom;
+        const doc = document;
+        const editorRoot = editor.inline ? editor.getBody() : editor.getDoc();
+        const eventNames = [
+          'drop',
+          'dragover'
+        ];
+        each$g(eventNames, name => {
+          pageDom.bind(doc, name, preventFileDropIfUIElement);
+          dom.bind(editorRoot, name, preventFileDrop);
+        });
+        editor.on('remove', () => {
+          each$g(eventNames, name => {
+            pageDom.unbind(doc, name, preventFileDropIfUIElement);
+            dom.unbind(editorRoot, name, preventFileDrop);
+          });
+        });
+      };
+      editor.on('init', () => {
+        Delay.setEditorTimeout(editor, setup, 0);
+      });
+    };
+    const init$2 = editor => {
+      bindFakeDragEvents(editor);
+      if (shouldBlockUnsupportedDrop(editor)) {
+        blockUnsupportedFileDrop(editor);
+      }
+    };
+
+    const setup$4 = editor => {
+      const renderFocusCaret = first$1(() => {
+        if (!editor.removed && editor.getBody().contains(document.activeElement)) {
+          const rng = editor.selection.getRng();
+          if (rng.collapsed) {
+            const caretRange = renderRangeCaret(editor, rng, false);
+            editor.selection.setRng(caretRange);
+          }
+        }
+      }, 0);
+      editor.on('focus', () => {
+        renderFocusCaret.throttle();
+      });
+      editor.on('blur', () => {
+        renderFocusCaret.cancel();
+      });
+    };
+
+    const setup$3 = editor => {
+      editor.on('init', () => {
+        editor.on('focusin', e => {
+          const target = e.target;
+          if (isMedia$2(target)) {
+            const ceRoot = getContentEditableRoot$1(editor.getBody(), target);
+            const node = isContentEditableFalse$a(ceRoot) ? ceRoot : target;
+            if (editor.selection.getNode() !== node) {
+              selectNode(editor, node).each(rng => editor.selection.setRng(rng));
+            }
+          }
+        });
+      });
+    };
+
+    const isContentEditableFalse = isContentEditableFalse$a;
+    const getContentEditableRoot = (editor, node) => getContentEditableRoot$1(editor.getBody(), node);
+    const SelectionOverrides = editor => {
+      const selection = editor.selection, dom = editor.dom;
+      const isBlock = dom.isBlock;
+      const rootNode = editor.getBody();
+      const fakeCaret = FakeCaret(editor, rootNode, isBlock, () => hasFocus(editor));
+      const realSelectionId = 'sel-' + dom.uniqueId();
+      const elementSelectionAttr = 'data-mce-selected';
+      let selectedElement;
+      const isFakeSelectionElement = node => dom.hasClass(node, 'mce-offscreen-selection');
+      const isFakeSelectionTargetElement = node => node !== rootNode && (isContentEditableFalse(node) || isMedia$2(node)) && dom.isChildOf(node, rootNode);
+      const setRange = range => {
+        if (range) {
+          selection.setRng(range);
+        }
+      };
+      const showCaret = (direction, node, before, scrollIntoView = true) => {
+        const e = editor.dispatch('ShowCaret', {
+          target: node,
+          direction,
+          before
+        });
+        if (e.isDefaultPrevented()) {
+          return null;
+        }
+        if (scrollIntoView) {
+          selection.scrollIntoView(node, direction === -1);
+        }
+        return fakeCaret.show(before, node);
+      };
+      const showBlockCaretContainer = blockCaretContainer => {
+        if (blockCaretContainer.hasAttribute('data-mce-caret')) {
+          showCaretContainerBlock(blockCaretContainer);
+          selection.scrollIntoView(blockCaretContainer);
+        }
+      };
+      const registerEvents = () => {
+        editor.on('click', e => {
+          const contentEditableRoot = getContentEditableRoot(editor, e.target);
+          if (contentEditableRoot) {
+            if (isContentEditableFalse(contentEditableRoot)) {
+              e.preventDefault();
+              editor.focus();
+            }
+          }
+        });
+        editor.on('blur NewBlock', removeElementSelection);
+        editor.on('ResizeWindow FullscreenStateChanged', fakeCaret.reposition);
+        editor.on('tap', e => {
+          const targetElm = e.target;
+          const contentEditableRoot = getContentEditableRoot(editor, targetElm);
+          if (isContentEditableFalse(contentEditableRoot)) {
+            e.preventDefault();
+            selectNode(editor, contentEditableRoot).each(setElementSelection);
+          } else if (isFakeSelectionTargetElement(targetElm)) {
+            selectNode(editor, targetElm).each(setElementSelection);
+          }
+        }, true);
+        editor.on('mousedown', e => {
+          const targetElm = e.target;
+          if (targetElm !== rootNode && targetElm.nodeName !== 'HTML' && !dom.isChildOf(targetElm, rootNode)) {
+            return;
+          }
+          if (isXYInContentArea(editor, e.clientX, e.clientY) === false) {
+            return;
+          }
+          removeElementSelection();
+          hideFakeCaret();
+          const closestContentEditable = getContentEditableRoot(editor, targetElm);
+          if (isContentEditableFalse(closestContentEditable)) {
+            e.preventDefault();
+            selectNode(editor, closestContentEditable).each(setElementSelection);
+          } else {
+            closestFakeCaretCandidate(rootNode, e.clientX, e.clientY).each(caretInfo => {
+              e.preventDefault();
+              const range = showCaret(1, caretInfo.node, caretInfo.position === FakeCaretPosition.Before, false);
+              setRange(range);
+              if (isElement$6(closestContentEditable)) {
+                closestContentEditable.focus();
+              } else {
+                editor.getBody().focus();
+              }
+            });
+          }
+        });
+        editor.on('keypress', e => {
+          if (VK.modifierPressed(e)) {
+            return;
+          }
+          if (isContentEditableFalse(selection.getNode())) {
+            e.preventDefault();
+          }
+        });
+        editor.on('GetSelectionRange', e => {
+          let rng = e.range;
+          if (selectedElement) {
+            if (!selectedElement.parentNode) {
+              selectedElement = null;
+              return;
+            }
+            rng = rng.cloneRange();
+            rng.selectNode(selectedElement);
+            e.range = rng;
+          }
+        });
+        editor.on('SetSelectionRange', e => {
+          e.range = normalizeVoidElementSelection(e.range);
+          const rng = setElementSelection(e.range, e.forward);
+          if (rng) {
+            e.range = rng;
+          }
+        });
+        const isPasteBin = node => node.id === 'mcepastebin';
+        editor.on('AfterSetSelectionRange', e => {
+          const rng = e.range;
+          const parentNode = rng.startContainer.parentNode;
+          if (!isRangeInCaretContainer(rng) && !isPasteBin(parentNode)) {
+            hideFakeCaret();
+          }
+          if (!isFakeSelectionElement(parentNode)) {
+            removeElementSelection();
+          }
+        });
+        init$2(editor);
+        setup$4(editor);
+        setup$3(editor);
+      };
+      const isWithinCaretContainer = node => isCaretContainer$2(node) || startsWithCaretContainer$1(node) || endsWithCaretContainer$1(node);
+      const isRangeInCaretContainer = rng => isWithinCaretContainer(rng.startContainer) || isWithinCaretContainer(rng.endContainer);
+      const normalizeVoidElementSelection = rng => {
+        const voidElements = editor.schema.getVoidElements();
+        const newRng = dom.createRng();
+        const startContainer = rng.startContainer;
+        const startOffset = rng.startOffset;
+        const endContainer = rng.endContainer;
+        const endOffset = rng.endOffset;
+        if (has$2(voidElements, startContainer.nodeName.toLowerCase())) {
+          if (startOffset === 0) {
+            newRng.setStartBefore(startContainer);
+          } else {
+            newRng.setStartAfter(startContainer);
+          }
+        } else {
+          newRng.setStart(startContainer, startOffset);
+        }
+        if (has$2(voidElements, endContainer.nodeName.toLowerCase())) {
+          if (endOffset === 0) {
+            newRng.setEndBefore(endContainer);
+          } else {
+            newRng.setEndAfter(endContainer);
+          }
+        } else {
+          newRng.setEnd(endContainer, endOffset);
+        }
+        return newRng;
+      };
+      const setupOffscreenSelection = (node, targetClone) => {
+        const body = SugarElement.fromDom(editor.getBody());
+        const doc = editor.getDoc();
+        const realSelectionContainer = descendant(body, '#' + realSelectionId).getOrThunk(() => {
+          const newContainer = SugarElement.fromHtml('<div data-mce-bogus="all" class="mce-offscreen-selection"></div>', doc);
+          set$2(newContainer, 'id', realSelectionId);
+          append$1(body, newContainer);
+          return newContainer;
+        });
+        const newRange = dom.createRng();
+        empty(realSelectionContainer);
+        append(realSelectionContainer, [
+          SugarElement.fromText(nbsp, doc),
+          SugarElement.fromDom(targetClone),
+          SugarElement.fromText(nbsp, doc)
+        ]);
+        newRange.setStart(realSelectionContainer.dom.firstChild, 1);
+        newRange.setEnd(realSelectionContainer.dom.lastChild, 0);
+        setAll(realSelectionContainer, { top: dom.getPos(node, editor.getBody()).y + 'px' });
+        focus$1(realSelectionContainer);
+        const sel = selection.getSel();
+        sel.removeAllRanges();
+        sel.addRange(newRange);
+        return newRange;
+      };
+      const selectElement = elm => {
+        const targetClone = elm.cloneNode(true);
+        const e = editor.dispatch('ObjectSelected', {
+          target: elm,
+          targetClone
+        });
+        if (e.isDefaultPrevented()) {
+          return null;
+        }
+        const range = setupOffscreenSelection(elm, e.targetClone);
+        const nodeElm = SugarElement.fromDom(elm);
+        each$g(descendants(SugarElement.fromDom(editor.getBody()), '*[data-mce-selected]'), elm => {
+          if (!eq(nodeElm, elm)) {
+            remove$a(elm, elementSelectionAttr);
+          }
+        });
+        if (!dom.getAttrib(elm, elementSelectionAttr)) {
+          elm.setAttribute(elementSelectionAttr, '1');
+        }
+        selectedElement = elm;
+        hideFakeCaret();
+        return range;
+      };
+      const setElementSelection = (range, forward) => {
+        if (!range) {
+          return null;
+        }
+        if (range.collapsed) {
+          if (!isRangeInCaretContainer(range)) {
+            const dir = forward ? 1 : -1;
+            const caretPosition = getNormalizedRangeEndPoint(dir, rootNode, range);
+            const beforeNode = caretPosition.getNode(!forward);
+            if (isFakeCaretTarget(beforeNode)) {
+              return showCaret(dir, beforeNode, forward ? !caretPosition.isAtEnd() : false, false);
+            }
+            const afterNode = caretPosition.getNode(forward);
+            if (isFakeCaretTarget(afterNode)) {
+              return showCaret(dir, afterNode, forward ? false : !caretPosition.isAtEnd(), false);
+            }
+          }
+          return null;
+        }
+        let startContainer = range.startContainer;
+        let startOffset = range.startOffset;
+        const endOffset = range.endOffset;
+        if (startContainer.nodeType === 3 && startOffset === 0 && isContentEditableFalse(startContainer.parentNode)) {
+          startContainer = startContainer.parentNode;
+          startOffset = dom.nodeIndex(startContainer);
+          startContainer = startContainer.parentNode;
+        }
+        if (startContainer.nodeType !== 1) {
+          return null;
+        }
+        if (endOffset === startOffset + 1 && startContainer === range.endContainer) {
+          const node = startContainer.childNodes[startOffset];
+          if (isFakeSelectionTargetElement(node)) {
+            return selectElement(node);
+          }
+        }
+        return null;
+      };
+      const removeElementSelection = () => {
+        if (selectedElement) {
+          selectedElement.removeAttribute(elementSelectionAttr);
+        }
+        descendant(SugarElement.fromDom(editor.getBody()), '#' + realSelectionId).each(remove$5);
+        selectedElement = null;
+      };
+      const destroy = () => {
+        fakeCaret.destroy();
+        selectedElement = null;
+      };
+      const hideFakeCaret = () => {
+        fakeCaret.hide();
+      };
+      if (!isRtc(editor)) {
+        registerEvents();
+      }
+      return {
+        showCaret,
+        showBlockCaretContainer,
+        hideFakeCaret,
+        destroy
+      };
+    };
+
+    const generatePath = (root, node, offset) => {
+      if (isText$8(node) && (offset < 0 || offset > node.data.length)) {
+        return [];
+      }
+      const p = [offset];
+      let current = node;
+      while (current !== root && current.parentNode) {
+        const parent = current.parentNode;
+        for (let i = 0; i < parent.childNodes.length; i++) {
+          if (parent.childNodes[i] === current) {
+            p.push(i);
+            break;
+          }
+        }
+        current = parent;
+      }
+      return current === root ? p.reverse() : [];
+    };
+    const generatePathRange = (root, startNode, startOffset, endNode, endOffset) => {
+      const start = generatePath(root, startNode, startOffset);
+      const end = generatePath(root, endNode, endOffset);
+      return {
+        start,
+        end
+      };
+    };
+    const resolvePath = (root, path) => {
+      const nodePath = path.slice();
+      const offset = nodePath.pop();
+      const resolvedNode = foldl(nodePath, (optNode, index) => optNode.bind(node => Optional.from(node.childNodes[index])), Optional.some(root));
+      return resolvedNode.bind(node => {
+        if (isText$8(node) && (offset < 0 || offset > node.data.length)) {
+          return Optional.none();
+        } else {
+          return Optional.some({
+            node,
+            offset
+          });
+        }
+      });
+    };
+    const resolvePathRange = (root, range) => resolvePath(root, range.start).bind(({
+      node: startNode,
+      offset: startOffset
+    }) => resolvePath(root, range.end).map(({
+      node: endNode,
+      offset: endOffset
+    }) => {
+      const rng = document.createRange();
+      rng.setStart(startNode, startOffset);
+      rng.setEnd(endNode, endOffset);
+      return rng;
+    }));
+    const generatePathRangeFromRange = (root, range) => generatePathRange(root, range.startContainer, range.startOffset, range.endContainer, range.endOffset);
+
+    const cleanEmptyNodes = (dom, node, isRoot) => {
+      if (node && dom.isEmpty(node) && !isRoot(node)) {
+        const parent = node.parentNode;
+        dom.remove(node);
+        cleanEmptyNodes(dom, parent, isRoot);
+      }
+    };
+    const deleteRng = (dom, rng, isRoot, clean = true) => {
+      const startParent = rng.startContainer.parentNode;
+      const endParent = rng.endContainer.parentNode;
+      rng.deleteContents();
+      if (clean && !isRoot(rng.startContainer)) {
+        if (isText$8(rng.startContainer) && rng.startContainer.data.length === 0) {
+          dom.remove(rng.startContainer);
+        }
+        if (isText$8(rng.endContainer) && rng.endContainer.data.length === 0) {
+          dom.remove(rng.endContainer);
+        }
+        cleanEmptyNodes(dom, startParent, isRoot);
+        if (startParent !== endParent) {
+          cleanEmptyNodes(dom, endParent, isRoot);
+        }
+      }
+    };
+    const getParentBlock = (editor, rng) => Optional.from(editor.dom.getParent(rng.startContainer, editor.dom.isBlock));
+
+    const stripPattern = (dom, block, pattern) => {
+      const firstTextNode = textAfter(block, 0, block);
+      firstTextNode.each(spot => {
+        const node = spot.container;
+        scanRight(node, pattern.start.length, block).each(end => {
+          const rng = dom.createRng();
+          rng.setStart(node, 0);
+          rng.setEnd(end.container, end.offset);
+          deleteRng(dom, rng, e => e === block);
+        });
+      });
+    };
+    const applyPattern$1 = (editor, match) => {
+      const dom = editor.dom;
+      const pattern = match.pattern;
+      const rng = resolvePathRange(dom.getRoot(), match.range).getOrDie('Unable to resolve path range');
+      const isBlockFormatName = (name, formatter) => {
+        const formatSet = formatter.get(name);
+        return isArray$1(formatSet) && head(formatSet).exists(format => has$2(format, 'block'));
+      };
+      getParentBlock(editor, rng).each(block => {
+        if (pattern.type === 'block-format') {
+          if (isBlockFormatName(pattern.format, editor.formatter)) {
+            editor.undoManager.transact(() => {
+              stripPattern(editor.dom, block, pattern);
+              editor.formatter.apply(pattern.format);
+            });
+          }
+        } else if (pattern.type === 'block-command') {
+          editor.undoManager.transact(() => {
+            stripPattern(editor.dom, block, pattern);
+            editor.execCommand(pattern.cmd, false, pattern.value);
+          });
+        }
+      });
+      return true;
+    };
+    const findPattern$1 = (patterns, text) => {
+      const nuText = text.replace(nbsp, ' ');
+      return find$2(patterns, pattern => text.indexOf(pattern.start) === 0 || nuText.indexOf(pattern.start) === 0);
+    };
+    const findPatterns$1 = (editor, patterns) => {
+      const dom = editor.dom;
+      const rng = editor.selection.getRng();
+      return getParentBlock(editor, rng).filter(block => {
+        const forcedRootBlock = getForcedRootBlock(editor);
+        const matchesForcedRootBlock = dom.is(block, forcedRootBlock);
+        return block !== null && matchesForcedRootBlock;
+      }).bind(block => {
+        const blockText = block.textContent;
+        const matchedPattern = findPattern$1(patterns, blockText);
+        return matchedPattern.map(pattern => {
+          if (Tools.trim(blockText).length === pattern.start.length) {
+            return [];
+          }
+          return [{
+              pattern,
+              range: generatePathRange(dom.getRoot(), block, 0, block, 0)
+            }];
+        });
+      }).getOr([]);
+    };
+    const applyMatches$1 = (editor, matches) => {
+      if (matches.length === 0) {
+        return;
+      }
+      const bookmark = editor.selection.getBookmark();
+      each$g(matches, match => applyPattern$1(editor, match));
+      editor.selection.moveToBookmark(bookmark);
+    };
+
+    const newMarker = (dom, id) => dom.create('span', {
+      'data-mce-type': 'bookmark',
+      id
+    });
+    const rangeFromMarker = (dom, marker) => {
+      const rng = dom.createRng();
+      rng.setStartAfter(marker.start);
+      rng.setEndBefore(marker.end);
+      return rng;
+    };
+    const createMarker = (dom, markerPrefix, pathRange) => {
+      const rng = resolvePathRange(dom.getRoot(), pathRange).getOrDie('Unable to resolve path range');
+      const startNode = rng.startContainer;
+      const endNode = rng.endContainer;
+      const textEnd = rng.endOffset === 0 ? endNode : endNode.splitText(rng.endOffset);
+      const textStart = rng.startOffset === 0 ? startNode : startNode.splitText(rng.startOffset);
+      return {
+        prefix: markerPrefix,
+        end: textEnd.parentNode.insertBefore(newMarker(dom, markerPrefix + '-end'), textEnd),
+        start: textStart.parentNode.insertBefore(newMarker(dom, markerPrefix + '-start'), textStart)
+      };
+    };
+    const removeMarker = (dom, marker, isRoot) => {
+      cleanEmptyNodes(dom, dom.get(marker.prefix + '-end'), isRoot);
+      cleanEmptyNodes(dom, dom.get(marker.prefix + '-start'), isRoot);
+    };
+
+    const isReplacementPattern = pattern => pattern.start.length === 0;
+    const matchesPattern = patternContent => (element, offset) => {
+      const text = element.data;
+      const searchText = text.substring(0, offset);
+      const startEndIndex = searchText.lastIndexOf(patternContent.charAt(patternContent.length - 1));
+      const startIndex = searchText.lastIndexOf(patternContent);
+      if (startIndex !== -1) {
+        return startIndex + patternContent.length;
+      } else if (startEndIndex !== -1) {
+        return startEndIndex + 1;
+      } else {
+        return -1;
+      }
+    };
+    const findPatternStartFromSpot = (dom, pattern, block, spot) => {
+      const startPattern = pattern.start;
+      const startSpot = repeatLeft(dom, spot.container, spot.offset, matchesPattern(startPattern), block);
+      return startSpot.bind(spot => {
+        if (spot.offset >= startPattern.length) {
+          const rng = dom.createRng();
+          rng.setStart(spot.container, spot.offset - startPattern.length);
+          rng.setEnd(spot.container, spot.offset);
+          return Optional.some(rng);
+        } else {
+          const offset = spot.offset - startPattern.length;
+          return scanLeft(spot.container, offset, block).map(nextSpot => {
+            const rng = dom.createRng();
+            rng.setStart(nextSpot.container, nextSpot.offset);
+            rng.setEnd(spot.container, spot.offset);
+            return rng;
+          }).filter(rng => rng.toString() === startPattern).orThunk(() => findPatternStartFromSpot(dom, pattern, block, point(spot.container, 0)));
+        }
+      });
+    };
+    const findPatternStart = (dom, pattern, node, offset, block, requireGap = false) => {
+      if (pattern.start.length === 0 && !requireGap) {
+        const rng = dom.createRng();
+        rng.setStart(node, offset);
+        rng.setEnd(node, offset);
+        return Optional.some(rng);
+      }
+      return textBefore(node, offset, block).bind(spot => {
+        const start = findPatternStartFromSpot(dom, pattern, block, spot);
+        return start.bind(startRange => {
+          if (requireGap) {
+            if (startRange.endContainer === spot.container && startRange.endOffset === spot.offset) {
+              return Optional.none();
+            } else if (spot.offset === 0 && startRange.endContainer.textContent.length === startRange.endOffset) {
+              return Optional.none();
+            }
+          }
+          return Optional.some(startRange);
+        });
+      });
+    };
+    const findPattern = (editor, block, details) => {
+      const dom = editor.dom;
+      const root = dom.getRoot();
+      const pattern = details.pattern;
+      const endNode = details.position.container;
+      const endOffset = details.position.offset;
+      return scanLeft(endNode, endOffset - details.pattern.end.length, block).bind(spot => {
+        const endPathRng = generatePathRange(root, spot.container, spot.offset, endNode, endOffset);
+        if (isReplacementPattern(pattern)) {
+          return Optional.some({
+            matches: [{
+                pattern,
+                startRng: endPathRng,
+                endRng: endPathRng
+              }],
+            position: spot
+          });
+        } else {
+          const resultsOpt = findPatternsRec(editor, details.remainingPatterns, spot.container, spot.offset, block);
+          const results = resultsOpt.getOr({
+            matches: [],
+            position: spot
+          });
+          const pos = results.position;
+          const start = findPatternStart(dom, pattern, pos.container, pos.offset, block, resultsOpt.isNone());
+          return start.map(startRng => {
+            const startPathRng = generatePathRangeFromRange(root, startRng);
+            return {
+              matches: results.matches.concat([{
+                  pattern,
+                  startRng: startPathRng,
+                  endRng: endPathRng
+                }]),
+              position: point(startRng.startContainer, startRng.startOffset)
+            };
+          });
+        }
+      });
+    };
+    const findPatternsRec = (editor, patterns, node, offset, block) => {
+      const dom = editor.dom;
+      return textBefore(node, offset, dom.getRoot()).bind(endSpot => {
+        const rng = dom.createRng();
+        rng.setStart(block, 0);
+        rng.setEnd(node, offset);
+        const text = rng.toString();
+        for (let i = 0; i < patterns.length; i++) {
+          const pattern = patterns[i];
+          if (!endsWith(text, pattern.end)) {
+            continue;
+          }
+          const patternsWithoutCurrent = patterns.slice();
+          patternsWithoutCurrent.splice(i, 1);
+          const result = findPattern(editor, block, {
+            pattern,
+            remainingPatterns: patternsWithoutCurrent,
+            position: endSpot
+          });
+          if (result.isSome()) {
+            return result;
+          }
+        }
+        return Optional.none();
+      });
+    };
+    const applyPattern = (editor, pattern, patternRange) => {
+      editor.selection.setRng(patternRange);
+      if (pattern.type === 'inline-format') {
+        each$g(pattern.format, format => {
+          editor.formatter.apply(format);
+        });
+      } else {
+        editor.execCommand(pattern.cmd, false, pattern.value);
+      }
+    };
+    const applyReplacementPattern = (editor, pattern, marker, isRoot) => {
+      const markerRange = rangeFromMarker(editor.dom, marker);
+      deleteRng(editor.dom, markerRange, isRoot);
+      applyPattern(editor, pattern, markerRange);
+    };
+    const applyPatternWithContent = (editor, pattern, startMarker, endMarker, isRoot) => {
+      const dom = editor.dom;
+      const markerEndRange = rangeFromMarker(dom, endMarker);
+      const markerStartRange = rangeFromMarker(dom, startMarker);
+      deleteRng(dom, markerStartRange, isRoot);
+      deleteRng(dom, markerEndRange, isRoot);
+      const patternMarker = {
+        prefix: startMarker.prefix,
+        start: startMarker.end,
+        end: endMarker.start
+      };
+      const patternRange = rangeFromMarker(dom, patternMarker);
+      applyPattern(editor, pattern, patternRange);
+    };
+    const addMarkers = (dom, matches) => {
+      const markerPrefix = generate$1('mce_textpattern');
+      const matchesWithEnds = foldr(matches, (acc, match) => {
+        const endMarker = createMarker(dom, markerPrefix + `_end${ acc.length }`, match.endRng);
+        return acc.concat([{
+            ...match,
+            endMarker
+          }]);
+      }, []);
+      return foldr(matchesWithEnds, (acc, match) => {
+        const idx = matchesWithEnds.length - acc.length - 1;
+        const startMarker = isReplacementPattern(match.pattern) ? match.endMarker : createMarker(dom, markerPrefix + `_start${ idx }`, match.startRng);
+        return acc.concat([{
+            ...match,
+            startMarker
+          }]);
+      }, []);
+    };
+    const findPatterns = (editor, patterns, space) => {
+      const rng = editor.selection.getRng();
+      if (rng.collapsed === false) {
+        return [];
+      }
+      return getParentBlock(editor, rng).bind(block => {
+        const offset = Math.max(0, rng.startOffset - (space ? 1 : 0));
+        return findPatternsRec(editor, patterns, rng.startContainer, offset, block);
+      }).fold(() => [], result => result.matches);
+    };
+    const applyMatches = (editor, matches) => {
+      if (matches.length === 0) {
+        return;
+      }
+      const dom = editor.dom;
+      const bookmark = editor.selection.getBookmark();
+      const matchesWithMarkers = addMarkers(dom, matches);
+      each$g(matchesWithMarkers, match => {
+        const block = dom.getParent(match.startMarker.start, dom.isBlock);
+        const isRoot = node => node === block;
+        if (isReplacementPattern(match.pattern)) {
+          applyReplacementPattern(editor, match.pattern, match.endMarker, isRoot);
+        } else {
+          applyPatternWithContent(editor, match.pattern, match.startMarker, match.endMarker, isRoot);
+        }
+        removeMarker(dom, match.endMarker, isRoot);
+        removeMarker(dom, match.startMarker, isRoot);
+      });
+      editor.selection.moveToBookmark(bookmark);
+    };
+
+    const hasPatterns = patternSet => patternSet.inlinePatterns.length > 0 || patternSet.blockPatterns.length > 0;
+    const handleEnter = (editor, patternSet) => {
+      if (!editor.selection.isCollapsed() || !hasPatterns(patternSet)) {
+        return false;
+      }
+      const inlineMatches = findPatterns(editor, patternSet.inlinePatterns, false);
+      const blockMatches = findPatterns$1(editor, patternSet.blockPatterns);
+      if (blockMatches.length > 0 || inlineMatches.length > 0) {
+        editor.undoManager.add();
+        editor.undoManager.extra(() => {
+          editor.execCommand('mceInsertNewLine');
+        }, () => {
+          editor.insertContent(zeroWidth);
+          applyMatches(editor, inlineMatches);
+          applyMatches$1(editor, blockMatches);
+          const range = editor.selection.getRng();
+          const spot = textBefore(range.startContainer, range.startOffset, editor.dom.getRoot());
+          editor.execCommand('mceInsertNewLine');
+          spot.each(s => {
+            const node = s.container;
+            if (node.data.charAt(s.offset - 1) === zeroWidth) {
+              node.deleteData(s.offset - 1, 1);
+              cleanEmptyNodes(editor.dom, node.parentNode, e => e === editor.dom.getRoot());
+            }
+          });
+        });
+        return true;
+      }
+      return false;
+    };
+    const handleInlineKey = (editor, inlinePatterns) => {
+      if (inlinePatterns.length > 0) {
+        const inlineMatches = findPatterns(editor, inlinePatterns, true);
+        if (inlineMatches.length > 0) {
+          editor.undoManager.transact(() => {
+            applyMatches(editor, inlineMatches);
+          });
+        }
+      }
+    };
+    const checkKeyEvent = (codes, event, predicate) => {
+      for (let i = 0; i < codes.length; i++) {
+        if (predicate(codes[i], event)) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const checkKeyCode = (codes, event) => checkKeyEvent(codes, event, (code, event) => {
+      return code === event.keyCode && VK.modifierPressed(event) === false;
+    });
+    const checkCharCode = (chars, event) => checkKeyEvent(chars, event, (chr, event) => {
+      return chr.charCodeAt(0) === event.charCode;
+    });
+
+    const setup$2 = editor => {
+      const charCodes = [
+        ',',
+        '.',
+        ';',
+        ':',
+        '!',
+        '?'
+      ];
+      const keyCodes = [32];
+      const getPatternSet = () => createPatternSet(getTextPatterns(editor));
+      const getInlinePatterns$1 = () => getInlinePatterns(getTextPatterns(editor));
+      editor.on('keydown', e => {
+        if (e.keyCode === 13 && !VK.modifierPressed(e)) {
+          if (handleEnter(editor, getPatternSet())) {
+            e.preventDefault();
+          }
+        }
+      }, true);
+      editor.on('keyup', e => {
+        if (checkKeyCode(keyCodes, e)) {
+          handleInlineKey(editor, getInlinePatterns$1());
+        }
+      });
+      editor.on('keypress', e => {
+        if (checkCharCode(charCodes, e)) {
+          Delay.setEditorTimeout(editor, () => {
+            handleInlineKey(editor, getInlinePatterns$1());
+          });
+        }
+      });
+    };
+
+    const setup$1 = editor => {
+      setup$2(editor);
+    };
+
+    const Quirks = editor => {
+      const each = Tools.each;
+      const BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE, dom = editor.dom, selection = editor.selection, parser = editor.parser;
+      const browser = Env.browser;
+      const isGecko = browser.isFirefox();
+      const isWebKit = browser.isChromium() || browser.isSafari();
+      const isiOS = Env.deviceType.isiPhone() || Env.deviceType.isiPad();
+      const isMac = Env.os.isMacOS() || Env.os.isiOS();
+      const setEditorCommandState = (cmd, state) => {
+        try {
+          editor.getDoc().execCommand(cmd, false, state);
+        } catch (ex) {
+        }
+      };
+      const isDefaultPrevented = e => {
+        return e.isDefaultPrevented();
+      };
+      const emptyEditorWhenDeleting = () => {
+        const serializeRng = rng => {
+          const body = dom.create('body');
+          const contents = rng.cloneContents();
+          body.appendChild(contents);
+          return selection.serializer.serialize(body, { format: 'html' });
+        };
+        const allContentsSelected = rng => {
+          const selection = serializeRng(rng);
+          const allRng = dom.createRng();
+          allRng.selectNode(editor.getBody());
+          const allSelection = serializeRng(allRng);
+          return selection === allSelection;
+        };
+        editor.on('keydown', e => {
+          const keyCode = e.keyCode;
+          let isCollapsed, body;
+          if (!isDefaultPrevented(e) && (keyCode === DELETE || keyCode === BACKSPACE)) {
+            isCollapsed = editor.selection.isCollapsed();
+            body = editor.getBody();
+            if (isCollapsed && !dom.isEmpty(body)) {
+              return;
+            }
+            if (!isCollapsed && !allContentsSelected(editor.selection.getRng())) {
+              return;
+            }
+            e.preventDefault();
+            editor.setContent('');
+            if (body.firstChild && dom.isBlock(body.firstChild)) {
+              editor.selection.setCursorLocation(body.firstChild, 0);
+            } else {
+              editor.selection.setCursorLocation(body, 0);
+            }
+            editor.nodeChanged();
+          }
+        });
+      };
+      const selectAll = () => {
+        editor.shortcuts.add('meta+a', null, 'SelectAll');
+      };
+      const documentElementEditingFocus = () => {
+        if (!editor.inline) {
+          dom.bind(editor.getDoc(), 'mousedown mouseup', e => {
+            let rng;
+            if (e.target === editor.getDoc().documentElement) {
+              rng = selection.getRng();
+              editor.getBody().focus();
+              if (e.type === 'mousedown') {
+                if (isCaretContainer$2(rng.startContainer)) {
+                  return;
+                }
+                selection.placeCaretAt(e.clientX, e.clientY);
+              } else {
+                selection.setRng(rng);
+              }
+            }
+          });
+        }
+      };
+      const removeHrOnBackspace = () => {
+        editor.on('keydown', e => {
+          if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
+            if (!editor.getBody().getElementsByTagName('hr').length) {
+              return;
+            }
+            if (selection.isCollapsed() && selection.getRng().startOffset === 0) {
+              const node = selection.getNode();
+              const previousSibling = node.previousSibling;
+              if (node.nodeName === 'HR') {
+                dom.remove(node);
+                e.preventDefault();
+                return;
+              }
+              if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === 'hr') {
+                dom.remove(previousSibling);
+                e.preventDefault();
+              }
+            }
+          }
+        });
+      };
+      const focusBody = () => {
+        if (!Range.prototype.getClientRects) {
+          editor.on('mousedown', e => {
+            if (!isDefaultPrevented(e) && e.target.nodeName === 'HTML') {
+              const body = editor.getBody();
+              body.blur();
+              Delay.setEditorTimeout(editor, () => {
+                body.focus();
+              });
+            }
+          });
+        }
+      };
+      const selectControlElements = () => {
+        const visualAidsAnchorClass = getVisualAidsAnchorClass(editor);
+        editor.on('click', e => {
+          const target = e.target;
+          if (/^(IMG|HR)$/.test(target.nodeName) && dom.getContentEditableParent(target) !== 'false') {
+            e.preventDefault();
+            editor.selection.select(target);
+            editor.nodeChanged();
+          }
+          if (target.nodeName === 'A' && dom.hasClass(target, visualAidsAnchorClass) && target.childNodes.length === 0) {
+            e.preventDefault();
+            selection.select(target);
+          }
+        });
+      };
+      const removeStylesWhenDeletingAcrossBlockElements = () => {
+        const getAttributeApplyFunction = () => {
+          const template = dom.getAttribs(selection.getStart().cloneNode(false));
+          return () => {
+            const target = selection.getStart();
+            if (target !== editor.getBody()) {
+              dom.setAttrib(target, 'style', null);
+              each(template, attr => {
+                target.setAttributeNode(attr.cloneNode(true));
+              });
+            }
+          };
+        };
+        const isSelectionAcrossElements = () => {
+          return !selection.isCollapsed() && dom.getParent(selection.getStart(), dom.isBlock) !== dom.getParent(selection.getEnd(), dom.isBlock);
+        };
+        editor.on('keypress', e => {
+          let applyAttributes;
+          if (!isDefaultPrevented(e) && (e.keyCode === 8 || e.keyCode === 46) && isSelectionAcrossElements()) {
+            applyAttributes = getAttributeApplyFunction();
+            editor.getDoc().execCommand('delete', false, null);
+            applyAttributes();
+            e.preventDefault();
+            return false;
+          }
+        });
+        dom.bind(editor.getDoc(), 'cut', e => {
+          let applyAttributes;
+          if (!isDefaultPrevented(e) && isSelectionAcrossElements()) {
+            applyAttributes = getAttributeApplyFunction();
+            Delay.setEditorTimeout(editor, () => {
+              applyAttributes();
+            });
+          }
+        });
+      };
+      const disableBackspaceIntoATable = () => {
+        editor.on('keydown', e => {
+          if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
+            if (selection.isCollapsed() && selection.getRng().startOffset === 0) {
+              const previousSibling = selection.getNode().previousSibling;
+              if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === 'table') {
+                e.preventDefault();
+                return false;
+              }
+            }
+          }
+        });
+      };
+      const removeBlockQuoteOnBackSpace = () => {
+        editor.on('keydown', e => {
+          let rng, parent;
+          if (isDefaultPrevented(e) || e.keyCode !== VK.BACKSPACE) {
+            return;
+          }
+          rng = selection.getRng();
+          const container = rng.startContainer;
+          const offset = rng.startOffset;
+          const root = dom.getRoot();
+          parent = container;
+          if (!rng.collapsed || offset !== 0) {
+            return;
+          }
+          while (parent && parent.parentNode && parent.parentNode.firstChild === parent && parent.parentNode !== root) {
+            parent = parent.parentNode;
+          }
+          if (parent.tagName === 'BLOCKQUOTE') {
+            editor.formatter.toggle('blockquote', null, parent);
+            rng = dom.createRng();
+            rng.setStart(container, 0);
+            rng.setEnd(container, 0);
+            selection.setRng(rng);
+          }
+        });
+      };
+      const setGeckoEditingOptions = () => {
+        const setOpts = () => {
+          setEditorCommandState('StyleWithCSS', false);
+          setEditorCommandState('enableInlineTableEditing', false);
+          if (!getObjectResizing(editor)) {
+            setEditorCommandState('enableObjectResizing', false);
+          }
+        };
+        if (!isReadOnly$1(editor)) {
+          editor.on('BeforeExecCommand mousedown', setOpts);
+        }
+      };
+      const addBrAfterLastLinks = () => {
+        const fixLinks = () => {
+          each(dom.select('a'), node => {
+            let parentNode = node.parentNode;
+            const root = dom.getRoot();
+            if (parentNode.lastChild === node) {
+              while (parentNode && !dom.isBlock(parentNode)) {
+                if (parentNode.parentNode.lastChild !== parentNode || parentNode === root) {
+                  return;
+                }
+                parentNode = parentNode.parentNode;
+              }
+              dom.add(parentNode, 'br', { 'data-mce-bogus': 1 });
+            }
+          });
+        };
+        editor.on('SetContent ExecCommand', e => {
+          if (e.type === 'setcontent' || e.command === 'mceInsertLink') {
+            fixLinks();
+          }
+        });
+      };
+      const setDefaultBlockType = () => {
+        editor.on('init', () => {
+          setEditorCommandState('DefaultParagraphSeparator', getForcedRootBlock(editor));
+        });
+      };
+      const normalizeSelection = () => {
+        editor.on('keyup focusin mouseup', e => {
+          if (!VK.modifierPressed(e)) {
+            selection.normalize();
+          }
+        }, true);
+      };
+      const showBrokenImageIcon = () => {
+        editor.contentStyles.push('img:-moz-broken {' + '-moz-force-broken-image-icon:1;' + 'min-width:24px;' + 'min-height:24px' + '}');
+      };
+      const restoreFocusOnKeyDown = () => {
+        if (!editor.inline) {
+          editor.on('keydown', () => {
+            if (document.activeElement === document.body) {
+              editor.getWin().focus();
+            }
+          });
+        }
+      };
+      const bodyHeight = () => {
+        if (!editor.inline) {
+          editor.contentStyles.push('body {min-height: 150px}');
+          editor.on('click', e => {
+            let rng;
+            if (e.target.nodeName === 'HTML') {
+              rng = editor.selection.getRng();
+              editor.getBody().focus();
+              editor.selection.setRng(rng);
+              editor.selection.normalize();
+              editor.nodeChanged();
+            }
+          });
+        }
+      };
+      const blockCmdArrowNavigation = () => {
+        if (isMac) {
+          editor.on('keydown', e => {
+            if (VK.metaKeyPressed(e) && !e.shiftKey && (e.keyCode === 37 || e.keyCode === 39)) {
+              e.preventDefault();
+              const selection = editor.selection.getSel();
+              selection.modify('move', e.keyCode === 37 ? 'backward' : 'forward', 'lineboundary');
+            }
+          });
+        }
+      };
+      const tapLinksAndImages = () => {
+        editor.on('click', e => {
+          let elm = e.target;
+          do {
+            if (elm.tagName === 'A') {
+              e.preventDefault();
+              return;
+            }
+          } while (elm = elm.parentNode);
+        });
+        editor.contentStyles.push('.mce-content-body {-webkit-touch-callout: none}');
+      };
+      const blockFormSubmitInsideEditor = () => {
+        editor.on('init', () => {
+          editor.dom.bind(editor.getBody(), 'submit', e => {
+            e.preventDefault();
+          });
+        });
+      };
+      const removeAppleInterchangeBrs = () => {
+        parser.addNodeFilter('br', nodes => {
+          let i = nodes.length;
+          while (i--) {
+            if (nodes[i].attr('class') === 'Apple-interchange-newline') {
+              nodes[i].remove();
+            }
+          }
+        });
+      };
+      const refreshContentEditable = noop;
+      const isHidden = () => {
+        if (!isGecko || editor.removed) {
+          return false;
+        }
+        const sel = editor.selection.getSel();
+        return !sel || !sel.rangeCount || sel.rangeCount === 0;
+      };
+      const setupRtc = () => {
+        if (isWebKit) {
+          documentElementEditingFocus();
+          selectControlElements();
+          blockFormSubmitInsideEditor();
+          selectAll();
+          if (isiOS) {
+            restoreFocusOnKeyDown();
+            bodyHeight();
+            tapLinksAndImages();
+          }
+        }
+        if (isGecko) {
+          focusBody();
+          setGeckoEditingOptions();
+          showBrokenImageIcon();
+          blockCmdArrowNavigation();
+        }
+      };
+      const setup = () => {
+        removeBlockQuoteOnBackSpace();
+        emptyEditorWhenDeleting();
+        if (!Env.windowsPhone) {
+          normalizeSelection();
+        }
+        if (isWebKit) {
+          documentElementEditingFocus();
+          selectControlElements();
+          setDefaultBlockType();
+          blockFormSubmitInsideEditor();
+          disableBackspaceIntoATable();
+          removeAppleInterchangeBrs();
+          if (isiOS) {
+            restoreFocusOnKeyDown();
+            bodyHeight();
+            tapLinksAndImages();
+          } else {
+            selectAll();
+          }
+        }
+        if (isGecko) {
+          removeHrOnBackspace();
+          focusBody();
+          removeStylesWhenDeletingAcrossBlockElements();
+          setGeckoEditingOptions();
+          addBrAfterLastLinks();
+          showBrokenImageIcon();
+          blockCmdArrowNavigation();
+          disableBackspaceIntoATable();
+        }
+      };
+      if (isRtc(editor)) {
+        setupRtc();
+      } else {
+        setup();
+      }
+      return {
+        refreshContentEditable,
+        isHidden
+      };
+    };
+
+    const DOM$6 = DOMUtils.DOM;
+    const appendStyle = (editor, text) => {
+      const body = SugarElement.fromDom(editor.getBody());
+      const container = getStyleContainer(getRootNode(body));
+      const style = SugarElement.fromTag('style');
+      set$2(style, 'type', 'text/css');
+      append$1(style, SugarElement.fromText(text));
+      append$1(container, style);
+      editor.on('remove', () => {
+        remove$5(style);
+      });
+    };
+    const getRootName = editor => editor.inline ? editor.getElement().nodeName.toLowerCase() : undefined;
+    const removeUndefined = obj => filter$5(obj, v => isUndefined(v) === false);
+    const mkParserSettings = editor => {
+      const getOption = editor.options.get;
+      const blobCache = editor.editorUpload.blobCache;
+      return removeUndefined({
+        allow_conditional_comments: getOption('allow_conditional_comments'),
+        allow_html_data_urls: getOption('allow_html_data_urls'),
+        allow_svg_data_urls: getOption('allow_svg_data_urls'),
+        allow_html_in_named_anchor: getOption('allow_html_in_named_anchor'),
+        allow_script_urls: getOption('allow_script_urls'),
+        allow_unsafe_link_target: getOption('allow_unsafe_link_target'),
+        convert_fonts_to_spans: getOption('convert_fonts_to_spans'),
+        fix_list_elements: getOption('fix_list_elements'),
+        font_size_legacy_values: getOption('font_size_legacy_values'),
+        forced_root_block: getOption('forced_root_block'),
+        forced_root_block_attrs: getOption('forced_root_block_attrs'),
+        preserve_cdata: getOption('preserve_cdata'),
+        remove_trailing_brs: getOption('remove_trailing_brs'),
+        inline_styles: getOption('inline_styles'),
+        root_name: getRootName(editor),
+        validate: true,
+        blob_cache: blobCache,
+        document: editor.getDoc()
+      });
+    };
+    const mkSchemaSettings = editor => {
+      const getOption = editor.options.get;
+      return removeUndefined({
+        custom_elements: getOption('custom_elements'),
+        extended_valid_elements: getOption('extended_valid_elements'),
+        invalid_elements: getOption('invalid_elements'),
+        invalid_styles: getOption('invalid_styles'),
+        schema: getOption('schema'),
+        valid_children: getOption('valid_children'),
+        valid_classes: getOption('valid_classes'),
+        valid_elements: getOption('valid_elements'),
+        valid_styles: getOption('valid_styles'),
+        verify_html: getOption('verify_html'),
+        padd_empty_block_inline_children: getOption('format_empty_lines')
+      });
+    };
+    const mkSerializerSettings = editor => {
+      const getOption = editor.options.get;
+      return {
+        ...mkParserSettings(editor),
+        ...mkSchemaSettings(editor),
+        ...removeUndefined({
+          url_converter: getOption('url_converter'),
+          url_converter_scope: getOption('url_converter_scope'),
+          element_format: getOption('element_format'),
+          entities: getOption('entities'),
+          entity_encoding: getOption('entity_encoding'),
+          indent: getOption('indent'),
+          indent_after: getOption('indent_after'),
+          indent_before: getOption('indent_before')
+        })
+      };
+    };
+    const createParser = editor => {
+      const parser = DomParser(mkParserSettings(editor), editor.schema);
+      parser.addAttributeFilter('src,href,style,tabindex', (nodes, name) => {
+        let i = nodes.length, node, value;
+        const dom = editor.dom;
+        const internalName = 'data-mce-' + name;
+        while (i--) {
+          node = nodes[i];
+          value = node.attr(name);
+          if (value && !node.attr(internalName)) {
+            if (value.indexOf('data:') === 0 || value.indexOf('blob:') === 0) {
+              continue;
+            }
+            if (name === 'style') {
+              value = dom.serializeStyle(dom.parseStyle(value), node.name);
+              if (!value.length) {
+                value = null;
+              }
+              node.attr(internalName, value);
+              node.attr(name, value);
+            } else if (name === 'tabindex') {
+              node.attr(internalName, value);
+              node.attr(name, null);
+            } else {
+              node.attr(internalName, editor.convertURL(value, name, node.name));
+            }
+          }
+        }
+      });
+      parser.addNodeFilter('script', nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          const type = node.attr('type') || 'no/type';
+          if (type.indexOf('mce-') !== 0) {
+            node.attr('type', 'mce-' + type);
+          }
+        }
+      });
+      if (editor.options.get('preserve_cdata')) {
+        parser.addNodeFilter('#cdata', nodes => {
+          let i = nodes.length;
+          while (i--) {
+            const node = nodes[i];
+            node.type = 8;
+            node.name = '#comment';
+            node.value = '[CDATA[' + editor.dom.encode(node.value) + ']]';
+          }
+        });
+      }
+      parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', nodes => {
+        let i = nodes.length;
+        const nonEmptyElements = editor.schema.getNonEmptyElements();
+        while (i--) {
+          const node = nodes[i];
+          if (node.isEmpty(nonEmptyElements) && node.getAll('br').length === 0) {
+            node.append(new AstNode('br', 1));
+          }
+        }
+      });
+      return parser;
+    };
+    const autoFocus = editor => {
+      const autoFocus = getAutoFocus(editor);
+      if (autoFocus) {
+        Delay.setEditorTimeout(editor, () => {
+          let focusEditor;
+          if (autoFocus === true) {
+            focusEditor = editor;
+          } else {
+            focusEditor = editor.editorManager.get(autoFocus);
+          }
+          if (!focusEditor.destroyed) {
+            focusEditor.focus();
+          }
+        }, 100);
+      }
+    };
+    const moveSelectionToFirstCaretPosition = editor => {
+      const root = editor.dom.getRoot();
+      if (!editor.inline && (!hasAnyRanges(editor) || editor.selection.getStart(true) === root)) {
+        firstPositionIn(root).each(pos => {
+          const node = pos.getNode();
+          const caretPos = isTable$3(node) ? firstPositionIn(node).getOr(pos) : pos;
+          editor.selection.setRng(caretPos.toRange());
+        });
+      }
+    };
+    const initEditor = editor => {
+      editor.bindPendingEventDelegates();
+      editor.initialized = true;
+      fireInit(editor);
+      editor.focus(true);
+      moveSelectionToFirstCaretPosition(editor);
+      editor.nodeChanged({ initial: true });
+      const initInstanceCallback = getInitInstanceCallback(editor);
+      if (isFunction(initInstanceCallback)) {
+        initInstanceCallback.call(editor, editor);
+      }
+      autoFocus(editor);
+    };
+    const getStyleSheetLoader$1 = editor => editor.inline ? editor.ui.styleSheetLoader : editor.dom.styleSheetLoader;
+    const makeStylesheetLoadingPromises = (editor, css, framedFonts) => {
+      const promises = [getStyleSheetLoader$1(editor).loadAll(css)];
+      if (editor.inline) {
+        return promises;
+      } else {
+        return promises.concat([editor.ui.styleSheetLoader.loadAll(framedFonts)]);
+      }
+    };
+    const loadContentCss = editor => {
+      const styleSheetLoader = getStyleSheetLoader$1(editor);
+      const fontCss = getFontCss(editor);
+      const css = editor.contentCSS;
+      const removeCss = () => {
+        styleSheetLoader.unloadAll(css);
+        if (!editor.inline) {
+          editor.ui.styleSheetLoader.unloadAll(fontCss);
+        }
+      };
+      const loaded = () => {
+        if (editor.removed) {
+          removeCss();
+        } else {
+          editor.on('remove', removeCss);
+        }
+      };
+      if (editor.contentStyles.length > 0) {
+        let contentCssText = '';
+        Tools.each(editor.contentStyles, style => {
+          contentCssText += style + '\r\n';
+        });
+        editor.dom.addStyle(contentCssText);
+      }
+      const allStylesheets = Promise.all(makeStylesheetLoadingPromises(editor, css, fontCss)).then(loaded).catch(loaded);
+      const contentStyle = getContentStyle(editor);
+      if (contentStyle) {
+        appendStyle(editor, contentStyle);
+      }
+      return allStylesheets;
+    };
+    const preInit = editor => {
+      const doc = editor.getDoc(), body = editor.getBody();
+      firePreInit(editor);
+      if (!shouldBrowserSpellcheck(editor)) {
+        doc.body.spellcheck = false;
+        DOM$6.setAttrib(body, 'spellcheck', 'false');
+      }
+      editor.quirks = Quirks(editor);
+      firePostRender(editor);
+      const directionality = getDirectionality(editor);
+      if (directionality !== undefined) {
+        body.dir = directionality;
+      }
+      const protect = getProtect(editor);
+      if (protect) {
+        editor.on('BeforeSetContent', e => {
+          Tools.each(protect, pattern => {
+            e.content = e.content.replace(pattern, str => {
+              return '<!--mce:protected ' + escape(str) + '-->';
+            });
+          });
+        });
+      }
+      editor.on('SetContent', () => {
+        editor.addVisual(editor.getBody());
+      });
+      editor.on('compositionstart compositionend', e => {
+        editor.composing = e.type === 'compositionstart';
+      });
+    };
+    const loadInitialContent = editor => {
+      if (!isRtc(editor)) {
+        editor.load({
+          initial: true,
+          format: 'html'
+        });
+      }
+      editor.startContent = editor.getContent({ format: 'raw' });
+    };
+    const initEditorWithInitialContent = editor => {
+      if (editor.removed !== true) {
+        loadInitialContent(editor);
+        initEditor(editor);
+      }
+    };
+    const contentBodyLoaded = editor => {
+      const targetElm = editor.getElement();
+      let doc = editor.getDoc();
+      if (editor.inline) {
+        DOM$6.addClass(targetElm, 'mce-content-body');
+        editor.contentDocument = doc = document;
+        editor.contentWindow = window;
+        editor.bodyElement = targetElm;
+        editor.contentAreaContainer = targetElm;
+      }
+      const body = editor.getBody();
+      body.disabled = true;
+      editor.readonly = isReadOnly$1(editor);
+      if (!editor.readonly) {
+        if (editor.inline && DOM$6.getStyle(body, 'position', true) === 'static') {
+          body.style.position = 'relative';
+        }
+        body.contentEditable = 'true';
+      }
+      body.disabled = false;
+      editor.editorUpload = EditorUpload(editor);
+      editor.schema = Schema(mkSchemaSettings(editor));
+      editor.dom = DOMUtils(doc, {
+        keep_values: true,
+        url_converter: editor.convertURL,
+        url_converter_scope: editor,
+        update_styles: true,
+        root_element: editor.inline ? editor.getBody() : null,
+        collect: () => editor.inline,
+        schema: editor.schema,
+        contentCssCors: shouldUseContentCssCors(editor),
+        referrerPolicy: getReferrerPolicy(editor),
+        onSetAttrib: e => {
+          editor.dispatch('SetAttrib', e);
+        }
+      });
+      editor.parser = createParser(editor);
+      editor.serializer = DomSerializer(mkSerializerSettings(editor), editor);
+      editor.selection = EditorSelection(editor.dom, editor.getWin(), editor.serializer, editor);
+      editor.annotator = Annotator(editor);
+      editor.formatter = Formatter(editor);
+      editor.undoManager = UndoManager(editor);
+      editor._nodeChangeDispatcher = new NodeChange(editor);
+      editor._selectionOverrides = SelectionOverrides(editor);
+      setup$o(editor);
+      setup$6(editor);
+      setup$m(editor);
+      if (!isRtc(editor)) {
+        setup$5(editor);
+        setup$1(editor);
+      }
+      const caret = setup$b(editor);
+      setup$p(editor, caret);
+      setup$n(editor);
+      setup$q(editor);
+      setup$7(editor);
+      const setupRtcThunk = setup$s(editor);
+      preInit(editor);
+      setupRtcThunk.fold(() => {
+        loadContentCss(editor).then(() => initEditorWithInitialContent(editor));
+      }, setupRtc => {
+        editor.setProgressState(true);
+        loadContentCss(editor).then(() => {
+          setupRtc().then(_rtcMode => {
+            editor.setProgressState(false);
+            initEditorWithInitialContent(editor);
+            bindEvents(editor);
+          }, err => {
+            editor.notificationManager.open({
+              type: 'error',
+              text: String(err)
+            });
+            initEditorWithInitialContent(editor);
+            bindEvents(editor);
+          });
+        });
+      });
+    };
+    const initContentBody = (editor, skipWrite) => {
+      if (!editor.inline) {
+        editor.getElement().style.visibility = editor.orgVisibility;
+      }
+      if (!skipWrite && !editor.inline) {
+        const iframe = editor.iframeElement;
+        const binder = bind$1(SugarElement.fromDom(iframe), 'load', () => {
+          binder.unbind();
+          editor.contentDocument = iframe.contentDocument;
+          contentBodyLoaded(editor);
+        });
+        iframe.srcdoc = editor.iframeHTML;
+      } else {
+        contentBodyLoaded(editor);
+      }
+    };
+
+    const DOM$5 = DOMUtils.DOM;
+    const createIframeElement = (id, title, customAttrs, tabindex) => {
+      const iframe = SugarElement.fromTag('iframe');
+      tabindex.each(t => set$2(iframe, 'tabindex', t));
+      setAll$1(iframe, customAttrs);
+      setAll$1(iframe, {
+        id: id + '_ifr',
+        frameBorder: '0',
+        allowTransparency: 'true',
+        title
+      });
+      add$2(iframe, 'tox-edit-area__iframe');
+      return iframe;
+    };
+    const getIframeHtml = editor => {
+      let iframeHTML = getDocType(editor) + '<html><head>';
+      if (getDocumentBaseUrl(editor) !== editor.documentBaseUrl) {
+        iframeHTML += '<base href="' + editor.documentBaseURI.getURI() + '" />';
+      }
+      iframeHTML += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
+      const bodyId = getBodyId(editor);
+      const bodyClass = getBodyClass(editor);
+      const translatedAriaText = editor.translate(getIframeAriaText(editor));
+      if (getContentSecurityPolicy(editor)) {
+        iframeHTML += '<meta http-equiv="Content-Security-Policy" content="' + getContentSecurityPolicy(editor) + '" />';
+      }
+      iframeHTML += '</head>' + `<body id="${ bodyId }" class="mce-content-body ${ bodyClass }" data-id="${ editor.id }" aria-label="${ translatedAriaText }">` + '<br>' + '</body></html>';
+      return iframeHTML;
+    };
+    const createIframe = (editor, boxInfo) => {
+      const iframeTitle = editor.translate('Rich Text Area');
+      const tabindex = getOpt(SugarElement.fromDom(editor.getElement()), 'tabindex').bind(toInt);
+      const ifr = createIframeElement(editor.id, iframeTitle, getIframeAttrs(editor), tabindex).dom;
+      ifr.onload = () => {
+        ifr.onload = null;
+        editor.dispatch('load');
+      };
+      editor.contentAreaContainer = boxInfo.iframeContainer;
+      editor.iframeElement = ifr;
+      editor.iframeHTML = getIframeHtml(editor);
+      DOM$5.add(boxInfo.iframeContainer, ifr);
+    };
+    const init$1 = (editor, boxInfo) => {
+      createIframe(editor, boxInfo);
+      if (boxInfo.editorContainer) {
+        DOM$5.get(boxInfo.editorContainer).style.display = editor.orgDisplay;
+        editor.hidden = DOM$5.isHidden(boxInfo.editorContainer);
+      }
+      editor.getElement().style.display = 'none';
+      DOM$5.setAttrib(editor.id, 'aria-hidden', 'true');
+      initContentBody(editor);
+    };
+
+    const DOM$4 = DOMUtils.DOM;
+    const initPlugin = (editor, initializedPlugins, plugin) => {
+      const Plugin = PluginManager.get(plugin);
+      const pluginUrl = PluginManager.urls[plugin] || editor.documentBaseUrl.replace(/\/$/, '');
+      plugin = Tools.trim(plugin);
+      if (Plugin && Tools.inArray(initializedPlugins, plugin) === -1) {
+        if (editor.plugins[plugin]) {
+          return;
+        }
+        try {
+          const pluginInstance = Plugin(editor, pluginUrl) || {};
+          editor.plugins[plugin] = pluginInstance;
+          if (isFunction(pluginInstance.init)) {
+            pluginInstance.init(editor, pluginUrl);
+            initializedPlugins.push(plugin);
+          }
+        } catch (e) {
+          pluginInitError(editor, plugin, e);
+        }
+      }
+    };
+    const trimLegacyPrefix = name => {
+      return name.replace(/^\-/, '');
+    };
+    const initPlugins = editor => {
+      const initializedPlugins = [];
+      each$g(getPlugins(editor), name => {
+        initPlugin(editor, initializedPlugins, trimLegacyPrefix(name));
+      });
+    };
+    const initIcons = editor => {
+      const iconPackName = Tools.trim(getIconPackName(editor));
+      const currentIcons = editor.ui.registry.getAll().icons;
+      const loadIcons = {
+        ...IconManager.get('default').icons,
+        ...IconManager.get(iconPackName).icons
+      };
+      each$f(loadIcons, (svgData, icon) => {
+        if (!has$2(currentIcons, icon)) {
+          editor.ui.registry.addIcon(icon, svgData);
+        }
+      });
+    };
+    const initTheme = editor => {
+      const theme = getTheme(editor);
+      if (isString(theme)) {
+        const Theme = ThemeManager.get(theme);
+        editor.theme = Theme(editor, ThemeManager.urls[theme]) || {};
+        if (isFunction(editor.theme.init)) {
+          editor.theme.init(editor, ThemeManager.urls[theme] || editor.documentBaseUrl.replace(/\/$/, ''));
+        }
+      } else {
+        editor.theme = {};
+      }
+    };
+    const initModel = editor => {
+      const model = getModel(editor);
+      const Model = ModelManager.get(model);
+      editor.model = Model(editor, ModelManager.urls[model]);
+    };
+    const renderFromLoadedTheme = editor => {
+      return editor.theme.renderUI();
+    };
+    const renderFromThemeFunc = editor => {
+      const elm = editor.getElement();
+      const theme = getTheme(editor);
+      const info = theme(editor, elm);
+      if (info.editorContainer.nodeType) {
+        info.editorContainer.id = info.editorContainer.id || editor.id + '_parent';
+      }
+      if (info.iframeContainer && info.iframeContainer.nodeType) {
+        info.iframeContainer.id = info.iframeContainer.id || editor.id + '_iframecontainer';
+      }
+      info.height = info.iframeHeight ? info.iframeHeight : elm.offsetHeight;
+      return info;
+    };
+    const createThemeFalseResult = element => {
+      return {
+        editorContainer: element,
+        iframeContainer: element,
+        api: {}
+      };
+    };
+    const renderThemeFalseIframe = targetElement => {
+      const iframeContainer = DOM$4.create('div');
+      DOM$4.insertAfter(iframeContainer, targetElement);
+      return createThemeFalseResult(iframeContainer);
+    };
+    const renderThemeFalse = editor => {
+      const targetElement = editor.getElement();
+      return editor.inline ? createThemeFalseResult(null) : renderThemeFalseIframe(targetElement);
+    };
+    const renderThemeUi = editor => {
+      const elm = editor.getElement();
+      editor.orgDisplay = elm.style.display;
+      if (isString(getTheme(editor))) {
+        return renderFromLoadedTheme(editor);
+      } else if (isFunction(getTheme(editor))) {
+        return renderFromThemeFunc(editor);
+      } else {
+        return renderThemeFalse(editor);
+      }
+    };
+    const augmentEditorUiApi = (editor, api) => {
+      const uiApiFacade = {
+        show: Optional.from(api.show).getOr(noop),
+        hide: Optional.from(api.hide).getOr(noop),
+        isEnabled: Optional.from(api.isEnabled).getOr(always),
+        setEnabled: state => {
+          if (!editor.mode.isReadOnly()) {
+            Optional.from(api.setEnabled).each(f => f(state));
+          }
+        }
+      };
+      editor.ui = {
+        ...editor.ui,
+        ...uiApiFacade
+      };
+    };
+    const init = editor => {
+      editor.dispatch('ScriptsLoaded');
+      initIcons(editor);
+      initTheme(editor);
+      initModel(editor);
+      initPlugins(editor);
+      const renderInfo = renderThemeUi(editor);
+      augmentEditorUiApi(editor, Optional.from(renderInfo.api).getOr({}));
+      const boxInfo = {
+        editorContainer: renderInfo.editorContainer,
+        iframeContainer: renderInfo.iframeContainer
+      };
+      editor.editorContainer = boxInfo.editorContainer ? boxInfo.editorContainer : null;
+      appendContentCssFromSettings(editor);
+      if (editor.inline) {
+        return initContentBody(editor);
+      } else {
+        return init$1(editor, boxInfo);
+      }
+    };
+
+    const DOM$3 = DOMUtils.DOM;
+    const hasSkipLoadPrefix = name => name.charAt(0) === '-';
+    const loadLanguage = (scriptLoader, editor) => {
+      const languageCode = getLanguageCode(editor);
+      const languageUrl = getLanguageUrl(editor);
+      if (I18n.hasCode(languageCode) === false && languageCode !== 'en') {
+        const url = isNotEmpty(languageUrl) ? languageUrl : `${ editor.editorManager.baseURL }/langs/${ languageCode }.js`;
+        scriptLoader.add(url).catch(() => {
+          languageLoadError(editor, url, languageCode);
+        });
+      }
+    };
+    const loadTheme = (editor, suffix) => {
+      const theme = getTheme(editor);
+      if (isString(theme) && !hasSkipLoadPrefix(theme) && !has$2(ThemeManager.urls, theme)) {
+        const themeUrl = getThemeUrl(editor);
+        const url = themeUrl ? editor.documentBaseURI.toAbsolute(themeUrl) : `themes/${ theme }/theme${ suffix }.js`;
+        ThemeManager.load(theme, url).catch(() => {
+          themeLoadError(editor, url, theme);
+        });
+      }
+    };
+    const loadModel = (editor, suffix) => {
+      const model = getModel(editor);
+      if (model !== 'plugin' && !has$2(ModelManager.urls, model)) {
+        const modelUrl = getModelUrl(editor);
+        const url = isString(modelUrl) ? editor.documentBaseURI.toAbsolute(modelUrl) : `models/${ model }/model${ suffix }.js`;
+        ModelManager.load(model, url).catch(() => {
+          modelLoadError(editor, url, model);
+        });
+      }
+    };
+    const getIconsUrlMetaFromUrl = editor => Optional.from(getIconsUrl(editor)).filter(isNotEmpty).map(url => ({
+      url,
+      name: Optional.none()
+    }));
+    const getIconsUrlMetaFromName = (editor, name, suffix) => Optional.from(name).filter(name => isNotEmpty(name) && !IconManager.has(name)).map(name => ({
+      url: `${ editor.editorManager.baseURL }/icons/${ name }/icons${ suffix }.js`,
+      name: Optional.some(name)
+    }));
+    const loadIcons = (scriptLoader, editor, suffix) => {
+      const defaultIconsUrl = getIconsUrlMetaFromName(editor, 'default', suffix);
+      const customIconsUrl = getIconsUrlMetaFromUrl(editor).orThunk(() => getIconsUrlMetaFromName(editor, getIconPackName(editor), ''));
+      each$g(cat([
+        defaultIconsUrl,
+        customIconsUrl
+      ]), urlMeta => {
+        scriptLoader.add(urlMeta.url).catch(() => {
+          iconsLoadError(editor, urlMeta.url, urlMeta.name.getOrUndefined());
+        });
+      });
+    };
+    const loadPlugins = (editor, suffix) => {
+      const loadPlugin = (name, url) => {
+        PluginManager.load(name, url).catch(() => {
+          pluginLoadError(editor, url, name);
+        });
+      };
+      each$f(getExternalPlugins$1(editor), (url, name) => {
+        loadPlugin(name, url);
+        editor.options.set('plugins', getPlugins(editor).concat(name));
+      });
+      each$g(getPlugins(editor), plugin => {
+        plugin = Tools.trim(plugin);
+        if (plugin && !PluginManager.urls[plugin] && !hasSkipLoadPrefix(plugin)) {
+          loadPlugin(plugin, `plugins/${ plugin }/plugin${ suffix }.js`);
+        }
+      });
+    };
+    const isThemeLoaded = editor => {
+      const theme = getTheme(editor);
+      return !isString(theme) || isNonNullable(ThemeManager.get(theme));
+    };
+    const isModelLoaded = editor => {
+      const model = getModel(editor);
+      return isNonNullable(ModelManager.get(model));
+    };
+    const loadScripts = (editor, suffix) => {
+      const scriptLoader = ScriptLoader.ScriptLoader;
+      const initEditor = () => {
+        if (!editor.removed && isThemeLoaded(editor) && isModelLoaded(editor)) {
+          init(editor);
+        }
+      };
+      loadTheme(editor, suffix);
+      loadModel(editor, suffix);
+      loadLanguage(scriptLoader, editor);
+      loadIcons(scriptLoader, editor, suffix);
+      loadPlugins(editor, suffix);
+      scriptLoader.loadQueue().then(initEditor, initEditor);
+    };
+    const getStyleSheetLoader = (element, editor) => instance.forElement(element, {
+      contentCssCors: hasContentCssCors(editor),
+      referrerPolicy: getReferrerPolicy(editor)
+    });
+    const render = editor => {
+      const id = editor.id;
+      I18n.setCode(getLanguageCode(editor));
+      const readyHandler = () => {
+        DOM$3.unbind(window, 'ready', readyHandler);
+        editor.render();
+      };
+      if (!EventUtils.Event.domLoaded) {
+        DOM$3.bind(window, 'ready', readyHandler);
+        return;
+      }
+      if (!editor.getElement()) {
+        return;
+      }
+      const element = SugarElement.fromDom(editor.getElement());
+      const snapshot = clone$4(element);
+      editor.on('remove', () => {
+        eachr(element.dom.attributes, attr => remove$a(element, attr.name));
+        setAll$1(element, snapshot);
+      });
+      editor.ui.styleSheetLoader = getStyleSheetLoader(element, editor);
+      if (!isInline(editor)) {
+        editor.orgVisibility = editor.getElement().style.visibility;
+        editor.getElement().style.visibility = 'hidden';
+      } else {
+        editor.inline = true;
+      }
+      const form = editor.getElement().form || DOM$3.getParent(id, 'form');
+      if (form) {
+        editor.formElement = form;
+        if (hasHiddenInput(editor) && !isTextareaOrInput(editor.getElement())) {
+          DOM$3.insertAfter(DOM$3.create('input', {
+            type: 'hidden',
+            name: id
+          }), id);
+          editor.hasHiddenInput = true;
+        }
+        editor.formEventDelegate = e => {
+          editor.dispatch(e.type, e);
+        };
+        DOM$3.bind(form, 'submit reset', editor.formEventDelegate);
+        editor.on('reset', () => {
+          editor.resetContent();
+        });
+        if (shouldPatchSubmit(editor) && !form.submit.nodeType && !form.submit.length && !form._mceOldSubmit) {
+          form._mceOldSubmit = form.submit;
+          form.submit = () => {
+            editor.editorManager.triggerSave();
+            editor.setDirty(false);
+            return form._mceOldSubmit(form);
+          };
+        }
+      }
+      editor.windowManager = WindowManager(editor);
+      editor.notificationManager = NotificationManager(editor);
+      if (isEncodingXml(editor)) {
+        editor.on('GetContent', e => {
+          if (e.save) {
+            e.content = DOM$3.encode(e.content);
+          }
+        });
+      }
+      if (shouldAddFormSubmitTrigger(editor)) {
+        editor.on('submit', () => {
+          if (editor.initialized) {
+            editor.save();
+          }
+        });
+      }
+      if (shouldAddUnloadTrigger(editor)) {
+        editor._beforeUnload = () => {
+          if (editor.initialized && !editor.destroyed && !editor.isHidden()) {
+            editor.save({
+              format: 'raw',
+              no_events: true,
+              set_dirty: false
+            });
+          }
+        };
+        editor.editorManager.on('BeforeUnload', editor._beforeUnload);
+      }
+      editor.editorManager.add(editor);
+      loadScripts(editor, editor.suffix);
+    };
+
+    const sectionResult = (sections, settings) => ({
+      sections: constant(sections),
+      options: constant(settings)
+    });
+    const deviceDetection = detect$2().deviceType;
+    const isPhone = deviceDetection.isPhone();
+    const isTablet = deviceDetection.isTablet();
+    const normalizePlugins = plugins => {
+      if (isNullable(plugins)) {
+        return [];
+      } else {
+        const pluginNames = isArray$1(plugins) ? plugins : plugins.split(/[ ,]/);
+        const trimmedPlugins = map$3(pluginNames, trim$3);
+        return filter$6(trimmedPlugins, isNotEmpty);
+      }
+    };
+    const extractSections = (keys, options) => {
+      const result = bifilter(options, (value, key) => {
+        return contains$2(keys, key);
+      });
+      return sectionResult(result.t, result.f);
+    };
+    const getSection = (sectionResult, name, defaults = {}) => {
+      const sections = sectionResult.sections();
+      const sectionOptions = get$a(sections, name).getOr({});
+      return Tools.extend({}, defaults, sectionOptions);
+    };
+    const hasSection = (sectionResult, name) => {
+      return has$2(sectionResult.sections(), name);
+    };
+    const getSectionConfig = (sectionResult, name) => {
+      return hasSection(sectionResult, name) ? sectionResult.sections()[name] : {};
+    };
+    const getMobileOverrideOptions = (mobileOptions, isPhone) => {
+      const defaultMobileOptions = {
+        table_grid: false,
+        object_resizing: false,
+        resize: false,
+        toolbar_mode: get$a(mobileOptions, 'toolbar_mode').getOr('scrolling'),
+        toolbar_sticky: false
+      };
+      const defaultPhoneOptions = { menubar: false };
+      return {
+        ...defaultMobileOptions,
+        ...isPhone ? defaultPhoneOptions : {}
+      };
+    };
+    const getExternalPlugins = (overrideOptions, options) => {
+      var _a;
+      const userDefinedExternalPlugins = (_a = options.external_plugins) !== null && _a !== void 0 ? _a : {};
+      if (overrideOptions && overrideOptions.external_plugins) {
+        return Tools.extend({}, overrideOptions.external_plugins, userDefinedExternalPlugins);
+      } else {
+        return userDefinedExternalPlugins;
+      }
+    };
+    const combinePlugins = (forcedPlugins, plugins) => {
+      return [].concat(normalizePlugins(forcedPlugins)).concat(normalizePlugins(plugins));
+    };
+    const getPlatformPlugins = (isMobileDevice, sectionResult, desktopPlugins, mobilePlugins) => {
+      if (isMobileDevice && hasSection(sectionResult, 'mobile')) {
+        return mobilePlugins;
+      } else {
+        return desktopPlugins;
+      }
+    };
+    const processPlugins = (isMobileDevice, sectionResult, defaultOverrideOptions, options) => {
+      const forcedPlugins = normalizePlugins(defaultOverrideOptions.forced_plugins);
+      const desktopPlugins = normalizePlugins(options.plugins);
+      const mobileConfig = getSectionConfig(sectionResult, 'mobile');
+      const mobilePlugins = mobileConfig.plugins ? normalizePlugins(mobileConfig.plugins) : desktopPlugins;
+      const platformPlugins = getPlatformPlugins(isMobileDevice, sectionResult, desktopPlugins, mobilePlugins);
+      const combinedPlugins = combinePlugins(forcedPlugins, platformPlugins);
+      return Tools.extend(options, {
+        forced_plugins: forcedPlugins,
+        plugins: combinedPlugins
+      });
+    };
+    const isOnMobile = (isMobileDevice, sectionResult) => {
+      return isMobileDevice && hasSection(sectionResult, 'mobile');
+    };
+    const combineOptions = (isMobileDevice, isPhone, defaultOptions, defaultOverrideOptions, options) => {
+      var _a;
+      const deviceOverrideOptions = isMobileDevice ? { mobile: getMobileOverrideOptions((_a = options.mobile) !== null && _a !== void 0 ? _a : {}, isPhone) } : {};
+      const sectionResult = extractSections(['mobile'], deepMerge(deviceOverrideOptions, options));
+      const extendedOptions = Tools.extend(defaultOptions, defaultOverrideOptions, sectionResult.options(), isOnMobile(isMobileDevice, sectionResult) ? getSection(sectionResult, 'mobile') : {}, { external_plugins: getExternalPlugins(defaultOverrideOptions, sectionResult.options()) });
+      return processPlugins(isMobileDevice, sectionResult, defaultOverrideOptions, extendedOptions);
+    };
+    const normalizeOptions = (defaultOverrideOptions, options) => combineOptions(isPhone || isTablet, isPhone, options, defaultOverrideOptions, options);
+
+    const addVisual = (editor, elm) => addVisual$1(editor, elm);
+
+    const registerExecCommands$3 = editor => {
+      const toggleFormat = (name, value) => {
+        editor.formatter.toggle(name, value);
+        editor.nodeChanged();
+      };
+      const toggleAlign = align => () => {
+        each$g('left,center,right,justify'.split(','), name => {
+          if (align !== name) {
+            editor.formatter.remove('align' + name);
+          }
+        });
+        if (align !== 'none') {
+          toggleFormat('align' + align);
+        }
+      };
+      editor.editorCommands.addCommands({
+        JustifyLeft: toggleAlign('left'),
+        JustifyCenter: toggleAlign('center'),
+        JustifyRight: toggleAlign('right'),
+        JustifyFull: toggleAlign('justify'),
+        JustifyNone: toggleAlign('none')
+      });
+    };
+    const registerQueryStateCommands$1 = editor => {
+      const alignStates = name => () => {
+        const selection = editor.selection;
+        const nodes = selection.isCollapsed() ? [editor.dom.getParent(selection.getNode(), editor.dom.isBlock)] : selection.getSelectedBlocks();
+        return exists(nodes, node => isNonNullable(editor.formatter.matchNode(node, name)));
+      };
+      editor.editorCommands.addCommands({
+        JustifyLeft: alignStates('alignleft'),
+        JustifyCenter: alignStates('aligncenter'),
+        JustifyRight: alignStates('alignright'),
+        JustifyFull: alignStates('alignjustify')
+      }, 'state');
+    };
+    const registerCommands$a = editor => {
+      registerExecCommands$3(editor);
+      registerQueryStateCommands$1(editor);
+    };
+
+    const registerCommands$9 = editor => {
+      editor.editorCommands.addCommands({
+        'Cut,Copy,Paste': command => {
+          const doc = editor.getDoc();
+          let failed;
+          try {
+            doc.execCommand(command);
+          } catch (ex) {
+            failed = true;
+          }
+          if (command === 'paste' && !doc.queryCommandEnabled(command)) {
+            failed = true;
+          }
+          if (failed || !doc.queryCommandSupported(command)) {
+            let msg = editor.translate(`Your browser doesn't support direct access to the clipboard. ` + 'Please use the Ctrl+X/C/V keyboard shortcuts instead.');
+            if (Env.os.isMacOS() || Env.os.isiOS()) {
+              msg = msg.replace(/Ctrl\+/g, '\u2318+');
+            }
+            editor.notificationManager.open({
+              text: msg,
+              type: 'error'
+            });
+          }
+        }
+      });
+    };
+
+    const trimOrPadLeftRight = (dom, rng, html) => {
+      const root = SugarElement.fromDom(dom.getRoot());
+      if (needsToBeNbspLeft(root, CaretPosition.fromRangeStart(rng))) {
+        html = html.replace(/^ /, '&nbsp;');
+      } else {
+        html = html.replace(/^&nbsp;/, ' ');
+      }
+      if (needsToBeNbspRight(root, CaretPosition.fromRangeEnd(rng))) {
+        html = html.replace(/(&nbsp;| )(<br( \/)>)?$/, '&nbsp;');
+      } else {
+        html = html.replace(/&nbsp;(<br( \/)?>)?$/, ' ');
+      }
+      return html;
+    };
+
+    const processValue$1 = value => {
+      if (typeof value !== 'string') {
+        const details = Tools.extend({
+          paste: value.paste,
+          data: { paste: value.paste }
+        }, value);
+        return {
+          content: value.content,
+          details
+        };
+      }
+      return {
+        content: value,
+        details: {}
+      };
+    };
+    const trimOrPad = (editor, value) => {
+      const selection = editor.selection;
+      const dom = editor.dom;
+      if (/^ | $/.test(value)) {
+        return trimOrPadLeftRight(dom, selection.getRng(), value);
+      } else {
+        return value;
+      }
+    };
+    const insertAtCaret = (editor, value) => {
+      const {content, details} = processValue$1(value);
+      preProcessSetContent(editor, {
+        content: trimOrPad(editor, content),
+        format: 'html',
+        set: false,
+        selection: true,
+        paste: details.paste
+      }).each(args => {
+        const insertedContent = insertContent$1(editor, args.content, details);
+        postProcessSetContent(editor, insertedContent, args);
+        editor.addVisual();
+      });
+    };
+
+    const registerCommands$8 = editor => {
+      editor.editorCommands.addCommands({
+        mceCleanup: () => {
+          const bm = editor.selection.getBookmark();
+          editor.setContent(editor.getContent());
+          editor.selection.moveToBookmark(bm);
+        },
+        insertImage: (_command, _ui, value) => {
+          insertAtCaret(editor, editor.dom.createHTML('img', { src: value }));
+        },
+        insertHorizontalRule: () => {
+          editor.execCommand('mceInsertContent', false, '<hr>');
+        },
+        insertText: (_command, _ui, value) => {
+          insertAtCaret(editor, editor.dom.encode(value));
+        },
+        insertHTML: (_command, _ui, value) => {
+          insertAtCaret(editor, value);
+        },
+        mceInsertContent: (_command, _ui, value) => {
+          insertAtCaret(editor, value);
+        },
+        mceSetContent: (_command, _ui, value) => {
+          editor.setContent(value);
+        },
+        mceReplaceContent: (_command, _ui, value) => {
+          editor.execCommand('mceInsertContent', false, value.replace(/\{\$selection\}/g, editor.selection.getContent({ format: 'text' })));
+        },
+        mceNewDocument: () => {
+          editor.setContent('');
+        }
+      });
+    };
+
+    const legacyPropNames = {
+      'font-size': 'size',
+      'font-family': 'face'
+    };
+    const getSpecifiedFontProp = (propName, rootElm, elm) => {
+      const getProperty = elm => getRaw$1(elm, propName).orThunk(() => {
+        if (name(elm) === 'font') {
+          return get$a(legacyPropNames, propName).bind(legacyPropName => getOpt(elm, legacyPropName));
+        } else {
+          return Optional.none();
+        }
+      });
+      const isRoot = elm => eq(SugarElement.fromDom(rootElm), elm);
+      return closest$2(SugarElement.fromDom(elm), elm => getProperty(elm), isRoot);
+    };
+    const normalizeFontFamily = fontFamily => fontFamily.replace(/[\'\"\\]/g, '').replace(/,\s+/g, ',');
+    const getComputedFontProp = (propName, elm) => Optional.from(DOMUtils.DOM.getStyle(elm, propName, true));
+    const getFontProp = propName => (rootElm, elm) => Optional.from(elm).map(SugarElement.fromDom).filter(isElement$7).bind(element => getSpecifiedFontProp(propName, rootElm, element.dom).or(getComputedFontProp(propName, element.dom))).getOr('');
+    const getFontSize = getFontProp('font-size');
+    const getFontFamily = compose(normalizeFontFamily, getFontProp('font-family'));
+
+    const findFirstCaretElement = editor => firstPositionIn(editor.getBody()).map(caret => {
+      const container = caret.container();
+      return isText$8(container) ? container.parentNode : container;
+    });
+    const getCaretElement = editor => Optional.from(editor.selection.getRng()).bind(rng => {
+      const root = editor.getBody();
+      const atStartOfNode = rng.startContainer === root && rng.startOffset === 0;
+      return atStartOfNode ? Optional.none() : Optional.from(editor.selection.getStart(true));
+    });
+    const bindRange = (editor, binder) => getCaretElement(editor).orThunk(curry(findFirstCaretElement, editor)).map(SugarElement.fromDom).filter(isElement$7).bind(binder);
+    const mapRange = (editor, mapper) => bindRange(editor, compose1(Optional.some, mapper));
+
+    const fromFontSizeNumber = (editor, value) => {
+      if (/^[0-9.]+$/.test(value)) {
+        const fontSizeNumber = parseInt(value, 10);
+        if (fontSizeNumber >= 1 && fontSizeNumber <= 7) {
+          const fontSizes = getFontStyleValues(editor);
+          const fontClasses = getFontSizeClasses(editor);
+          if (fontClasses) {
+            return fontClasses[fontSizeNumber - 1] || value;
+          } else {
+            return fontSizes[fontSizeNumber - 1] || value;
+          }
+        } else {
+          return value;
+        }
+      } else {
+        return value;
+      }
+    };
+    const normalizeFontNames = font => {
+      const fonts = font.split(/\s*,\s*/);
+      return map$3(fonts, font => {
+        if (font.indexOf(' ') !== -1 && !(startsWith(font, '"') || startsWith(font, `'`))) {
+          return `'${ font }'`;
+        } else {
+          return font;
+        }
+      }).join(',');
+    };
+    const fontNameAction = (editor, value) => {
+      const font = fromFontSizeNumber(editor, value);
+      editor.formatter.toggle('fontname', { value: normalizeFontNames(font) });
+      editor.nodeChanged();
+    };
+    const fontNameQuery = editor => mapRange(editor, elm => getFontFamily(editor.getBody(), elm.dom)).getOr('');
+    const fontSizeAction = (editor, value) => {
+      editor.formatter.toggle('fontsize', { value: fromFontSizeNumber(editor, value) });
+      editor.nodeChanged();
+    };
+    const fontSizeQuery = editor => mapRange(editor, elm => getFontSize(editor.getBody(), elm.dom)).getOr('');
+
+    const lineHeightQuery = editor => mapRange(editor, elm => {
+      const root = SugarElement.fromDom(editor.getBody());
+      const specifiedStyle = closest$2(elm, elm => getRaw$1(elm, 'line-height'), curry(eq, root));
+      const computedStyle = () => {
+        const lineHeight = parseFloat(get$7(elm, 'line-height'));
+        const fontSize = parseFloat(get$7(elm, 'font-size'));
+        return String(lineHeight / fontSize);
+      };
+      return specifiedStyle.getOrThunk(computedStyle);
+    }).getOr('');
+    const lineHeightAction = (editor, lineHeight) => {
+      editor.formatter.toggle('lineheight', { value: String(lineHeight) });
+      editor.nodeChanged();
+    };
+
+    const registerExecCommands$2 = editor => {
+      const toggleFormat = (name, value) => {
+        editor.formatter.toggle(name, value);
+        editor.nodeChanged();
+      };
+      editor.editorCommands.addCommands({
+        'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': command => {
+          toggleFormat(command);
+        },
+        'ForeColor,HiliteColor': (command, _ui, value) => {
+          toggleFormat(command, { value });
+        },
+        'BackColor': (_command, _ui, value) => {
+          toggleFormat('hilitecolor', { value });
+        },
+        'FontName': (_command, _ui, value) => {
+          fontNameAction(editor, value);
+        },
+        'FontSize': (_command, _ui, value) => {
+          fontSizeAction(editor, value);
+        },
+        'LineHeight': (_command, _ui, value) => {
+          lineHeightAction(editor, value);
+        },
+        'Lang': (command, _ui, lang) => {
+          toggleFormat(command, {
+            value: lang.code,
+            customValue: lang.customCode
+          });
+        },
+        'RemoveFormat': command => {
+          editor.formatter.remove(command);
+        },
+        'mceBlockQuote': () => {
+          toggleFormat('blockquote');
+        },
+        'FormatBlock': (_command, _ui, value) => {
+          toggleFormat(isString(value) ? value : 'p');
+        },
+        'mceToggleFormat': (_command, _ui, value) => {
+          toggleFormat(value);
+        }
+      });
+    };
+    const registerQueryValueCommands = editor => {
+      const isFormatMatch = name => editor.formatter.match(name);
+      editor.editorCommands.addCommands({
+        'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': command => isFormatMatch(command),
+        'mceBlockQuote': () => isFormatMatch('blockquote')
+      }, 'state');
+      editor.editorCommands.addQueryValueHandler('FontName', () => fontNameQuery(editor));
+      editor.editorCommands.addQueryValueHandler('FontSize', () => fontSizeQuery(editor));
+      editor.editorCommands.addQueryValueHandler('LineHeight', () => lineHeightQuery(editor));
+    };
+    const registerCommands$7 = editor => {
+      registerExecCommands$2(editor);
+      registerQueryValueCommands(editor);
+    };
+
+    const registerCommands$6 = editor => {
+      editor.editorCommands.addCommands({
+        mceAddUndoLevel: () => {
+          editor.undoManager.add();
+        },
+        mceEndUndoLevel: () => {
+          editor.undoManager.add();
+        },
+        Undo: () => {
+          editor.undoManager.undo();
+        },
+        Redo: () => {
+          editor.undoManager.redo();
+        }
+      });
+    };
+
+    const registerCommands$5 = editor => {
+      editor.editorCommands.addCommands({
+        Indent: () => {
+          indent(editor);
+        },
+        Outdent: () => {
+          outdent(editor);
+        }
+      });
+      editor.editorCommands.addCommands({ Outdent: () => canOutdent(editor) }, 'state');
+    };
+
+    const registerCommands$4 = editor => {
+      const applyLinkToSelection = (_command, _ui, value) => {
+        const linkDetails = isString(value) ? { href: value } : value;
+        const anchor = editor.dom.getParent(editor.selection.getNode(), 'a');
+        if (isObject(linkDetails) && isString(linkDetails.href)) {
+          linkDetails.href = linkDetails.href.replace(/ /g, '%20');
+          if (!anchor || !linkDetails.href) {
+            editor.formatter.remove('link');
+          }
+          if (linkDetails.href) {
+            editor.formatter.apply('link', linkDetails, anchor);
+          }
+        }
+      };
+      editor.editorCommands.addCommands({
+        unlink: () => {
+          if (editor.selection.isCollapsed()) {
+            const elm = editor.dom.getParent(editor.selection.getStart(), 'a');
+            if (elm) {
+              editor.dom.remove(elm, true);
+            }
+            return;
+          }
+          editor.formatter.remove('link');
+        },
+        mceInsertLink: applyLinkToSelection,
+        createLink: applyLinkToSelection
+      });
+    };
+
+    const registerExecCommands$1 = editor => {
+      editor.editorCommands.addCommands({
+        'InsertUnorderedList,InsertOrderedList': command => {
+          editor.getDoc().execCommand(command);
+          const listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul');
+          if (listElm) {
+            const listParent = listElm.parentNode;
+            if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) {
+              const bm = editor.selection.getBookmark();
+              editor.dom.split(listParent, listElm);
+              editor.selection.moveToBookmark(bm);
+            }
+          }
+        }
+      });
+    };
+    const registerQueryStateCommands = editor => {
+      editor.editorCommands.addCommands({
+        'InsertUnorderedList,InsertOrderedList': command => {
+          const list = editor.dom.getParent(editor.selection.getNode(), 'ul,ol');
+          return list && (command === 'insertunorderedlist' && list.tagName === 'UL' || command === 'insertorderedlist' && list.tagName === 'OL');
+        }
+      }, 'state');
+    };
+    const registerCommands$3 = editor => {
+      registerExecCommands$1(editor);
+      registerQueryStateCommands(editor);
+    };
+
+    const registerCommands$2 = editor => {
+      editor.editorCommands.addCommands({
+        insertParagraph: () => {
+          insert(editor);
+        },
+        mceInsertNewLine: (_command, _ui, value) => {
+          insert(editor, value);
+        },
+        InsertLineBreak: (_command, _ui, value) => {
+          insert$1(editor, value);
+        }
+      });
+    };
+
+    const registerCommands$1 = editor => {
+      editor.editorCommands.addCommands({
+        mceSelectNodeDepth: (_command, _ui, value) => {
+          let counter = 0;
+          editor.dom.getParent(editor.selection.getNode(), node => {
+            if (node.nodeType === 1 && counter++ === value) {
+              editor.selection.select(node);
+              return false;
+            }
+          }, editor.getBody());
+        },
+        mceSelectNode: (_command, _ui, value) => {
+          editor.selection.select(value);
+        },
+        selectAll: () => {
+          const editingHost = editor.dom.getParent(editor.selection.getStart(), isContentEditableTrue$4);
+          if (editingHost) {
+            const rng = editor.dom.createRng();
+            rng.selectNodeContents(editingHost);
+            editor.selection.setRng(rng);
+          }
+        }
+      });
+    };
+
+    const registerExecCommands = editor => {
+      editor.editorCommands.addCommands({
+        mceRemoveNode: (_command, _ui, value) => {
+          const node = value !== null && value !== void 0 ? value : editor.selection.getNode();
+          if (node !== editor.getBody()) {
+            const bm = editor.selection.getBookmark();
+            editor.dom.remove(node, true);
+            editor.selection.moveToBookmark(bm);
+          }
+        },
+        mcePrint: () => {
+          editor.getWin().print();
+        },
+        mceFocus: (_command, _ui, value) => {
+          focus(editor, value);
+        },
+        mceToggleVisualAid: () => {
+          editor.hasVisual = !editor.hasVisual;
+          editor.addVisual();
+        }
+      });
+    };
+    const registerCommands = editor => {
+      registerCommands$a(editor);
+      registerCommands$9(editor);
+      registerCommands$6(editor);
+      registerCommands$1(editor);
+      registerCommands$8(editor);
+      registerCommands$4(editor);
+      registerCommands$5(editor);
+      registerCommands$2(editor);
+      registerCommands$3(editor);
+      registerCommands$7(editor);
+      registerExecCommands(editor);
+    };
+
+    class EditorCommands {
+      constructor(editor) {
+        this.commands = {
+          state: {},
+          exec: {},
+          value: {}
+        };
+        this.editor = editor;
+      }
+      execCommand(command, ui, value, args) {
+        const editor = this.editor;
+        const lowerCaseCommand = command.toLowerCase();
+        const skipFocus = args === null || args === void 0 ? void 0 : args.skip_focus;
+        if (editor.removed) {
+          return false;
+        }
+        if (lowerCaseCommand !== 'mcefocus') {
+          if (!/^(mceAddUndoLevel|mceEndUndoLevel)$/i.test(lowerCaseCommand) && !skipFocus) {
+            editor.focus();
+          } else {
+            restore(editor);
+          }
+        }
+        const eventArgs = editor.dispatch('BeforeExecCommand', {
+          command,
+          ui,
+          value
+        });
+        if (eventArgs.isDefaultPrevented()) {
+          return false;
+        }
+        const func = this.commands.exec[lowerCaseCommand];
+        if (isFunction(func)) {
+          func(lowerCaseCommand, ui, value);
+          editor.dispatch('ExecCommand', {
+            command,
+            ui,
+            value
+          });
+          return true;
+        }
+        return false;
+      }
+      queryCommandState(command) {
+        if (this.editor.quirks.isHidden() || this.editor.removed) {
+          return false;
+        }
+        const lowerCaseCommand = command.toLowerCase();
+        const func = this.commands.state[lowerCaseCommand];
+        if (isFunction(func)) {
+          return func(lowerCaseCommand);
+        }
+        return false;
+      }
+      queryCommandValue(command) {
+        if (this.editor.quirks.isHidden() || this.editor.removed) {
+          return '';
+        }
+        const lowerCaseCommand = command.toLowerCase();
+        const func = this.commands.value[lowerCaseCommand];
+        if (isFunction(func)) {
+          return func(lowerCaseCommand);
+        }
+        return '';
+      }
+      addCommands(commandList, type = 'exec') {
+        const commands = this.commands;
+        each$f(commandList, (callback, command) => {
+          each$g(command.toLowerCase().split(','), command => {
+            commands[type][command] = callback;
+          });
+        });
+      }
+      addCommand(command, callback, scope) {
+        const lowerCaseCommand = command.toLowerCase();
+        this.commands.exec[lowerCaseCommand] = (_command, ui, value) => callback.call(scope !== null && scope !== void 0 ? scope : this.editor, ui, value);
+      }
+      queryCommandSupported(command) {
+        const lowerCaseCommand = command.toLowerCase();
+        if (this.commands.exec[lowerCaseCommand]) {
+          return true;
+        }
+        return false;
+      }
+      addQueryStateHandler(command, callback, scope) {
+        this.commands.state[command.toLowerCase()] = () => callback.call(scope !== null && scope !== void 0 ? scope : this.editor);
+      }
+      addQueryValueHandler(command, callback, scope) {
+        this.commands.value[command.toLowerCase()] = () => callback.call(scope !== null && scope !== void 0 ? scope : this.editor);
+      }
+    }
+
+    const internalContentEditableAttr = 'data-mce-contenteditable';
+    const toggleClass = (elm, cls, state) => {
+      if (has(elm, cls) && state === false) {
+        remove$7(elm, cls);
+      } else if (state) {
+        add$2(elm, cls);
+      }
+    };
+    const setEditorCommandState = (editor, cmd, state) => {
+      try {
+        editor.getDoc().execCommand(cmd, false, String(state));
+      } catch (ex) {
+      }
+    };
+    const setContentEditable = (elm, state) => {
+      elm.dom.contentEditable = state ? 'true' : 'false';
+    };
+    const switchOffContentEditableTrue = elm => {
+      each$g(descendants(elm, '*[contenteditable="true"]'), elm => {
+        set$2(elm, internalContentEditableAttr, 'true');
+        setContentEditable(elm, false);
+      });
+    };
+    const switchOnContentEditableTrue = elm => {
+      each$g(descendants(elm, `*[${ internalContentEditableAttr }="true"]`), elm => {
+        remove$a(elm, internalContentEditableAttr);
+        setContentEditable(elm, true);
+      });
+    };
+    const removeFakeSelection = editor => {
+      Optional.from(editor.selection.getNode()).each(elm => {
+        elm.removeAttribute('data-mce-selected');
+      });
+    };
+    const restoreFakeSelection = editor => {
+      editor.selection.setRng(editor.selection.getRng());
+    };
+    const toggleReadOnly = (editor, state) => {
+      const body = SugarElement.fromDom(editor.getBody());
+      toggleClass(body, 'mce-content-readonly', state);
+      if (state) {
+        editor.selection.controlSelection.hideResizeRect();
+        editor._selectionOverrides.hideFakeCaret();
+        removeFakeSelection(editor);
+        editor.readonly = true;
+        setContentEditable(body, false);
+        switchOffContentEditableTrue(body);
+      } else {
+        editor.readonly = false;
+        setContentEditable(body, true);
+        switchOnContentEditableTrue(body);
+        setEditorCommandState(editor, 'StyleWithCSS', false);
+        setEditorCommandState(editor, 'enableInlineTableEditing', false);
+        setEditorCommandState(editor, 'enableObjectResizing', false);
+        if (hasEditorOrUiFocus(editor)) {
+          editor.focus();
+        }
+        restoreFakeSelection(editor);
+        editor.nodeChanged();
+      }
+    };
+    const isReadOnly = editor => editor.readonly;
+    const registerFilters = editor => {
+      editor.parser.addAttributeFilter('contenteditable', nodes => {
+        if (isReadOnly(editor)) {
+          each$g(nodes, node => {
+            node.attr(internalContentEditableAttr, node.attr('contenteditable'));
+            node.attr('contenteditable', 'false');
+          });
+        }
+      });
+      editor.serializer.addAttributeFilter(internalContentEditableAttr, nodes => {
+        if (isReadOnly(editor)) {
+          each$g(nodes, node => {
+            node.attr('contenteditable', node.attr(internalContentEditableAttr));
+          });
+        }
+      });
+      editor.serializer.addTempAttr(internalContentEditableAttr);
+    };
+    const registerReadOnlyContentFilters = editor => {
+      if (editor.serializer) {
+        registerFilters(editor);
+      } else {
+        editor.on('PreInit', () => {
+          registerFilters(editor);
+        });
+      }
+    };
+    const isClickEvent = e => e.type === 'click';
+    const getAnchorHrefOpt = (editor, elm) => {
+      const isRoot = elm => eq(elm, SugarElement.fromDom(editor.getBody()));
+      return closest$3(elm, 'a', isRoot).bind(a => getOpt(a, 'href'));
+    };
+    const processReadonlyEvents = (editor, e) => {
+      if (isClickEvent(e) && !VK.metaKeyPressed(e)) {
+        const elm = SugarElement.fromDom(e.target);
+        getAnchorHrefOpt(editor, elm).each(href => {
+          e.preventDefault();
+          if (/^#/.test(href)) {
+            const targetEl = editor.dom.select(`${ href },[name="${ removeLeading(href, '#') }"]`);
+            if (targetEl.length) {
+              editor.selection.scrollIntoView(targetEl[0], true);
+            }
+          } else {
+            window.open(href, '_blank', 'rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes');
+          }
+        });
+      }
+    };
+    const registerReadOnlySelectionBlockers = editor => {
+      editor.on('ShowCaret', e => {
+        if (isReadOnly(editor)) {
+          e.preventDefault();
+        }
+      });
+      editor.on('ObjectSelected', e => {
+        if (isReadOnly(editor)) {
+          e.preventDefault();
+        }
+      });
+    };
+
+    const nativeEvents = Tools.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', ' ');
+    class EventDispatcher {
+      constructor(settings) {
+        this.bindings = {};
+        this.settings = settings || {};
+        this.scope = this.settings.scope || this;
+        this.toggleEvent = this.settings.toggleEvent || never;
+      }
+      static isNative(name) {
+        return !!nativeEvents[name.toLowerCase()];
+      }
+      fire(name, args) {
+        return this.dispatch(name, args);
+      }
+      dispatch(name, args) {
+        const lcName = name.toLowerCase();
+        const event = normalize$3(lcName, args !== null && args !== void 0 ? args : {}, this.scope);
+        if (this.settings.beforeFire) {
+          this.settings.beforeFire(event);
+        }
+        const handlers = this.bindings[lcName];
+        if (handlers) {
+          for (let i = 0, l = handlers.length; i < l; i++) {
+            const callback = handlers[i];
+            if (callback.removed) {
+              continue;
+            }
+            if (callback.once) {
+              this.off(lcName, callback.func);
+            }
+            if (event.isImmediatePropagationStopped()) {
+              return event;
+            }
+            if (callback.func.call(this.scope, event) === false) {
+              event.preventDefault();
+              return event;
+            }
+          }
+        }
+        return event;
+      }
+      on(name, callback, prepend, extra) {
+        if (callback === false) {
+          callback = never;
+        }
+        if (callback) {
+          const wrappedCallback = {
+            func: callback,
+            removed: false
+          };
+          if (extra) {
+            Tools.extend(wrappedCallback, extra);
+          }
+          const names = name.toLowerCase().split(' ');
+          let i = names.length;
+          while (i--) {
+            const currentName = names[i];
+            let handlers = this.bindings[currentName];
+            if (!handlers) {
+              handlers = [];
+              this.toggleEvent(currentName, true);
+            }
+            if (prepend) {
+              handlers = [
+                wrappedCallback,
+                ...handlers
+              ];
+            } else {
+              handlers = [
+                ...handlers,
+                wrappedCallback
+              ];
+            }
+            this.bindings[currentName] = handlers;
+          }
+        }
+        return this;
+      }
+      off(name, callback) {
+        if (name) {
+          const names = name.toLowerCase().split(' ');
+          let i = names.length;
+          while (i--) {
+            const currentName = names[i];
+            let handlers = this.bindings[currentName];
+            if (!currentName) {
+              each$f(this.bindings, (_value, bindingName) => {
+                this.toggleEvent(bindingName, false);
+                delete this.bindings[bindingName];
+              });
+              return this;
+            }
+            if (handlers) {
+              if (!callback) {
+                handlers.length = 0;
+              } else {
+                const filteredHandlers = partition$2(handlers, handler => handler.func === callback);
+                handlers = filteredHandlers.fail;
+                this.bindings[currentName] = handlers;
+                each$g(filteredHandlers.pass, handler => {
+                  handler.removed = true;
+                });
+              }
+              if (!handlers.length) {
+                this.toggleEvent(name, false);
+                delete this.bindings[currentName];
+              }
+            }
+          }
+        } else {
+          each$f(this.bindings, (_value, name) => {
+            this.toggleEvent(name, false);
+          });
+          this.bindings = {};
+        }
+        return this;
+      }
+      once(name, callback, prepend) {
+        return this.on(name, callback, prepend, { once: true });
+      }
+      has(name) {
+        name = name.toLowerCase();
+        return !(!this.bindings[name] || this.bindings[name].length === 0);
+      }
+    }
+
+    const getEventDispatcher = obj => {
+      if (!obj._eventDispatcher) {
+        obj._eventDispatcher = new EventDispatcher({
+          scope: obj,
+          toggleEvent: (name, state) => {
+            if (EventDispatcher.isNative(name) && obj.toggleNativeEvent) {
+              obj.toggleNativeEvent(name, state);
+            }
+          }
+        });
+      }
+      return obj._eventDispatcher;
+    };
+    const Observable = {
+      fire(name, args, bubble) {
+        return this.dispatch(name, args, bubble);
+      },
+      dispatch(name, args, bubble) {
+        const self = this;
+        if (self.removed && name !== 'remove' && name !== 'detach') {
+          return normalize$3(name.toLowerCase(), args !== null && args !== void 0 ? args : {}, self);
+        }
+        const dispatcherArgs = getEventDispatcher(self).dispatch(name, args);
+        if (bubble !== false && self.parent) {
+          let parent = self.parent();
+          while (parent && !dispatcherArgs.isPropagationStopped()) {
+            parent.dispatch(name, dispatcherArgs, false);
+            parent = parent.parent();
+          }
+        }
+        return dispatcherArgs;
+      },
+      on(name, callback, prepend) {
+        return getEventDispatcher(this).on(name, callback, prepend);
+      },
+      off(name, callback) {
+        return getEventDispatcher(this).off(name, callback);
+      },
+      once(name, callback) {
+        return getEventDispatcher(this).once(name, callback);
+      },
+      hasEventListeners(name) {
+        return getEventDispatcher(this).has(name);
+      }
+    };
+
+    const DOM$2 = DOMUtils.DOM;
+    let customEventRootDelegates;
+    const getEventTarget = (editor, eventName) => {
+      if (eventName === 'selectionchange') {
+        return editor.getDoc();
+      }
+      if (!editor.inline && /^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(eventName)) {
+        return editor.getDoc().documentElement;
+      }
+      const eventRoot = getEventRoot(editor);
+      if (eventRoot) {
+        if (!editor.eventRoot) {
+          editor.eventRoot = DOM$2.select(eventRoot)[0];
+        }
+        return editor.eventRoot;
+      }
+      return editor.getBody();
+    };
+    const isListening = editor => !editor.hidden && !isReadOnly(editor);
+    const fireEvent = (editor, eventName, e) => {
+      if (isListening(editor)) {
+        editor.dispatch(eventName, e);
+      } else if (isReadOnly(editor)) {
+        processReadonlyEvents(editor, e);
+      }
+    };
+    const bindEventDelegate = (editor, eventName) => {
+      let delegate;
+      if (!editor.delegates) {
+        editor.delegates = {};
+      }
+      if (editor.delegates[eventName] || editor.removed) {
+        return;
+      }
+      const eventRootElm = getEventTarget(editor, eventName);
+      if (getEventRoot(editor)) {
+        if (!customEventRootDelegates) {
+          customEventRootDelegates = {};
+          editor.editorManager.on('removeEditor', () => {
+            if (!editor.editorManager.activeEditor) {
+              if (customEventRootDelegates) {
+                each$f(customEventRootDelegates, (_value, name) => {
+                  editor.dom.unbind(getEventTarget(editor, name));
+                });
+                customEventRootDelegates = null;
+              }
+            }
+          });
+        }
+        if (customEventRootDelegates[eventName]) {
+          return;
+        }
+        delegate = e => {
+          const target = e.target;
+          const editors = editor.editorManager.get();
+          let i = editors.length;
+          while (i--) {
+            const body = editors[i].getBody();
+            if (body === target || DOM$2.isChildOf(target, body)) {
+              fireEvent(editors[i], eventName, e);
+            }
+          }
+        };
+        customEventRootDelegates[eventName] = delegate;
+        DOM$2.bind(eventRootElm, eventName, delegate);
+      } else {
+        delegate = e => {
+          fireEvent(editor, eventName, e);
+        };
+        DOM$2.bind(eventRootElm, eventName, delegate);
+        editor.delegates[eventName] = delegate;
+      }
+    };
+    const EditorObservable = {
+      ...Observable,
+      bindPendingEventDelegates() {
+        const self = this;
+        Tools.each(self._pendingNativeEvents, name => {
+          bindEventDelegate(self, name);
+        });
+      },
+      toggleNativeEvent(name, state) {
+        const self = this;
+        if (name === 'focus' || name === 'blur') {
+          return;
+        }
+        if (self.removed) {
+          return;
+        }
+        if (state) {
+          if (self.initialized) {
+            bindEventDelegate(self, name);
+          } else {
+            if (!self._pendingNativeEvents) {
+              self._pendingNativeEvents = [name];
+            } else {
+              self._pendingNativeEvents.push(name);
+            }
+          }
+        } else if (self.initialized) {
+          self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);
+          delete self.delegates[name];
+        }
+      },
+      unbindAllNativeEvents() {
+        const self = this;
+        const body = self.getBody();
+        const dom = self.dom;
+        if (self.delegates) {
+          each$f(self.delegates, (value, name) => {
+            self.dom.unbind(getEventTarget(self, name), name, value);
+          });
+          delete self.delegates;
+        }
+        if (!self.inline && body && dom) {
+          body.onload = null;
+          dom.unbind(self.getWin());
+          dom.unbind(self.getDoc());
+        }
+        if (dom) {
+          dom.unbind(body);
+          dom.unbind(self.getContainer());
+        }
+      }
+    };
+
+    const stringListProcessor = value => {
+      if (isString(value)) {
+        return {
+          value: value.split(/[ ,]/),
+          valid: true
+        };
+      } else if (isArrayOf(value, isString)) {
+        return {
+          value,
+          valid: true
+        };
+      } else {
+        return {
+          valid: false,
+          message: `The value must be a string[] or a comma/space separated string.`
+        };
+      }
+    };
+    const getBuiltInProcessor = type => {
+      const validator = (() => {
+        switch (type) {
+        case 'array':
+          return isArray$1;
+        case 'boolean':
+          return isBoolean;
+        case 'function':
+          return isFunction;
+        case 'number':
+          return isNumber;
+        case 'object':
+          return isObject;
+        case 'string':
+          return isString;
+        case 'string[]':
+          return stringListProcessor;
+        case 'object[]':
+          return val => isArrayOf(val, isObject);
+        case 'regexp':
+          return val => is$4(val, RegExp);
+        }
+      })();
+      return value => processValue(value, validator, `The value must be a ${ type }.`);
+    };
+    const isBuiltInSpec = spec => isString(spec.processor);
+    const getErrorMessage = (message, result) => {
+      const additionalText = isEmpty$3(result.message) ? '' : `. ${ result.message }`;
+      return message + additionalText;
+    };
+    const isValidResult = result => result.valid;
+    const processValue = (value, processor, message = '') => {
+      const result = processor(value);
+      if (isBoolean(result)) {
+        return result ? {
+          value: value,
+          valid: true
+        } : {
+          valid: false,
+          message
+        };
+      } else {
+        return result;
+      }
+    };
+    const processDefaultValue = (name, defaultValue, processor) => {
+      if (!isUndefined(defaultValue)) {
+        const result = processValue(defaultValue, processor);
+        if (isValidResult(result)) {
+          return result.value;
+        } else {
+          console.error(getErrorMessage(`Invalid default value passed for the "${ name }" option`, result));
+        }
+      }
+      return undefined;
+    };
+    const create$5 = (editor, initialOptions) => {
+      const registry = {};
+      const values = {};
+      const setValue = (name, value, processor) => {
+        const result = processValue(value, processor);
+        if (isValidResult(result)) {
+          values[name] = result.value;
+          return true;
+        } else {
+          console.warn(getErrorMessage(`Invalid value passed for the ${ name } option`, result));
+          return false;
+        }
+      };
+      const register = (name, spec) => {
+        const processor = isBuiltInSpec(spec) ? getBuiltInProcessor(spec.processor) : spec.processor;
+        const defaultValue = processDefaultValue(name, spec.default, processor);
+        registry[name] = {
+          ...spec,
+          default: defaultValue,
+          processor
+        };
+        const initValue = get$a(values, name).orThunk(() => get$a(initialOptions, name));
+        initValue.each(value => setValue(name, value, processor));
+      };
+      const isRegistered = name => has$2(registry, name);
+      const get = name => get$a(values, name).orThunk(() => get$a(registry, name).map(spec => spec.default)).getOrUndefined();
+      const set = (name, value) => {
+        if (!isRegistered(name)) {
+          console.warn(`"${ name }" is not a registered option. Ensure the option has been registered before setting a value.`);
+          return false;
+        } else {
+          const spec = registry[name];
+          if (spec.immutable) {
+            console.error(`"${ name }" is an immutable option and cannot be updated`);
+            return false;
+          } else {
+            return setValue(name, value, spec.processor);
+          }
+        }
+      };
+      const unset = name => {
+        const registered = isRegistered(name);
+        if (registered) {
+          delete values[name];
+        }
+        return registered;
+      };
+      const isSet = name => has$2(values, name);
+      return {
+        register,
+        isRegistered,
+        get,
+        set,
+        unset,
+        isSet
+      };
+    };
+
+    const defaultModes = [
+      'design',
+      'readonly'
+    ];
+    const switchToMode = (editor, activeMode, availableModes, mode) => {
+      const oldMode = availableModes[activeMode.get()];
+      const newMode = availableModes[mode];
+      try {
+        newMode.activate();
+      } catch (e) {
+        console.error(`problem while activating editor mode ${ mode }:`, e);
+        return;
+      }
+      oldMode.deactivate();
+      if (oldMode.editorReadOnly !== newMode.editorReadOnly) {
+        toggleReadOnly(editor, newMode.editorReadOnly);
+      }
+      activeMode.set(mode);
+      fireSwitchMode(editor, mode);
+    };
+    const setMode = (editor, availableModes, activeMode, mode) => {
+      if (mode === activeMode.get()) {
+        return;
+      } else if (!has$2(availableModes, mode)) {
+        throw new Error(`Editor mode '${ mode }' is invalid`);
+      }
+      if (editor.initialized) {
+        switchToMode(editor, activeMode, availableModes, mode);
+      } else {
+        editor.on('init', () => switchToMode(editor, activeMode, availableModes, mode));
+      }
+    };
+    const registerMode = (availableModes, mode, api) => {
+      if (contains$2(defaultModes, mode)) {
+        throw new Error(`Cannot override default mode ${ mode }`);
+      }
+      return {
+        ...availableModes,
+        [mode]: {
+          ...api,
+          deactivate: () => {
+            try {
+              api.deactivate();
+            } catch (e) {
+              console.error(`problem while deactivating editor mode ${ mode }:`, e);
+            }
+          }
+        }
+      };
+    };
+
+    const create$4 = editor => {
+      const activeMode = Cell('design');
+      const availableModes = Cell({
+        design: {
+          activate: noop,
+          deactivate: noop,
+          editorReadOnly: false
+        },
+        readonly: {
+          activate: noop,
+          deactivate: noop,
+          editorReadOnly: true
+        }
+      });
+      registerReadOnlyContentFilters(editor);
+      registerReadOnlySelectionBlockers(editor);
+      return {
+        isReadOnly: () => isReadOnly(editor),
+        set: mode => setMode(editor, availableModes.get(), activeMode, mode),
+        get: () => activeMode.get(),
+        register: (mode, api) => {
+          availableModes.set(registerMode(availableModes.get(), mode, api));
+        }
+      };
+    };
+
+    const each$2 = Tools.each, explode = Tools.explode;
+    const keyCodeLookup = {
+      f1: 112,
+      f2: 113,
+      f3: 114,
+      f4: 115,
+      f5: 116,
+      f6: 117,
+      f7: 118,
+      f8: 119,
+      f9: 120,
+      f10: 121,
+      f11: 122,
+      f12: 123
+    };
+    const modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access');
+    const parseShortcut = pattern => {
+      let key;
+      const shortcut = {};
+      const isMac = Env.os.isMacOS() || Env.os.isiOS();
+      each$2(explode(pattern.toLowerCase(), '+'), value => {
+        if (value in modifierNames) {
+          shortcut[value] = true;
+        } else {
+          if (/^[0-9]{2,}$/.test(value)) {
+            shortcut.keyCode = parseInt(value, 10);
+          } else {
+            shortcut.charCode = value.charCodeAt(0);
+            shortcut.keyCode = keyCodeLookup[value] || value.toUpperCase().charCodeAt(0);
+          }
+        }
+      });
+      const id = [shortcut.keyCode];
+      for (key in modifierNames) {
+        if (shortcut[key]) {
+          id.push(key);
+        } else {
+          shortcut[key] = false;
+        }
+      }
+      shortcut.id = id.join(',');
+      if (shortcut.access) {
+        shortcut.alt = true;
+        if (isMac) {
+          shortcut.ctrl = true;
+        } else {
+          shortcut.shift = true;
+        }
+      }
+      if (shortcut.meta) {
+        if (isMac) {
+          shortcut.meta = true;
+        } else {
+          shortcut.ctrl = true;
+          shortcut.meta = false;
+        }
+      }
+      return shortcut;
+    };
+    class Shortcuts {
+      constructor(editor) {
+        this.shortcuts = {};
+        this.pendingPatterns = [];
+        this.editor = editor;
+        const self = this;
+        editor.on('keyup keypress keydown', e => {
+          if ((self.hasModifier(e) || self.isFunctionKey(e)) && !e.isDefaultPrevented()) {
+            each$2(self.shortcuts, shortcut => {
+              if (self.matchShortcut(e, shortcut)) {
+                self.pendingPatterns = shortcut.subpatterns.slice(0);
+                if (e.type === 'keydown') {
+                  self.executeShortcutAction(shortcut);
+                }
+                return true;
+              }
+            });
+            if (self.matchShortcut(e, self.pendingPatterns[0])) {
+              if (self.pendingPatterns.length === 1) {
+                if (e.type === 'keydown') {
+                  self.executeShortcutAction(self.pendingPatterns[0]);
+                }
+              }
+              self.pendingPatterns.shift();
+            }
+          }
+        });
+      }
+      add(pattern, desc, cmdFunc, scope) {
+        const self = this;
+        const func = self.normalizeCommandFunc(cmdFunc);
+        each$2(explode(Tools.trim(pattern)), pattern => {
+          const shortcut = self.createShortcut(pattern, desc, func, scope);
+          self.shortcuts[shortcut.id] = shortcut;
+        });
+        return true;
+      }
+      remove(pattern) {
+        const shortcut = this.createShortcut(pattern);
+        if (this.shortcuts[shortcut.id]) {
+          delete this.shortcuts[shortcut.id];
+          return true;
+        }
+        return false;
+      }
+      normalizeCommandFunc(cmdFunc) {
+        const self = this;
+        const cmd = cmdFunc;
+        if (typeof cmd === 'string') {
+          return () => {
+            self.editor.execCommand(cmd, false, null);
+          };
+        } else if (Tools.isArray(cmd)) {
+          return () => {
+            self.editor.execCommand(cmd[0], cmd[1], cmd[2]);
+          };
+        } else {
+          return cmd;
+        }
+      }
+      createShortcut(pattern, desc, cmdFunc, scope) {
+        const shortcuts = Tools.map(explode(pattern, '>'), parseShortcut);
+        shortcuts[shortcuts.length - 1] = Tools.extend(shortcuts[shortcuts.length - 1], {
+          func: cmdFunc,
+          scope: scope || this.editor
+        });
+        return Tools.extend(shortcuts[0], {
+          desc: this.editor.translate(desc),
+          subpatterns: shortcuts.slice(1)
+        });
+      }
+      hasModifier(e) {
+        return e.altKey || e.ctrlKey || e.metaKey;
+      }
+      isFunctionKey(e) {
+        return e.type === 'keydown' && e.keyCode >= 112 && e.keyCode <= 123;
+      }
+      matchShortcut(e, shortcut) {
+        if (!shortcut) {
+          return false;
+        }
+        if (shortcut.ctrl !== e.ctrlKey || shortcut.meta !== e.metaKey) {
+          return false;
+        }
+        if (shortcut.alt !== e.altKey || shortcut.shift !== e.shiftKey) {
+          return false;
+        }
+        if (e.keyCode === shortcut.keyCode || e.charCode && e.charCode === shortcut.charCode) {
+          e.preventDefault();
+          return true;
+        }
+        return false;
+      }
+      executeShortcutAction(shortcut) {
+        return shortcut.func ? shortcut.func.call(shortcut.scope) : null;
+      }
+    }
+
+    const create$3 = () => {
+      const buttons = {};
+      const menuItems = {};
+      const popups = {};
+      const icons = {};
+      const contextMenus = {};
+      const contextToolbars = {};
+      const sidebars = {};
+      const add = (collection, type) => (name, spec) => collection[name.toLowerCase()] = {
+        ...spec,
+        type
+      };
+      const addIcon = (name, svgData) => icons[name.toLowerCase()] = svgData;
+      return {
+        addButton: add(buttons, 'button'),
+        addGroupToolbarButton: add(buttons, 'grouptoolbarbutton'),
+        addToggleButton: add(buttons, 'togglebutton'),
+        addMenuButton: add(buttons, 'menubutton'),
+        addSplitButton: add(buttons, 'splitbutton'),
+        addMenuItem: add(menuItems, 'menuitem'),
+        addNestedMenuItem: add(menuItems, 'nestedmenuitem'),
+        addToggleMenuItem: add(menuItems, 'togglemenuitem'),
+        addAutocompleter: add(popups, 'autocompleter'),
+        addContextMenu: add(contextMenus, 'contextmenu'),
+        addContextToolbar: add(contextToolbars, 'contexttoolbar'),
+        addContextForm: add(contextToolbars, 'contextform'),
+        addSidebar: add(sidebars, 'sidebar'),
+        addIcon,
+        getAll: () => ({
+          buttons,
+          menuItems,
+          icons,
+          popups,
+          contextMenus,
+          contextToolbars,
+          sidebars
+        })
+      };
+    };
+
+    const registry = () => {
+      const bridge = create$3();
+      return {
+        addAutocompleter: bridge.addAutocompleter,
+        addButton: bridge.addButton,
+        addContextForm: bridge.addContextForm,
+        addContextMenu: bridge.addContextMenu,
+        addContextToolbar: bridge.addContextToolbar,
+        addIcon: bridge.addIcon,
+        addMenuButton: bridge.addMenuButton,
+        addMenuItem: bridge.addMenuItem,
+        addNestedMenuItem: bridge.addNestedMenuItem,
+        addSidebar: bridge.addSidebar,
+        addSplitButton: bridge.addSplitButton,
+        addToggleButton: bridge.addToggleButton,
+        addGroupToolbarButton: bridge.addGroupToolbarButton,
+        addToggleMenuItem: bridge.addToggleMenuItem,
+        getAll: bridge.getAll
+      };
+    };
+
+    const DOM$1 = DOMUtils.DOM;
+    const extend = Tools.extend, each$1 = Tools.each;
+    class Editor {
+      constructor(id, options, editorManager) {
+        this.plugins = {};
+        this.contentCSS = [];
+        this.contentStyles = [];
+        this.loadedCSS = {};
+        this.isNotDirty = false;
+        this.editorManager = editorManager;
+        this.documentBaseUrl = editorManager.documentBaseURL;
+        extend(this, EditorObservable);
+        const self = this;
+        this.id = id;
+        this.hidden = false;
+        const normalizedOptions = normalizeOptions(editorManager.defaultOptions, options);
+        this.options = create$5(self, normalizedOptions);
+        register$7(self);
+        const getOption = this.options.get;
+        if (getOption('deprecation_warnings')) {
+          logWarnings(options, normalizedOptions);
+        }
+        const suffix = getOption('suffix');
+        if (suffix) {
+          editorManager.suffix = suffix;
+        }
+        this.suffix = editorManager.suffix;
+        const baseUrl = getOption('base_url');
+        if (baseUrl) {
+          editorManager._setBaseUrl(baseUrl);
+        }
+        this.baseUri = editorManager.baseURI;
+        const referrerPolicy = getReferrerPolicy(self);
+        if (referrerPolicy) {
+          ScriptLoader.ScriptLoader._setReferrerPolicy(referrerPolicy);
+          DOMUtils.DOM.styleSheetLoader._setReferrerPolicy(referrerPolicy);
+        }
+        AddOnManager.languageLoad = getOption('language_load');
+        AddOnManager.baseURL = editorManager.baseURL;
+        this.setDirty(false);
+        this.documentBaseURI = new URI(getDocumentBaseUrl(self), { base_uri: this.baseUri });
+        this.baseURI = this.baseUri;
+        this.inline = isInline(self);
+        this.shortcuts = new Shortcuts(this);
+        this.editorCommands = new EditorCommands(this);
+        registerCommands(this);
+        const cacheSuffix = getOption('cache_suffix');
+        if (cacheSuffix) {
+          Env.cacheSuffix = cacheSuffix.replace(/^[\?\&]+/, '');
+        }
+        this.ui = {
+          registry: registry(),
+          styleSheetLoader: undefined,
+          show: noop,
+          hide: noop,
+          setEnabled: noop,
+          isEnabled: always
+        };
+        this.mode = create$4(self);
+        editorManager.dispatch('SetupEditor', { editor: this });
+        const setupCallback = getSetupCallback(self);
+        if (isFunction(setupCallback)) {
+          setupCallback.call(self, self);
+        }
+      }
+      render() {
+        render(this);
+      }
+      focus(skipFocus) {
+        this.execCommand('mceFocus', false, skipFocus);
+      }
+      hasFocus() {
+        return hasFocus(this);
+      }
+      translate(text) {
+        return I18n.translate(text);
+      }
+      getParam(name, defaultVal, type) {
+        const options = this.options;
+        if (!options.isRegistered(name)) {
+          if (isNonNullable(type)) {
+            options.register(name, {
+              processor: type,
+              default: defaultVal
+            });
+          } else {
+            options.register(name, {
+              processor: always,
+              default: defaultVal
+            });
+          }
+        }
+        return !options.isSet(name) && !isUndefined(defaultVal) ? defaultVal : options.get(name);
+      }
+      hasPlugin(name, loaded) {
+        const hasPlugin = contains$2(getPlugins(this), name);
+        if (hasPlugin) {
+          return loaded ? PluginManager.get(name) !== undefined : true;
+        } else {
+          return false;
+        }
+      }
+      nodeChanged(args) {
+        this._nodeChangeDispatcher.nodeChanged(args);
+      }
+      addCommand(name, callback, scope) {
+        this.editorCommands.addCommand(name, callback, scope);
+      }
+      addQueryStateHandler(name, callback, scope) {
+        this.editorCommands.addQueryStateHandler(name, callback, scope);
+      }
+      addQueryValueHandler(name, callback, scope) {
+        this.editorCommands.addQueryValueHandler(name, callback, scope);
+      }
+      addShortcut(pattern, desc, cmdFunc, scope) {
+        this.shortcuts.add(pattern, desc, cmdFunc, scope);
+      }
+      execCommand(cmd, ui, value, args) {
+        return this.editorCommands.execCommand(cmd, ui, value, args);
+      }
+      queryCommandState(cmd) {
+        return this.editorCommands.queryCommandState(cmd);
+      }
+      queryCommandValue(cmd) {
+        return this.editorCommands.queryCommandValue(cmd);
+      }
+      queryCommandSupported(cmd) {
+        return this.editorCommands.queryCommandSupported(cmd);
+      }
+      show() {
+        const self = this;
+        if (self.hidden) {
+          self.hidden = false;
+          if (self.inline) {
+            self.getBody().contentEditable = 'true';
+          } else {
+            DOM$1.show(self.getContainer());
+            DOM$1.hide(self.id);
+          }
+          self.load();
+          self.dispatch('show');
+        }
+      }
+      hide() {
+        const self = this;
+        if (!self.hidden) {
+          self.save();
+          if (self.inline) {
+            self.getBody().contentEditable = 'false';
+            if (self === self.editorManager.focusedEditor) {
+              self.editorManager.focusedEditor = null;
+            }
+          } else {
+            DOM$1.hide(self.getContainer());
+            DOM$1.setStyle(self.id, 'display', self.orgDisplay);
+          }
+          self.hidden = true;
+          self.dispatch('hide');
+        }
+      }
+      isHidden() {
+        return this.hidden;
+      }
+      setProgressState(state, time) {
+        this.dispatch('ProgressState', {
+          state,
+          time
+        });
+      }
+      load(args) {
+        const self = this;
+        let elm = self.getElement(), html;
+        if (self.removed) {
+          return '';
+        }
+        if (elm) {
+          args = args || {};
+          args.load = true;
+          const value = isTextareaOrInput(elm) ? elm.value : elm.innerHTML;
+          html = self.setContent(value, args);
+          args.element = elm;
+          if (!args.no_events) {
+            self.dispatch('LoadContent', args);
+          }
+          args.element = elm = null;
+          return html;
+        }
+      }
+      save(args) {
+        const self = this;
+        let elm = self.getElement(), html, form;
+        if (!elm || !self.initialized || self.removed) {
+          return;
+        }
+        args = args || {};
+        args.save = true;
+        args.element = elm;
+        html = args.content = self.getContent(args);
+        if (!args.no_events) {
+          self.dispatch('SaveContent', args);
+        }
+        if (args.format === 'raw') {
+          self.dispatch('RawSaveContent', args);
+        }
+        html = args.content;
+        if (!isTextareaOrInput(elm)) {
+          if (args.is_removing || !self.inline) {
+            elm.innerHTML = html;
+          }
+          if (form = DOM$1.getParent(self.id, 'form')) {
+            each$1(form.elements, elm => {
+              if (elm.name === self.id) {
+                elm.value = html;
+                return false;
+              }
+            });
+          }
+        } else {
+          elm.value = html;
+        }
+        args.element = elm = null;
+        if (args.set_dirty !== false) {
+          self.setDirty(false);
+        }
+        return html;
+      }
+      setContent(content, args) {
+        return setContent(this, content, args);
+      }
+      getContent(args) {
+        return getContent(this, args);
+      }
+      insertContent(content, args) {
+        if (args) {
+          content = extend({ content }, args);
+        }
+        this.execCommand('mceInsertContent', false, content);
+      }
+      resetContent(initialContent) {
+        if (initialContent === undefined) {
+          setContent(this, this.startContent, { format: 'raw' });
+        } else {
+          setContent(this, initialContent);
+        }
+        this.undoManager.reset();
+        this.setDirty(false);
+        this.nodeChanged();
+      }
+      isDirty() {
+        return !this.isNotDirty;
+      }
+      setDirty(state) {
+        const oldState = !this.isNotDirty;
+        this.isNotDirty = !state;
+        if (state && state !== oldState) {
+          this.dispatch('dirty');
+        }
+      }
+      getContainer() {
+        const self = this;
+        if (!self.container) {
+          self.container = DOM$1.get(self.editorContainer || self.id + '_parent');
+        }
+        return self.container;
+      }
+      getContentAreaContainer() {
+        return this.contentAreaContainer;
+      }
+      getElement() {
+        if (!this.targetElm) {
+          this.targetElm = DOM$1.get(this.id);
+        }
+        return this.targetElm;
+      }
+      getWin() {
+        const self = this;
+        let elm;
+        if (!self.contentWindow) {
+          elm = self.iframeElement;
+          if (elm) {
+            self.contentWindow = elm.contentWindow;
+          }
+        }
+        return self.contentWindow;
+      }
+      getDoc() {
+        const self = this;
+        let win;
+        if (!self.contentDocument) {
+          win = self.getWin();
+          if (win) {
+            self.contentDocument = win.document;
+          }
+        }
+        return self.contentDocument;
+      }
+      getBody() {
+        const doc = this.getDoc();
+        return this.bodyElement || (doc ? doc.body : null);
+      }
+      convertURL(url, name, elm) {
+        const self = this, getOption = self.options.get;
+        const urlConverterCallback = getUrlConverterCallback(self);
+        if (isFunction(urlConverterCallback)) {
+          return urlConverterCallback.call(self, url, elm, true, name);
+        }
+        if (!getOption('convert_urls') || elm && elm.nodeName === 'LINK' || url.indexOf('file:') === 0 || url.length === 0) {
+          return url;
+        }
+        if (getOption('relative_urls')) {
+          return self.documentBaseURI.toRelative(url);
+        }
+        url = self.documentBaseURI.toAbsolute(url, getOption('remove_script_host'));
+        return url;
+      }
+      addVisual(elm) {
+        addVisual(this, elm);
+      }
+      remove() {
+        remove$1(this);
+      }
+      destroy(automatic) {
+        destroy(this, automatic);
+      }
+      uploadImages() {
+        return this.editorUpload.uploadImages();
+      }
+      _scanForImages() {
+        return this.editorUpload.scanForImages();
+      }
+    }
+
+    const DOM = DOMUtils.DOM;
+    const each = Tools.each;
+    let boundGlobalEvents = false;
+    let beforeUnloadDelegate;
+    let editors = [];
+    const globalEventDelegate = e => {
+      const type = e.type;
+      each(EditorManager.get(), editor => {
+        switch (type) {
+        case 'scroll':
+          editor.dispatch('ScrollWindow', e);
+          break;
+        case 'resize':
+          editor.dispatch('ResizeWindow', e);
+          break;
+        }
+      });
+    };
+    const toggleGlobalEvents = state => {
+      if (state !== boundGlobalEvents) {
+        const DOM = DOMUtils.DOM;
+        if (state) {
+          DOM.bind(window, 'resize', globalEventDelegate);
+          DOM.bind(window, 'scroll', globalEventDelegate);
+        } else {
+          DOM.unbind(window, 'resize', globalEventDelegate);
+          DOM.unbind(window, 'scroll', globalEventDelegate);
+        }
+        boundGlobalEvents = state;
+      }
+    };
+    const removeEditorFromList = targetEditor => {
+      const oldEditors = editors;
+      editors = filter$6(editors, editor => {
+        return targetEditor !== editor;
+      });
+      if (EditorManager.activeEditor === targetEditor) {
+        EditorManager.activeEditor = editors.length > 0 ? editors[0] : null;
+      }
+      if (EditorManager.focusedEditor === targetEditor) {
+        EditorManager.focusedEditor = null;
+      }
+      return oldEditors.length !== editors.length;
+    };
+    const purgeDestroyedEditor = editor => {
+      if (editor && editor.initialized && !(editor.getContainer() || editor.getBody()).parentNode) {
+        removeEditorFromList(editor);
+        editor.unbindAllNativeEvents();
+        editor.destroy(true);
+        editor.removed = true;
+        editor = null;
+      }
+      return editor;
+    };
+    const isQuirksMode = document.compatMode !== 'CSS1Compat';
+    const EditorManager = {
+      ...Observable,
+      baseURI: null,
+      baseURL: null,
+      defaultOptions: {},
+      documentBaseURL: null,
+      suffix: null,
+      majorVersion: '6',
+      minorVersion: '0.3',
+      releaseDate: '2022-05-25',
+      i18n: I18n,
+      activeEditor: null,
+      focusedEditor: null,
+      setup() {
+        const self = this;
+        let baseURL, documentBaseURL, suffix = '';
+        documentBaseURL = URI.getDocumentBaseUrl(document.location);
+        if (/^[^:]+:\/\/\/?[^\/]+\//.test(documentBaseURL)) {
+          documentBaseURL = documentBaseURL.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
+          if (!/[\/\\]$/.test(documentBaseURL)) {
+            documentBaseURL += '/';
+          }
+        }
+        const preInit = window.tinymce || window.tinyMCEPreInit;
+        if (preInit) {
+          baseURL = preInit.base || preInit.baseURL;
+          suffix = preInit.suffix;
+        } else {
+          const scripts = document.getElementsByTagName('script');
+          for (let i = 0; i < scripts.length; i++) {
+            const src = scripts[i].src || '';
+            if (src === '') {
+              continue;
+            }
+            const srcScript = src.substring(src.lastIndexOf('/'));
+            if (/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(src)) {
+              if (srcScript.indexOf('.min') !== -1) {
+                suffix = '.min';
+              }
+              baseURL = src.substring(0, src.lastIndexOf('/'));
+              break;
+            }
+          }
+          if (!baseURL && document.currentScript) {
+            const src = document.currentScript.src;
+            if (src.indexOf('.min') !== -1) {
+              suffix = '.min';
+            }
+            baseURL = src.substring(0, src.lastIndexOf('/'));
+          }
+        }
+        self.baseURL = new URI(documentBaseURL).toAbsolute(baseURL);
+        self.documentBaseURL = documentBaseURL;
+        self.baseURI = new URI(self.baseURL);
+        self.suffix = suffix;
+        setup$v(self);
+      },
+      overrideDefaults(defaultOptions) {
+        const baseUrl = defaultOptions.base_url;
+        if (baseUrl) {
+          this._setBaseUrl(baseUrl);
+        }
+        const suffix = defaultOptions.suffix;
+        if (defaultOptions.suffix) {
+          this.suffix = suffix;
+        }
+        this.defaultOptions = defaultOptions;
+        const pluginBaseUrls = defaultOptions.plugin_base_urls;
+        if (pluginBaseUrls !== undefined) {
+          each$f(pluginBaseUrls, (pluginBaseUrl, pluginName) => {
+            AddOnManager.PluginManager.urls[pluginName] = pluginBaseUrl;
+          });
+        }
+      },
+      init(options) {
+        const self = this;
+        let result;
+        const invalidInlineTargets = Tools.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', ' ');
+        const isInvalidInlineTarget = (options, elm) => options.inline && elm.tagName.toLowerCase() in invalidInlineTargets;
+        const createId = elm => {
+          let id = elm.id;
+          if (!id) {
+            id = get$a(elm, 'name').filter(name => !DOM.get(name)).getOrThunk(DOM.uniqueId);
+            elm.setAttribute('id', id);
+          }
+          return id;
+        };
+        const execCallback = name => {
+          const callback = options[name];
+          if (!callback) {
+            return;
+          }
+          return callback.apply(self, []);
+        };
+        const findTargets = options => {
+          if (Env.browser.isIE() || Env.browser.isEdge()) {
+            initError('TinyMCE does not support the browser you are using. For a list of supported' + ' browsers please see: https://www.tiny.cloud/docs/tinymce/6/support/#supportedwebbrowsers');
+            return [];
+          } else if (isQuirksMode) {
+            initError('Failed to initialize the editor as the document is not in standards mode. ' + 'TinyMCE requires standards mode.');
+            return [];
+          } else if (isString(options.selector)) {
+            return DOM.select(options.selector);
+          } else if (isNonNullable(options.target)) {
+            return [options.target];
+          } else {
+            return [];
+          }
+        };
+        let provideResults = editors => {
+          result = editors;
+        };
+        const initEditors = () => {
+          let initCount = 0;
+          const editors = [];
+          let targets;
+          const createEditor = (id, options, targetElm) => {
+            const editor = new Editor(id, options, self);
+            editors.push(editor);
+            editor.on('init', () => {
+              if (++initCount === targets.length) {
+                provideResults(editors);
+              }
+            });
+            editor.targetElm = editor.targetElm || targetElm;
+            editor.render();
+          };
+          DOM.unbind(window, 'ready', initEditors);
+          execCallback('onpageload');
+          targets = unique$1(findTargets(options));
+          Tools.each(targets, elm => {
+            purgeDestroyedEditor(self.get(elm.id));
+          });
+          targets = Tools.grep(targets, elm => {
+            return !self.get(elm.id);
+          });
+          if (targets.length === 0) {
+            provideResults([]);
+          } else {
+            each(targets, elm => {
+              if (isInvalidInlineTarget(options, elm)) {
+                initError('Could not initialize inline editor on invalid inline target element', elm);
+              } else {
+                createEditor(createId(elm), options, elm);
+              }
+            });
+          }
+        };
+        DOM.bind(window, 'ready', initEditors);
+        return new Promise(resolve => {
+          if (result) {
+            resolve(result);
+          } else {
+            provideResults = editors => {
+              resolve(editors);
+            };
+          }
+        });
+      },
+      get(id) {
+        if (arguments.length === 0) {
+          return editors.slice(0);
+        } else if (isString(id)) {
+          return find$2(editors, editor => {
+            return editor.id === id;
+          }).getOr(null);
+        } else if (isNumber(id)) {
+          return editors[id] ? editors[id] : null;
+        } else {
+          return null;
+        }
+      },
+      add(editor) {
+        const self = this;
+        const existingEditor = self.get(editor.id);
+        if (existingEditor === editor) {
+          return editor;
+        }
+        if (existingEditor === null) {
+          editors.push(editor);
+        }
+        toggleGlobalEvents(true);
+        self.activeEditor = editor;
+        self.dispatch('AddEditor', { editor });
+        if (!beforeUnloadDelegate) {
+          beforeUnloadDelegate = e => {
+            const event = self.dispatch('BeforeUnload');
+            if (event.returnValue) {
+              e.preventDefault();
+              e.returnValue = event.returnValue;
+              return event.returnValue;
+            }
+          };
+          window.addEventListener('beforeunload', beforeUnloadDelegate);
+        }
+        return editor;
+      },
+      createEditor(id, options) {
+        return this.add(new Editor(id, options, this));
+      },
+      remove(selector) {
+        const self = this;
+        let i, editor;
+        if (!selector) {
+          for (i = editors.length - 1; i >= 0; i--) {
+            self.remove(editors[i]);
+          }
+          return;
+        }
+        if (isString(selector)) {
+          each(DOM.select(selector), elm => {
+            editor = self.get(elm.id);
+            if (editor) {
+              self.remove(editor);
+            }
+          });
+          return;
+        }
+        editor = selector;
+        if (isNull(self.get(editor.id))) {
+          return null;
+        }
+        if (removeEditorFromList(editor)) {
+          self.dispatch('RemoveEditor', { editor });
+        }
+        if (editors.length === 0) {
+          window.removeEventListener('beforeunload', beforeUnloadDelegate);
+        }
+        editor.remove();
+        toggleGlobalEvents(editors.length > 0);
+        return editor;
+      },
+      execCommand(cmd, ui, value) {
+        var _a;
+        const self = this;
+        const editorId = isObject(value) ? (_a = value.id) !== null && _a !== void 0 ? _a : value.index : value;
+        switch (cmd) {
+        case 'mceAddEditor': {
+            if (!self.get(editorId)) {
+              const editorOptions = value.options;
+              new Editor(editorId, editorOptions, self).render();
+            }
+            return true;
+          }
+        case 'mceRemoveEditor': {
+            const editor = self.get(editorId);
+            if (editor) {
+              editor.remove();
+            }
+            return true;
+          }
+        case 'mceToggleEditor': {
+            const editor = self.get(editorId);
+            if (!editor) {
+              self.execCommand('mceAddEditor', false, value);
+              return true;
+            }
+            if (editor.isHidden()) {
+              editor.show();
+            } else {
+              editor.hide();
+            }
+            return true;
+          }
+        }
+        if (self.activeEditor) {
+          return self.activeEditor.execCommand(cmd, ui, value);
+        }
+        return false;
+      },
+      triggerSave: () => {
+        each(editors, editor => {
+          editor.save();
+        });
+      },
+      addI18n: (code, items) => {
+        I18n.add(code, items);
+      },
+      translate: text => {
+        return I18n.translate(text);
+      },
+      setActive(editor) {
+        const activeEditor = this.activeEditor;
+        if (this.activeEditor !== editor) {
+          if (activeEditor) {
+            activeEditor.dispatch('deactivate', { relatedTarget: editor });
+          }
+          editor.dispatch('activate', { relatedTarget: activeEditor });
+        }
+        this.activeEditor = editor;
+      },
+      _setBaseUrl(baseUrl) {
+        this.baseURL = new URI(this.documentBaseURL).toAbsolute(baseUrl.replace(/\/+$/, ''));
+        this.baseURI = new URI(this.baseURL);
+      }
+    };
+    EditorManager.setup();
+
+    const setup = () => {
+      const dataValue = value$2();
+      const FakeClipboardItem = items => ({
+        items,
+        types: keys(items),
+        getType: type => get$a(items, type).getOrUndefined()
+      });
+      const write = data => {
+        dataValue.set(data);
+      };
+      const read = () => dataValue.get().getOrUndefined();
+      const clear = dataValue.clear;
+      return {
+        FakeClipboardItem,
+        write,
+        read,
+        clear
+      };
+    };
+    const FakeClipboard = setup();
+
+    const min = Math.min, max = Math.max, round = Math.round;
+    const relativePosition = (rect, targetRect, rel) => {
+      let x = targetRect.x;
+      let y = targetRect.y;
+      const w = rect.w;
+      const h = rect.h;
+      const targetW = targetRect.w;
+      const targetH = targetRect.h;
+      const relChars = (rel || '').split('');
+      if (relChars[0] === 'b') {
+        y += targetH;
+      }
+      if (relChars[1] === 'r') {
+        x += targetW;
+      }
+      if (relChars[0] === 'c') {
+        y += round(targetH / 2);
+      }
+      if (relChars[1] === 'c') {
+        x += round(targetW / 2);
+      }
+      if (relChars[3] === 'b') {
+        y -= h;
+      }
+      if (relChars[4] === 'r') {
+        x -= w;
+      }
+      if (relChars[3] === 'c') {
+        y -= round(h / 2);
+      }
+      if (relChars[4] === 'c') {
+        x -= round(w / 2);
+      }
+      return create$2(x, y, w, h);
+    };
+    const findBestRelativePosition = (rect, targetRect, constrainRect, rels) => {
+      let pos, i;
+      for (i = 0; i < rels.length; i++) {
+        pos = relativePosition(rect, targetRect, rels[i]);
+        if (pos.x >= constrainRect.x && pos.x + pos.w <= constrainRect.w + constrainRect.x && pos.y >= constrainRect.y && pos.y + pos.h <= constrainRect.h + constrainRect.y) {
+          return rels[i];
+        }
+      }
+      return null;
+    };
+    const inflate = (rect, w, h) => {
+      return create$2(rect.x - w, rect.y - h, rect.w + w * 2, rect.h + h * 2);
+    };
+    const intersect = (rect, cropRect) => {
+      const x1 = max(rect.x, cropRect.x);
+      const y1 = max(rect.y, cropRect.y);
+      const x2 = min(rect.x + rect.w, cropRect.x + cropRect.w);
+      const y2 = min(rect.y + rect.h, cropRect.y + cropRect.h);
+      if (x2 - x1 < 0 || y2 - y1 < 0) {
+        return null;
+      }
+      return create$2(x1, y1, x2 - x1, y2 - y1);
+    };
+    const clamp = (rect, clampRect, fixedSize) => {
+      let x1 = rect.x;
+      let y1 = rect.y;
+      let x2 = rect.x + rect.w;
+      let y2 = rect.y + rect.h;
+      const cx2 = clampRect.x + clampRect.w;
+      const cy2 = clampRect.y + clampRect.h;
+      const underflowX1 = max(0, clampRect.x - x1);
+      const underflowY1 = max(0, clampRect.y - y1);
+      const overflowX2 = max(0, x2 - cx2);
+      const overflowY2 = max(0, y2 - cy2);
+      x1 += underflowX1;
+      y1 += underflowY1;
+      if (fixedSize) {
+        x2 += underflowX1;
+        y2 += underflowY1;
+        x1 -= overflowX2;
+        y1 -= overflowY2;
+      }
+      x2 -= overflowX2;
+      y2 -= overflowY2;
+      return create$2(x1, y1, x2 - x1, y2 - y1);
+    };
+    const create$2 = (x, y, w, h) => {
+      return {
+        x,
+        y,
+        w,
+        h
+      };
+    };
+    const fromClientRect = clientRect => {
+      return create$2(clientRect.left, clientRect.top, clientRect.width, clientRect.height);
+    };
+    const Rect = {
+      inflate,
+      relativePosition,
+      findBestRelativePosition,
+      intersect,
+      clamp,
+      create: create$2,
+      fromClientRect
+    };
+
+    const awaiter = (resolveCb, rejectCb, timeout = 1000) => {
+      let done = false;
+      let timer = null;
+      const complete = completer => (...args) => {
+        if (!done) {
+          done = true;
+          if (timer !== null) {
+            clearTimeout(timer);
+            timer = null;
+          }
+          completer.apply(null, args);
+        }
+      };
+      const resolve = complete(resolveCb);
+      const reject = complete(rejectCb);
+      const start = (...args) => {
+        if (!done && timer === null) {
+          timer = setTimeout(() => reject.apply(null, args), timeout);
+        }
+      };
+      return {
+        start,
+        resolve,
+        reject
+      };
+    };
+    const create$1 = () => {
+      const tasks = {};
+      const resultFns = {};
+      const load = (id, url) => {
+        const loadErrMsg = `Script at URL "${ url }" failed to load`;
+        const runErrMsg = `Script at URL "${ url }" did not call \`tinymce.Resource.add('${ id }', data)\` within 1 second`;
+        if (tasks[id] !== undefined) {
+          return tasks[id];
+        } else {
+          const task = new Promise((resolve, reject) => {
+            const waiter = awaiter(resolve, reject);
+            resultFns[id] = waiter.resolve;
+            ScriptLoader.ScriptLoader.loadScript(url).then(() => waiter.start(runErrMsg), () => waiter.reject(loadErrMsg));
+          });
+          tasks[id] = task;
+          return task;
+        }
+      };
+      const add = (id, data) => {
+        if (resultFns[id] !== undefined) {
+          resultFns[id](data);
+          delete resultFns[id];
+        }
+        tasks[id] = Promise.resolve(data);
+      };
+      const unload = id => {
+        delete tasks[id];
+      };
+      return {
+        load,
+        add,
+        unload
+      };
+    };
+    const Resource = create$1();
+
+    const create = () => (() => {
+      let data = {};
+      let keys = [];
+      const storage = {
+        getItem: key => {
+          const item = data[key];
+          return item ? item : null;
+        },
+        setItem: (key, value) => {
+          keys.push(key);
+          data[key] = String(value);
+        },
+        key: index => {
+          return keys[index];
+        },
+        removeItem: key => {
+          keys = keys.filter(k => k === key);
+          delete data[key];
+        },
+        clear: () => {
+          keys = [];
+          data = {};
+        },
+        length: 0
+      };
+      Object.defineProperty(storage, 'length', {
+        get: () => keys.length,
+        configurable: false,
+        enumerable: false
+      });
+      return storage;
+    })();
+
+    let localStorage;
+    try {
+      const test = '__storage_test__';
+      localStorage = window.localStorage;
+      localStorage.setItem(test, test);
+      localStorage.removeItem(test);
+    } catch (e) {
+      localStorage = create();
+    }
+    var LocalStorage = localStorage;
+
+    const publicApi = {
+      geom: { Rect },
+      util: {
+        Delay,
+        Tools,
+        VK,
+        URI,
+        EventDispatcher,
+        Observable,
+        I18n,
+        LocalStorage,
+        ImageUploader
+      },
+      dom: {
+        EventUtils,
+        TreeWalker: DomTreeWalker,
+        TextSeeker,
+        DOMUtils,
+        ScriptLoader,
+        RangeUtils,
+        Serializer: DomSerializer,
+        StyleSheetLoader,
+        ControlSelection,
+        BookmarkManager,
+        Selection: EditorSelection,
+        Event: EventUtils.Event
+      },
+      html: {
+        Styles,
+        Entities,
+        Node: AstNode,
+        Schema,
+        DomParser,
+        Writer,
+        Serializer: HtmlSerializer
+      },
+      Env,
+      AddOnManager,
+      Annotator,
+      Formatter,
+      UndoManager,
+      EditorCommands,
+      WindowManager,
+      NotificationManager,
+      EditorObservable,
+      Shortcuts,
+      Editor,
+      FocusManager,
+      EditorManager,
+      DOM: DOMUtils.DOM,
+      ScriptLoader: ScriptLoader.ScriptLoader,
+      PluginManager,
+      ThemeManager,
+      ModelManager,
+      IconManager,
+      Resource,
+      FakeClipboard,
+      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,
+      walk: Tools.walk,
+      resolve: Tools.resolve,
+      explode: Tools.explode,
+      _addCacheSuffix: Tools._addCacheSuffix
+    };
+    const tinymce = Tools.extend(EditorManager, publicApi);
+
+    const exportToModuleLoaders = tinymce => {
+      if (typeof module === 'object') {
+        try {
+          module.exports = tinymce;
+        } catch (_) {
+        }
+      }
+    };
+    const exportToWindowGlobal = tinymce => {
+      window.tinymce = tinymce;
+      window.tinyMCE = tinymce;
+    };
+    exportToWindowGlobal(tinymce);
+    exportToModuleLoaders(tinymce);
+
+})();
+
+
+
+/*!
+ * Modernizr v2.7.1
+ * www.modernizr.com
+ *
+ * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton
+ * Available under the BSD and MIT licenses: www.modernizr.com/license/
+ */
+
+/*
+ * Modernizr tests which native CSS3 and HTML5 features are available in
+ * the current UA and makes the results available to you in two ways:
+ * as properties on a global Modernizr object, and as classes on the
+ * <html> element. This information allows you to progressively enhance
+ * your pages with a granular level of control over the experience.
+ *
+ * Modernizr has an optional (not included) conditional resource loader
+ * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).
+ * To get a build that includes Modernizr.load(), as well as choosing
+ * which tests to include, go to www.modernizr.com/download/
+ *
+ * Authors        Faruk Ates, Paul Irish, Alex Sexton
+ * Contributors   Ryan Seddon, Ben Alman
+ */
+
+window.Modernizr = (function( window, document, undefined ) {
+
+    var version = '2.7.1',
+
+    Modernizr = {},
+
+    /*>>cssclasses*/
+    // option for enabling the HTML classes to be added
+    enableClasses = true,
+    /*>>cssclasses*/
+
+    docElement = document.documentElement,
+
+    /**
+     * Create our "modernizr" element that we do most feature tests on.
+     */
+    mod = 'modernizr',
+    modElem = document.createElement(mod),
+    mStyle = modElem.style,
+
+    /**
+     * Create the input element for various Web Forms feature tests.
+     */
+    inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,
+
+    /*>>smile*/
+    smile = ':)',
+    /*>>smile*/
+
+    toString = {}.toString,
+
+    // TODO :: make the prefixes more granular
+    /*>>prefixes*/
+    // List of property values to set for css tests. See ticket #21
+    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
+    /*>>prefixes*/
+
+    /*>>domprefixes*/
+    // Following spec is to expose vendor-specific style properties as:
+    //   elem.style.WebkitBorderRadius
+    // and the following would be incorrect:
+    //   elem.style.webkitBorderRadius
+
+    // Webkit ghosts their properties in lowercase but Opera & Moz do not.
+    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+
+    //   erik.eae.net/archives/2008/03/10/21.48.10/
+
+    // More here: github.com/Modernizr/Modernizr/issues/issue/21
+    omPrefixes = 'Webkit Moz O ms',
+
+    cssomPrefixes = omPrefixes.split(' '),
+
+    domPrefixes = omPrefixes.toLowerCase().split(' '),
+    /*>>domprefixes*/
+
+    /*>>ns*/
+    ns = {'svg': 'http://www.w3.org/2000/svg'},
+    /*>>ns*/
+
+    tests = {},
+    inputs = {},
+    attrs = {},
+
+    classes = [],
+
+    slice = classes.slice,
+
+    featureName, // used in testing loop
+
+
+    /*>>teststyles*/
+    // Inject element with style element and some CSS rules
+    injectElementWithStyles = function( rule, callback, nodes, testnames ) {
+
+      var style, ret, node, docOverflow,
+          div = document.createElement('div'),
+          // After page load injecting a fake body doesn't work so check if body exists
+          body = document.body,
+          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.
+          fakeBody = body || document.createElement('body');
+
+      if ( parseInt(nodes, 10) ) {
+          // In order not to give false positives we create a node for each test
+          // This also allows the method to scale for unspecified uses
+          while ( nodes-- ) {
+              node = document.createElement('div');
+              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
+              div.appendChild(node);
+          }
+      }
+
+      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed
+      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element
+      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.
+      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx
+      // Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277
+      style = ['&#173;','<style id="s', mod, '">', rule, '</style>'].join('');
+      div.id = mod;
+      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.
+      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270
+      (body ? div : fakeBody).innerHTML += style;
+      fakeBody.appendChild(div);
+      if ( !body ) {
+          //avoid crashing IE8, if background image is used
+          fakeBody.style.background = '';
+          //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible
+          fakeBody.style.overflow = 'hidden';
+          docOverflow = docElement.style.overflow;
+          docElement.style.overflow = 'hidden';
+          docElement.appendChild(fakeBody);
+      }
+
+      ret = callback(div, rule);
+      // If this is done after page load we don't want to remove the body so check if body exists
+      if ( !body ) {
+          fakeBody.parentNode.removeChild(fakeBody);
+          docElement.style.overflow = docOverflow;
+      } else {
+          div.parentNode.removeChild(div);
+      }
+
+      return !!ret;
+
+    },
+    /*>>teststyles*/
+
+    /*>>mq*/
+    // adapted from matchMedia polyfill
+    // by Scott Jehl and Paul Irish
+    // gist.github.com/786768
+    testMediaQuery = function( mq ) {
+
+      var matchMedia = window.matchMedia || window.msMatchMedia;
+      if ( matchMedia ) {
+        return matchMedia(mq).matches;
+      }
+
+      var bool;
+
+      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {
+        bool = (window.getComputedStyle ?
+                  getComputedStyle(node, null) :
+                  node.currentStyle)['position'] == 'absolute';
+      });
+
+      return bool;
+
+     },
+     /*>>mq*/
+
+
+    /*>>hasevent*/
+    //
+    // isEventSupported determines if a given element supports the given event
+    // kangax.github.com/iseventsupported/
+    //
+    // The following results are known incorrects:
+    //   Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative
+    //   Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333
+    //   ...
+    isEventSupported = (function() {
+
+      var TAGNAMES = {
+        'select': 'input', 'change': 'input',
+        'submit': 'form', 'reset': 'form',
+        'error': 'img', 'load': 'img', 'abort': 'img'
+      };
+
+      function isEventSupported( eventName, element ) {
+
+        element = element || document.createElement(TAGNAMES[eventName] || 'div');
+        eventName = 'on' + eventName;
+
+        // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
+        var isSupported = eventName in element;
+
+        if ( !isSupported ) {
+          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
+          if ( !element.setAttribute ) {
+            element = document.createElement('div');
+          }
+          if ( element.setAttribute && element.removeAttribute ) {
+            element.setAttribute(eventName, '');
+            isSupported = is(element[eventName], 'function');
+
+            // If property was created, "remove it" (by setting value to `undefined`)
+            if ( !is(element[eventName], 'undefined') ) {
+              element[eventName] = undefined;
+            }
+            element.removeAttribute(eventName);
+          }
+        }
+
+        element = null;
+        return isSupported;
+      }
+      return isEventSupported;
+    })(),
+    /*>>hasevent*/
+
+    // TODO :: Add flag for hasownprop ? didn't last time
+
+    // hasOwnProperty shim by kangax needed for Safari 2.0 support
+    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
+
+    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {
+      hasOwnProp = function (object, property) {
+        return _hasOwnProperty.call(object, property);
+      };
+    }
+    else {
+      hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */
+        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));
+      };
+    }
+
+    // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js
+    // es5.github.com/#x15.3.4.5
+
+    if (!Function.prototype.bind) {
+      Function.prototype.bind = function bind(that) {
+
+        var target = this;
+
+        if (typeof target != "function") {
+            throw new TypeError();
+        }
+
+        var args = slice.call(arguments, 1),
+            bound = function () {
+
+            if (this instanceof bound) {
+
+              var F = function(){};
+              F.prototype = target.prototype;
+              var self = new F();
+
+              var result = target.apply(
+                  self,
+                  args.concat(slice.call(arguments))
+              );
+              if (Object(result) === result) {
+                  return result;
+              }
+              return self;
+
+            } else {
+
+              return target.apply(
+                  that,
+                  args.concat(slice.call(arguments))
+              );
+
+            }
+
+        };
+
+        return bound;
+      };
+    }
+
+    /**
+     * setCss applies given styles to the Modernizr DOM node.
+     */
+    function setCss( str ) {
+        mStyle.cssText = str;
+    }
+
+    /**
+     * setCssAll extrapolates all vendor-specific css strings.
+     */
+    function setCssAll( str1, str2 ) {
+        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
+    }
+
+    /**
+     * is returns a boolean for if typeof obj is exactly type.
+     */
+    function is( obj, type ) {
+        return typeof obj === type;
+    }
+
+    /**
+     * contains returns a boolean for if substr is found within str.
+     */
+    function contains( str, substr ) {
+        return !!~('' + str).indexOf(substr);
+    }
+
+    /*>>testprop*/
+
+    // testProps is a generic CSS / DOM property test.
+
+    // In testing support for a given CSS property, it's legit to test:
+    //    `elem.style[styleName] !== undefined`
+    // If the property is supported it will return an empty string,
+    // if unsupported it will return undefined.
+
+    // We'll take advantage of this quick test and skip setting a style
+    // on our modernizr element, but instead just testing undefined vs
+    // empty string.
+
+    // Because the testing of the CSS property names (with "-", as
+    // opposed to the camelCase DOM properties) is non-portable and
+    // non-standard but works in WebKit and IE (but not Gecko or Opera),
+    // we explicitly reject properties with dashes so that authors
+    // developing in WebKit or IE first don't end up with
+    // browser-specific content by accident.
+
+    function testProps( props, prefixed ) {
+        for ( var i in props ) {
+            var prop = props[i];
+            if ( !contains(prop, "-") && mStyle[prop] !== undefined ) {
+                return prefixed == 'pfx' ? prop : true;
+            }
+        }
+        return false;
+    }
+    /*>>testprop*/
+
+    // TODO :: add testDOMProps
+    /**
+     * testDOMProps is a generic DOM property test; if a browser supports
+     *   a certain property, it won't return undefined for it.
+     */
+    function testDOMProps( props, obj, elem ) {
+        for ( var i in props ) {
+            var item = obj[props[i]];
+            if ( item !== undefined) {
+
+                // return the property name as a string
+                if (elem === false) return props[i];
+
+                // let's bind a function
+                if (is(item, 'function')){
+                  // default to autobind unless override
+                  return item.bind(elem || obj);
+                }
+
+                // return the unbound function or obj or value
+                return item;
+            }
+        }
+        return false;
+    }
+
+    /*>>testallprops*/
+    /**
+     * testPropsAll tests a list of DOM properties we want to check against.
+     *   We specify literally ALL possible (known and/or likely) properties on
+     *   the element including the non-vendor prefixed one, for forward-
+     *   compatibility.
+     */
+    function testPropsAll( prop, prefixed, elem ) {
+
+        var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),
+            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
+
+        // did they call .prefixed('boxSizing') or are we just testing a prop?
+        if(is(prefixed, "string") || is(prefixed, "undefined")) {
+          return testProps(props, prefixed);
+
+        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])
+        } else {
+          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
+          return testDOMProps(props, prefixed, elem);
+        }
+    }
+    /*>>testallprops*/
+
+
+    /**
+     * Tests
+     * -----
+     */
+
+    // The *new* flexbox
+    // dev.w3.org/csswg/css3-flexbox
+
+    tests['flexbox'] = function() {
+      return testPropsAll('flexWrap');
+    };
+
+    // The *old* flexbox
+    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/
+
+    tests['flexboxlegacy'] = function() {
+        return testPropsAll('boxDirection');
+    };
+
+    // On the S60 and BB Storm, getContext exists, but always returns undefined
+    // so we actually have to call getContext() to verify
+    // github.com/Modernizr/Modernizr/issues/issue/97/
+
+    tests['canvas'] = function() {
+        var elem = document.createElement('canvas');
+        return !!(elem.getContext && elem.getContext('2d'));
+    };
+
+    tests['canvastext'] = function() {
+        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));
+    };
+
+    // webk.it/70117 is tracking a legit WebGL feature detect proposal
+
+    // We do a soft detect which may false positive in order to avoid
+    // an expensive context creation: bugzil.la/732441
+
+    tests['webgl'] = function() {
+        return !!window.WebGLRenderingContext;
+    };
+
+    /*
+     * The Modernizr.touch test only indicates if the browser supports
+     *    touch events, which does not necessarily reflect a touchscreen
+     *    device, as evidenced by tablets running Windows 7 or, alas,
+     *    the Palm Pre / WebOS (touch) phones.
+     *
+     * Additionally, Chrome (desktop) used to lie about its support on this,
+     *    but that has since been rectified: crbug.com/36415
+     *
+     * We also test for Firefox 4 Multitouch Support.
+     *
+     * For more info, see: modernizr.github.com/Modernizr/touch.html
+     */
+
+    tests['touch'] = function() {
+        var bool;
+
+        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
+          bool = true;
+        } else {
+          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {
+            bool = node.offsetTop === 9;
+          });
+        }
+
+        return bool;
+    };
+
+
+    // geolocation is often considered a trivial feature detect...
+    // Turns out, it's quite tricky to get right:
+    //
+    // Using !!navigator.geolocation does two things we don't want. It:
+    //   1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513
+    //   2. Disables page caching in WebKit: webk.it/43956
+    //
+    // Meanwhile, in Firefox < 8, an about:config setting could expose
+    // a false positive that would throw an exception: bugzil.la/688158
+
+    tests['geolocation'] = function() {
+        return 'geolocation' in navigator;
+    };
+
+
+    tests['postmessage'] = function() {
+      return !!window.postMessage;
+    };
+
+
+    // Chrome incognito mode used to throw an exception when using openDatabase
+    // It doesn't anymore.
+    tests['websqldatabase'] = function() {
+      return !!window.openDatabase;
+    };
+
+    // Vendors had inconsistent prefixing with the experimental Indexed DB:
+    // - Webkit's implementation is accessible through webkitIndexedDB
+    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB
+    // For speed, we don't test the legacy (and beta-only) indexedDB
+    tests['indexedDB'] = function() {
+      return !!testPropsAll("indexedDB", window);
+    };
+
+    // documentMode logic from YUI to filter out IE8 Compat Mode
+    //   which false positives.
+    tests['hashchange'] = function() {
+      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);
+    };
+
+    // Per 1.6:
+    // This used to be Modernizr.historymanagement but the longer
+    // name has been deprecated in favor of a shorter and property-matching one.
+    // The old API is still available in 1.6, but as of 2.0 will throw a warning,
+    // and in the first release thereafter disappear entirely.
+    tests['history'] = function() {
+      return !!(window.history && history.pushState);
+    };
+
+    tests['draganddrop'] = function() {
+        var div = document.createElement('div');
+        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);
+    };
+
+    // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10
+    // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.
+    // FF10 still uses prefixes, so check for it until then.
+    // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/
+    tests['websockets'] = function() {
+        return 'WebSocket' in window || 'MozWebSocket' in window;
+    };
+
+
+    // css-tricks.com/rgba-browser-support/
+    tests['rgba'] = function() {
+        // Set an rgba() color and check the returned value
+
+        setCss('background-color:rgba(150,255,150,.5)');
+
+        return contains(mStyle.backgroundColor, 'rgba');
+    };
+
+    tests['hsla'] = function() {
+        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,
+        //   except IE9 who retains it as hsla
+
+        setCss('background-color:hsla(120,40%,100%,.5)');
+
+        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');
+    };
+
+    tests['multiplebgs'] = function() {
+        // Setting multiple images AND a color on the background shorthand property
+        //  and then querying the style.background property value for the number of
+        //  occurrences of "url(" is a reliable method for detecting ACTUAL support for this!
+
+        setCss('background:url(https://),url(https://),red url(https://)');
+
+        // If the UA supports multiple backgrounds, there should be three occurrences
+        //   of the string "url(" in the return value for elemStyle.background
+
+        return (/(url\s*\(.*?){3}/).test(mStyle.background);
+    };
+
+
+
+    // this will false positive in Opera Mini
+    //   github.com/Modernizr/Modernizr/issues/396
+
+    tests['backgroundsize'] = function() {
+        return testPropsAll('backgroundSize');
+    };
+
+    tests['borderimage'] = function() {
+        return testPropsAll('borderImage');
+    };
+
+
+    // Super comprehensive table about all the unique implementations of
+    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance
+
+    tests['borderradius'] = function() {
+        return testPropsAll('borderRadius');
+    };
+
+    // WebOS unfortunately false positives on this test.
+    tests['boxshadow'] = function() {
+        return testPropsAll('boxShadow');
+    };
+
+    // FF3.0 will false positive on this test
+    tests['textshadow'] = function() {
+        return document.createElement('div').style.textShadow === '';
+    };
+
+
+    tests['opacity'] = function() {
+        // Browsers that actually have CSS Opacity implemented have done so
+        //  according to spec, which means their return values are within the
+        //  range of [0.0,1.0] - including the leading zero.
+
+        setCssAll('opacity:.55');
+
+        // The non-literal . in this regex is intentional:
+        //   German Chrome returns this value as 0,55
+        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632
+        return (/^0.55$/).test(mStyle.opacity);
+    };
+
+
+    // Note, Android < 4 will pass this test, but can only animate
+    //   a single property at a time
+    //   daneden.me/2011/12/putting-up-with-androids-bullshit/
+    tests['cssanimations'] = function() {
+        return testPropsAll('animationName');
+    };
+
+
+    tests['csscolumns'] = function() {
+        return testPropsAll('columnCount');
+    };
+
+
+    tests['cssgradients'] = function() {
+        /**
+         * For CSS Gradients syntax, please see:
+         * webkit.org/blog/175/introducing-css-gradients/
+         * developer.mozilla.org/en/CSS/-moz-linear-gradient
+         * developer.mozilla.org/en/CSS/-moz-radial-gradient
+         * dev.w3.org/csswg/css3-images/#gradients-
+         */
+
+        var str1 = 'background-image:',
+            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',
+            str3 = 'linear-gradient(left top,#9f9, white);';
+
+        setCss(
+             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)
+              (str1 + '-webkit- '.split(' ').join(str2 + str1) +
+             // standard syntax             // trailing 'background-image:'
+              prefixes.join(str3 + str1)).slice(0, -str1.length)
+        );
+
+        return contains(mStyle.backgroundImage, 'gradient');
+    };
+
+
+    tests['cssreflections'] = function() {
+        return testPropsAll('boxReflect');
+    };
+
+
+    tests['csstransforms'] = function() {
+        return !!testPropsAll('transform');
+    };
+
+
+    tests['csstransforms3d'] = function() {
+
+        var ret = !!testPropsAll('perspective');
+
+        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.
+        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in
+        //   some conditions. As a result, Webkit typically recognizes the syntax but
+        //   will sometimes throw a false positive, thus we must do a more thorough check:
+        if ( ret && 'webkitPerspective' in docElement.style ) {
+
+          // Webkit allows this media query to succeed only if the feature is enabled.
+          // `@media (transform-3d),(-webkit-transform-3d){ ... }`
+          injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {
+            ret = node.offsetLeft === 9 && node.offsetHeight === 3;
+          });
+        }
+        return ret;
+    };
+
+
+    tests['csstransitions'] = function() {
+        return testPropsAll('transition');
+    };
+
+
+    /*>>fontface*/
+    // @font-face detection routine by Diego Perini
+    // javascript.nwbox.com/CSSSupport/
+
+    // false positives:
+    //   WebOS github.com/Modernizr/Modernizr/issues/342
+    //   WP7   github.com/Modernizr/Modernizr/issues/538
+    tests['fontface'] = function() {
+        var bool;
+
+        injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) {
+          var style = document.getElementById('smodernizr'),
+              sheet = style.sheet || style.styleSheet,
+              cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';
+
+          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;
+        });
+
+        return bool;
+    };
+    /*>>fontface*/
+
+    // CSS generated content detection
+    tests['generatedcontent'] = function() {
+        var bool;
+
+        injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {
+          bool = node.offsetHeight >= 3;
+        });
+
+        return bool;
+    };
+
+
+
+    // These tests evaluate support of the video/audio elements, as well as
+    // testing what types of content they support.
+    //
+    // We're using the Boolean constructor here, so that we can extend the value
+    // e.g.  Modernizr.video     // true
+    //       Modernizr.video.ogg // 'probably'
+    //
+    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845
+    //                     thx to NielsLeenheer and zcorpan
+
+    // Note: in some older browsers, "no" was a return value instead of empty string.
+    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2
+    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5
+
+    tests['video'] = function() {
+        var elem = document.createElement('video'),
+            bool = false;
+
+        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224
+        try {
+            if ( bool = !!elem.canPlayType ) {
+                bool      = new Boolean(bool);
+                bool.ogg  = elem.canPlayType('video/ogg; codecs="theora"')      .replace(/^no$/,'');
+
+                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546
+                bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,'');
+
+                bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,'');
+            }
+
+        } catch(e) { }
+
+        return bool;
+    };
+
+    tests['audio'] = function() {
+        var elem = document.createElement('audio'),
+            bool = false;
+
+        try {
+            if ( bool = !!elem.canPlayType ) {
+                bool      = new Boolean(bool);
+                bool.ogg  = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,'');
+                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');
+
+                // Mimetypes accepted:
+                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
+                //   bit.ly/iphoneoscodecs
+                bool.wav  = elem.canPlayType('audio/wav; codecs="1"')     .replace(/^no$/,'');
+                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            ||
+                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');
+            }
+        } catch(e) { }
+
+        return bool;
+    };
+
+
+    // In FF4, if disabled, window.localStorage should === null.
+
+    // Normally, we could not test that directly and need to do a
+    //   `('localStorage' in window) && ` test first because otherwise Firefox will
+    //   throw bugzil.la/365772 if cookies are disabled
+
+    // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem
+    // will throw the exception:
+    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.
+    // Peculiarly, getItem and removeItem calls do not throw.
+
+    // Because we are forced to try/catch this, we'll go aggressive.
+
+    // Just FWIW: IE8 Compat mode supports these features completely:
+    //   www.quirksmode.org/dom/html5.html
+    // But IE8 doesn't support either with local files
+
+    tests['localstorage'] = function() {
+        try {
+            localStorage.setItem(mod, mod);
+            localStorage.removeItem(mod);
+            return true;
+        } catch(e) {
+            return false;
+        }
+    };
+
+    tests['sessionstorage'] = function() {
+        try {
+            sessionStorage.setItem(mod, mod);
+            sessionStorage.removeItem(mod);
+            return true;
+        } catch(e) {
+            return false;
+        }
+    };
+
+
+    tests['webworkers'] = function() {
+        return !!window.Worker;
+    };
+
+
+    tests['applicationcache'] = function() {
+        return !!window.applicationCache;
+    };
+
+
+    // Thanks to Erik Dahlstrom
+    tests['svg'] = function() {
+        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;
+    };
+
+    // specifically for SVG inline in HTML, not within XHTML
+    // test page: paulirish.com/demo/inline-svg
+    tests['inlinesvg'] = function() {
+      var div = document.createElement('div');
+      div.innerHTML = '<svg/>';
+      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;
+    };
+
+    // SVG SMIL animation
+    tests['smil'] = function() {
+        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));
+    };
+
+    // This test is only for clip paths in SVG proper, not clip paths on HTML content
+    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg
+
+    // However read the comments to dig into applying SVG clippaths to HTML content here:
+    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491
+    tests['svgclippaths'] = function() {
+        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));
+    };
+
+    /*>>webforms*/
+    // input features and input types go directly onto the ret object, bypassing the tests loop.
+    // Hold this guy to execute in a moment.
+    function webforms() {
+        /*>>input*/
+        // Run through HTML5's new input attributes to see if the UA understands any.
+        // We're using f which is the <input> element created early on
+        // Mike Taylr has created a comprehensive resource for testing these attributes
+        //   when applied to all input types:
+        //   miketaylr.com/code/input-type-attr.html
+        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
+
+        // Only input placeholder is tested while textarea's placeholder is not.
+        // Currently Safari 4 and Opera 11 have support only for the input placeholder
+        // Both tests are available in feature-detects/forms-placeholder.js
+        Modernizr['input'] = (function( props ) {
+            for ( var i = 0, len = props.length; i < len; i++ ) {
+                attrs[ props[i] ] = !!(props[i] in inputElem);
+            }
+            if (attrs.list){
+              // safari false positive's on datalist: webk.it/74252
+              // see also github.com/Modernizr/Modernizr/issues/146
+              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);
+            }
+            return attrs;
+        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));
+        /*>>input*/
+
+        /*>>inputtypes*/
+        // Run through HTML5's new input types to see if the UA understands any.
+        //   This is put behind the tests runloop because it doesn't return a
+        //   true/false like all the other tests; instead, it returns an object
+        //   containing each input type with its corresponding true/false value
+
+        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/
+        Modernizr['inputtypes'] = (function(props) {
+
+            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {
+
+                inputElem.setAttribute('type', inputElemType = props[i]);
+                bool = inputElem.type !== 'text';
+
+                // We first check to see if the type we give it sticks..
+                // If the type does, we feed it a textual value, which shouldn't be valid.
+                // If the value doesn't stick, we know there's input sanitization which infers a custom UI
+                if ( bool ) {
+
+                    inputElem.value         = smile;
+                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';
+
+                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {
+
+                      docElement.appendChild(inputElem);
+                      defaultView = document.defaultView;
+
+                      // Safari 2-4 allows the smiley as a value, despite making a slider
+                      bool =  defaultView.getComputedStyle &&
+                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&
+                              // Mobile android web browser has false positive, so must
+                              // check the height to see if the widget is actually there.
+                              (inputElem.offsetHeight !== 0);
+
+                      docElement.removeChild(inputElem);
+
+                    } else if ( /^(search|tel)$/.test(inputElemType) ){
+                      // Spec doesn't define any special parsing or detectable UI
+                      //   behaviors so we pass these through as true
+
+                      // Interestingly, opera fails the earlier test, so it doesn't
+                      //  even make it here.
+
+                    } else if ( /^(url|email)$/.test(inputElemType) ) {
+                      // Real url and email support comes with prebaked validation.
+                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;
+
+                    } else {
+                      // If the upgraded input compontent rejects the :) text, we got a winner
+                      bool = inputElem.value != smile;
+                    }
+                }
+
+                inputs[ props[i] ] = !!bool;
+            }
+            return inputs;
+        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));
+        /*>>inputtypes*/
+    }
+    /*>>webforms*/
+
+
+    // End of test definitions
+    // -----------------------
+
+
+
+    // Run through all tests and detect their support in the current UA.
+    // todo: hypothetically we could be doing an array of tests and use a basic loop here.
+    for ( var feature in tests ) {
+        if ( hasOwnProp(tests, feature) ) {
+            // run the test, throw the return value into the Modernizr,
+            //   then based on that boolean, define an appropriate className
+            //   and push it into an array of classes we'll join later.
+            featureName  = feature.toLowerCase();
+            Modernizr[featureName] = tests[feature]();
+
+            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
+        }
+    }
+
+    /*>>webforms*/
+    // input tests need to run.
+    Modernizr.input || webforms();
+    /*>>webforms*/
+
+
+    /**
+     * addTest allows the user to define their own feature tests
+     * the result will be added onto the Modernizr object,
+     * as well as an appropriate className set on the html element
+     *
+     * @param feature - String naming the feature
+     * @param test - Function returning true if feature is supported, false if not
+     */
+     Modernizr.addTest = function ( feature, test ) {
+       if ( typeof feature == 'object' ) {
+         for ( var key in feature ) {
+           if ( hasOwnProp( feature, key ) ) {
+             Modernizr.addTest( key, feature[ key ] );
+           }
+         }
+       } else {
+
+         feature = feature.toLowerCase();
+
+         if ( Modernizr[feature] !== undefined ) {
+           // we're going to quit if you're trying to overwrite an existing test
+           // if we were to allow it, we'd do this:
+           //   var re = new RegExp("\\b(no-)?" + feature + "\\b");
+           //   docElement.className = docElement.className.replace( re, '' );
+           // but, no rly, stuff 'em.
+           return Modernizr;
+         }
+
+         test = typeof test == 'function' ? test() : test;
+
+         if (typeof enableClasses !== "undefined" && enableClasses) {
+           docElement.className += ' ' + (test ? '' : 'no-') + feature;
+         }
+         Modernizr[feature] = test;
+
+       }
+
+       return Modernizr; // allow chaining.
+     };
+
+
+    // Reset modElem.cssText to nothing to reduce memory footprint.
+    setCss('');
+    modElem = inputElem = null;
+
+    /*>>shiv*/
+    /**
+     * @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
+     */
+    ;(function(window, document) {
+        /*jshint evil:true */
+        /** version */
+        var version = '3.7.0';
+
+        /** Preset options */
+        var options = window.html5 || {};
+
+        /** Used to skip problem elements */
+        var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
+
+        /** Not all elements can be cloned in IE **/
+        var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
+
+        /** Detect whether the browser supports default html5 styles */
+        var supportsHtml5Styles;
+
+        /** Name of the expando, to work with multiple documents or to re-shiv one document */
+        var expando = '_html5shiv';
+
+        /** The id for the the documents expando */
+        var expanID = 0;
+
+        /** Cached data for each document */
+        var expandoData = {};
+
+        /** Detect whether the browser supports unknown elements */
+        var supportsUnknownElements;
+
+        (function() {
+          try {
+            var a = document.createElement('a');
+            a.innerHTML = '<xyz></xyz>';
+            //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
+            supportsHtml5Styles = ('hidden' in a);
+
+            supportsUnknownElements = a.childNodes.length == 1 || (function() {
+              // assign a false positive if unable to shiv
+              (document.createElement)('a');
+              var frag = document.createDocumentFragment();
+              return (
+                typeof frag.cloneNode == 'undefined' ||
+                typeof frag.createDocumentFragment == 'undefined' ||
+                typeof frag.createElement == 'undefined'
+              );
+            }());
+          } catch(e) {
+            // assign a false positive if detection fails => unable to shiv
+            supportsHtml5Styles = true;
+            supportsUnknownElements = true;
+          }
+
+        }());
+
+        /*--------------------------------------------------------------------------*/
+
+        /**
+         * Creates a style sheet with the given CSS text and adds it to the document.
+         * @private
+         * @param {Document} ownerDocument The document.
+         * @param {String} cssText The CSS text.
+         * @returns {StyleSheet} The style element.
+         */
+        function addStyleSheet(ownerDocument, cssText) {
+          var p = ownerDocument.createElement('p'),
+          parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
+
+          p.innerHTML = 'x<style>' + cssText + '</style>';
+          return parent.insertBefore(p.lastChild, parent.firstChild);
+        }
+
+        /**
+         * Returns the value of `html5.elements` as an array.
+         * @private
+         * @returns {Array} An array of shived element node names.
+         */
+        function getElements() {
+          var elements = html5.elements;
+          return typeof elements == 'string' ? elements.split(' ') : elements;
+        }
+
+        /**
+         * Returns the data associated to the given document
+         * @private
+         * @param {Document} ownerDocument The document.
+         * @returns {Object} An object of data.
+         */
+        function getExpandoData(ownerDocument) {
+          var data = expandoData[ownerDocument[expando]];
+          if (!data) {
+            data = {};
+            expanID++;
+            ownerDocument[expando] = expanID;
+            expandoData[expanID] = data;
+          }
+          return data;
+        }
+
+        /**
+         * returns a shived element for the given nodeName and document
+         * @memberOf html5
+         * @param {String} nodeName name of the element
+         * @param {Document} ownerDocument The context document.
+         * @returns {Object} The shived element.
+         */
+        function createElement(nodeName, ownerDocument, data){
+          if (!ownerDocument) {
+            ownerDocument = document;
+          }
+          if(supportsUnknownElements){
+            return ownerDocument.createElement(nodeName);
+          }
+          if (!data) {
+            data = getExpandoData(ownerDocument);
+          }
+          var node;
+
+          if (data.cache[nodeName]) {
+            node = data.cache[nodeName].cloneNode();
+          } else if (saveClones.test(nodeName)) {
+            node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
+          } else {
+            node = data.createElem(nodeName);
+          }
+
+          // Avoid adding some elements to fragments in IE < 9 because
+          // * Attributes like `name` or `type` cannot be set/changed once an element
+          //   is inserted into a document/fragment
+          // * Link elements with `src` attributes that are inaccessible, as with
+          //   a 403 response, will cause the tab/window to crash
+          // * Script elements appended to fragments will execute when their `src`
+          //   or `text` property is set
+          return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
+        }
+
+        /**
+         * returns a shived DocumentFragment for the given document
+         * @memberOf html5
+         * @param {Document} ownerDocument The context document.
+         * @returns {Object} The shived DocumentFragment.
+         */
+        function createDocumentFragment(ownerDocument, data){
+          if (!ownerDocument) {
+            ownerDocument = document;
+          }
+          if(supportsUnknownElements){
+            return ownerDocument.createDocumentFragment();
+          }
+          data = data || getExpandoData(ownerDocument);
+          var clone = data.frag.cloneNode(),
+          i = 0,
+          elems = getElements(),
+          l = elems.length;
+          for(;i<l;i++){
+            clone.createElement(elems[i]);
+          }
+          return clone;
+        }
+
+        /**
+         * Shivs the `createElement` and `createDocumentFragment` methods of the document.
+         * @private
+         * @param {Document|DocumentFragment} ownerDocument The document.
+         * @param {Object} data of the document.
+         */
+        function shivMethods(ownerDocument, data) {
+          if (!data.cache) {
+            data.cache = {};
+            data.createElem = ownerDocument.createElement;
+            data.createFrag = ownerDocument.createDocumentFragment;
+            data.frag = data.createFrag();
+          }
+
+
+          ownerDocument.createElement = function(nodeName) {
+            //abort shiv
+            if (!html5.shivMethods) {
+              return data.createElem(nodeName);
+            }
+            return createElement(nodeName, ownerDocument, data);
+          };
+
+          ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
+                                                          'var n=f.cloneNode(),c=n.createElement;' +
+                                                          'h.shivMethods&&(' +
+                                                          // unroll the `createElement` calls
+                                                          getElements().join().replace(/[\w\-]+/g, function(nodeName) {
+            data.createElem(nodeName);
+            data.frag.createElement(nodeName);
+            return 'c("' + nodeName + '")';
+          }) +
+            ');return n}'
+                                                         )(html5, data.frag);
+        }
+
+        /*--------------------------------------------------------------------------*/
+
+        /**
+         * Shivs the given document.
+         * @memberOf html5
+         * @param {Document} ownerDocument The document to shiv.
+         * @returns {Document} The shived document.
+         */
+        function shivDocument(ownerDocument) {
+          if (!ownerDocument) {
+            ownerDocument = document;
+          }
+          var data = getExpandoData(ownerDocument);
+
+          if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
+            data.hasCSS = !!addStyleSheet(ownerDocument,
+                                          // corrects block display not defined in IE6/7/8/9
+                                          'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +
+                                            // adds styling not present in IE6/7/8/9
+                                            'mark{background:#FF0;color:#000}' +
+                                            // hides non-rendered elements
+                                            'template{display:none}'
+                                         );
+          }
+          if (!supportsUnknownElements) {
+            shivMethods(ownerDocument, data);
+          }
+          return ownerDocument;
+        }
+
+        /*--------------------------------------------------------------------------*/
+
+        /**
+         * The `html5` object is exposed so that more elements can be shived and
+         * existing shiving can be detected on iframes.
+         * @type Object
+         * @example
+         *
+         * // options can be changed before the script is included
+         * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
+         */
+        var html5 = {
+
+          /**
+           * An array or space separated string of node names of the elements to shiv.
+           * @memberOf html5
+           * @type Array|String
+           */
+          'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video',
+
+          /**
+           * current version of html5shiv
+           */
+          'version': version,
+
+          /**
+           * A flag to indicate that the HTML5 style sheet should be inserted.
+           * @memberOf html5
+           * @type Boolean
+           */
+          'shivCSS': (options.shivCSS !== false),
+
+          /**
+           * Is equal to true if a browser supports creating unknown/HTML5 elements
+           * @memberOf html5
+           * @type boolean
+           */
+          'supportsUnknownElements': supportsUnknownElements,
+
+          /**
+           * A flag to indicate that the document's `createElement` and `createDocumentFragment`
+           * methods should be overwritten.
+           * @memberOf html5
+           * @type Boolean
+           */
+          'shivMethods': (options.shivMethods !== false),
+
+          /**
+           * A string to describe the type of `html5` object ("default" or "default print").
+           * @memberOf html5
+           * @type String
+           */
+          'type': 'default',
+
+          // shivs the document according to the specified `html5` object options
+          'shivDocument': shivDocument,
+
+          //creates a shived element
+          createElement: createElement,
+
+          //creates a shived documentFragment
+          createDocumentFragment: createDocumentFragment
+        };
+
+        /*--------------------------------------------------------------------------*/
+
+        // expose html5
+        window.html5 = html5;
+
+        // shiv the document
+        shivDocument(document);
+
+    }(this, document));
+    /*>>shiv*/
+
+    // Assign private properties to the return object with prefix
+    Modernizr._version      = version;
+
+    // expose these for the plugin API. Look in the source for how to join() them against your input
+    /*>>prefixes*/
+    Modernizr._prefixes     = prefixes;
+    /*>>prefixes*/
+    /*>>domprefixes*/
+    Modernizr._domPrefixes  = domPrefixes;
+    Modernizr._cssomPrefixes  = cssomPrefixes;
+    /*>>domprefixes*/
+
+    /*>>mq*/
+    // Modernizr.mq tests a given media query, live against the current state of the window
+    // A few important notes:
+    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false
+    //   * A max-width or orientation query will be evaluated against the current state, which may change later.
+    //   * You must specify values. Eg. If you are testing support for the min-width media query use:
+    //       Modernizr.mq('(min-width:0)')
+    // usage:
+    // Modernizr.mq('only screen and (max-width:768)')
+    Modernizr.mq            = testMediaQuery;
+    /*>>mq*/
+
+    /*>>hasevent*/
+    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on
+    // Modernizr.hasEvent('gesturestart', elem)
+    Modernizr.hasEvent      = isEventSupported;
+    /*>>hasevent*/
+
+    /*>>testprop*/
+    // Modernizr.testProp() investigates whether a given style property is recognized
+    // Note that the property names must be provided in the camelCase variant.
+    // Modernizr.testProp('pointerEvents')
+    Modernizr.testProp      = function(prop){
+        return testProps([prop]);
+    };
+    /*>>testprop*/
+
+    /*>>testallprops*/
+    // Modernizr.testAllProps() investigates whether a given style property,
+    //   or any of its vendor-prefixed variants, is recognized
+    // Note that the property names must be provided in the camelCase variant.
+    // Modernizr.testAllProps('boxSizing')
+    Modernizr.testAllProps  = testPropsAll;
+    /*>>testallprops*/
+
+
+    /*>>teststyles*/
+    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards
+    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })
+    Modernizr.testStyles    = injectElementWithStyles;
+    /*>>teststyles*/
+
+
+    /*>>prefixed*/
+    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input
+    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'
+
+    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.
+    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:
+    //
+    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');
+
+    // If you're trying to ascertain which transition end event to bind to, you might do something like...
+    //
+    //     var transEndEventNames = {
+    //       'WebkitTransition' : 'webkitTransitionEnd',
+    //       'MozTransition'    : 'transitionend',
+    //       'OTransition'      : 'oTransitionEnd',
+    //       'msTransition'     : 'MSTransitionEnd',
+    //       'transition'       : 'transitionend'
+    //     },
+    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];
+
+    Modernizr.prefixed      = function(prop, obj, elem){
+      if(!obj) {
+        return testPropsAll(prop, 'pfx');
+      } else {
+        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'
+        return testPropsAll(prop, obj, elem);
+      }
+    };
+    /*>>prefixed*/
+
+
+    /*>>cssclasses*/
+    // Remove "no-js" class from <html> element, if it exists:
+    docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') +
+
+                            // Add the new classes to the <html> element.
+                            (enableClasses ? ' js ' + classes.join(' ') : '');
+    /*>>cssclasses*/
+
+    return Modernizr;
+
+})(this, this.document);
+/* @preserve
+ * Leaflet 1.7.1, a JS library for interactive maps. http://leafletjs.com
+ * (c) 2010-2019 Vladimir Agafonkin, (c) 2010-2011 CloudMade
+ */
+!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i(t.L={})}(this,function(t){"use strict";function h(t){for(var i,e,n=1,o=arguments.length;n<o;n++)for(i in e=arguments[n])t[i]=e[i];return t}var s=Object.create||function(t){return i.prototype=t,new i};function i(){}function p(t,i){var e=Array.prototype.slice;if(t.bind)return t.bind.apply(t,e.call(arguments,1));var n=e.call(arguments,2);return function(){return t.apply(i,n.length?n.concat(e.call(arguments)):arguments)}}var e=0;function m(t){return t._leaflet_id=t._leaflet_id||++e,t._leaflet_id}function n(t,i,e){var n,o,s=function(){n=!1,o&&(r.apply(e,o),o=!1)},r=function(){n?o=arguments:(t.apply(e,arguments),setTimeout(s,i),n=!0)};return r}function o(t,i,e){var n=i[1],o=i[0],s=n-o;return t===n&&e?t:((t-o)%s+s)%s+o}function a(){return!1}function r(t,i){var e=Math.pow(10,void 0===i?6:i);return Math.round(t*e)/e}function u(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function l(t){return u(t).split(/\s+/)}function c(t,i){for(var e in Object.prototype.hasOwnProperty.call(t,"options")||(t.options=t.options?s(t.options):{}),i)t.options[e]=i[e];return t.options}function _(t,i,e){var n=[];for(var o in t)n.push(encodeURIComponent(e?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(i&&-1!==i.indexOf("?")?"&":"?")+n.join("&")}var d=/\{ *([\w_-]+) *\}/g;function f(t,n){return t.replace(d,function(t,i){var e=n[i];if(void 0===e)throw new Error("No value provided for variable "+t);return"function"==typeof e&&(e=e(n)),e})}var g=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)};function v(t,i){for(var e=0;e<t.length;e++)if(t[e]===i)return e;return-1}var y="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=";function x(t){return window["webkit"+t]||window["moz"+t]||window["ms"+t]}var w=0;function P(t){var i=+new Date,e=Math.max(0,16-(i-w));return w=i+e,window.setTimeout(t,e)}var b=window.requestAnimationFrame||x("RequestAnimationFrame")||P,T=window.cancelAnimationFrame||x("CancelAnimationFrame")||x("CancelRequestAnimationFrame")||function(t){window.clearTimeout(t)};function M(t,i,e){if(!e||b!==P)return b.call(window,p(t,i));t.call(i)}function z(t){t&&T.call(window,t)}var C={extend:h,create:s,bind:p,lastId:e,stamp:m,throttle:n,wrapNum:o,falseFn:a,formatNum:r,trim:u,splitWords:l,setOptions:c,getParamString:_,template:f,isArray:g,indexOf:v,emptyImageUrl:y,requestFn:b,cancelFn:T,requestAnimFrame:M,cancelAnimFrame:z};function S(){}S.extend=function(t){function i(){this.initialize&&this.initialize.apply(this,arguments),this.callInitHooks()}var e=i.__super__=this.prototype,n=s(e);for(var o in(n.constructor=i).prototype=n,this)Object.prototype.hasOwnProperty.call(this,o)&&"prototype"!==o&&"__super__"!==o&&(i[o]=this[o]);return t.statics&&(h(i,t.statics),delete t.statics),t.includes&&(function(t){if("undefined"==typeof L||!L||!L.Mixin)return;t=g(t)?t:[t];for(var i=0;i<t.length;i++)t[i]===L.Mixin.Events&&console.warn("Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.",(new Error).stack)}(t.includes),h.apply(null,[n].concat(t.includes)),delete t.includes),n.options&&(t.options=h(s(n.options),t.options)),h(n,t),n._initHooks=[],n.callInitHooks=function(){if(!this._initHooksCalled){e.callInitHooks&&e.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,i=n._initHooks.length;t<i;t++)n._initHooks[t].call(this)}},i},S.include=function(t){return h(this.prototype,t),this},S.mergeOptions=function(t){return h(this.prototype.options,t),this},S.addInitHook=function(t){var i=Array.prototype.slice.call(arguments,1),e="function"==typeof t?t:function(){this[t].apply(this,i)};return this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(e),this};var Z={on:function(t,i,e){if("object"==typeof t)for(var n in t)this._on(n,t[n],i);else for(var o=0,s=(t=l(t)).length;o<s;o++)this._on(t[o],i,e);return this},off:function(t,i,e){if(t)if("object"==typeof t)for(var n in t)this._off(n,t[n],i);else for(var o=0,s=(t=l(t)).length;o<s;o++)this._off(t[o],i,e);else delete this._events;return this},_on:function(t,i,e){this._events=this._events||{};var n=this._events[t];n||(n=[],this._events[t]=n),e===this&&(e=void 0);for(var o={fn:i,ctx:e},s=n,r=0,a=s.length;r<a;r++)if(s[r].fn===i&&s[r].ctx===e)return;s.push(o)},_off:function(t,i,e){var n,o,s;if(this._events&&(n=this._events[t]))if(i){if(e===this&&(e=void 0),n)for(o=0,s=n.length;o<s;o++){var r=n[o];if(r.ctx===e&&r.fn===i)return r.fn=a,this._firingCount&&(this._events[t]=n=n.slice()),void n.splice(o,1)}}else{for(o=0,s=n.length;o<s;o++)n[o].fn=a;delete this._events[t]}},fire:function(t,i,e){if(!this.listens(t,e))return this;var n=h({},i,{type:t,target:this,sourceTarget:i&&i.sourceTarget||this});if(this._events){var o=this._events[t];if(o){this._firingCount=this._firingCount+1||1;for(var s=0,r=o.length;s<r;s++){var a=o[s];a.fn.call(a.ctx||this,n)}this._firingCount--}}return e&&this._propagateEvent(n),this},listens:function(t,i){var e=this._events&&this._events[t];if(e&&e.length)return!0;if(i)for(var n in this._eventParents)if(this._eventParents[n].listens(t,i))return!0;return!1},once:function(t,i,e){if("object"==typeof t){for(var n in t)this.once(n,t[n],i);return this}var o=p(function(){this.off(t,i,e).off(t,o,e)},this);return this.on(t,i,e).on(t,o,e)},addEventParent:function(t){return this._eventParents=this._eventParents||{},this._eventParents[m(t)]=t,this},removeEventParent:function(t){return this._eventParents&&delete this._eventParents[m(t)],this},_propagateEvent:function(t){for(var i in this._eventParents)this._eventParents[i].fire(t.type,h({layer:t.target,propagatedFrom:t.target},t),!0)}};Z.addEventListener=Z.on,Z.removeEventListener=Z.clearAllEventListeners=Z.off,Z.addOneTimeEventListener=Z.once,Z.fireEvent=Z.fire,Z.hasEventListeners=Z.listens;var E=S.extend(Z);function k(t,i,e){this.x=e?Math.round(t):t,this.y=e?Math.round(i):i}var B=Math.trunc||function(t){return 0<t?Math.floor(t):Math.ceil(t)};function A(t,i,e){return t instanceof k?t:g(t)?new k(t[0],t[1]):null==t?t:"object"==typeof t&&"x"in t&&"y"in t?new k(t.x,t.y):new k(t,i,e)}function I(t,i){if(t)for(var e=i?[t,i]:t,n=0,o=e.length;n<o;n++)this.extend(e[n])}function O(t,i){return!t||t instanceof I?t:new I(t,i)}function R(t,i){if(t)for(var e=i?[t,i]:t,n=0,o=e.length;n<o;n++)this.extend(e[n])}function N(t,i){return t instanceof R?t:new R(t,i)}function D(t,i,e){if(isNaN(t)||isNaN(i))throw new Error("Invalid LatLng object: ("+t+", "+i+")");this.lat=+t,this.lng=+i,void 0!==e&&(this.alt=+e)}function j(t,i,e){return t instanceof D?t:g(t)&&"object"!=typeof t[0]?3===t.length?new D(t[0],t[1],t[2]):2===t.length?new D(t[0],t[1]):null:null==t?t:"object"==typeof t&&"lat"in t?new D(t.lat,"lng"in t?t.lng:t.lon,t.alt):void 0===i?null:new D(t,i,e)}k.prototype={clone:function(){return new k(this.x,this.y)},add:function(t){return this.clone()._add(A(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(A(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},scaleBy:function(t){return new k(this.x*t.x,this.y*t.y)},unscaleBy:function(t){return new k(this.x/t.x,this.y/t.y)},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.clone()._ceil()},_ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},trunc:function(){return this.clone()._trunc()},_trunc:function(){return this.x=B(this.x),this.y=B(this.y),this},distanceTo:function(t){var i=(t=A(t)).x-this.x,e=t.y-this.y;return Math.sqrt(i*i+e*e)},equals:function(t){return(t=A(t)).x===this.x&&t.y===this.y},contains:function(t){return t=A(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+r(this.x)+", "+r(this.y)+")"}},I.prototype={extend:function(t){return t=A(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new k((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new k(this.min.x,this.max.y)},getTopRight:function(){return new k(this.max.x,this.min.y)},getTopLeft:function(){return this.min},getBottomRight:function(){return this.max},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var i,e;return(t=("number"==typeof t[0]||t instanceof k?A:O)(t))instanceof I?(i=t.min,e=t.max):i=e=t,i.x>=this.min.x&&e.x<=this.max.x&&i.y>=this.min.y&&e.y<=this.max.y},intersects:function(t){t=O(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>=i.x&&n.x<=e.x,r=o.y>=i.y&&n.y<=e.y;return s&&r},overlaps:function(t){t=O(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>i.x&&n.x<e.x,r=o.y>i.y&&n.y<e.y;return s&&r},isValid:function(){return!(!this.min||!this.max)}},R.prototype={extend:function(t){var i,e,n=this._southWest,o=this._northEast;if(t instanceof D)e=i=t;else{if(!(t instanceof R))return t?this.extend(j(t)||N(t)):this;if(i=t._southWest,e=t._northEast,!i||!e)return this}return n||o?(n.lat=Math.min(i.lat,n.lat),n.lng=Math.min(i.lng,n.lng),o.lat=Math.max(e.lat,o.lat),o.lng=Math.max(e.lng,o.lng)):(this._southWest=new D(i.lat,i.lng),this._northEast=new D(e.lat,e.lng)),this},pad:function(t){var i=this._southWest,e=this._northEast,n=Math.abs(i.lat-e.lat)*t,o=Math.abs(i.lng-e.lng)*t;return new R(new D(i.lat-n,i.lng-o),new D(e.lat+n,e.lng+o))},getCenter:function(){return new D((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new D(this.getNorth(),this.getWest())},getSouthEast:function(){return new D(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t=("number"==typeof t[0]||t instanceof D||"lat"in t?j:N)(t);var i,e,n=this._southWest,o=this._northEast;return t instanceof R?(i=t.getSouthWest(),e=t.getNorthEast()):i=e=t,i.lat>=n.lat&&e.lat<=o.lat&&i.lng>=n.lng&&e.lng<=o.lng},intersects:function(t){t=N(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>=i.lat&&n.lat<=e.lat,r=o.lng>=i.lng&&n.lng<=e.lng;return s&&r},overlaps:function(t){t=N(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>i.lat&&n.lat<e.lat,r=o.lng>i.lng&&n.lng<e.lng;return s&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t,i){return!!t&&(t=N(t),this._southWest.equals(t.getSouthWest(),i)&&this._northEast.equals(t.getNorthEast(),i))},isValid:function(){return!(!this._southWest||!this._northEast)}};var W,H={latLngToPoint:function(t,i){var e=this.projection.project(t),n=this.scale(i);return this.transformation._transform(e,n)},pointToLatLng:function(t,i){var e=this.scale(i),n=this.transformation.untransform(t,e);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},unproject:function(t){return this.projection.unproject(t)},scale:function(t){return 256*Math.pow(2,t)},zoom:function(t){return Math.log(t/256)/Math.LN2},getProjectedBounds:function(t){if(this.infinite)return null;var i=this.projection.bounds,e=this.scale(t);return new I(this.transformation.transform(i.min,e),this.transformation.transform(i.max,e))},infinite:!(D.prototype={equals:function(t,i){return!!t&&(t=j(t),Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng))<=(void 0===i?1e-9:i))},toString:function(t){return"LatLng("+r(this.lat,t)+", "+r(this.lng,t)+")"},distanceTo:function(t){return F.distance(this,j(t))},wrap:function(){return F.wrapLatLng(this)},toBounds:function(t){var i=180*t/40075017,e=i/Math.cos(Math.PI/180*this.lat);return N([this.lat-i,this.lng-e],[this.lat+i,this.lng+e])},clone:function(){return new D(this.lat,this.lng,this.alt)}}),wrapLatLng:function(t){var i=this.wrapLng?o(t.lng,this.wrapLng,!0):t.lng;return new D(this.wrapLat?o(t.lat,this.wrapLat,!0):t.lat,i,t.alt)},wrapLatLngBounds:function(t){var i=t.getCenter(),e=this.wrapLatLng(i),n=i.lat-e.lat,o=i.lng-e.lng;if(0==n&&0==o)return t;var s=t.getSouthWest(),r=t.getNorthEast();return new R(new D(s.lat-n,s.lng-o),new D(r.lat-n,r.lng-o))}},F=h({},H,{wrapLng:[-180,180],R:6371e3,distance:function(t,i){var e=Math.PI/180,n=t.lat*e,o=i.lat*e,s=Math.sin((i.lat-t.lat)*e/2),r=Math.sin((i.lng-t.lng)*e/2),a=s*s+Math.cos(n)*Math.cos(o)*r*r,h=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));return this.R*h}}),U=6378137,V={R:U,MAX_LATITUDE:85.0511287798,project:function(t){var i=Math.PI/180,e=this.MAX_LATITUDE,n=Math.max(Math.min(e,t.lat),-e),o=Math.sin(n*i);return new k(this.R*t.lng*i,this.R*Math.log((1+o)/(1-o))/2)},unproject:function(t){var i=180/Math.PI;return new D((2*Math.atan(Math.exp(t.y/this.R))-Math.PI/2)*i,t.x*i/this.R)},bounds:new I([-(W=U*Math.PI),-W],[W,W])};function q(t,i,e,n){if(g(t))return this._a=t[0],this._b=t[1],this._c=t[2],void(this._d=t[3]);this._a=t,this._b=i,this._c=e,this._d=n}function G(t,i,e,n){return new q(t,i,e,n)}q.prototype={transform:function(t,i){return this._transform(t.clone(),i)},_transform:function(t,i){return i=i||1,t.x=i*(this._a*t.x+this._b),t.y=i*(this._c*t.y+this._d),t},untransform:function(t,i){return i=i||1,new k((t.x/i-this._b)/this._a,(t.y/i-this._d)/this._c)}};var K,Y=h({},F,{code:"EPSG:3857",projection:V,transformation:G(K=.5/(Math.PI*V.R),.5,-K,.5)}),X=h({},Y,{code:"EPSG:900913"});function J(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}function $(t,i){for(var e,n,o,s,r="",a=0,h=t.length;a<h;a++){for(e=0,n=(o=t[a]).length;e<n;e++)r+=(e?"L":"M")+(s=o[e]).x+" "+s.y;r+=i?Zt?"z":"x":""}return r||"M0 0"}var Q=document.documentElement.style,tt="ActiveXObject"in window,it=tt&&!document.addEventListener,et="msLaunchUri"in navigator&&!("documentMode"in document),nt=kt("webkit"),ot=kt("android"),st=kt("android 2")||kt("android 3"),rt=parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1],10),at=ot&&kt("Google")&&rt<537&&!("AudioNode"in window),ht=!!window.opera,ut=!et&&kt("chrome"),lt=kt("gecko")&&!nt&&!ht&&!tt,ct=!ut&&kt("safari"),_t=kt("phantom"),dt="OTransition"in Q,pt=0===navigator.platform.indexOf("Win"),mt=tt&&"transition"in Q,ft="WebKitCSSMatrix"in window&&"m11"in new window.WebKitCSSMatrix&&!st,gt="MozPerspective"in Q,vt=!window.L_DISABLE_3D&&(mt||ft||gt)&&!dt&&!_t,yt="undefined"!=typeof orientation||kt("mobile"),xt=yt&&nt,wt=yt&&ft,Pt=!window.PointerEvent&&window.MSPointerEvent,Lt=!(!window.PointerEvent&&!Pt),bt=!window.L_NO_TOUCH&&(Lt||"ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch),Tt=yt&&ht,Mt=yt&&lt,zt=1<(window.devicePixelRatio||window.screen.deviceXDPI/window.screen.logicalXDPI),Ct=function(){var t=!1;try{var i=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("testPassiveEventSupport",a,i),window.removeEventListener("testPassiveEventSupport",a,i)}catch(t){}return t}(),St=!!document.createElement("canvas").getContext,Zt=!(!document.createElementNS||!J("svg").createSVGRect),Et=!Zt&&function(){try{var t=document.createElement("div");t.innerHTML='<v:shape adj="1"/>';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(t){return!1}}();function kt(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var Bt={ie:tt,ielt9:it,edge:et,webkit:nt,android:ot,android23:st,androidStock:at,opera:ht,chrome:ut,gecko:lt,safari:ct,phantom:_t,opera12:dt,win:pt,ie3d:mt,webkit3d:ft,gecko3d:gt,any3d:vt,mobile:yt,mobileWebkit:xt,mobileWebkit3d:wt,msPointer:Pt,pointer:Lt,touch:bt,mobileOpera:Tt,mobileGecko:Mt,retina:zt,passiveEvents:Ct,canvas:St,svg:Zt,vml:Et},At=Pt?"MSPointerDown":"pointerdown",It=Pt?"MSPointerMove":"pointermove",Ot=Pt?"MSPointerUp":"pointerup",Rt=Pt?"MSPointerCancel":"pointercancel",Nt={},Dt=!1;function jt(t,i,e,n){function o(t){Ut(t,r)}var s,r,a,h,u,l,c,_;function d(t){t.pointerType===(t.MSPOINTER_TYPE_MOUSE||"mouse")&&0===t.buttons||Ut(t,h)}return"touchstart"===i?(u=t,l=e,c=n,_=p(function(t){t.MSPOINTER_TYPE_TOUCH&&t.pointerType===t.MSPOINTER_TYPE_TOUCH&&Ri(t),Ut(t,l)}),u["_leaflet_touchstart"+c]=_,u.addEventListener(At,_,!1),Dt||(document.addEventListener(At,Wt,!0),document.addEventListener(It,Ht,!0),document.addEventListener(Ot,Ft,!0),document.addEventListener(Rt,Ft,!0),Dt=!0)):"touchmove"===i?(h=e,(a=t)["_leaflet_touchmove"+n]=d,a.addEventListener(It,d,!1)):"touchend"===i&&(r=e,(s=t)["_leaflet_touchend"+n]=o,s.addEventListener(Ot,o,!1),s.addEventListener(Rt,o,!1)),this}function Wt(t){Nt[t.pointerId]=t}function Ht(t){Nt[t.pointerId]&&(Nt[t.pointerId]=t)}function Ft(t){delete Nt[t.pointerId]}function Ut(t,i){for(var e in t.touches=[],Nt)t.touches.push(Nt[e]);t.changedTouches=[t],i(t)}var Vt=Pt?"MSPointerDown":Lt?"pointerdown":"touchstart",qt=Pt?"MSPointerUp":Lt?"pointerup":"touchend",Gt="_leaflet_";var Kt,Yt,Xt,Jt,$t,Qt,ti=fi(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ii=fi(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),ei="webkitTransition"===ii||"OTransition"===ii?ii+"End":"transitionend";function ni(t){return"string"==typeof t?document.getElementById(t):t}function oi(t,i){var e,n=t.style[i]||t.currentStyle&&t.currentStyle[i];return n&&"auto"!==n||!document.defaultView||(n=(e=document.defaultView.getComputedStyle(t,null))?e[i]:null),"auto"===n?null:n}function si(t,i,e){var n=document.createElement(t);return n.className=i||"",e&&e.appendChild(n),n}function ri(t){var i=t.parentNode;i&&i.removeChild(t)}function ai(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function hi(t){var i=t.parentNode;i&&i.lastChild!==t&&i.appendChild(t)}function ui(t){var i=t.parentNode;i&&i.firstChild!==t&&i.insertBefore(t,i.firstChild)}function li(t,i){if(void 0!==t.classList)return t.classList.contains(i);var e=pi(t);return 0<e.length&&new RegExp("(^|\\s)"+i+"(\\s|$)").test(e)}function ci(t,i){var e;if(void 0!==t.classList)for(var n=l(i),o=0,s=n.length;o<s;o++)t.classList.add(n[o]);else li(t,i)||di(t,((e=pi(t))?e+" ":"")+i)}function _i(t,i){void 0!==t.classList?t.classList.remove(i):di(t,u((" "+pi(t)+" ").replace(" "+i+" "," ")))}function di(t,i){void 0===t.className.baseVal?t.className=i:t.className.baseVal=i}function pi(t){return t.correspondingElement&&(t=t.correspondingElement),void 0===t.className.baseVal?t.className:t.className.baseVal}function mi(t,i){"opacity"in t.style?t.style.opacity=i:"filter"in t.style&&function(t,i){var e=!1,n="DXImageTransform.Microsoft.Alpha";try{e=t.filters.item(n)}catch(t){if(1===i)return}i=Math.round(100*i),e?(e.Enabled=100!==i,e.Opacity=i):t.style.filter+=" progid:"+n+"(opacity="+i+")"}(t,i)}function fi(t){for(var i=document.documentElement.style,e=0;e<t.length;e++)if(t[e]in i)return t[e];return!1}function gi(t,i,e){var n=i||new k(0,0);t.style[ti]=(mt?"translate("+n.x+"px,"+n.y+"px)":"translate3d("+n.x+"px,"+n.y+"px,0)")+(e?" scale("+e+")":"")}function vi(t,i){t._leaflet_pos=i,vt?gi(t,i):(t.style.left=i.x+"px",t.style.top=i.y+"px")}function yi(t){return t._leaflet_pos||new k(0,0)}function xi(){zi(window,"dragstart",Ri)}function wi(){Si(window,"dragstart",Ri)}function Pi(t){for(;-1===t.tabIndex;)t=t.parentNode;t.style&&(Li(),Qt=($t=t).style.outline,t.style.outline="none",zi(window,"keydown",Li))}function Li(){$t&&($t.style.outline=Qt,Qt=$t=void 0,Si(window,"keydown",Li))}function bi(t){for(;!((t=t.parentNode).offsetWidth&&t.offsetHeight||t===document.body););return t}function Ti(t){var i=t.getBoundingClientRect();return{x:i.width/t.offsetWidth||1,y:i.height/t.offsetHeight||1,boundingClientRect:i}}Jt="onselectstart"in document?(Xt=function(){zi(window,"selectstart",Ri)},function(){Si(window,"selectstart",Ri)}):(Yt=fi(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]),Xt=function(){var t;Yt&&(t=document.documentElement.style,Kt=t[Yt],t[Yt]="none")},function(){Yt&&(document.documentElement.style[Yt]=Kt,Kt=void 0)});var Mi={TRANSFORM:ti,TRANSITION:ii,TRANSITION_END:ei,get:ni,getStyle:oi,create:si,remove:ri,empty:ai,toFront:hi,toBack:ui,hasClass:li,addClass:ci,removeClass:_i,setClass:di,getClass:pi,setOpacity:mi,testProp:fi,setTransform:gi,setPosition:vi,getPosition:yi,disableTextSelection:Xt,enableTextSelection:Jt,disableImageDrag:xi,enableImageDrag:wi,preventOutline:Pi,restoreOutline:Li,getSizedParentNode:bi,getScale:Ti};function zi(t,i,e,n){if("object"==typeof i)for(var o in i)ki(t,o,i[o],e);else for(var s=0,r=(i=l(i)).length;s<r;s++)ki(t,i[s],e,n);return this}var Ci="_leaflet_events";function Si(t,i,e,n){if("object"==typeof i)for(var o in i)Bi(t,o,i[o],e);else if(i)for(var s=0,r=(i=l(i)).length;s<r;s++)Bi(t,i[s],e,n);else{for(var a in t[Ci])Bi(t,a,t[Ci][a]);delete t[Ci]}return this}function Zi(){return Lt&&(!et&&!ct)}var Ei={mouseenter:"mouseover",mouseleave:"mouseout",wheel:!("onwheel"in window)&&"mousewheel"};function ki(i,t,e,n){var o=t+m(e)+(n?"_"+m(n):"");if(i[Ci]&&i[Ci][o])return this;var s,r,a,h,u,l,c=function(t){return e.call(n||i,t||window.event)},_=c;function d(t){if(Lt){if(!t.isPrimary)return;if("mouse"===t.pointerType)return}else if(1<t.touches.length)return;var i=Date.now(),e=i-(h||i);u=t.touches?t.touches[0]:t,l=0<e&&e<=250,h=i}function p(t){if(l&&!u.cancelBubble){if(Lt){if("mouse"===t.pointerType)return;var i,e,n={};for(e in u)i=u[e],n[e]=i&&i.bind?i.bind(u):i;u=n}u.type="dblclick",u.button=0,r(u),h=null}}Lt&&0===t.indexOf("touch")?jt(i,t,c,o):bt&&"dblclick"===t&&!Zi()?(r=c,l=!1,(s=i)[Gt+Vt+(a=o)]=d,s[Gt+qt+a]=p,s[Gt+"dblclick"+a]=r,s.addEventListener(Vt,d,!!Ct&&{passive:!1}),s.addEventListener(qt,p,!!Ct&&{passive:!1}),s.addEventListener("dblclick",r,!1)):"addEventListener"in i?"touchstart"===t||"touchmove"===t||"wheel"===t||"mousewheel"===t?i.addEventListener(Ei[t]||t,c,!!Ct&&{passive:!1}):"mouseenter"===t||"mouseleave"===t?(c=function(t){t=t||window.event,Vi(i,t)&&_(t)},i.addEventListener(Ei[t],c,!1)):i.addEventListener(t,_,!1):"attachEvent"in i&&i.attachEvent("on"+t,c),i[Ci]=i[Ci]||{},i[Ci][o]=c}function Bi(t,i,e,n){var o,s,r,a,h,u,l,c,_=i+m(e)+(n?"_"+m(n):""),d=t[Ci]&&t[Ci][_];if(!d)return this;Lt&&0===i.indexOf("touch")?(c=(u=t)["_leaflet_"+(l=i)+_],"touchstart"===l?u.removeEventListener(At,c,!1):"touchmove"===l?u.removeEventListener(It,c,!1):"touchend"===l&&(u.removeEventListener(Ot,c,!1),u.removeEventListener(Rt,c,!1))):bt&&"dblclick"===i&&!Zi()?(r=(o=t)[Gt+Vt+(s=_)],a=o[Gt+qt+s],h=o[Gt+"dblclick"+s],o.removeEventListener(Vt,r,!!Ct&&{passive:!1}),o.removeEventListener(qt,a,!!Ct&&{passive:!1}),o.removeEventListener("dblclick",h,!1)):"removeEventListener"in t?t.removeEventListener(Ei[i]||i,d,!1):"detachEvent"in t&&t.detachEvent("on"+i,d),t[Ci][_]=null}function Ai(t){return t.stopPropagation?t.stopPropagation():t.originalEvent?t.originalEvent._stopped=!0:t.cancelBubble=!0,Ui(t),this}function Ii(t){return ki(t,"wheel",Ai),this}function Oi(t){return zi(t,"mousedown touchstart dblclick",Ai),ki(t,"click",Fi),this}function Ri(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this}function Ni(t){return Ri(t),Ai(t),this}function Di(t,i){if(!i)return new k(t.clientX,t.clientY);var e=Ti(i),n=e.boundingClientRect;return new k((t.clientX-n.left)/e.x-i.clientLeft,(t.clientY-n.top)/e.y-i.clientTop)}var ji=pt&&ut?2*window.devicePixelRatio:lt?window.devicePixelRatio:1;function Wi(t){return et?t.wheelDeltaY/2:t.deltaY&&0===t.deltaMode?-t.deltaY/ji:t.deltaY&&1===t.deltaMode?20*-t.deltaY:t.deltaY&&2===t.deltaMode?60*-t.deltaY:t.deltaX||t.deltaZ?0:t.wheelDelta?(t.wheelDeltaY||t.wheelDelta)/2:t.detail&&Math.abs(t.detail)<32765?20*-t.detail:t.detail?t.detail/-32765*60:0}var Hi={};function Fi(t){Hi[t.type]=!0}function Ui(t){var i=Hi[t.type];return Hi[t.type]=!1,i}function Vi(t,i){var e=i.relatedTarget;if(!e)return!0;try{for(;e&&e!==t;)e=e.parentNode}catch(t){return!1}return e!==t}var qi={on:zi,off:Si,stopPropagation:Ai,disableScrollPropagation:Ii,disableClickPropagation:Oi,preventDefault:Ri,stop:Ni,getMousePosition:Di,getWheelDelta:Wi,fakeStop:Fi,skipped:Ui,isExternalTarget:Vi,addListener:zi,removeListener:Si},Gi=E.extend({run:function(t,i,e,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=e||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=yi(t),this._offset=i.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=M(this._animate,this),this._step()},_step:function(t){var i=new Date-this._startTime,e=1e3*this._duration;i<e?this._runFrame(this._easeOut(i/e),t):(this._runFrame(1),this._complete())},_runFrame:function(t,i){var e=this._startPos.add(this._offset.multiplyBy(t));i&&e._round(),vi(this._el,e),this.fire("step")},_complete:function(){z(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),Ki=E.extend({options:{crs:Y,center:void 0,zoom:void 0,minZoom:void 0,maxZoom:void 0,layers:[],maxBounds:void 0,renderer:void 0,zoomAnimation:!0,zoomAnimationThreshold:4,fadeAnimation:!0,markerZoomAnimation:!0,transform3DLimit:8388608,zoomSnap:1,zoomDelta:1,trackResize:!0},initialize:function(t,i){i=c(this,i),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._sizeChanged=!0,this._initContainer(t),this._initLayout(),this._onResize=p(this._onResize,this),this._initEvents(),i.maxBounds&&this.setMaxBounds(i.maxBounds),void 0!==i.zoom&&(this._zoom=this._limitZoom(i.zoom)),i.center&&void 0!==i.zoom&&this.setView(j(i.center),i.zoom,{reset:!0}),this.callInitHooks(),this._zoomAnimated=ii&&vt&&!Tt&&this.options.zoomAnimation,this._zoomAnimated&&(this._createAnimProxy(),zi(this._proxy,ei,this._catchTransitionEnd,this)),this._addLayers(this.options.layers)},setView:function(t,i,e){if((i=void 0===i?this._zoom:this._limitZoom(i),t=this._limitCenter(j(t),i,this.options.maxBounds),e=e||{},this._stop(),this._loaded&&!e.reset&&!0!==e)&&(void 0!==e.animate&&(e.zoom=h({animate:e.animate},e.zoom),e.pan=h({animate:e.animate,duration:e.duration},e.pan)),this._zoom!==i?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,i,e.zoom):this._tryAnimatedPan(t,e.pan)))return clearTimeout(this._sizeTimer),this;return this._resetView(t,i),this},setZoom:function(t,i){return this._loaded?this.setView(this.getCenter(),t,{zoom:i}):(this._zoom=t,this)},zoomIn:function(t,i){return t=t||(vt?this.options.zoomDelta:1),this.setZoom(this._zoom+t,i)},zoomOut:function(t,i){return t=t||(vt?this.options.zoomDelta:1),this.setZoom(this._zoom-t,i)},setZoomAround:function(t,i,e){var n=this.getZoomScale(i),o=this.getSize().divideBy(2),s=(t instanceof k?t:this.latLngToContainerPoint(t)).subtract(o).multiplyBy(1-1/n),r=this.containerPointToLatLng(o.add(s));return this.setView(r,i,{zoom:e})},_getBoundsCenterZoom:function(t,i){i=i||{},t=t.getBounds?t.getBounds():N(t);var e=A(i.paddingTopLeft||i.padding||[0,0]),n=A(i.paddingBottomRight||i.padding||[0,0]),o=this.getBoundsZoom(t,!1,e.add(n));if((o="number"==typeof i.maxZoom?Math.min(i.maxZoom,o):o)===1/0)return{center:t.getCenter(),zoom:o};var s=n.subtract(e).divideBy(2),r=this.project(t.getSouthWest(),o),a=this.project(t.getNorthEast(),o);return{center:this.unproject(r.add(a).divideBy(2).add(s),o),zoom:o}},fitBounds:function(t,i){if(!(t=N(t)).isValid())throw new Error("Bounds are not valid.");var e=this._getBoundsCenterZoom(t,i);return this.setView(e.center,e.zoom,i)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,i){return this.setView(t,this._zoom,{pan:i})},panBy:function(t,i){return i=i||{},(t=A(t).round()).x||t.y?(!0===i.animate||this.getSize().contains(t)?(this._panAnim||(this._panAnim=new Gi,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),i.noMoveStart||this.fire("movestart"),!1!==i.animate?(ci(this._mapPane,"leaflet-pan-anim"),e=this._getMapPanePos().subtract(t).round(),this._panAnim.run(this._mapPane,e,i.duration||.25,i.easeLinearity)):(this._rawPanBy(t),this.fire("move").fire("moveend"))):this._resetView(this.unproject(this.project(this.getCenter()).add(t)),this.getZoom()),this):this.fire("moveend");var e},flyTo:function(s,r,t){if(!1===(t=t||{}).animate||!vt)return this.setView(s,r,t);this._stop();var a=this.project(this.getCenter()),h=this.project(s),i=this.getSize(),u=this._zoom;s=j(s),r=void 0===r?u:r;var l=Math.max(i.x,i.y),n=l*this.getZoomScale(u,r),c=h.distanceTo(a)||1,_=1.42,o=_*_;function e(t){var i=(n*n-l*l+(t?-1:1)*o*o*c*c)/(2*(t?n:l)*o*c),e=Math.sqrt(i*i+1)-i;return e<1e-9?-18:Math.log(e)}function d(t){return(Math.exp(t)-Math.exp(-t))/2}function p(t){return(Math.exp(t)+Math.exp(-t))/2}var m=e(0);function f(t){return l*(p(m)*(d(i=m+_*t)/p(i))-d(m))/o;var i}var g=Date.now(),v=(e(1)-m)/_,y=t.duration?1e3*t.duration:1e3*v*.8;return this._moveStart(!0,t.noMoveStart),function t(){var i,e,n=(Date.now()-g)/y,o=(i=n,(1-Math.pow(1-i,1.5))*v);n<=1?(this._flyToFrame=M(t,this),this._move(this.unproject(a.add(h.subtract(a).multiplyBy(f(o)/c)),u),this.getScaleZoom(l/(e=o,l*(p(m)/p(m+_*e))),u),{flyTo:!0})):this._move(s,r)._moveEnd(!0)}.call(this),this},flyToBounds:function(t,i){var e=this._getBoundsCenterZoom(t,i);return this.flyTo(e.center,e.zoom,i)},setMaxBounds:function(t){return(t=N(t)).isValid()?(this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this.options.maxBounds=t,this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds)):(this.options.maxBounds=null,this.off("moveend",this._panInsideMaxBounds))},setMinZoom:function(t){var i=this.options.minZoom;return this.options.minZoom=t,this._loaded&&i!==t&&(this.fire("zoomlevelschange"),this.getZoom()<this.options.minZoom)?this.setZoom(t):this},setMaxZoom:function(t){var i=this.options.maxZoom;return this.options.maxZoom=t,this._loaded&&i!==t&&(this.fire("zoomlevelschange"),this.getZoom()>this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),n=this._limitCenter(e,this._zoom,N(t));return e.equals(n)||this.panTo(n,i),this._enforcingBounds=!1,this},panInside:function(t,i){var e,n,o=A((i=i||{}).paddingTopLeft||i.padding||[0,0]),s=A(i.paddingBottomRight||i.padding||[0,0]),r=this.getCenter(),a=this.project(r),h=this.project(t),u=this.getPixelBounds(),l=u.getSize().divideBy(2),c=O([u.min.add(o),u.max.subtract(s)]);return c.contains(h)||(this._enforcingBounds=!0,e=a.subtract(h),n=A(h.x+e.x,h.y+e.y),(h.x<c.min.x||h.x>c.max.x)&&(n.x=a.x-e.x,0<e.x?n.x+=l.x-o.x:n.x-=l.x-s.x),(h.y<c.min.y||h.y>c.max.y)&&(n.y=a.y-e.y,0<e.y?n.y+=l.y-o.y:n.y-=l.y-s.y),this.panTo(this.unproject(n),i),this._enforcingBounds=!1),this},invalidateSize:function(t){if(!this._loaded)return this;t=h({animate:!1,pan:!0},!0===t?{animate:!0}:t);var i=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var e=this.getSize(),n=i.divideBy(2).round(),o=e.divideBy(2).round(),s=n.subtract(o);return s.x||s.y?(t.animate&&t.pan?this.panBy(s):(t.pan&&this._rawPanBy(s),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(p(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:i,newSize:e})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){if(t=this._locateOptions=h({timeout:1e4,watch:!1},t),!("geolocation"in navigator))return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var i=p(this._handleGeolocationResponse,this),e=p(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(i,e,t):navigator.geolocation.getCurrentPosition(i,e,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var i=t.code,e=t.message||(1===i?"permission denied":2===i?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:i,message:"Geolocation error: "+e+"."})},_handleGeolocationResponse:function(t){var i,e=new D(t.coords.latitude,t.coords.longitude),n=e.toBounds(2*t.coords.accuracy),o=this._locateOptions;o.setView&&(i=this.getBoundsZoom(n),this.setView(e,o.maxZoom?Math.min(i,o.maxZoom):i));var s={latlng:e,bounds:n,timestamp:t.timestamp};for(var r in t.coords)"number"==typeof t.coords[r]&&(s[r]=t.coords[r]);this.fire("locationfound",s)},addHandler:function(t,i){if(!i)return this;var e=this[t]=new i(this);return this._handlers.push(e),this.options[t]&&e.enable(),this},remove:function(){if(this._initEvents(!0),this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}var t;for(t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),ri(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(z(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)ri(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,i){var e=si("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),i||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new R(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,i,e){t=N(t),e=A(e||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),a=t.getSouthEast(),h=this.getSize().subtract(e),u=O(this.project(a,n),this.project(r,n)).getSize(),l=vt?this.options.zoomSnap:1,c=h.x/u.x,_=h.y/u.y,d=i?Math.max(c,_):Math.min(c,_),n=this.getScaleZoom(d,n);return l&&(n=Math.round(n/(l/100))*(l/100),n=i?Math.ceil(n/l)*l:Math.floor(n/l)*l),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new k(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,i){var e=this._getTopLeftPoint(t,i);return new I(e,e.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,i){var e=this.options.crs;return i=void 0===i?this._zoom:i,e.scale(t)/e.scale(i)},getScaleZoom:function(t,i){var e=this.options.crs;i=void 0===i?this._zoom:i;var n=e.zoom(t*e.scale(i));return isNaN(n)?1/0:n},project:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.latLngToPoint(j(t),i)},unproject:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.pointToLatLng(A(t),i)},layerPointToLatLng:function(t){var i=A(t).add(this.getPixelOrigin());return this.unproject(i)},latLngToLayerPoint:function(t){return this.project(j(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(j(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(N(t))},distance:function(t,i){return this.options.crs.distance(j(t),j(i))},containerPointToLayerPoint:function(t){return A(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return A(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var i=this.containerPointToLayerPoint(A(t));return this.layerPointToLatLng(i)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(j(t)))},mouseEventToContainerPoint:function(t){return Di(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var i=this._container=ni(t);if(!i)throw new Error("Map container not found.");if(i._leaflet_id)throw new Error("Map container is already initialized.");zi(i,"scroll",this._onScroll,this),this._containerId=m(i)},_initLayout:function(){var t=this._container;this._fadeAnimated=this.options.fadeAnimation&&vt,ci(t,"leaflet-container"+(bt?" leaflet-touch":"")+(zt?" leaflet-retina":"")+(it?" leaflet-oldie":"")+(ct?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var i=oi(t,"position");"absolute"!==i&&"relative"!==i&&"fixed"!==i&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),vi(this._mapPane,new k(0,0)),this.createPane("tilePane"),this.createPane("shadowPane"),this.createPane("overlayPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(ci(t.markerPane,"leaflet-zoom-hide"),ci(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,i){vi(this._mapPane,new k(0,0));var e=!this._loaded;this._loaded=!0,i=this._limitZoom(i),this.fire("viewprereset");var n=this._zoom!==i;this._moveStart(n,!1)._move(t,i)._moveEnd(n),this.fire("viewreset"),e&&this.fire("load")},_moveStart:function(t,i){return t&&this.fire("zoomstart"),i||this.fire("movestart"),this},_move:function(t,i,e){void 0===i&&(i=this._zoom);var n=this._zoom!==i;return this._zoom=i,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),(n||e&&e.pinch)&&this.fire("zoom",e),this.fire("move",e)},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return z(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){vi(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={};var i=t?Si:zi;i((this._targets[m(this._container)]=this)._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&i(window,"resize",this._onResize,this),vt&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){z(this._resizeRequest),this._resizeRequest=M(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,n=[],o="mouseout"===i||"mouseover"===i,s=t.target||t.srcElement,r=!1;s;){if((e=this._targets[m(s)])&&("click"===i||"preclick"===i)&&!t._simulated&&this._draggableMoved(e)){r=!0;break}if(e&&e.listens(i,!0)){if(o&&!Vi(s,t))break;if(n.push(e),o)break}if(s===this._container)break;s=s.parentNode}return n.length||r||o||!Vi(s,t)||(n=[this]),n},_handleDOMEvent:function(t){var i;this._loaded&&!Ui(t)&&("mousedown"!==(i=t.type)&&"keypress"!==i&&"keyup"!==i&&"keydown"!==i||Pi(t.target||t.srcElement),this._fireDOMEvent(t,i))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,i,e){var n;if("click"===t.type&&((n=h({},t)).type="preclick",this._fireDOMEvent(n,n.type,e)),!t._stopped&&(e=(e||[]).concat(this._findEventTargets(t,i))).length){var o=e[0];"contextmenu"===i&&o.listens(i,!0)&&Ri(t);var s,r={originalEvent:t};"keypress"!==t.type&&"keydown"!==t.type&&"keyup"!==t.type&&(s=o.getLatLng&&(!o._radius||o._radius<=10),r.containerPoint=s?this.latLngToContainerPoint(o.getLatLng()):this.mouseEventToContainerPoint(t),r.layerPoint=this.containerPointToLayerPoint(r.containerPoint),r.latlng=s?o.getLatLng():this.layerPointToLatLng(r.layerPoint));for(var a=0;a<e.length;a++)if(e[a].fire(i,r,!0),r.originalEvent._stopped||!1===e[a].options.bubblingMouseEvents&&-1!==v(this._mouseEvents,i))return}},_draggableMoved:function(t){return(t=t.dragging&&t.dragging.enabled()?t:this).dragging&&t.dragging.moved()||this.boxZoom&&this.boxZoom.moved()},_clearHandlers:function(){for(var t=0,i=this._handlers.length;t<i;t++)this._handlers[t].disable()},whenReady:function(t,i){return this._loaded?t.call(i||this,{target:this}):this.on("load",t,i),this},_getMapPanePos:function(){return yi(this._mapPane)||new k(0,0)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(t,i){return(t&&void 0!==i?this._getNewPixelOrigin(t,i):this.getPixelOrigin()).subtract(this._getMapPanePos())},_getNewPixelOrigin:function(t,i){var e=this.getSize()._divideBy(2);return this.project(t,i)._subtract(e)._add(this._getMapPanePos())._round()},_latLngToNewLayerPoint:function(t,i,e){var n=this._getNewPixelOrigin(e,i);return this.project(t,i)._subtract(n)},_latLngBoundsToNewLayerBounds:function(t,i,e){var n=this._getNewPixelOrigin(e,i);return O([this.project(t.getSouthWest(),i)._subtract(n),this.project(t.getNorthWest(),i)._subtract(n),this.project(t.getSouthEast(),i)._subtract(n),this.project(t.getNorthEast(),i)._subtract(n)])},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,i,e){if(!e)return t;var n=this.project(t,i),o=this.getSize().divideBy(2),s=new I(n.subtract(o),n.add(o)),r=this._getBoundsOffset(s,e,i);return r.round().equals([0,0])?t:this.unproject(n.add(r),i)},_limitOffset:function(t,i){if(!i)return t;var e=this.getPixelBounds(),n=new I(e.min.add(t),e.max.add(t));return t.add(this._getBoundsOffset(n,i))},_getBoundsOffset:function(t,i,e){var n=O(this.project(i.getNorthEast(),e),this.project(i.getSouthWest(),e)),o=n.min.subtract(t.min),s=n.max.subtract(t.max);return new k(this._rebound(o.x,-s.x),this._rebound(o.y,-s.y))},_rebound:function(t,i){return 0<t+i?Math.round(t-i)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(i))},_limitZoom:function(t){var i=this.getMinZoom(),e=this.getMaxZoom(),n=vt?this.options.zoomSnap:1;return n&&(t=Math.round(t/n)*n),Math.max(i,Math.min(e,t))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){_i(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,i){var e=this._getCenterOffset(t)._trunc();return!(!0!==(i&&i.animate)&&!this.getSize().contains(e))&&(this.panBy(e,i),!0)},_createAnimProxy:function(){var t=this._proxy=si("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(t),this.on("zoomanim",function(t){var i=ti,e=this._proxy.style[i];gi(this._proxy,this.project(t.center,t.zoom),this.getZoomScale(t.zoom,1)),e===this._proxy.style[i]&&this._animatingZoom&&this._onZoomTransitionEnd()},this),this.on("load moveend",this._animMoveEnd,this),this._on("unload",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){ri(this._proxy),this.off("load moveend",this._animMoveEnd,this),delete this._proxy},_animMoveEnd:function(){var t=this.getCenter(),i=this.getZoom();gi(this._proxy,this.project(t,i),this.getZoomScale(i,1))},_catchTransitionEnd:function(t){this._animatingZoom&&0<=t.propertyName.indexOf("transform")&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,i,e){if(this._animatingZoom)return!0;if(e=e||{},!this._zoomAnimated||!1===e.animate||this._nothingToAnimate()||Math.abs(i-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(i),o=this._getCenterOffset(t)._divideBy(1-1/n);return!(!0!==e.animate&&!this.getSize().contains(o))&&(M(function(){this._moveStart(!0,!1)._animateZoom(t,i,!0)},this),!0)},_animateZoom:function(t,i,e,n){this._mapPane&&(e&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,ci(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:i,noUpdate:n}),setTimeout(p(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&_i(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),M(function(){this._moveEnd(!0)},this))}});function Yi(t){return new Xi(t)}var Xi=S.extend({options:{position:"topright"},initialize:function(t){c(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),n=t._controlCorners[e];return ci(i,"leaflet-control"),-1!==e.indexOf("bottom")?n.insertBefore(i,n.firstChild):n.appendChild(i),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(ri(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0<t.screenX&&0<t.screenY&&this._map.getContainer().focus()}});Ki.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.remove(),this},_initControlPos:function(){var n=this._controlCorners={},o="leaflet-",s=this._controlContainer=si("div",o+"control-container",this._container);function t(t,i){var e=o+t+" "+o+i;n[t+i]=si("div",e,s)}t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){for(var t in this._controlCorners)ri(this._controlCorners[t]);ri(this._controlContainer),delete this._controlCorners,delete this._controlContainer}});var Ji=Xi.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(t,i,e,n){return e<n?-1:n<e?1:0}},initialize:function(t,i,e){for(var n in c(this,e),this._layerControlInputs=[],this._layers=[],this._lastZIndex=0,this._handlingClick=!1,t)this._addLayer(t[n],n);for(n in i)this._addLayer(i[n],n,!0)},onAdd:function(t){this._initLayout(),this._update(),(this._map=t).on("zoomend",this._checkDisabledLayers,this);for(var i=0;i<this._layers.length;i++)this._layers[i].layer.on("add remove",this._onLayerChange,this);return this._container},addTo:function(t){return Xi.prototype.addTo.call(this,t),this._expandIfNotCollapsed()},onRemove:function(){this._map.off("zoomend",this._checkDisabledLayers,this);for(var t=0;t<this._layers.length;t++)this._layers[t].layer.off("add remove",this._onLayerChange,this)},addBaseLayer:function(t,i){return this._addLayer(t,i),this._map?this._update():this},addOverlay:function(t,i){return this._addLayer(t,i,!0),this._map?this._update():this},removeLayer:function(t){t.off("add remove",this._onLayerChange,this);var i=this._getLayer(m(t));return i&&this._layers.splice(this._layers.indexOf(i),1),this._map?this._update():this},expand:function(){ci(this._container,"leaflet-control-layers-expanded"),this._section.style.height=null;var t=this._map.getSize().y-(this._container.offsetTop+50);return t<this._section.clientHeight?(ci(this._section,"leaflet-control-layers-scrollbar"),this._section.style.height=t+"px"):_i(this._section,"leaflet-control-layers-scrollbar"),this._checkDisabledLayers(),this},collapse:function(){return _i(this._container,"leaflet-control-layers-expanded"),this},_initLayout:function(){var t="leaflet-control-layers",i=this._container=si("div",t),e=this.options.collapsed;i.setAttribute("aria-haspopup",!0),Oi(i),Ii(i);var n=this._section=si("section",t+"-list");e&&(this._map.on("click",this.collapse,this),ot||zi(i,{mouseenter:this.expand,mouseleave:this.collapse},this));var o=this._layersLink=si("a",t+"-toggle",i);o.href="#",o.title="Layers",bt?(zi(o,"click",Ni),zi(o,"click",this.expand,this)):zi(o,"focus",this.expand,this),e||this.expand(),this._baseLayersList=si("div",t+"-base",n),this._separator=si("div",t+"-separator",n),this._overlaysList=si("div",t+"-overlays",n),i.appendChild(n)},_getLayer:function(t){for(var i=0;i<this._layers.length;i++)if(this._layers[i]&&m(this._layers[i].layer)===t)return this._layers[i]},_addLayer:function(t,i,e){this._map&&t.on("add remove",this._onLayerChange,this),this._layers.push({layer:t,name:i,overlay:e}),this.options.sortLayers&&this._layers.sort(p(function(t,i){return this.options.sortFunction(t.layer,i.layer,t.name,i.name)},this)),this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex)),this._expandIfNotCollapsed()},_update:function(){if(!this._container)return this;ai(this._baseLayersList),ai(this._overlaysList),this._layerControlInputs=[];for(var t,i,e,n=0,o=0;o<this._layers.length;o++)e=this._layers[o],this._addItem(e),i=i||e.overlay,t=t||!e.overlay,n+=e.overlay?0:1;return this.options.hideSingleBase&&(t=t&&1<n,this._baseLayersList.style.display=t?"":"none"),this._separator.style.display=i&&t?"":"none",this},_onLayerChange:function(t){this._handlingClick||this._update();var i=this._getLayer(m(t.target)),e=i.overlay?"add"===t.type?"overlayadd":"overlayremove":"add"===t.type?"baselayerchange":null;e&&this._map.fire(e,i)},_createRadioElement:function(t,i){var e='<input type="radio" class="leaflet-control-layers-selector" name="'+t+'"'+(i?' checked="checked"':"")+"/>",n=document.createElement("div");return n.innerHTML=e,n.firstChild},_addItem:function(t){var i,e=document.createElement("label"),n=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement("input")).type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=n):i=this._createRadioElement("leaflet-base-layers_"+m(this),n),this._layerControlInputs.push(i),i.layerId=m(t.layer),zi(i,"click",this._onInputClick,this);var o=document.createElement("span");o.innerHTML=" "+t.name;var s=document.createElement("div");return e.appendChild(s),s.appendChild(i),s.appendChild(o),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){var t,i,e=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=e.length-1;0<=s;s--)t=e[s],i=this._getLayer(t.layerId).layer,t.checked?n.push(i):t.checked||o.push(i);for(s=0;s<o.length;s++)this._map.hasLayer(o[s])&&this._map.removeLayer(o[s]);for(s=0;s<n.length;s++)this._map.hasLayer(n[s])||this._map.addLayer(n[s]);this._handlingClick=!1,this._refocusOnMap()},_checkDisabledLayers:function(){for(var t,i,e=this._layerControlInputs,n=this._map.getZoom(),o=e.length-1;0<=o;o--)t=e[o],i=this._getLayer(t.layerId).layer,t.disabled=void 0!==i.options.minZoom&&n<i.options.minZoom||void 0!==i.options.maxZoom&&n>i.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),$i=Xi.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"&#x2212;",zoomOutTitle:"Zoom out"},onAdd:function(t){var i="leaflet-control-zoom",e=si("div",i+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,i+"-in",e,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,i+"-out",e,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),e},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoom<this._map.getMaxZoom()&&this._map.zoomIn(this._map.options.zoomDelta*(t.shiftKey?3:1))},_zoomOut:function(t){!this._disabled&&this._map._zoom>this._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,i,e,n,o){var s=si("a",e,n);return s.innerHTML=t,s.href="#",s.title=i,s.setAttribute("role","button"),s.setAttribute("aria-label",i),Oi(s),zi(s,"click",Ni),zi(s,"click",o,this),zi(s,"click",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i="leaflet-disabled";_i(this._zoomInButton,i),_i(this._zoomOutButton,i),!this._disabled&&t._zoom!==t.getMinZoom()||ci(this._zoomOutButton,i),!this._disabled&&t._zoom!==t.getMaxZoom()||ci(this._zoomInButton,i)}});Ki.mergeOptions({zoomControl:!0}),Ki.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new $i,this.addControl(this.zoomControl))});var Qi=Xi.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i="leaflet-control-scale",e=si("div",i),n=this.options;return this._addScales(n,i+"-line",e),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),e},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=si("div",i,e)),t.imperial&&(this._iScale=si("div",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,e=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(e)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t),e=i<1e3?i+" m":i/1e3+" km";this._updateScale(this._mScale,e,i/t)},_updateImperial:function(t){var i,e,n,o=3.2808399*t;5280<o?(i=o/5280,e=this._getRoundNum(i),this._updateScale(this._iScale,e+" mi",e/i)):(n=this._getRoundNum(o),this._updateScale(this._iScale,n+" ft",n/o))},_updateScale:function(t,i,e){t.style.width=Math.round(this.options.maxWidth*e)+"px",t.innerHTML=i},_getRoundNum:function(t){var i=Math.pow(10,(Math.floor(t)+"").length-1),e=t/i;return i*(e=10<=e?10:5<=e?5:3<=e?3:2<=e?2:1)}}),te=Xi.extend({options:{position:"bottomright",prefix:'<a href="https://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'},initialize:function(t){c(this,t),this._attributions={}},onAdd:function(t){for(var i in(t.attributionControl=this)._container=si("div","leaflet-control-attribution"),Oi(this._container),t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t=[];for(var i in this._attributions)this._attributions[i]&&t.push(i);var e=[];this.options.prefix&&e.push(this.options.prefix),t.length&&e.push(t.join(", ")),this._container.innerHTML=e.join(" | ")}}});Ki.mergeOptions({attributionControl:!0}),Ki.addInitHook(function(){this.options.attributionControl&&(new te).addTo(this)});Xi.Layers=Ji,Xi.Zoom=$i,Xi.Scale=Qi,Xi.Attribution=te,Yi.layers=function(t,i,e){return new Ji(t,i,e)},Yi.zoom=function(t){return new $i(t)},Yi.scale=function(t){return new Qi(t)},Yi.attribution=function(t){return new te(t)};var ie=S.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}});ie.addTo=function(t,i){return t.addHandler(i,this),this};var ee,ne={Events:Z},oe=bt?"touchstart mousedown":"mousedown",se={mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},re={mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"},ae=E.extend({options:{clickTolerance:3},initialize:function(t,i,e,n){c(this,n),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(zi(this._dragStartTarget,oe,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(ae._dragging===this&&this.finishDrag(),Si(this._dragStartTarget,oe,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var i,e;!t._simulated&&this._enabled&&(this._moved=!1,li(this._element,"leaflet-zoom-anim")||ae._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((ae._dragging=this)._preventOutline&&Pi(this._element),xi(),Xt(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=bi(this._element),this._startPoint=new k(i.clientX,i.clientY),this._parentScale=Ti(e),zi(document,re[t.type],this._onMove,this),zi(document,se[t.type],this._onUp,this))))},_onMove:function(t){var i,e;!t._simulated&&this._enabled&&(t.touches&&1<t.touches.length?this._moved=!0:((e=new k((i=t.touches&&1===t.touches.length?t.touches[0]:t).clientX,i.clientY)._subtract(this._startPoint)).x||e.y)&&(Math.abs(e.x)+Math.abs(e.y)<this.options.clickTolerance||(e.x/=this._parentScale.x,e.y/=this._parentScale.y,Ri(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=yi(this._element).subtract(e),ci(document.body,"leaflet-dragging"),this._lastTarget=t.target||t.srcElement,window.SVGElementInstance&&this._lastTarget instanceof window.SVGElementInstance&&(this._lastTarget=this._lastTarget.correspondingUseElement),ci(this._lastTarget,"leaflet-drag-target")),this._newPos=this._startPos.add(e),this._moving=!0,z(this._animRequest),this._lastEvent=t,this._animRequest=M(this._updatePosition,this,!0))))},_updatePosition:function(){var t={originalEvent:this._lastEvent};this.fire("predrag",t),vi(this._element,this._newPos),this.fire("drag",t)},_onUp:function(t){!t._simulated&&this._enabled&&this.finishDrag()},finishDrag:function(){for(var t in _i(document.body,"leaflet-dragging"),this._lastTarget&&(_i(this._lastTarget,"leaflet-drag-target"),this._lastTarget=null),re)Si(document,re[t],this._onMove,this),Si(document,se[t],this._onUp,this);wi(),Jt(),this._moved&&this._moving&&(z(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1,ae._dragging=!1}});function he(t,i){if(!i||!t.length)return t.slice();var e=i*i;return t=function(t,i){var e=t.length,n=new(typeof Uint8Array!=void 0+""?Uint8Array:Array)(e);n[0]=n[e-1]=1,function t(i,e,n,o,s){var r,a,h,u=0;for(a=o+1;a<=s-1;a++)h=de(i[a],i[o],i[s],!0),u<h&&(r=a,u=h);n<u&&(e[r]=1,t(i,e,n,o,r),t(i,e,n,r,s))}(t,n,i,0,e-1);var o,s=[];for(o=0;o<e;o++)n[o]&&s.push(t[o]);return s}(t=function(t,i){for(var e=[t[0]],n=1,o=0,s=t.length;n<s;n++)(function(t,i){var e=i.x-t.x,n=i.y-t.y;return e*e+n*n})(t[n],t[o])>i&&(e.push(t[n]),o=n);o<s-1&&e.push(t[s-1]);return e}(t,e),e)}function ue(t,i,e){return Math.sqrt(de(t,i,e,!0))}function le(t,i,e,n,o){var s,r,a,h=n?ee:_e(t,e),u=_e(i,e);for(ee=u;;){if(!(h|u))return[t,i];if(h&u)return!1;a=_e(r=ce(t,i,s=h||u,e,o),e),s===h?(t=r,h=a):(i=r,u=a)}}function ce(t,i,e,n,o){var s,r,a=i.x-t.x,h=i.y-t.y,u=n.min,l=n.max;return 8&e?(s=t.x+a*(l.y-t.y)/h,r=l.y):4&e?(s=t.x+a*(u.y-t.y)/h,r=u.y):2&e?(s=l.x,r=t.y+h*(l.x-t.x)/a):1&e&&(s=u.x,r=t.y+h*(u.x-t.x)/a),new k(s,r,o)}function _e(t,i){var e=0;return t.x<i.min.x?e|=1:t.x>i.max.x&&(e|=2),t.y<i.min.y?e|=4:t.y>i.max.y&&(e|=8),e}function de(t,i,e,n){var o,s=i.x,r=i.y,a=e.x-s,h=e.y-r,u=a*a+h*h;return 0<u&&(1<(o=((t.x-s)*a+(t.y-r)*h)/u)?(s=e.x,r=e.y):0<o&&(s+=a*o,r+=h*o)),a=t.x-s,h=t.y-r,n?a*a+h*h:new k(s,r)}function pe(t){return!g(t[0])||"object"!=typeof t[0][0]&&void 0!==t[0][0]}function me(t){return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."),pe(t)}var fe={simplify:he,pointToSegmentDistance:ue,closestPointOnSegment:function(t,i,e){return de(t,i,e)},clipSegment:le,_getEdgeIntersection:ce,_getBitCode:_e,_sqClosestPointOnSegment:de,isFlat:pe,_flat:me};function ge(t,i,e){for(var n,o,s,r,a,h,u,l=[1,4,2,8],c=0,_=t.length;c<_;c++)t[c]._code=_e(t[c],i);for(s=0;s<4;s++){for(h=l[s],n=[],c=0,o=(_=t.length)-1;c<_;o=c++)r=t[c],a=t[o],r._code&h?a._code&h||((u=ce(a,r,h,i,e))._code=_e(u,i),n.push(u)):(a._code&h&&((u=ce(a,r,h,i,e))._code=_e(u,i),n.push(u)),n.push(r));t=n}return t}var ve,ye={clipPolygon:ge},xe={project:function(t){return new k(t.lng,t.lat)},unproject:function(t){return new D(t.y,t.x)},bounds:new I([-180,-90],[180,90])},we={R:6378137,R_MINOR:6356752.314245179,bounds:new I([-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]),project:function(t){var i=Math.PI/180,e=this.R,n=t.lat*i,o=this.R_MINOR/e,s=Math.sqrt(1-o*o),r=s*Math.sin(n),a=Math.tan(Math.PI/4-n/2)/Math.pow((1-r)/(1+r),s/2),n=-e*Math.log(Math.max(a,1e-10));return new k(t.lng*i*e,n)},unproject:function(t){for(var i,e=180/Math.PI,n=this.R,o=this.R_MINOR/n,s=Math.sqrt(1-o*o),r=Math.exp(-t.y/n),a=Math.PI/2-2*Math.atan(r),h=0,u=.1;h<15&&1e-7<Math.abs(u);h++)i=s*Math.sin(a),i=Math.pow((1-i)/(1+i),s/2),a+=u=Math.PI/2-2*Math.atan(r*i)-a;return new D(a*e,t.x*e/n)}},Pe={LonLat:xe,Mercator:we,SphericalMercator:V},Le=h({},F,{code:"EPSG:3395",projection:we,transformation:G(ve=.5/(Math.PI*we.R),.5,-ve,.5)}),be=h({},F,{code:"EPSG:4326",projection:xe,transformation:G(1/180,1,-1/180,.5)}),Te=h({},H,{projection:xe,transformation:G(1,0,-1,0),scale:function(t){return Math.pow(2,t)},zoom:function(t){return Math.log(t)/Math.LN2},distance:function(t,i){var e=i.lng-t.lng,n=i.lat-t.lat;return Math.sqrt(e*e+n*n)},infinite:!0});H.Earth=F,H.EPSG3395=Le,H.EPSG3857=Y,H.EPSG900913=X,H.EPSG4326=be,H.Simple=Te;var Me=E.extend({options:{pane:"overlayPane",attribution:null,bubblingMouseEvents:!0},addTo:function(t){return t.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(t){return t&&t.removeLayer(this),this},getPane:function(t){return this._map.getPane(t?this.options[t]||t:this.options.pane)},addInteractiveTarget:function(t){return this._map._targets[m(t)]=this},removeInteractiveTarget:function(t){return delete this._map._targets[m(t)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(t){var i,e=t.target;e.hasLayer(this)&&(this._map=e,this._zoomAnimated=e._zoomAnimated,this.getEvents&&(i=this.getEvents(),e.on(i,this),this.once("remove",function(){e.off(i,this)},this)),this.onAdd(e),this.getAttribution&&e.attributionControl&&e.attributionControl.addAttribution(this.getAttribution()),this.fire("add"),e.fire("layeradd",{layer:this}))}});Ki.include({addLayer:function(t){if(!t._layerAdd)throw new Error("The provided object is not a Layer.");var i=m(t);return this._layers[i]||((this._layers[i]=t)._mapToAdd=this,t.beforeAdd&&t.beforeAdd(this),this.whenReady(t._layerAdd,t)),this},removeLayer:function(t){var i=m(t);return this._layers[i]&&(this._loaded&&t.onRemove(this),t.getAttribution&&this.attributionControl&&this.attributionControl.removeAttribution(t.getAttribution()),delete this._layers[i],this._loaded&&(this.fire("layerremove",{layer:t}),t.fire("remove")),t._map=t._mapToAdd=null),this},hasLayer:function(t){return!!t&&m(t)in this._layers},eachLayer:function(t,i){for(var e in this._layers)t.call(i,this._layers[e]);return this},_addLayers:function(t){for(var i=0,e=(t=t?g(t)?t:[t]:[]).length;i<e;i++)this.addLayer(t[i])},_addZoomLimit:function(t){!isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[m(t)]=t,this._updateZoomLevels())},_removeZoomLimit:function(t){var i=m(t);this._zoomBoundLayers[i]&&(delete this._zoomBoundLayers[i],this._updateZoomLevels())},_updateZoomLevels:function(){var t=1/0,i=-1/0,e=this._getZoomSpan();for(var n in this._zoomBoundLayers)var o=this._zoomBoundLayers[n].options,t=void 0===o.minZoom?t:Math.min(t,o.minZoom),i=void 0===o.maxZoom?i:Math.max(i,o.maxZoom);this._layersMaxZoom=i===-1/0?void 0:i,this._layersMinZoom=t===1/0?void 0:t,e!==this._getZoomSpan()&&this.fire("zoomlevelschange"),void 0===this.options.maxZoom&&this._layersMaxZoom&&this.getZoom()>this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()<this._layersMinZoom&&this.setZoom(this._layersMinZoom)}});var ze=Me.extend({initialize:function(t,i){var e,n;if(c(this,i),this._layers={},t)for(e=0,n=t.length;e<n;e++)this.addLayer(t[e])},addLayer:function(t){var i=this.getLayerId(t);return this._layers[i]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var i=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[i]&&this._map.removeLayer(this._layers[i]),delete this._layers[i],this},hasLayer:function(t){return!!t&&("number"==typeof t?t:this.getLayerId(t))in this._layers},clearLayers:function(){return this.eachLayer(this.removeLayer,this)},invoke:function(t){var i,e,n=Array.prototype.slice.call(arguments,1);for(i in this._layers)(e=this._layers[i])[t]&&e[t].apply(e,n);return this},onAdd:function(t){this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t)},eachLayer:function(t,i){for(var e in this._layers)t.call(i,this._layers[e]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];return this.eachLayer(t.push,t),t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:m}),Ce=ze.extend({addLayer:function(t){return this.hasLayer(t)?this:(t.addEventParent(this),ze.prototype.addLayer.call(this,t),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.removeEventParent(this),ze.prototype.removeLayer.call(this,t),this.fire("layerremove",{layer:t})):this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new R;for(var i in this._layers){var e=this._layers[i];t.extend(e.getBounds?e.getBounds():e.getLatLng())}return t}}),Se=S.extend({options:{popupAnchor:[0,0],tooltipAnchor:[0,0]},initialize:function(t){c(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,i){var e=this._getIconUrl(t);if(!e){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n=this._createImg(e,i&&"IMG"===i.tagName?i:null);return this._setIconStyles(n,t),n},_setIconStyles:function(t,i){var e=this.options,n=e[i+"Size"];"number"==typeof n&&(n=[n,n]);var o=A(n),s=A("shadow"===i&&e.shadowAnchor||e.iconAnchor||o&&o.divideBy(2,!0));t.className="leaflet-marker-"+i+" "+(e.className||""),s&&(t.style.marginLeft=-s.x+"px",t.style.marginTop=-s.y+"px"),o&&(t.style.width=o.x+"px",t.style.height=o.y+"px")},_createImg:function(t,i){return(i=i||document.createElement("img")).src=t,i},_getIconUrl:function(t){return zt&&this.options[t+"RetinaUrl"]||this.options[t+"Url"]}});var Ze=Se.extend({options:{iconUrl:"marker-icon.png",iconRetinaUrl:"marker-icon-2x.png",shadowUrl:"marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(t){return Ze.imagePath||(Ze.imagePath=this._detectIconPath()),(this.options.imagePath||Ze.imagePath)+Se.prototype._getIconUrl.call(this,t)},_detectIconPath:function(){var t=si("div","leaflet-default-icon-path",document.body),i=oi(t,"background-image")||oi(t,"backgroundImage");return document.body.removeChild(t),i=null===i||0!==i.indexOf("url")?"":i.replace(/^url\(["']?/,"").replace(/marker-icon\.png["']?\)$/,"")}}),Ee=ie.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new ae(t,t,!0)),this._draggable.on({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).enable(),ci(t,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).disable(),this._marker._icon&&_i(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_adjustPan:function(t){var i,e=this._marker,n=e._map,o=this._marker.options.autoPanSpeed,s=this._marker.options.autoPanPadding,r=yi(e._icon),a=n.getPixelBounds(),h=n.getPixelOrigin(),u=O(a.min._subtract(h).add(s),a.max._subtract(h).subtract(s));u.contains(r)||(i=A((Math.max(u.max.x,r.x)-u.max.x)/(a.max.x-u.max.x)-(Math.min(u.min.x,r.x)-u.min.x)/(a.min.x-u.min.x),(Math.max(u.max.y,r.y)-u.max.y)/(a.max.y-u.max.y)-(Math.min(u.min.y,r.y)-u.min.y)/(a.min.y-u.min.y)).multiplyBy(o),n.panBy(i,{animate:!1}),this._draggable._newPos._add(i),this._draggable._startPos._add(i),vi(e._icon,this._draggable._newPos),this._onDrag(t),this._panRequest=M(this._adjustPan.bind(this,t)))},_onDragStart:function(){this._oldLatLng=this._marker.getLatLng(),this._marker.closePopup&&this._marker.closePopup(),this._marker.fire("movestart").fire("dragstart")},_onPreDrag:function(t){this._marker.options.autoPan&&(z(this._panRequest),this._panRequest=M(this._adjustPan.bind(this,t)))},_onDrag:function(t){var i=this._marker,e=i._shadow,n=yi(i._icon),o=i._map.layerPointToLatLng(n);e&&vi(e,n),i._latlng=o,t.latlng=o,t.oldLatLng=this._oldLatLng,i.fire("move",t).fire("drag",t)},_onDragEnd:function(t){z(this._panRequest),delete this._oldLatLng,this._marker.fire("moveend").fire("dragend",t)}}),ke=Me.extend({options:{icon:new Ze,interactive:!0,keyboard:!0,title:"",alt:"",zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250,pane:"markerPane",shadowPane:"shadowPane",bubblingMouseEvents:!1,draggable:!1,autoPan:!1,autoPanPadding:[50,50],autoPanSpeed:10},initialize:function(t,i){c(this,i),this._latlng=j(t)},onAdd:function(t){this._zoomAnimated=this._zoomAnimated&&t.options.markerZoomAnimation,this._zoomAnimated&&t.on("zoomanim",this._animateZoom,this),this._initIcon(),this.update()},onRemove:function(t){this.dragging&&this.dragging.enabled()&&(this.options.draggable=!0,this.dragging.removeHooks()),delete this.dragging,this._zoomAnimated&&t.off("zoomanim",this._animateZoom,this),this._removeIcon(),this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(t){var i=this._latlng;return this._latlng=j(t),this.update(),this.fire("move",{oldLatLng:i,latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update()},getIcon:function(){return this.options.icon},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup,this._popup.options),this},getElement:function(){return this._icon},update:function(){var t;return this._icon&&this._map&&(t=this._map.latLngToLayerPoint(this._latlng).round(),this._setPos(t)),this},_initIcon:function(){var t=this.options,i="leaflet-zoom-"+(this._zoomAnimated?"animated":"hide"),e=t.icon.createIcon(this._icon),n=!1;e!==this._icon&&(this._icon&&this._removeIcon(),n=!0,t.title&&(e.title=t.title),"IMG"===e.tagName&&(e.alt=t.alt||"")),ci(e,i),t.keyboard&&(e.tabIndex="0"),this._icon=e,t.riseOnHover&&this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex});var o=t.icon.createShadow(this._shadow),s=!1;o!==this._shadow&&(this._removeShadow(),s=!0),o&&(ci(o,i),o.alt=""),this._shadow=o,t.opacity<1&&this._updateOpacity(),n&&this.getPane().appendChild(this._icon),this._initInteraction(),o&&s&&this.getPane(t.shadowPane).appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex}),ri(this._icon),this.removeInteractiveTarget(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&ri(this._shadow),this._shadow=null},_setPos:function(t){this._icon&&vi(this._icon,t),this._shadow&&vi(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon&&(this._icon.style.zIndex=this._zIndex+t)},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(i)},_initInteraction:function(){var t;this.options.interactive&&(ci(this._icon,"leaflet-interactive"),this.addInteractiveTarget(this._icon),Ee&&(t=this.options.draggable,this.dragging&&(t=this.dragging.enabled(),this.dragging.disable()),this.dragging=new Ee(this),t&&this.dragging.enable()))},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){var t=this.options.opacity;this._icon&&mi(this._icon,t),this._shadow&&mi(this._shadow,t)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor}});var Be=Me.extend({options:{stroke:!0,color:"#3388ff",weight:3,opacity:1,lineCap:"round",lineJoin:"round",dashArray:null,dashOffset:null,fill:!1,fillColor:null,fillOpacity:.2,fillRule:"evenodd",interactive:!0,bubblingMouseEvents:!0},beforeAdd:function(t){this._renderer=t.getRenderer(this)},onAdd:function(){this._renderer._initPath(this),this._reset(),this._renderer._addPath(this)},onRemove:function(){this._renderer._removePath(this)},redraw:function(){return this._map&&this._renderer._updatePath(this),this},setStyle:function(t){return c(this,t),this._renderer&&(this._renderer._updateStyle(this),this.options.stroke&&t&&Object.prototype.hasOwnProperty.call(t,"weight")&&this._updateBounds()),this},bringToFront:function(){return this._renderer&&this._renderer._bringToFront(this),this},bringToBack:function(){return this._renderer&&this._renderer._bringToBack(this),this},getElement:function(){return this._path},_reset:function(){this._project(),this._update()},_clickTolerance:function(){return(this.options.stroke?this.options.weight/2:0)+this._renderer.options.tolerance}}),Ae=Be.extend({options:{fill:!0,radius:10},initialize:function(t,i){c(this,i),this._latlng=j(t),this._radius=this.options.radius},setLatLng:function(t){var i=this._latlng;return this._latlng=j(t),this.redraw(),this.fire("move",{oldLatLng:i,latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius},setStyle:function(t){var i=t&&t.radius||this._radius;return Be.prototype.setStyle.call(this,t),this.setRadius(i),this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng),this._updateBounds()},_updateBounds:function(){var t=this._radius,i=this._radiusY||t,e=this._clickTolerance(),n=[t+e,i+e];this._pxBounds=new I(this._point.subtract(n),this._point.add(n))},_update:function(){this._map&&this._updatePath()},_updatePath:function(){this._renderer._updateCircle(this)},_empty:function(){return this._radius&&!this._renderer._bounds.intersects(this._pxBounds)},_containsPoint:function(t){return t.distanceTo(this._point)<=this._radius+this._clickTolerance()}});var Ie=Ae.extend({initialize:function(t,i,e){if("number"==typeof i&&(i=h({},e,{radius:i})),c(this,i),this._latlng=j(t),isNaN(this.options.radius))throw new Error("Circle radius cannot be NaN");this._mRadius=this.options.radius},setRadius:function(t){return this._mRadius=t,this.redraw()},getRadius:function(){return this._mRadius},getBounds:function(){var t=[this._radius,this._radiusY||this._radius];return new R(this._map.layerPointToLatLng(this._point.subtract(t)),this._map.layerPointToLatLng(this._point.add(t)))},setStyle:Be.prototype.setStyle,_project:function(){var t,i,e,n,o,s,r,a,h=this._latlng.lng,u=this._latlng.lat,l=this._map,c=l.options.crs;c.distance===F.distance?(t=Math.PI/180,i=this._mRadius/F.R/t,e=l.project([u+i,h]),n=l.project([u-i,h]),o=e.add(n).divideBy(2),s=l.unproject(o).lat,r=Math.acos((Math.cos(i*t)-Math.sin(u*t)*Math.sin(s*t))/(Math.cos(u*t)*Math.cos(s*t)))/t,!isNaN(r)&&0!==r||(r=i/Math.cos(Math.PI/180*u)),this._point=o.subtract(l.getPixelOrigin()),this._radius=isNaN(r)?0:o.x-l.project([s,h-r]).x,this._radiusY=o.y-e.y):(a=c.unproject(c.project(this._latlng).subtract([this._mRadius,0])),this._point=l.latLngToLayerPoint(this._latlng),this._radius=this._point.x-l.latLngToLayerPoint(a).x),this._updateBounds()}});var Oe=Be.extend({options:{smoothFactor:1,noClip:!1},initialize:function(t,i){c(this,i),this._setLatLngs(t)},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._setLatLngs(t),this.redraw()},isEmpty:function(){return!this._latlngs.length},closestLayerPoint:function(t){for(var i,e,n=1/0,o=null,s=de,r=0,a=this._parts.length;r<a;r++)for(var h=this._parts[r],u=1,l=h.length;u<l;u++){var c=s(t,i=h[u-1],e=h[u],!0);c<n&&(n=c,o=s(t,i,e))}return o&&(o.distance=Math.sqrt(n)),o},getCenter:function(){if(!this._map)throw new Error("Must add layer to map before using getCenter()");var t,i,e,n,o,s,r,a=this._rings[0],h=a.length;if(!h)return null;for(i=t=0;t<h-1;t++)i+=a[t].distanceTo(a[t+1])/2;if(0===i)return this._map.layerPointToLatLng(a[0]);for(n=t=0;t<h-1;t++)if(o=a[t],s=a[t+1],i<(n+=e=o.distanceTo(s)))return r=(n-i)/e,this._map.layerPointToLatLng([s.x-r*(s.x-o.x),s.y-r*(s.y-o.y)])},getBounds:function(){return this._bounds},addLatLng:function(t,i){return i=i||this._defaultShape(),t=j(t),i.push(t),this._bounds.extend(t),this.redraw()},_setLatLngs:function(t){this._bounds=new R,this._latlngs=this._convertLatLngs(t)},_defaultShape:function(){return pe(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(t){for(var i=[],e=pe(t),n=0,o=t.length;n<o;n++)e?(i[n]=j(t[n]),this._bounds.extend(i[n])):i[n]=this._convertLatLngs(t[n]);return i},_project:function(){var t=new I;this._rings=[],this._projectLatlngs(this._latlngs,this._rings,t),this._bounds.isValid()&&t.isValid()&&(this._rawPxBounds=t,this._updateBounds())},_updateBounds:function(){var t=this._clickTolerance(),i=new k(t,t);this._pxBounds=new I([this._rawPxBounds.min.subtract(i),this._rawPxBounds.max.add(i)])},_projectLatlngs:function(t,i,e){var n,o,s=t[0]instanceof D,r=t.length;if(s){for(o=[],n=0;n<r;n++)o[n]=this._map.latLngToLayerPoint(t[n]),e.extend(o[n]);i.push(o)}else for(n=0;n<r;n++)this._projectLatlngs(t[n],i,e)},_clipPoints:function(){var t=this._renderer._bounds;if(this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var i,e,n,o,s=this._parts,r=0,a=0,h=this._rings.length;r<h;r++)for(i=0,e=(o=this._rings[r]).length;i<e-1;i++)(n=le(o[i],o[i+1],t,i,!0))&&(s[a]=s[a]||[],s[a].push(n[0]),n[1]===o[i+1]&&i!==e-2||(s[a].push(n[1]),a++))},_simplifyPoints:function(){for(var t=this._parts,i=this.options.smoothFactor,e=0,n=t.length;e<n;e++)t[e]=he(t[e],i)},_update:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),this._updatePath())},_updatePath:function(){this._renderer._updatePoly(this)},_containsPoint:function(t,i){var e,n,o,s,r,a,h=this._clickTolerance();if(!this._pxBounds||!this._pxBounds.contains(t))return!1;for(e=0,s=this._parts.length;e<s;e++)for(n=0,o=(r=(a=this._parts[e]).length)-1;n<r;o=n++)if((i||0!==n)&&ue(t,a[o],a[n])<=h)return!0;return!1}});Oe._flat=me;var Re=Oe.extend({options:{fill:!0},isEmpty:function(){return!this._latlngs.length||!this._latlngs[0].length},getCenter:function(){if(!this._map)throw new Error("Must add layer to map before using getCenter()");var t,i,e,n,o,s,r,a,h,u=this._rings[0],l=u.length;if(!l)return null;for(t=s=r=a=0,i=l-1;t<l;i=t++)e=u[t],n=u[i],o=e.y*n.x-n.y*e.x,r+=(e.x+n.x)*o,a+=(e.y+n.y)*o,s+=3*o;return h=0===s?u[0]:[r/s,a/s],this._map.layerPointToLatLng(h)},_convertLatLngs:function(t){var i=Oe.prototype._convertLatLngs.call(this,t),e=i.length;return 2<=e&&i[0]instanceof D&&i[0].equals(i[e-1])&&i.pop(),i},_setLatLngs:function(t){Oe.prototype._setLatLngs.call(this,t),pe(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return pe(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var t=this._renderer._bounds,i=this.options.weight,e=new k(i,i),t=new I(t.min.subtract(e),t.max.add(e));if(this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var n,o=0,s=this._rings.length;o<s;o++)(n=ge(this._rings[o],t,!0)).length&&this._parts.push(n)},_updatePath:function(){this._renderer._updatePoly(this,!0)},_containsPoint:function(t){var i,e,n,o,s,r,a,h,u=!1;if(!this._pxBounds||!this._pxBounds.contains(t))return!1;for(o=0,a=this._parts.length;o<a;o++)for(s=0,r=(h=(i=this._parts[o]).length)-1;s<h;r=s++)e=i[s],n=i[r],e.y>t.y!=n.y>t.y&&t.x<(n.x-e.x)*(t.y-e.y)/(n.y-e.y)+e.x&&(u=!u);return u||Oe.prototype._containsPoint.call(this,t,!0)}});var Ne=Ce.extend({initialize:function(t,i){c(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,n,o=g(t)?t:t.features;if(o){for(i=0,e=o.length;i<e;i++)((n=o[i]).geometries||n.geometry||n.features||n.coordinates)&&this.addData(n);return this}var s=this.options;if(s.filter&&!s.filter(t))return this;var r=De(t,s);return r?(r.feature=qe(t),r.defaultOptions=r.options,this.resetStyle(r),s.onEachFeature&&s.onEachFeature(t,r),this.addLayer(r)):this},resetStyle:function(t){return void 0===t?this.eachLayer(this.resetStyle,this):(t.options=h({},t.defaultOptions),this._setLayerStyle(t,this.options.style),this)},setStyle:function(i){return this.eachLayer(function(t){this._setLayerStyle(t,i)},this)},_setLayerStyle:function(t,i){t.setStyle&&("function"==typeof i&&(i=i(t.feature)),t.setStyle(i))}});function De(t,i){var e,n,o,s,r="Feature"===t.type?t.geometry:t,a=r?r.coordinates:null,h=[],u=i&&i.pointToLayer,l=i&&i.coordsToLatLng||We;if(!a&&!r)return null;switch(r.type){case"Point":return je(u,t,e=l(a),i);case"MultiPoint":for(o=0,s=a.length;o<s;o++)e=l(a[o]),h.push(je(u,t,e,i));return new Ce(h);case"LineString":case"MultiLineString":return n=He(a,"LineString"===r.type?0:1,l),new Oe(n,i);case"Polygon":case"MultiPolygon":return n=He(a,"Polygon"===r.type?1:2,l),new Re(n,i);case"GeometryCollection":for(o=0,s=r.geometries.length;o<s;o++){var c=De({geometry:r.geometries[o],type:"Feature",properties:t.properties},i);c&&h.push(c)}return new Ce(h);default:throw new Error("Invalid GeoJSON object.")}}function je(t,i,e,n){return t?t(i,e):new ke(e,n&&n.markersInheritOptions&&n)}function We(t){return new D(t[1],t[0],t[2])}function He(t,i,e){for(var n,o=[],s=0,r=t.length;s<r;s++)n=i?He(t[s],i-1,e):(e||We)(t[s]),o.push(n);return o}function Fe(t,i){return i="number"==typeof i?i:6,void 0!==t.alt?[r(t.lng,i),r(t.lat,i),r(t.alt,i)]:[r(t.lng,i),r(t.lat,i)]}function Ue(t,i,e,n){for(var o=[],s=0,r=t.length;s<r;s++)o.push(i?Ue(t[s],i-1,e,n):Fe(t[s],n));return!i&&e&&o.push(o[0]),o}function Ve(t,i){return t.feature?h({},t.feature,{geometry:i}):qe(i)}function qe(t){return"Feature"===t.type||"FeatureCollection"===t.type?t:{type:"Feature",properties:{},geometry:t}}var Ge={toGeoJSON:function(t){return Ve(this,{type:"Point",coordinates:Fe(this.getLatLng(),t)})}};function Ke(t,i){return new Ne(t,i)}ke.include(Ge),Ie.include(Ge),Ae.include(Ge),Oe.include({toGeoJSON:function(t){var i=!pe(this._latlngs);return Ve(this,{type:(i?"Multi":"")+"LineString",coordinates:Ue(this._latlngs,i?1:0,!1,t)})}}),Re.include({toGeoJSON:function(t){var i=!pe(this._latlngs),e=i&&!pe(this._latlngs[0]),n=Ue(this._latlngs,e?2:i?1:0,!0,t);return i||(n=[n]),Ve(this,{type:(e?"Multi":"")+"Polygon",coordinates:n})}}),ze.include({toMultiPoint:function(i){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON(i).geometry.coordinates)}),Ve(this,{type:"MultiPoint",coordinates:e})},toGeoJSON:function(n){var t=this.feature&&this.feature.geometry&&this.feature.geometry.type;if("MultiPoint"===t)return this.toMultiPoint(n);var o="GeometryCollection"===t,s=[];return this.eachLayer(function(t){var i,e;t.toGeoJSON&&(i=t.toGeoJSON(n),o?s.push(i.geometry):"FeatureCollection"===(e=qe(i)).type?s.push.apply(s,e.features):s.push(e))}),o?Ve(this,{geometries:s,type:"GeometryCollection"}):{type:"FeatureCollection",features:s}}});var Ye=Ke,Xe=Me.extend({options:{opacity:1,alt:"",interactive:!1,crossOrigin:!1,errorOverlayUrl:"",zIndex:1,className:""},initialize:function(t,i,e){this._url=t,this._bounds=N(i),c(this,e)},onAdd:function(){this._image||(this._initImage(),this.options.opacity<1&&this._updateOpacity()),this.options.interactive&&(ci(this._image,"leaflet-interactive"),this.addInteractiveTarget(this._image)),this.getPane().appendChild(this._image),this._reset()},onRemove:function(){ri(this._image),this.options.interactive&&this.removeInteractiveTarget(this._image)},setOpacity:function(t){return this.options.opacity=t,this._image&&this._updateOpacity(),this},setStyle:function(t){return t.opacity&&this.setOpacity(t.opacity),this},bringToFront:function(){return this._map&&hi(this._image),this},bringToBack:function(){return this._map&&ui(this._image),this},setUrl:function(t){return this._url=t,this._image&&(this._image.src=t),this},setBounds:function(t){return this._bounds=N(t),this._map&&this._reset(),this},getEvents:function(){var t={zoom:this._reset,viewreset:this._reset};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var t="IMG"===this._url.tagName,i=this._image=t?this._url:si("img");ci(i,"leaflet-image-layer"),this._zoomAnimated&&ci(i,"leaflet-zoom-animated"),this.options.className&&ci(i,this.options.className),i.onselectstart=a,i.onmousemove=a,i.onload=p(this.fire,this,"load"),i.onerror=p(this._overlayOnError,this,"error"),!this.options.crossOrigin&&""!==this.options.crossOrigin||(i.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),this.options.zIndex&&this._updateZIndex(),t?this._url=i.src:(i.src=this._url,i.alt=this.options.alt)},_animateZoom:function(t){var i=this._map.getZoomScale(t.zoom),e=this._map._latLngBoundsToNewLayerBounds(this._bounds,t.zoom,t.center).min;gi(this._image,e,i)},_reset:function(){var t=this._image,i=new I(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),e=i.getSize();vi(t,i.min),t.style.width=e.x+"px",t.style.height=e.y+"px"},_updateOpacity:function(){mi(this._image,this.options.opacity)},_updateZIndex:function(){this._image&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._image.style.zIndex=this.options.zIndex)},_overlayOnError:function(){this.fire("error");var t=this.options.errorOverlayUrl;t&&this._url!==t&&(this._url=t,this._image.src=t)}}),Je=Xe.extend({options:{autoplay:!0,loop:!0,keepAspectRatio:!0,muted:!1},_initImage:function(){var t="VIDEO"===this._url.tagName,i=this._image=t?this._url:si("video");if(ci(i,"leaflet-image-layer"),this._zoomAnimated&&ci(i,"leaflet-zoom-animated"),this.options.className&&ci(i,this.options.className),i.onselectstart=a,i.onmousemove=a,i.onloadeddata=p(this.fire,this,"load"),t){for(var e=i.getElementsByTagName("source"),n=[],o=0;o<e.length;o++)n.push(e[o].src);this._url=0<e.length?n:[i.src]}else{g(this._url)||(this._url=[this._url]),!this.options.keepAspectRatio&&Object.prototype.hasOwnProperty.call(i.style,"objectFit")&&(i.style.objectFit="fill"),i.autoplay=!!this.options.autoplay,i.loop=!!this.options.loop,i.muted=!!this.options.muted;for(var s=0;s<this._url.length;s++){var r=si("source");r.src=this._url[s],i.appendChild(r)}}}});var $e=Xe.extend({_initImage:function(){var t=this._image=this._url;ci(t,"leaflet-image-layer"),this._zoomAnimated&&ci(t,"leaflet-zoom-animated"),this.options.className&&ci(t,this.options.className),t.onselectstart=a,t.onmousemove=a}});var Qe=Me.extend({options:{offset:[0,7],className:"",pane:"popupPane"},initialize:function(t,i){c(this,t),this._source=i},onAdd:function(t){this._zoomAnimated=t._zoomAnimated,this._container||this._initLayout(),t._fadeAnimated&&mi(this._container,0),clearTimeout(this._removeTimeout),this.getPane().appendChild(this._container),this.update(),t._fadeAnimated&&mi(this._container,1),this.bringToFront()},onRemove:function(t){t._fadeAnimated?(mi(this._container,0),this._removeTimeout=setTimeout(p(ri,void 0,this._container),200)):ri(this._container)},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=j(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},getElement:function(){return this._container},update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},getEvents:function(){var t={zoom:this._updatePosition,viewreset:this._updatePosition};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},isOpen:function(){return!!this._map&&this._map.hasLayer(this)},bringToFront:function(){return this._map&&hi(this._container),this},bringToBack:function(){return this._map&&ui(this._container),this},_prepareOpen:function(t,i,e){if(i instanceof Me||(e=i,i=t),i instanceof Ce)for(var n in t._layers){i=t._layers[n];break}if(!e)if(i.getCenter)e=i.getCenter();else{if(!i.getLatLng)throw new Error("Unable to get source layer LatLng.");e=i.getLatLng()}return this._source=i,this.update(),e},_updateContent:function(){if(this._content){var t=this._contentNode,i="function"==typeof this._content?this._content(this._source||this):this._content;if("string"==typeof i)t.innerHTML=i;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(i)}this.fire("contentupdate")}},_updatePosition:function(){var t,i,e,n,o;this._map&&(t=this._map.latLngToLayerPoint(this._latlng),i=A(this.options.offset),e=this._getAnchor(),this._zoomAnimated?vi(this._container,t.add(e)):i=i.add(t).add(e),n=this._containerBottom=-i.y,o=this._containerLeft=-Math.round(this._containerWidth/2)+i.x,this._container.style.bottom=n+"px",this._container.style.left=o+"px")},_getAnchor:function(){return[0,0]}}),tn=Qe.extend({options:{maxWidth:300,minWidth:50,maxHeight:null,autoPan:!0,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:!1,closeButton:!0,autoClose:!0,closeOnEscapeKey:!0,className:""},openOn:function(t){return t.openPopup(this),this},onAdd:function(t){Qe.prototype.onAdd.call(this,t),t.fire("popupopen",{popup:this}),this._source&&(this._source.fire("popupopen",{popup:this},!0),this._source instanceof Be||this._source.on("preclick",Ai))},onRemove:function(t){Qe.prototype.onRemove.call(this,t),t.fire("popupclose",{popup:this}),this._source&&(this._source.fire("popupclose",{popup:this},!0),this._source instanceof Be||this._source.off("preclick",Ai))},getEvents:function(){var t=Qe.prototype.getEvents.call(this);return(void 0!==this.options.closeOnClick?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t,i="leaflet-popup",e=this._container=si("div",i+" "+(this.options.className||"")+" leaflet-zoom-animated"),n=this._wrapper=si("div",i+"-content-wrapper",e);this._contentNode=si("div",i+"-content",n),Oi(e),Ii(this._contentNode),zi(e,"contextmenu",Ai),this._tipContainer=si("div",i+"-tip-container",e),this._tip=si("div",i+"-tip",this._tipContainer),this.options.closeButton&&((t=this._closeButton=si("a",i+"-close-button",e)).href="#close",t.innerHTML="&#215;",zi(t,"click",this._onCloseButtonClick,this))},_updateLayout:function(){var t=this._contentNode,i=t.style;i.width="",i.whiteSpace="nowrap";var e=t.offsetWidth,e=Math.min(e,this.options.maxWidth);e=Math.max(e,this.options.minWidth),i.width=e+1+"px",i.whiteSpace="",i.height="";var n=t.offsetHeight,o=this.options.maxHeight,s="leaflet-popup-scrolled";o&&o<n?(i.height=o+"px",ci(t,s)):_i(t,s),this._containerWidth=this._container.offsetWidth},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center),e=this._getAnchor();vi(this._container,i.add(e))},_adjustPan:function(){var t,i,e,n,o,s,r,a,h,u,l,c;this.options.autoPan&&(this._map._panAnim&&this._map._panAnim.stop(),t=this._map,i=parseInt(oi(this._container,"marginBottom"),10)||0,e=this._container.offsetHeight+i,n=this._containerWidth,(o=new k(this._containerLeft,-e-this._containerBottom))._add(yi(this._container)),s=t.layerPointToContainerPoint(o),r=A(this.options.autoPanPadding),a=A(this.options.autoPanPaddingTopLeft||r),h=A(this.options.autoPanPaddingBottomRight||r),u=t.getSize(),c=l=0,s.x+n+h.x>u.x&&(l=s.x+n-u.x+h.x),s.x-l-a.x<0&&(l=s.x-a.x),s.y+e+h.y>u.y&&(c=s.y+e-u.y+h.y),s.y-c-a.y<0&&(c=s.y-a.y),(l||c)&&t.fire("autopanstart").panBy([l,c]))},_onCloseButtonClick:function(t){this._close(),Ni(t)},_getAnchor:function(){return A(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});Ki.mergeOptions({closePopupOnClick:!0}),Ki.include({openPopup:function(t,i,e){return t instanceof tn||(t=new tn(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),Me.include({bindPopup:function(t,i){return t instanceof tn?(c(t,i),(this._popup=t)._source=this):(this._popup&&!i||(this._popup=new tn(i,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,i){return this._popup&&this._map&&(i=this._popup._prepareOpen(this,t,i),this._map.openPopup(this._popup,i)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var i=t.layer||t.target;this._popup&&this._map&&(Ni(t),i instanceof Be?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===i?this.closePopup():this.openPopup(i,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var en=Qe.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){Qe.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&this._source.fire("tooltipopen",{tooltip:this},!0)},onRemove:function(t){Qe.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&this._source.fire("tooltipclose",{tooltip:this},!0)},getEvents:function(){var t=Qe.prototype.getEvents.call(this);return bt&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=si("div",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i,e=this._map,n=this._container,o=e.latLngToContainerPoint(e.getCenter()),s=e.layerPointToContainerPoint(t),r=this.options.direction,a=n.offsetWidth,h=n.offsetHeight,u=A(this.options.offset),l=this._getAnchor(),c="top"===r?(i=a/2,h):"bottom"===r?(i=a/2,0):(i="center"===r?a/2:"right"===r?0:"left"===r?a:s.x<o.x?(r="right",0):(r="left",a+2*(u.x+l.x)),h/2);t=t.subtract(A(i,c,!0)).add(u).add(l),_i(n,"leaflet-tooltip-right"),_i(n,"leaflet-tooltip-left"),_i(n,"leaflet-tooltip-top"),_i(n,"leaflet-tooltip-bottom"),ci(n,"leaflet-tooltip-"+r),vi(n,t)},_updatePosition:function(){var t=this._map.latLngToLayerPoint(this._latlng);this._setPosition(t)},setOpacity:function(t){this.options.opacity=t,this._container&&mi(this._container,t)},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPosition(i)},_getAnchor:function(){return A(this._source&&this._source._getTooltipAnchor&&!this.options.sticky?this._source._getTooltipAnchor():[0,0])}});Ki.include({openTooltip:function(t,i,e){return t instanceof en||(t=new en(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:this.addLayer(t)},closeTooltip:function(t){return t&&this.removeLayer(t),this}}),Me.include({bindTooltip:function(t,i){return t instanceof en?(c(t,i),(this._tooltip=t)._source=this):(this._tooltip&&!i||(this._tooltip=new en(i,this)),this._tooltip.setContent(t)),this._initTooltipInteractions(),this._tooltip.options.permanent&&this._map&&this._map.hasLayer(this)&&this.openTooltip(),this},unbindTooltip:function(){return this._tooltip&&(this._initTooltipInteractions(!0),this.closeTooltip(),this._tooltip=null),this},_initTooltipInteractions:function(t){var i,e;!t&&this._tooltipHandlersAdded||(i=t?"off":"on",e={remove:this.closeTooltip,move:this._moveTooltip},this._tooltip.options.permanent?e.add=this._openTooltip:(e.mouseover=this._openTooltip,e.mouseout=this.closeTooltip,this._tooltip.options.sticky&&(e.mousemove=this._moveTooltip),bt&&(e.click=this._openTooltip)),this[i](e),this._tooltipHandlersAdded=!t)},openTooltip:function(t,i){return this._tooltip&&this._map&&(i=this._tooltip._prepareOpen(this,t,i),this._map.openTooltip(this._tooltip,i),this._tooltip.options.interactive&&this._tooltip._container&&(ci(this._tooltip._container,"leaflet-clickable"),this.addInteractiveTarget(this._tooltip._container))),this},closeTooltip:function(){return this._tooltip&&(this._tooltip._close(),this._tooltip.options.interactive&&this._tooltip._container&&(_i(this._tooltip._container,"leaflet-clickable"),this.removeInteractiveTarget(this._tooltip._container))),this},toggleTooltip:function(t){return this._tooltip&&(this._tooltip._map?this.closeTooltip():this.openTooltip(t)),this},isTooltipOpen:function(){return this._tooltip.isOpen()},setTooltipContent:function(t){return this._tooltip&&this._tooltip.setContent(t),this},getTooltip:function(){return this._tooltip},_openTooltip:function(t){var i=t.layer||t.target;this._tooltip&&this._map&&this.openTooltip(i,this._tooltip.options.sticky?t.latlng:void 0)},_moveTooltip:function(t){var i,e,n=t.latlng;this._tooltip.options.sticky&&t.originalEvent&&(i=this._map.mouseEventToContainerPoint(t.originalEvent),e=this._map.containerPointToLayerPoint(i),n=this._map.layerPointToLatLng(e)),this._tooltip.setLatLng(n)}});var nn=Se.extend({options:{iconSize:[12,12],html:!1,bgPos:null,className:"leaflet-div-icon"},createIcon:function(t){var i,e=t&&"DIV"===t.tagName?t:document.createElement("div"),n=this.options;return n.html instanceof Element?(ai(e),e.appendChild(n.html)):e.innerHTML=!1!==n.html?n.html:"",n.bgPos&&(i=A(n.bgPos),e.style.backgroundPosition=-i.x+"px "+-i.y+"px"),this._setIconStyles(e,"icon"),e},createShadow:function(){return null}});Se.Default=Ze;var on=Me.extend({options:{tileSize:256,opacity:1,updateWhenIdle:yt,updateWhenZooming:!0,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:void 0,maxNativeZoom:void 0,minNativeZoom:void 0,noWrap:!1,pane:"tilePane",className:"",keepBuffer:2},initialize:function(t){c(this,t)},onAdd:function(){this._initContainer(),this._levels={},this._tiles={},this._resetView(),this._update()},beforeAdd:function(t){t._addZoomLimit(this)},onRemove:function(t){this._removeAllTiles(),ri(this._container),t._removeZoomLimit(this),this._container=null,this._tileZoom=void 0},bringToFront:function(){return this._map&&(hi(this._container),this._setAutoZIndex(Math.max)),this},bringToBack:function(){return this._map&&(ui(this._container),this._setAutoZIndex(Math.min)),this},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},isLoading:function(){return this._loading},redraw:function(){return this._map&&(this._removeAllTiles(),this._update()),this},getEvents:function(){var t={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};return this.options.updateWhenIdle||(this._onMove||(this._onMove=n(this._onMoveEnd,this.options.updateInterval,this)),t.move=this._onMove),this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},createTile:function(){return document.createElement("div")},getTileSize:function(){var t=this.options.tileSize;return t instanceof k?t:new k(t,t)},_updateZIndex:function(){this._container&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t){for(var i,e=this.getPane().children,n=-t(-1/0,1/0),o=0,s=e.length;o<s;o++)i=e[o].style.zIndex,e[o]!==this._container&&i&&(n=t(n,+i));isFinite(n)&&(this.options.zIndex=n+t(-1,1),this._updateZIndex())},_updateOpacity:function(){if(this._map&&!it){mi(this._container,this.options.opacity);var t=+new Date,i=!1,e=!1;for(var n in this._tiles){var o,s=this._tiles[n];s.current&&s.loaded&&(o=Math.min(1,(t-s.loaded)/200),mi(s.el,o),o<1?i=!0:(s.active?e=!0:this._onOpaqueTile(s),s.active=!0))}e&&!this._noPrune&&this._pruneTiles(),i&&(z(this._fadeFrame),this._fadeFrame=M(this._updateOpacity,this))}},_onOpaqueTile:a,_initContainer:function(){this._container||(this._container=si("div","leaflet-layer "+(this.options.className||"")),this._updateZIndex(),this.options.opacity<1&&this._updateOpacity(),this.getPane().appendChild(this._container))},_updateLevels:function(){var t=this._tileZoom,i=this.options.maxZoom;if(void 0!==t){for(var e in this._levels)e=Number(e),this._levels[e].el.children.length||e===t?(this._levels[e].el.style.zIndex=i-Math.abs(t-e),this._onUpdateLevel(e)):(ri(this._levels[e].el),this._removeTilesAtZoom(e),this._onRemoveLevel(e),delete this._levels[e]);var n=this._levels[t],o=this._map;return n||((n=this._levels[t]={}).el=si("div","leaflet-tile-container leaflet-zoom-animated",this._container),n.el.style.zIndex=i,n.origin=o.project(o.unproject(o.getPixelOrigin()),t).round(),n.zoom=t,this._setZoomTransform(n,o.getCenter(),o.getZoom()),a(n.el.offsetWidth),this._onCreateLevel(n)),this._level=n}},_onUpdateLevel:a,_onRemoveLevel:a,_onCreateLevel:a,_pruneTiles:function(){if(this._map){var t,i,e,n=this._map.getZoom();if(n>this.options.maxZoom||n<this.options.minZoom)this._removeAllTiles();else{for(t in this._tiles)(e=this._tiles[t]).retain=e.current;for(t in this._tiles){(e=this._tiles[t]).current&&!e.active&&(i=e.coords,this._retainParent(i.x,i.y,i.z,i.z-5)||this._retainChildren(i.x,i.y,i.z,i.z+2))}for(t in this._tiles)this._tiles[t].retain||this._removeTile(t)}}},_removeTilesAtZoom:function(t){for(var i in this._tiles)this._tiles[i].coords.z===t&&this._removeTile(i)},_removeAllTiles:function(){for(var t in this._tiles)this._removeTile(t)},_invalidateAll:function(){for(var t in this._levels)ri(this._levels[t].el),this._onRemoveLevel(Number(t)),delete this._levels[t];this._removeAllTiles(),this._tileZoom=void 0},_retainParent:function(t,i,e,n){var o=Math.floor(t/2),s=Math.floor(i/2),r=e-1,a=new k(+o,+s);a.z=+r;var h=this._tileCoordsToKey(a),u=this._tiles[h];return u&&u.active?u.retain=!0:(u&&u.loaded&&(u.retain=!0),n<r&&this._retainParent(o,s,r,n))},_retainChildren:function(t,i,e,n){for(var o=2*t;o<2*t+2;o++)for(var s=2*i;s<2*i+2;s++){var r=new k(o,s);r.z=e+1;var a=this._tileCoordsToKey(r),h=this._tiles[a];h&&h.active?h.retain=!0:(h&&h.loaded&&(h.retain=!0),e+1<n&&this._retainChildren(o,s,e+1,n))}},_resetView:function(t){var i=t&&(t.pinch||t.flyTo);this._setView(this._map.getCenter(),this._map.getZoom(),i,i)},_animateZoom:function(t){this._setView(t.center,t.zoom,!0,t.noUpdate)},_clampZoom:function(t){var i=this.options;return void 0!==i.minNativeZoom&&t<i.minNativeZoom?i.minNativeZoom:void 0!==i.maxNativeZoom&&i.maxNativeZoom<t?i.maxNativeZoom:t},_setView:function(t,i,e,n){var o=Math.round(i),o=void 0!==this.options.maxZoom&&o>this.options.maxZoom||void 0!==this.options.minZoom&&o<this.options.minZoom?void 0:this._clampZoom(o),s=this.options.updateWhenZooming&&o!==this._tileZoom;n&&!s||(this._tileZoom=o,this._abortLoading&&this._abortLoading(),this._updateLevels(),this._resetGrid(),void 0!==o&&this._update(t),e||this._pruneTiles(),this._noPrune=!!e),this._setZoomTransforms(t,i)},_setZoomTransforms:function(t,i){for(var e in this._levels)this._setZoomTransform(this._levels[e],t,i)},_setZoomTransform:function(t,i,e){var n=this._map.getZoomScale(e,t.zoom),o=t.origin.multiplyBy(n).subtract(this._map._getNewPixelOrigin(i,e)).round();vt?gi(t.el,o,n):vi(t.el,o)},_resetGrid:function(){var t=this._map,i=t.options.crs,e=this._tileSize=this.getTileSize(),n=this._tileZoom,o=this._map.getPixelWorldBounds(this._tileZoom);o&&(this._globalTileRange=this._pxBoundsToTileRange(o)),this._wrapX=i.wrapLng&&!this.options.noWrap&&[Math.floor(t.project([0,i.wrapLng[0]],n).x/e.x),Math.ceil(t.project([0,i.wrapLng[1]],n).x/e.y)],this._wrapY=i.wrapLat&&!this.options.noWrap&&[Math.floor(t.project([i.wrapLat[0],0],n).y/e.x),Math.ceil(t.project([i.wrapLat[1],0],n).y/e.y)]},_onMoveEnd:function(){this._map&&!this._map._animatingZoom&&this._update()},_getTiledPixelBounds:function(t){var i=this._map,e=i._animatingZoom?Math.max(i._animateToZoom,i.getZoom()):i.getZoom(),n=i.getZoomScale(e,this._tileZoom),o=i.project(t,this._tileZoom).floor(),s=i.getSize().divideBy(2*n);return new I(o.subtract(s),o.add(s))},_update:function(t){var i=this._map;if(i){var e=this._clampZoom(i.getZoom());if(void 0===t&&(t=i.getCenter()),void 0!==this._tileZoom){var n=this._getTiledPixelBounds(t),o=this._pxBoundsToTileRange(n),s=o.getCenter(),r=[],a=this.options.keepBuffer,h=new I(o.getBottomLeft().subtract([a,-a]),o.getTopRight().add([a,-a]));if(!(isFinite(o.min.x)&&isFinite(o.min.y)&&isFinite(o.max.x)&&isFinite(o.max.y)))throw new Error("Attempted to load an infinite number of tiles");for(var u in this._tiles){var l=this._tiles[u].coords;l.z===this._tileZoom&&h.contains(new k(l.x,l.y))||(this._tiles[u].current=!1)}if(1<Math.abs(e-this._tileZoom))this._setView(t,e);else{for(var c=o.min.y;c<=o.max.y;c++)for(var _=o.min.x;_<=o.max.x;_++){var d,p=new k(_,c);p.z=this._tileZoom,this._isValidTile(p)&&((d=this._tiles[this._tileCoordsToKey(p)])?d.current=!0:r.push(p))}if(r.sort(function(t,i){return t.distanceTo(s)-i.distanceTo(s)}),0!==r.length){this._loading||(this._loading=!0,this.fire("loading"));for(var m=document.createDocumentFragment(),_=0;_<r.length;_++)this._addTile(r[_],m);this._level.el.appendChild(m)}}}}},_isValidTile:function(t){var i=this._map.options.crs;if(!i.infinite){var e=this._globalTileRange;if(!i.wrapLng&&(t.x<e.min.x||t.x>e.max.x)||!i.wrapLat&&(t.y<e.min.y||t.y>e.max.y))return!1}if(!this.options.bounds)return!0;var n=this._tileCoordsToBounds(t);return N(this.options.bounds).overlaps(n)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),n=t.scaleBy(e),o=n.add(e);return[i.unproject(n,t.z),i.unproject(o,t.z)]},_tileCoordsToBounds:function(t){var i=this._tileCoordsToNwSe(t),e=new R(i[0],i[1]);return this.options.noWrap||(e=this._map.wrapLatLngBounds(e)),e},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var i=t.split(":"),e=new k(+i[0],+i[1]);return e.z=+i[2],e},_removeTile:function(t){var i=this._tiles[t];i&&(ri(i.el),delete this._tiles[t],this.fire("tileunload",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){ci(t,"leaflet-tile");var i=this.getTileSize();t.style.width=i.x+"px",t.style.height=i.y+"px",t.onselectstart=a,t.onmousemove=a,it&&this.options.opacity<1&&mi(t,this.options.opacity),ot&&!st&&(t.style.WebkitBackfaceVisibility="hidden")},_addTile:function(t,i){var e=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),p(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&M(p(this._tileReady,this,t,null,o)),vi(o,e),this._tiles[n]={el:o,coords:t,current:!0},i.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,i,e){i&&this.fire("tileerror",{error:i,tile:e,coords:t});var n=this._tileCoordsToKey(t);(e=this._tiles[n])&&(e.loaded=+new Date,this._map._fadeAnimated?(mi(e.el,0),z(this._fadeFrame),this._fadeFrame=M(this._updateOpacity,this)):(e.active=!0,this._pruneTiles()),i||(ci(e.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:e.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),it||!this._map._fadeAnimated?M(this._pruneTiles,this):setTimeout(p(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new k(this._wrapX?o(t.x,this._wrapX):t.x,this._wrapY?o(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new I(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var sn=on.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,i){this._url=t,(i=c(this,i)).detectRetina&&zt&&0<i.maxZoom&&(i.tileSize=Math.floor(i.tileSize/2),i.zoomReverse?(i.zoomOffset--,i.minZoom++):(i.zoomOffset++,i.maxZoom--),i.minZoom=Math.max(0,i.minZoom)),"string"==typeof i.subdomains&&(i.subdomains=i.subdomains.split("")),ot||this.on("tileunload",this._onTileRemove)},setUrl:function(t,i){return this._url===t&&void 0===i&&(i=!0),this._url=t,i||this.redraw(),this},createTile:function(t,i){var e=document.createElement("img");return zi(e,"load",p(this._tileOnLoad,this,i,e)),zi(e,"error",p(this._tileOnError,this,i,e)),!this.options.crossOrigin&&""!==this.options.crossOrigin||(e.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),e.alt="",e.setAttribute("role","presentation"),e.src=this.getTileUrl(t),e},getTileUrl:function(t){var i,e={r:zt?"@2x":"",s:this._getSubdomain(t),x:t.x,y:t.y,z:this._getZoomForUrl()};return this._map&&!this._map.options.crs.infinite&&(i=this._globalTileRange.max.y-t.y,this.options.tms&&(e.y=i),e["-y"]=i),f(this._url,h(e,this.options))},_tileOnLoad:function(t,i){it?setTimeout(p(t,this,null,i),0):t(null,i)},_tileOnError:function(t,i,e){var n=this.options.errorTileUrl;n&&i.getAttribute("src")!==n&&(i.src=n),t(e,i)},_onTileRemove:function(t){t.tile.onload=null},_getZoomForUrl:function(){var t=this._tileZoom,i=this.options.maxZoom;return this.options.zoomReverse&&(t=i-t),t+this.options.zoomOffset},_getSubdomain:function(t){var i=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[i]},_abortLoading:function(){var t,i;for(t in this._tiles)this._tiles[t].coords.z!==this._tileZoom&&((i=this._tiles[t].el).onload=a,i.onerror=a,i.complete||(i.src=y,ri(i),delete this._tiles[t]))},_removeTile:function(t){var i=this._tiles[t];if(i)return at||i.el.setAttribute("src",y),on.prototype._removeTile.call(this,t)},_tileReady:function(t,i,e){if(this._map&&(!e||e.getAttribute("src")!==y))return on.prototype._tileReady.call(this,t,i,e)}});function rn(t,i){return new sn(t,i)}var an=sn.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1},initialize:function(t,i){this._url=t;var e=h({},this.defaultWmsParams);for(var n in i)n in this.options||(e[n]=i[n]);var o=(i=c(this,i)).detectRetina&&zt?2:1,s=this.getTileSize();e.width=s.x*o,e.height=s.y*o,this.wmsParams=e},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var i=1.3<=this._wmsVersion?"crs":"srs";this.wmsParams[i]=this._crs.code,sn.prototype.onAdd.call(this,t)},getTileUrl:function(t){var i=this._tileCoordsToNwSe(t),e=this._crs,n=O(e.project(i[0]),e.project(i[1])),o=n.min,s=n.max,r=(1.3<=this._wmsVersion&&this._crs===be?[o.y,o.x,s.y,s.x]:[o.x,o.y,s.x,s.y]).join(","),a=sn.prototype.getTileUrl.call(this,t);return a+_(this.wmsParams,a,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+r},setParams:function(t,i){return h(this.wmsParams,t),i||this.redraw(),this}});sn.WMS=an,rn.wms=function(t,i){return new an(t,i)};var hn=Me.extend({options:{padding:.1,tolerance:0},initialize:function(t){c(this,t),m(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),this._zoomAnimated&&ci(this._container,"leaflet-zoom-animated")),this.getPane().appendChild(this._container),this._update(),this.on("update",this._updatePaths,this)},onRemove:function(){this.off("update",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var t={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(t.zoomanim=this._onAnimZoom),t},_onAnimZoom:function(t){this._updateTransform(t.center,t.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(t,i){var e=this._map.getZoomScale(i,this._zoom),n=yi(this._container),o=this._map.getSize().multiplyBy(.5+this.options.padding),s=this._map.project(this._center,i),r=this._map.project(t,i).subtract(s),a=o.multiplyBy(-e).add(n).add(o).subtract(r);vt?gi(this._container,a,e):vi(this._container,a)},_reset:function(){for(var t in this._update(),this._updateTransform(this._center,this._zoom),this._layers)this._layers[t]._reset()},_onZoomEnd:function(){for(var t in this._layers)this._layers[t]._project()},_updatePaths:function(){for(var t in this._layers)this._layers[t]._update()},_update:function(){var t=this.options.padding,i=this._map.getSize(),e=this._map.containerPointToLayerPoint(i.multiplyBy(-t)).round();this._bounds=new I(e,e.add(i.multiplyBy(1+2*t)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),un=hn.extend({getEvents:function(){var t=hn.prototype.getEvents.call(this);return t.viewprereset=this._onViewPreReset,t},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){hn.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var t=this._container=document.createElement("canvas");zi(t,"mousemove",this._onMouseMove,this),zi(t,"click dblclick mousedown mouseup contextmenu",this._onClick,this),zi(t,"mouseout",this._handleMouseOut,this),this._ctx=t.getContext("2d")},_destroyContainer:function(){z(this._redrawRequest),delete this._ctx,ri(this._container),Si(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){for(var t in this._redrawBounds=null,this._layers)this._layers[t]._update();this._redraw()}},_update:function(){var t,i,e,n;this._map._animatingZoom&&this._bounds||(hn.prototype._update.call(this),t=this._bounds,i=this._container,e=t.getSize(),n=zt?2:1,vi(i,t.min),i.width=n*e.x,i.height=n*e.y,i.style.width=e.x+"px",i.style.height=e.y+"px",zt&&this._ctx.scale(2,2),this._ctx.translate(-t.min.x,-t.min.y),this.fire("update"))},_reset:function(){hn.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(t){this._updateDashArray(t);var i=(this._layers[m(t)]=t)._order={layer:t,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=i),this._drawLast=i,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(t){this._requestRedraw(t)},_removePath:function(t){var i=t._order,e=i.next,n=i.prev;e?e.prev=n:this._drawLast=n,n?n.next=e:this._drawFirst=e,delete t._order,delete this._layers[m(t)],this._requestRedraw(t)},_updatePath:function(t){this._extendRedrawBounds(t),t._project(),t._update(),this._requestRedraw(t)},_updateStyle:function(t){this._updateDashArray(t),this._requestRedraw(t)},_updateDashArray:function(t){if("string"==typeof t.options.dashArray){for(var i,e=t.options.dashArray.split(/[, ]+/),n=[],o=0;o<e.length;o++){if(i=Number(e[o]),isNaN(i))return;n.push(i)}t.options._dashArray=n}else t.options._dashArray=t.options.dashArray},_requestRedraw:function(t){this._map&&(this._extendRedrawBounds(t),this._redrawRequest=this._redrawRequest||M(this._redraw,this))},_extendRedrawBounds:function(t){var i;t._pxBounds&&(i=(t.options.weight||0)+1,this._redrawBounds=this._redrawBounds||new I,this._redrawBounds.extend(t._pxBounds.min.subtract([i,i])),this._redrawBounds.extend(t._pxBounds.max.add([i,i])))},_redraw:function(){this._redrawRequest=null,this._redrawBounds&&(this._redrawBounds.min._floor(),this._redrawBounds.max._ceil()),this._clear(),this._draw(),this._redrawBounds=null},_clear:function(){var t,i=this._redrawBounds;i?(t=i.getSize(),this._ctx.clearRect(i.min.x,i.min.y,t.x,t.y)):(this._ctx.save(),this._ctx.setTransform(1,0,0,1,0,0),this._ctx.clearRect(0,0,this._container.width,this._container.height),this._ctx.restore())},_draw:function(){var t,i,e=this._redrawBounds;this._ctx.save(),e&&(i=e.getSize(),this._ctx.beginPath(),this._ctx.rect(e.min.x,e.min.y,i.x,i.y),this._ctx.clip()),this._drawing=!0;for(var n=this._drawFirst;n;n=n.next)t=n.layer,(!e||t._pxBounds&&t._pxBounds.intersects(e))&&t._updatePath();this._drawing=!1,this._ctx.restore()},_updatePoly:function(t,i){if(this._drawing){var e,n,o,s,r=t._parts,a=r.length,h=this._ctx;if(a){for(h.beginPath(),e=0;e<a;e++){for(n=0,o=r[e].length;n<o;n++)s=r[e][n],h[n?"lineTo":"moveTo"](s.x,s.y);i&&h.closePath()}this._fillStroke(h,t)}}},_updateCircle:function(t){var i,e,n,o;this._drawing&&!t._empty()&&(i=t._point,e=this._ctx,n=Math.max(Math.round(t._radius),1),1!=(o=(Math.max(Math.round(t._radiusY),1)||n)/n)&&(e.save(),e.scale(1,o)),e.beginPath(),e.arc(i.x,i.y/o,n,0,2*Math.PI,!1),1!=o&&e.restore(),this._fillStroke(e,t))},_fillStroke:function(t,i){var e=i.options;e.fill&&(t.globalAlpha=e.fillOpacity,t.fillStyle=e.fillColor||e.color,t.fill(e.fillRule||"evenodd")),e.stroke&&0!==e.weight&&(t.setLineDash&&t.setLineDash(i.options&&i.options._dashArray||[]),t.globalAlpha=e.opacity,t.lineWidth=e.weight,t.strokeStyle=e.color,t.lineCap=e.lineCap,t.lineJoin=e.lineJoin,t.stroke())},_onClick:function(t){for(var i,e,n=this._map.mouseEventToLayerPoint(t),o=this._drawFirst;o;o=o.next)(i=o.layer).options.interactive&&i._containsPoint(n)&&(("click"===t.type||"preclick"!==t.type)&&this._map._draggableMoved(i)||(e=i));e&&(Fi(t),this._fireEvent([e],t))},_onMouseMove:function(t){var i;!this._map||this._map.dragging.moving()||this._map._animatingZoom||(i=this._map.mouseEventToLayerPoint(t),this._handleMouseHover(t,i))},_handleMouseOut:function(t){var i=this._hoveredLayer;i&&(_i(this._container,"leaflet-interactive"),this._fireEvent([i],t,"mouseout"),this._hoveredLayer=null,this._mouseHoverThrottled=!1)},_handleMouseHover:function(t,i){if(!this._mouseHoverThrottled){for(var e,n,o=this._drawFirst;o;o=o.next)(e=o.layer).options.interactive&&e._containsPoint(i)&&(n=e);n!==this._hoveredLayer&&(this._handleMouseOut(t),n&&(ci(this._container,"leaflet-interactive"),this._fireEvent([n],t,"mouseover"),this._hoveredLayer=n)),this._hoveredLayer&&this._fireEvent([this._hoveredLayer],t),this._mouseHoverThrottled=!0,setTimeout(p(function(){this._mouseHoverThrottled=!1},this),32)}},_fireEvent:function(t,i,e){this._map._fireDOMEvent(i,e||i.type,t)},_bringToFront:function(t){var i,e,n=t._order;n&&(i=n.next,e=n.prev,i&&((i.prev=e)?e.next=i:i&&(this._drawFirst=i),n.prev=this._drawLast,(this._drawLast.next=n).next=null,this._drawLast=n,this._requestRedraw(t)))},_bringToBack:function(t){var i,e,n=t._order;n&&(i=n.next,(e=n.prev)&&((e.next=i)?i.prev=e:e&&(this._drawLast=e),n.prev=null,n.next=this._drawFirst,this._drawFirst.prev=n,this._drawFirst=n,this._requestRedraw(t)))}});function ln(t){return St?new un(t):null}var cn=function(){try{return document.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return document.createElement("<lvml:"+t+' class="lvml">')}}catch(t){return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_n={_initContainer:function(){this._container=si("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(hn.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var i=t._container=cn("shape");ci(i,"leaflet-vml-shape "+(this.options.className||"")),i.coordsize="1 1",t._path=cn("path"),i.appendChild(t._path),this._updateStyle(t),this._layers[m(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;ri(i),t.removeInteractiveTarget(i),delete this._layers[m(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(i=i||(t._stroke=cn("stroke")),o.appendChild(i),i.weight=n.weight+"px",i.color=n.color,i.opacity=n.opacity,n.dashArray?i.dashStyle=g(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):i.dashStyle="",i.endcap=n.lineCap.replace("butt","flat"),i.joinstyle=n.lineJoin):i&&(o.removeChild(i),t._stroke=null),n.fill?(e=e||(t._fill=cn("fill")),o.appendChild(e),e.color=n.fillColor||n.color,e.opacity=n.fillOpacity):e&&(o.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),n=Math.round(t._radiusY||e);this._setPath(t,t._empty()?"M0 0":"AL "+i.x+","+i.y+" "+e+","+n+" 0,23592600")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){hi(t._container)},_bringToBack:function(t){ui(t._container)}},dn=Et?cn:J,pn=hn.extend({getEvents:function(){var t=hn.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=dn("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=dn("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){ri(this._container),Si(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){var t,i,e;this._map._animatingZoom&&this._bounds||(hn.prototype._update.call(this),i=(t=this._bounds).getSize(),e=this._container,this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute("width",i.x),e.setAttribute("height",i.y)),vi(e,t.min),e.setAttribute("viewBox",[t.min.x,t.min.y,i.x,i.y].join(" ")),this.fire("update"))},_initPath:function(t){var i=t._path=dn("path");t.options.className&&ci(i,t.options.className),t.options.interactive&&ci(i,"leaflet-interactive"),this._updateStyle(t),this._layers[m(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){ri(t._path),t.removeInteractiveTarget(t._path),delete this._layers[m(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,e=t.options;i&&(e.stroke?(i.setAttribute("stroke",e.color),i.setAttribute("stroke-opacity",e.opacity),i.setAttribute("stroke-width",e.weight),i.setAttribute("stroke-linecap",e.lineCap),i.setAttribute("stroke-linejoin",e.lineJoin),e.dashArray?i.setAttribute("stroke-dasharray",e.dashArray):i.removeAttribute("stroke-dasharray"),e.dashOffset?i.setAttribute("stroke-dashoffset",e.dashOffset):i.removeAttribute("stroke-dashoffset")):i.setAttribute("stroke","none"),e.fill?(i.setAttribute("fill",e.fillColor||e.color),i.setAttribute("fill-opacity",e.fillOpacity),i.setAttribute("fill-rule",e.fillRule||"evenodd")):i.setAttribute("fill","none"))},_updatePoly:function(t,i){this._setPath(t,$(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),n="a"+e+","+(Math.max(Math.round(t._radiusY),1)||e)+" 0 1,0 ",o=t._empty()?"M0 0":"M"+(i.x-e)+","+i.y+n+2*e+",0 "+n+2*-e+",0 ";this._setPath(t,o)},_setPath:function(t,i){t._path.setAttribute("d",i)},_bringToFront:function(t){hi(t._path)},_bringToBack:function(t){ui(t._path)}});function mn(t){return Zt||Et?new pn(t):null}Et&&pn.include(_n),Ki.include({getRenderer:function(t){var i=(i=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(i)||this.addLayer(i),i},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=this._createRenderer({pane:t}),this._paneRenderers[t]=i),i},_createRenderer:function(t){return this.options.preferCanvas&&ln(t)||mn(t)}});var fn=Re.extend({initialize:function(t,i){Re.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=N(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});pn.create=dn,pn.pointsToPath=$,Ne.geometryToLayer=De,Ne.coordsToLatLng=We,Ne.coordsToLatLngs=He,Ne.latLngToCoords=Fe,Ne.latLngsToCoords=Ue,Ne.getFeature=Ve,Ne.asFeature=qe,Ki.mergeOptions({boxZoom:!0});var gn=ie.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){zi(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Si(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){ri(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),Xt(),xi(),this._startPoint=this._map.mouseEventToContainerPoint(t),zi(document,{contextmenu:Ni,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=si("div","leaflet-zoom-box",this._container),ci(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var i=new I(this._point,this._startPoint),e=i.getSize();vi(this._box,i.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(ri(this._box),_i(this._container,"leaflet-crosshair")),Jt(),wi(),Si(document,{contextmenu:Ni,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){var i;1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(p(this._resetState,this),0),i=new R(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(i).fire("boxzoomend",{boxZoomBounds:i})))},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});Ki.addInitHook("addHandler","boxZoom",gn),Ki.mergeOptions({doubleClickZoom:!0});var vn=ie.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),n=i.options.zoomDelta,o=t.originalEvent.shiftKey?e-n:e+n;"center"===i.options.doubleClickZoom?i.setZoom(o):i.setZoomAround(t.containerPoint,o)}});Ki.addInitHook("addHandler","doubleClickZoom",vn),Ki.mergeOptions({dragging:!0,inertia:!st,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var yn=ie.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new ae(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),ci(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){_i(this._map._container,"leaflet-grab"),_i(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,i=this._map;i._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=N(this._map.options.maxBounds),this._offsetLimit=O(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,i.fire("movestart").fire("dragstart"),i.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var i,e;this._map.options.inertia&&(i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(e),this._times.push(i),this._prunePositions(i)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1<this._positions.length&&50<t-this._times[0];)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var t=this._map.getSize().divideBy(2),i=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=i.subtract(t).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(t,i){return t-(t-i)*this._viscosity},_onPreDragLimit:function(){var t,i;this._viscosity&&this._offsetLimit&&(t=this._draggable._newPos.subtract(this._draggable._startPos),i=this._offsetLimit,t.x<i.min.x&&(t.x=this._viscousLimit(t.x,i.min.x)),t.y<i.min.y&&(t.y=this._viscousLimit(t.y,i.min.y)),t.x>i.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-i+e)%t+i-e,s=(n+i+e)%t-i-e,r=Math.abs(o+e)<Math.abs(s+e)?o:s;this._draggable._absPos=this._draggable._newPos.clone(),this._draggable._newPos.x=r},_onDragEnd:function(t){var i,e,n,o,s,r,a,h,u,l=this._map,c=l.options,_=!c.inertia||this._times.length<2;l.fire("dragend",t),_?l.fire("moveend"):(this._prunePositions(+new Date),i=this._lastPos.subtract(this._positions[0]),e=(this._lastTime-this._times[0])/1e3,n=c.easeLinearity,s=(o=i.multiplyBy(n/e)).distanceTo([0,0]),r=Math.min(c.inertiaMaxSpeed,s),a=o.multiplyBy(r/s),h=r/(c.inertiaDeceleration*n),(u=a.multiplyBy(-h/2).round()).x||u.y?(u=l._limitOffset(u,l.options.maxBounds),M(function(){l.panBy(u,{duration:h,easeLinearity:n,noMoveStart:!0,animate:!0})})):l.fire("moveend"))}});Ki.addInitHook("addHandler","dragging",yn),Ki.mergeOptions({keyboard:!0,keyboardPanDelta:80});var xn=ie.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(t){this._map=t,this._setPanDelta(t.options.keyboardPanDelta),this._setZoomDelta(t.options.zoomDelta)},addHooks:function(){var t=this._map._container;t.tabIndex<=0&&(t.tabIndex="0"),zi(t,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks(),Si(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){var t,i,e,n;this._focused||(t=document.body,i=document.documentElement,e=t.scrollTop||i.scrollTop,n=t.scrollLeft||i.scrollLeft,this._map._container.focus(),window.scrollTo(n,e))},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanDelta:function(t){for(var i=this._panKeys={},e=this.keyCodes,n=0,o=e.left.length;n<o;n++)i[e.left[n]]=[-1*t,0];for(n=0,o=e.right.length;n<o;n++)i[e.right[n]]=[t,0];for(n=0,o=e.down.length;n<o;n++)i[e.down[n]]=[0,t];for(n=0,o=e.up.length;n<o;n++)i[e.up[n]]=[0,-1*t]},_setZoomDelta:function(t){for(var i=this._zoomKeys={},e=this.keyCodes,n=0,o=e.zoomIn.length;n<o;n++)i[e.zoomIn[n]]=t;for(n=0,o=e.zoomOut.length;n<o;n++)i[e.zoomOut[n]]=-t},_addHooks:function(){zi(document,"keydown",this._onKeyDown,this)},_removeHooks:function(){Si(document,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){if(!(t.altKey||t.ctrlKey||t.metaKey)){var i,e=t.keyCode,n=this._map;if(e in this._panKeys)n._panAnim&&n._panAnim._inProgress||(i=this._panKeys[e],t.shiftKey&&(i=A(i).multiplyBy(3)),n.panBy(i),n.options.maxBounds&&n.panInsideBounds(n.options.maxBounds));else if(e in this._zoomKeys)n.setZoom(n.getZoom()+(t.shiftKey?3:1)*this._zoomKeys[e]);else{if(27!==e||!n._popup||!n._popup.options.closeOnEscapeKey)return;n.closePopup()}Ni(t)}}});Ki.addInitHook("addHandler","keyboard",xn),Ki.mergeOptions({scrollWheelZoom:!0,wheelDebounceTime:40,wheelPxPerZoomLevel:60});var wn=ie.extend({addHooks:function(){zi(this._map._container,"wheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){Si(this._map._container,"wheel",this._onWheelScroll,this)},_onWheelScroll:function(t){var i=Wi(t),e=this._map.options.wheelDebounceTime;this._delta+=i,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var n=Math.max(e-(new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(p(this._performZoom,this),n),Ni(t)},_performZoom:function(){var t=this._map,i=t.getZoom(),e=this._map.options.zoomSnap||0;t._stop();var n=this._delta/(4*this._map.options.wheelPxPerZoomLevel),o=4*Math.log(2/(1+Math.exp(-Math.abs(n))))/Math.LN2,s=e?Math.ceil(o/e)*e:o,r=t._limitZoom(i+(0<this._delta?s:-s))-i;this._delta=0,this._startTime=null,r&&("center"===t.options.scrollWheelZoom?t.setZoom(i+r):t.setZoomAround(this._lastMousePos,i+r))}});Ki.addInitHook("addHandler","scrollWheelZoom",wn),Ki.mergeOptions({tap:!0,tapTolerance:15});var Pn=ie.extend({addHooks:function(){zi(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){Si(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(Ri(t),this._fireClick=!0,1<t.touches.length)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],e=i.target;this._startPos=this._newPos=new k(i.clientX,i.clientY),e.tagName&&"a"===e.tagName.toLowerCase()&&ci(e,"leaflet-active"),this._holdTimeout=setTimeout(p(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),this._simulateEvent("mousedown",i),zi(document,{touchmove:this._onMove,touchend:this._onUp},this)}},_onUp:function(t){var i,e;clearTimeout(this._holdTimeout),Si(document,{touchmove:this._onMove,touchend:this._onUp},this),this._fireClick&&t&&t.changedTouches&&((e=(i=t.changedTouches[0]).target)&&e.tagName&&"a"===e.tagName.toLowerCase()&&_i(e,"leaflet-active"),this._simulateEvent("mouseup",i),this._isTapValid()&&this._simulateEvent("click",i))},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var i=t.touches[0];this._newPos=new k(i.clientX,i.clientY),this._simulateEvent("mousemove",i)},_simulateEvent:function(t,i){var e=document.createEvent("MouseEvents");e._simulated=!0,i.target._simulatedClick=!0,e.initMouseEvent(t,!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),i.target.dispatchEvent(e)}});!bt||Lt&&!ct||Ki.addInitHook("addHandler","tap",Pn),Ki.mergeOptions({touchZoom:bt&&!st,bounceAtZoomLimits:!0});var Ln=ie.extend({addHooks:function(){ci(this._map._container,"leaflet-touch-zoom"),zi(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){_i(this._map._container,"leaflet-touch-zoom"),Si(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i,e,n=this._map;!t.touches||2!==t.touches.length||n._animatingZoom||this._zooming||(i=n.mouseEventToContainerPoint(t.touches[0]),e=n.mouseEventToContainerPoint(t.touches[1]),this._centerPoint=n.getSize()._divideBy(2),this._startLatLng=n.containerPointToLatLng(this._centerPoint),"center"!==n.options.touchZoom&&(this._pinchStartLatLng=n.containerPointToLatLng(i.add(e)._divideBy(2))),this._startDist=i.distanceTo(e),this._startZoom=n.getZoom(),this._moved=!1,this._zooming=!0,n._stop(),zi(document,"touchmove",this._onTouchMove,this),zi(document,"touchend",this._onTouchEnd,this),Ri(t))},_onTouchMove:function(t){if(t.touches&&2===t.touches.length&&this._zooming){var i=this._map,e=i.mouseEventToContainerPoint(t.touches[0]),n=i.mouseEventToContainerPoint(t.touches[1]),o=e.distanceTo(n)/this._startDist;if(this._zoom=i.getScaleZoom(o,this._startZoom),!i.options.bounceAtZoomLimits&&(this._zoom<i.getMinZoom()&&o<1||this._zoom>i.getMaxZoom()&&1<o)&&(this._zoom=i._limitZoom(this._zoom)),"center"===i.options.touchZoom){if(this._center=this._startLatLng,1==o)return}else{var s=e._add(n)._divideBy(2)._subtract(this._centerPoint);if(1==o&&0===s.x&&0===s.y)return;this._center=i.unproject(i.project(this._pinchStartLatLng,this._zoom).subtract(s),this._zoom)}this._moved||(i._moveStart(!0,!1),this._moved=!0),z(this._animRequest);var r=p(i._move,i,this._center,this._zoom,{pinch:!0,round:!1});this._animRequest=M(r,this,!0),Ri(t)}},_onTouchEnd:function(){this._moved&&this._zooming?(this._zooming=!1,z(this._animRequest),Si(document,"touchmove",this._onTouchMove,this),Si(document,"touchend",this._onTouchEnd,this),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))):this._zooming=!1}});Ki.addInitHook("addHandler","touchZoom",Ln),Ki.BoxZoom=gn,Ki.DoubleClickZoom=vn,Ki.Drag=yn,Ki.Keyboard=xn,Ki.ScrollWheelZoom=wn,Ki.Tap=Pn,Ki.TouchZoom=Ln,t.version="1.7.1",t.Control=Xi,t.control=Yi,t.Browser=Bt,t.Evented=E,t.Mixin=ne,t.Util=C,t.Class=S,t.Handler=ie,t.extend=h,t.bind=p,t.stamp=m,t.setOptions=c,t.DomEvent=qi,t.DomUtil=Mi,t.PosAnimation=Gi,t.Draggable=ae,t.LineUtil=fe,t.PolyUtil=ye,t.Point=k,t.point=A,t.Bounds=I,t.bounds=O,t.Transformation=q,t.transformation=G,t.Projection=Pe,t.LatLng=D,t.latLng=j,t.LatLngBounds=R,t.latLngBounds=N,t.CRS=H,t.GeoJSON=Ne,t.geoJSON=Ke,t.geoJson=Ye,t.Layer=Me,t.LayerGroup=ze,t.layerGroup=function(t,i){return new ze(t,i)},t.FeatureGroup=Ce,t.featureGroup=function(t,i){return new Ce(t,i)},t.ImageOverlay=Xe,t.imageOverlay=function(t,i,e){return new Xe(t,i,e)},t.VideoOverlay=Je,t.videoOverlay=function(t,i,e){return new Je(t,i,e)},t.SVGOverlay=$e,t.svgOverlay=function(t,i,e){return new $e(t,i,e)},t.DivOverlay=Qe,t.Popup=tn,t.popup=function(t,i){return new tn(t,i)},t.Tooltip=en,t.tooltip=function(t,i){return new en(t,i)},t.Icon=Se,t.icon=function(t){return new Se(t)},t.DivIcon=nn,t.divIcon=function(t){return new nn(t)},t.Marker=ke,t.marker=function(t,i){return new ke(t,i)},t.TileLayer=sn,t.tileLayer=rn,t.GridLayer=on,t.gridLayer=function(t){return new on(t)},t.SVG=pn,t.svg=mn,t.Renderer=hn,t.Canvas=un,t.canvas=ln,t.Path=Be,t.CircleMarker=Ae,t.circleMarker=function(t,i){return new Ae(t,i)},t.Circle=Ie,t.circle=function(t,i,e){return new Ie(t,i,e)},t.Polyline=Oe,t.polyline=function(t,i){return new Oe(t,i)},t.Polygon=Re,t.polygon=function(t,i){return new Re(t,i)},t.Rectangle=fn,t.rectangle=function(t,i){return new fn(t,i)},t.Map=Ki,t.map=function(t,i){return new Ki(t,i)};var bn=window.L;t.noConflict=function(){return window.L=bn,this},window.L=t});
+/*
+ * Leaflet.markercluster 1.4.1+master.37ab9a2,
+ * Provides Beautiful Animated Marker Clustering functionality for Leaflet, a JS library for interactive maps.
+ * https://github.com/Leaflet/Leaflet.markercluster
+ * (c) 2012-2017, Dave Leaver, smartrak
+ */
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+	typeof define === 'function' && define.amd ? define(['exports'], factory) :
+	(factory((global.Leaflet = global.Leaflet || {}, global.Leaflet.markercluster = global.Leaflet.markercluster || {})));
+}(this, (function (exports) { 'use strict';
+
+/*
+ * L.MarkerClusterGroup extends L.FeatureGroup by clustering the markers contained within
+ */
+
+var MarkerClusterGroup = L.MarkerClusterGroup = L.FeatureGroup.extend({
+
+	options: {
+		maxClusterRadius: 80, //A cluster will cover at most this many pixels from its center
+		iconCreateFunction: null,
+		clusterPane: L.Marker.prototype.options.pane,
+
+		spiderfyOnMaxZoom: true,
+		showCoverageOnHover: true,
+		zoomToBoundsOnClick: true,
+		singleMarkerMode: false,
+
+		disableClusteringAtZoom: null,
+
+		// Setting this to false prevents the removal of any clusters outside of the viewpoint, which
+		// is the default behaviour for performance reasons.
+		removeOutsideVisibleBounds: true,
+
+		// Set to false to disable all animations (zoom and spiderfy).
+		// If false, option animateAddingMarkers below has no effect.
+		// If L.DomUtil.TRANSITION is falsy, this option has no effect.
+		animate: true,
+
+		//Whether to animate adding markers after adding the MarkerClusterGroup to the map
+		// If you are adding individual markers set to true, if adding bulk markers leave false for massive performance gains.
+		animateAddingMarkers: false,
+
+		//Increase to increase the distance away that spiderfied markers appear from the center
+		spiderfyDistanceMultiplier: 1,
+
+		// Make it possible to specify a polyline options on a spider leg
+		spiderLegPolylineOptions: { weight: 1.5, color: '#222', opacity: 0.5 },
+
+		// When bulk adding layers, adds markers in chunks. Means addLayers may not add all the layers in the call, others will be loaded during setTimeouts
+		chunkedLoading: false,
+		chunkInterval: 200, // process markers for a maximum of ~ n milliseconds (then trigger the chunkProgress callback)
+		chunkDelay: 50, // at the end of each interval, give n milliseconds back to system/browser
+		chunkProgress: null, // progress callback: function(processed, total, elapsed) (e.g. for a progress indicator)
+
+		//Options to pass to the L.Polygon constructor
+		polygonOptions: {}
+	},
+
+	initialize: function (options) {
+		L.Util.setOptions(this, options);
+		if (!this.options.iconCreateFunction) {
+			this.options.iconCreateFunction = this._defaultIconCreateFunction;
+		}
+
+		this._featureGroup = L.featureGroup();
+		this._featureGroup.addEventParent(this);
+
+		this._nonPointGroup = L.featureGroup();
+		this._nonPointGroup.addEventParent(this);
+
+		this._inZoomAnimation = 0;
+		this._needsClustering = [];
+		this._needsRemoving = []; //Markers removed while we aren't on the map need to be kept track of
+		//The bounds of the currently shown area (from _getExpandedVisibleBounds) Updated on zoom/move
+		this._currentShownBounds = null;
+
+		this._queue = [];
+
+		this._childMarkerEventHandlers = {
+			'dragstart': this._childMarkerDragStart,
+			'move': this._childMarkerMoved,
+			'dragend': this._childMarkerDragEnd,
+		};
+
+		// Hook the appropriate animation methods.
+		var animate = L.DomUtil.TRANSITION && this.options.animate;
+		L.extend(this, animate ? this._withAnimation : this._noAnimation);
+		// Remember which MarkerCluster class to instantiate (animated or not).
+		this._markerCluster = animate ? L.MarkerCluster : L.MarkerClusterNonAnimated;
+	},
+
+	addLayer: function (layer) {
+
+		if (layer instanceof L.LayerGroup) {
+			return this.addLayers([layer]);
+		}
+
+		//Don't cluster non point data
+		if (!layer.getLatLng) {
+			this._nonPointGroup.addLayer(layer);
+			this.fire('layeradd', { layer: layer });
+			return this;
+		}
+
+		if (!this._map) {
+			this._needsClustering.push(layer);
+			this.fire('layeradd', { layer: layer });
+			return this;
+		}
+
+		if (this.hasLayer(layer)) {
+			return this;
+		}
+
+
+		//If we have already clustered we'll need to add this one to a cluster
+
+		if (this._unspiderfy) {
+			this._unspiderfy();
+		}
+
+		this._addLayer(layer, this._maxZoom);
+		this.fire('layeradd', { layer: layer });
+
+		// Refresh bounds and weighted positions.
+		this._topClusterLevel._recalculateBounds();
+
+		this._refreshClustersIcons();
+
+		//Work out what is visible
+		var visibleLayer = layer,
+		    currentZoom = this._zoom;
+		if (layer.__parent) {
+			while (visibleLayer.__parent._zoom >= currentZoom) {
+				visibleLayer = visibleLayer.__parent;
+			}
+		}
+
+		if (this._currentShownBounds.contains(visibleLayer.getLatLng())) {
+			if (this.options.animateAddingMarkers) {
+				this._animationAddLayer(layer, visibleLayer);
+			} else {
+				this._animationAddLayerNonAnimated(layer, visibleLayer);
+			}
+		}
+		return this;
+	},
+
+	removeLayer: function (layer) {
+
+		if (layer instanceof L.LayerGroup) {
+			return this.removeLayers([layer]);
+		}
+
+		//Non point layers
+		if (!layer.getLatLng) {
+			this._nonPointGroup.removeLayer(layer);
+			this.fire('layerremove', { layer: layer });
+			return this;
+		}
+
+		if (!this._map) {
+			if (!this._arraySplice(this._needsClustering, layer) && this.hasLayer(layer)) {
+				this._needsRemoving.push({ layer: layer, latlng: layer._latlng });
+			}
+			this.fire('layerremove', { layer: layer });
+			return this;
+		}
+
+		if (!layer.__parent) {
+			return this;
+		}
+
+		if (this._unspiderfy) {
+			this._unspiderfy();
+			this._unspiderfyLayer(layer);
+		}
+
+		//Remove the marker from clusters
+		this._removeLayer(layer, true);
+		this.fire('layerremove', { layer: layer });
+
+		// Refresh bounds and weighted positions.
+		this._topClusterLevel._recalculateBounds();
+
+		this._refreshClustersIcons();
+
+		layer.off(this._childMarkerEventHandlers, this);
+
+		if (this._featureGroup.hasLayer(layer)) {
+			this._featureGroup.removeLayer(layer);
+			if (layer.clusterShow) {
+				layer.clusterShow();
+			}
+		}
+
+		return this;
+	},
+
+	//Takes an array of markers and adds them in bulk
+	addLayers: function (layersArray, skipLayerAddEvent) {
+		if (!L.Util.isArray(layersArray)) {
+			return this.addLayer(layersArray);
+		}
+
+		var fg = this._featureGroup,
+		    npg = this._nonPointGroup,
+		    chunked = this.options.chunkedLoading,
+		    chunkInterval = this.options.chunkInterval,
+		    chunkProgress = this.options.chunkProgress,
+		    l = layersArray.length,
+		    offset = 0,
+		    originalArray = true,
+		    m;
+
+		if (this._map) {
+			var started = (new Date()).getTime();
+			var process = L.bind(function () {
+				var start = (new Date()).getTime();
+				for (; offset < l; offset++) {
+					if (chunked && offset % 200 === 0) {
+						// every couple hundred markers, instrument the time elapsed since processing started:
+						var elapsed = (new Date()).getTime() - start;
+						if (elapsed > chunkInterval) {
+							break; // been working too hard, time to take a break :-)
+						}
+					}
+
+					m = layersArray[offset];
+
+					// Group of layers, append children to layersArray and skip.
+					// Side effects:
+					// - Total increases, so chunkProgress ratio jumps backward.
+					// - Groups are not included in this group, only their non-group child layers (hasLayer).
+					// Changing array length while looping does not affect performance in current browsers:
+					// http://jsperf.com/for-loop-changing-length/6
+					if (m instanceof L.LayerGroup) {
+						if (originalArray) {
+							layersArray = layersArray.slice();
+							originalArray = false;
+						}
+						this._extractNonGroupLayers(m, layersArray);
+						l = layersArray.length;
+						continue;
+					}
+
+					//Not point data, can't be clustered
+					if (!m.getLatLng) {
+						npg.addLayer(m);
+						if (!skipLayerAddEvent) {
+							this.fire('layeradd', { layer: m });
+						}
+						continue;
+					}
+
+					if (this.hasLayer(m)) {
+						continue;
+					}
+
+					this._addLayer(m, this._maxZoom);
+					if (!skipLayerAddEvent) {
+						this.fire('layeradd', { layer: m });
+					}
+
+					//If we just made a cluster of size 2 then we need to remove the other marker from the map (if it is) or we never will
+					if (m.__parent) {
+						if (m.__parent.getChildCount() === 2) {
+							var markers = m.__parent.getAllChildMarkers(),
+							    otherMarker = markers[0] === m ? markers[1] : markers[0];
+							fg.removeLayer(otherMarker);
+						}
+					}
+				}
+
+				if (chunkProgress) {
+					// report progress and time elapsed:
+					chunkProgress(offset, l, (new Date()).getTime() - started);
+				}
+
+				// Completed processing all markers.
+				if (offset === l) {
+
+					// Refresh bounds and weighted positions.
+					this._topClusterLevel._recalculateBounds();
+
+					this._refreshClustersIcons();
+
+					this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
+				} else {
+					setTimeout(process, this.options.chunkDelay);
+				}
+			}, this);
+
+			process();
+		} else {
+			var needsClustering = this._needsClustering;
+
+			for (; offset < l; offset++) {
+				m = layersArray[offset];
+
+				// Group of layers, append children to layersArray and skip.
+				if (m instanceof L.LayerGroup) {
+					if (originalArray) {
+						layersArray = layersArray.slice();
+						originalArray = false;
+					}
+					this._extractNonGroupLayers(m, layersArray);
+					l = layersArray.length;
+					continue;
+				}
+
+				//Not point data, can't be clustered
+				if (!m.getLatLng) {
+					npg.addLayer(m);
+					continue;
+				}
+
+				if (this.hasLayer(m)) {
+					continue;
+				}
+
+				needsClustering.push(m);
+			}
+		}
+		return this;
+	},
+
+	//Takes an array of markers and removes them in bulk
+	removeLayers: function (layersArray) {
+		var i, m,
+		    l = layersArray.length,
+		    fg = this._featureGroup,
+		    npg = this._nonPointGroup,
+		    originalArray = true;
+
+		if (!this._map) {
+			for (i = 0; i < l; i++) {
+				m = layersArray[i];
+
+				// Group of layers, append children to layersArray and skip.
+				if (m instanceof L.LayerGroup) {
+					if (originalArray) {
+						layersArray = layersArray.slice();
+						originalArray = false;
+					}
+					this._extractNonGroupLayers(m, layersArray);
+					l = layersArray.length;
+					continue;
+				}
+
+				this._arraySplice(this._needsClustering, m);
+				npg.removeLayer(m);
+				if (this.hasLayer(m)) {
+					this._needsRemoving.push({ layer: m, latlng: m._latlng });
+				}
+				this.fire('layerremove', { layer: m });
+			}
+			return this;
+		}
+
+		if (this._unspiderfy) {
+			this._unspiderfy();
+
+			// Work on a copy of the array, so that next loop is not affected.
+			var layersArray2 = layersArray.slice(),
+			    l2 = l;
+			for (i = 0; i < l2; i++) {
+				m = layersArray2[i];
+
+				// Group of layers, append children to layersArray and skip.
+				if (m instanceof L.LayerGroup) {
+					this._extractNonGroupLayers(m, layersArray2);
+					l2 = layersArray2.length;
+					continue;
+				}
+
+				this._unspiderfyLayer(m);
+			}
+		}
+
+		for (i = 0; i < l; i++) {
+			m = layersArray[i];
+
+			// Group of layers, append children to layersArray and skip.
+			if (m instanceof L.LayerGroup) {
+				if (originalArray) {
+					layersArray = layersArray.slice();
+					originalArray = false;
+				}
+				this._extractNonGroupLayers(m, layersArray);
+				l = layersArray.length;
+				continue;
+			}
+
+			if (!m.__parent) {
+				npg.removeLayer(m);
+				this.fire('layerremove', { layer: m });
+				continue;
+			}
+
+			this._removeLayer(m, true, true);
+			this.fire('layerremove', { layer: m });
+
+			if (fg.hasLayer(m)) {
+				fg.removeLayer(m);
+				if (m.clusterShow) {
+					m.clusterShow();
+				}
+			}
+		}
+
+		// Refresh bounds and weighted positions.
+		this._topClusterLevel._recalculateBounds();
+
+		this._refreshClustersIcons();
+
+		//Fix up the clusters and markers on the map
+		this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
+
+		return this;
+	},
+
+	//Removes all layers from the MarkerClusterGroup
+	clearLayers: function () {
+		//Need our own special implementation as the LayerGroup one doesn't work for us
+
+		//If we aren't on the map (yet), blow away the markers we know of
+		if (!this._map) {
+			this._needsClustering = [];
+			this._needsRemoving = [];
+			delete this._gridClusters;
+			delete this._gridUnclustered;
+		}
+
+		if (this._noanimationUnspiderfy) {
+			this._noanimationUnspiderfy();
+		}
+
+		//Remove all the visible layers
+		this._featureGroup.clearLayers();
+		this._nonPointGroup.clearLayers();
+
+		this.eachLayer(function (marker) {
+			marker.off(this._childMarkerEventHandlers, this);
+			delete marker.__parent;
+		}, this);
+
+		if (this._map) {
+			//Reset _topClusterLevel and the DistanceGrids
+			this._generateInitialClusters();
+		}
+
+		return this;
+	},
+
+	//Override FeatureGroup.getBounds as it doesn't work
+	getBounds: function () {
+		var bounds = new L.LatLngBounds();
+
+		if (this._topClusterLevel) {
+			bounds.extend(this._topClusterLevel._bounds);
+		}
+
+		for (var i = this._needsClustering.length - 1; i >= 0; i--) {
+			bounds.extend(this._needsClustering[i].getLatLng());
+		}
+
+		bounds.extend(this._nonPointGroup.getBounds());
+
+		return bounds;
+	},
+
+	//Overrides LayerGroup.eachLayer
+	eachLayer: function (method, context) {
+		var markers = this._needsClustering.slice(),
+			needsRemoving = this._needsRemoving,
+			thisNeedsRemoving, i, j;
+
+		if (this._topClusterLevel) {
+			this._topClusterLevel.getAllChildMarkers(markers);
+		}
+
+		for (i = markers.length - 1; i >= 0; i--) {
+			thisNeedsRemoving = true;
+
+			for (j = needsRemoving.length - 1; j >= 0; j--) {
+				if (needsRemoving[j].layer === markers[i]) {
+					thisNeedsRemoving = false;
+					break;
+				}
+			}
+
+			if (thisNeedsRemoving) {
+				method.call(context, markers[i]);
+			}
+		}
+
+		this._nonPointGroup.eachLayer(method, context);
+	},
+
+	//Overrides LayerGroup.getLayers
+	getLayers: function () {
+		var layers = [];
+		this.eachLayer(function (l) {
+			layers.push(l);
+		});
+		return layers;
+	},
+
+	//Overrides LayerGroup.getLayer, WARNING: Really bad performance
+	getLayer: function (id) {
+		var result = null;
+
+		id = parseInt(id, 10);
+
+		this.eachLayer(function (l) {
+			if (L.stamp(l) === id) {
+				result = l;
+			}
+		});
+
+		return result;
+	},
+
+	//Returns true if the given layer is in this MarkerClusterGroup
+	hasLayer: function (layer) {
+		if (!layer) {
+			return false;
+		}
+
+		var i, anArray = this._needsClustering;
+
+		for (i = anArray.length - 1; i >= 0; i--) {
+			if (anArray[i] === layer) {
+				return true;
+			}
+		}
+
+		anArray = this._needsRemoving;
+		for (i = anArray.length - 1; i >= 0; i--) {
+			if (anArray[i].layer === layer) {
+				return false;
+			}
+		}
+
+		return !!(layer.__parent && layer.__parent._group === this) || this._nonPointGroup.hasLayer(layer);
+	},
+
+	//Zoom down to show the given layer (spiderfying if necessary) then calls the callback
+	zoomToShowLayer: function (layer, callback) {
+
+		if (typeof callback !== 'function') {
+			callback = function () {};
+		}
+
+		var showMarker = function () {
+			if ((layer._icon || layer.__parent._icon) && !this._inZoomAnimation) {
+				this._map.off('moveend', showMarker, this);
+				this.off('animationend', showMarker, this);
+
+				if (layer._icon) {
+					callback();
+				} else if (layer.__parent._icon) {
+					this.once('spiderfied', callback, this);
+					layer.__parent.spiderfy();
+				}
+			}
+		};
+
+		if (layer._icon && this._map.getBounds().contains(layer.getLatLng())) {
+			//Layer is visible ond on screen, immediate return
+			callback();
+		} else if (layer.__parent._zoom < Math.round(this._map._zoom)) {
+			//Layer should be visible at this zoom level. It must not be on screen so just pan over to it
+			this._map.on('moveend', showMarker, this);
+			this._map.panTo(layer.getLatLng());
+		} else {
+			this._map.on('moveend', showMarker, this);
+			this.on('animationend', showMarker, this);
+			layer.__parent.zoomToBounds();
+		}
+	},
+
+	//Overrides FeatureGroup.onAdd
+	onAdd: function (map) {
+		this._map = map;
+		var i, l, layer;
+
+		if (!isFinite(this._map.getMaxZoom())) {
+			throw "Map has no maxZoom specified";
+		}
+
+		this._featureGroup.addTo(map);
+		this._nonPointGroup.addTo(map);
+
+		if (!this._gridClusters) {
+			this._generateInitialClusters();
+		}
+
+		this._maxLat = map.options.crs.projection.MAX_LATITUDE;
+
+		//Restore all the positions as they are in the MCG before removing them
+		for (i = 0, l = this._needsRemoving.length; i < l; i++) {
+			layer = this._needsRemoving[i];
+			layer.newlatlng = layer.layer._latlng;
+			layer.layer._latlng = layer.latlng;
+		}
+		//Remove them, then restore their new positions
+		for (i = 0, l = this._needsRemoving.length; i < l; i++) {
+			layer = this._needsRemoving[i];
+			this._removeLayer(layer.layer, true);
+			layer.layer._latlng = layer.newlatlng;
+		}
+		this._needsRemoving = [];
+
+		//Remember the current zoom level and bounds
+		this._zoom = Math.round(this._map._zoom);
+		this._currentShownBounds = this._getExpandedVisibleBounds();
+
+		this._map.on('zoomend', this._zoomEnd, this);
+		this._map.on('moveend', this._moveEnd, this);
+
+		if (this._spiderfierOnAdd) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely
+			this._spiderfierOnAdd();
+		}
+
+		this._bindEvents();
+
+		//Actually add our markers to the map:
+		l = this._needsClustering;
+		this._needsClustering = [];
+		this.addLayers(l, true);
+	},
+
+	//Overrides FeatureGroup.onRemove
+	onRemove: function (map) {
+		map.off('zoomend', this._zoomEnd, this);
+		map.off('moveend', this._moveEnd, this);
+
+		this._unbindEvents();
+
+		//In case we are in a cluster animation
+		this._map._mapPane.className = this._map._mapPane.className.replace(' leaflet-cluster-anim', '');
+
+		if (this._spiderfierOnRemove) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely
+			this._spiderfierOnRemove();
+		}
+
+		delete this._maxLat;
+
+		//Clean up all the layers we added to the map
+		this._hideCoverage();
+		this._featureGroup.remove();
+		this._nonPointGroup.remove();
+
+		this._featureGroup.clearLayers();
+
+		this._map = null;
+	},
+
+	getVisibleParent: function (marker) {
+		var vMarker = marker;
+		while (vMarker && !vMarker._icon) {
+			vMarker = vMarker.__parent;
+		}
+		return vMarker || null;
+	},
+
+	//Remove the given object from the given array
+	_arraySplice: function (anArray, obj) {
+		for (var i = anArray.length - 1; i >= 0; i--) {
+			if (anArray[i] === obj) {
+				anArray.splice(i, 1);
+				return true;
+			}
+		}
+	},
+
+	/**
+	 * Removes a marker from all _gridUnclustered zoom levels, starting at the supplied zoom.
+	 * @param marker to be removed from _gridUnclustered.
+	 * @param z integer bottom start zoom level (included)
+	 * @private
+	 */
+	_removeFromGridUnclustered: function (marker, z) {
+		var map = this._map,
+		    gridUnclustered = this._gridUnclustered,
+			minZoom = Math.floor(this._map.getMinZoom());
+
+		for (; z >= minZoom; z--) {
+			if (!gridUnclustered[z].removeObject(marker, map.project(marker.getLatLng(), z))) {
+				break;
+			}
+		}
+	},
+
+	_childMarkerDragStart: function (e) {
+		e.target.__dragStart = e.target._latlng;
+	},
+
+	_childMarkerMoved: function (e) {
+		if (!this._ignoreMove && !e.target.__dragStart) {
+			var isPopupOpen = e.target._popup && e.target._popup.isOpen();
+
+			this._moveChild(e.target, e.oldLatLng, e.latlng);
+
+			if (isPopupOpen) {
+				e.target.openPopup();
+			}
+		}
+	},
+
+	_moveChild: function (layer, from, to) {
+		layer._latlng = from;
+		this.removeLayer(layer);
+
+		layer._latlng = to;
+		this.addLayer(layer);
+	},
+
+	_childMarkerDragEnd: function (e) {
+		var dragStart = e.target.__dragStart;
+		delete e.target.__dragStart;
+		if (dragStart) {
+			this._moveChild(e.target, dragStart, e.target._latlng);
+		}		
+	},
+
+
+	//Internal function for removing a marker from everything.
+	//dontUpdateMap: set to true if you will handle updating the map manually (for bulk functions)
+	_removeLayer: function (marker, removeFromDistanceGrid, dontUpdateMap) {
+		var gridClusters = this._gridClusters,
+			gridUnclustered = this._gridUnclustered,
+			fg = this._featureGroup,
+			map = this._map,
+			minZoom = Math.floor(this._map.getMinZoom());
+
+		//Remove the marker from distance clusters it might be in
+		if (removeFromDistanceGrid) {
+			this._removeFromGridUnclustered(marker, this._maxZoom);
+		}
+
+		//Work our way up the clusters removing them as we go if required
+		var cluster = marker.__parent,
+			markers = cluster._markers,
+			otherMarker;
+
+		//Remove the marker from the immediate parents marker list
+		this._arraySplice(markers, marker);
+
+		while (cluster) {
+			cluster._childCount--;
+			cluster._boundsNeedUpdate = true;
+
+			if (cluster._zoom < minZoom) {
+				//Top level, do nothing
+				break;
+			} else if (removeFromDistanceGrid && cluster._childCount <= 1) { //Cluster no longer required
+				//We need to push the other marker up to the parent
+				otherMarker = cluster._markers[0] === marker ? cluster._markers[1] : cluster._markers[0];
+
+				//Update distance grid
+				gridClusters[cluster._zoom].removeObject(cluster, map.project(cluster._cLatLng, cluster._zoom));
+				gridUnclustered[cluster._zoom].addObject(otherMarker, map.project(otherMarker.getLatLng(), cluster._zoom));
+
+				//Move otherMarker up to parent
+				this._arraySplice(cluster.__parent._childClusters, cluster);
+				cluster.__parent._markers.push(otherMarker);
+				otherMarker.__parent = cluster.__parent;
+
+				if (cluster._icon) {
+					//Cluster is currently on the map, need to put the marker on the map instead
+					fg.removeLayer(cluster);
+					if (!dontUpdateMap) {
+						fg.addLayer(otherMarker);
+					}
+				}
+			} else {
+				cluster._iconNeedsUpdate = true;
+			}
+
+			cluster = cluster.__parent;
+		}
+
+		delete marker.__parent;
+	},
+
+	_isOrIsParent: function (el, oel) {
+		while (oel) {
+			if (el === oel) {
+				return true;
+			}
+			oel = oel.parentNode;
+		}
+		return false;
+	},
+
+	//Override L.Evented.fire
+	fire: function (type, data, propagate) {
+		if (data && data.layer instanceof L.MarkerCluster) {
+			//Prevent multiple clustermouseover/off events if the icon is made up of stacked divs (Doesn't work in ie <= 8, no relatedTarget)
+			if (data.originalEvent && this._isOrIsParent(data.layer._icon, data.originalEvent.relatedTarget)) {
+				return;
+			}
+			type = 'cluster' + type;
+		}
+
+		L.FeatureGroup.prototype.fire.call(this, type, data, propagate);
+	},
+
+	//Override L.Evented.listens
+	listens: function (type, propagate) {
+		return L.FeatureGroup.prototype.listens.call(this, type, propagate) || L.FeatureGroup.prototype.listens.call(this, 'cluster' + type, propagate);
+	},
+
+	//Default functionality
+	_defaultIconCreateFunction: function (cluster) {
+		var childCount = cluster.getChildCount();
+
+		var c = ' marker-cluster-';
+		if (childCount < 10) {
+			c += 'small';
+		} else if (childCount < 100) {
+			c += 'medium';
+		} else {
+			c += 'large';
+		}
+
+		return new L.DivIcon({ html: '<div><span>' + childCount + '</span></div>', className: 'marker-cluster' + c, iconSize: new L.Point(40, 40) });
+	},
+
+	_bindEvents: function () {
+		var map = this._map,
+		    spiderfyOnMaxZoom = this.options.spiderfyOnMaxZoom,
+		    showCoverageOnHover = this.options.showCoverageOnHover,
+		    zoomToBoundsOnClick = this.options.zoomToBoundsOnClick;
+
+		//Zoom on cluster click or spiderfy if we are at the lowest level
+		if (spiderfyOnMaxZoom || zoomToBoundsOnClick) {
+			this.on('clusterclick', this._zoomOrSpiderfy, this);
+		}
+
+		//Show convex hull (boundary) polygon on mouse over
+		if (showCoverageOnHover) {
+			this.on('clustermouseover', this._showCoverage, this);
+			this.on('clustermouseout', this._hideCoverage, this);
+			map.on('zoomend', this._hideCoverage, this);
+		}
+	},
+
+	_zoomOrSpiderfy: function (e) {
+		var cluster = e.layer,
+		    bottomCluster = cluster;
+
+		while (bottomCluster._childClusters.length === 1) {
+			bottomCluster = bottomCluster._childClusters[0];
+		}
+
+		if (bottomCluster._zoom === this._maxZoom &&
+			bottomCluster._childCount === cluster._childCount &&
+			this.options.spiderfyOnMaxZoom) {
+
+			// All child markers are contained in a single cluster from this._maxZoom to this cluster.
+			cluster.spiderfy();
+		} else if (this.options.zoomToBoundsOnClick) {
+			cluster.zoomToBounds();
+		}
+
+		// Focus the map again for keyboard users.
+		if (e.originalEvent && e.originalEvent.keyCode === 13) {
+			this._map._container.focus();
+		}
+	},
+
+	_showCoverage: function (e) {
+		var map = this._map;
+		if (this._inZoomAnimation) {
+			return;
+		}
+		if (this._shownPolygon) {
+			map.removeLayer(this._shownPolygon);
+		}
+		if (e.layer.getChildCount() > 2 && e.layer !== this._spiderfied) {
+			this._shownPolygon = new L.Polygon(e.layer.getConvexHull(), this.options.polygonOptions);
+			map.addLayer(this._shownPolygon);
+		}
+	},
+
+	_hideCoverage: function () {
+		if (this._shownPolygon) {
+			this._map.removeLayer(this._shownPolygon);
+			this._shownPolygon = null;
+		}
+	},
+
+	_unbindEvents: function () {
+		var spiderfyOnMaxZoom = this.options.spiderfyOnMaxZoom,
+			showCoverageOnHover = this.options.showCoverageOnHover,
+			zoomToBoundsOnClick = this.options.zoomToBoundsOnClick,
+			map = this._map;
+
+		if (spiderfyOnMaxZoom || zoomToBoundsOnClick) {
+			this.off('clusterclick', this._zoomOrSpiderfy, this);
+		}
+		if (showCoverageOnHover) {
+			this.off('clustermouseover', this._showCoverage, this);
+			this.off('clustermouseout', this._hideCoverage, this);
+			map.off('zoomend', this._hideCoverage, this);
+		}
+	},
+
+	_zoomEnd: function () {
+		if (!this._map) { //May have been removed from the map by a zoomEnd handler
+			return;
+		}
+		this._mergeSplitClusters();
+
+		this._zoom = Math.round(this._map._zoom);
+		this._currentShownBounds = this._getExpandedVisibleBounds();
+	},
+
+	_moveEnd: function () {
+		if (this._inZoomAnimation) {
+			return;
+		}
+
+		var newBounds = this._getExpandedVisibleBounds();
+
+		this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, Math.floor(this._map.getMinZoom()), this._zoom, newBounds);
+		this._topClusterLevel._recursivelyAddChildrenToMap(null, Math.round(this._map._zoom), newBounds);
+
+		this._currentShownBounds = newBounds;
+		return;
+	},
+
+	_generateInitialClusters: function () {
+		var maxZoom = Math.ceil(this._map.getMaxZoom()),
+			minZoom = Math.floor(this._map.getMinZoom()),
+			radius = this.options.maxClusterRadius,
+			radiusFn = radius;
+
+		//If we just set maxClusterRadius to a single number, we need to create
+		//a simple function to return that number. Otherwise, we just have to
+		//use the function we've passed in.
+		if (typeof radius !== "function") {
+			radiusFn = function () { return radius; };
+		}
+
+		if (this.options.disableClusteringAtZoom !== null) {
+			maxZoom = this.options.disableClusteringAtZoom - 1;
+		}
+		this._maxZoom = maxZoom;
+		this._gridClusters = {};
+		this._gridUnclustered = {};
+
+		//Set up DistanceGrids for each zoom
+		for (var zoom = maxZoom; zoom >= minZoom; zoom--) {
+			this._gridClusters[zoom] = new L.DistanceGrid(radiusFn(zoom));
+			this._gridUnclustered[zoom] = new L.DistanceGrid(radiusFn(zoom));
+		}
+
+		// Instantiate the appropriate L.MarkerCluster class (animated or not).
+		this._topClusterLevel = new this._markerCluster(this, minZoom - 1);
+	},
+
+	//Zoom: Zoom to start adding at (Pass this._maxZoom to start at the bottom)
+	_addLayer: function (layer, zoom) {
+		var gridClusters = this._gridClusters,
+		    gridUnclustered = this._gridUnclustered,
+			minZoom = Math.floor(this._map.getMinZoom()),
+		    markerPoint, z;
+
+		if (this.options.singleMarkerMode) {
+			this._overrideMarkerIcon(layer);
+		}
+
+		layer.on(this._childMarkerEventHandlers, this);
+
+		//Find the lowest zoom level to slot this one in
+		for (; zoom >= minZoom; zoom--) {
+			markerPoint = this._map.project(layer.getLatLng(), zoom); // calculate pixel position
+
+			//Try find a cluster close by
+			var closest = gridClusters[zoom].getNearObject(markerPoint);
+			if (closest) {
+				closest._addChild(layer);
+				layer.__parent = closest;
+				return;
+			}
+
+			//Try find a marker close by to form a new cluster with
+			closest = gridUnclustered[zoom].getNearObject(markerPoint);
+			if (closest) {
+				var parent = closest.__parent;
+				if (parent) {
+					this._removeLayer(closest, false);
+				}
+
+				//Create new cluster with these 2 in it
+
+				var newCluster = new this._markerCluster(this, zoom, closest, layer);
+				gridClusters[zoom].addObject(newCluster, this._map.project(newCluster._cLatLng, zoom));
+				closest.__parent = newCluster;
+				layer.__parent = newCluster;
+
+				//First create any new intermediate parent clusters that don't exist
+				var lastParent = newCluster;
+				for (z = zoom - 1; z > parent._zoom; z--) {
+					lastParent = new this._markerCluster(this, z, lastParent);
+					gridClusters[z].addObject(lastParent, this._map.project(closest.getLatLng(), z));
+				}
+				parent._addChild(lastParent);
+
+				//Remove closest from this zoom level and any above that it is in, replace with newCluster
+				this._removeFromGridUnclustered(closest, zoom);
+
+				return;
+			}
+
+			//Didn't manage to cluster in at this zoom, record us as a marker here and continue upwards
+			gridUnclustered[zoom].addObject(layer, markerPoint);
+		}
+
+		//Didn't get in anything, add us to the top
+		this._topClusterLevel._addChild(layer);
+		layer.__parent = this._topClusterLevel;
+		return;
+	},
+
+	/**
+	 * Refreshes the icon of all "dirty" visible clusters.
+	 * Non-visible "dirty" clusters will be updated when they are added to the map.
+	 * @private
+	 */
+	_refreshClustersIcons: function () {
+		this._featureGroup.eachLayer(function (c) {
+			if (c instanceof L.MarkerCluster && c._iconNeedsUpdate) {
+				c._updateIcon();
+			}
+		});
+	},
+
+	//Enqueue code to fire after the marker expand/contract has happened
+	_enqueue: function (fn) {
+		this._queue.push(fn);
+		if (!this._queueTimeout) {
+			this._queueTimeout = setTimeout(L.bind(this._processQueue, this), 300);
+		}
+	},
+	_processQueue: function () {
+		for (var i = 0; i < this._queue.length; i++) {
+			this._queue[i].call(this);
+		}
+		this._queue.length = 0;
+		clearTimeout(this._queueTimeout);
+		this._queueTimeout = null;
+	},
+
+	//Merge and split any existing clusters that are too big or small
+	_mergeSplitClusters: function () {
+		var mapZoom = Math.round(this._map._zoom);
+
+		//In case we are starting to split before the animation finished
+		this._processQueue();
+
+		if (this._zoom < mapZoom && this._currentShownBounds.intersects(this._getExpandedVisibleBounds())) { //Zoom in, split
+			this._animationStart();
+			//Remove clusters now off screen
+			this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, Math.floor(this._map.getMinZoom()), this._zoom, this._getExpandedVisibleBounds());
+
+			this._animationZoomIn(this._zoom, mapZoom);
+
+		} else if (this._zoom > mapZoom) { //Zoom out, merge
+			this._animationStart();
+
+			this._animationZoomOut(this._zoom, mapZoom);
+		} else {
+			this._moveEnd();
+		}
+	},
+
+	//Gets the maps visible bounds expanded in each direction by the size of the screen (so the user cannot see an area we do not cover in one pan)
+	_getExpandedVisibleBounds: function () {
+		if (!this.options.removeOutsideVisibleBounds) {
+			return this._mapBoundsInfinite;
+		} else if (L.Browser.mobile) {
+			return this._checkBoundsMaxLat(this._map.getBounds());
+		}
+
+		return this._checkBoundsMaxLat(this._map.getBounds().pad(1)); // Padding expands the bounds by its own dimensions but scaled with the given factor.
+	},
+
+	/**
+	 * Expands the latitude to Infinity (or -Infinity) if the input bounds reach the map projection maximum defined latitude
+	 * (in the case of Web/Spherical Mercator, it is 85.0511287798 / see https://en.wikipedia.org/wiki/Web_Mercator#Formulas).
+	 * Otherwise, the removeOutsideVisibleBounds option will remove markers beyond that limit, whereas the same markers without
+	 * this option (or outside MCG) will have their position floored (ceiled) by the projection and rendered at that limit,
+	 * making the user think that MCG "eats" them and never displays them again.
+	 * @param bounds L.LatLngBounds
+	 * @returns {L.LatLngBounds}
+	 * @private
+	 */
+	_checkBoundsMaxLat: function (bounds) {
+		var maxLat = this._maxLat;
+
+		if (maxLat !== undefined) {
+			if (bounds.getNorth() >= maxLat) {
+				bounds._northEast.lat = Infinity;
+			}
+			if (bounds.getSouth() <= -maxLat) {
+				bounds._southWest.lat = -Infinity;
+			}
+		}
+
+		return bounds;
+	},
+
+	//Shared animation code
+	_animationAddLayerNonAnimated: function (layer, newCluster) {
+		if (newCluster === layer) {
+			this._featureGroup.addLayer(layer);
+		} else if (newCluster._childCount === 2) {
+			newCluster._addToMap();
+
+			var markers = newCluster.getAllChildMarkers();
+			this._featureGroup.removeLayer(markers[0]);
+			this._featureGroup.removeLayer(markers[1]);
+		} else {
+			newCluster._updateIcon();
+		}
+	},
+
+	/**
+	 * Extracts individual (i.e. non-group) layers from a Layer Group.
+	 * @param group to extract layers from.
+	 * @param output {Array} in which to store the extracted layers.
+	 * @returns {*|Array}
+	 * @private
+	 */
+	_extractNonGroupLayers: function (group, output) {
+		var layers = group.getLayers(),
+		    i = 0,
+		    layer;
+
+		output = output || [];
+
+		for (; i < layers.length; i++) {
+			layer = layers[i];
+
+			if (layer instanceof L.LayerGroup) {
+				this._extractNonGroupLayers(layer, output);
+				continue;
+			}
+
+			output.push(layer);
+		}
+
+		return output;
+	},
+
+	/**
+	 * Implements the singleMarkerMode option.
+	 * @param layer Marker to re-style using the Clusters iconCreateFunction.
+	 * @returns {L.Icon} The newly created icon.
+	 * @private
+	 */
+	_overrideMarkerIcon: function (layer) {
+		var icon = layer.options.icon = this.options.iconCreateFunction({
+			getChildCount: function () {
+				return 1;
+			},
+			getAllChildMarkers: function () {
+				return [layer];
+			}
+		});
+
+		return icon;
+	}
+});
+
+// Constant bounds used in case option "removeOutsideVisibleBounds" is set to false.
+L.MarkerClusterGroup.include({
+	_mapBoundsInfinite: new L.LatLngBounds(new L.LatLng(-Infinity, -Infinity), new L.LatLng(Infinity, Infinity))
+});
+
+L.MarkerClusterGroup.include({
+	_noAnimation: {
+		//Non Animated versions of everything
+		_animationStart: function () {
+			//Do nothing...
+		},
+		_animationZoomIn: function (previousZoomLevel, newZoomLevel) {
+			this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, Math.floor(this._map.getMinZoom()), previousZoomLevel);
+			this._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds());
+
+			//We didn't actually animate, but we use this event to mean "clustering animations have finished"
+			this.fire('animationend');
+		},
+		_animationZoomOut: function (previousZoomLevel, newZoomLevel) {
+			this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, Math.floor(this._map.getMinZoom()), previousZoomLevel);
+			this._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds());
+
+			//We didn't actually animate, but we use this event to mean "clustering animations have finished"
+			this.fire('animationend');
+		},
+		_animationAddLayer: function (layer, newCluster) {
+			this._animationAddLayerNonAnimated(layer, newCluster);
+		}
+	},
+
+	_withAnimation: {
+		//Animated versions here
+		_animationStart: function () {
+			this._map._mapPane.className += ' leaflet-cluster-anim';
+			this._inZoomAnimation++;
+		},
+
+		_animationZoomIn: function (previousZoomLevel, newZoomLevel) {
+			var bounds = this._getExpandedVisibleBounds(),
+			    fg = this._featureGroup,
+				minZoom = Math.floor(this._map.getMinZoom()),
+			    i;
+
+			this._ignoreMove = true;
+
+			//Add all children of current clusters to map and remove those clusters from map
+			this._topClusterLevel._recursively(bounds, previousZoomLevel, minZoom, function (c) {
+				var startPos = c._latlng,
+				    markers  = c._markers,
+				    m;
+
+				if (!bounds.contains(startPos)) {
+					startPos = null;
+				}
+
+				if (c._isSingleParent() && previousZoomLevel + 1 === newZoomLevel) { //Immediately add the new child and remove us
+					fg.removeLayer(c);
+					c._recursivelyAddChildrenToMap(null, newZoomLevel, bounds);
+				} else {
+					//Fade out old cluster
+					c.clusterHide();
+					c._recursivelyAddChildrenToMap(startPos, newZoomLevel, bounds);
+				}
+
+				//Remove all markers that aren't visible any more
+				//TODO: Do we actually need to do this on the higher levels too?
+				for (i = markers.length - 1; i >= 0; i--) {
+					m = markers[i];
+					if (!bounds.contains(m._latlng)) {
+						fg.removeLayer(m);
+					}
+				}
+
+			});
+
+			this._forceLayout();
+
+			//Update opacities
+			this._topClusterLevel._recursivelyBecomeVisible(bounds, newZoomLevel);
+			//TODO Maybe? Update markers in _recursivelyBecomeVisible
+			fg.eachLayer(function (n) {
+				if (!(n instanceof L.MarkerCluster) && n._icon) {
+					n.clusterShow();
+				}
+			});
+
+			//update the positions of the just added clusters/markers
+			this._topClusterLevel._recursively(bounds, previousZoomLevel, newZoomLevel, function (c) {
+				c._recursivelyRestoreChildPositions(newZoomLevel);
+			});
+
+			this._ignoreMove = false;
+
+			//Remove the old clusters and close the zoom animation
+			this._enqueue(function () {
+				//update the positions of the just added clusters/markers
+				this._topClusterLevel._recursively(bounds, previousZoomLevel, minZoom, function (c) {
+					fg.removeLayer(c);
+					c.clusterShow();
+				});
+
+				this._animationEnd();
+			});
+		},
+
+		_animationZoomOut: function (previousZoomLevel, newZoomLevel) {
+			this._animationZoomOutSingle(this._topClusterLevel, previousZoomLevel - 1, newZoomLevel);
+
+			//Need to add markers for those that weren't on the map before but are now
+			this._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds());
+			//Remove markers that were on the map before but won't be now
+			this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, Math.floor(this._map.getMinZoom()), previousZoomLevel, this._getExpandedVisibleBounds());
+		},
+
+		_animationAddLayer: function (layer, newCluster) {
+			var me = this,
+			    fg = this._featureGroup;
+
+			fg.addLayer(layer);
+			if (newCluster !== layer) {
+				if (newCluster._childCount > 2) { //Was already a cluster
+
+					newCluster._updateIcon();
+					this._forceLayout();
+					this._animationStart();
+
+					layer._setPos(this._map.latLngToLayerPoint(newCluster.getLatLng()));
+					layer.clusterHide();
+
+					this._enqueue(function () {
+						fg.removeLayer(layer);
+						layer.clusterShow();
+
+						me._animationEnd();
+					});
+
+				} else { //Just became a cluster
+					this._forceLayout();
+
+					me._animationStart();
+					me._animationZoomOutSingle(newCluster, this._map.getMaxZoom(), this._zoom);
+				}
+			}
+		}
+	},
+
+	// Private methods for animated versions.
+	_animationZoomOutSingle: function (cluster, previousZoomLevel, newZoomLevel) {
+		var bounds = this._getExpandedVisibleBounds(),
+			minZoom = Math.floor(this._map.getMinZoom());
+
+		//Animate all of the markers in the clusters to move to their cluster center point
+		cluster._recursivelyAnimateChildrenInAndAddSelfToMap(bounds, minZoom, previousZoomLevel + 1, newZoomLevel);
+
+		var me = this;
+
+		//Update the opacity (If we immediately set it they won't animate)
+		this._forceLayout();
+		cluster._recursivelyBecomeVisible(bounds, newZoomLevel);
+
+		//TODO: Maybe use the transition timing stuff to make this more reliable
+		//When the animations are done, tidy up
+		this._enqueue(function () {
+
+			//This cluster stopped being a cluster before the timeout fired
+			if (cluster._childCount === 1) {
+				var m = cluster._markers[0];
+				//If we were in a cluster animation at the time then the opacity and position of our child could be wrong now, so fix it
+				this._ignoreMove = true;
+				m.setLatLng(m.getLatLng());
+				this._ignoreMove = false;
+				if (m.clusterShow) {
+					m.clusterShow();
+				}
+			} else {
+				cluster._recursively(bounds, newZoomLevel, minZoom, function (c) {
+					c._recursivelyRemoveChildrenFromMap(bounds, minZoom, previousZoomLevel + 1);
+				});
+			}
+			me._animationEnd();
+		});
+	},
+
+	_animationEnd: function () {
+		if (this._map) {
+			this._map._mapPane.className = this._map._mapPane.className.replace(' leaflet-cluster-anim', '');
+		}
+		this._inZoomAnimation--;
+		this.fire('animationend');
+	},
+
+	//Force a browser layout of stuff in the map
+	// Should apply the current opacity and location to all elements so we can update them again for an animation
+	_forceLayout: function () {
+		//In my testing this works, infact offsetWidth of any element seems to work.
+		//Could loop all this._layers and do this for each _icon if it stops working
+
+		L.Util.falseFn(document.body.offsetWidth);
+	}
+});
+
+L.markerClusterGroup = function (options) {
+	return new L.MarkerClusterGroup(options);
+};
+
+var MarkerCluster = L.MarkerCluster = L.Marker.extend({
+	options: L.Icon.prototype.options,
+
+	initialize: function (group, zoom, a, b) {
+
+		L.Marker.prototype.initialize.call(this, a ? (a._cLatLng || a.getLatLng()) : new L.LatLng(0, 0),
+            { icon: this, pane: group.options.clusterPane });
+
+		this._group = group;
+		this._zoom = zoom;
+
+		this._markers = [];
+		this._childClusters = [];
+		this._childCount = 0;
+		this._iconNeedsUpdate = true;
+		this._boundsNeedUpdate = true;
+
+		this._bounds = new L.LatLngBounds();
+
+		if (a) {
+			this._addChild(a);
+		}
+		if (b) {
+			this._addChild(b);
+		}
+	},
+
+	//Recursively retrieve all child markers of this cluster
+	getAllChildMarkers: function (storageArray, ignoreDraggedMarker) {
+		storageArray = storageArray || [];
+
+		for (var i = this._childClusters.length - 1; i >= 0; i--) {
+			this._childClusters[i].getAllChildMarkers(storageArray);
+		}
+
+		for (var j = this._markers.length - 1; j >= 0; j--) {
+			if (ignoreDraggedMarker && this._markers[j].__dragStart) {
+				continue;
+			}
+			storageArray.push(this._markers[j]);
+		}
+
+		return storageArray;
+	},
+
+	//Returns the count of how many child markers we have
+	getChildCount: function () {
+		return this._childCount;
+	},
+
+	//Zoom to the minimum of showing all of the child markers, or the extents of this cluster
+	zoomToBounds: function (fitBoundsOptions) {
+		var childClusters = this._childClusters.slice(),
+			map = this._group._map,
+			boundsZoom = map.getBoundsZoom(this._bounds),
+			zoom = this._zoom + 1,
+			mapZoom = map.getZoom(),
+			i;
+
+		//calculate how far we need to zoom down to see all of the markers
+		while (childClusters.length > 0 && boundsZoom > zoom) {
+			zoom++;
+			var newClusters = [];
+			for (i = 0; i < childClusters.length; i++) {
+				newClusters = newClusters.concat(childClusters[i]._childClusters);
+			}
+			childClusters = newClusters;
+		}
+
+		if (boundsZoom > zoom) {
+			this._group._map.setView(this._latlng, zoom);
+		} else if (boundsZoom <= mapZoom) { //If fitBounds wouldn't zoom us down, zoom us down instead
+			this._group._map.setView(this._latlng, mapZoom + 1);
+		} else {
+			this._group._map.fitBounds(this._bounds, fitBoundsOptions);
+		}
+	},
+
+	getBounds: function () {
+		var bounds = new L.LatLngBounds();
+		bounds.extend(this._bounds);
+		return bounds;
+	},
+
+	_updateIcon: function () {
+		this._iconNeedsUpdate = true;
+		if (this._icon) {
+			this.setIcon(this);
+		}
+	},
+
+	//Cludge for Icon, we pretend to be an icon for performance
+	createIcon: function () {
+		if (this._iconNeedsUpdate) {
+			this._iconObj = this._group.options.iconCreateFunction(this);
+			this._iconNeedsUpdate = false;
+		}
+		return this._iconObj.createIcon();
+	},
+	createShadow: function () {
+		return this._iconObj.createShadow();
+	},
+
+
+	_addChild: function (new1, isNotificationFromChild) {
+
+		this._iconNeedsUpdate = true;
+
+		this._boundsNeedUpdate = true;
+		this._setClusterCenter(new1);
+
+		if (new1 instanceof L.MarkerCluster) {
+			if (!isNotificationFromChild) {
+				this._childClusters.push(new1);
+				new1.__parent = this;
+			}
+			this._childCount += new1._childCount;
+		} else {
+			if (!isNotificationFromChild) {
+				this._markers.push(new1);
+			}
+			this._childCount++;
+		}
+
+		if (this.__parent) {
+			this.__parent._addChild(new1, true);
+		}
+	},
+
+	/**
+	 * Makes sure the cluster center is set. If not, uses the child center if it is a cluster, or the marker position.
+	 * @param child L.MarkerCluster|L.Marker that will be used as cluster center if not defined yet.
+	 * @private
+	 */
+	_setClusterCenter: function (child) {
+		if (!this._cLatLng) {
+			// when clustering, take position of the first point as the cluster center
+			this._cLatLng = child._cLatLng || child._latlng;
+		}
+	},
+
+	/**
+	 * Assigns impossible bounding values so that the next extend entirely determines the new bounds.
+	 * This method avoids having to trash the previous L.LatLngBounds object and to create a new one, which is much slower for this class.
+	 * As long as the bounds are not extended, most other methods would probably fail, as they would with bounds initialized but not extended.
+	 * @private
+	 */
+	_resetBounds: function () {
+		var bounds = this._bounds;
+
+		if (bounds._southWest) {
+			bounds._southWest.lat = Infinity;
+			bounds._southWest.lng = Infinity;
+		}
+		if (bounds._northEast) {
+			bounds._northEast.lat = -Infinity;
+			bounds._northEast.lng = -Infinity;
+		}
+	},
+
+	_recalculateBounds: function () {
+		var markers = this._markers,
+		    childClusters = this._childClusters,
+		    latSum = 0,
+		    lngSum = 0,
+		    totalCount = this._childCount,
+		    i, child, childLatLng, childCount;
+
+		// Case where all markers are removed from the map and we are left with just an empty _topClusterLevel.
+		if (totalCount === 0) {
+			return;
+		}
+
+		// Reset rather than creating a new object, for performance.
+		this._resetBounds();
+
+		// Child markers.
+		for (i = 0; i < markers.length; i++) {
+			childLatLng = markers[i]._latlng;
+
+			this._bounds.extend(childLatLng);
+
+			latSum += childLatLng.lat;
+			lngSum += childLatLng.lng;
+		}
+
+		// Child clusters.
+		for (i = 0; i < childClusters.length; i++) {
+			child = childClusters[i];
+
+			// Re-compute child bounds and weighted position first if necessary.
+			if (child._boundsNeedUpdate) {
+				child._recalculateBounds();
+			}
+
+			this._bounds.extend(child._bounds);
+
+			childLatLng = child._wLatLng;
+			childCount = child._childCount;
+
+			latSum += childLatLng.lat * childCount;
+			lngSum += childLatLng.lng * childCount;
+		}
+
+		this._latlng = this._wLatLng = new L.LatLng(latSum / totalCount, lngSum / totalCount);
+
+		// Reset dirty flag.
+		this._boundsNeedUpdate = false;
+	},
+
+	//Set our markers position as given and add it to the map
+	_addToMap: function (startPos) {
+		if (startPos) {
+			this._backupLatlng = this._latlng;
+			this.setLatLng(startPos);
+		}
+		this._group._featureGroup.addLayer(this);
+	},
+
+	_recursivelyAnimateChildrenIn: function (bounds, center, maxZoom) {
+		this._recursively(bounds, this._group._map.getMinZoom(), maxZoom - 1,
+			function (c) {
+				var markers = c._markers,
+					i, m;
+				for (i = markers.length - 1; i >= 0; i--) {
+					m = markers[i];
+
+					//Only do it if the icon is still on the map
+					if (m._icon) {
+						m._setPos(center);
+						m.clusterHide();
+					}
+				}
+			},
+			function (c) {
+				var childClusters = c._childClusters,
+					j, cm;
+				for (j = childClusters.length - 1; j >= 0; j--) {
+					cm = childClusters[j];
+					if (cm._icon) {
+						cm._setPos(center);
+						cm.clusterHide();
+					}
+				}
+			}
+		);
+	},
+
+	_recursivelyAnimateChildrenInAndAddSelfToMap: function (bounds, mapMinZoom, previousZoomLevel, newZoomLevel) {
+		this._recursively(bounds, newZoomLevel, mapMinZoom,
+			function (c) {
+				c._recursivelyAnimateChildrenIn(bounds, c._group._map.latLngToLayerPoint(c.getLatLng()).round(), previousZoomLevel);
+
+				//TODO: depthToAnimateIn affects _isSingleParent, if there is a multizoom we may/may not be.
+				//As a hack we only do a animation free zoom on a single level zoom, if someone does multiple levels then we always animate
+				if (c._isSingleParent() && previousZoomLevel - 1 === newZoomLevel) {
+					c.clusterShow();
+					c._recursivelyRemoveChildrenFromMap(bounds, mapMinZoom, previousZoomLevel); //Immediately remove our children as we are replacing them. TODO previousBounds not bounds
+				} else {
+					c.clusterHide();
+				}
+
+				c._addToMap();
+			}
+		);
+	},
+
+	_recursivelyBecomeVisible: function (bounds, zoomLevel) {
+		this._recursively(bounds, this._group._map.getMinZoom(), zoomLevel, null, function (c) {
+			c.clusterShow();
+		});
+	},
+
+	_recursivelyAddChildrenToMap: function (startPos, zoomLevel, bounds) {
+		this._recursively(bounds, this._group._map.getMinZoom() - 1, zoomLevel,
+			function (c) {
+				if (zoomLevel === c._zoom) {
+					return;
+				}
+
+				//Add our child markers at startPos (so they can be animated out)
+				for (var i = c._markers.length - 1; i >= 0; i--) {
+					var nm = c._markers[i];
+
+					if (!bounds.contains(nm._latlng)) {
+						continue;
+					}
+
+					if (startPos) {
+						nm._backupLatlng = nm.getLatLng();
+
+						nm.setLatLng(startPos);
+						if (nm.clusterHide) {
+							nm.clusterHide();
+						}
+					}
+
+					c._group._featureGroup.addLayer(nm);
+				}
+			},
+			function (c) {
+				c._addToMap(startPos);
+			}
+		);
+	},
+
+	_recursivelyRestoreChildPositions: function (zoomLevel) {
+		//Fix positions of child markers
+		for (var i = this._markers.length - 1; i >= 0; i--) {
+			var nm = this._markers[i];
+			if (nm._backupLatlng) {
+				nm.setLatLng(nm._backupLatlng);
+				delete nm._backupLatlng;
+			}
+		}
+
+		if (zoomLevel - 1 === this._zoom) {
+			//Reposition child clusters
+			for (var j = this._childClusters.length - 1; j >= 0; j--) {
+				this._childClusters[j]._restorePosition();
+			}
+		} else {
+			for (var k = this._childClusters.length - 1; k >= 0; k--) {
+				this._childClusters[k]._recursivelyRestoreChildPositions(zoomLevel);
+			}
+		}
+	},
+
+	_restorePosition: function () {
+		if (this._backupLatlng) {
+			this.setLatLng(this._backupLatlng);
+			delete this._backupLatlng;
+		}
+	},
+
+	//exceptBounds: If set, don't remove any markers/clusters in it
+	_recursivelyRemoveChildrenFromMap: function (previousBounds, mapMinZoom, zoomLevel, exceptBounds) {
+		var m, i;
+		this._recursively(previousBounds, mapMinZoom - 1, zoomLevel - 1,
+			function (c) {
+				//Remove markers at every level
+				for (i = c._markers.length - 1; i >= 0; i--) {
+					m = c._markers[i];
+					if (!exceptBounds || !exceptBounds.contains(m._latlng)) {
+						c._group._featureGroup.removeLayer(m);
+						if (m.clusterShow) {
+							m.clusterShow();
+						}
+					}
+				}
+			},
+			function (c) {
+				//Remove child clusters at just the bottom level
+				for (i = c._childClusters.length - 1; i >= 0; i--) {
+					m = c._childClusters[i];
+					if (!exceptBounds || !exceptBounds.contains(m._latlng)) {
+						c._group._featureGroup.removeLayer(m);
+						if (m.clusterShow) {
+							m.clusterShow();
+						}
+					}
+				}
+			}
+		);
+	},
+
+	//Run the given functions recursively to this and child clusters
+	// boundsToApplyTo: a L.LatLngBounds representing the bounds of what clusters to recurse in to
+	// zoomLevelToStart: zoom level to start running functions (inclusive)
+	// zoomLevelToStop: zoom level to stop running functions (inclusive)
+	// runAtEveryLevel: function that takes an L.MarkerCluster as an argument that should be applied on every level
+	// runAtBottomLevel: function that takes an L.MarkerCluster as an argument that should be applied at only the bottom level
+	_recursively: function (boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel) {
+		var childClusters = this._childClusters,
+		    zoom = this._zoom,
+		    i, c;
+
+		if (zoomLevelToStart <= zoom) {
+			if (runAtEveryLevel) {
+				runAtEveryLevel(this);
+			}
+			if (runAtBottomLevel && zoom === zoomLevelToStop) {
+				runAtBottomLevel(this);
+			}
+		}
+
+		if (zoom < zoomLevelToStart || zoom < zoomLevelToStop) {
+			for (i = childClusters.length - 1; i >= 0; i--) {
+				c = childClusters[i];
+				if (c._boundsNeedUpdate) {
+					c._recalculateBounds();
+				}
+				if (boundsToApplyTo.intersects(c._bounds)) {
+					c._recursively(boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel);
+				}
+			}
+		}
+	},
+
+	//Returns true if we are the parent of only one cluster and that cluster is the same as us
+	_isSingleParent: function () {
+		//Don't need to check this._markers as the rest won't work if there are any
+		return this._childClusters.length > 0 && this._childClusters[0]._childCount === this._childCount;
+	}
+});
+
+/*
+* Extends L.Marker to include two extra methods: clusterHide and clusterShow.
+* 
+* They work as setOpacity(0) and setOpacity(1) respectively, but
+* don't overwrite the options.opacity
+* 
+*/
+
+L.Marker.include({
+	clusterHide: function () {
+		var backup = this.options.opacity;
+		this.setOpacity(0);
+		this.options.opacity = backup;
+		return this;
+	},
+	
+	clusterShow: function () {
+		return this.setOpacity(this.options.opacity);
+	}
+});
+
+L.DistanceGrid = function (cellSize) {
+	this._cellSize = cellSize;
+	this._sqCellSize = cellSize * cellSize;
+	this._grid = {};
+	this._objectPoint = { };
+};
+
+L.DistanceGrid.prototype = {
+
+	addObject: function (obj, point) {
+		var x = this._getCoord(point.x),
+		    y = this._getCoord(point.y),
+		    grid = this._grid,
+		    row = grid[y] = grid[y] || {},
+		    cell = row[x] = row[x] || [],
+		    stamp = L.Util.stamp(obj);
+
+		this._objectPoint[stamp] = point;
+
+		cell.push(obj);
+	},
+
+	updateObject: function (obj, point) {
+		this.removeObject(obj);
+		this.addObject(obj, point);
+	},
+
+	//Returns true if the object was found
+	removeObject: function (obj, point) {
+		var x = this._getCoord(point.x),
+		    y = this._getCoord(point.y),
+		    grid = this._grid,
+		    row = grid[y] = grid[y] || {},
+		    cell = row[x] = row[x] || [],
+		    i, len;
+
+		delete this._objectPoint[L.Util.stamp(obj)];
+
+		for (i = 0, len = cell.length; i < len; i++) {
+			if (cell[i] === obj) {
+
+				cell.splice(i, 1);
+
+				if (len === 1) {
+					delete row[x];
+				}
+
+				return true;
+			}
+		}
+
+	},
+
+	eachObject: function (fn, context) {
+		var i, j, k, len, row, cell, removed,
+		    grid = this._grid;
+
+		for (i in grid) {
+			row = grid[i];
+
+			for (j in row) {
+				cell = row[j];
+
+				for (k = 0, len = cell.length; k < len; k++) {
+					removed = fn.call(context, cell[k]);
+					if (removed) {
+						k--;
+						len--;
+					}
+				}
+			}
+		}
+	},
+
+	getNearObject: function (point) {
+		var x = this._getCoord(point.x),
+		    y = this._getCoord(point.y),
+		    i, j, k, row, cell, len, obj, dist,
+		    objectPoint = this._objectPoint,
+		    closestDistSq = this._sqCellSize,
+		    closest = null;
+
+		for (i = y - 1; i <= y + 1; i++) {
+			row = this._grid[i];
+			if (row) {
+
+				for (j = x - 1; j <= x + 1; j++) {
+					cell = row[j];
+					if (cell) {
+
+						for (k = 0, len = cell.length; k < len; k++) {
+							obj = cell[k];
+							dist = this._sqDist(objectPoint[L.Util.stamp(obj)], point);
+							if (dist < closestDistSq ||
+								dist <= closestDistSq && closest === null) {
+								closestDistSq = dist;
+								closest = obj;
+							}
+						}
+					}
+				}
+			}
+		}
+		return closest;
+	},
+
+	_getCoord: function (x) {
+		var coord = Math.floor(x / this._cellSize);
+		return isFinite(coord) ? coord : x;
+	},
+
+	_sqDist: function (p, p2) {
+		var dx = p2.x - p.x,
+		    dy = p2.y - p.y;
+		return dx * dx + dy * dy;
+	}
+};
+
+/* Copyright (c) 2012 the authors listed at the following URL, and/or
+the authors of referenced articles or incorporated external code:
+http://en.literateprograms.org/Quickhull_(Javascript)?action=history&offset=20120410175256
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Retrieved from: http://en.literateprograms.org/Quickhull_(Javascript)?oldid=18434
+*/
+
+(function () {
+	L.QuickHull = {
+
+		/*
+		 * @param {Object} cpt a point to be measured from the baseline
+		 * @param {Array} bl the baseline, as represented by a two-element
+		 *   array of latlng objects.
+		 * @returns {Number} an approximate distance measure
+		 */
+		getDistant: function (cpt, bl) {
+			var vY = bl[1].lat - bl[0].lat,
+				vX = bl[0].lng - bl[1].lng;
+			return (vX * (cpt.lat - bl[0].lat) + vY * (cpt.lng - bl[0].lng));
+		},
+
+		/*
+		 * @param {Array} baseLine a two-element array of latlng objects
+		 *   representing the baseline to project from
+		 * @param {Array} latLngs an array of latlng objects
+		 * @returns {Object} the maximum point and all new points to stay
+		 *   in consideration for the hull.
+		 */
+		findMostDistantPointFromBaseLine: function (baseLine, latLngs) {
+			var maxD = 0,
+				maxPt = null,
+				newPoints = [],
+				i, pt, d;
+
+			for (i = latLngs.length - 1; i >= 0; i--) {
+				pt = latLngs[i];
+				d = this.getDistant(pt, baseLine);
+
+				if (d > 0) {
+					newPoints.push(pt);
+				} else {
+					continue;
+				}
+
+				if (d > maxD) {
+					maxD = d;
+					maxPt = pt;
+				}
+			}
+
+			return { maxPoint: maxPt, newPoints: newPoints };
+		},
+
+
+		/*
+		 * Given a baseline, compute the convex hull of latLngs as an array
+		 * of latLngs.
+		 *
+		 * @param {Array} latLngs
+		 * @returns {Array}
+		 */
+		buildConvexHull: function (baseLine, latLngs) {
+			var convexHullBaseLines = [],
+				t = this.findMostDistantPointFromBaseLine(baseLine, latLngs);
+
+			if (t.maxPoint) { // if there is still a point "outside" the base line
+				convexHullBaseLines =
+					convexHullBaseLines.concat(
+						this.buildConvexHull([baseLine[0], t.maxPoint], t.newPoints)
+					);
+				convexHullBaseLines =
+					convexHullBaseLines.concat(
+						this.buildConvexHull([t.maxPoint, baseLine[1]], t.newPoints)
+					);
+				return convexHullBaseLines;
+			} else {  // if there is no more point "outside" the base line, the current base line is part of the convex hull
+				return [baseLine[0]];
+			}
+		},
+
+		/*
+		 * Given an array of latlngs, compute a convex hull as an array
+		 * of latlngs
+		 *
+		 * @param {Array} latLngs
+		 * @returns {Array}
+		 */
+		getConvexHull: function (latLngs) {
+			// find first baseline
+			var maxLat = false, minLat = false,
+				maxLng = false, minLng = false,
+				maxLatPt = null, minLatPt = null,
+				maxLngPt = null, minLngPt = null,
+				maxPt = null, minPt = null,
+				i;
+
+			for (i = latLngs.length - 1; i >= 0; i--) {
+				var pt = latLngs[i];
+				if (maxLat === false || pt.lat > maxLat) {
+					maxLatPt = pt;
+					maxLat = pt.lat;
+				}
+				if (minLat === false || pt.lat < minLat) {
+					minLatPt = pt;
+					minLat = pt.lat;
+				}
+				if (maxLng === false || pt.lng > maxLng) {
+					maxLngPt = pt;
+					maxLng = pt.lng;
+				}
+				if (minLng === false || pt.lng < minLng) {
+					minLngPt = pt;
+					minLng = pt.lng;
+				}
+			}
+			
+			if (minLat !== maxLat) {
+				minPt = minLatPt;
+				maxPt = maxLatPt;
+			} else {
+				minPt = minLngPt;
+				maxPt = maxLngPt;
+			}
+
+			var ch = [].concat(this.buildConvexHull([minPt, maxPt], latLngs),
+								this.buildConvexHull([maxPt, minPt], latLngs));
+			return ch;
+		}
+	};
+}());
+
+L.MarkerCluster.include({
+	getConvexHull: function () {
+		var childMarkers = this.getAllChildMarkers(),
+			points = [],
+			p, i;
+
+		for (i = childMarkers.length - 1; i >= 0; i--) {
+			p = childMarkers[i].getLatLng();
+			points.push(p);
+		}
+
+		return L.QuickHull.getConvexHull(points);
+	}
+});
+
+//This code is 100% based on https://github.com/jawj/OverlappingMarkerSpiderfier-Leaflet
+//Huge thanks to jawj for implementing it first to make my job easy :-)
+
+L.MarkerCluster.include({
+
+	_2PI: Math.PI * 2,
+	_circleFootSeparation: 25, //related to circumference of circle
+	_circleStartAngle: 0,
+
+	_spiralFootSeparation:  28, //related to size of spiral (experiment!)
+	_spiralLengthStart: 11,
+	_spiralLengthFactor: 5,
+
+	_circleSpiralSwitchover: 9, //show spiral instead of circle from this marker count upwards.
+								// 0 -> always spiral; Infinity -> always circle
+
+	spiderfy: function () {
+		if (this._group._spiderfied === this || this._group._inZoomAnimation) {
+			return;
+		}
+
+		var childMarkers = this.getAllChildMarkers(null, true),
+			group = this._group,
+			map = group._map,
+			center = map.latLngToLayerPoint(this._latlng),
+			positions;
+
+		this._group._unspiderfy();
+		this._group._spiderfied = this;
+
+		//TODO Maybe: childMarkers order by distance to center
+
+		if (childMarkers.length >= this._circleSpiralSwitchover) {
+			positions = this._generatePointsSpiral(childMarkers.length, center);
+		} else {
+			center.y += 10; // Otherwise circles look wrong => hack for standard blue icon, renders differently for other icons.
+			positions = this._generatePointsCircle(childMarkers.length, center);
+		}
+
+		this._animationSpiderfy(childMarkers, positions);
+	},
+
+	unspiderfy: function (zoomDetails) {
+		/// <param Name="zoomDetails">Argument from zoomanim if being called in a zoom animation or null otherwise</param>
+		if (this._group._inZoomAnimation) {
+			return;
+		}
+		this._animationUnspiderfy(zoomDetails);
+
+		this._group._spiderfied = null;
+	},
+
+	_generatePointsCircle: function (count, centerPt) {
+		var circumference = this._group.options.spiderfyDistanceMultiplier * this._circleFootSeparation * (2 + count),
+			legLength = circumference / this._2PI,  //radius from circumference
+			angleStep = this._2PI / count,
+			res = [],
+			i, angle;
+
+		legLength = Math.max(legLength, 35); // Minimum distance to get outside the cluster icon.
+
+		res.length = count;
+
+		for (i = 0; i < count; i++) { // Clockwise, like spiral.
+			angle = this._circleStartAngle + i * angleStep;
+			res[i] = new L.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))._round();
+		}
+
+		return res;
+	},
+
+	_generatePointsSpiral: function (count, centerPt) {
+		var spiderfyDistanceMultiplier = this._group.options.spiderfyDistanceMultiplier,
+			legLength = spiderfyDistanceMultiplier * this._spiralLengthStart,
+			separation = spiderfyDistanceMultiplier * this._spiralFootSeparation,
+			lengthFactor = spiderfyDistanceMultiplier * this._spiralLengthFactor * this._2PI,
+			angle = 0,
+			res = [],
+			i;
+
+		res.length = count;
+
+		// Higher index, closer position to cluster center.
+		for (i = count; i >= 0; i--) {
+			// Skip the first position, so that we are already farther from center and we avoid
+			// being under the default cluster icon (especially important for Circle Markers).
+			if (i < count) {
+				res[i] = new L.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))._round();
+			}
+			angle += separation / legLength + i * 0.0005;
+			legLength += lengthFactor / angle;
+		}
+		return res;
+	},
+
+	_noanimationUnspiderfy: function () {
+		var group = this._group,
+			map = group._map,
+			fg = group._featureGroup,
+			childMarkers = this.getAllChildMarkers(null, true),
+			m, i;
+
+		group._ignoreMove = true;
+
+		this.setOpacity(1);
+		for (i = childMarkers.length - 1; i >= 0; i--) {
+			m = childMarkers[i];
+
+			fg.removeLayer(m);
+
+			if (m._preSpiderfyLatlng) {
+				m.setLatLng(m._preSpiderfyLatlng);
+				delete m._preSpiderfyLatlng;
+			}
+			if (m.setZIndexOffset) {
+				m.setZIndexOffset(0);
+			}
+
+			if (m._spiderLeg) {
+				map.removeLayer(m._spiderLeg);
+				delete m._spiderLeg;
+			}
+		}
+
+		group.fire('unspiderfied', {
+			cluster: this,
+			markers: childMarkers
+		});
+		group._ignoreMove = false;
+		group._spiderfied = null;
+	}
+});
+
+//Non Animated versions of everything
+L.MarkerClusterNonAnimated = L.MarkerCluster.extend({
+	_animationSpiderfy: function (childMarkers, positions) {
+		var group = this._group,
+			map = group._map,
+			fg = group._featureGroup,
+			legOptions = this._group.options.spiderLegPolylineOptions,
+			i, m, leg, newPos;
+
+		group._ignoreMove = true;
+
+		// Traverse in ascending order to make sure that inner circleMarkers are on top of further legs. Normal markers are re-ordered by newPosition.
+		// The reverse order trick no longer improves performance on modern browsers.
+		for (i = 0; i < childMarkers.length; i++) {
+			newPos = map.layerPointToLatLng(positions[i]);
+			m = childMarkers[i];
+
+			// Add the leg before the marker, so that in case the latter is a circleMarker, the leg is behind it.
+			leg = new L.Polyline([this._latlng, newPos], legOptions);
+			map.addLayer(leg);
+			m._spiderLeg = leg;
+
+			// Now add the marker.
+			m._preSpiderfyLatlng = m._latlng;
+			m.setLatLng(newPos);
+			if (m.setZIndexOffset) {
+				m.setZIndexOffset(1000000); //Make these appear on top of EVERYTHING
+			}
+
+			fg.addLayer(m);
+		}
+		this.setOpacity(0.3);
+
+		group._ignoreMove = false;
+		group.fire('spiderfied', {
+			cluster: this,
+			markers: childMarkers
+		});
+	},
+
+	_animationUnspiderfy: function () {
+		this._noanimationUnspiderfy();
+	}
+});
+
+//Animated versions here
+L.MarkerCluster.include({
+
+	_animationSpiderfy: function (childMarkers, positions) {
+		var me = this,
+			group = this._group,
+			map = group._map,
+			fg = group._featureGroup,
+			thisLayerLatLng = this._latlng,
+			thisLayerPos = map.latLngToLayerPoint(thisLayerLatLng),
+			svg = L.Path.SVG,
+			legOptions = L.extend({}, this._group.options.spiderLegPolylineOptions), // Copy the options so that we can modify them for animation.
+			finalLegOpacity = legOptions.opacity,
+			i, m, leg, legPath, legLength, newPos;
+
+		if (finalLegOpacity === undefined) {
+			finalLegOpacity = L.MarkerClusterGroup.prototype.options.spiderLegPolylineOptions.opacity;
+		}
+
+		if (svg) {
+			// If the initial opacity of the spider leg is not 0 then it appears before the animation starts.
+			legOptions.opacity = 0;
+
+			// Add the class for CSS transitions.
+			legOptions.className = (legOptions.className || '') + ' leaflet-cluster-spider-leg';
+		} else {
+			// Make sure we have a defined opacity.
+			legOptions.opacity = finalLegOpacity;
+		}
+
+		group._ignoreMove = true;
+
+		// Add markers and spider legs to map, hidden at our center point.
+		// Traverse in ascending order to make sure that inner circleMarkers are on top of further legs. Normal markers are re-ordered by newPosition.
+		// The reverse order trick no longer improves performance on modern browsers.
+		for (i = 0; i < childMarkers.length; i++) {
+			m = childMarkers[i];
+
+			newPos = map.layerPointToLatLng(positions[i]);
+
+			// Add the leg before the marker, so that in case the latter is a circleMarker, the leg is behind it.
+			leg = new L.Polyline([thisLayerLatLng, newPos], legOptions);
+			map.addLayer(leg);
+			m._spiderLeg = leg;
+
+			// Explanations: https://jakearchibald.com/2013/animated-line-drawing-svg/
+			// In our case the transition property is declared in the CSS file.
+			if (svg) {
+				legPath = leg._path;
+				legLength = legPath.getTotalLength() + 0.1; // Need a small extra length to avoid remaining dot in Firefox.
+				legPath.style.strokeDasharray = legLength; // Just 1 length is enough, it will be duplicated.
+				legPath.style.strokeDashoffset = legLength;
+			}
+
+			// If it is a marker, add it now and we'll animate it out
+			if (m.setZIndexOffset) {
+				m.setZIndexOffset(1000000); // Make normal markers appear on top of EVERYTHING
+			}
+			if (m.clusterHide) {
+				m.clusterHide();
+			}
+			
+			// Vectors just get immediately added
+			fg.addLayer(m);
+
+			if (m._setPos) {
+				m._setPos(thisLayerPos);
+			}
+		}
+
+		group._forceLayout();
+		group._animationStart();
+
+		// Reveal markers and spider legs.
+		for (i = childMarkers.length - 1; i >= 0; i--) {
+			newPos = map.layerPointToLatLng(positions[i]);
+			m = childMarkers[i];
+
+			//Move marker to new position
+			m._preSpiderfyLatlng = m._latlng;
+			m.setLatLng(newPos);
+			
+			if (m.clusterShow) {
+				m.clusterShow();
+			}
+
+			// Animate leg (animation is actually delegated to CSS transition).
+			if (svg) {
+				leg = m._spiderLeg;
+				legPath = leg._path;
+				legPath.style.strokeDashoffset = 0;
+				//legPath.style.strokeOpacity = finalLegOpacity;
+				leg.setStyle({opacity: finalLegOpacity});
+			}
+		}
+		this.setOpacity(0.3);
+
+		group._ignoreMove = false;
+
+		setTimeout(function () {
+			group._animationEnd();
+			group.fire('spiderfied', {
+				cluster: me,
+				markers: childMarkers
+			});
+		}, 200);
+	},
+
+	_animationUnspiderfy: function (zoomDetails) {
+		var me = this,
+			group = this._group,
+			map = group._map,
+			fg = group._featureGroup,
+			thisLayerPos = zoomDetails ? map._latLngToNewLayerPoint(this._latlng, zoomDetails.zoom, zoomDetails.center) : map.latLngToLayerPoint(this._latlng),
+			childMarkers = this.getAllChildMarkers(null, true),
+			svg = L.Path.SVG,
+			m, i, leg, legPath, legLength, nonAnimatable;
+
+		group._ignoreMove = true;
+		group._animationStart();
+
+		//Make us visible and bring the child markers back in
+		this.setOpacity(1);
+		for (i = childMarkers.length - 1; i >= 0; i--) {
+			m = childMarkers[i];
+
+			//Marker was added to us after we were spiderfied
+			if (!m._preSpiderfyLatlng) {
+				continue;
+			}
+
+			//Close any popup on the marker first, otherwise setting the location of the marker will make the map scroll
+			m.closePopup();
+
+			//Fix up the location to the real one
+			m.setLatLng(m._preSpiderfyLatlng);
+			delete m._preSpiderfyLatlng;
+
+			//Hack override the location to be our center
+			nonAnimatable = true;
+			if (m._setPos) {
+				m._setPos(thisLayerPos);
+				nonAnimatable = false;
+			}
+			if (m.clusterHide) {
+				m.clusterHide();
+				nonAnimatable = false;
+			}
+			if (nonAnimatable) {
+				fg.removeLayer(m);
+			}
+
+			// Animate the spider leg back in (animation is actually delegated to CSS transition).
+			if (svg) {
+				leg = m._spiderLeg;
+				legPath = leg._path;
+				legLength = legPath.getTotalLength() + 0.1;
+				legPath.style.strokeDashoffset = legLength;
+				leg.setStyle({opacity: 0});
+			}
+		}
+
+		group._ignoreMove = false;
+
+		setTimeout(function () {
+			//If we have only <= one child left then that marker will be shown on the map so don't remove it!
+			var stillThereChildCount = 0;
+			for (i = childMarkers.length - 1; i >= 0; i--) {
+				m = childMarkers[i];
+				if (m._spiderLeg) {
+					stillThereChildCount++;
+				}
+			}
+
+
+			for (i = childMarkers.length - 1; i >= 0; i--) {
+				m = childMarkers[i];
+
+				if (!m._spiderLeg) { //Has already been unspiderfied
+					continue;
+				}
+
+				if (m.clusterShow) {
+					m.clusterShow();
+				}
+				if (m.setZIndexOffset) {
+					m.setZIndexOffset(0);
+				}
+
+				if (stillThereChildCount > 1) {
+					fg.removeLayer(m);
+				}
+
+				map.removeLayer(m._spiderLeg);
+				delete m._spiderLeg;
+			}
+			group._animationEnd();
+			group.fire('unspiderfied', {
+				cluster: me,
+				markers: childMarkers
+			});
+		}, 200);
+	}
+});
+
+
+L.MarkerClusterGroup.include({
+	//The MarkerCluster currently spiderfied (if any)
+	_spiderfied: null,
+
+	unspiderfy: function () {
+		this._unspiderfy.apply(this, arguments);
+	},
+
+	_spiderfierOnAdd: function () {
+		this._map.on('click', this._unspiderfyWrapper, this);
+
+		if (this._map.options.zoomAnimation) {
+			this._map.on('zoomstart', this._unspiderfyZoomStart, this);
+		}
+		//Browsers without zoomAnimation or a big zoom don't fire zoomstart
+		this._map.on('zoomend', this._noanimationUnspiderfy, this);
+
+		if (!L.Browser.touch) {
+			this._map.getRenderer(this);
+			//Needs to happen in the pageload, not after, or animations don't work in webkit
+			//  http://stackoverflow.com/questions/8455200/svg-animate-with-dynamically-added-elements
+			//Disable on touch browsers as the animation messes up on a touch zoom and isn't very noticable
+		}
+	},
+
+	_spiderfierOnRemove: function () {
+		this._map.off('click', this._unspiderfyWrapper, this);
+		this._map.off('zoomstart', this._unspiderfyZoomStart, this);
+		this._map.off('zoomanim', this._unspiderfyZoomAnim, this);
+		this._map.off('zoomend', this._noanimationUnspiderfy, this);
+
+		//Ensure that markers are back where they should be
+		// Use no animation to avoid a sticky leaflet-cluster-anim class on mapPane
+		this._noanimationUnspiderfy();
+	},
+
+	//On zoom start we add a zoomanim handler so that we are guaranteed to be last (after markers are animated)
+	//This means we can define the animation they do rather than Markers doing an animation to their actual location
+	_unspiderfyZoomStart: function () {
+		if (!this._map) { //May have been removed from the map by a zoomEnd handler
+			return;
+		}
+
+		this._map.on('zoomanim', this._unspiderfyZoomAnim, this);
+	},
+
+	_unspiderfyZoomAnim: function (zoomDetails) {
+		//Wait until the first zoomanim after the user has finished touch-zooming before running the animation
+		if (L.DomUtil.hasClass(this._map._mapPane, 'leaflet-touching')) {
+			return;
+		}
+
+		this._map.off('zoomanim', this._unspiderfyZoomAnim, this);
+		this._unspiderfy(zoomDetails);
+	},
+
+	_unspiderfyWrapper: function () {
+		/// <summary>_unspiderfy but passes no arguments</summary>
+		this._unspiderfy();
+	},
+
+	_unspiderfy: function (zoomDetails) {
+		if (this._spiderfied) {
+			this._spiderfied.unspiderfy(zoomDetails);
+		}
+	},
+
+	_noanimationUnspiderfy: function () {
+		if (this._spiderfied) {
+			this._spiderfied._noanimationUnspiderfy();
+		}
+	},
+
+	//If the given layer is currently being spiderfied then we unspiderfy it so it isn't on the map anymore etc
+	_unspiderfyLayer: function (layer) {
+		if (layer._spiderLeg) {
+			this._featureGroup.removeLayer(layer);
+
+			if (layer.clusterShow) {
+				layer.clusterShow();
+			}
+				//Position will be fixed up immediately in _animationUnspiderfy
+			if (layer.setZIndexOffset) {
+				layer.setZIndexOffset(0);
+			}
+
+			this._map.removeLayer(layer._spiderLeg);
+			delete layer._spiderLeg;
+		}
+	}
+});
+
+/**
+ * Adds 1 public method to MCG and 1 to L.Marker to facilitate changing
+ * markers' icon options and refreshing their icon and their parent clusters
+ * accordingly (case where their iconCreateFunction uses data of childMarkers
+ * to make up the cluster icon).
+ */
+
+
+L.MarkerClusterGroup.include({
+	/**
+	 * Updates the icon of all clusters which are parents of the given marker(s).
+	 * In singleMarkerMode, also updates the given marker(s) icon.
+	 * @param layers L.MarkerClusterGroup|L.LayerGroup|Array(L.Marker)|Map(L.Marker)|
+	 * L.MarkerCluster|L.Marker (optional) list of markers (or single marker) whose parent
+	 * clusters need to be updated. If not provided, retrieves all child markers of this.
+	 * @returns {L.MarkerClusterGroup}
+	 */
+	refreshClusters: function (layers) {
+		if (!layers) {
+			layers = this._topClusterLevel.getAllChildMarkers();
+		} else if (layers instanceof L.MarkerClusterGroup) {
+			layers = layers._topClusterLevel.getAllChildMarkers();
+		} else if (layers instanceof L.LayerGroup) {
+			layers = layers._layers;
+		} else if (layers instanceof L.MarkerCluster) {
+			layers = layers.getAllChildMarkers();
+		} else if (layers instanceof L.Marker) {
+			layers = [layers];
+		} // else: must be an Array(L.Marker)|Map(L.Marker)
+		this._flagParentsIconsNeedUpdate(layers);
+		this._refreshClustersIcons();
+
+		// In case of singleMarkerMode, also re-draw the markers.
+		if (this.options.singleMarkerMode) {
+			this._refreshSingleMarkerModeMarkers(layers);
+		}
+
+		return this;
+	},
+
+	/**
+	 * Simply flags all parent clusters of the given markers as having a "dirty" icon.
+	 * @param layers Array(L.Marker)|Map(L.Marker) list of markers.
+	 * @private
+	 */
+	_flagParentsIconsNeedUpdate: function (layers) {
+		var id, parent;
+
+		// Assumes layers is an Array or an Object whose prototype is non-enumerable.
+		for (id in layers) {
+			// Flag parent clusters' icon as "dirty", all the way up.
+			// Dumb process that flags multiple times upper parents, but still
+			// much more efficient than trying to be smart and make short lists,
+			// at least in the case of a hierarchy following a power law:
+			// http://jsperf.com/flag-nodes-in-power-hierarchy/2
+			parent = layers[id].__parent;
+			while (parent) {
+				parent._iconNeedsUpdate = true;
+				parent = parent.__parent;
+			}
+		}
+	},
+
+	/**
+	 * Re-draws the icon of the supplied markers.
+	 * To be used in singleMarkerMode only.
+	 * @param layers Array(L.Marker)|Map(L.Marker) list of markers.
+	 * @private
+	 */
+	_refreshSingleMarkerModeMarkers: function (layers) {
+		var id, layer;
+
+		for (id in layers) {
+			layer = layers[id];
+
+			// Make sure we do not override markers that do not belong to THIS group.
+			if (this.hasLayer(layer)) {
+				// Need to re-create the icon first, then re-draw the marker.
+				layer.setIcon(this._overrideMarkerIcon(layer));
+			}
+		}
+	}
+});
+
+L.Marker.include({
+	/**
+	 * Updates the given options in the marker's icon and refreshes the marker.
+	 * @param options map object of icon options.
+	 * @param directlyRefreshClusters boolean (optional) true to trigger
+	 * MCG.refreshClustersOf() right away with this single marker.
+	 * @returns {L.Marker}
+	 */
+	refreshIconOptions: function (options, directlyRefreshClusters) {
+		var icon = this.options.icon;
+
+		L.setOptions(icon, options);
+
+		this.setIcon(icon);
+
+		// Shortcut to refresh the associated MCG clusters right away.
+		// To be used when refreshing a single marker.
+		// Otherwise, better use MCG.refreshClusters() once at the end with
+		// the list of modified markers.
+		if (directlyRefreshClusters && this.__parent) {
+			this.__parent._group.refreshClusters(this);
+		}
+
+		return this;
+	}
+});
+
+exports.MarkerClusterGroup = MarkerClusterGroup;
+exports.MarkerCluster = MarkerCluster;
+
+})));
+/*
+  Leaflet.AwesomeMarkers, a plugin that adds colorful iconic markers for Leaflet, based on the Font Awesome icons
+  (c) 2012-2013, Lennard Voogdt
+
+  http://leafletjs.com
+  https://github.com/lvoogdt
+*/
+
+/*global L*/
+
+(function (window, document, undefined) {
+    "use strict";
+    /*
+     * Leaflet.AwesomeMarkers assumes that you have already included the Leaflet library.
+     */
+
+    L.AwesomeMarkers = {};
+
+    L.AwesomeMarkers.version = '2.0.1';
+
+    L.AwesomeMarkers.Icon = L.Icon.extend({
+        options: {
+            iconSize: [35, 45],
+            iconAnchor:   [17, 42],
+            popupAnchor: [1, -32],
+            shadowAnchor: [10, 12],
+            shadowSize: [36, 16],
+            className: 'awesome-marker',
+            prefix: 'glyphicon',
+            spinClass: 'fa-spin',
+            extraClasses: '',
+            icon: 'home',
+            markerColor: 'blue',
+            iconColor: 'white'
+        },
+
+        initialize: function (options) {
+            options = L.Util.setOptions(this, options);
+        },
+
+        createIcon: function () {
+            var div = document.createElement('div'),
+                options = this.options;
+
+            if (options.icon) {
+                div.innerHTML = this._createInner();
+            }
+
+            if (options.bgPos) {
+                div.style.backgroundPosition =
+                    (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';
+            }
+
+            this._setIconStyles(div, 'icon-' + options.markerColor);
+            return div;
+        },
+
+        _createInner: function() {
+            var iconClass, iconSpinClass = "", iconColorClass = "", iconColorStyle = "", options = this.options;
+
+            if(options.icon.slice(0,options.prefix.length+1) === options.prefix + "-") {
+                iconClass = options.icon;
+            } else {
+                iconClass = options.prefix + "-" + options.icon;
+            }
+
+            if(options.spin && typeof options.spinClass === "string") {
+                iconSpinClass = options.spinClass;
+            }
+
+            if(options.iconColor) {
+                if(options.iconColor === 'white' || options.iconColor === 'black') {
+                    iconColorClass = "icon-" + options.iconColor;
+                } else {
+                    iconColorStyle = "style='color: " + options.iconColor + "' ";
+                }
+            }
+
+            return "<i " + iconColorStyle + "class='" + options.extraClasses + " " + options.prefix + " " + iconClass + " " + iconSpinClass + " " + iconColorClass + "'></i>";
+        },
+
+        _setIconStyles: function (img, name) {
+            var options = this.options,
+                size = L.point(options[name === 'shadow' ? 'shadowSize' : 'iconSize']),
+                anchor;
+
+            if (name === 'shadow') {
+                anchor = L.point(options.shadowAnchor || options.iconAnchor);
+            } else {
+                anchor = L.point(options.iconAnchor);
+            }
+
+            if (!anchor && size) {
+                anchor = size.divideBy(2, true);
+            }
+
+            img.className = 'awesome-marker-' + name + ' ' + options.className;
+
+            if (anchor) {
+                img.style.marginLeft = (-anchor.x) + 'px';
+                img.style.marginTop  = (-anchor.y) + 'px';
+            }
+
+            if (size) {
+                img.style.width  = size.x + 'px';
+                img.style.height = size.y + 'px';
+            }
+        },
+
+        createShadow: function () {
+            var div = document.createElement('div');
+
+            this._setIconStyles(div, 'shadow');
+            return div;
+      }
+    });
+        
+    L.AwesomeMarkers.icon = function (options) {
+        return new L.AwesomeMarkers.Icon(options);
+    };
+
+}(this, document));
+
+
+
+(function() {
+  $(document).on('turbolinks:load', function() {
+    $('#event_start_time').change(function() {
+      if ($('#event_start_time').val() >= $('#event_end_time').val()) {
+        return $('#event_end_time').val($('#event_start_time').val());
+      }
+    });
+    $('#event_end_time').change(function() {
+      if ($('#event_start_time').val() >= $('#event_end_time').val()) {
+        return $('#event_start_time').val($('#event_end_time').val());
+      }
+    });
+    if (!Modernizr.inputtypes['datetime-local'] && Modernizr.inputtypes.date && Modernizr.inputtypes.time) {
+      $('[type=datetime-local]').hide().after(function() {
+        return "<input type='time' required value='" + (this.value && new Date(this.value).toTimeString().split(' ')[0]) + "'></input>";
+      }).after(function() {
+        return "<input type='date' required value='" + (this.value && new Date(this.value).toISOString().split('T')[0]) + "'></input>";
+      });
+      $('[type=date], [type=time]').css('flex-grow', 0).css('margin', 0).change(function() {
+        var date, target, time;
+        date = $(this).parent().find('[type=date]');
+        time = $(this).parent().find('[type=time]');
+        if (!date.val() || !time.val()) {
+          return;
+        }
+        target = $(this).parent().find('[type=datetime-local]');
+        return target.val(date.val() + 'T' + time.val());
+      });
+    }
+    $('#event_repeat').each(function() {
+      if ($(this).val() === '0') {
+        $('.field.rule').hide();
+      }
+      return $(this).change(function() {
+        if ($(this).val() > 0) {
+          $('.field.rule').show();
+          return $('.field.rule input').attr('required', 'required');
+        } else {
+          $('.field.rule').hide();
+          return $('.field.rule input').removeAttr('required');
+        }
+      });
+    });
+    return $('#event_tags').each(function() {
+      var elt;
+      elt = $(this);
+      return $.ajax({
+        url: '/tags.json'
+      }).done(function(data) {
+        var tags;
+        return tags = jQuery.map(data, function(n) {
+          return n[0];
+        });
+      });
+    });
+  });
+
+}).call(this);
+(function() {
+  $(document).on('turbolinks:load', function() {
+    $('body.pages form :input').prop('disabled', false);
+    return $('form').submit(function() {
+      $('input[name=utf8]').prop('disabled', true);
+      return $('button').prop('disabled', true);
+    });
+  });
+
+}).call(this);
+
+/*
+  @licstart  The following is the entire license notice for the JavaScript code in this page.
+
+  frTypo, la typographie française simplifiée
+
+      Copyright (C) 2013  acoeuro
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU Affero 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 Affero General Public License for more details.
+
+  You should have received a copy of the GNU Affero General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+  @licend  The above is the entire license notice for the JavaScript code in this page.
+ */
+
+(function() {
+  var regexp, regexpPost;
+
+  regexp = /(^|[\wàéèêç])\s*([!?:;»%€¢]+)(\s|[^\w\/]|$)/g;
+
+  regexpPost = /([«])\s*([\w])/g;
+
+  $(document).on('turbolinks:load', function() {
+    if ($('html').attr('lang') === 'fr') {
+      return $('body *').contents().filter(function() {
+        return this.nodeType === Node.TEXT_NODE;
+      }).filter(function() {
+        return 0 > ['CODE', 'PRE', 'STYLE', 'TEXTAREA'].indexOf(this.parentNode.tagName);
+      }).filter(function() {
+        return !$(this).parent().hasClass('finePre') && !$(this).parent().hasClass('start_time') && !$(this).parent().hasClass('end_time');
+      }).filter(function() {
+        return (this.nodeValue.match(regexp) != null) || (this.nodeValue.match(regexpPost) != null);
+      }).each(function() {
+        return $(this).replaceWith(function() {
+          return this.nodeValue.replace(regexp, '$1<span class="finePre">$2</span>$3').replace(regexpPost, '<span class="finePost">$1</span>$2');
+        });
+      });
+    }
+  });
+
+}).call(this);
+(function() {
+  var visit;
+
+  $(document).on('turbolinks:load', function() {
+    $('table.list td.view a').each(function() {
+      return visit($(this));
+    });
+    return $('.pagination .next a').attr('data-remote', true).each(function() {
+      return $(document).scroll((function(_this) {
+        return function() {
+          if ($(_this).visible(true, true)) {
+            return $(_this).click().parents('.pagination').hide();
+          }
+        };
+      })(this));
+    });
+  });
+
+  $(document).on('ajax:success', '.pagination .next a', function(event, data) {
+    var next;
+    $(this).parents('tfoot').prev().append($('tbody tr', data)).find('td.view a').each(function() {
+      return visit($(this));
+    });
+    next = $('.pagination .next a', data).attr('href');
+    if (next != null) {
+      return $(this).attr('href', next).parents('.pagination').show();
+    }
+  });
+
+  visit = (function(_this) {
+    return function(elt) {
+      return elt.closest('tr').addClass('view').click(function(event) {
+        var target;
+        target = $(event.target);
+        if (!((target.attr('target') != null) || (target.parents('a').attr('target') != null))) {
+          return Turbolinks.visit(elt.attr('href'));
+        }
+      });
+    };
+  })(this);
+
+}).call(this);
+(function() {
+  $(document).on('turbolinks:load', function() {
+    $('#map.list').each(function() {
+      var controls, map;
+      map = L.map('map');
+      map.fitBounds([[60, -20], [30, 30]]);
+      L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
+        attribution: '&copy; <a href="https://osm.org/copyright">OpenStreetMap</a>'
+      }).addTo(map);
+      controls = L.control.layers(null, null, {
+        collapsed: false
+      }).addTo(map);
+      return $('li a', this).each(function() {
+        var markerColor, text, url;
+        url = $(this).attr('href');
+        text = $(this).html();
+        markerColor = $('.awesome-marker', this).attr('class').substr('awesome-marker awesome-marker-icon-'.length);
+        if (location.search && url.indexOf('?') >= 0) {
+          url += '&' + location.search.substr(1);
+        } else {
+          url += location.search;
+        }
+        return $.getJSON(url, function(json) {
+          var layer;
+          if (!(json != null ? json.length : void 0)) {
+            return;
+          }
+          layer = L.markerClusterGroup({
+            maxClusterRadius: 30
+          }).addLayer(L.geoJson(json, {
+            pointToLayer: function(feature, latlng) {
+              var marker;
+              marker = L.AwesomeMarkers.icon({
+                prefix: 'fa',
+                icon: feature.properties.icon || 'calendar',
+                markerColor: markerColor
+              });
+              return L.marker(latlng, {
+                icon: marker
+              });
+            },
+            onEachFeature: function(feature, layer) {
+              if (feature.properties && feature.properties.popupContent) {
+                return layer.bindPopup(feature.properties.popupContent);
+              }
+            }
+          }));
+          map.addLayer(layer);
+          controls.addOverlay(layer, text + ' - ' + json.length);
+          if ((/maps\//.test(location.href) || /maps.json/.test(url)) && layer.getBounds()._northEast && layer.getBounds()._southWest) {
+            return map.fitBounds(layer.getBounds());
+          }
+        });
+      });
+    });
+    return $('#map.event, #map.orga').each(function() {
+      var coord, map, marker, url;
+      coord = [$(this).data('latitude'), $(this).data('longitude')];
+      map = L.map('map').setView([coord[0], coord[1]], 16);
+      L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
+        attribution: '&copy; <a href="https://osm.org/copyright">OpenStreetMap</a>'
+      }).addTo(map);
+      url = $(this).data('url');
+      if (location.search && url.indexOf('?') >= 0) {
+        url += '&' + location.search.substr(1);
+      } else {
+        url += location.search;
+      }
+      marker = L.AwesomeMarkers.icon({
+        prefix: 'fa',
+        icon: $(this).data('icon') || 'calendar',
+        markerColor: 'darkred'
+      });
+      L.marker([coord[0], coord[1]], {
+        icon: marker
+      }).addTo(map);
+      return $.getJSON(url, function(json) {
+        var layer;
+        layer = L.markerClusterGroup({
+          maxClusterRadius: 30
+        }).addLayer(L.geoJson(json, {
+          pointToLayer: function(feature, latlng) {
+            marker = L.AwesomeMarkers.icon({
+              prefix: 'fa',
+              icon: feature.properties.icon || 'calendar',
+              markerColor: 'blue'
+            });
+            return L.marker(latlng, {
+              icon: marker
+            });
+          },
+          onEachFeature: function(feature, layer) {
+            if (feature.properties && feature.properties.popupContent) {
+              return layer.bindPopup(feature.properties.popupContent);
+            }
+          }
+        }));
+        return map.addLayer(layer);
+      });
+    });
+  });
+
+}).call(this);
+(function() {
+  $(document).on('turbolinks:load', function() {
+    $('body.moderations .radios label').click(function() {
+      return $('body.moderations #event_reason').parent().slideUp();
+    });
+    return $('body.moderations .radios label:last-child').click(function() {
+      return $('body.moderations #event_reason').parent().slideDown();
+    });
+  });
+
+}).call(this);
+(function() {
+  var showPosition;
+
+  $(document).on('turbolinks:load', function() {
+    if (!navigator.geolocation) {
+      return;
+    }
+    $('a.near-me').click(function(event) {
+      event.preventDefault();
+      window.goto = event.target.href;
+      return navigator.geolocation.getCurrentPosition(showPosition, function(error) {
+        switch (error.code) {
+          case error.PERMISSION_DENIED:
+            return $('ul.regions li#near-me').remove();
+        }
+      });
+    });
+    return $('body.pages.show form').submit(function() {
+      if ($('#near_location').val() && $('#near_distance').val()) {
+        return $('#city').val('');
+      } else {
+        $('#city').val($('#near_location').val());
+        return $('#near_location').val('');
+      }
+    });
+  });
+
+  showPosition = function(position) {
+    return location.replace(window.goto.replace('[me]', "[" + (position.coords.latitude.toFixed(2)) + ", " + (position.coords.longitude.toFixed(2)) + "]"));
+  };
+
+}).call(this);
+(function() {
+  $(document).on('turbolinks:load', function() {
+    return tinyMCE.init({
+      width: '100%',
+      height: '40em',
+      menubar: false,
+      branding: false,
+      language: 'fr_FR',
+      selector: 'textarea.description',
+      content_css: '/assets/application-0ec4812f14f3da4405d5bea5a5aa18db9b4518953d17a2bf1198215db5a54b2b.css',
+      relative_urls: false,
+      entity_encoding: 'raw',
+      document_base_url: '/',
+      add_unload_trigger: true,
+      browser_spellcheck: true,
+      style_formats_autohide: true,
+      toolbar: [' cut copy paste | undo redo | link image media charmap table | code visualblocks searchreplace', ' removeformat bold italic strikethrough superscript subscript | bullist numlist outdent indent | alignleft aligncenter alignright alignjustify alignnone'],
+      toolbar_sticky: true,
+      plugins: 'lists advlist autolink link image charmap preview table fullscreen searchreplace media insertdatetime visualblocks wordcount code'
+    });
+  });
+
+  $(document).on('turbolinks:before-cache', function() {
+    return tinymce.remove();
+  });
+
+}).call(this);
+(function() {
+  $(document).on('turbolinks:load', function() {
+    $('table.list.dates tbody tr').each(function() {
+      var vals;
+      vals = $(this).find('td.quantity').map(function() {
+        var val;
+        val = $(this).find('a').html().replace(' ', '').trim();
+        if (val && val !== '') {
+          return parseInt(val);
+        } else {
+          return 0;
+        }
+      });
+      return $(this).find('.sparkline').sparkline(vals, {
+        width: '5em'
+      });
+    });
+    return $('table.list.dates tfoot').each(function() {
+      var vals;
+      vals = $(this).find('th.quantity').map(function() {
+        return parseInt($(this).html().replace(' ', ''));
+      });
+      return $(this).find('.sparkline').sparkline(vals, {
+        type: 'bar',
+        height: '3em',
+        barWidth: '100%',
+        barColor: '#9CC5EE',
+        barSpacing: 2
+      });
+    });
+  });
+
+}).call(this);
+tinymce.addI18n('fr_FR',{
+"Redo": "R\u00e9tablir",
+"Undo": "Annuler",
+"Cut": "Couper",
+"Copy": "Copier",
+"Paste": "Coller",
+"Select all": "Tout s\u00e9lectionner",
+"New document": "Nouveau document",
+"Ok": "Ok",
+"Cancel": "Annuler",
+"Visual aids": "Aides visuelle",
+"Bold": "Gras",
+"Italic": "Italique",
+"Underline": "Soulign\u00e9",
+"Strikethrough": "Barr\u00e9",
+"Superscript": "Exposant",
+"Subscript": "Indice",
+"Clear formatting": "Effacer la mise en forme",
+"Align left": "Aligner \u00e0 gauche",
+"Align center": "Centrer",
+"Align right": "Aligner \u00e0 droite",
+"Justify": "Justifier",
+"Bullet list": "Puces",
+"Numbered list": "Num\u00e9rotation",
+"Decrease indent": "Diminuer le retrait",
+"Increase indent": "Augmenter le retrait",
+"Close": "Fermer",
+"Formats": "Formats",
+"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Votre navigateur ne supporte pas la copie directe. Merci d'utiliser les touches Ctrl+X\/C\/V.",
+"Headers": "Titres",
+"Header 1": "Titre 1",
+"Header 2": "Titre 2",
+"Header 3": "Titre 3",
+"Header 4": "Titre 4",
+"Header 5": "Titre 5",
+"Header 6": "Titre 6",
+"Headings": "En-t\u00eates",
+"Heading 1": "En-t\u00eate 1",
+"Heading 2": "En-t\u00eate 2",
+"Heading 3": "En-t\u00eate 3",
+"Heading 4": "En-t\u00eate 4",
+"Heading 5": "En-t\u00eate 5",
+"Heading 6": "En-t\u00eate 6",
+"Preformatted": "Pr\u00e9-formatt\u00e9",
+"Div": "Div",
+"Pre": "Pre",
+"Code": "Code",
+"Paragraph": "Paragraphe",
+"Blockquote": "Citation",
+"Inline": "En ligne",
+"Blocks": "Blocs",
+"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Le presse-papiers est maintenant en mode \"texte plein\". Les contenus seront coll\u00e9s sans retenir les formatages jusqu'\u00e0 ce que vous d\u00e9sactiviez cette option.",
+"Fonts": "Polices",
+"Font Sizes": "Taille de police",
+"Class": "Classe",
+"Browse for an image": "Parcourir pour s\u00e9lectionner une image",
+"OR": "OU",
+"Drop an image here": "Glisser une image ici",
+"Upload": "D\u00e9poser",
+"Block": "Bloquer",
+"Align": "Aligner",
+"Default": "Par d\u00e9faut",
+"Circle": "Cercle",
+"Disc": "Disque",
+"Square": "Carr\u00e9",
+"Lower Alpha": "Alpha minuscule",
+"Lower Greek": "Grec minuscule",
+"Lower Roman": "Romain minuscule",
+"Upper Alpha": "Alpha majuscule",
+"Upper Roman": "Romain majuscule",
+"Anchor...": "Ancre...",
+"Name": "Nom",
+"Id": "Id",
+"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "L'Id doit commencer par une lettre suivi par des lettres, nombres, tirets, points, deux-points ou underscores",
+"You have unsaved changes are you sure you want to navigate away?": "Vous avez des modifications non enregistr\u00e9es, \u00eates-vous s\u00fbr de quitter la page?",
+"Restore last draft": "Restaurer le dernier brouillon",
+"Special characters...": "Caract\u00e8res sp\u00e9ciaux...",
+"Source code": "Code source",
+"Insert\/Edit code sample": "Ins\u00e9rer \/ modifier une exemple de code",
+"Language": "Langue",
+"Code sample...": "Extrait de code...",
+"Color Picker": "S\u00e9lecteur de couleur",
+"R": "R",
+"G": "V",
+"B": "B",
+"Left to right": "Gauche \u00e0 droite",
+"Right to left": "Droite \u00e0 gauche",
+"Emoticons...": "\u00c9motic\u00f4nes...",
+"Metadata and Document Properties": "M\u00e9tadonn\u00e9es et propri\u00e9t\u00e9s du document",
+"Title": "Titre",
+"Keywords": "Mots-cl\u00e9s",
+"Description": "Description",
+"Robots": "Robots",
+"Author": "Auteur",
+"Encoding": "Encodage",
+"Fullscreen": "Plein \u00e9cran",
+"Action": "Action",
+"Shortcut": "Raccourci",
+"Help": "Aide",
+"Address": "Adresse",
+"Focus to menubar": "Cibler la barre de menu",
+"Focus to toolbar": "Cibler la barre d'outils",
+"Focus to element path": "Cibler le chemin vers l'\u00e9l\u00e9ment",
+"Focus to contextual toolbar": "Cibler la barre d'outils contextuelle",
+"Insert link (if link plugin activated)": "Ins\u00e9rer un lien (si le module link est activ\u00e9)",
+"Save (if save plugin activated)": "Enregistrer (si le module save est activ\u00e9)",
+"Find (if searchreplace plugin activated)": "Rechercher (si le module searchreplace est activ\u00e9)",
+"Plugins installed ({0}):": "Modules install\u00e9s ({0}) : ",
+"Premium plugins:": "Modules premium :",
+"Learn more...": "En savoir plus...",
+"You are using {0}": "Vous utilisez {0}",
+"Plugins": "Plugins",
+"Handy Shortcuts": "Raccourcis utiles",
+"Horizontal line": "Ligne horizontale",
+"Insert\/edit image": "Ins\u00e9rer\/modifier une image",
+"Image description": "Description de l'image",
+"Source": "Source",
+"Dimensions": "Dimensions",
+"Constrain proportions": "Conserver les proportions",
+"General": "G\u00e9n\u00e9ral",
+"Advanced": "Avanc\u00e9",
+"Style": "Style",
+"Vertical space": "Espacement vertical",
+"Horizontal space": "Espacement horizontal",
+"Border": "Bordure",
+"Insert image": "Ins\u00e9rer une image",
+"Image...": "Image...",
+"Image list": "Liste d'images",
+"Rotate counterclockwise": "Rotation anti-horaire",
+"Rotate clockwise": "Rotation horaire",
+"Flip vertically": "Retournement vertical",
+"Flip horizontally": "Retournement horizontal",
+"Edit image": "Modifier l'image",
+"Image options": "Options de l'image",
+"Zoom in": "Zoomer",
+"Zoom out": "D\u00e9zoomer",
+"Crop": "Rogner",
+"Resize": "Redimensionner",
+"Orientation": "Orientation",
+"Brightness": "Luminosit\u00e9",
+"Sharpen": "Affiner",
+"Contrast": "Contraste",
+"Color levels": "Niveaux de couleur",
+"Gamma": "Gamma",
+"Invert": "Inverser",
+"Apply": "Appliquer",
+"Back": "Retour",
+"Insert date\/time": "Ins\u00e9rer date\/heure",
+"Date\/time": "Date\/heure",
+"Insert\/Edit Link": "Ins\u00e9rer\/Modifier un lien",
+"Insert\/edit link": "Ins\u00e9rer\/modifier un lien",
+"Text to display": "Texte \u00e0 afficher",
+"Url": "Url",
+"Open link in...": "Ouvrir le lien dans...",
+"Current window": "Fen\u00eatre courante",
+"None": "n\/a",
+"New window": "Nouvelle fen\u00eatre",
+"Remove link": "Enlever le lien",
+"Anchors": "Ancres",
+"Link...": "Lien...",
+"Paste or type a link": "Coller ou taper un lien",
+"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL que vous avez entr\u00e9e semble \u00eatre une adresse e-mail. Voulez-vous ajouter le pr\u00e9fixe mailto: n\u00e9cessaire?",
+"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL que vous avez entr\u00e9e semble \u00eatre un lien externe. Voulez-vous ajouter le pr\u00e9fixe http:\/\/ n\u00e9cessaire?",
+"Link list": "Liste de liens",
+"Insert video": "Ins\u00e9rer une vid\u00e9o",
+"Insert\/edit video": "Ins\u00e9rer\/modifier une vid\u00e9o",
+"Insert\/edit media": "Ins\u00e9rer\/modifier un m\u00e9dia",
+"Alternative source": "Source alternative",
+"Alternative source URL": "Source alternative",
+"Media poster (Image URL)": "Affiche de m\u00e9dia (URL d'image)",
+"Paste your embed code below:": "Collez votre code d'int\u00e9gration ci-dessous :",
+"Embed": "Int\u00e9grer",
+"Media...": "M\u00e9dia...",
+"Nonbreaking space": "Espace ins\u00e9cable",
+"Page break": "Saut de page",
+"Paste as text": "Coller comme texte",
+"Preview": "Pr\u00e9visualiser",
+"Print...": "Imprimer...",
+"Save": "Enregistrer",
+"Find": "Chercher",
+"Replace with": "Remplacer par",
+"Replace": "Remplacer",
+"Replace all": "Tout remplacer",
+"Previous": "Pr\u00e9c\u00e9dent",
+"Next": "Suiv",
+"Find and replace...": "Chercher et remplacer...",
+"Could not find the specified string.": "Impossible de trouver la cha\u00eene sp\u00e9cifi\u00e9e.",
+"Match case": "Respecter la casse",
+"Find whole words only": "Chercher uniquement les mots entiers",
+"Spell check": "Lancer la correction orthographique",
+"Ignore": "Ignorer",
+"Ignore all": "Tout ignorer",
+"Finish": "Finie",
+"Add to Dictionary": "Ajouter au dictionnaire",
+"Insert table": "Ins\u00e9rer un tableau",
+"Table properties": "Propri\u00e9t\u00e9s du tableau",
+"Delete table": "Supprimer le tableau",
+"Cell": "Cellule",
+"Row": "Ligne",
+"Column": "Colonne",
+"Cell properties": "Propri\u00e9t\u00e9s de la cellule",
+"Merge cells": "Fusionner les cellules",
+"Split cell": "Diviser la cellule",
+"Insert row before": "Ins\u00e9rer une ligne avant",
+"Insert row after": "Ins\u00e9rer une ligne apr\u00e8s",
+"Delete row": "Effacer la ligne",
+"Row properties": "Propri\u00e9t\u00e9s de la ligne",
+"Cut row": "Couper la ligne",
+"Copy row": "Copier la ligne",
+"Paste row before": "Coller la ligne avant",
+"Paste row after": "Coller la ligne apr\u00e8s",
+"Insert column before": "Ins\u00e9rer une colonne avant",
+"Insert column after": "Ins\u00e9rer une colonne apr\u00e8s",
+"Delete column": "Effacer la colonne",
+"Cols": "Colonnes",
+"Rows": "Lignes",
+"Width": "Largeur",
+"Height": "Hauteur",
+"Cell spacing": "Espacement inter-cellulles",
+"Cell padding": "Espacement interne cellule",
+"Show caption": "Afficher le sous-titre",
+"Left": "Gauche",
+"Center": "Centr\u00e9",
+"Right": "Droite",
+"Cell type": "Type de cellule",
+"Scope": "Etendue",
+"Alignment": "Alignement",
+"H Align": "Alignement H",
+"V Align": "Alignement V",
+"Top": "Haut",
+"Middle": "Milieu",
+"Bottom": "Bas",
+"Header cell": "Cellule d'en-t\u00eate",
+"Row group": "Groupe de lignes",
+"Column group": "Groupe de colonnes",
+"Row type": "Type de ligne",
+"Header": "En-t\u00eate",
+"Body": "Corps",
+"Footer": "Pied",
+"Border color": "Couleur de la bordure",
+"Insert template...": "Ins\u00e9rer un mod\u00e8le...",
+"Templates": "Th\u00e8mes",
+"Template": "Mod\u00e8le",
+"Text color": "Couleur du texte",
+"Background color": "Couleur d'arri\u00e8re-plan",
+"Custom...": "Personnalis\u00e9...",
+"Custom color": "Couleur personnalis\u00e9e",
+"No color": "Aucune couleur",
+"Remove color": "Supprimer la couleur",
+"Table of Contents": "Table des mati\u00e8res",
+"Show blocks": "Afficher les blocs",
+"Show invisible characters": "Afficher les caract\u00e8res invisibles",
+"Word count": "Nombre de mots",
+"Words: {0}": "Mots : {0}",
+"{0} words": "{0} mots",
+"File": "Fichier",
+"Edit": "Editer",
+"Insert": "Ins\u00e9rer",
+"View": "Voir",
+"Format": "Format",
+"Table": "Tableau",
+"Tools": "Outils",
+"Powered by {0}": "Propuls\u00e9 par {0}",
+"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Zone Texte Riche. Appuyer sur ALT-F9 pour le menu. Appuyer sur ALT-F10 pour la barre d'outils. Appuyer sur ALT-0 pour de l'aide.",
+"Image title": "Titre d'image",
+"Border width": "\u00c9paisseur de la bordure",
+"Border style": "Style de la bordure",
+"Error": "\u00c9rreur",
+"Warn": "Avertissement",
+"Valid": "Valide",
+"To open the popup, press Shift+Enter": "Pour ouvrir la popup, presser Shift+Entr\u00e9e",
+"Rich Text Area. Press ALT-0 for help.": "Zone de texte riche. Presser ALT-0 pour l'aide.",
+"System Font": "Police syst\u00e8me",
+"Failed to upload image: {0}": "\u00c9chec d'envoi de l'image : {0}",
+"Failed to load plugin: {0} from url {1}": "\u00c9chec de chargement du module : {0} \u00e0 partir de l'URL {1}",
+"Failed to load plugin url: {0}": "\u00c9chec de chargement de l'URL de module : {0}",
+"Failed to initialize plugin: {0}": "\u00c9chec d'initialisation du module : {0}",
+"example": "exemple",
+"Search": "Rechercher",
+"All": "Tous",
+"Currency": "Mon\u00e9taire",
+"Text": "Texte",
+"Quotations": "Citations",
+"Mathematical": "Math\u00e9matique",
+"Extended Latin": "Latin \u00e9tendu",
+"Symbols": "Symboles",
+"Arrows": "Fl\u00e8ches",
+"User Defined": "D\u00e9fini par l'utilisateur",
+"dollar sign": "Symbole dollar",
+"currency sign": "Symbole devise",
+"euro-currency sign": "Symbole euro",
+"colon sign": "Symbole col\u00f3n",
+"cruzeiro sign": "Symbole cruzeiro",
+"french franc sign": "Symbole franc fran\u00e7ais",
+"lira sign": "Symbole lire",
+"mill sign": "Symbole milli\u00e8me",
+"naira sign": "Symbole naira",
+"peseta sign": "Symbole peseta",
+"rupee sign": "Symbole roupie",
+"won sign": "Symbole won",
+"new sheqel sign": "Symbole nouveau ch\u00e9kel",
+"dong sign": "Symbole dong",
+"kip sign": "Symbole kip",
+"tugrik sign": "Symbole tougrik",
+"drachma sign": "Symbole drachme",
+"german penny symbol": "Symbole pfennig",
+"peso sign": "Symbole peso",
+"guarani sign": "Symbole guarani",
+"austral sign": "Symbole austral",
+"hryvnia sign": "Symbole hryvnia",
+"cedi sign": "Symbole cedi",
+"livre tournois sign": "Symbole livre tournois",
+"spesmilo sign": "Symbole spesmilo",
+"tenge sign": "Symbole tenge",
+"indian rupee sign": "Symbole roupie indienne",
+"turkish lira sign": "Symbole lire turque",
+"nordic mark sign": "Symbole du mark nordique",
+"manat sign": "Symbole manat",
+"ruble sign": "Symbole rouble",
+"yen character": "Sinogramme Yen",
+"yuan character": "Sinogramme Yuan",
+"yuan character, in hong kong and taiwan": "Sinogramme Yuan, Hong Kong et Taiwan",
+"yen\/yuan character variant one": "Symbole Yen\/Yuan",
+"Loading emoticons...": "Chargement des \u00e9motic\u00f4nes...",
+"Could not load emoticons": "\u00c9chec de chargement des \u00e9motic\u00f4nes",
+"People": "Smileys et personnes",
+"Animals and Nature": "Animaux & nature",
+"Food and Drink": "Nourriture & boisson",
+"Activity": "Activit\u00e9",
+"Travel and Places": "Voyages & lieux",
+"Objects": "Objets",
+"Flags": "Drapeaux",
+"Characters": "Caract\u00e8res",
+"Characters (no spaces)": "Caract\u00e8res (espaces non compris)",
+"Error: Form submit field collision.": "Erreur : conflit de champ lors de la soumission du formulaire",
+"Error: No form element found.": "Erreur : aucun \u00e9l\u00e9ment de formulaire trouv\u00e9.",
+"Update": "Mettre \u00e0 jour",
+"Color swatch": "Palette de couleurs",
+"Turquoise": "Turquoise",
+"Green": "Vert",
+"Blue": "Bleu",
+"Purple": "Violet",
+"Navy Blue": "Bleu oc\u00e9an",
+"Dark Turquoise": "Turquoise fonc\u00e9",
+"Dark Green": "Vert fonc\u00e9",
+"Medium Blue": "Bleu moyen",
+"Medium Purple": "Violet moyen",
+"Midnight Blue": "Bleu nuit",
+"Yellow": "Jaune",
+"Orange": "Orange",
+"Red": "Rouge",
+"Light Gray": "Gris clair",
+"Gray": "Gris",
+"Dark Yellow": "Jaune fonc\u00e9",
+"Dark Orange": "Orange fonc\u00e9",
+"Dark Red": "Rouge fonc\u00e9",
+"Medium Gray": "Gris moyen",
+"Dark Gray": "Gris fonc\u00e9",
+"Black": "Noir",
+"White": "Blanc",
+"Switch to or from fullscreen mode": "Activer ou quitter le mode plein \u00e9cran",
+"Open help dialog": "Ouvrir l'aide",
+"history": "historique",
+"styles": "styles",
+"formatting": "mise en forme",
+"alignment": "alignement",
+"indentation": "indentation",
+"permanent pen": "crayon ind\u00e9l\u00e9bile",
+"comments": "commentaires",
+"Anchor": "Ancre",
+"Special character": "Caract\u00e8res sp\u00e9ciaux",
+"Code sample": "Extrait de code",
+"Color": "Couleur",
+"Emoticons": "Emotic\u00f4nes",
+"Document properties": "Propri\u00e9t\u00e9 du document",
+"Image": "Image",
+"Insert link": "Ins\u00e9rer un lien",
+"Target": "Cible",
+"Link": "Lien",
+"Poster": "Publier",
+"Media": "M\u00e9dia",
+"Print": "Imprimer",
+"Prev": "Pr\u00e9c ",
+"Find and replace": "Trouver et remplacer",
+"Whole words": "Mots entiers",
+"Spellcheck": "V\u00e9rification orthographique",
+"Caption": "Titre",
+"Insert template": "Ajouter un th\u00e8me"
+});
+(function() {
+  $(document).on('turbolinks:load', function() {
+    if (!Modernizr.testAllProps('forceBrokenImageIcon')) {
+      $('img.favicon').one('error', function() {
+        return $(this).css({
+          visibility: 'hidden'
+        });
+      });
+    }
+    return $('.field.tags input').tagsInput({
+      delimiter: ' ',
+      defaultText: '',
+      autocomplete_url: '/tags.json',
+      onChange: function() {
+        var value;
+        value = $(this).val();
+        if (value.indexOf(',') >= 0) {
+          return $(this).val(value.replace(/,/, ''));
+        }
+      }
+    });
+  });
+
+}).call(this);
diff --git a/public/assets/application-3313ec750e3521e59e004f73503bf5ff08f41fd4f0e41d6c6a391b23e375797d.js.gz b/public/assets/application-3313ec750e3521e59e004f73503bf5ff08f41fd4f0e41d6c6a391b23e375797d.js.gz
new file mode 100644
index 0000000000000000000000000000000000000000..39e0276922b7e4fca24d2aa79cd7bdf317782a4a
Binary files /dev/null and b/public/assets/application-3313ec750e3521e59e004f73503bf5ff08f41fd4f0e41d6c6a391b23e375797d.js.gz differ
diff --git a/public/assets/es-module-shims-cc9c89730a363e05aad0613bb8a7ee937baa2b44516176f9c19365e348032583.js b/public/assets/es-module-shims-cc9c89730a363e05aad0613bb8a7ee937baa2b44516176f9c19365e348032583.js
new file mode 100644
index 0000000000000000000000000000000000000000..6326284bc807a282fcad924719114db68ee15c93
--- /dev/null
+++ b/public/assets/es-module-shims-cc9c89730a363e05aad0613bb8a7ee937baa2b44516176f9c19365e348032583.js
@@ -0,0 +1,845 @@
+/* ES Module Shims 1.5.5 */
+(function () {
+
+  const noop = () => {};
+
+  const optionsScript = document.querySelector('script[type=esms-options]');
+
+  const esmsInitOptions = optionsScript ? JSON.parse(optionsScript.innerHTML) : {};
+  Object.assign(esmsInitOptions, self.esmsInitOptions || {});
+
+  let shimMode = !!esmsInitOptions.shimMode;
+
+  const importHook = globalHook(shimMode && esmsInitOptions.onimport);
+  const resolveHook = globalHook(shimMode && esmsInitOptions.resolve);
+  let fetchHook = esmsInitOptions.fetch ? globalHook(esmsInitOptions.fetch) : fetch;
+  const metaHook = esmsInitOptions.meta ? globalHook(shimModule && esmsInitOptions.meta) : noop;
+
+  const skip = esmsInitOptions.skip ? new RegExp(esmsInitOptions.skip) : null;
+
+  let nonce = esmsInitOptions.nonce;
+
+  const mapOverrides = esmsInitOptions.mapOverrides;
+
+  if (!nonce) {
+    const nonceElement = document.querySelector('script[nonce]');
+    if (nonceElement)
+      nonce = nonceElement.nonce || nonceElement.getAttribute('nonce');
+  }
+
+  const onerror = globalHook(esmsInitOptions.onerror || noop);
+  const onpolyfill = esmsInitOptions.onpolyfill ? globalHook(esmsInitOptions.onpolyfill) : () => {
+    console.log('%c^^ Module TypeError above is polyfilled and can be ignored ^^', 'font-weight:900;color:#391');
+  };
+
+  const { revokeBlobURLs, noLoadEventRetriggers, enforceIntegrity } = esmsInitOptions;
+
+  function globalHook (name) {
+    return typeof name === 'string' ? self[name] : name;
+  }
+
+  const enable = Array.isArray(esmsInitOptions.polyfillEnable) ? esmsInitOptions.polyfillEnable : [];
+  const cssModulesEnabled = enable.includes('css-modules');
+  const jsonModulesEnabled = enable.includes('json-modules');
+
+  function setShimMode () {
+    shimMode = true;
+  }
+
+  const edge = !navigator.userAgentData && !!navigator.userAgent.match(/Edge\/\d+\.\d+/);
+
+  const baseUrl = document.baseURI;
+
+  function createBlob (source, type = 'text/javascript') {
+    return URL.createObjectURL(new Blob([source], { type }));
+  }
+
+  const eoop = err => setTimeout(() => { throw err });
+
+  const throwError = err => { (window.reportError || window.safari && console.error || eoop)(err), void onerror(err); };
+
+  function fromParent (parent) {
+    return parent ? ` imported from ${parent}` : '';
+  }
+
+  const backslashRegEx = /\\/g;
+
+  function isURL (url) {
+    if (url.indexOf(':') === -1) return false;
+    try {
+      new URL(url);
+      return true;
+    }
+    catch (_) {
+      return false;
+    }
+  }
+
+  /*
+   * Import maps implementation
+   *
+   * To make lookups fast we pre-resolve the entire import map
+   * and then match based on backtracked hash lookups
+   *
+   */
+  function resolveUrl (relUrl, parentUrl) {
+    return resolveIfNotPlainOrUrl(relUrl, parentUrl) || (isURL(relUrl) ? relUrl : resolveIfNotPlainOrUrl('./' + relUrl, parentUrl));
+  }
+
+  function resolveIfNotPlainOrUrl (relUrl, parentUrl) {
+    // strip off any trailing query params or hashes
+    const queryHashIndex = parentUrl.indexOf('?', parentUrl.indexOf('#') === -1 ? parentUrl.indexOf('#') : parentUrl.length);
+    if (queryHashIndex !== -1)
+      parentUrl = parentUrl.slice(0, queryHashIndex);
+    if (relUrl.indexOf('\\') !== -1)
+      relUrl = relUrl.replace(backslashRegEx, '/');
+    // protocol-relative
+    if (relUrl[0] === '/' && relUrl[1] === '/') {
+      return parentUrl.slice(0, parentUrl.indexOf(':') + 1) + relUrl;
+    }
+    // relative-url
+    else if (relUrl[0] === '.' && (relUrl[1] === '/' || relUrl[1] === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) ||
+        relUrl.length === 1  && (relUrl += '/')) ||
+        relUrl[0] === '/') {
+      const parentProtocol = parentUrl.slice(0, parentUrl.indexOf(':') + 1);
+      // Disabled, but these cases will give inconsistent results for deep backtracking
+      //if (parentUrl[parentProtocol.length] !== '/')
+      //  throw new Error('Cannot resolve');
+      // read pathname from parent URL
+      // pathname taken to be part after leading "/"
+      let pathname;
+      if (parentUrl[parentProtocol.length + 1] === '/') {
+        // resolving to a :// so we need to read out the auth and host
+        if (parentProtocol !== 'file:') {
+          pathname = parentUrl.slice(parentProtocol.length + 2);
+          pathname = pathname.slice(pathname.indexOf('/') + 1);
+        }
+        else {
+          pathname = parentUrl.slice(8);
+        }
+      }
+      else {
+        // resolving to :/ so pathname is the /... part
+        pathname = parentUrl.slice(parentProtocol.length + (parentUrl[parentProtocol.length] === '/'));
+      }
+
+      if (relUrl[0] === '/')
+        return parentUrl.slice(0, parentUrl.length - pathname.length - 1) + relUrl;
+
+      // join together and split for removal of .. and . segments
+      // looping the string instead of anything fancy for perf reasons
+      // '../../../../../z' resolved to 'x/y' is just 'z'
+      const segmented = pathname.slice(0, pathname.lastIndexOf('/') + 1) + relUrl;
+
+      const output = [];
+      let segmentIndex = -1;
+      for (let i = 0; i < segmented.length; i++) {
+        // busy reading a segment - only terminate on '/'
+        if (segmentIndex !== -1) {
+          if (segmented[i] === '/') {
+            output.push(segmented.slice(segmentIndex, i + 1));
+            segmentIndex = -1;
+          }
+          continue;
+        }
+        // new segment - check if it is relative
+        else if (segmented[i] === '.') {
+          // ../ segment
+          if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i + 2 === segmented.length)) {
+            output.pop();
+            i += 2;
+            continue;
+          }
+          // ./ segment
+          else if (segmented[i + 1] === '/' || i + 1 === segmented.length) {
+            i += 1;
+            continue;
+          }
+        }
+        // it is the start of a new segment
+        while (segmented[i] === '/') i++;
+        segmentIndex = i; 
+      }
+      // finish reading out the last segment
+      if (segmentIndex !== -1)
+        output.push(segmented.slice(segmentIndex));
+      return parentUrl.slice(0, parentUrl.length - pathname.length) + output.join('');
+    }
+  }
+
+  function resolveAndComposeImportMap (json, baseUrl, parentMap) {
+    const outMap = { imports: Object.assign({}, parentMap.imports), scopes: Object.assign({}, parentMap.scopes) };
+
+    if (json.imports)
+      resolveAndComposePackages(json.imports, outMap.imports, baseUrl, parentMap);
+
+    if (json.scopes)
+      for (let s in json.scopes) {
+        const resolvedScope = resolveUrl(s, baseUrl);
+        resolveAndComposePackages(json.scopes[s], outMap.scopes[resolvedScope] || (outMap.scopes[resolvedScope] = {}), baseUrl, parentMap);
+      }
+
+    return outMap;
+  }
+
+  function getMatch (path, matchObj) {
+    if (matchObj[path])
+      return path;
+    let sepIndex = path.length;
+    do {
+      const segment = path.slice(0, sepIndex + 1);
+      if (segment in matchObj)
+        return segment;
+    } while ((sepIndex = path.lastIndexOf('/', sepIndex - 1)) !== -1)
+  }
+
+  function applyPackages (id, packages) {
+    const pkgName = getMatch(id, packages);
+    if (pkgName) {
+      const pkg = packages[pkgName];
+      if (pkg === null) return;
+      return pkg + id.slice(pkgName.length);
+    }
+  }
+
+
+  function resolveImportMap (importMap, resolvedOrPlain, parentUrl) {
+    let scopeUrl = parentUrl && getMatch(parentUrl, importMap.scopes);
+    while (scopeUrl) {
+      const packageResolution = applyPackages(resolvedOrPlain, importMap.scopes[scopeUrl]);
+      if (packageResolution)
+        return packageResolution;
+      scopeUrl = getMatch(scopeUrl.slice(0, scopeUrl.lastIndexOf('/')), importMap.scopes);
+    }
+    return applyPackages(resolvedOrPlain, importMap.imports) || resolvedOrPlain.indexOf(':') !== -1 && resolvedOrPlain;
+  }
+
+  function resolveAndComposePackages (packages, outPackages, baseUrl, parentMap) {
+    for (let p in packages) {
+      const resolvedLhs = resolveIfNotPlainOrUrl(p, baseUrl) || p;
+      if ((!shimMode || !mapOverrides) && outPackages[resolvedLhs] && (outPackages[resolvedLhs] !== packages[resolvedLhs])) {
+        throw Error(`Rejected map override "${resolvedLhs}" from ${outPackages[resolvedLhs]} to ${packages[resolvedLhs]}.`);
+      }
+      let target = packages[p];
+      if (typeof target !== 'string')
+        continue;
+      const mapped = resolveImportMap(parentMap, resolveIfNotPlainOrUrl(target, baseUrl) || target, baseUrl);
+      if (mapped) {
+        outPackages[resolvedLhs] = mapped;
+        continue;
+      }
+      console.warn(`Mapping "${p}" -> "${packages[p]}" does not resolve`);
+    }
+  }
+
+  let err;
+  window.addEventListener('error', _err => err = _err);
+  function dynamicImportScript (url, { errUrl = url } = {}) {
+    err = undefined;
+    const src = createBlob(`import*as m from'${url}';self._esmsi=m`);
+    const s = Object.assign(document.createElement('script'), { type: 'module', src });
+    s.setAttribute('nonce', nonce);
+    s.setAttribute('noshim', '');
+    const p =  new Promise((resolve, reject) => {
+      // Safari is unique in supporting module script error events
+      s.addEventListener('error', cb);
+      s.addEventListener('load', cb);
+
+      function cb (_err) {
+        document.head.removeChild(s);
+        if (self._esmsi) {
+          resolve(self._esmsi, baseUrl);
+          self._esmsi = undefined;
+        }
+        else {
+          reject(!(_err instanceof Event) && _err || err && err.error || new Error(`Error loading or executing the graph of ${errUrl} (check the console for ${src}).`));
+          err = undefined;
+        }
+      }
+    });
+    document.head.appendChild(s);
+    return p;
+  }
+
+  let dynamicImport = dynamicImportScript;
+
+  const supportsDynamicImportCheck = dynamicImportScript(createBlob('export default u=>import(u)')).then(_dynamicImport => {
+    if (_dynamicImport)
+      dynamicImport = _dynamicImport.default;
+    return !!_dynamicImport;
+  }, noop);
+
+  // support browsers without dynamic import support (eg Firefox 6x)
+  let supportsJsonAssertions = false;
+  let supportsCssAssertions = false;
+
+  let supportsImportMeta = false;
+  let supportsImportMaps = false;
+
+  let supportsDynamicImport = false;
+
+  const featureDetectionPromise = Promise.resolve(supportsDynamicImportCheck).then(_supportsDynamicImport => {
+    if (!_supportsDynamicImport)
+      return;
+    supportsDynamicImport = true;
+
+    return Promise.all([
+      dynamicImport(createBlob('import.meta')).then(() => supportsImportMeta = true, noop),
+      cssModulesEnabled && dynamicImport(createBlob('import"data:text/css,{}"assert{type:"css"}')).then(() => supportsCssAssertions = true, noop),
+      jsonModulesEnabled && dynamicImport(createBlob('import"data:text/json,{}"assert{type:"json"}')).then(() => supportsJsonAssertions = true, noop),
+      HTMLScriptElement.supports ? supportsImportMaps = HTMLScriptElement.supports('importmap') : new Promise(resolve => {
+        self._$s = v => {
+          document.head.removeChild(iframe);
+          if (v) supportsImportMaps = true;
+          delete self._$s;
+          resolve();
+        };
+        const iframe = document.createElement('iframe');
+        iframe.style.display = 'none';
+        iframe.setAttribute('nonce', nonce);
+        iframe.srcdoc = `<script type=importmap nonce="${nonce}">{"imports":{"x":"data:text/javascript,"}}<${''}/script><script nonce="${nonce}">import('x').then(()=>1,()=>0).then(v=>parent._$s(v))<${''}/script>`;
+        document.head.appendChild(iframe);
+      })
+    ]);
+  });
+
+  /* es-module-lexer 0.10.5 */
+  let e,a,r,s=2<<19;const i=1===new Uint8Array(new Uint16Array([1]).buffer)[0]?function(e,a){const r=e.length;let s=0;for(;s<r;)a[s]=e.charCodeAt(s++);}:function(e,a){const r=e.length;let s=0;for(;s<r;){const r=e.charCodeAt(s);a[s++]=(255&r)<<8|r>>>8;}},t="xportmportlassetafromssertvoyiedeleinstantyreturdebuggeawaithrwhileforifcatcfinallels";let c$1,f,n;function parse(k,l="@"){c$1=k,f=l;const u=2*c$1.length+(2<<18);if(u>s||!e){for(;u>s;)s*=2;a=new ArrayBuffer(s),i(t,new Uint16Array(a,16,85)),e=function(e,a,r){"use asm";var s=new e.Int8Array(r),i=new e.Int16Array(r),t=new e.Int32Array(r),c=new e.Uint8Array(r),f=new e.Uint16Array(r),n=992;function b(e){e=e|0;var a=0,r=0,c=0,b=0,u=0,w=0,v=0;v=n;n=n+11520|0;u=v+2048|0;s[763]=1;i[377]=0;i[378]=0;i[379]=0;i[380]=-1;t[57]=t[2];s[764]=0;t[56]=0;s[762]=0;t[58]=v+10496;t[59]=v+2304;t[60]=v;s[765]=0;e=(t[3]|0)+-2|0;t[61]=e;a=e+(t[54]<<1)|0;t[62]=a;e:while(1){r=e+2|0;t[61]=r;if(e>>>0>=a>>>0){b=18;break}a:do{switch(i[r>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if((((i[379]|0)==0?D(r)|0:0)?(m(e+4|0,16,10)|0)==0:0)?(k(),(s[763]|0)==0):0){b=9;break e}else b=17;break}case 105:{if(D(r)|0?(m(e+4|0,26,10)|0)==0:0){l();b=17;}else b=17;break}case 59:{b=17;break}case 47:switch(i[e+4>>1]|0){case 47:{j();break a}case 42:{y(1);break a}default:{b=16;break e}}default:{b=16;break e}}}while(0);if((b|0)==17){b=0;t[57]=t[61];}e=t[61]|0;a=t[62]|0;}if((b|0)==9){e=t[61]|0;t[57]=e;b=19;}else if((b|0)==16){s[763]=0;t[61]=e;b=19;}else if((b|0)==18)if(!(s[762]|0)){e=r;b=19;}else e=0;do{if((b|0)==19){e:while(1){a=e+2|0;t[61]=a;c=a;if(e>>>0>=(t[62]|0)>>>0){b=75;break}a:do{switch(i[a>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if(((i[379]|0)==0?D(a)|0:0)?(m(e+4|0,16,10)|0)==0:0){k();b=74;}else b=74;break}case 105:{if(D(a)|0?(m(e+4|0,26,10)|0)==0:0){l();b=74;}else b=74;break}case 99:{if((D(a)|0?(m(e+4|0,36,8)|0)==0:0)?M(i[e+12>>1]|0)|0:0){s[765]=1;b=74;}else b=74;break}case 40:{r=t[57]|0;c=t[59]|0;b=i[379]|0;i[379]=b+1<<16>>16;t[c+((b&65535)<<2)>>2]=r;b=74;break}case 41:{a=i[379]|0;if(!(a<<16>>16)){b=36;break e}a=a+-1<<16>>16;i[379]=a;r=i[378]|0;if(r<<16>>16!=0?(w=t[(t[60]|0)+((r&65535)+-1<<2)>>2]|0,(t[w+20>>2]|0)==(t[(t[59]|0)+((a&65535)<<2)>>2]|0)):0){a=w+4|0;if(!(t[a>>2]|0))t[a>>2]=c;t[w+12>>2]=e+4;i[378]=r+-1<<16>>16;b=74;}else b=74;break}case 123:{b=t[57]|0;c=t[51]|0;e=b;do{if((i[b>>1]|0)==41&(c|0)!=0?(t[c+4>>2]|0)==(b|0):0){a=t[52]|0;t[51]=a;if(!a){t[47]=0;break}else {t[a+28>>2]=0;break}}}while(0);r=i[379]|0;b=r&65535;s[u+b>>0]=s[765]|0;s[765]=0;c=t[59]|0;i[379]=r+1<<16>>16;t[c+(b<<2)>>2]=e;b=74;break}case 125:{e=i[379]|0;if(!(e<<16>>16)){b=49;break e}r=e+-1<<16>>16;i[379]=r;a=i[380]|0;if(e<<16>>16!=a<<16>>16)if(a<<16>>16!=-1&(r&65535)<(a&65535)){b=53;break e}else {b=74;break a}else {c=t[58]|0;b=(i[377]|0)+-1<<16>>16;i[377]=b;i[380]=i[c+((b&65535)<<1)>>1]|0;h();b=74;break a}}case 39:{d(39);b=74;break}case 34:{d(34);b=74;break}case 47:switch(i[e+4>>1]|0){case 47:{j();break a}case 42:{y(1);break a}default:{a=t[57]|0;r=i[a>>1]|0;r:do{if(!(U(r)|0)){switch(r<<16>>16){case 41:if(q(t[(t[59]|0)+(f[379]<<2)>>2]|0)|0){b=71;break r}else {b=68;break r}case 125:break;default:{b=68;break r}}e=f[379]|0;if(!(p(t[(t[59]|0)+(e<<2)>>2]|0)|0)?(s[u+e>>0]|0)==0:0)b=68;else b=71;}else switch(r<<16>>16){case 46:if(((i[a+-2>>1]|0)+-48&65535)<10){b=68;break r}else {b=71;break r}case 43:if((i[a+-2>>1]|0)==43){b=68;break r}else {b=71;break r}case 45:if((i[a+-2>>1]|0)==45){b=68;break r}else {b=71;break r}default:{b=71;break r}}}while(0);r:do{if((b|0)==68){b=0;if(!(o(a)|0)){switch(r<<16>>16){case 0:{b=71;break r}case 47:break;default:{e=1;break r}}if(!(s[764]|0))e=1;else b=71;}else b=71;}}while(0);if((b|0)==71){g();e=0;}s[764]=e;b=74;break a}}case 96:{h();b=74;break}default:b=74;}}while(0);if((b|0)==74){b=0;t[57]=t[61];}e=t[61]|0;}if((b|0)==36){L();e=0;break}else if((b|0)==49){L();e=0;break}else if((b|0)==53){L();e=0;break}else if((b|0)==75){e=(i[380]|0)==-1&(i[379]|0)==0&(s[762]|0)==0&(i[378]|0)==0;break}}}while(0);n=v;return e|0}function k(){var e=0,a=0,r=0,c=0,f=0,n=0;f=t[61]|0;n=f+12|0;t[61]=n;a=w(1)|0;e=t[61]|0;if(!((e|0)==(n|0)?!(I(a)|0):0))c=3;e:do{if((c|0)==3){a:do{switch(a<<16>>16){case 100:{B(e,e+14|0);break e}case 97:{t[61]=e+10;w(1)|0;e=t[61]|0;c=6;break}case 102:{c=6;break}case 99:{if((m(e+2|0,36,8)|0)==0?(r=e+10|0,$(i[r>>1]|0)|0):0){t[61]=r;f=w(1)|0;n=t[61]|0;E(f)|0;B(n,t[61]|0);t[61]=(t[61]|0)+-2;break e}e=e+4|0;t[61]=e;c=13;break}case 108:case 118:{c=13;break}case 123:{t[61]=e+2;e=w(1)|0;r=t[61]|0;while(1){if(N(e)|0){d(e);e=(t[61]|0)+2|0;t[61]=e;}else {E(e)|0;e=t[61]|0;}w(1)|0;e=C(r,e)|0;if(e<<16>>16==44){t[61]=(t[61]|0)+2;e=w(1)|0;}a=r;r=t[61]|0;if(e<<16>>16==125){c=32;break}if((r|0)==(a|0)){c=29;break}if(r>>>0>(t[62]|0)>>>0){c=31;break}}if((c|0)==29){L();break e}else if((c|0)==31){L();break e}else if((c|0)==32){t[61]=r+2;c=34;break a}break}case 42:{t[61]=e+2;w(1)|0;c=t[61]|0;C(c,c)|0;c=34;break}default:{}}}while(0);if((c|0)==6){t[61]=e+16;e=w(1)|0;if(e<<16>>16==42){t[61]=(t[61]|0)+2;e=w(1)|0;}n=t[61]|0;E(e)|0;B(n,t[61]|0);t[61]=(t[61]|0)+-2;break}else if((c|0)==13){e=e+4|0;t[61]=e;s[763]=0;a:while(1){t[61]=e+2;n=w(1)|0;e=t[61]|0;switch((E(n)|0)<<16>>16){case 91:case 123:{c=15;break a}default:{}}a=t[61]|0;if((a|0)==(e|0))break e;B(e,a);switch((w(1)|0)<<16>>16){case 61:{c=19;break a}case 44:break;default:{c=20;break a}}e=t[61]|0;}if((c|0)==15){t[61]=(t[61]|0)+-2;break}else if((c|0)==19){t[61]=(t[61]|0)+-2;break}else if((c|0)==20){t[61]=(t[61]|0)+-2;break}}else if((c|0)==34)a=w(1)|0;e=t[61]|0;if(a<<16>>16==102?(m(e+2|0,52,6)|0)==0:0){t[61]=e+8;u(f,w(1)|0);break}t[61]=e+-2;}}while(0);return}function l(){var e=0,a=0,r=0,c=0,f=0;f=t[61]|0;a=f+12|0;t[61]=a;e:do{switch((w(1)|0)<<16>>16){case 40:{e=t[61]|0;a=t[59]|0;r=i[379]|0;i[379]=r+1<<16>>16;t[a+((r&65535)<<2)>>2]=e;if((i[t[57]>>1]|0)!=46){e=t[61]|0;t[61]=e+2;r=w(1)|0;v(f,t[61]|0,0,e);e=t[51]|0;a=t[60]|0;f=i[378]|0;i[378]=f+1<<16>>16;t[a+((f&65535)<<2)>>2]=e;switch(r<<16>>16){case 39:{d(39);break}case 34:{d(34);break}default:{t[61]=(t[61]|0)+-2;break e}}e=(t[61]|0)+2|0;t[61]=e;switch((w(1)|0)<<16>>16){case 44:{t[61]=(t[61]|0)+2;w(1)|0;r=t[51]|0;t[r+4>>2]=e;f=t[61]|0;t[r+16>>2]=f;s[r+24>>0]=1;t[61]=f+-2;break e}case 41:{i[379]=(i[379]|0)+-1<<16>>16;f=t[51]|0;t[f+4>>2]=e;t[f+12>>2]=(t[61]|0)+2;s[f+24>>0]=1;i[378]=(i[378]|0)+-1<<16>>16;break e}default:{t[61]=(t[61]|0)+-2;break e}}}break}case 46:{t[61]=(t[61]|0)+2;if(((w(1)|0)<<16>>16==109?(e=t[61]|0,(m(e+2|0,44,6)|0)==0):0)?(i[t[57]>>1]|0)!=46:0)v(f,f,e+8|0,2);break}case 42:case 39:case 34:{c=16;break}case 123:{e=t[61]|0;if(i[379]|0){t[61]=e+-2;break e}while(1){if(e>>>0>=(t[62]|0)>>>0)break;e=w(1)|0;if(!(N(e)|0)){if(e<<16>>16==125){c=31;break}}else d(e);e=(t[61]|0)+2|0;t[61]=e;}if((c|0)==31)t[61]=(t[61]|0)+2;w(1)|0;e=t[61]|0;if(m(e,50,8)|0){L();break e}t[61]=e+8;e=w(1)|0;if(N(e)|0){u(f,e);break e}else {L();break e}}default:if((t[61]|0)!=(a|0))c=16;}}while(0);do{if((c|0)==16){if(i[379]|0){t[61]=(t[61]|0)+-2;break}e=t[62]|0;a=t[61]|0;while(1){if(a>>>0>=e>>>0){c=23;break}r=i[a>>1]|0;if(N(r)|0){c=21;break}c=a+2|0;t[61]=c;a=c;}if((c|0)==21){u(f,r);break}else if((c|0)==23){L();break}}}while(0);return}function u(e,a){e=e|0;a=a|0;var r=0,s=0;r=(t[61]|0)+2|0;switch(a<<16>>16){case 39:{d(39);s=5;break}case 34:{d(34);s=5;break}default:L();}do{if((s|0)==5){v(e,r,t[61]|0,1);t[61]=(t[61]|0)+2;s=(w(0)|0)<<16>>16==97;a=t[61]|0;if(s?(m(a+2|0,58,10)|0)==0:0){t[61]=a+12;if((w(1)|0)<<16>>16!=123){t[61]=a;break}e=t[61]|0;r=e;e:while(1){t[61]=r+2;r=w(1)|0;switch(r<<16>>16){case 39:{d(39);t[61]=(t[61]|0)+2;r=w(1)|0;break}case 34:{d(34);t[61]=(t[61]|0)+2;r=w(1)|0;break}default:r=E(r)|0;}if(r<<16>>16!=58){s=16;break}t[61]=(t[61]|0)+2;switch((w(1)|0)<<16>>16){case 39:{d(39);break}case 34:{d(34);break}default:{s=20;break e}}t[61]=(t[61]|0)+2;switch((w(1)|0)<<16>>16){case 125:{s=25;break e}case 44:break;default:{s=24;break e}}t[61]=(t[61]|0)+2;if((w(1)|0)<<16>>16==125){s=25;break}r=t[61]|0;}if((s|0)==16){t[61]=a;break}else if((s|0)==20){t[61]=a;break}else if((s|0)==24){t[61]=a;break}else if((s|0)==25){s=t[51]|0;t[s+16>>2]=e;t[s+12>>2]=(t[61]|0)+2;break}}t[61]=a+-2;}}while(0);return}function o(e){e=e|0;e:do{switch(i[e>>1]|0){case 100:switch(i[e+-2>>1]|0){case 105:{e=S(e+-4|0,68,2)|0;break e}case 108:{e=S(e+-4|0,72,3)|0;break e}default:{e=0;break e}}case 101:{switch(i[e+-2>>1]|0){case 115:break;case 116:{e=S(e+-4|0,78,4)|0;break e}default:{e=0;break e}}switch(i[e+-4>>1]|0){case 108:{e=O(e+-6|0,101)|0;break e}case 97:{e=O(e+-6|0,99)|0;break e}default:{e=0;break e}}}case 102:{if((i[e+-2>>1]|0)==111?(i[e+-4>>1]|0)==101:0)switch(i[e+-6>>1]|0){case 99:{e=S(e+-8|0,86,6)|0;break e}case 112:{e=S(e+-8|0,98,2)|0;break e}default:{e=0;break e}}else e=0;break}case 110:{e=e+-2|0;if(O(e,105)|0)e=1;else e=S(e,102,5)|0;break}case 111:{e=O(e+-2|0,100)|0;break}case 114:{e=S(e+-2|0,112,7)|0;break}case 116:{e=S(e+-2|0,126,4)|0;break}case 119:switch(i[e+-2>>1]|0){case 101:{e=O(e+-4|0,110)|0;break e}case 111:{e=S(e+-4|0,134,3)|0;break e}default:{e=0;break e}}default:e=0;}}while(0);return e|0}function h(){var e=0,a=0,r=0;a=t[62]|0;r=t[61]|0;e:while(1){e=r+2|0;if(r>>>0>=a>>>0){a=8;break}switch(i[e>>1]|0){case 96:{a=9;break e}case 36:{if((i[r+4>>1]|0)==123){a=6;break e}break}case 92:{e=r+4|0;break}default:{}}r=e;}if((a|0)==6){t[61]=r+4;e=i[380]|0;a=t[58]|0;r=i[377]|0;i[377]=r+1<<16>>16;i[a+((r&65535)<<1)>>1]=e;r=(i[379]|0)+1<<16>>16;i[379]=r;i[380]=r;}else if((a|0)==8){t[61]=e;L();}else if((a|0)==9)t[61]=e;return}function w(e){e=e|0;var a=0,r=0,s=0;r=t[61]|0;e:do{a=i[r>>1]|0;a:do{if(a<<16>>16!=47)if(e)if(M(a)|0)break;else break e;else if(z(a)|0)break;else break e;else switch(i[r+2>>1]|0){case 47:{j();break a}case 42:{y(e);break a}default:{a=47;break e}}}while(0);s=t[61]|0;r=s+2|0;t[61]=r;}while(s>>>0<(t[62]|0)>>>0);return a|0}function d(e){e=e|0;var a=0,r=0,s=0,c=0;c=t[62]|0;a=t[61]|0;while(1){s=a+2|0;if(a>>>0>=c>>>0){a=9;break}r=i[s>>1]|0;if(r<<16>>16==e<<16>>16){a=10;break}if(r<<16>>16==92){r=a+4|0;if((i[r>>1]|0)==13){a=a+6|0;a=(i[a>>1]|0)==10?a:r;}else a=r;}else if(T(r)|0){a=9;break}else a=s;}if((a|0)==9){t[61]=s;L();}else if((a|0)==10)t[61]=s;return}function v(e,a,r,i){e=e|0;a=a|0;r=r|0;i=i|0;var c=0,f=0;c=t[55]|0;t[55]=c+32;f=t[51]|0;t[((f|0)==0?188:f+28|0)>>2]=c;t[52]=f;t[51]=c;t[c+8>>2]=e;if(2==(i|0))e=r;else e=1==(i|0)?r+2|0:0;t[c+12>>2]=e;t[c>>2]=a;t[c+4>>2]=r;t[c+16>>2]=0;t[c+20>>2]=i;s[c+24>>0]=1==(i|0)&1;t[c+28>>2]=0;return}function A(){var e=0,a=0,r=0;r=t[62]|0;a=t[61]|0;e:while(1){e=a+2|0;if(a>>>0>=r>>>0){a=6;break}switch(i[e>>1]|0){case 13:case 10:{a=6;break e}case 93:{a=7;break e}case 92:{e=a+4|0;break}default:{}}a=e;}if((a|0)==6){t[61]=e;L();e=0;}else if((a|0)==7){t[61]=e;e=93;}return e|0}function C(e,a){e=e|0;a=a|0;var r=0,s=0;r=t[61]|0;s=i[r>>1]|0;if(s<<16>>16==97){t[61]=r+4;r=w(1)|0;e=t[61]|0;if(N(r)|0){d(r);a=(t[61]|0)+2|0;t[61]=a;}else {E(r)|0;a=t[61]|0;}s=w(1)|0;r=t[61]|0;}if((r|0)!=(e|0))B(e,a);return s|0}function g(){var e=0,a=0,r=0;e:while(1){e=t[61]|0;a=e+2|0;t[61]=a;if(e>>>0>=(t[62]|0)>>>0){r=7;break}switch(i[a>>1]|0){case 13:case 10:{r=7;break e}case 47:break e;case 91:{A()|0;break}case 92:{t[61]=e+4;break}default:{}}}if((r|0)==7)L();return}function p(e){e=e|0;switch(i[e>>1]|0){case 62:{e=(i[e+-2>>1]|0)==61;break}case 41:case 59:{e=1;break}case 104:{e=S(e+-2|0,160,4)|0;break}case 121:{e=S(e+-2|0,168,6)|0;break}case 101:{e=S(e+-2|0,180,3)|0;break}default:e=0;}return e|0}function y(e){e=e|0;var a=0,r=0,s=0,c=0,f=0;c=(t[61]|0)+2|0;t[61]=c;r=t[62]|0;while(1){a=c+2|0;if(c>>>0>=r>>>0)break;s=i[a>>1]|0;if(!e?T(s)|0:0)break;if(s<<16>>16==42?(i[c+4>>1]|0)==47:0){f=8;break}c=a;}if((f|0)==8){t[61]=a;a=c+4|0;}t[61]=a;return}function m(e,a,r){e=e|0;a=a|0;r=r|0;var i=0,t=0;e:do{if(!r)e=0;else {while(1){i=s[e>>0]|0;t=s[a>>0]|0;if(i<<24>>24!=t<<24>>24)break;r=r+-1|0;if(!r){e=0;break e}else {e=e+1|0;a=a+1|0;}}e=(i&255)-(t&255)|0;}}while(0);return e|0}function I(e){e=e|0;e:do{switch(e<<16>>16){case 38:case 37:case 33:{e=1;break}default:if((e&-8)<<16>>16==40|(e+-58&65535)<6)e=1;else {switch(e<<16>>16){case 91:case 93:case 94:{e=1;break e}default:{}}e=(e+-123&65535)<4;}}}while(0);return e|0}function U(e){e=e|0;e:do{switch(e<<16>>16){case 38:case 37:case 33:break;default:if(!((e+-58&65535)<6|(e+-40&65535)<7&e<<16>>16!=41)){switch(e<<16>>16){case 91:case 94:break e;default:{}}return e<<16>>16!=125&(e+-123&65535)<4|0}}}while(0);return 1}function x(e){e=e|0;var a=0,r=0,s=0,c=0;r=n;n=n+16|0;s=r;t[s>>2]=0;t[54]=e;a=t[3]|0;c=a+(e<<1)|0;e=c+2|0;i[c>>1]=0;t[s>>2]=e;t[55]=e;t[47]=0;t[51]=0;t[49]=0;t[48]=0;t[53]=0;t[50]=0;n=r;return a|0}function S(e,a,r){e=e|0;a=a|0;r=r|0;var s=0,c=0;s=e+(0-r<<1)|0;c=s+2|0;e=t[3]|0;if(c>>>0>=e>>>0?(m(c,a,r<<1)|0)==0:0)if((c|0)==(e|0))e=1;else e=$(i[s>>1]|0)|0;else e=0;return e|0}function O(e,a){e=e|0;a=a|0;var r=0;r=t[3]|0;if(r>>>0<=e>>>0?(i[e>>1]|0)==a<<16>>16:0)if((r|0)==(e|0))r=1;else r=$(i[e+-2>>1]|0)|0;else r=0;return r|0}function $(e){e=e|0;e:do{if((e+-9&65535)<5)e=1;else {switch(e<<16>>16){case 32:case 160:{e=1;break e}default:{}}e=e<<16>>16!=46&(I(e)|0);}}while(0);return e|0}function j(){var e=0,a=0,r=0;e=t[62]|0;r=t[61]|0;e:while(1){a=r+2|0;if(r>>>0>=e>>>0)break;switch(i[a>>1]|0){case 13:case 10:break e;default:r=a;}}t[61]=a;return}function B(e,a){e=e|0;a=a|0;var r=0,s=0;r=t[55]|0;t[55]=r+12;s=t[53]|0;t[((s|0)==0?192:s+8|0)>>2]=r;t[53]=r;t[r>>2]=e;t[r+4>>2]=a;t[r+8>>2]=0;return}function E(e){e=e|0;while(1){if(M(e)|0)break;if(I(e)|0)break;e=(t[61]|0)+2|0;t[61]=e;e=i[e>>1]|0;if(!(e<<16>>16)){e=0;break}}return e|0}function P(){var e=0;e=t[(t[49]|0)+20>>2]|0;switch(e|0){case 1:{e=-1;break}case 2:{e=-2;break}default:e=e-(t[3]|0)>>1;}return e|0}function q(e){e=e|0;if(!(S(e,140,5)|0)?!(S(e,150,3)|0):0)e=S(e,156,2)|0;else e=1;return e|0}function z(e){e=e|0;switch(e<<16>>16){case 160:case 32:case 12:case 11:case 9:{e=1;break}default:e=0;}return e|0}function D(e){e=e|0;if((t[3]|0)==(e|0))e=1;else e=$(i[e+-2>>1]|0)|0;return e|0}function F(){var e=0;e=t[(t[49]|0)+12>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function G(){var e=0;e=t[(t[49]|0)+16>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function H(){var e=0;e=t[(t[49]|0)+4>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function J(){var e=0;e=t[49]|0;e=t[((e|0)==0?188:e+28|0)>>2]|0;t[49]=e;return (e|0)!=0|0}function K(){var e=0;e=t[50]|0;e=t[((e|0)==0?192:e+8|0)>>2]|0;t[50]=e;return (e|0)!=0|0}function L(){s[762]=1;t[56]=(t[61]|0)-(t[3]|0)>>1;t[61]=(t[62]|0)+2;return}function M(e){e=e|0;return (e|128)<<16>>16==160|(e+-9&65535)<5|0}function N(e){e=e|0;return e<<16>>16==39|e<<16>>16==34|0}function Q(){return (t[(t[49]|0)+8>>2]|0)-(t[3]|0)>>1|0}function R(){return (t[(t[50]|0)+4>>2]|0)-(t[3]|0)>>1|0}function T(e){e=e|0;return e<<16>>16==13|e<<16>>16==10|0}function V(){return (t[t[49]>>2]|0)-(t[3]|0)>>1|0}function W(){return (t[t[50]>>2]|0)-(t[3]|0)>>1|0}function X(){return c[(t[49]|0)+24>>0]|0|0}function Y(e){e=e|0;t[3]=e;return}function Z(){return (s[763]|0)!=0|0}function _(){return t[56]|0}function ee(e){e=e|0;n=e+992+15&-16;return 992}return {su:ee,ai:G,e:_,ee:R,es:W,f:Z,id:P,ie:H,ip:X,is:V,p:b,re:K,ri:J,sa:x,se:F,ses:Y,ss:Q}}("undefined"!=typeof self?self:global,{},a),r=e.su(s-(2<<17));}const h=c$1.length+1;e.ses(r),e.sa(h-1),i(c$1,new Uint16Array(a,r,h)),e.p()||(n=e.e(),o());const w=[],d=[];for(;e.ri();){const a=e.is(),r=e.ie(),s=e.ai(),i=e.id(),t=e.ss(),f=e.se();let n;e.ip()&&(n=b(-1===i?a:a+1,c$1.charCodeAt(-1===i?a-1:a))),w.push({n:n,s:a,e:r,ss:t,se:f,d:i,a:s});}for(;e.re();){const a=e.es(),r=c$1.charCodeAt(a);d.push(34===r||39===r?b(a+1,r):c$1.slice(e.es(),e.ee()));}return [w,d,!!e.f()]}function b(e,a){n=e;let r="",s=n;for(;;){n>=c$1.length&&o();const e=c$1.charCodeAt(n);if(e===a)break;92===e?(r+=c$1.slice(s,n),r+=k(),s=n):(8232===e||8233===e||u(e)&&o(),++n);}return r+=c$1.slice(s,n++),r}function k(){let e=c$1.charCodeAt(++n);switch(++n,e){case 110:return "\n";case 114:return "\r";case 120:return String.fromCharCode(l(2));case 117:return function(){let e;123===c$1.charCodeAt(n)?(++n,e=l(c$1.indexOf("}",n)-n),++n,e>1114111&&o()):e=l(4);return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}();case 116:return "\t";case 98:return "\b";case 118:return "\v";case 102:return "\f";case 13:10===c$1.charCodeAt(n)&&++n;case 10:return "";case 56:case 57:o();default:if(e>=48&&e<=55){let a=c$1.substr(n-1,3).match(/^[0-7]+/)[0],r=parseInt(a,8);return r>255&&(a=a.slice(0,-1),r=parseInt(a,8)),n+=a.length-1,e=c$1.charCodeAt(n),"0"===a&&56!==e&&57!==e||o(),String.fromCharCode(r)}return u(e)?"":String.fromCharCode(e)}}function l(e){const a=n;let r=0,s=0;for(let a=0;a<e;++a,++n){let e,i=c$1.charCodeAt(n);if(95!==i){if(i>=97)e=i-97+10;else if(i>=65)e=i-65+10;else {if(!(i>=48&&i<=57))break;e=i-48;}if(e>=16)break;s=i,r=16*r+e;}else 95!==s&&0!==a||o(),s=i;}return 95!==s&&n-a===e||o(),r}function u(e){return 13===e||10===e}function o(){throw Object.assign(Error(`Parse error ${f}:${c$1.slice(0,n).split("\n").length}:${n-c$1.lastIndexOf("\n",n-1)}`),{idx:n})}
+
+  async function _resolve (id, parentUrl) {
+    const urlResolved = resolveIfNotPlainOrUrl(id, parentUrl);
+    return {
+      r: resolveImportMap(importMap, urlResolved || id, parentUrl) || throwUnresolved(id, parentUrl),
+      // b = bare specifier
+      b: !urlResolved && !isURL(id)
+    };
+  }
+
+  const resolve = resolveHook ? async (id, parentUrl) => {
+    let result = resolveHook(id, parentUrl, defaultResolve);
+    // will be deprecated in next major
+    if (result && result.then)
+      result = await result;
+    return result ? { r: result, b: !resolveIfNotPlainOrUrl(id, parentUrl) && !isURL(id) } : _resolve(id, parentUrl);
+  } : _resolve;
+
+  // importShim('mod');
+  // importShim('mod', { opts });
+  // importShim('mod', { opts }, parentUrl);
+  // importShim('mod', parentUrl);
+  async function importShim (id, ...args) {
+    // parentUrl if present will be the last argument
+    let parentUrl = args[args.length - 1];
+    if (typeof parentUrl !== 'string')
+      parentUrl = baseUrl;
+    // needed for shim check
+    await initPromise;
+    if (importHook) await importHook(id, typeof args[1] !== 'string' ? args[1] : {}, parentUrl);
+    if (acceptingImportMaps || shimMode || !baselinePassthrough) {
+      processImportMaps();
+      if (!shimMode)
+        acceptingImportMaps = false;
+    }
+    await importMapPromise;
+    return topLevelLoad((await resolve(id, parentUrl)).r, { credentials: 'same-origin' });
+  }
+
+  self.importShim = importShim;
+
+  function defaultResolve (id, parentUrl) {
+    return resolveImportMap(importMap, resolveIfNotPlainOrUrl(id, parentUrl) || id, parentUrl) || throwUnresolved(id, parentUrl);
+  }
+
+  function throwUnresolved (id, parentUrl) {
+    throw Error(`Unable to resolve specifier '${id}'${fromParent(parentUrl)}`);
+  }
+
+  const resolveSync = (id, parentUrl = baseUrl) => {
+    parentUrl = `${parentUrl}`;
+    const result = resolveHook && resolveHook(id, parentUrl, defaultResolve);
+    return result && !result.then ? result : defaultResolve(id, parentUrl);
+  };
+
+  function metaResolve (id, parentUrl = this.url) {
+    return resolveSync(id, parentUrl);
+  }
+
+  importShim.resolve = resolveSync;
+  importShim.getImportMap = () => JSON.parse(JSON.stringify(importMap));
+
+  const registry = importShim._r = {};
+
+  async function loadAll (load, seen) {
+    if (load.b || seen[load.u])
+      return;
+    seen[load.u] = 1;
+    await load.L;
+    await Promise.all(load.d.map(dep => loadAll(dep, seen)));
+    if (!load.n)
+      load.n = load.d.some(dep => dep.n);
+  }
+
+  let importMap = { imports: {}, scopes: {} };
+  let importMapSrcOrLazy = false;
+  let baselinePassthrough;
+
+  const initPromise = featureDetectionPromise.then(() => {
+    // shim mode is determined on initialization, no late shim mode
+    if (!shimMode) {
+      if (document.querySelectorAll('script[type=module-shim],script[type=importmap-shim],link[rel=modulepreload-shim]').length) {
+        setShimMode();
+      }
+      else {
+        let seenScript = false;
+        for (const script of document.querySelectorAll('script[type=module],script[type=importmap]')) {
+          if (!seenScript) {
+            if (script.type === 'module')
+              seenScript = true;
+          }
+          else if (script.type === 'importmap') {
+            importMapSrcOrLazy = true;
+            break;
+          }
+        }
+      }
+    }
+    baselinePassthrough = esmsInitOptions.polyfillEnable !== true && supportsDynamicImport && supportsImportMeta && supportsImportMaps && (!jsonModulesEnabled || supportsJsonAssertions) && (!cssModulesEnabled || supportsCssAssertions) && !importMapSrcOrLazy && !false;
+    if (!supportsImportMaps) {
+      const supports = HTMLScriptElement.supports || (type => type === 'classic' || type === 'module');
+      HTMLScriptElement.supports = type => type === 'importmap' || supports(type);
+    }
+    if (shimMode || !baselinePassthrough) {
+      new MutationObserver(mutations => {
+        for (const mutation of mutations) {
+          if (mutation.type !== 'childList') continue;
+          for (const node of mutation.addedNodes) {
+            if (node.tagName === 'SCRIPT') {
+              if (node.type === (shimMode ? 'module-shim' : 'module'))
+                processScript(node);
+              if (node.type === (shimMode ? 'importmap-shim' : 'importmap'))
+                processImportMap(node);
+            }
+            else if (node.tagName === 'LINK' && node.rel === (shimMode ? 'modulepreload-shim' : 'modulepreload'))
+              processPreload(node);
+          }
+        }
+      }).observe(document, { childList: true, subtree: true });
+      processImportMaps();
+      processScriptsAndPreloads();
+      if (document.readyState === 'complete') {
+        readyStateCompleteCheck();
+      }
+      else {
+        async function readyListener () {
+          await initPromise;
+          processImportMaps();
+          if (document.readyState === 'complete') {
+            readyStateCompleteCheck();
+            document.removeEventListener('readystatechange', readyListener);
+          }
+        }
+        document.addEventListener('readystatechange', readyListener);
+      }
+      return undefined;
+    }
+  });
+  let importMapPromise = initPromise;
+  let firstPolyfillLoad = true;
+  let acceptingImportMaps = true;
+
+  async function topLevelLoad (url, fetchOpts, source, nativelyLoaded, lastStaticLoadPromise) {
+    if (!shimMode)
+      acceptingImportMaps = false;
+    await importMapPromise;
+    if (importHook) await importHook(id, typeof args[1] !== 'string' ? args[1] : {}, parentUrl);
+    // early analysis opt-out - no need to even fetch if we have feature support
+    if (!shimMode && baselinePassthrough) {
+      // for polyfill case, only dynamic import needs a return value here, and dynamic import will never pass nativelyLoaded
+      if (nativelyLoaded)
+        return null;
+      await lastStaticLoadPromise;
+      return dynamicImport(source ? createBlob(source) : url, { errUrl: url || source });
+    }
+    const load = getOrCreateLoad(url, fetchOpts, null, source);
+    const seen = {};
+    await loadAll(load, seen);
+    lastLoad = undefined;
+    resolveDeps(load, seen);
+    await lastStaticLoadPromise;
+    if (source && !shimMode && !load.n && !false) {
+      const module = await dynamicImport(createBlob(source), { errUrl: source });
+      if (revokeBlobURLs) revokeObjectURLs(Object.keys(seen));
+      return module;
+    }
+    if (firstPolyfillLoad && !shimMode && load.n && nativelyLoaded) {
+      onpolyfill();
+      firstPolyfillLoad = false;
+    }
+    const module = await dynamicImport(!shimMode && !load.n && nativelyLoaded ? load.u : load.b, { errUrl: load.u });
+    // if the top-level load is a shell, run its update function
+    if (load.s)
+      (await dynamicImport(load.s)).u$_(module);
+    if (revokeBlobURLs) revokeObjectURLs(Object.keys(seen));
+    // when tla is supported, this should return the tla promise as an actual handle
+    // so readystate can still correspond to the sync subgraph exec completions
+    return module;
+  }
+
+  function revokeObjectURLs(registryKeys) {
+    let batch = 0;
+    const keysLength = registryKeys.length;
+    const schedule = self.requestIdleCallback ? self.requestIdleCallback : self.requestAnimationFrame;
+    schedule(cleanup);
+    function cleanup() {
+      const batchStartIndex = batch * 100;
+      if (batchStartIndex > keysLength) return
+      for (const key of registryKeys.slice(batchStartIndex, batchStartIndex + 100)) {
+        const load = registry[key];
+        if (load) URL.revokeObjectURL(load.b);
+      }
+      batch++;
+      schedule(cleanup);
+    }
+  }
+
+  function urlJsString (url) {
+    return `'${url.replace(/'/g, "\\'")}'`;
+  }
+
+  let lastLoad;
+  function resolveDeps (load, seen) {
+    if (load.b || !seen[load.u])
+      return;
+    seen[load.u] = 0;
+
+    for (const dep of load.d)
+      resolveDeps(dep, seen);
+
+    const [imports] = load.a;
+
+    // "execution"
+    const source = load.S;
+
+    // edge doesnt execute sibling in order, so we fix this up by ensuring all previous executions are explicit dependencies
+    let resolvedSource = edge && lastLoad ? `import '${lastLoad}';` : '';  
+
+    if (!imports.length) {
+      resolvedSource += source;
+    }
+    else {
+      // once all deps have loaded we can inline the dependency resolution blobs
+      // and define this blob
+      let lastIndex = 0, depIndex = 0, dynamicImportEndStack = [];
+      function pushStringTo (originalIndex) {
+        while (dynamicImportEndStack[dynamicImportEndStack.length - 1] < originalIndex) {
+          const dynamicImportEnd = dynamicImportEndStack.pop();
+          resolvedSource += `${source.slice(lastIndex, dynamicImportEnd)}, ${urlJsString(load.r)}`;
+          lastIndex = dynamicImportEnd;
+        }
+        resolvedSource += source.slice(lastIndex, originalIndex);
+        lastIndex = originalIndex;
+      }
+      for (const { s: start, ss: statementStart, se: statementEnd, d: dynamicImportIndex } of imports) {
+        // dependency source replacements
+        if (dynamicImportIndex === -1) {
+          let depLoad = load.d[depIndex++], blobUrl = depLoad.b, cycleShell = !blobUrl;
+          if (cycleShell) {
+            // circular shell creation
+            if (!(blobUrl = depLoad.s)) {
+              blobUrl = depLoad.s = createBlob(`export function u$_(m){${
+              depLoad.a[1].map(
+                name => name === 'default' ? `d$_=m.default` : `${name}=m.${name}`
+              ).join(',')
+            }}${
+              depLoad.a[1].map(name =>
+                name === 'default' ? `let d$_;export{d$_ as default}` : `export let ${name}`
+              ).join(';')
+            }\n//# sourceURL=${depLoad.r}?cycle`);
+            }
+          }
+
+          pushStringTo(start - 1);
+          resolvedSource += `/*${source.slice(start - 1, statementEnd)}*/${urlJsString(blobUrl)}`;
+
+          // circular shell execution
+          if (!cycleShell && depLoad.s) {          
+            resolvedSource += `;import*as m$_${depIndex} from'${depLoad.b}';import{u$_ as u$_${depIndex}}from'${depLoad.s}';u$_${depIndex}(m$_${depIndex})`;
+            depLoad.s = undefined;
+          }
+          lastIndex = statementEnd;
+        }
+        // import.meta
+        else if (dynamicImportIndex === -2) {
+          load.m = { url: load.r, resolve: metaResolve };
+          metaHook(load.m, load.u);
+          pushStringTo(start);
+          resolvedSource += `importShim._r[${urlJsString(load.u)}].m`;
+          lastIndex = statementEnd;
+        }
+        // dynamic import
+        else {
+          pushStringTo(statementStart + 6);
+          resolvedSource += `Shim(`;
+          dynamicImportEndStack.push(statementEnd - 1);
+          lastIndex = start;
+        }
+      }
+
+      pushStringTo(source.length);
+    }
+
+    let hasSourceURL = false;
+    resolvedSource = resolvedSource.replace(sourceMapURLRegEx, (match, isMapping, url) => (hasSourceURL = !isMapping, match.replace(url, () => new URL(url, load.r))));
+    if (!hasSourceURL)
+      resolvedSource += '\n//# sourceURL=' + load.r;
+
+    load.b = lastLoad = createBlob(resolvedSource);
+    load.S = undefined;
+  }
+
+  // ; and // trailer support added for Ruby on Rails 7 source maps compatibility
+  // https://github.com/guybedford/es-module-shims/issues/228
+  const sourceMapURLRegEx = /\n\/\/# source(Mapping)?URL=([^\n]+)\s*((;|\/\/[^#][^\n]*)\s*)*$/;
+
+  const jsContentType = /^(text|application)\/(x-)?javascript(;|$)/;
+  const jsonContentType = /^(text|application)\/json(;|$)/;
+  const cssContentType = /^(text|application)\/css(;|$)/;
+
+  const cssUrlRegEx = /url\(\s*(?:(["'])((?:\\.|[^\n\\"'])+)\1|((?:\\.|[^\s,"'()\\])+))\s*\)/g;
+
+  // restrict in-flight fetches to a pool of 100
+  let p = [];
+  let c = 0;
+  function pushFetchPool () {
+    if (++c > 100)
+      return new Promise(r => p.push(r));
+  }
+  function popFetchPool () {
+    c--;
+    if (p.length)
+      p.shift()();
+  }
+
+  async function doFetch (url, fetchOpts, parent) {
+    if (enforceIntegrity && !fetchOpts.integrity)
+      throw Error(`No integrity for ${url}${fromParent(parent)}.`);
+    const poolQueue = pushFetchPool();
+    if (poolQueue) await poolQueue;
+    try {
+      var res = await fetchHook(url, fetchOpts);
+    }
+    catch (e) {
+      e.message = `Unable to fetch ${url}${fromParent(parent)} - see network log for details.\n` + e.message;
+      throw e;
+    }
+    finally {
+      popFetchPool();
+    }
+    if (!res.ok)
+      throw Error(`${res.status} ${res.statusText} ${res.url}${fromParent(parent)}`);
+    return res;
+  }
+
+  async function fetchModule (url, fetchOpts, parent) {
+    const res = await doFetch(url, fetchOpts, parent);
+    const contentType = res.headers.get('content-type');
+    if (jsContentType.test(contentType))
+      return { r: res.url, s: await res.text(), t: 'js' };
+    else if (jsonContentType.test(contentType))
+      return { r: res.url, s: `export default ${await res.text()}`, t: 'json' };
+    else if (cssContentType.test(contentType)) {
+      return { r: res.url, s: `var s=new CSSStyleSheet();s.replaceSync(${
+      JSON.stringify((await res.text()).replace(cssUrlRegEx, (_match, quotes = '', relUrl1, relUrl2) => `url(${quotes}${resolveUrl(relUrl1 || relUrl2, url)}${quotes})`))
+    });export default s;`, t: 'css' };
+    }
+    else
+      throw Error(`Unsupported Content-Type "${contentType}" loading ${url}${fromParent(parent)}. Modules must be served with a valid MIME type like application/javascript.`);
+  }
+
+  function getOrCreateLoad (url, fetchOpts, parent, source) {
+    let load = registry[url];
+    if (load && !source)
+      return load;
+
+    load = {
+      // url
+      u: url,
+      // response url
+      r: source ? url : undefined,
+      // fetchPromise
+      f: undefined,
+      // source
+      S: undefined,
+      // linkPromise
+      L: undefined,
+      // analysis
+      a: undefined,
+      // deps
+      d: undefined,
+      // blobUrl
+      b: undefined,
+      // shellUrl
+      s: undefined,
+      // needsShim
+      n: false,
+      // type
+      t: null,
+      // meta
+      m: null
+    };
+    if (registry[url]) {
+      let i = 0;
+      while (registry[load.u + ++i]);
+      load.u += i;
+    }
+    registry[load.u] = load;
+
+    load.f = (async () => {
+      if (!source) {
+        // preload fetch options override fetch options (race)
+        let t;
+        ({ r: load.r, s: source, t } = await (fetchCache[url] || fetchModule(url, fetchOpts, parent)));
+        if (t && !shimMode) {
+          if (t === 'css' && !cssModulesEnabled || t === 'json' && !jsonModulesEnabled)
+            throw Error(`${t}-modules require <script type="esms-options">{ "polyfillEnable": ["${t}-modules"] }<${''}/script>`);
+          if (t === 'css' && !supportsCssAssertions || t === 'json' && !supportsJsonAssertions)
+            load.n = true;
+        }
+      }
+      try {
+        load.a = parse(source, load.u);
+      }
+      catch (e) {
+        throwError(e);
+        load.a = [[], [], false];
+      }
+      load.S = source;
+      return load;
+    })();
+
+    load.L = load.f.then(async () => {
+      let childFetchOpts = fetchOpts;
+      load.d = (await Promise.all(load.a[0].map(async ({ n, d }) => {
+        if (d >= 0 && !supportsDynamicImport || d === 2 && !supportsImportMeta)
+          load.n = true;
+        if (d !== -1 || !n) return;
+        const { r, b } = await resolve(n, load.r || load.u);
+        if (b && (!supportsImportMaps || importMapSrcOrLazy))
+          load.n = true;
+        if (skip && skip.test(r)) return { b: r };
+        if (childFetchOpts.integrity)
+          childFetchOpts = Object.assign({}, childFetchOpts, { integrity: undefined });
+        return getOrCreateLoad(r, childFetchOpts, load.r).f;
+      }))).filter(l => l);
+    });
+
+    return load;
+  }
+
+  function processScriptsAndPreloads () {
+    for (const script of document.querySelectorAll(shimMode ? 'script[type=module-shim]' : 'script[type=module]'))
+      processScript(script);
+    for (const link of document.querySelectorAll(shimMode ? 'link[rel=modulepreload-shim]' : 'link[rel=modulepreload]'))
+      processPreload(link);
+  }
+
+  function processImportMaps () {
+    for (const script of document.querySelectorAll(shimMode ? 'script[type="importmap-shim"]' : 'script[type="importmap"]'))
+      processImportMap(script);
+  }
+
+  function getFetchOpts (script) {
+    const fetchOpts = {};
+    if (script.integrity)
+      fetchOpts.integrity = script.integrity;
+    if (script.referrerpolicy)
+      fetchOpts.referrerPolicy = script.referrerpolicy;
+    if (script.crossorigin === 'use-credentials')
+      fetchOpts.credentials = 'include';
+    else if (script.crossorigin === 'anonymous')
+      fetchOpts.credentials = 'omit';
+    else
+      fetchOpts.credentials = 'same-origin';
+    return fetchOpts;
+  }
+
+  let lastStaticLoadPromise = Promise.resolve();
+
+  let domContentLoadedCnt = 1;
+  function domContentLoadedCheck () {
+    if (--domContentLoadedCnt === 0 && !noLoadEventRetriggers)
+      document.dispatchEvent(new Event('DOMContentLoaded'));
+  }
+  // this should always trigger because we assume es-module-shims is itself a domcontentloaded requirement
+  document.addEventListener('DOMContentLoaded', async () => {
+    await initPromise;
+    domContentLoadedCheck();
+    if (shimMode || !baselinePassthrough) {
+      processImportMaps();
+      processScriptsAndPreloads();
+    }
+  });
+
+  let readyStateCompleteCnt = 1;
+  function readyStateCompleteCheck () {
+    if (--readyStateCompleteCnt === 0 && !noLoadEventRetriggers)
+      document.dispatchEvent(new Event('readystatechange'));
+  }
+
+  function processImportMap (script) {
+    if (script.ep) // ep marker = script processed
+      return;
+    // empty inline scripts sometimes show before domready
+    if (!script.src && !script.innerHTML)
+      return;
+    script.ep = true;
+    // we dont currently support multiple, external or dynamic imports maps in polyfill mode to match native
+    if (script.src) {
+      if (!shimMode)
+        return;
+      importMapSrcOrLazy = true;
+    }
+    if (acceptingImportMaps) {
+      importMapPromise = importMapPromise
+        .then(async () => {
+          importMap = resolveAndComposeImportMap(script.src ? await (await doFetch(script.src, getFetchOpts(script))).json() : JSON.parse(script.innerHTML), script.src || baseUrl, importMap);
+        })
+        .catch(throwError);
+      if (!shimMode)
+        acceptingImportMaps = false;
+    }
+  }
+
+  function processScript (script) {
+    if (script.ep) // ep marker = script processed
+      return;
+    if (script.getAttribute('noshim') !== null)
+      return;
+    // empty inline scripts sometimes show before domready
+    if (!script.src && !script.innerHTML)
+      return;
+    script.ep = true;
+    // does this load block readystate complete
+    const isBlockingReadyScript = script.getAttribute('async') === null && readyStateCompleteCnt > 0;
+    // does this load block DOMContentLoaded
+    const isDomContentLoadedScript = domContentLoadedCnt > 0;
+    if (isBlockingReadyScript) readyStateCompleteCnt++;
+    if (isDomContentLoadedScript) domContentLoadedCnt++;
+    const loadPromise = topLevelLoad(script.src || baseUrl, getFetchOpts(script), !script.src && script.innerHTML, !shimMode, isBlockingReadyScript && lastStaticLoadPromise).catch(throwError);
+    if (isBlockingReadyScript)
+      lastStaticLoadPromise = loadPromise.then(readyStateCompleteCheck);
+    if (isDomContentLoadedScript)
+      loadPromise.then(domContentLoadedCheck);
+  }
+
+  const fetchCache = {};
+  function processPreload (link) {
+    if (link.ep) // ep marker = processed
+      return;
+    link.ep = true;
+    if (fetchCache[link.href])
+      return;
+    fetchCache[link.href] = fetchModule(link.href, getFetchOpts(link));
+  }
+
+})();
diff --git a/public/assets/es-module-shims-cc9c89730a363e05aad0613bb8a7ee937baa2b44516176f9c19365e348032583.js.gz b/public/assets/es-module-shims-cc9c89730a363e05aad0613bb8a7ee937baa2b44516176f9c19365e348032583.js.gz
new file mode 100644
index 0000000000000000000000000000000000000000..4dadd5833dc695d2bcd9f5207c617545646b79f1
Binary files /dev/null and b/public/assets/es-module-shims-cc9c89730a363e05aad0613bb8a7ee937baa2b44516176f9c19365e348032583.js.gz differ
diff --git a/public/assets/es-module-shims.js-d8b1db8467f1af14f3ecf729b9fb6dd6a55f3ccff4499a3f033397e46d48bf68.map b/public/assets/es-module-shims.js-d8b1db8467f1af14f3ecf729b9fb6dd6a55f3ccff4499a3f033397e46d48bf68.map
new file mode 100644
index 0000000000000000000000000000000000000000..a320f99313ef3f8edc90c1fec86f53156454f6c1
--- /dev/null
+++ b/public/assets/es-module-shims.js-d8b1db8467f1af14f3ecf729b9fb6dd6a55f3ccff4499a3f033397e46d48bf68.map
@@ -0,0 +1 @@
+{"version":3,"file":"es-module-shims.js","sources":["../dist/es-module-shims.js"],"sourcesContent":["/* ES Module Shims 1.5.5 */\n(function () {\n\n  const noop = () => {};\r\n\r\n  const optionsScript = document.querySelector('script[type=esms-options]');\r\n\r\n  const esmsInitOptions = optionsScript ? JSON.parse(optionsScript.innerHTML) : {};\r\n  Object.assign(esmsInitOptions, self.esmsInitOptions || {});\r\n\r\n  let shimMode = !!esmsInitOptions.shimMode;\r\n\r\n  const importHook = globalHook(shimMode && esmsInitOptions.onimport);\r\n  const resolveHook = globalHook(shimMode && esmsInitOptions.resolve);\r\n  let fetchHook = esmsInitOptions.fetch ? globalHook(esmsInitOptions.fetch) : fetch;\r\n  const metaHook = esmsInitOptions.meta ? globalHook(shimModule && esmsInitOptions.meta) : noop;\r\n\r\n  const skip = esmsInitOptions.skip ? new RegExp(esmsInitOptions.skip) : null;\r\n\r\n  let nonce = esmsInitOptions.nonce;\r\n\r\n  const mapOverrides = esmsInitOptions.mapOverrides;\r\n\r\n  if (!nonce) {\r\n    const nonceElement = document.querySelector('script[nonce]');\r\n    if (nonceElement)\r\n      nonce = nonceElement.nonce || nonceElement.getAttribute('nonce');\r\n  }\r\n\r\n  const onerror = globalHook(esmsInitOptions.onerror || noop);\r\n  const onpolyfill = esmsInitOptions.onpolyfill ? globalHook(esmsInitOptions.onpolyfill) : () => {\r\n    console.log('%c^^ Module TypeError above is polyfilled and can be ignored ^^', 'font-weight:900;color:#391');\r\n  };\r\n\r\n  const { revokeBlobURLs, noLoadEventRetriggers, enforceIntegrity } = esmsInitOptions;\r\n\r\n  function globalHook (name) {\r\n    return typeof name === 'string' ? self[name] : name;\r\n  }\r\n\r\n  const enable = Array.isArray(esmsInitOptions.polyfillEnable) ? esmsInitOptions.polyfillEnable : [];\r\n  const cssModulesEnabled = enable.includes('css-modules');\r\n  const jsonModulesEnabled = enable.includes('json-modules');\r\n\r\n  function setShimMode () {\r\n    shimMode = true;\r\n  }\r\n\r\n  const edge = !navigator.userAgentData && !!navigator.userAgent.match(/Edge\\/\\d+\\.\\d+/);\r\n\r\n  const baseUrl = document.baseURI;\r\n\r\n  function createBlob (source, type = 'text/javascript') {\r\n    return URL.createObjectURL(new Blob([source], { type }));\r\n  }\r\n\r\n  const eoop = err => setTimeout(() => { throw err });\r\n\r\n  const throwError = err => { (window.reportError || window.safari && console.error || eoop)(err), void onerror(err); };\r\n\r\n  function fromParent (parent) {\r\n    return parent ? ` imported from ${parent}` : '';\r\n  }\n\n  const backslashRegEx = /\\\\/g;\r\n\r\n  function isURL (url) {\r\n    if (url.indexOf(':') === -1) return false;\r\n    try {\r\n      new URL(url);\r\n      return true;\r\n    }\r\n    catch (_) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /*\r\n   * Import maps implementation\r\n   *\r\n   * To make lookups fast we pre-resolve the entire import map\r\n   * and then match based on backtracked hash lookups\r\n   *\r\n   */\r\n  function resolveUrl (relUrl, parentUrl) {\r\n    return resolveIfNotPlainOrUrl(relUrl, parentUrl) || (isURL(relUrl) ? relUrl : resolveIfNotPlainOrUrl('./' + relUrl, parentUrl));\r\n  }\r\n\r\n  function resolveIfNotPlainOrUrl (relUrl, parentUrl) {\r\n    // strip off any trailing query params or hashes\r\n    const queryHashIndex = parentUrl.indexOf('?', parentUrl.indexOf('#') === -1 ? parentUrl.indexOf('#') : parentUrl.length);\r\n    if (queryHashIndex !== -1)\r\n      parentUrl = parentUrl.slice(0, queryHashIndex);\r\n    if (relUrl.indexOf('\\\\') !== -1)\r\n      relUrl = relUrl.replace(backslashRegEx, '/');\r\n    // protocol-relative\r\n    if (relUrl[0] === '/' && relUrl[1] === '/') {\r\n      return parentUrl.slice(0, parentUrl.indexOf(':') + 1) + relUrl;\r\n    }\r\n    // relative-url\r\n    else if (relUrl[0] === '.' && (relUrl[1] === '/' || relUrl[1] === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) ||\r\n        relUrl.length === 1  && (relUrl += '/')) ||\r\n        relUrl[0] === '/') {\r\n      const parentProtocol = parentUrl.slice(0, parentUrl.indexOf(':') + 1);\r\n      // Disabled, but these cases will give inconsistent results for deep backtracking\r\n      //if (parentUrl[parentProtocol.length] !== '/')\r\n      //  throw new Error('Cannot resolve');\r\n      // read pathname from parent URL\r\n      // pathname taken to be part after leading \"/\"\r\n      let pathname;\r\n      if (parentUrl[parentProtocol.length + 1] === '/') {\r\n        // resolving to a :// so we need to read out the auth and host\r\n        if (parentProtocol !== 'file:') {\r\n          pathname = parentUrl.slice(parentProtocol.length + 2);\r\n          pathname = pathname.slice(pathname.indexOf('/') + 1);\r\n        }\r\n        else {\r\n          pathname = parentUrl.slice(8);\r\n        }\r\n      }\r\n      else {\r\n        // resolving to :/ so pathname is the /... part\r\n        pathname = parentUrl.slice(parentProtocol.length + (parentUrl[parentProtocol.length] === '/'));\r\n      }\r\n\r\n      if (relUrl[0] === '/')\r\n        return parentUrl.slice(0, parentUrl.length - pathname.length - 1) + relUrl;\r\n\r\n      // join together and split for removal of .. and . segments\r\n      // looping the string instead of anything fancy for perf reasons\r\n      // '../../../../../z' resolved to 'x/y' is just 'z'\r\n      const segmented = pathname.slice(0, pathname.lastIndexOf('/') + 1) + relUrl;\r\n\r\n      const output = [];\r\n      let segmentIndex = -1;\r\n      for (let i = 0; i < segmented.length; i++) {\r\n        // busy reading a segment - only terminate on '/'\r\n        if (segmentIndex !== -1) {\r\n          if (segmented[i] === '/') {\r\n            output.push(segmented.slice(segmentIndex, i + 1));\r\n            segmentIndex = -1;\r\n          }\r\n          continue;\r\n        }\r\n        // new segment - check if it is relative\r\n        else if (segmented[i] === '.') {\r\n          // ../ segment\r\n          if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i + 2 === segmented.length)) {\r\n            output.pop();\r\n            i += 2;\r\n            continue;\r\n          }\r\n          // ./ segment\r\n          else if (segmented[i + 1] === '/' || i + 1 === segmented.length) {\r\n            i += 1;\r\n            continue;\r\n          }\r\n        }\r\n        // it is the start of a new segment\r\n        while (segmented[i] === '/') i++;\r\n        segmentIndex = i; \r\n      }\r\n      // finish reading out the last segment\r\n      if (segmentIndex !== -1)\r\n        output.push(segmented.slice(segmentIndex));\r\n      return parentUrl.slice(0, parentUrl.length - pathname.length) + output.join('');\r\n    }\r\n  }\r\n\r\n  function resolveAndComposeImportMap (json, baseUrl, parentMap) {\r\n    const outMap = { imports: Object.assign({}, parentMap.imports), scopes: Object.assign({}, parentMap.scopes) };\r\n\r\n    if (json.imports)\r\n      resolveAndComposePackages(json.imports, outMap.imports, baseUrl, parentMap);\r\n\r\n    if (json.scopes)\r\n      for (let s in json.scopes) {\r\n        const resolvedScope = resolveUrl(s, baseUrl);\r\n        resolveAndComposePackages(json.scopes[s], outMap.scopes[resolvedScope] || (outMap.scopes[resolvedScope] = {}), baseUrl, parentMap);\r\n      }\r\n\r\n    return outMap;\r\n  }\r\n\r\n  function getMatch (path, matchObj) {\r\n    if (matchObj[path])\r\n      return path;\r\n    let sepIndex = path.length;\r\n    do {\r\n      const segment = path.slice(0, sepIndex + 1);\r\n      if (segment in matchObj)\r\n        return segment;\r\n    } while ((sepIndex = path.lastIndexOf('/', sepIndex - 1)) !== -1)\r\n  }\r\n\r\n  function applyPackages (id, packages) {\r\n    const pkgName = getMatch(id, packages);\r\n    if (pkgName) {\r\n      const pkg = packages[pkgName];\r\n      if (pkg === null) return;\r\n      return pkg + id.slice(pkgName.length);\r\n    }\r\n  }\r\n\r\n\r\n  function resolveImportMap (importMap, resolvedOrPlain, parentUrl) {\r\n    let scopeUrl = parentUrl && getMatch(parentUrl, importMap.scopes);\r\n    while (scopeUrl) {\r\n      const packageResolution = applyPackages(resolvedOrPlain, importMap.scopes[scopeUrl]);\r\n      if (packageResolution)\r\n        return packageResolution;\r\n      scopeUrl = getMatch(scopeUrl.slice(0, scopeUrl.lastIndexOf('/')), importMap.scopes);\r\n    }\r\n    return applyPackages(resolvedOrPlain, importMap.imports) || resolvedOrPlain.indexOf(':') !== -1 && resolvedOrPlain;\r\n  }\r\n\r\n  function resolveAndComposePackages (packages, outPackages, baseUrl, parentMap) {\r\n    for (let p in packages) {\r\n      const resolvedLhs = resolveIfNotPlainOrUrl(p, baseUrl) || p;\r\n      if ((!shimMode || !mapOverrides) && outPackages[resolvedLhs] && (outPackages[resolvedLhs] !== packages[resolvedLhs])) {\r\n        throw Error(`Rejected map override \"${resolvedLhs}\" from ${outPackages[resolvedLhs]} to ${packages[resolvedLhs]}.`);\r\n      }\r\n      let target = packages[p];\r\n      if (typeof target !== 'string')\r\n        continue;\r\n      const mapped = resolveImportMap(parentMap, resolveIfNotPlainOrUrl(target, baseUrl) || target, baseUrl);\r\n      if (mapped) {\r\n        outPackages[resolvedLhs] = mapped;\r\n        continue;\r\n      }\r\n      console.warn(`Mapping \"${p}\" -> \"${packages[p]}\" does not resolve`);\r\n    }\r\n  }\n\n  let err;\r\n  window.addEventListener('error', _err => err = _err);\r\n  function dynamicImportScript (url, { errUrl = url } = {}) {\r\n    err = undefined;\r\n    const src = createBlob(`import*as m from'${url}';self._esmsi=m`);\r\n    const s = Object.assign(document.createElement('script'), { type: 'module', src });\r\n    s.setAttribute('nonce', nonce);\r\n    s.setAttribute('noshim', '');\r\n    const p =  new Promise((resolve, reject) => {\r\n      // Safari is unique in supporting module script error events\r\n      s.addEventListener('error', cb);\r\n      s.addEventListener('load', cb);\r\n\r\n      function cb (_err) {\r\n        document.head.removeChild(s);\r\n        if (self._esmsi) {\r\n          resolve(self._esmsi, baseUrl);\r\n          self._esmsi = undefined;\r\n        }\r\n        else {\r\n          reject(!(_err instanceof Event) && _err || err && err.error || new Error(`Error loading or executing the graph of ${errUrl} (check the console for ${src}).`));\r\n          err = undefined;\r\n        }\r\n      }\r\n    });\r\n    document.head.appendChild(s);\r\n    return p;\r\n  }\r\n\r\n  let dynamicImport = dynamicImportScript;\r\n\r\n  const supportsDynamicImportCheck = dynamicImportScript(createBlob('export default u=>import(u)')).then(_dynamicImport => {\r\n    if (_dynamicImport)\r\n      dynamicImport = _dynamicImport.default;\r\n    return !!_dynamicImport;\r\n  }, noop);\n\n  // support browsers without dynamic import support (eg Firefox 6x)\r\n  let supportsJsonAssertions = false;\r\n  let supportsCssAssertions = false;\r\n\r\n  let supportsImportMeta = false;\r\n  let supportsImportMaps = false;\r\n\r\n  let supportsDynamicImport = false;\r\n\r\n  const featureDetectionPromise = Promise.resolve(supportsDynamicImportCheck).then(_supportsDynamicImport => {\r\n    if (!_supportsDynamicImport)\r\n      return;\r\n    supportsDynamicImport = true;\r\n\r\n    return Promise.all([\r\n      dynamicImport(createBlob('import.meta')).then(() => supportsImportMeta = true, noop),\r\n      cssModulesEnabled && dynamicImport(createBlob('import\"data:text/css,{}\"assert{type:\"css\"}')).then(() => supportsCssAssertions = true, noop),\r\n      jsonModulesEnabled && dynamicImport(createBlob('import\"data:text/json,{}\"assert{type:\"json\"}')).then(() => supportsJsonAssertions = true, noop),\r\n      HTMLScriptElement.supports ? supportsImportMaps = HTMLScriptElement.supports('importmap') : new Promise(resolve => {\r\n        self._$s = v => {\r\n          document.head.removeChild(iframe);\r\n          if (v) supportsImportMaps = true;\r\n          delete self._$s;\r\n          resolve();\r\n        };\r\n        const iframe = document.createElement('iframe');\r\n        iframe.style.display = 'none';\r\n        iframe.setAttribute('nonce', nonce);\r\n        iframe.srcdoc = `<script type=importmap nonce=\"${nonce}\">{\"imports\":{\"x\":\"data:text/javascript,\"}}<${''}/script><script nonce=\"${nonce}\">import('x').then(()=>1,()=>0).then(v=>parent._$s(v))<${''}/script>`;\r\n        document.head.appendChild(iframe);\r\n      })\r\n    ]);\r\n  });\n\n  /* es-module-lexer 0.10.5 */\n  let e,a,r,s=2<<19;const i=1===new Uint8Array(new Uint16Array([1]).buffer)[0]?function(e,a){const r=e.length;let s=0;for(;s<r;)a[s]=e.charCodeAt(s++);}:function(e,a){const r=e.length;let s=0;for(;s<r;){const r=e.charCodeAt(s);a[s++]=(255&r)<<8|r>>>8;}},t=\"xportmportlassetafromssertvoyiedeleinstantyreturdebuggeawaithrwhileforifcatcfinallels\";let c$1,f,n;function parse(k,l=\"@\"){c$1=k,f=l;const u=2*c$1.length+(2<<18);if(u>s||!e){for(;u>s;)s*=2;a=new ArrayBuffer(s),i(t,new Uint16Array(a,16,85)),e=function(e,a,r){\"use asm\";var s=new e.Int8Array(r),i=new e.Int16Array(r),t=new e.Int32Array(r),c=new e.Uint8Array(r),f=new e.Uint16Array(r),n=992;function b(e){e=e|0;var a=0,r=0,c=0,b=0,u=0,w=0,v=0;v=n;n=n+11520|0;u=v+2048|0;s[763]=1;i[377]=0;i[378]=0;i[379]=0;i[380]=-1;t[57]=t[2];s[764]=0;t[56]=0;s[762]=0;t[58]=v+10496;t[59]=v+2304;t[60]=v;s[765]=0;e=(t[3]|0)+-2|0;t[61]=e;a=e+(t[54]<<1)|0;t[62]=a;e:while(1){r=e+2|0;t[61]=r;if(e>>>0>=a>>>0){b=18;break}a:do{switch(i[r>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if((((i[379]|0)==0?D(r)|0:0)?(m(e+4|0,16,10)|0)==0:0)?(k(),(s[763]|0)==0):0){b=9;break e}else b=17;break}case 105:{if(D(r)|0?(m(e+4|0,26,10)|0)==0:0){l();b=17;}else b=17;break}case 59:{b=17;break}case 47:switch(i[e+4>>1]|0){case 47:{j();break a}case 42:{y(1);break a}default:{b=16;break e}}default:{b=16;break e}}}while(0);if((b|0)==17){b=0;t[57]=t[61];}e=t[61]|0;a=t[62]|0;}if((b|0)==9){e=t[61]|0;t[57]=e;b=19;}else if((b|0)==16){s[763]=0;t[61]=e;b=19;}else if((b|0)==18)if(!(s[762]|0)){e=r;b=19;}else e=0;do{if((b|0)==19){e:while(1){a=e+2|0;t[61]=a;c=a;if(e>>>0>=(t[62]|0)>>>0){b=75;break}a:do{switch(i[a>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if(((i[379]|0)==0?D(a)|0:0)?(m(e+4|0,16,10)|0)==0:0){k();b=74;}else b=74;break}case 105:{if(D(a)|0?(m(e+4|0,26,10)|0)==0:0){l();b=74;}else b=74;break}case 99:{if((D(a)|0?(m(e+4|0,36,8)|0)==0:0)?M(i[e+12>>1]|0)|0:0){s[765]=1;b=74;}else b=74;break}case 40:{r=t[57]|0;c=t[59]|0;b=i[379]|0;i[379]=b+1<<16>>16;t[c+((b&65535)<<2)>>2]=r;b=74;break}case 41:{a=i[379]|0;if(!(a<<16>>16)){b=36;break e}a=a+-1<<16>>16;i[379]=a;r=i[378]|0;if(r<<16>>16!=0?(w=t[(t[60]|0)+((r&65535)+-1<<2)>>2]|0,(t[w+20>>2]|0)==(t[(t[59]|0)+((a&65535)<<2)>>2]|0)):0){a=w+4|0;if(!(t[a>>2]|0))t[a>>2]=c;t[w+12>>2]=e+4;i[378]=r+-1<<16>>16;b=74;}else b=74;break}case 123:{b=t[57]|0;c=t[51]|0;e=b;do{if((i[b>>1]|0)==41&(c|0)!=0?(t[c+4>>2]|0)==(b|0):0){a=t[52]|0;t[51]=a;if(!a){t[47]=0;break}else {t[a+28>>2]=0;break}}}while(0);r=i[379]|0;b=r&65535;s[u+b>>0]=s[765]|0;s[765]=0;c=t[59]|0;i[379]=r+1<<16>>16;t[c+(b<<2)>>2]=e;b=74;break}case 125:{e=i[379]|0;if(!(e<<16>>16)){b=49;break e}r=e+-1<<16>>16;i[379]=r;a=i[380]|0;if(e<<16>>16!=a<<16>>16)if(a<<16>>16!=-1&(r&65535)<(a&65535)){b=53;break e}else {b=74;break a}else {c=t[58]|0;b=(i[377]|0)+-1<<16>>16;i[377]=b;i[380]=i[c+((b&65535)<<1)>>1]|0;h();b=74;break a}}case 39:{d(39);b=74;break}case 34:{d(34);b=74;break}case 47:switch(i[e+4>>1]|0){case 47:{j();break a}case 42:{y(1);break a}default:{a=t[57]|0;r=i[a>>1]|0;r:do{if(!(U(r)|0)){switch(r<<16>>16){case 41:if(q(t[(t[59]|0)+(f[379]<<2)>>2]|0)|0){b=71;break r}else {b=68;break r}case 125:break;default:{b=68;break r}}e=f[379]|0;if(!(p(t[(t[59]|0)+(e<<2)>>2]|0)|0)?(s[u+e>>0]|0)==0:0)b=68;else b=71;}else switch(r<<16>>16){case 46:if(((i[a+-2>>1]|0)+-48&65535)<10){b=68;break r}else {b=71;break r}case 43:if((i[a+-2>>1]|0)==43){b=68;break r}else {b=71;break r}case 45:if((i[a+-2>>1]|0)==45){b=68;break r}else {b=71;break r}default:{b=71;break r}}}while(0);r:do{if((b|0)==68){b=0;if(!(o(a)|0)){switch(r<<16>>16){case 0:{b=71;break r}case 47:break;default:{e=1;break r}}if(!(s[764]|0))e=1;else b=71;}else b=71;}}while(0);if((b|0)==71){g();e=0;}s[764]=e;b=74;break a}}case 96:{h();b=74;break}default:b=74;}}while(0);if((b|0)==74){b=0;t[57]=t[61];}e=t[61]|0;}if((b|0)==36){L();e=0;break}else if((b|0)==49){L();e=0;break}else if((b|0)==53){L();e=0;break}else if((b|0)==75){e=(i[380]|0)==-1&(i[379]|0)==0&(s[762]|0)==0&(i[378]|0)==0;break}}}while(0);n=v;return e|0}function k(){var e=0,a=0,r=0,c=0,f=0,n=0;f=t[61]|0;n=f+12|0;t[61]=n;a=w(1)|0;e=t[61]|0;if(!((e|0)==(n|0)?!(I(a)|0):0))c=3;e:do{if((c|0)==3){a:do{switch(a<<16>>16){case 100:{B(e,e+14|0);break e}case 97:{t[61]=e+10;w(1)|0;e=t[61]|0;c=6;break}case 102:{c=6;break}case 99:{if((m(e+2|0,36,8)|0)==0?(r=e+10|0,$(i[r>>1]|0)|0):0){t[61]=r;f=w(1)|0;n=t[61]|0;E(f)|0;B(n,t[61]|0);t[61]=(t[61]|0)+-2;break e}e=e+4|0;t[61]=e;c=13;break}case 108:case 118:{c=13;break}case 123:{t[61]=e+2;e=w(1)|0;r=t[61]|0;while(1){if(N(e)|0){d(e);e=(t[61]|0)+2|0;t[61]=e;}else {E(e)|0;e=t[61]|0;}w(1)|0;e=C(r,e)|0;if(e<<16>>16==44){t[61]=(t[61]|0)+2;e=w(1)|0;}a=r;r=t[61]|0;if(e<<16>>16==125){c=32;break}if((r|0)==(a|0)){c=29;break}if(r>>>0>(t[62]|0)>>>0){c=31;break}}if((c|0)==29){L();break e}else if((c|0)==31){L();break e}else if((c|0)==32){t[61]=r+2;c=34;break a}break}case 42:{t[61]=e+2;w(1)|0;c=t[61]|0;C(c,c)|0;c=34;break}default:{}}}while(0);if((c|0)==6){t[61]=e+16;e=w(1)|0;if(e<<16>>16==42){t[61]=(t[61]|0)+2;e=w(1)|0;}n=t[61]|0;E(e)|0;B(n,t[61]|0);t[61]=(t[61]|0)+-2;break}else if((c|0)==13){e=e+4|0;t[61]=e;s[763]=0;a:while(1){t[61]=e+2;n=w(1)|0;e=t[61]|0;switch((E(n)|0)<<16>>16){case 91:case 123:{c=15;break a}default:{}}a=t[61]|0;if((a|0)==(e|0))break e;B(e,a);switch((w(1)|0)<<16>>16){case 61:{c=19;break a}case 44:break;default:{c=20;break a}}e=t[61]|0;}if((c|0)==15){t[61]=(t[61]|0)+-2;break}else if((c|0)==19){t[61]=(t[61]|0)+-2;break}else if((c|0)==20){t[61]=(t[61]|0)+-2;break}}else if((c|0)==34)a=w(1)|0;e=t[61]|0;if(a<<16>>16==102?(m(e+2|0,52,6)|0)==0:0){t[61]=e+8;u(f,w(1)|0);break}t[61]=e+-2;}}while(0);return}function l(){var e=0,a=0,r=0,c=0,f=0;f=t[61]|0;a=f+12|0;t[61]=a;e:do{switch((w(1)|0)<<16>>16){case 40:{e=t[61]|0;a=t[59]|0;r=i[379]|0;i[379]=r+1<<16>>16;t[a+((r&65535)<<2)>>2]=e;if((i[t[57]>>1]|0)!=46){e=t[61]|0;t[61]=e+2;r=w(1)|0;v(f,t[61]|0,0,e);e=t[51]|0;a=t[60]|0;f=i[378]|0;i[378]=f+1<<16>>16;t[a+((f&65535)<<2)>>2]=e;switch(r<<16>>16){case 39:{d(39);break}case 34:{d(34);break}default:{t[61]=(t[61]|0)+-2;break e}}e=(t[61]|0)+2|0;t[61]=e;switch((w(1)|0)<<16>>16){case 44:{t[61]=(t[61]|0)+2;w(1)|0;r=t[51]|0;t[r+4>>2]=e;f=t[61]|0;t[r+16>>2]=f;s[r+24>>0]=1;t[61]=f+-2;break e}case 41:{i[379]=(i[379]|0)+-1<<16>>16;f=t[51]|0;t[f+4>>2]=e;t[f+12>>2]=(t[61]|0)+2;s[f+24>>0]=1;i[378]=(i[378]|0)+-1<<16>>16;break e}default:{t[61]=(t[61]|0)+-2;break e}}}break}case 46:{t[61]=(t[61]|0)+2;if(((w(1)|0)<<16>>16==109?(e=t[61]|0,(m(e+2|0,44,6)|0)==0):0)?(i[t[57]>>1]|0)!=46:0)v(f,f,e+8|0,2);break}case 42:case 39:case 34:{c=16;break}case 123:{e=t[61]|0;if(i[379]|0){t[61]=e+-2;break e}while(1){if(e>>>0>=(t[62]|0)>>>0)break;e=w(1)|0;if(!(N(e)|0)){if(e<<16>>16==125){c=31;break}}else d(e);e=(t[61]|0)+2|0;t[61]=e;}if((c|0)==31)t[61]=(t[61]|0)+2;w(1)|0;e=t[61]|0;if(m(e,50,8)|0){L();break e}t[61]=e+8;e=w(1)|0;if(N(e)|0){u(f,e);break e}else {L();break e}}default:if((t[61]|0)!=(a|0))c=16;}}while(0);do{if((c|0)==16){if(i[379]|0){t[61]=(t[61]|0)+-2;break}e=t[62]|0;a=t[61]|0;while(1){if(a>>>0>=e>>>0){c=23;break}r=i[a>>1]|0;if(N(r)|0){c=21;break}c=a+2|0;t[61]=c;a=c;}if((c|0)==21){u(f,r);break}else if((c|0)==23){L();break}}}while(0);return}function u(e,a){e=e|0;a=a|0;var r=0,s=0;r=(t[61]|0)+2|0;switch(a<<16>>16){case 39:{d(39);s=5;break}case 34:{d(34);s=5;break}default:L();}do{if((s|0)==5){v(e,r,t[61]|0,1);t[61]=(t[61]|0)+2;s=(w(0)|0)<<16>>16==97;a=t[61]|0;if(s?(m(a+2|0,58,10)|0)==0:0){t[61]=a+12;if((w(1)|0)<<16>>16!=123){t[61]=a;break}e=t[61]|0;r=e;e:while(1){t[61]=r+2;r=w(1)|0;switch(r<<16>>16){case 39:{d(39);t[61]=(t[61]|0)+2;r=w(1)|0;break}case 34:{d(34);t[61]=(t[61]|0)+2;r=w(1)|0;break}default:r=E(r)|0;}if(r<<16>>16!=58){s=16;break}t[61]=(t[61]|0)+2;switch((w(1)|0)<<16>>16){case 39:{d(39);break}case 34:{d(34);break}default:{s=20;break e}}t[61]=(t[61]|0)+2;switch((w(1)|0)<<16>>16){case 125:{s=25;break e}case 44:break;default:{s=24;break e}}t[61]=(t[61]|0)+2;if((w(1)|0)<<16>>16==125){s=25;break}r=t[61]|0;}if((s|0)==16){t[61]=a;break}else if((s|0)==20){t[61]=a;break}else if((s|0)==24){t[61]=a;break}else if((s|0)==25){s=t[51]|0;t[s+16>>2]=e;t[s+12>>2]=(t[61]|0)+2;break}}t[61]=a+-2;}}while(0);return}function o(e){e=e|0;e:do{switch(i[e>>1]|0){case 100:switch(i[e+-2>>1]|0){case 105:{e=S(e+-4|0,68,2)|0;break e}case 108:{e=S(e+-4|0,72,3)|0;break e}default:{e=0;break e}}case 101:{switch(i[e+-2>>1]|0){case 115:break;case 116:{e=S(e+-4|0,78,4)|0;break e}default:{e=0;break e}}switch(i[e+-4>>1]|0){case 108:{e=O(e+-6|0,101)|0;break e}case 97:{e=O(e+-6|0,99)|0;break e}default:{e=0;break e}}}case 102:{if((i[e+-2>>1]|0)==111?(i[e+-4>>1]|0)==101:0)switch(i[e+-6>>1]|0){case 99:{e=S(e+-8|0,86,6)|0;break e}case 112:{e=S(e+-8|0,98,2)|0;break e}default:{e=0;break e}}else e=0;break}case 110:{e=e+-2|0;if(O(e,105)|0)e=1;else e=S(e,102,5)|0;break}case 111:{e=O(e+-2|0,100)|0;break}case 114:{e=S(e+-2|0,112,7)|0;break}case 116:{e=S(e+-2|0,126,4)|0;break}case 119:switch(i[e+-2>>1]|0){case 101:{e=O(e+-4|0,110)|0;break e}case 111:{e=S(e+-4|0,134,3)|0;break e}default:{e=0;break e}}default:e=0;}}while(0);return e|0}function h(){var e=0,a=0,r=0;a=t[62]|0;r=t[61]|0;e:while(1){e=r+2|0;if(r>>>0>=a>>>0){a=8;break}switch(i[e>>1]|0){case 96:{a=9;break e}case 36:{if((i[r+4>>1]|0)==123){a=6;break e}break}case 92:{e=r+4|0;break}default:{}}r=e;}if((a|0)==6){t[61]=r+4;e=i[380]|0;a=t[58]|0;r=i[377]|0;i[377]=r+1<<16>>16;i[a+((r&65535)<<1)>>1]=e;r=(i[379]|0)+1<<16>>16;i[379]=r;i[380]=r;}else if((a|0)==8){t[61]=e;L();}else if((a|0)==9)t[61]=e;return}function w(e){e=e|0;var a=0,r=0,s=0;r=t[61]|0;e:do{a=i[r>>1]|0;a:do{if(a<<16>>16!=47)if(e)if(M(a)|0)break;else break e;else if(z(a)|0)break;else break e;else switch(i[r+2>>1]|0){case 47:{j();break a}case 42:{y(e);break a}default:{a=47;break e}}}while(0);s=t[61]|0;r=s+2|0;t[61]=r;}while(s>>>0<(t[62]|0)>>>0);return a|0}function d(e){e=e|0;var a=0,r=0,s=0,c=0;c=t[62]|0;a=t[61]|0;while(1){s=a+2|0;if(a>>>0>=c>>>0){a=9;break}r=i[s>>1]|0;if(r<<16>>16==e<<16>>16){a=10;break}if(r<<16>>16==92){r=a+4|0;if((i[r>>1]|0)==13){a=a+6|0;a=(i[a>>1]|0)==10?a:r;}else a=r;}else if(T(r)|0){a=9;break}else a=s;}if((a|0)==9){t[61]=s;L();}else if((a|0)==10)t[61]=s;return}function v(e,a,r,i){e=e|0;a=a|0;r=r|0;i=i|0;var c=0,f=0;c=t[55]|0;t[55]=c+32;f=t[51]|0;t[((f|0)==0?188:f+28|0)>>2]=c;t[52]=f;t[51]=c;t[c+8>>2]=e;if(2==(i|0))e=r;else e=1==(i|0)?r+2|0:0;t[c+12>>2]=e;t[c>>2]=a;t[c+4>>2]=r;t[c+16>>2]=0;t[c+20>>2]=i;s[c+24>>0]=1==(i|0)&1;t[c+28>>2]=0;return}function A(){var e=0,a=0,r=0;r=t[62]|0;a=t[61]|0;e:while(1){e=a+2|0;if(a>>>0>=r>>>0){a=6;break}switch(i[e>>1]|0){case 13:case 10:{a=6;break e}case 93:{a=7;break e}case 92:{e=a+4|0;break}default:{}}a=e;}if((a|0)==6){t[61]=e;L();e=0;}else if((a|0)==7){t[61]=e;e=93;}return e|0}function C(e,a){e=e|0;a=a|0;var r=0,s=0;r=t[61]|0;s=i[r>>1]|0;if(s<<16>>16==97){t[61]=r+4;r=w(1)|0;e=t[61]|0;if(N(r)|0){d(r);a=(t[61]|0)+2|0;t[61]=a;}else {E(r)|0;a=t[61]|0;}s=w(1)|0;r=t[61]|0;}if((r|0)!=(e|0))B(e,a);return s|0}function g(){var e=0,a=0,r=0;e:while(1){e=t[61]|0;a=e+2|0;t[61]=a;if(e>>>0>=(t[62]|0)>>>0){r=7;break}switch(i[a>>1]|0){case 13:case 10:{r=7;break e}case 47:break e;case 91:{A()|0;break}case 92:{t[61]=e+4;break}default:{}}}if((r|0)==7)L();return}function p(e){e=e|0;switch(i[e>>1]|0){case 62:{e=(i[e+-2>>1]|0)==61;break}case 41:case 59:{e=1;break}case 104:{e=S(e+-2|0,160,4)|0;break}case 121:{e=S(e+-2|0,168,6)|0;break}case 101:{e=S(e+-2|0,180,3)|0;break}default:e=0;}return e|0}function y(e){e=e|0;var a=0,r=0,s=0,c=0,f=0;c=(t[61]|0)+2|0;t[61]=c;r=t[62]|0;while(1){a=c+2|0;if(c>>>0>=r>>>0)break;s=i[a>>1]|0;if(!e?T(s)|0:0)break;if(s<<16>>16==42?(i[c+4>>1]|0)==47:0){f=8;break}c=a;}if((f|0)==8){t[61]=a;a=c+4|0;}t[61]=a;return}function m(e,a,r){e=e|0;a=a|0;r=r|0;var i=0,t=0;e:do{if(!r)e=0;else {while(1){i=s[e>>0]|0;t=s[a>>0]|0;if(i<<24>>24!=t<<24>>24)break;r=r+-1|0;if(!r){e=0;break e}else {e=e+1|0;a=a+1|0;}}e=(i&255)-(t&255)|0;}}while(0);return e|0}function I(e){e=e|0;e:do{switch(e<<16>>16){case 38:case 37:case 33:{e=1;break}default:if((e&-8)<<16>>16==40|(e+-58&65535)<6)e=1;else {switch(e<<16>>16){case 91:case 93:case 94:{e=1;break e}default:{}}e=(e+-123&65535)<4;}}}while(0);return e|0}function U(e){e=e|0;e:do{switch(e<<16>>16){case 38:case 37:case 33:break;default:if(!((e+-58&65535)<6|(e+-40&65535)<7&e<<16>>16!=41)){switch(e<<16>>16){case 91:case 94:break e;default:{}}return e<<16>>16!=125&(e+-123&65535)<4|0}}}while(0);return 1}function x(e){e=e|0;var a=0,r=0,s=0,c=0;r=n;n=n+16|0;s=r;t[s>>2]=0;t[54]=e;a=t[3]|0;c=a+(e<<1)|0;e=c+2|0;i[c>>1]=0;t[s>>2]=e;t[55]=e;t[47]=0;t[51]=0;t[49]=0;t[48]=0;t[53]=0;t[50]=0;n=r;return a|0}function S(e,a,r){e=e|0;a=a|0;r=r|0;var s=0,c=0;s=e+(0-r<<1)|0;c=s+2|0;e=t[3]|0;if(c>>>0>=e>>>0?(m(c,a,r<<1)|0)==0:0)if((c|0)==(e|0))e=1;else e=$(i[s>>1]|0)|0;else e=0;return e|0}function O(e,a){e=e|0;a=a|0;var r=0;r=t[3]|0;if(r>>>0<=e>>>0?(i[e>>1]|0)==a<<16>>16:0)if((r|0)==(e|0))r=1;else r=$(i[e+-2>>1]|0)|0;else r=0;return r|0}function $(e){e=e|0;e:do{if((e+-9&65535)<5)e=1;else {switch(e<<16>>16){case 32:case 160:{e=1;break e}default:{}}e=e<<16>>16!=46&(I(e)|0);}}while(0);return e|0}function j(){var e=0,a=0,r=0;e=t[62]|0;r=t[61]|0;e:while(1){a=r+2|0;if(r>>>0>=e>>>0)break;switch(i[a>>1]|0){case 13:case 10:break e;default:r=a;}}t[61]=a;return}function B(e,a){e=e|0;a=a|0;var r=0,s=0;r=t[55]|0;t[55]=r+12;s=t[53]|0;t[((s|0)==0?192:s+8|0)>>2]=r;t[53]=r;t[r>>2]=e;t[r+4>>2]=a;t[r+8>>2]=0;return}function E(e){e=e|0;while(1){if(M(e)|0)break;if(I(e)|0)break;e=(t[61]|0)+2|0;t[61]=e;e=i[e>>1]|0;if(!(e<<16>>16)){e=0;break}}return e|0}function P(){var e=0;e=t[(t[49]|0)+20>>2]|0;switch(e|0){case 1:{e=-1;break}case 2:{e=-2;break}default:e=e-(t[3]|0)>>1;}return e|0}function q(e){e=e|0;if(!(S(e,140,5)|0)?!(S(e,150,3)|0):0)e=S(e,156,2)|0;else e=1;return e|0}function z(e){e=e|0;switch(e<<16>>16){case 160:case 32:case 12:case 11:case 9:{e=1;break}default:e=0;}return e|0}function D(e){e=e|0;if((t[3]|0)==(e|0))e=1;else e=$(i[e+-2>>1]|0)|0;return e|0}function F(){var e=0;e=t[(t[49]|0)+12>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function G(){var e=0;e=t[(t[49]|0)+16>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function H(){var e=0;e=t[(t[49]|0)+4>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function J(){var e=0;e=t[49]|0;e=t[((e|0)==0?188:e+28|0)>>2]|0;t[49]=e;return (e|0)!=0|0}function K(){var e=0;e=t[50]|0;e=t[((e|0)==0?192:e+8|0)>>2]|0;t[50]=e;return (e|0)!=0|0}function L(){s[762]=1;t[56]=(t[61]|0)-(t[3]|0)>>1;t[61]=(t[62]|0)+2;return}function M(e){e=e|0;return (e|128)<<16>>16==160|(e+-9&65535)<5|0}function N(e){e=e|0;return e<<16>>16==39|e<<16>>16==34|0}function Q(){return (t[(t[49]|0)+8>>2]|0)-(t[3]|0)>>1|0}function R(){return (t[(t[50]|0)+4>>2]|0)-(t[3]|0)>>1|0}function T(e){e=e|0;return e<<16>>16==13|e<<16>>16==10|0}function V(){return (t[t[49]>>2]|0)-(t[3]|0)>>1|0}function W(){return (t[t[50]>>2]|0)-(t[3]|0)>>1|0}function X(){return c[(t[49]|0)+24>>0]|0|0}function Y(e){e=e|0;t[3]=e;return}function Z(){return (s[763]|0)!=0|0}function _(){return t[56]|0}function ee(e){e=e|0;n=e+992+15&-16;return 992}return {su:ee,ai:G,e:_,ee:R,es:W,f:Z,id:P,ie:H,ip:X,is:V,p:b,re:K,ri:J,sa:x,se:F,ses:Y,ss:Q}}(\"undefined\"!=typeof self?self:global,{},a),r=e.su(s-(2<<17));}const h=c$1.length+1;e.ses(r),e.sa(h-1),i(c$1,new Uint16Array(a,r,h)),e.p()||(n=e.e(),o());const w=[],d=[];for(;e.ri();){const a=e.is(),r=e.ie(),s=e.ai(),i=e.id(),t=e.ss(),f=e.se();let n;e.ip()&&(n=b(-1===i?a:a+1,c$1.charCodeAt(-1===i?a-1:a))),w.push({n:n,s:a,e:r,ss:t,se:f,d:i,a:s});}for(;e.re();){const a=e.es(),r=c$1.charCodeAt(a);d.push(34===r||39===r?b(a+1,r):c$1.slice(e.es(),e.ee()));}return [w,d,!!e.f()]}function b(e,a){n=e;let r=\"\",s=n;for(;;){n>=c$1.length&&o();const e=c$1.charCodeAt(n);if(e===a)break;92===e?(r+=c$1.slice(s,n),r+=k(),s=n):(8232===e||8233===e||u(e)&&o(),++n);}return r+=c$1.slice(s,n++),r}function k(){let e=c$1.charCodeAt(++n);switch(++n,e){case 110:return \"\\n\";case 114:return \"\\r\";case 120:return String.fromCharCode(l(2));case 117:return function(){let e;123===c$1.charCodeAt(n)?(++n,e=l(c$1.indexOf(\"}\",n)-n),++n,e>1114111&&o()):e=l(4);return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}();case 116:return \"\\t\";case 98:return \"\\b\";case 118:return \"\\v\";case 102:return \"\\f\";case 13:10===c$1.charCodeAt(n)&&++n;case 10:return \"\";case 56:case 57:o();default:if(e>=48&&e<=55){let a=c$1.substr(n-1,3).match(/^[0-7]+/)[0],r=parseInt(a,8);return r>255&&(a=a.slice(0,-1),r=parseInt(a,8)),n+=a.length-1,e=c$1.charCodeAt(n),\"0\"===a&&56!==e&&57!==e||o(),String.fromCharCode(r)}return u(e)?\"\":String.fromCharCode(e)}}function l(e){const a=n;let r=0,s=0;for(let a=0;a<e;++a,++n){let e,i=c$1.charCodeAt(n);if(95!==i){if(i>=97)e=i-97+10;else if(i>=65)e=i-65+10;else {if(!(i>=48&&i<=57))break;e=i-48;}if(e>=16)break;s=i,r=16*r+e;}else 95!==s&&0!==a||o(),s=i;}return 95!==s&&n-a===e||o(),r}function u(e){return 13===e||10===e}function o(){throw Object.assign(Error(`Parse error ${f}:${c$1.slice(0,n).split(\"\\n\").length}:${n-c$1.lastIndexOf(\"\\n\",n-1)}`),{idx:n})}\n\n  async function _resolve (id, parentUrl) {\r\n    const urlResolved = resolveIfNotPlainOrUrl(id, parentUrl);\r\n    return {\r\n      r: resolveImportMap(importMap, urlResolved || id, parentUrl) || throwUnresolved(id, parentUrl),\r\n      // b = bare specifier\r\n      b: !urlResolved && !isURL(id)\r\n    };\r\n  }\r\n\r\n  const resolve = resolveHook ? async (id, parentUrl) => {\r\n    let result = resolveHook(id, parentUrl, defaultResolve);\r\n    // will be deprecated in next major\r\n    if (result && result.then)\r\n      result = await result;\r\n    return result ? { r: result, b: !resolveIfNotPlainOrUrl(id, parentUrl) && !isURL(id) } : _resolve(id, parentUrl);\r\n  } : _resolve;\r\n\r\n  // importShim('mod');\r\n  // importShim('mod', { opts });\r\n  // importShim('mod', { opts }, parentUrl);\r\n  // importShim('mod', parentUrl);\r\n  async function importShim (id, ...args) {\r\n    // parentUrl if present will be the last argument\r\n    let parentUrl = args[args.length - 1];\r\n    if (typeof parentUrl !== 'string')\r\n      parentUrl = baseUrl;\r\n    // needed for shim check\r\n    await initPromise;\r\n    if (importHook) await importHook(id, typeof args[1] !== 'string' ? args[1] : {}, parentUrl);\r\n    if (acceptingImportMaps || shimMode || !baselinePassthrough) {\r\n      processImportMaps();\r\n      if (!shimMode)\r\n        acceptingImportMaps = false;\r\n    }\r\n    await importMapPromise;\r\n    return topLevelLoad((await resolve(id, parentUrl)).r, { credentials: 'same-origin' });\r\n  }\r\n\r\n  self.importShim = importShim;\r\n\r\n  function defaultResolve (id, parentUrl) {\r\n    return resolveImportMap(importMap, resolveIfNotPlainOrUrl(id, parentUrl) || id, parentUrl) || throwUnresolved(id, parentUrl);\r\n  }\r\n\r\n  function throwUnresolved (id, parentUrl) {\r\n    throw Error(`Unable to resolve specifier '${id}'${fromParent(parentUrl)}`);\r\n  }\r\n\r\n  const resolveSync = (id, parentUrl = baseUrl) => {\r\n    parentUrl = `${parentUrl}`;\r\n    const result = resolveHook && resolveHook(id, parentUrl, defaultResolve);\r\n    return result && !result.then ? result : defaultResolve(id, parentUrl);\r\n  };\r\n\r\n  function metaResolve (id, parentUrl = this.url) {\r\n    return resolveSync(id, parentUrl);\r\n  }\r\n\r\n  importShim.resolve = resolveSync;\r\n  importShim.getImportMap = () => JSON.parse(JSON.stringify(importMap));\r\n\r\n  const registry = importShim._r = {};\r\n\r\n  async function loadAll (load, seen) {\r\n    if (load.b || seen[load.u])\r\n      return;\r\n    seen[load.u] = 1;\r\n    await load.L;\r\n    await Promise.all(load.d.map(dep => loadAll(dep, seen)));\r\n    if (!load.n)\r\n      load.n = load.d.some(dep => dep.n);\r\n  }\r\n\r\n  let importMap = { imports: {}, scopes: {} };\r\n  let importMapSrcOrLazy = false;\r\n  let baselinePassthrough;\r\n\r\n  const initPromise = featureDetectionPromise.then(() => {\r\n    // shim mode is determined on initialization, no late shim mode\r\n    if (!shimMode) {\r\n      if (document.querySelectorAll('script[type=module-shim],script[type=importmap-shim],link[rel=modulepreload-shim]').length) {\r\n        setShimMode();\r\n      }\r\n      else {\r\n        let seenScript = false;\r\n        for (const script of document.querySelectorAll('script[type=module],script[type=importmap]')) {\r\n          if (!seenScript) {\r\n            if (script.type === 'module')\r\n              seenScript = true;\r\n          }\r\n          else if (script.type === 'importmap') {\r\n            importMapSrcOrLazy = true;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    baselinePassthrough = esmsInitOptions.polyfillEnable !== true && supportsDynamicImport && supportsImportMeta && supportsImportMaps && (!jsonModulesEnabled || supportsJsonAssertions) && (!cssModulesEnabled || supportsCssAssertions) && !importMapSrcOrLazy && !false;\r\n    if (!supportsImportMaps) {\r\n      const supports = HTMLScriptElement.supports || (type => type === 'classic' || type === 'module');\r\n      HTMLScriptElement.supports = type => type === 'importmap' || supports(type);\r\n    }\r\n    if (shimMode || !baselinePassthrough) {\r\n      new MutationObserver(mutations => {\r\n        for (const mutation of mutations) {\r\n          if (mutation.type !== 'childList') continue;\r\n          for (const node of mutation.addedNodes) {\r\n            if (node.tagName === 'SCRIPT') {\r\n              if (node.type === (shimMode ? 'module-shim' : 'module'))\r\n                processScript(node);\r\n              if (node.type === (shimMode ? 'importmap-shim' : 'importmap'))\r\n                processImportMap(node);\r\n            }\r\n            else if (node.tagName === 'LINK' && node.rel === (shimMode ? 'modulepreload-shim' : 'modulepreload'))\r\n              processPreload(node);\r\n          }\r\n        }\r\n      }).observe(document, { childList: true, subtree: true });\r\n      processImportMaps();\r\n      processScriptsAndPreloads();\r\n      if (document.readyState === 'complete') {\r\n        readyStateCompleteCheck();\r\n      }\r\n      else {\r\n        async function readyListener () {\r\n          await initPromise;\r\n          processImportMaps();\r\n          if (document.readyState === 'complete') {\r\n            readyStateCompleteCheck();\r\n            document.removeEventListener('readystatechange', readyListener);\r\n          }\r\n        }\r\n        document.addEventListener('readystatechange', readyListener);\r\n      }\r\n      return undefined;\r\n    }\r\n  });\r\n  let importMapPromise = initPromise;\r\n  let firstPolyfillLoad = true;\r\n  let acceptingImportMaps = true;\r\n\r\n  async function topLevelLoad (url, fetchOpts, source, nativelyLoaded, lastStaticLoadPromise) {\r\n    if (!shimMode)\r\n      acceptingImportMaps = false;\r\n    await importMapPromise;\r\n    if (importHook) await importHook(id, typeof args[1] !== 'string' ? args[1] : {}, parentUrl);\r\n    // early analysis opt-out - no need to even fetch if we have feature support\r\n    if (!shimMode && baselinePassthrough) {\r\n      // for polyfill case, only dynamic import needs a return value here, and dynamic import will never pass nativelyLoaded\r\n      if (nativelyLoaded)\r\n        return null;\r\n      await lastStaticLoadPromise;\r\n      return dynamicImport(source ? createBlob(source) : url, { errUrl: url || source });\r\n    }\r\n    const load = getOrCreateLoad(url, fetchOpts, null, source);\r\n    const seen = {};\r\n    await loadAll(load, seen);\r\n    lastLoad = undefined;\r\n    resolveDeps(load, seen);\r\n    await lastStaticLoadPromise;\r\n    if (source && !shimMode && !load.n && !false) {\r\n      const module = await dynamicImport(createBlob(source), { errUrl: source });\r\n      if (revokeBlobURLs) revokeObjectURLs(Object.keys(seen));\r\n      return module;\r\n    }\r\n    if (firstPolyfillLoad && !shimMode && load.n && nativelyLoaded) {\r\n      onpolyfill();\r\n      firstPolyfillLoad = false;\r\n    }\r\n    const module = await dynamicImport(!shimMode && !load.n && nativelyLoaded ? load.u : load.b, { errUrl: load.u });\r\n    // if the top-level load is a shell, run its update function\r\n    if (load.s)\r\n      (await dynamicImport(load.s)).u$_(module);\r\n    if (revokeBlobURLs) revokeObjectURLs(Object.keys(seen));\r\n    // when tla is supported, this should return the tla promise as an actual handle\r\n    // so readystate can still correspond to the sync subgraph exec completions\r\n    return module;\r\n  }\r\n\r\n  function revokeObjectURLs(registryKeys) {\r\n    let batch = 0;\r\n    const keysLength = registryKeys.length;\r\n    const schedule = self.requestIdleCallback ? self.requestIdleCallback : self.requestAnimationFrame;\r\n    schedule(cleanup);\r\n    function cleanup() {\r\n      const batchStartIndex = batch * 100;\r\n      if (batchStartIndex > keysLength) return\r\n      for (const key of registryKeys.slice(batchStartIndex, batchStartIndex + 100)) {\r\n        const load = registry[key];\r\n        if (load) URL.revokeObjectURL(load.b);\r\n      }\r\n      batch++;\r\n      schedule(cleanup);\r\n    }\r\n  }\r\n\r\n  function urlJsString (url) {\r\n    return `'${url.replace(/'/g, \"\\\\'\")}'`;\r\n  }\r\n\r\n  let lastLoad;\r\n  function resolveDeps (load, seen) {\r\n    if (load.b || !seen[load.u])\r\n      return;\r\n    seen[load.u] = 0;\r\n\r\n    for (const dep of load.d)\r\n      resolveDeps(dep, seen);\r\n\r\n    const [imports] = load.a;\r\n\r\n    // \"execution\"\r\n    const source = load.S;\r\n\r\n    // edge doesnt execute sibling in order, so we fix this up by ensuring all previous executions are explicit dependencies\r\n    let resolvedSource = edge && lastLoad ? `import '${lastLoad}';` : '';  \r\n\r\n    if (!imports.length) {\r\n      resolvedSource += source;\r\n    }\r\n    else {\r\n      // once all deps have loaded we can inline the dependency resolution blobs\r\n      // and define this blob\r\n      let lastIndex = 0, depIndex = 0, dynamicImportEndStack = [];\r\n      function pushStringTo (originalIndex) {\r\n        while (dynamicImportEndStack[dynamicImportEndStack.length - 1] < originalIndex) {\r\n          const dynamicImportEnd = dynamicImportEndStack.pop();\r\n          resolvedSource += `${source.slice(lastIndex, dynamicImportEnd)}, ${urlJsString(load.r)}`;\r\n          lastIndex = dynamicImportEnd;\r\n        }\r\n        resolvedSource += source.slice(lastIndex, originalIndex);\r\n        lastIndex = originalIndex;\r\n      }\r\n      for (const { s: start, ss: statementStart, se: statementEnd, d: dynamicImportIndex } of imports) {\r\n        // dependency source replacements\r\n        if (dynamicImportIndex === -1) {\r\n          let depLoad = load.d[depIndex++], blobUrl = depLoad.b, cycleShell = !blobUrl;\r\n          if (cycleShell) {\r\n            // circular shell creation\r\n            if (!(blobUrl = depLoad.s)) {\r\n              blobUrl = depLoad.s = createBlob(`export function u$_(m){${\r\n              depLoad.a[1].map(\r\n                name => name === 'default' ? `d$_=m.default` : `${name}=m.${name}`\r\n              ).join(',')\r\n            }}${\r\n              depLoad.a[1].map(name =>\r\n                name === 'default' ? `let d$_;export{d$_ as default}` : `export let ${name}`\r\n              ).join(';')\r\n            }\\n//# sourceURL=${depLoad.r}?cycle`);\r\n            }\r\n          }\r\n\r\n          pushStringTo(start - 1);\r\n          resolvedSource += `/*${source.slice(start - 1, statementEnd)}*/${urlJsString(blobUrl)}`;\r\n\r\n          // circular shell execution\r\n          if (!cycleShell && depLoad.s) {          \r\n            resolvedSource += `;import*as m$_${depIndex} from'${depLoad.b}';import{u$_ as u$_${depIndex}}from'${depLoad.s}';u$_${depIndex}(m$_${depIndex})`;\r\n            depLoad.s = undefined;\r\n          }\r\n          lastIndex = statementEnd;\r\n        }\r\n        // import.meta\r\n        else if (dynamicImportIndex === -2) {\r\n          load.m = { url: load.r, resolve: metaResolve };\r\n          metaHook(load.m, load.u);\r\n          pushStringTo(start);\r\n          resolvedSource += `importShim._r[${urlJsString(load.u)}].m`;\r\n          lastIndex = statementEnd;\r\n        }\r\n        // dynamic import\r\n        else {\r\n          pushStringTo(statementStart + 6);\r\n          resolvedSource += `Shim(`;\r\n          dynamicImportEndStack.push(statementEnd - 1);\r\n          lastIndex = start;\r\n        }\r\n      }\r\n\r\n      pushStringTo(source.length);\r\n    }\r\n\r\n    let hasSourceURL = false;\r\n    resolvedSource = resolvedSource.replace(sourceMapURLRegEx, (match, isMapping, url) => (hasSourceURL = !isMapping, match.replace(url, () => new URL(url, load.r))));\r\n    if (!hasSourceURL)\r\n      resolvedSource += '\\n//# sourceURL=' + load.r;\r\n\r\n    load.b = lastLoad = createBlob(resolvedSource);\r\n    load.S = undefined;\r\n  }\r\n\r\n  // ; and // trailer support added for Ruby on Rails 7 source maps compatibility\r\n  // https://github.com/guybedford/es-module-shims/issues/228\r\n  const sourceMapURLRegEx = /\\n\\/\\/# source(Mapping)?URL=([^\\n]+)\\s*((;|\\/\\/[^#][^\\n]*)\\s*)*$/;\r\n\r\n  const jsContentType = /^(text|application)\\/(x-)?javascript(;|$)/;\r\n  const jsonContentType = /^(text|application)\\/json(;|$)/;\r\n  const cssContentType = /^(text|application)\\/css(;|$)/;\r\n\r\n  const cssUrlRegEx = /url\\(\\s*(?:([\"'])((?:\\\\.|[^\\n\\\\\"'])+)\\1|((?:\\\\.|[^\\s,\"'()\\\\])+))\\s*\\)/g;\r\n\r\n  // restrict in-flight fetches to a pool of 100\r\n  let p = [];\r\n  let c = 0;\r\n  function pushFetchPool () {\r\n    if (++c > 100)\r\n      return new Promise(r => p.push(r));\r\n  }\r\n  function popFetchPool () {\r\n    c--;\r\n    if (p.length)\r\n      p.shift()();\r\n  }\r\n\r\n  async function doFetch (url, fetchOpts, parent) {\r\n    if (enforceIntegrity && !fetchOpts.integrity)\r\n      throw Error(`No integrity for ${url}${fromParent(parent)}.`);\r\n    const poolQueue = pushFetchPool();\r\n    if (poolQueue) await poolQueue;\r\n    try {\r\n      var res = await fetchHook(url, fetchOpts);\r\n    }\r\n    catch (e) {\r\n      e.message = `Unable to fetch ${url}${fromParent(parent)} - see network log for details.\\n` + e.message;\r\n      throw e;\r\n    }\r\n    finally {\r\n      popFetchPool();\r\n    }\r\n    if (!res.ok)\r\n      throw Error(`${res.status} ${res.statusText} ${res.url}${fromParent(parent)}`);\r\n    return res;\r\n  }\r\n\r\n  async function fetchModule (url, fetchOpts, parent) {\r\n    const res = await doFetch(url, fetchOpts, parent);\r\n    const contentType = res.headers.get('content-type');\r\n    if (jsContentType.test(contentType))\r\n      return { r: res.url, s: await res.text(), t: 'js' };\r\n    else if (jsonContentType.test(contentType))\r\n      return { r: res.url, s: `export default ${await res.text()}`, t: 'json' };\r\n    else if (cssContentType.test(contentType)) {\r\n      return { r: res.url, s: `var s=new CSSStyleSheet();s.replaceSync(${\r\n      JSON.stringify((await res.text()).replace(cssUrlRegEx, (_match, quotes = '', relUrl1, relUrl2) => `url(${quotes}${resolveUrl(relUrl1 || relUrl2, url)}${quotes})`))\r\n    });export default s;`, t: 'css' };\r\n    }\r\n    else\r\n      throw Error(`Unsupported Content-Type \"${contentType}\" loading ${url}${fromParent(parent)}. Modules must be served with a valid MIME type like application/javascript.`);\r\n  }\r\n\r\n  function getOrCreateLoad (url, fetchOpts, parent, source) {\r\n    let load = registry[url];\r\n    if (load && !source)\r\n      return load;\r\n\r\n    load = {\r\n      // url\r\n      u: url,\r\n      // response url\r\n      r: source ? url : undefined,\r\n      // fetchPromise\r\n      f: undefined,\r\n      // source\r\n      S: undefined,\r\n      // linkPromise\r\n      L: undefined,\r\n      // analysis\r\n      a: undefined,\r\n      // deps\r\n      d: undefined,\r\n      // blobUrl\r\n      b: undefined,\r\n      // shellUrl\r\n      s: undefined,\r\n      // needsShim\r\n      n: false,\r\n      // type\r\n      t: null,\r\n      // meta\r\n      m: null\r\n    };\r\n    if (registry[url]) {\r\n      let i = 0;\r\n      while (registry[load.u + ++i]);\r\n      load.u += i;\r\n    }\r\n    registry[load.u] = load;\r\n\r\n    load.f = (async () => {\r\n      if (!source) {\r\n        // preload fetch options override fetch options (race)\r\n        let t;\r\n        ({ r: load.r, s: source, t } = await (fetchCache[url] || fetchModule(url, fetchOpts, parent)));\r\n        if (t && !shimMode) {\r\n          if (t === 'css' && !cssModulesEnabled || t === 'json' && !jsonModulesEnabled)\r\n            throw Error(`${t}-modules require <script type=\"esms-options\">{ \"polyfillEnable\": [\"${t}-modules\"] }<${''}/script>`);\r\n          if (t === 'css' && !supportsCssAssertions || t === 'json' && !supportsJsonAssertions)\r\n            load.n = true;\r\n        }\r\n      }\r\n      try {\r\n        load.a = parse(source, load.u);\r\n      }\r\n      catch (e) {\r\n        throwError(e);\r\n        load.a = [[], [], false];\r\n      }\r\n      load.S = source;\r\n      return load;\r\n    })();\r\n\r\n    load.L = load.f.then(async () => {\r\n      let childFetchOpts = fetchOpts;\r\n      load.d = (await Promise.all(load.a[0].map(async ({ n, d }) => {\r\n        if (d >= 0 && !supportsDynamicImport || d === 2 && !supportsImportMeta)\r\n          load.n = true;\r\n        if (d !== -1 || !n) return;\r\n        const { r, b } = await resolve(n, load.r || load.u);\r\n        if (b && (!supportsImportMaps || importMapSrcOrLazy))\r\n          load.n = true;\r\n        if (skip && skip.test(r)) return { b: r };\r\n        if (childFetchOpts.integrity)\r\n          childFetchOpts = Object.assign({}, childFetchOpts, { integrity: undefined });\r\n        return getOrCreateLoad(r, childFetchOpts, load.r).f;\r\n      }))).filter(l => l);\r\n    });\r\n\r\n    return load;\r\n  }\r\n\r\n  function processScriptsAndPreloads () {\r\n    for (const script of document.querySelectorAll(shimMode ? 'script[type=module-shim]' : 'script[type=module]'))\r\n      processScript(script);\r\n    for (const link of document.querySelectorAll(shimMode ? 'link[rel=modulepreload-shim]' : 'link[rel=modulepreload]'))\r\n      processPreload(link);\r\n  }\r\n\r\n  function processImportMaps () {\r\n    for (const script of document.querySelectorAll(shimMode ? 'script[type=\"importmap-shim\"]' : 'script[type=\"importmap\"]'))\r\n      processImportMap(script);\r\n  }\r\n\r\n  function getFetchOpts (script) {\r\n    const fetchOpts = {};\r\n    if (script.integrity)\r\n      fetchOpts.integrity = script.integrity;\r\n    if (script.referrerpolicy)\r\n      fetchOpts.referrerPolicy = script.referrerpolicy;\r\n    if (script.crossorigin === 'use-credentials')\r\n      fetchOpts.credentials = 'include';\r\n    else if (script.crossorigin === 'anonymous')\r\n      fetchOpts.credentials = 'omit';\r\n    else\r\n      fetchOpts.credentials = 'same-origin';\r\n    return fetchOpts;\r\n  }\r\n\r\n  let lastStaticLoadPromise = Promise.resolve();\r\n\r\n  let domContentLoadedCnt = 1;\r\n  function domContentLoadedCheck () {\r\n    if (--domContentLoadedCnt === 0 && !noLoadEventRetriggers)\r\n      document.dispatchEvent(new Event('DOMContentLoaded'));\r\n  }\r\n  // this should always trigger because we assume es-module-shims is itself a domcontentloaded requirement\r\n  document.addEventListener('DOMContentLoaded', async () => {\r\n    await initPromise;\r\n    domContentLoadedCheck();\r\n    if (shimMode || !baselinePassthrough) {\r\n      processImportMaps();\r\n      processScriptsAndPreloads();\r\n    }\r\n  });\r\n\r\n  let readyStateCompleteCnt = 1;\r\n  function readyStateCompleteCheck () {\r\n    if (--readyStateCompleteCnt === 0 && !noLoadEventRetriggers)\r\n      document.dispatchEvent(new Event('readystatechange'));\r\n  }\r\n\r\n  function processImportMap (script) {\r\n    if (script.ep) // ep marker = script processed\r\n      return;\r\n    // empty inline scripts sometimes show before domready\r\n    if (!script.src && !script.innerHTML)\r\n      return;\r\n    script.ep = true;\r\n    // we dont currently support multiple, external or dynamic imports maps in polyfill mode to match native\r\n    if (script.src) {\r\n      if (!shimMode)\r\n        return;\r\n      importMapSrcOrLazy = true;\r\n    }\r\n    if (acceptingImportMaps) {\r\n      importMapPromise = importMapPromise\r\n        .then(async () => {\r\n          importMap = resolveAndComposeImportMap(script.src ? await (await doFetch(script.src, getFetchOpts(script))).json() : JSON.parse(script.innerHTML), script.src || baseUrl, importMap);\r\n        })\r\n        .catch(throwError);\r\n      if (!shimMode)\r\n        acceptingImportMaps = false;\r\n    }\r\n  }\r\n\r\n  function processScript (script) {\r\n    if (script.ep) // ep marker = script processed\r\n      return;\r\n    if (script.getAttribute('noshim') !== null)\r\n      return;\r\n    // empty inline scripts sometimes show before domready\r\n    if (!script.src && !script.innerHTML)\r\n      return;\r\n    script.ep = true;\r\n    // does this load block readystate complete\r\n    const isBlockingReadyScript = script.getAttribute('async') === null && readyStateCompleteCnt > 0;\r\n    // does this load block DOMContentLoaded\r\n    const isDomContentLoadedScript = domContentLoadedCnt > 0;\r\n    if (isBlockingReadyScript) readyStateCompleteCnt++;\r\n    if (isDomContentLoadedScript) domContentLoadedCnt++;\r\n    const loadPromise = topLevelLoad(script.src || baseUrl, getFetchOpts(script), !script.src && script.innerHTML, !shimMode, isBlockingReadyScript && lastStaticLoadPromise).catch(throwError);\r\n    if (isBlockingReadyScript)\r\n      lastStaticLoadPromise = loadPromise.then(readyStateCompleteCheck);\r\n    if (isDomContentLoadedScript)\r\n      loadPromise.then(domContentLoadedCheck);\r\n  }\r\n\r\n  const fetchCache = {};\r\n  function processPreload (link) {\r\n    if (link.ep) // ep marker = processed\r\n      return;\r\n    link.ep = true;\r\n    if (fetchCache[link.href])\r\n      return;\r\n    fetchCache[link.href] = fetchModule(link.href, getFetchOpts(link));\r\n  }\n\n})();\n"],"names":["noop","optionsScript","document","querySelector","esmsInitOptions","JSON","parse","innerHTML","Object","assign","self","shimMode","importHook","globalHook","onimport","resolveHook","resolve","fetchHook","fetch","metaHook","meta","shimModule","skip","RegExp","nonce","mapOverrides","nonceElement","getAttribute","onerror","onpolyfill","console","log","revokeBlobURLs","noLoadEventRetriggers","enforceIntegrity","name","enable","Array","isArray","polyfillEnable","cssModulesEnabled","includes","jsonModulesEnabled","setShimMode","edge","navigator","userAgentData","userAgent","match","baseUrl","baseURI","createBlob","source","type","URL","createObjectURL","Blob","eoop","err","setTimeout","throwError","window","reportError","safari","error","fromParent","parent","backslashRegEx","isURL","url","indexOf","_","resolveUrl","relUrl","parentUrl","resolveIfNotPlainOrUrl","queryHashIndex","length","slice","replace","parentProtocol","pathname","segmented","lastIndexOf","output","segmentIndex","i","pop","push","join","resolveAndComposeImportMap","json","parentMap","outMap","imports","scopes","resolveAndComposePackages","s","resolvedScope","getMatch","path","matchObj","sepIndex","segment","applyPackages","id","packages","pkgName","pkg","resolveImportMap","importMap","resolvedOrPlain","scopeUrl","packageResolution","outPackages","p","resolvedLhs","Error","target","mapped","warn","addEventListener","_err","dynamicImportScript","errUrl","undefined","src","createElement","setAttribute","Promise","reject","cb","head","removeChild","_esmsi","Event","appendChild","dynamicImport","supportsDynamicImportCheck","then","_dynamicImport","default","supportsJsonAssertions","supportsCssAssertions","supportsImportMeta","supportsImportMaps","supportsDynamicImport","featureDetectionPromise","_supportsDynamicImport","all","HTMLScriptElement","supports","_$s","v","iframe","style","display","srcdoc","e","a","r","Uint8Array","Uint16Array","buffer","charCodeAt","t","c$1","f","n","k","l","u","ArrayBuffer","Int8Array","Int16Array","Int32Array","c","b","w","D","m","j","y","M","h","d","U","q","o","g","L","I","B","$","E","N","C","S","O","z","T","A","x","P","F","G","H","J","K","Q","R","V","W","X","Y","Z","ee","su","ai","es","ie","ip","is","re","ri","sa","se","ses","ss","global","String","fromCharCode","substr","parseInt","split","idx","async","_resolve","urlResolved","throwUnresolved","result","defaultResolve","importShim","args","initPromise","acceptingImportMaps","baselinePassthrough","processImportMaps","importMapPromise","topLevelLoad","credentials","resolveSync","metaResolve","this","getImportMap","stringify","registry","_r","loadAll","load","seen","map","dep","some","importMapSrcOrLazy","querySelectorAll","seenScript","script","MutationObserver","mutations","mutation","node","addedNodes","tagName","processScript","processImportMap","rel","processPreload","observe","childList","subtree","processScriptsAndPreloads","readyState","readyStateCompleteCheck","readyListener","removeEventListener","firstPolyfillLoad","fetchOpts","nativelyLoaded","lastStaticLoadPromise","getOrCreateLoad","lastLoad","resolveDeps","module","revokeObjectURLs","keys","u$_","registryKeys","batch","keysLength","schedule","requestIdleCallback","requestAnimationFrame","cleanup","batchStartIndex","key","revokeObjectURL","urlJsString","resolvedSource","lastIndex","depIndex","dynamicImportEndStack","pushStringTo","originalIndex","dynamicImportEnd","start","statementStart","statementEnd","dynamicImportIndex","depLoad","blobUrl","cycleShell","hasSourceURL","sourceMapURLRegEx","isMapping","jsContentType","jsonContentType","cssContentType","cssUrlRegEx","pushFetchPool","popFetchPool","shift","doFetch","integrity","poolQueue","res","message","ok","status","statusText","fetchModule","contentType","headers","get","test","text","_match","quotes","relUrl1","relUrl2","fetchCache","childFetchOpts","filter","link","getFetchOpts","referrerpolicy","referrerPolicy","crossorigin","domContentLoadedCnt","domContentLoadedCheck","dispatchEvent","readyStateCompleteCnt","ep","catch","isBlockingReadyScript","isDomContentLoadedScript","loadPromise","href"],"mappings":"CACA,WAEE,MAAMA,KAAO,OAEb,MAAMC,EAAgBC,SAASC,cAAc,6BAE7C,MAAMC,EAAkBH,EAAgBI,KAAKC,MAAML,EAAcM,WAAa,GAC9EC,OAAOC,OAAOL,EAAiBM,KAAKN,iBAAmB,IAEvD,IAAIO,IAAaP,EAAgBO,SAEjC,MAAMC,EAAaC,WAAWF,GAAYP,EAAgBU,UAC1D,MAAMC,EAAcF,WAAWF,GAAYP,EAAgBY,SAC3D,IAAIC,EAAYb,EAAgBc,MAAQL,WAAWT,EAAgBc,OAASA,MAC5E,MAAMC,EAAWf,EAAgBgB,KAAOP,WAAWQ,YAAcjB,EAAgBgB,MAAQpB,KAEzF,MAAMsB,EAAOlB,EAAgBkB,KAAO,IAAIC,OAAOnB,EAAgBkB,MAAQ,KAEvE,IAAIE,EAAQpB,EAAgBoB,MAE5B,MAAMC,GAAerB,EAAgBqB,aAErC,IAAKD,EAAO,CACV,MAAME,EAAexB,SAASC,cAAc,iBACxCuB,IACFF,EAAQE,EAAaF,OAASE,EAAaC,aAAa,UAG5D,MAAMC,GAAUf,WAAWT,EAAgBwB,SAAW5B,MACtD,MAAM6B,GAAazB,EAAgByB,WAAahB,WAAWT,EAAgByB,YAAc,KACvFC,QAAQC,IAAI,kEAAmE,+BAGjF,MAAMC,eAAEA,GAAcC,sBAAEA,GAAqBC,iBAAEA,IAAqB9B,EAEpE,SAASS,WAAYsB,GACnB,MAAuB,kBAATA,EAAoBzB,KAAKyB,GAAQA,EAGjD,MAAMC,GAASC,MAAMC,QAAQlC,EAAgBmC,gBAAkBnC,EAAgBmC,eAAiB,GAChG,MAAMC,GAAoBJ,GAAOK,SAAS,eAC1C,MAAMC,GAAqBN,GAAOK,SAAS,gBAE3C,SAASE,cACPhC,EAAW,KAGb,MAAMiC,IAAQC,UAAUC,iBAAmBD,UAAUE,UAAUC,MAAM,kBAErE,MAAMC,GAAU/C,SAASgD,QAEzB,SAASC,WAAYC,EAAQC,EAAO,mBAClC,OAAOC,IAAIC,gBAAgB,IAAIC,KAAK,CAACJ,GAAS,CAAEC,KAAAA,KAGlD,MAAMI,KAAOC,GAAOC,YAAW,KAAQ,MAAMD,KAE7C,MAAME,WAAaF,KAAUG,OAAOC,aAAeD,OAAOE,QAAUjC,QAAQkC,OAASP,MAAMC,QAAW9B,GAAQ8B,IAE9G,SAASO,WAAYC,GACnB,OAAOA,EAAS,kBAAkBA,IAAW,GAG/C,MAAMC,GAAiB,MAEvB,SAASC,MAAOC,GACd,IAA0B,IAAtBA,EAAIC,QAAQ,KAAa,OAAO,MACpC,IACE,IAAIhB,IAAIe,GACR,OAAO,KAET,MAAOE,GACL,OAAO,OAWX,SAASC,WAAYC,EAAQC,GAC3B,OAAOC,uBAAuBF,EAAQC,KAAeN,MAAMK,GAAUA,EAASE,uBAAuB,KAAOF,EAAQC,IAGtH,SAASC,uBAAwBF,EAAQC,GAEvC,MAAME,EAAiBF,EAAUJ,QAAQ,KAAiC,IAA5BI,EAAUJ,QAAQ,KAAcI,EAAUJ,QAAQ,KAAOI,EAAUG,SACzF,IAApBD,IACFF,EAAYA,EAAUI,MAAM,EAAGF,KACH,IAA1BH,EAAOH,QAAQ,QACjBG,EAASA,EAAOM,QAAQZ,GAAgB,MAE1C,GAAkB,MAAdM,EAAO,IAA4B,MAAdA,EAAO,GAC9B,OAAOC,EAAUI,MAAM,EAAGJ,EAAUJ,QAAQ,KAAO,GAAKG,EAGrD,GAAkB,MAAdA,EAAO,KAA6B,MAAdA,EAAO,IAA4B,MAAdA,EAAO,KAA6B,MAAdA,EAAO,IAAgC,IAAlBA,EAAOI,SAAiBJ,GAAU,OAC3G,IAAlBA,EAAOI,SAAkBJ,GAAU,OACrB,MAAdA,EAAO,GAAY,CACrB,MAAMO,EAAiBN,EAAUI,MAAM,EAAGJ,EAAUJ,QAAQ,KAAO,GAMnE,IAAIW,EACJ,GAA6C,MAAzCP,EAAUM,EAAeH,OAAS,GAEpC,GAAuB,UAAnBG,EAA4B,CAC9BC,EAAWP,EAAUI,MAAME,EAAeH,OAAS,GACnDI,EAAWA,EAASH,MAAMG,EAASX,QAAQ,KAAO,QAGlDW,EAAWP,EAAUI,MAAM,QAK7BG,EAAWP,EAAUI,MAAME,EAAeH,QAA+C,MAArCH,EAAUM,EAAeH,UAG/E,GAAkB,MAAdJ,EAAO,GACT,OAAOC,EAAUI,MAAM,EAAGJ,EAAUG,OAASI,EAASJ,OAAS,GAAKJ,EAKtE,MAAMS,EAAYD,EAASH,MAAM,EAAGG,EAASE,YAAY,KAAO,GAAKV,EAErE,MAAMW,EAAS,GACf,IAAIC,GAAgB,EACpB,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,EAAUL,OAAQS,IAEpC,IAAsB,IAAlBD,EAAJ,CAQK,GAAqB,MAAjBH,EAAUI,GAAY,CAE7B,GAAyB,MAArBJ,EAAUI,EAAI,KAAoC,MAArBJ,EAAUI,EAAI,IAAcA,EAAI,IAAMJ,EAAUL,QAAS,CACxFO,EAAOG,MACPD,GAAK,EACL,SAGG,GAAyB,MAArBJ,EAAUI,EAAI,IAAcA,EAAI,IAAMJ,EAAUL,OAAQ,CAC/DS,GAAK,EACL,UAIJ,MAAwB,MAAjBJ,EAAUI,GAAYA,IAC7BD,EAAeC,OAtBb,GAAqB,MAAjBJ,EAAUI,GAAY,CACxBF,EAAOI,KAAKN,EAAUJ,MAAMO,EAAcC,EAAI,IAC9CD,GAAgB,GAuBA,IAAlBA,GACFD,EAAOI,KAAKN,EAAUJ,MAAMO,IAC9B,OAAOX,EAAUI,MAAM,EAAGJ,EAAUG,OAASI,EAASJ,QAAUO,EAAOK,KAAK,KAIhF,SAASC,2BAA4BC,EAAM1C,EAAS2C,GAClD,MAAMC,EAAS,CAAEC,QAAStF,OAAOC,OAAO,GAAImF,EAAUE,SAAUC,OAAQvF,OAAOC,OAAO,GAAImF,EAAUG,SAEhGJ,EAAKG,SACPE,0BAA0BL,EAAKG,QAASD,EAAOC,QAAS7C,EAAS2C,GAEnE,GAAID,EAAKI,OACP,IAAK,IAAIE,KAAKN,EAAKI,OAAQ,CACzB,MAAMG,EAAgB1B,WAAWyB,EAAGhD,GACpC+C,0BAA0BL,EAAKI,OAAOE,GAAIJ,EAAOE,OAAOG,KAAmBL,EAAOE,OAAOG,GAAiB,IAAKjD,EAAS2C,GAG5H,OAAOC,EAGT,SAASM,SAAUC,EAAMC,GACvB,GAAIA,EAASD,GACX,OAAOA,EACT,IAAIE,EAAWF,EAAKvB,OACpB,EAAG,CACD,MAAM0B,EAAUH,EAAKtB,MAAM,EAAGwB,EAAW,GACzC,GAAIC,KAAWF,EACb,OAAOE,SACoD,KAArDD,EAAWF,EAAKjB,YAAY,IAAKmB,EAAW,KAGxD,SAASE,cAAeC,EAAIC,GAC1B,MAAMC,EAAUR,SAASM,EAAIC,GAC7B,GAAIC,EAAS,CACX,MAAMC,EAAMF,EAASC,GACrB,GAAY,OAARC,EAAc,OAClB,OAAOA,EAAMH,EAAG3B,MAAM6B,EAAQ9B,SAKlC,SAASgC,iBAAkBC,EAAWC,EAAiBrC,GACrD,IAAIsC,EAAWtC,GAAayB,SAASzB,EAAWoC,EAAUf,QAC1D,MAAOiB,EAAU,CACf,MAAMC,EAAoBT,cAAcO,EAAiBD,EAAUf,OAAOiB,IAC1E,GAAIC,EACF,OAAOA,EACTD,EAAWb,SAASa,EAASlC,MAAM,EAAGkC,EAAS7B,YAAY,MAAO2B,EAAUf,QAE9E,OAAOS,cAAcO,EAAiBD,EAAUhB,WAA8C,IAAlCiB,EAAgBzC,QAAQ,MAAeyC,EAGrG,SAASf,0BAA2BU,EAAUQ,EAAajE,EAAS2C,GAClE,IAAK,IAAIuB,KAAKT,EAAU,CACtB,MAAMU,EAAczC,uBAAuBwC,EAAGlE,IAAYkE,EAC1D,KAAMxG,IAAac,KAAiByF,EAAYE,IAAiBF,EAAYE,KAAiBV,EAASU,GACrG,MAAMC,MAAM,0BAA0BD,WAAqBF,EAAYE,SAAmBV,EAASU,OAErG,IAAIE,EAASZ,EAASS,GACtB,GAAsB,kBAAXG,EACT,SACF,MAAMC,EAASV,iBAAiBjB,EAAWjB,uBAAuB2C,EAAQrE,IAAYqE,EAAQrE,GAC1FsE,EACFL,EAAYE,GAAeG,EAG7BzF,QAAQ0F,KAAK,YAAYL,UAAUT,EAASS,yBAIhD,IAAIzD,GACJG,OAAO4D,iBAAiB,SAASC,GAAQhE,GAAMgE,IAC/C,SAASC,oBAAqBtD,GAAKuD,OAAEA,EAASvD,GAAQ,IACpDX,QAAMmE,EACN,MAAMC,EAAM3E,WAAW,oBAAoBkB,oBAC3C,MAAM4B,EAAIzF,OAAOC,OAAOP,SAAS6H,cAAc,UAAW,CAAE1E,KAAM,SAAUyE,IAAAA,IAC5E7B,EAAE+B,aAAa,QAASxG,GACxByE,EAAE+B,aAAa,SAAU,IACzB,MAAMb,EAAK,IAAIc,SAAQ,CAACjH,EAASkH,KAE/BjC,EAAEwB,iBAAiB,QAASU,IAC5BlC,EAAEwB,iBAAiB,OAAQU,IAE3B,SAASA,GAAIT,GACXxH,SAASkI,KAAKC,YAAYpC,GAC1B,GAAIvF,KAAK4H,OAAQ,CACftH,EAAQN,KAAK4H,OAAQrF,IACrBvC,KAAK4H,YAAST,MAEX,CACHK,IAASR,aAAgBa,QAAUb,GAAQhE,IAAOA,GAAIM,OAAS,IAAIqD,MAAM,2CAA2CO,4BAAiCE,QACrJpE,QAAMmE,OAIZ3H,SAASkI,KAAKI,YAAYvC,GAC1B,OAAOkB,EAGT,IAAIsB,GAAgBd,oBAEpB,MAAMe,GAA6Bf,oBAAoBxE,WAAW,gCAAgCwF,MAAKC,IACjGA,IACFH,GAAgBG,EAAeC,SACjC,QAASD,IACR5I,MAGH,IAAI8I,GAAyB,MAC7B,IAAIC,GAAwB,MAE5B,IAAIC,GAAqB,MACzB,IAAIC,GAAqB,MAEzB,IAAIC,GAAwB,MAE5B,MAAMC,GAA0BlB,QAAQjH,QAAQ0H,IAA4BC,MAAKS,IAC/E,GAAKA,EAAL,CAEAF,GAAwB,KAExB,OAAOjB,QAAQoB,IAAI,CACjBZ,GAActF,WAAW,gBAAgBwF,MAAK,IAAMK,GAAqB,MAAMhJ,MAC/EwC,IAAqBiG,GAActF,WAAW,+CAA+CwF,MAAK,IAAMI,GAAwB,MAAM/I,MACtI0C,IAAsB+F,GAActF,WAAW,iDAAiDwF,MAAK,IAAMG,GAAyB,MAAM9I,MAC1IsJ,kBAAkBC,SAAWN,GAAqBK,kBAAkBC,SAAS,aAAe,IAAItB,SAAQjH,IACtGN,KAAK8I,IAAMC,IACTvJ,SAASkI,KAAKC,YAAYqB,GACtBD,IAAGR,GAAqB,aACrBvI,KAAK8I,IACZxI,KAEF,MAAM0I,EAASxJ,SAAS6H,cAAc,UACtC2B,EAAOC,MAAMC,QAAU,OACvBF,EAAO1B,aAAa,QAASxG,GAC7BkI,EAAOG,OAAS,iCAAiCrI,wEAAgFA,oEACjItB,SAASkI,KAAKI,YAAYkB,YAMhC,IAAII,GAAEC,GAAEC,GAAE/D,GAAE,GAAG,GAAG,MAAMX,GAAE,IAAI,IAAI2E,WAAW,IAAIC,YAAY,CAAC,IAAIC,QAAQ,GAAG,SAASL,EAAEC,GAAG,MAAMC,EAAEF,EAAEjF,OAAO,IAAIoB,EAAE,EAAE,KAAKA,EAAE+D,GAAGD,EAAE9D,GAAG6D,EAAEM,WAAWnE,MAAO,SAAS6D,EAAEC,GAAG,MAAMC,EAAEF,EAAEjF,OAAO,IAAIoB,EAAE,EAAE,KAAKA,EAAE+D,GAAG,CAAC,MAAMA,EAAEF,EAAEM,WAAWnE,GAAG8D,EAAE9D,MAAM,IAAI+D,IAAI,EAAEA,IAAI,IAAKK,GAAE,wFAAwF,IAAIC,GAAIC,GAAEC,GAAE,SAASlK,MAAMmK,EAAEC,EAAE,KAAKJ,GAAIG,EAAEF,GAAEG,EAAE,MAAMC,EAAE,EAAEL,GAAIzF,QAAQ,GAAG,IAAI,GAAG8F,EAAE1E,KAAI6D,GAAE,CAAC,KAAKa,EAAE1E,IAAGA,IAAG,EAAE8D,GAAE,IAAIa,YAAY3E,IAAGX,GAAE+E,GAAE,IAAIH,YAAYH,GAAE,GAAG,KAAKD,GAAE,SAASA,EAAEC,EAAEC,GAAG,UAAU,IAAI/D,EAAE,IAAI6D,EAAEe,UAAUb,GAAG1E,EAAE,IAAIwE,EAAEgB,WAAWd,GAAGK,EAAE,IAAIP,EAAEiB,WAAWf,GAAGgB,EAAE,IAAIlB,EAAEG,WAAWD,GAAGO,EAAE,IAAIT,EAAEI,YAAYF,GAAGQ,EAAE,IAAI,SAASS,EAAEnB,GAAGA,EAAEA,EAAE,EAAE,IAAIC,EAAE,EAAEC,EAAE,EAAEgB,EAAE,EAAEC,GAAE,EAAEN,GAAE,EAAEO,GAAE,EAAEzB,GAAE,EAAEA,GAAEe,EAAEA,EAAEA,EAAE,MAAM,EAAEG,GAAElB,GAAE,KAAK,EAAExD,EAAE,KAAK,EAAEX,EAAE,KAAK,EAAEA,EAAE,KAAK,EAAEA,EAAE,KAAK,EAAEA,EAAE,MAAM,EAAE+E,EAAE,IAAIA,EAAE,GAAGpE,EAAE,KAAK,EAAEoE,EAAE,IAAI,EAAEpE,EAAE,KAAK,EAAEoE,EAAE,IAAIZ,GAAE,MAAMY,EAAE,IAAIZ,GAAE,KAAKY,EAAE,IAAIZ,GAAExD,EAAE,KAAK,EAAE6D,GAAGO,EAAE,GAAG,IAAI,EAAE,EAAEA,EAAE,IAAIP,EAAEC,EAAED,GAAGO,EAAE,KAAK,GAAG,EAAEA,EAAE,IAAIN,EAAED,EAAE,MAAM,EAAE,CAACE,EAAEF,EAAE,EAAE,EAAEO,EAAE,IAAIL,EAAE,GAAGF,IAAI,GAAGC,IAAI,EAAE,CAACkB,GAAE,GAAG,MAAMlB,EAAE,EAAE,CAAC,OAAOzE,EAAE0E,GAAG,GAAG,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM1E,EAAE,KAAK,IAAI,EAAE6F,EAAEnB,GAAG,EAAE,IAAIoB,EAAEtB,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,IAAIW,KAAKxE,EAAE,KAAK,IAAI,GAAG,EAAE,CAACgF,GAAE,EAAE,MAAMnB,OAAOmB,GAAE,GAAG,MAAM,KAAK,IAAI,CAAC,GAAGE,EAAEnB,GAAG,GAAGoB,EAAEtB,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,CAACY,IAAIO,GAAE,QAASA,GAAE,GAAG,MAAM,KAAK,GAAG,CAACA,GAAE,GAAG,MAAM,KAAK,GAAG,OAAO3F,EAAEwE,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,CAACuB,IAAI,MAAMtB,EAAE,KAAK,GAAG,CAACuB,EAAE,GAAG,MAAMvB,EAAE,QAAQ,CAACkB,GAAE,GAAG,MAAMnB,GAAG,QAAQ,CAACmB,GAAE,GAAG,MAAMnB,UAAU,GAAG,IAAImB,GAAE,IAAI,GAAG,CAACA,GAAE,EAAEZ,EAAE,IAAIA,EAAE,IAAKP,EAAEO,EAAE,IAAI,EAAEN,EAAEM,EAAE,IAAI,EAAG,IAAIY,GAAE,IAAI,EAAE,CAACnB,EAAEO,EAAE,IAAI,EAAEA,EAAE,IAAIP,EAAEmB,GAAE,QAAS,IAAIA,GAAE,IAAI,GAAG,CAAChF,EAAE,KAAK,EAAEoE,EAAE,IAAIP,EAAEmB,GAAE,QAAS,IAAIA,GAAE,IAAI,GAAG,KAAKhF,EAAE,KAAK,GAAG,CAAC6D,EAAEE,EAAEiB,GAAE,QAASnB,EAAE,EAAE,EAAE,CAAC,IAAImB,GAAE,IAAI,GAAG,CAACnB,EAAE,MAAM,EAAE,CAACC,EAAED,EAAE,EAAE,EAAEO,EAAE,IAAIN,EAAEiB,EAAEjB,EAAE,GAAGD,IAAI,IAAIO,EAAE,IAAI,KAAK,EAAE,CAACY,GAAE,GAAG,MAAMlB,EAAE,EAAE,CAAC,OAAOzE,EAAEyE,GAAG,GAAG,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC,KAAKzE,EAAE,KAAK,IAAI,EAAE6F,EAAEpB,GAAG,EAAE,IAAIqB,EAAEtB,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,CAACW,IAAIQ,GAAE,QAASA,GAAE,GAAG,MAAM,KAAK,IAAI,CAAC,GAAGE,EAAEpB,GAAG,GAAGqB,EAAEtB,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,CAACY,IAAIO,GAAE,QAASA,GAAE,GAAG,MAAM,KAAK,GAAG,CAAC,IAAIE,EAAEpB,GAAG,GAAGqB,EAAEtB,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,EAAE,GAAGyB,EAAEjG,EAAEwE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC7D,EAAE,KAAK,EAAEgF,GAAE,QAASA,GAAE,GAAG,MAAM,KAAK,GAAG,CAACjB,EAAEK,EAAE,IAAI,EAAEW,EAAEX,EAAE,IAAI,EAAEY,GAAE3F,EAAE,KAAK,EAAEA,EAAE,KAAK2F,GAAE,GAAG,IAAI,GAAGZ,EAAEW,IAAIC,GAAE,QAAQ,IAAI,GAAGjB,EAAEiB,GAAE,GAAG,MAAM,KAAK,GAAG,CAAClB,EAAEzE,EAAE,KAAK,EAAE,KAAKyE,GAAG,IAAI,IAAI,CAACkB,GAAE,GAAG,MAAMnB,EAAEC,EAAEA,GAAG,GAAG,IAAI,GAAGzE,EAAE,KAAKyE,EAAEC,EAAE1E,EAAE,KAAK,EAAE,GAAG0E,GAAG,IAAI,IAAI,GAAGkB,GAAEb,GAAGA,EAAE,IAAI,KAAKL,EAAE,QAAQ,GAAG,IAAI,GAAG,GAAGK,EAAEa,GAAE,IAAI,GAAG,KAAKb,GAAGA,EAAE,IAAI,KAAKN,EAAE,QAAQ,IAAI,GAAG,IAAI,EAAE,CAACA,EAAEmB,GAAE,EAAE,EAAE,KAAKb,EAAEN,GAAG,GAAG,GAAGM,EAAEN,GAAG,GAAGiB,EAAEX,EAAEa,GAAE,IAAI,GAAGpB,EAAE,EAAExE,EAAE,KAAK0E,GAAG,GAAG,IAAI,GAAGiB,GAAE,QAASA,GAAE,GAAG,MAAM,KAAK,IAAI,CAACA,GAAEZ,EAAE,IAAI,EAAEW,EAAEX,EAAE,IAAI,EAAEP,EAAEmB,GAAE,EAAE,CAAC,IAAI3F,EAAE2F,IAAG,GAAG,IAAI,IAAID,EAAE,IAAI,GAAGX,EAAEW,EAAE,GAAG,GAAG,KAAKC,GAAE,GAAG,EAAE,CAAClB,EAAEM,EAAE,IAAI,EAAEA,EAAE,IAAIN,EAAE,IAAIA,EAAE,CAACM,EAAE,IAAI,EAAE,UAAW,CAACA,EAAEN,EAAE,IAAI,GAAG,EAAE,cAAc,GAAGC,EAAE1E,EAAE,KAAK,EAAE2F,GAAEjB,EAAE,MAAM/D,EAAE0E,GAAEM,IAAG,GAAGhF,EAAE,KAAK,EAAEA,EAAE,KAAK,EAAE+E,EAAEX,EAAE,IAAI,EAAE/E,EAAE,KAAK0E,EAAE,GAAG,IAAI,GAAGK,EAAEW,GAAGC,IAAG,IAAI,GAAGnB,EAAEmB,GAAE,GAAG,MAAM,KAAK,IAAI,CAACnB,EAAExE,EAAE,KAAK,EAAE,KAAKwE,GAAG,IAAI,IAAI,CAACmB,GAAE,GAAG,MAAMnB,EAAEE,EAAEF,GAAG,GAAG,IAAI,GAAGxE,EAAE,KAAK0E,EAAED,EAAEzE,EAAE,KAAK,EAAE,GAAGwE,GAAG,IAAI,IAAIC,GAAG,IAAI,GAAG,GAAGA,GAAG,IAAI,KAAK,GAAGC,EAAE,QAAQD,EAAE,OAAO,CAACkB,GAAE,GAAG,MAAMnB,MAAO,CAACmB,GAAE,GAAG,MAAMlB,MAAO,CAACiB,EAAEX,EAAE,IAAI,EAAEY,IAAG3F,EAAE,KAAK,IAAI,GAAG,IAAI,GAAGA,EAAE,KAAK2F,GAAE3F,EAAE,KAAKA,EAAE0F,IAAIC,GAAE,QAAQ,IAAI,GAAG,EAAEO,IAAIP,GAAE,GAAG,MAAMlB,GAAG,KAAK,GAAG,CAAC0B,EAAE,IAAIR,GAAE,GAAG,MAAM,KAAK,GAAG,CAACQ,EAAE,IAAIR,GAAE,GAAG,MAAM,KAAK,GAAG,OAAO3F,EAAEwE,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,CAACuB,IAAI,MAAMtB,EAAE,KAAK,GAAG,CAACuB,EAAE,GAAG,MAAMvB,EAAE,QAAQ,CAACA,EAAEM,EAAE,IAAI,EAAEL,EAAE1E,EAAEyE,GAAG,GAAG,EAAEC,EAAE,EAAE,CAAC,KAAK0B,EAAE1B,GAAG,GAAG,CAAC,OAAOA,GAAG,IAAI,IAAI,KAAK,GAAG,GAAG2B,EAAEtB,GAAGA,EAAE,IAAI,IAAIE,EAAE,MAAM,IAAI,GAAG,GAAG,EAAE,CAACU,GAAE,GAAG,MAAMjB,MAAO,CAACiB,GAAE,GAAG,MAAMjB,EAAE,KAAK,IAAI,MAAM,QAAQ,CAACiB,GAAE,GAAG,MAAMjB,GAAGF,EAAES,EAAE,KAAK,EAAE,KAAKpD,EAAEkD,GAAGA,EAAE,IAAI,IAAIP,GAAG,IAAI,GAAG,GAAG,IAAI7D,EAAE0E,GAAEb,GAAG,GAAG,IAAI,EAAE,EAAEmB,GAAE,QAAQA,GAAE,QAAS,OAAOjB,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK1E,EAAEyE,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO,GAAG,CAACkB,GAAE,GAAG,MAAMjB,MAAO,CAACiB,GAAE,GAAG,MAAMjB,EAAE,KAAK,GAAG,IAAI1E,EAAEyE,GAAG,GAAG,GAAG,IAAI,GAAG,CAACkB,GAAE,GAAG,MAAMjB,MAAO,CAACiB,GAAE,GAAG,MAAMjB,EAAE,KAAK,GAAG,IAAI1E,EAAEyE,GAAG,GAAG,GAAG,IAAI,GAAG,CAACkB,GAAE,GAAG,MAAMjB,MAAO,CAACiB,GAAE,GAAG,MAAMjB,EAAE,QAAQ,CAACiB,GAAE,GAAG,MAAMjB,UAAU,GAAGA,EAAE,EAAE,CAAC,IAAIiB,GAAE,IAAI,GAAG,CAACA,GAAE,EAAE,KAAKW,EAAE7B,GAAG,GAAG,CAAC,OAAOC,GAAG,IAAI,IAAI,KAAK,EAAE,CAACiB,GAAE,GAAG,MAAMjB,EAAE,KAAK,GAAG,MAAM,QAAQ,CAACF,EAAE,EAAE,MAAME,GAAG,KAAK/D,EAAE,KAAK,GAAG6D,EAAE,OAAOmB,GAAE,QAASA,GAAE,UAAW,GAAG,IAAIA,GAAE,IAAI,GAAG,CAACY,IAAI/B,EAAE,EAAG7D,EAAE,KAAK6D,EAAEmB,GAAE,GAAG,MAAMlB,GAAG,KAAK,GAAG,CAACyB,IAAIP,GAAE,GAAG,MAAM,QAAQA,GAAE,UAAW,GAAG,IAAIA,GAAE,IAAI,GAAG,CAACA,GAAE,EAAEZ,EAAE,IAAIA,EAAE,IAAKP,EAAEO,EAAE,IAAI,EAAG,IAAIY,GAAE,IAAI,GAAG,CAACa,IAAIhC,EAAE,EAAE,WAAW,IAAImB,GAAE,IAAI,GAAG,CAACa,IAAIhC,EAAE,EAAE,WAAW,IAAImB,GAAE,IAAI,GAAG,CAACa,IAAIhC,EAAE,EAAE,WAAW,IAAImB,GAAE,IAAI,GAAG,CAACnB,GAAGxE,EAAE,KAAK,KAAK,GAAGA,EAAE,KAAK,IAAI,GAAGW,EAAE,KAAK,IAAI,GAAGX,EAAE,KAAK,IAAI,EAAE,cAAc,GAAGkF,EAAEf,GAAE,OAAOK,EAAE,EAAE,SAASW,IAAI,IAAIX,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEgB,EAAE,EAAET,EAAE,EAAEC,EAAE,EAAED,EAAEF,EAAE,IAAI,EAAEG,EAAED,EAAE,GAAG,EAAEF,EAAE,IAAIG,EAAET,EAAEmB,EAAE,GAAG,EAAEpB,EAAEO,EAAE,IAAI,EAAE,MAAMP,EAAE,KAAKU,EAAE,KAAKuB,EAAEhC,GAAG,GAAG,GAAGiB,EAAE,EAAElB,EAAE,EAAE,CAAC,IAAIkB,EAAE,IAAI,EAAE,CAACjB,EAAE,EAAE,CAAC,OAAOA,GAAG,IAAI,IAAI,KAAK,IAAI,CAACiC,EAAElC,EAAEA,EAAE,GAAG,GAAG,MAAMA,EAAE,KAAK,GAAG,CAACO,EAAE,IAAIP,EAAE,GAAGoB,EAAE,GAAG,EAAEpB,EAAEO,EAAE,IAAI,EAAEW,EAAE,EAAE,MAAM,KAAK,IAAI,CAACA,EAAE,EAAE,MAAM,KAAK,GAAG,CAAC,IAAII,EAAEtB,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,GAAGE,EAAEF,EAAE,GAAG,EAAEmC,EAAE3G,EAAE0E,GAAG,GAAG,GAAG,GAAG,EAAE,CAACK,EAAE,IAAIL,EAAEO,EAAEW,EAAE,GAAG,EAAEV,EAAEH,EAAE,IAAI,EAAE6B,EAAE3B,GAAG,EAAEyB,EAAExB,EAAEH,EAAE,IAAI,GAAGA,EAAE,KAAKA,EAAE,IAAI,IAAI,EAAE,MAAMP,EAAEA,EAAEA,EAAE,EAAE,EAAEO,EAAE,IAAIP,EAAEkB,EAAE,GAAG,MAAM,KAAK,IAAI,KAAK,IAAI,CAACA,EAAE,GAAG,MAAM,KAAK,IAAI,CAACX,EAAE,IAAIP,EAAE,EAAEA,EAAEoB,EAAE,GAAG,EAAElB,EAAEK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG8B,EAAErC,GAAG,EAAE,CAAC2B,EAAE3B,GAAGA,GAAGO,EAAE,IAAI,GAAG,EAAE,EAAEA,EAAE,IAAIP,MAAQ,CAACoC,EAAEpC,GAAG,EAAEA,EAAEO,EAAE,IAAI,EAAGa,EAAE,GAAG,EAAEpB,EAAEsC,EAAEpC,EAAEF,GAAG,EAAE,GAAGA,GAAG,IAAI,IAAI,GAAG,CAACO,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAEP,EAAEoB,EAAE,GAAG,EAAGnB,EAAEC,EAAEA,EAAEK,EAAE,IAAI,EAAE,GAAGP,GAAG,IAAI,IAAI,IAAI,CAACkB,EAAE,GAAG,MAAM,IAAIhB,EAAE,KAAKD,EAAE,GAAG,CAACiB,EAAE,GAAG,MAAM,GAAGhB,IAAI,GAAGK,EAAE,IAAI,KAAK,EAAE,CAACW,EAAE,GAAG,OAAO,IAAIA,EAAE,IAAI,GAAG,CAACc,IAAI,MAAMhC,OAAO,IAAIkB,EAAE,IAAI,GAAG,CAACc,IAAI,MAAMhC,OAAO,IAAIkB,EAAE,IAAI,GAAG,CAACX,EAAE,IAAIL,EAAE,EAAEgB,EAAE,GAAG,MAAMjB,EAAE,MAAM,KAAK,GAAG,CAACM,EAAE,IAAIP,EAAE,EAAEoB,EAAE,GAAG,EAAEF,EAAEX,EAAE,IAAI,EAAE+B,EAAEpB,EAAEA,GAAG,EAAEA,EAAE,GAAG,MAAM,QAAQ,UAAU,GAAG,IAAIA,EAAE,IAAI,EAAE,CAACX,EAAE,IAAIP,EAAE,GAAGA,EAAEoB,EAAE,GAAG,EAAE,GAAGpB,GAAG,IAAI,IAAI,GAAG,CAACO,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAEP,EAAEoB,EAAE,GAAG,EAAGV,EAAEH,EAAE,IAAI,EAAE6B,EAAEpC,GAAG,EAAEkC,EAAExB,EAAEH,EAAE,IAAI,GAAGA,EAAE,KAAKA,EAAE,IAAI,IAAI,EAAE,WAAW,IAAIW,EAAE,IAAI,GAAG,CAAClB,EAAEA,EAAE,EAAE,EAAEO,EAAE,IAAIP,EAAE7D,EAAE,KAAK,EAAE8D,EAAE,MAAM,EAAE,CAACM,EAAE,IAAIP,EAAE,EAAEU,EAAEU,EAAE,GAAG,EAAEpB,EAAEO,EAAE,IAAI,EAAE,QAAQ6B,EAAE1B,GAAG,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,IAAI,CAACQ,EAAE,GAAG,MAAMjB,EAAE,QAAQ,GAAGA,EAAEM,EAAE,IAAI,EAAE,IAAIN,EAAE,KAAKD,EAAE,GAAG,MAAMA,EAAEkC,EAAElC,EAAEC,GAAG,QAAQmB,EAAE,GAAG,IAAI,IAAI,IAAI,KAAK,GAAG,CAACF,EAAE,GAAG,MAAMjB,EAAE,KAAK,GAAG,MAAM,QAAQ,CAACiB,EAAE,GAAG,MAAMjB,GAAGD,EAAEO,EAAE,IAAI,EAAG,IAAIW,EAAE,IAAI,GAAG,CAACX,EAAE,KAAKA,EAAE,IAAI,IAAI,EAAE,WAAW,IAAIW,EAAE,IAAI,GAAG,CAACX,EAAE,KAAKA,EAAE,IAAI,IAAI,EAAE,WAAW,IAAIW,EAAE,IAAI,GAAG,CAACX,EAAE,KAAKA,EAAE,IAAI,IAAI,EAAE,YAAY,IAAIW,EAAE,IAAI,GAAGjB,EAAEmB,EAAE,GAAG,EAAEpB,EAAEO,EAAE,IAAI,EAAE,GAAGN,GAAG,IAAI,IAAI,KAAKqB,EAAEtB,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,CAACO,EAAE,IAAIP,EAAE,EAAEa,EAAEJ,EAAEW,EAAE,GAAG,GAAG,MAAMb,EAAE,IAAIP,GAAG,SAAU,GAAG,OAAO,SAASY,IAAI,IAAIZ,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEgB,EAAE,EAAET,EAAE,EAAEA,EAAEF,EAAE,IAAI,EAAEN,EAAEQ,EAAE,GAAG,EAAEF,EAAE,IAAIN,EAAED,EAAE,EAAE,CAAC,QAAQoB,EAAE,GAAG,IAAI,IAAI,IAAI,KAAK,GAAG,CAACpB,EAAEO,EAAE,IAAI,EAAEN,EAAEM,EAAE,IAAI,EAAEL,EAAE1E,EAAE,KAAK,EAAEA,EAAE,KAAK0E,EAAE,GAAG,IAAI,GAAGK,EAAEN,IAAIC,EAAE,QAAQ,IAAI,GAAGF,EAAE,IAAIxE,EAAE+E,EAAE,KAAK,GAAG,IAAI,GAAG,CAACP,EAAEO,EAAE,IAAI,EAAEA,EAAE,IAAIP,EAAE,EAAEE,EAAEkB,EAAE,GAAG,EAAEzB,EAAEc,EAAEF,EAAE,IAAI,EAAE,EAAEP,GAAGA,EAAEO,EAAE,IAAI,EAAEN,EAAEM,EAAE,IAAI,EAAEE,EAAEjF,EAAE,KAAK,EAAEA,EAAE,KAAKiF,EAAE,GAAG,IAAI,GAAGF,EAAEN,IAAIQ,EAAE,QAAQ,IAAI,GAAGT,EAAE,OAAOE,GAAG,IAAI,IAAI,KAAK,GAAG,CAACyB,EAAE,IAAI,MAAM,KAAK,GAAG,CAACA,EAAE,IAAI,MAAM,QAAQ,CAACpB,EAAE,KAAKA,EAAE,IAAI,IAAI,EAAE,MAAMP,GAAGA,GAAGO,EAAE,IAAI,GAAG,EAAE,EAAEA,EAAE,IAAIP,EAAE,QAAQoB,EAAE,GAAG,IAAI,IAAI,IAAI,KAAK,GAAG,CAACb,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAEa,EAAE,GAAG,EAAElB,EAAEK,EAAE,IAAI,EAAEA,EAAEL,EAAE,GAAG,GAAGF,EAAES,EAAEF,EAAE,IAAI,EAAEA,EAAEL,EAAE,IAAI,GAAGO,EAAEtE,EAAE+D,EAAE,IAAI,GAAG,EAAEK,EAAE,IAAIE,GAAG,EAAE,MAAMT,EAAE,KAAK,GAAG,CAACxE,EAAE,MAAMA,EAAE,KAAK,IAAI,GAAG,IAAI,GAAGiF,EAAEF,EAAE,IAAI,EAAEA,EAAEE,EAAE,GAAG,GAAGT,EAAEO,EAAEE,EAAE,IAAI,IAAIF,EAAE,IAAI,GAAG,EAAEpE,EAAEsE,EAAE,IAAI,GAAG,EAAEjF,EAAE,MAAMA,EAAE,KAAK,IAAI,GAAG,IAAI,GAAG,MAAMwE,EAAE,QAAQ,CAACO,EAAE,KAAKA,EAAE,IAAI,IAAI,EAAE,MAAMP,IAAI,MAAM,KAAK,GAAG,CAACO,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAE,KAAKa,EAAE,GAAG,IAAI,IAAI,IAAI,KAAKpB,EAAEO,EAAE,IAAI,GAAGe,EAAEtB,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,GAAG,IAAIxE,EAAE+E,EAAE,KAAK,GAAG,IAAI,GAAG,EAAEZ,EAAEc,EAAEA,EAAET,EAAE,EAAE,EAAE,GAAG,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,CAACkB,EAAE,GAAG,MAAM,KAAK,IAAI,CAAClB,EAAEO,EAAE,IAAI,EAAE,GAAG/E,EAAE,KAAK,EAAE,CAAC+E,EAAE,IAAIP,GAAG,EAAE,MAAMA,EAAE,MAAM,EAAE,CAAC,GAAGA,IAAI,IAAIO,EAAE,IAAI,KAAK,EAAE,MAAMP,EAAEoB,EAAE,GAAG,EAAE,KAAKiB,EAAErC,GAAG,GAAG,CAAC,GAAGA,GAAG,IAAI,IAAI,IAAI,CAACkB,EAAE,GAAG,YAAYS,EAAE3B,GAAGA,GAAGO,EAAE,IAAI,GAAG,EAAE,EAAEA,EAAE,IAAIP,EAAG,IAAIkB,EAAE,IAAI,GAAGX,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAEa,EAAE,GAAG,EAAEpB,EAAEO,EAAE,IAAI,EAAE,GAAGe,EAAEtB,EAAE,GAAG,GAAG,EAAE,CAACgC,IAAI,MAAMhC,EAAEO,EAAE,IAAIP,EAAE,EAAEA,EAAEoB,EAAE,GAAG,EAAE,GAAGiB,EAAErC,GAAG,EAAE,CAACa,EAAEJ,EAAET,GAAG,MAAMA,MAAO,CAACgC,IAAI,MAAMhC,GAAG,QAAQ,IAAIO,EAAE,IAAI,KAAKN,EAAE,GAAGiB,EAAE,UAAW,GAAG,EAAE,CAAC,IAAIA,EAAE,IAAI,GAAG,CAAC,GAAG1F,EAAE,KAAK,EAAE,CAAC+E,EAAE,KAAKA,EAAE,IAAI,IAAI,EAAE,MAAMP,EAAEO,EAAE,IAAI,EAAEN,EAAEM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GAAGN,IAAI,GAAGD,IAAI,EAAE,CAACkB,EAAE,GAAG,MAAMhB,EAAE1E,EAAEyE,GAAG,GAAG,EAAE,GAAGoC,EAAEnC,GAAG,EAAE,CAACgB,EAAE,GAAG,MAAMA,EAAEjB,EAAE,EAAE,EAAEM,EAAE,IAAIW,EAAEjB,EAAEiB,EAAG,IAAIA,EAAE,IAAI,GAAG,CAACL,EAAEJ,EAAEP,GAAG,WAAW,IAAIgB,EAAE,IAAI,GAAG,CAACc,IAAI,cAAc,GAAG,OAAO,SAASnB,EAAEb,EAAEC,GAAGD,EAAEA,EAAE,EAAEC,EAAEA,EAAE,EAAE,IAAIC,EAAE,EAAE/D,EAAE,EAAE+D,GAAGK,EAAE,IAAI,GAAG,EAAE,EAAE,OAAON,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC0B,EAAE,IAAIxF,EAAE,EAAE,MAAM,KAAK,GAAG,CAACwF,EAAE,IAAIxF,EAAE,EAAE,MAAM,QAAQ6F,IAAK,EAAE,CAAC,IAAI7F,EAAE,IAAI,EAAE,CAACwD,EAAEK,EAAEE,EAAEK,EAAE,IAAI,EAAE,GAAGA,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAEpE,GAAGiF,EAAE,GAAG,IAAI,IAAI,IAAI,GAAGnB,EAAEM,EAAE,IAAI,EAAE,GAAGpE,GAAGmF,EAAErB,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,CAACM,EAAE,IAAIN,EAAE,GAAG,IAAImB,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,CAACb,EAAE,IAAIN,EAAE,MAAMD,EAAEO,EAAE,IAAI,EAAEL,EAAEF,EAAEA,EAAE,MAAM,EAAE,CAACO,EAAE,IAAIL,EAAE,EAAEA,EAAEkB,EAAE,GAAG,EAAE,OAAOlB,GAAG,IAAI,IAAI,KAAK,GAAG,CAACyB,EAAE,IAAIpB,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAEL,EAAEkB,EAAE,GAAG,EAAE,MAAM,KAAK,GAAG,CAACO,EAAE,IAAIpB,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAEL,EAAEkB,EAAE,GAAG,EAAE,MAAM,QAAQlB,EAAEkC,EAAElC,GAAG,EAAG,GAAGA,GAAG,IAAI,IAAI,GAAG,CAAC/D,EAAE,GAAG,MAAMoE,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAE,QAAQa,EAAE,GAAG,IAAI,IAAI,IAAI,KAAK,GAAG,CAACO,EAAE,IAAI,MAAM,KAAK,GAAG,CAACA,EAAE,IAAI,MAAM,QAAQ,CAACxF,EAAE,GAAG,MAAM6D,GAAGO,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAE,QAAQa,EAAE,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,CAACjF,EAAE,GAAG,MAAM6D,EAAE,KAAK,GAAG,MAAM,QAAQ,CAAC7D,EAAE,GAAG,MAAM6D,GAAGO,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAE,IAAIa,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,CAACjF,EAAE,GAAG,MAAM+D,EAAEK,EAAE,IAAI,EAAG,IAAIpE,EAAE,IAAI,GAAG,CAACoE,EAAE,IAAIN,EAAE,WAAW,IAAI9D,EAAE,IAAI,GAAG,CAACoE,EAAE,IAAIN,EAAE,WAAW,IAAI9D,EAAE,IAAI,GAAG,CAACoE,EAAE,IAAIN,EAAE,WAAW,IAAI9D,EAAE,IAAI,GAAG,CAACA,EAAEoE,EAAE,IAAI,EAAEA,EAAEpE,EAAE,IAAI,GAAG6D,EAAEO,EAAEpE,EAAE,IAAI,IAAIoE,EAAE,IAAI,GAAG,EAAE,OAAOA,EAAE,IAAIN,GAAG,SAAU,GAAG,OAAO,SAAS6B,EAAE9B,GAAGA,EAAEA,EAAE,EAAEA,EAAE,EAAE,CAAC,OAAOxE,EAAEwE,GAAG,GAAG,GAAG,KAAK,IAAI,OAAOxE,EAAEwE,GAAG,GAAG,GAAG,GAAG,KAAK,IAAI,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,MAAMA,EAAE,KAAK,IAAI,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,MAAMA,EAAE,QAAQ,CAACA,EAAE,EAAE,MAAMA,GAAG,KAAK,IAAI,CAAC,OAAOxE,EAAEwE,GAAG,GAAG,GAAG,GAAG,KAAK,IAAI,MAAM,KAAK,IAAI,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,MAAMA,EAAE,QAAQ,CAACA,EAAE,EAAE,MAAMA,GAAG,OAAOxE,EAAEwE,GAAG,GAAG,GAAG,GAAG,KAAK,IAAI,CAACA,EAAEwC,EAAExC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAMA,EAAE,KAAK,GAAG,CAACA,EAAEwC,EAAExC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAMA,EAAE,QAAQ,CAACA,EAAE,EAAE,MAAMA,IAAI,KAAK,IAAI,CAAC,IAAIxE,EAAEwE,GAAG,GAAG,GAAG,IAAI,KAAKxE,EAAEwE,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,OAAOxE,EAAEwE,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,MAAMA,EAAE,KAAK,IAAI,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,MAAMA,EAAE,QAAQ,CAACA,EAAE,EAAE,MAAMA,QAAQA,EAAE,EAAE,MAAM,KAAK,IAAI,CAACA,EAAEA,GAAG,EAAE,EAAE,GAAGwC,EAAExC,EAAE,KAAK,EAAEA,EAAE,OAAOA,EAAEuC,EAAEvC,EAAE,IAAI,GAAG,EAAE,MAAM,KAAK,IAAI,CAACA,EAAEwC,EAAExC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,MAAM,KAAK,IAAI,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,MAAM,KAAK,IAAI,OAAOxE,EAAEwE,GAAG,GAAG,GAAG,GAAG,KAAK,IAAI,CAACA,EAAEwC,EAAExC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAMA,EAAE,KAAK,IAAI,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,MAAMA,EAAE,QAAQ,CAACA,EAAE,EAAE,MAAMA,GAAG,QAAQA,EAAE,SAAU,GAAG,OAAOA,EAAE,EAAE,SAAS0B,IAAI,IAAI1B,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAED,EAAEM,EAAE,IAAI,EAAEL,EAAEK,EAAE,IAAI,EAAEP,EAAE,MAAM,EAAE,CAACA,EAAEE,EAAE,EAAE,EAAE,GAAGA,IAAI,GAAGD,IAAI,EAAE,CAACA,EAAE,EAAE,MAAM,OAAOzE,EAAEwE,GAAG,GAAG,GAAG,KAAK,GAAG,CAACC,EAAE,EAAE,MAAMD,EAAE,KAAK,GAAG,CAAC,IAAIxE,EAAE0E,EAAE,GAAG,GAAG,IAAI,IAAI,CAACD,EAAE,EAAE,MAAMD,EAAE,MAAM,KAAK,GAAG,CAACA,EAAEE,EAAE,EAAE,EAAE,MAAM,QAAQ,GAAGA,EAAEF,EAAG,IAAIC,EAAE,IAAI,EAAE,CAACM,EAAE,IAAIL,EAAE,EAAEF,EAAExE,EAAE,KAAK,EAAEyE,EAAEM,EAAE,IAAI,EAAEL,EAAE1E,EAAE,KAAK,EAAEA,EAAE,KAAK0E,EAAE,GAAG,IAAI,GAAG1E,EAAEyE,IAAIC,EAAE,QAAQ,IAAI,GAAGF,EAAEE,GAAG1E,EAAE,KAAK,GAAG,GAAG,IAAI,GAAGA,EAAE,KAAK0E,EAAE1E,EAAE,KAAK0E,OAAQ,IAAID,EAAE,IAAI,EAAE,CAACM,EAAE,IAAIP,EAAEgC,SAAU,IAAI/B,EAAE,IAAI,EAAEM,EAAE,IAAIP,EAAE,OAAO,SAASoB,EAAEpB,GAAGA,EAAEA,EAAE,EAAE,IAAIC,EAAE,EAAEC,EAAE,EAAE/D,EAAE,EAAE+D,EAAEK,EAAE,IAAI,EAAEP,EAAE,EAAE,CAACC,EAAEzE,EAAE0E,GAAG,GAAG,EAAED,EAAE,EAAE,CAAC,GAAGA,GAAG,IAAI,IAAI,GAAG,GAAGD,EAAE,GAAGyB,EAAExB,GAAG,EAAE,WAAW,MAAMD,OAAO,GAAGyC,EAAExC,GAAG,EAAE,WAAW,MAAMD,OAAO,OAAOxE,EAAE0E,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,CAACqB,IAAI,MAAMtB,EAAE,KAAK,GAAG,CAACuB,EAAExB,GAAG,MAAMC,EAAE,QAAQ,CAACA,EAAE,GAAG,MAAMD,UAAU,GAAG7D,EAAEoE,EAAE,IAAI,EAAEL,EAAE/D,EAAE,EAAE,EAAEoE,EAAE,IAAIL,QAAS/D,IAAI,GAAGoE,EAAE,IAAI,KAAK,GAAG,OAAON,EAAE,EAAE,SAAS0B,EAAE3B,GAAGA,EAAEA,EAAE,EAAE,IAAIC,EAAE,EAAEC,EAAE,EAAE/D,EAAE,EAAE+E,EAAE,EAAEA,EAAEX,EAAE,IAAI,EAAEN,EAAEM,EAAE,IAAI,EAAE,MAAM,EAAE,CAACpE,EAAE8D,EAAE,EAAE,EAAE,GAAGA,IAAI,GAAGiB,IAAI,EAAE,CAACjB,EAAE,EAAE,MAAMC,EAAE1E,EAAEW,GAAG,GAAG,EAAE,GAAG+D,GAAG,IAAI,IAAIF,GAAG,IAAI,GAAG,CAACC,EAAE,GAAG,MAAM,GAAGC,GAAG,IAAI,IAAI,GAAG,CAACA,EAAED,EAAE,EAAE,EAAE,IAAIzE,EAAE0E,GAAG,GAAG,IAAI,GAAG,CAACD,EAAEA,EAAE,EAAE,EAAEA,GAAGzE,EAAEyE,GAAG,GAAG,IAAI,GAAGA,EAAEC,OAAQD,EAAEC,OAAQ,GAAGwC,EAAExC,GAAG,EAAE,CAACD,EAAE,EAAE,WAAWA,EAAE9D,EAAG,IAAI8D,EAAE,IAAI,EAAE,CAACM,EAAE,IAAIpE,EAAE6F,SAAU,IAAI/B,EAAE,IAAI,GAAGM,EAAE,IAAIpE,EAAE,OAAO,SAASwD,EAAEK,EAAEC,EAAEC,EAAE1E,GAAGwE,EAAEA,EAAE,EAAEC,EAAEA,EAAE,EAAEC,EAAEA,EAAE,EAAE1E,EAAEA,EAAE,EAAE,IAAI0F,EAAE,EAAET,EAAE,EAAES,EAAEX,EAAE,IAAI,EAAEA,EAAE,IAAIW,EAAE,GAAGT,EAAEF,EAAE,IAAI,EAAEA,IAAIE,EAAE,IAAI,EAAE,IAAIA,EAAE,GAAG,IAAI,GAAGS,EAAEX,EAAE,IAAIE,EAAEF,EAAE,IAAIW,EAAEX,EAAEW,EAAE,GAAG,GAAGlB,EAAE,GAAG,IAAIxE,EAAE,GAAGwE,EAAEE,OAAOF,EAAE,IAAIxE,EAAE,GAAG0E,EAAE,EAAE,EAAE,EAAEK,EAAEW,EAAE,IAAI,GAAGlB,EAAEO,EAAEW,GAAG,GAAGjB,EAAEM,EAAEW,EAAE,GAAG,GAAGhB,EAAEK,EAAEW,EAAE,IAAI,GAAG,EAAEX,EAAEW,EAAE,IAAI,GAAG1F,EAAEW,EAAE+E,EAAE,IAAI,GAAG,IAAI1F,EAAE,GAAG,EAAE+E,EAAEW,EAAE,IAAI,GAAG,EAAE,OAAO,SAASyB,IAAI,IAAI3C,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEA,EAAEK,EAAE,IAAI,EAAEN,EAAEM,EAAE,IAAI,EAAEP,EAAE,MAAM,EAAE,CAACA,EAAEC,EAAE,EAAE,EAAE,GAAGA,IAAI,GAAGC,IAAI,EAAE,CAACD,EAAE,EAAE,MAAM,OAAOzE,EAAEwE,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,CAACC,EAAE,EAAE,MAAMD,EAAE,KAAK,GAAG,CAACC,EAAE,EAAE,MAAMD,EAAE,KAAK,GAAG,CAACA,EAAEC,EAAE,EAAE,EAAE,MAAM,QAAQ,GAAGA,EAAED,EAAG,IAAIC,EAAE,IAAI,EAAE,CAACM,EAAE,IAAIP,EAAEgC,IAAIhC,EAAE,OAAQ,IAAIC,EAAE,IAAI,EAAE,CAACM,EAAE,IAAIP,EAAEA,EAAE,GAAI,OAAOA,EAAE,EAAE,SAASsC,EAAEtC,EAAEC,GAAGD,EAAEA,EAAE,EAAEC,EAAEA,EAAE,EAAE,IAAIC,EAAE,EAAE/D,EAAE,EAAE+D,EAAEK,EAAE,IAAI,EAAEpE,EAAEX,EAAE0E,GAAG,GAAG,EAAE,GAAG/D,GAAG,IAAI,IAAI,GAAG,CAACoE,EAAE,IAAIL,EAAE,EAAEA,EAAEkB,EAAE,GAAG,EAAEpB,EAAEO,EAAE,IAAI,EAAE,GAAG8B,EAAEnC,GAAG,EAAE,CAACyB,EAAEzB,GAAGD,GAAGM,EAAE,IAAI,GAAG,EAAE,EAAEA,EAAE,IAAIN,MAAQ,CAACmC,EAAElC,GAAG,EAAED,EAAEM,EAAE,IAAI,EAAGpE,EAAEiF,EAAE,GAAG,EAAElB,EAAEK,EAAE,IAAI,EAAG,IAAIL,EAAE,KAAKF,EAAE,GAAGkC,EAAElC,EAAEC,GAAG,OAAO9D,EAAE,EAAE,SAAS4F,IAAI,IAAI/B,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEF,EAAE,MAAM,EAAE,CAACA,EAAEO,EAAE,IAAI,EAAEN,EAAED,EAAE,EAAE,EAAEO,EAAE,IAAIN,EAAE,GAAGD,IAAI,IAAIO,EAAE,IAAI,KAAK,EAAE,CAACL,EAAE,EAAE,MAAM,OAAO1E,EAAEyE,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,CAACC,EAAE,EAAE,MAAMF,EAAE,KAAK,GAAG,MAAMA,EAAE,KAAK,GAAG,CAAC2C,IAAI,EAAE,MAAM,KAAK,GAAG,CAACpC,EAAE,IAAIP,EAAE,EAAE,MAAM,QAAQ,IAAI,IAAIE,EAAE,IAAI,EAAE8B,IAAI,OAAO,SAAS3E,EAAE2C,GAAGA,EAAEA,EAAE,EAAE,OAAOxE,EAAEwE,GAAG,GAAG,GAAG,KAAK,GAAG,CAACA,GAAGxE,EAAEwE,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,KAAK,GAAG,KAAK,GAAG,CAACA,EAAE,EAAE,MAAM,KAAK,IAAI,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,MAAM,KAAK,IAAI,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,MAAM,KAAK,IAAI,CAACA,EAAEuC,EAAEvC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,MAAM,QAAQA,EAAE,EAAG,OAAOA,EAAE,EAAE,SAASwB,EAAExB,GAAGA,EAAEA,EAAE,EAAE,IAAIC,EAAE,EAAEC,EAAE,EAAE/D,EAAE,EAAE+E,EAAE,EAAET,EAAE,EAAES,GAAGX,EAAE,IAAI,GAAG,EAAE,EAAEA,EAAE,IAAIW,EAAEhB,EAAEK,EAAE,IAAI,EAAE,MAAM,EAAE,CAACN,EAAEiB,EAAE,EAAE,EAAE,GAAGA,IAAI,GAAGhB,IAAI,EAAE,MAAM/D,EAAEX,EAAEyE,GAAG,GAAG,EAAE,IAAID,EAAE0C,EAAEvG,GAAG,EAAE,EAAE,MAAM,GAAGA,GAAG,IAAI,IAAI,IAAIX,EAAE0F,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,CAACT,EAAE,EAAE,MAAMS,EAAEjB,EAAG,IAAIQ,EAAE,IAAI,EAAE,CAACF,EAAE,IAAIN,EAAEA,EAAEiB,EAAE,EAAE,EAAGX,EAAE,IAAIN,EAAE,OAAO,SAASqB,EAAEtB,EAAEC,EAAEC,GAAGF,EAAEA,EAAE,EAAEC,EAAEA,EAAE,EAAEC,EAAEA,EAAE,EAAE,IAAI1E,EAAE,EAAE+E,EAAE,EAAEP,EAAE,EAAE,CAAC,IAAIE,EAAEF,EAAE,MAAO,CAAC,MAAM,EAAE,CAACxE,EAAEW,EAAE6D,GAAG,GAAG,EAAEO,EAAEpE,EAAE8D,GAAG,GAAG,EAAE,GAAGzE,GAAG,IAAI,IAAI+E,GAAG,IAAI,GAAG,MAAML,EAAEA,GAAG,EAAE,EAAE,IAAIA,EAAE,CAACF,EAAE,EAAE,MAAMA,MAAO,CAACA,EAAEA,EAAE,EAAE,EAAEC,EAAEA,EAAE,EAAE,GAAID,GAAGxE,EAAE,MAAM+E,EAAE,KAAK,SAAU,GAAG,OAAOP,EAAE,EAAE,SAASiC,EAAEjC,GAAGA,EAAEA,EAAE,EAAEA,EAAE,EAAE,CAAC,OAAOA,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,CAACA,EAAE,EAAE,MAAM,QAAQ,IAAIA,GAAG,IAAI,IAAI,IAAI,IAAIA,GAAG,GAAG,OAAO,EAAEA,EAAE,MAAO,CAAC,OAAOA,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,CAACA,EAAE,EAAE,MAAMA,EAAE,QAAQ,GAAGA,GAAGA,GAAG,IAAI,OAAO,UAAW,GAAG,OAAOA,EAAE,EAAE,SAAS4B,EAAE5B,GAAGA,EAAEA,EAAE,EAAEA,EAAE,EAAE,CAAC,OAAOA,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,QAAQ,MAAMA,GAAG,GAAG,OAAO,GAAGA,GAAG,GAAG,OAAO,EAAEA,GAAG,IAAI,IAAI,IAAI,CAAC,OAAOA,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,GAAG,MAAMA,EAAE,QAAQ,GAAG,OAAOA,GAAG,IAAI,IAAI,KAAKA,GAAG,IAAI,OAAO,EAAE,UAAU,GAAG,OAAO,EAAE,SAAS4C,EAAE5C,GAAGA,EAAEA,EAAE,EAAE,IAAIC,EAAE,EAAEC,EAAE,EAAE/D,EAAE,EAAE+E,EAAE,EAAEhB,EAAEQ,EAAEA,EAAEA,EAAE,GAAG,EAAEvE,EAAE+D,EAAEK,EAAEpE,GAAG,GAAG,EAAEoE,EAAE,IAAIP,EAAEC,EAAEM,EAAE,GAAG,EAAEW,EAAEjB,GAAGD,GAAG,GAAG,EAAEA,EAAEkB,EAAE,EAAE,EAAE1F,EAAE0F,GAAG,GAAG,EAAEX,EAAEpE,GAAG,GAAG6D,EAAEO,EAAE,IAAIP,EAAEO,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEG,EAAER,EAAE,OAAOD,EAAE,EAAE,SAASsC,EAAEvC,EAAEC,EAAEC,GAAGF,EAAEA,EAAE,EAAEC,EAAEA,EAAE,EAAEC,EAAEA,EAAE,EAAE,IAAI/D,EAAE,EAAE+E,EAAE,EAAE/E,EAAE6D,GAAG,EAAEE,GAAG,GAAG,EAAEgB,EAAE/E,EAAE,EAAE,EAAE6D,EAAEO,EAAE,GAAG,EAAE,GAAGW,IAAI,GAAGlB,IAAI,GAAGsB,EAAEJ,EAAEjB,EAAEC,GAAG,GAAG,IAAI,EAAE,EAAE,IAAIgB,EAAE,KAAKlB,EAAE,GAAGA,EAAE,OAAOA,EAAEmC,EAAE3G,EAAEW,GAAG,GAAG,GAAG,OAAO6D,EAAE,EAAE,OAAOA,EAAE,EAAE,SAASwC,EAAExC,EAAEC,GAAGD,EAAEA,EAAE,EAAEC,EAAEA,EAAE,EAAE,IAAIC,EAAE,EAAEA,EAAEK,EAAE,GAAG,EAAE,GAAGL,IAAI,GAAGF,IAAI,GAAGxE,EAAEwE,GAAG,GAAG,IAAIC,GAAG,IAAI,GAAG,EAAE,IAAIC,EAAE,KAAKF,EAAE,GAAGE,EAAE,OAAOA,EAAEiC,EAAE3G,EAAEwE,GAAG,GAAG,GAAG,GAAG,OAAOE,EAAE,EAAE,OAAOA,EAAE,EAAE,SAASiC,EAAEnC,GAAGA,EAAEA,EAAE,EAAEA,EAAE,EAAE,CAAC,IAAIA,GAAG,EAAE,OAAO,EAAEA,EAAE,MAAO,CAAC,OAAOA,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,IAAI,CAACA,EAAE,EAAE,MAAMA,EAAE,QAAQ,GAAGA,EAAEA,GAAG,IAAI,IAAI,IAAIiC,EAAEjC,GAAG,UAAW,GAAG,OAAOA,EAAE,EAAE,SAASuB,IAAI,IAAIvB,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEF,EAAEO,EAAE,IAAI,EAAEL,EAAEK,EAAE,IAAI,EAAEP,EAAE,MAAM,EAAE,CAACC,EAAEC,EAAE,EAAE,EAAE,GAAGA,IAAI,GAAGF,IAAI,EAAE,MAAM,OAAOxE,EAAEyE,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,MAAMD,EAAE,QAAQE,EAAED,GAAIM,EAAE,IAAIN,EAAE,OAAO,SAASiC,EAAElC,EAAEC,GAAGD,EAAEA,EAAE,EAAEC,EAAEA,EAAE,EAAE,IAAIC,EAAE,EAAE/D,EAAE,EAAE+D,EAAEK,EAAE,IAAI,EAAEA,EAAE,IAAIL,EAAE,GAAG/D,EAAEoE,EAAE,IAAI,EAAEA,IAAIpE,EAAE,IAAI,EAAE,IAAIA,EAAE,EAAE,IAAI,GAAG+D,EAAEK,EAAE,IAAIL,EAAEK,EAAEL,GAAG,GAAGF,EAAEO,EAAEL,EAAE,GAAG,GAAGD,EAAEM,EAAEL,EAAE,GAAG,GAAG,EAAE,OAAO,SAASkC,EAAEpC,GAAGA,EAAEA,EAAE,EAAE,MAAM,EAAE,CAAC,GAAGyB,EAAEzB,GAAG,EAAE,MAAM,GAAGiC,EAAEjC,GAAG,EAAE,MAAMA,GAAGO,EAAE,IAAI,GAAG,EAAE,EAAEA,EAAE,IAAIP,EAAEA,EAAExE,EAAEwE,GAAG,GAAG,EAAE,KAAKA,GAAG,IAAI,IAAI,CAACA,EAAE,EAAE,OAAO,OAAOA,EAAE,EAAE,SAAS6C,IAAI,IAAI7C,EAAE,EAAEA,EAAEO,GAAGA,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,OAAOP,EAAE,GAAG,KAAK,EAAE,CAACA,GAAG,EAAE,MAAM,KAAK,EAAE,CAACA,GAAG,EAAE,MAAM,QAAQA,EAAEA,GAAGO,EAAE,GAAG,IAAI,EAAG,OAAOP,EAAE,EAAE,SAAS6B,EAAE7B,GAAGA,EAAEA,EAAE,EAAE,KAAKuC,EAAEvC,EAAE,IAAI,GAAG,KAAKuC,EAAEvC,EAAE,IAAI,GAAG,GAAG,EAAEA,EAAEuC,EAAEvC,EAAE,IAAI,GAAG,OAAOA,EAAE,EAAE,OAAOA,EAAE,EAAE,SAASyC,EAAEzC,GAAGA,EAAEA,EAAE,EAAE,OAAOA,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,CAACA,EAAE,EAAE,MAAM,QAAQA,EAAE,EAAG,OAAOA,EAAE,EAAE,SAASqB,EAAErB,GAAGA,EAAEA,EAAE,EAAE,IAAIO,EAAE,GAAG,KAAKP,EAAE,GAAGA,EAAE,OAAOA,EAAEmC,EAAE3G,EAAEwE,GAAG,GAAG,GAAG,GAAG,EAAE,OAAOA,EAAE,EAAE,SAAS8C,IAAI,IAAI9C,EAAE,EAAEA,EAAEO,GAAGA,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAIP,EAAEA,GAAG,OAAOA,EAAEA,GAAGO,EAAE,GAAG,IAAI,EAAE,OAAOP,EAAE,EAAE,SAAS+C,IAAI,IAAI/C,EAAE,EAAEA,EAAEO,GAAGA,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,IAAIP,EAAEA,GAAG,OAAOA,EAAEA,GAAGO,EAAE,GAAG,IAAI,EAAE,OAAOP,EAAE,EAAE,SAASgD,IAAI,IAAIhD,EAAE,EAAEA,EAAEO,GAAGA,EAAE,IAAI,GAAG,GAAG,GAAG,EAAE,IAAIP,EAAEA,GAAG,OAAOA,EAAEA,GAAGO,EAAE,GAAG,IAAI,EAAE,OAAOP,EAAE,EAAE,SAASiD,IAAI,IAAIjD,EAAE,EAAEA,EAAEO,EAAE,IAAI,EAAEP,EAAEO,IAAIP,EAAE,IAAI,EAAE,IAAIA,EAAE,GAAG,IAAI,GAAG,EAAEO,EAAE,IAAIP,EAAE,OAAQA,EAAE,IAAI,EAAE,EAAE,SAASkD,IAAI,IAAIlD,EAAE,EAAEA,EAAEO,EAAE,IAAI,EAAEP,EAAEO,IAAIP,EAAE,IAAI,EAAE,IAAIA,EAAE,EAAE,IAAI,GAAG,EAAEO,EAAE,IAAIP,EAAE,OAAQA,EAAE,IAAI,EAAE,EAAE,SAASgC,IAAI7F,EAAE,KAAK,EAAEoE,EAAE,KAAKA,EAAE,IAAI,IAAIA,EAAE,GAAG,IAAI,EAAEA,EAAE,KAAKA,EAAE,IAAI,GAAG,EAAE,OAAO,SAASkB,EAAEzB,GAAGA,EAAEA,EAAE,EAAE,OAAQA,EAAE,MAAM,IAAI,IAAI,KAAKA,GAAG,EAAE,OAAO,EAAE,EAAE,SAASqC,EAAErC,GAAGA,EAAEA,EAAE,EAAE,OAAOA,GAAG,IAAI,IAAI,GAAGA,GAAG,IAAI,IAAI,GAAG,EAAE,SAASmD,IAAI,OAAQ5C,GAAGA,EAAE,IAAI,GAAG,GAAG,GAAG,IAAIA,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS6C,IAAI,OAAQ7C,GAAGA,EAAE,IAAI,GAAG,GAAG,GAAG,IAAIA,EAAE,GAAG,IAAI,EAAE,EAAE,SAASmC,EAAE1C,GAAGA,EAAEA,EAAE,EAAE,OAAOA,GAAG,IAAI,IAAI,GAAGA,GAAG,IAAI,IAAI,GAAG,EAAE,SAASqD,IAAI,OAAQ9C,EAAEA,EAAE,KAAK,GAAG,IAAIA,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS+C,IAAI,OAAQ/C,EAAEA,EAAE,KAAK,GAAG,IAAIA,EAAE,GAAG,IAAI,EAAE,EAAE,SAASgD,IAAI,OAAOrC,GAAGX,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,EAAE,SAASiD,EAAExD,GAAGA,EAAEA,EAAE,EAAEO,EAAE,GAAGP,EAAE,OAAO,SAASyD,IAAI,OAAQtH,EAAE,KAAK,IAAI,EAAE,EAAE,SAAS1B,IAAI,OAAO8F,EAAE,IAAI,EAAE,SAASmD,GAAG1D,GAAGA,EAAEA,EAAE,EAAEU,EAAEV,EAAE,IAAI,IAAI,GAAG,OAAO,IAAI,MAAO,CAAC2D,GAAGD,GAAGE,GAAGb,EAAE/C,EAAEvF,EAAEiJ,GAAGN,EAAES,GAAGP,EAAE7C,EAAEgD,EAAE9G,GAAGkG,EAAEiB,GAAGd,EAAEe,GAAGR,EAAES,GAAGX,EAAEhG,EAAE8D,EAAE8C,GAAGf,EAAEgB,GAAGjB,EAAEkB,GAAGvB,EAAEwB,GAAGtB,EAAEuB,IAAIb,EAAEc,GAAGnB,GAAxwc,CAA4wc,oBAAoBvM,KAAKA,KAAK2N,OAAO,GAAGtE,IAAGC,GAAEF,GAAE2D,GAAGxH,IAAG,GAAG,KAAM,MAAMuF,EAAElB,GAAIzF,OAAO,EAAEiF,GAAEqE,IAAInE,IAAGF,GAAEmE,GAAGzC,EAAE,GAAGlG,GAAEgF,GAAI,IAAIJ,YAAYH,GAAEC,GAAEwB,IAAI1B,GAAE3C,MAAMqD,GAAEV,GAAEA,IAAI8B,KAAK,MAAMV,EAAE,GAAGO,EAAE,GAAG,KAAK3B,GAAEkE,MAAM,CAAC,MAAMjE,EAAED,GAAEgE,KAAK9D,EAAEF,GAAE8D,KAAK3H,EAAE6D,GAAE4D,KAAKpI,EAAEwE,GAAErD,KAAK4D,EAAEP,GAAEsE,KAAK7D,EAAET,GAAEoE,KAAK,IAAI1D,EAAEV,GAAE+D,OAAOrD,EAAES,GAAG,IAAI3F,EAAEyE,EAAEA,EAAE,EAAEO,GAAIF,YAAY,IAAI9E,EAAEyE,EAAE,EAAEA,KAAKmB,EAAE1F,KAAK,CAACgF,EAAEA,EAAEvE,EAAE8D,EAAED,EAAEE,EAAEoE,GAAG/D,EAAE6D,GAAG3D,EAAEkB,EAAEnG,EAAEyE,EAAE9D,IAAK,KAAK6D,GAAEiE,MAAM,CAAC,MAAMhE,EAAED,GAAE6D,KAAK3D,EAAEM,GAAIF,WAAWL,GAAG0B,EAAEjG,KAAK,KAAKwE,GAAG,KAAKA,EAAEiB,EAAElB,EAAE,EAAEC,GAAGM,GAAIxF,MAAMgF,GAAE6D,KAAK7D,GAAE0D,OAAQ,MAAO,CAACtC,EAAEO,IAAI3B,GAAES,KAAK,SAASU,EAAEnB,EAAEC,GAAGS,GAAEV,EAAE,IAAIE,EAAE,GAAG/D,EAAEuE,GAAE,OAAO,CAACA,IAAGF,GAAIzF,QAAQ+G,IAAI,MAAM9B,EAAEQ,GAAIF,WAAWI,IAAG,GAAGV,IAAIC,EAAE,MAAM,KAAKD,GAAGE,GAAGM,GAAIxF,MAAMmB,EAAEuE,IAAGR,GAAGS,IAAIxE,EAAEuE,KAAI,OAAOV,GAAG,OAAOA,GAAGa,EAAEb,IAAI8B,MAAMpB,IAAI,OAAOR,GAAGM,GAAIxF,MAAMmB,EAAEuE,MAAKR,EAAE,SAASS,IAAI,IAAIX,EAAEQ,GAAIF,aAAaI,IAAG,SAASA,GAAEV,GAAG,KAAK,IAAI,MAAO,KAAK,KAAK,IAAI,MAAO,KAAK,KAAK,IAAI,OAAOwE,OAAOC,aAAa7D,EAAE,IAAI,KAAK,IAAI,OAAO,WAAW,IAAIZ,EAAE,MAAMQ,GAAIF,WAAWI,OAAMA,GAAEV,EAAEY,EAAEJ,GAAIhG,QAAQ,IAAIkG,IAAGA,MAAKA,GAAEV,EAAE,SAAS8B,KAAK9B,EAAEY,EAAE,GAAG,OAAOZ,GAAG,MAAMwE,OAAOC,aAAazE,IAAIA,GAAG,MAAMwE,OAAOC,aAAa,OAAOzE,GAAG,IAAI,OAAO,KAAKA,KAAlM,GAA0M,KAAK,IAAI,MAAO,KAAK,KAAK,GAAG,MAAO,KAAK,KAAK,IAAI,MAAO,KAAK,KAAK,IAAI,MAAO,KAAK,KAAK,GAAG,KAAKQ,GAAIF,WAAWI,OAAMA,GAAE,KAAK,GAAG,MAAO,GAAG,KAAK,GAAG,KAAK,GAAGoB,IAAI,QAAQ,GAAG9B,GAAG,IAAIA,GAAG,GAAG,CAAC,IAAIC,EAAEO,GAAIkE,OAAOhE,GAAE,EAAE,GAAGxH,MAAM,WAAW,GAAGgH,EAAEyE,SAAS1E,EAAE,GAAG,OAAOC,EAAE,MAAMD,EAAEA,EAAEjF,MAAM,GAAG,GAAGkF,EAAEyE,SAAS1E,EAAE,IAAIS,IAAGT,EAAElF,OAAO,EAAEiF,EAAEQ,GAAIF,WAAWI,IAAG,MAAMT,GAAG,KAAKD,GAAG,KAAKA,GAAG8B,IAAI0C,OAAOC,aAAavE,GAAG,OAAOW,EAAEb,GAAG,GAAGwE,OAAOC,aAAazE,IAAI,SAASY,EAAEZ,GAAG,MAAMC,EAAES,GAAE,IAAIR,EAAE,EAAE/D,EAAE,EAAE,IAAI,IAAI8D,EAAE,EAAEA,EAAED,IAAIC,IAAIS,GAAE,CAAC,IAAIV,EAAExE,EAAEgF,GAAIF,WAAWI,IAAG,GAAG,KAAKlF,EAAE,CAAC,GAAGA,GAAG,GAAGwE,EAAExE,EAAE,GAAG,QAAQ,GAAGA,GAAG,GAAGwE,EAAExE,EAAE,GAAG,OAAQ,CAAC,KAAKA,GAAG,IAAIA,GAAG,IAAI,MAAMwE,EAAExE,EAAE,GAAI,GAAGwE,GAAG,GAAG,MAAM7D,EAAEX,EAAE0E,EAAE,GAAGA,EAAEF,OAAQ,KAAK7D,GAAG,IAAI8D,GAAG6B,IAAI3F,EAAEX,EAAG,OAAO,KAAKW,GAAGuE,GAAET,IAAID,GAAG8B,IAAI5B,EAAE,SAASW,EAAEb,GAAG,OAAO,KAAKA,GAAG,KAAKA,EAAE,SAAS8B,IAAI,MAAMpL,OAAOC,OAAO4G,MAAM,eAAekD,MAAKD,GAAIxF,MAAM,EAAE0F,IAAGkE,MAAM,MAAM7J,UAAU2F,GAAEF,GAAInF,YAAY,KAAKqF,GAAE,MAAM,CAACmE,IAAInE,KAE3lhBoE,eAAeC,SAAUpI,EAAI/B,GAC3B,MAAMoK,EAAcnK,uBAAuB8B,EAAI/B,GAC/C,MAAO,CACLsF,EAAGnD,iBAAiBC,GAAWgI,GAAerI,EAAI/B,IAAcqK,gBAAgBtI,EAAI/B,GAEpFuG,GAAI6D,IAAgB1K,MAAMqC,IAI9B,MAAMzF,GAAUD,EAAc6N,MAAOnI,EAAI/B,KACvC,IAAIsK,EAASjO,EAAY0F,EAAI/B,EAAWuK,gBAEpCD,GAAUA,EAAOrG,OACnBqG,QAAeA,GACjB,OAAOA,EAAS,CAAEhF,EAAGgF,EAAQ/D,GAAItG,uBAAuB8B,EAAI/B,KAAeN,MAAMqC,IAAQoI,SAASpI,EAAI/B,IACpGmK,SAMJD,eAAeM,WAAYzI,KAAO0I,GAEhC,IAAIzK,EAAYyK,EAAKA,EAAKtK,OAAS,GACV,kBAAdH,IACTA,EAAYzB,UAERmM,GACFxO,SAAkBA,EAAW6F,EAAuB,kBAAZ0I,EAAK,GAAkBA,EAAK,GAAK,GAAIzK,GACjF,GAAI2K,IAAuB1O,IAAa2O,GAAqB,CAC3DC,oBACK5O,IACH0O,GAAsB,aAEpBG,GACN,OAAOC,oBAAoBzO,GAAQyF,EAAI/B,IAAYsF,EAAG,CAAE0F,YAAa,gBAGvEhP,KAAKwO,WAAaA,WAElB,SAASD,eAAgBxI,EAAI/B,GAC3B,OAAOmC,iBAAiBC,GAAWnC,uBAAuB8B,EAAI/B,IAAc+B,EAAI/B,IAAcqK,gBAAgBtI,EAAI/B,GAGpH,SAASqK,gBAAiBtI,EAAI/B,GAC5B,MAAM2C,MAAM,gCAAgCZ,KAAMxC,WAAWS,MAG/D,MAAMiL,YAAc,CAAClJ,EAAI/B,EAAYzB,MACnCyB,EAAY,GAAGA,IACf,MAAMsK,EAASjO,GAAeA,EAAY0F,EAAI/B,EAAWuK,gBACzD,OAAOD,IAAWA,EAAOrG,KAAOqG,EAASC,eAAexI,EAAI/B,IAG9D,SAASkL,YAAanJ,EAAI/B,EAAYmL,KAAKxL,KACzC,OAAOsL,YAAYlJ,EAAI/B,GAGzBwK,WAAWlO,QAAU2O,YACrBT,WAAWY,aAAe,IAAMzP,KAAKC,MAAMD,KAAK0P,UAAUjJ,KAE1D,MAAMkJ,GAAWd,WAAWe,GAAK,GAEjCrB,eAAesB,QAASC,EAAMC,GAC5B,IAAID,EAAKlF,IAAKmF,EAAKD,EAAKxF,GAAxB,CAEAyF,EAAKD,EAAKxF,GAAK,QACTwF,EAAKrE,QACL7D,QAAQoB,IAAI8G,EAAK1E,EAAE4E,KAAIC,GAAOJ,QAAQI,EAAKF,MAC5CD,EAAK3F,IACR2F,EAAK3F,EAAI2F,EAAK1E,EAAE8E,MAAKD,GAAOA,EAAI9F,MAGpC,IAAI1D,GAAY,CAAEhB,QAAS,GAAIC,OAAQ,IACvC,IAAIyK,GAAqB,MACzB,IAAIlB,GAEJ,MAAMF,GAAcjG,GAAwBR,MAAK,KAE/C,IAAKhI,EACH,GAAIT,SAASuQ,iBAAiB,qFAAqF5L,OACjHlC,kBAEG,CACH,IAAI+N,EAAa,MACjB,IAAK,MAAMC,KAAUzQ,SAASuQ,iBAAiB,8CAC7C,GAAKC,GAIA,GAAoB,cAAhBC,EAAOtN,KAAsB,CACpCmN,GAAqB,KACrB,WALoB,WAAhBG,EAAOtN,OACTqN,EAAa,MASvBpB,GAAyD,OAAnClP,EAAgBmC,gBAA2B2G,IAAyBF,IAAsBC,MAAwBvG,IAAsBoG,OAA6BtG,IAAqBuG,MAA2ByH,IAAsB,KACjQ,IAAKvH,GAAoB,CACvB,MAAMM,EAAWD,kBAAkBC,UAAa,CAAAlG,GAAiB,YAATA,GAA+B,WAATA,GAC9EiG,kBAAkBC,SAAWlG,GAAiB,cAATA,GAAwBkG,EAASlG,GAExE,IAAI1C,GAAa2O,QAAjB,CACE,IAAIsB,kBAAiBC,IACnB,IAAK,MAAMC,KAAYD,EACrB,GAAsB,cAAlBC,EAASzN,KACb,IAAK,MAAM0N,KAAQD,EAASE,WAC1B,GAAqB,WAAjBD,EAAKE,QAAsB,CACzBF,EAAK1N,QAAU1C,EAAW,cAAgB,WAC5CuQ,cAAcH,GACZA,EAAK1N,QAAU1C,EAAW,iBAAmB,cAC/CwQ,iBAAiBJ,OAEK,SAAjBA,EAAKE,SAAsBF,EAAKK,OAASzQ,EAAW,qBAAuB,kBAClF0Q,eAAeN,MAGpBO,QAAQpR,SAAU,CAAEqR,UAAW,KAAMC,QAAS,OACjDjC,oBACAkC,4BACA,GAA4B,aAAxBvR,SAASwR,WACXC,8BAEG,CACH/C,eAAegD,sBACPxC,GACNG,oBACA,GAA4B,aAAxBrP,SAASwR,WAA2B,CACtCC,0BACAzR,SAAS2R,oBAAoB,mBAAoBD,gBAGrD1R,SAASuH,iBAAiB,mBAAoBmK,oBAKpD,IAAIpC,GAAmBJ,GACvB,IAAI0C,GAAoB,KACxB,IAAIzC,GAAsB,KAE1BT,eAAea,aAAcpL,EAAK0N,EAAW3O,EAAQ4O,EAAgBC,GAC9DtR,IACH0O,GAAsB,aAClBG,GACF5O,SAAkBA,EAAW6F,GAAuB,kBAAZ0I,KAAK,GAAkBA,KAAK,GAAK,GAAIzK,WAEjF,IAAK/D,GAAY2O,GAAqB,CAEpC,GAAI0C,EACF,OAAO,WACHC,EACN,OAAOxJ,GAAcrF,EAASD,WAAWC,GAAUiB,EAAK,CAAEuD,OAAQvD,GAAOjB,IAE3E,MAAM+M,EAAO+B,gBAAgB7N,EAAK0N,EAAW,KAAM3O,GACnD,MAAMgN,EAAO,SACPF,QAAQC,EAAMC,GACpB+B,QAAWtK,EACXuK,YAAYjC,EAAMC,SACZ6B,EACN,GAAI7O,IAAWzC,IAAawP,EAAK3F,GAAK,KAAQ,CAC5C,MAAM6H,QAAe5J,GAActF,WAAWC,GAAS,CAAEwE,OAAQxE,IAC7DpB,IAAgBsQ,iBAAiB9R,OAAO+R,KAAKnC,IACjD,OAAOiC,EAET,GAAIP,KAAsBnR,GAAYwP,EAAK3F,GAAKwH,EAAgB,CAC9DnQ,KACAiQ,GAAoB,MAEtB,MAAMO,SAAe5J,GAAe9H,GAAawP,EAAK3F,IAAKwH,EAA0B7B,EAAKlF,EAAdkF,EAAKxF,EAAY,CAAE/C,OAAQuI,EAAKxF,IAExGwF,EAAKlK,UACAwC,GAAc0H,EAAKlK,IAAIuM,IAAIH,IAChCrQ,IAAgBsQ,iBAAiB9R,OAAO+R,KAAKnC,IAGjD,OAAOiC,GAGT,SAASC,iBAAiBG,GACxB,IAAIC,EAAQ,EACZ,MAAMC,EAAaF,EAAa5N,OAChC,MAAM+N,EAAWlS,KAAKmS,oBAAsBnS,KAAKmS,oBAAsBnS,KAAKoS,sBAC5EF,EAASG,SACT,SAASA,UACP,MAAMC,EAA0B,IAARN,EACxB,KAAIM,EAAkBL,GAAtB,CACA,IAAK,MAAMM,KAAOR,EAAa3N,MAAMkO,EAAiBA,EAAkB,KAAM,CAC5E,MAAM7C,EAAOH,GAASiD,GAClB9C,GAAM7M,IAAI4P,gBAAgB/C,EAAKlF,GAErCyH,IACAE,EAASG,WAIb,SAASI,YAAa9O,GACpB,MAAO,IAAIA,EAAIU,QAAQ,KAAM,UAG/B,IAAIoN,GACJ,SAASC,YAAajC,EAAMC,GAC1B,GAAID,EAAKlF,IAAMmF,EAAKD,EAAKxF,GACvB,OACFyF,EAAKD,EAAKxF,GAAK,EAEf,IAAK,MAAM2F,KAAOH,EAAK1E,EACrB2G,YAAY9B,EAAKF,GAEnB,MAAOtK,GAAWqK,EAAKpG,EAGvB,MAAM3G,EAAS+M,EAAK9D,EAGpB,IAAI+G,EAAiBxQ,IAAQuP,GAAW,WAAWA,OAAe,GAElE,GAAKrM,EAAQjB,OAGR,CAGH,IAAIwO,EAAY,EAAGC,GAAW,EAAGC,GAAwB,GACzD,SAASC,aAAcC,GACrB,MAAOF,GAAsBA,GAAsB1O,OAAS,GAAK4O,EAAe,CAC9E,MAAMC,EAAmBH,GAAsBhO,MAC/C6N,GAAkB,GAAGhQ,EAAO0B,MAAMuO,EAAWK,OAAsBP,YAAYhD,EAAKnG,KACpFqJ,EAAYK,EAEdN,GAAkBhQ,EAAO0B,MAAMuO,EAAWI,GAC1CJ,EAAYI,EAEd,IAAK,MAAQxN,EAAG0N,GAAOvF,GAAIwF,GAAgB1F,GAAI2F,GAAcpI,EAAGqI,MAAwBhO,EAEtF,IAA4B,IAAxBgO,GAA2B,CAC7B,IAAIC,GAAU5D,EAAK1E,EAAE6H,MAAaU,GAAUD,GAAQ9I,EAAGgJ,IAAcD,GACjEC,MAEID,GAAUD,GAAQ9N,KACtB+N,GAAUD,GAAQ9N,EAAI9C,WAAW,0BACjC4Q,GAAQhK,EAAE,GAAGsG,KACXlO,GAAiB,YAATA,EAAqB,gBAAkB,GAAGA,OAAUA,MAC5DsD,KAAK,QAEPsO,GAAQhK,EAAE,GAAGsG,KAAIlO,GACN,YAATA,EAAqB,iCAAmC,cAAcA,MACtEsD,KAAK,uBACUsO,GAAQ/J,aAI7BwJ,aAAaG,GAAQ,GACrBP,GAAkB,KAAKhQ,EAAO0B,MAAM6O,GAAQ,EAAGE,QAAkBV,YAAYa,MAG7E,IAAKC,IAAcF,GAAQ9N,EAAG,CAC5BmN,GAAkB,iBAAiBE,WAAiBS,GAAQ9I,uBAAuBqI,WAAiBS,GAAQ9N,SAASqN,SAAeA,MACpIS,GAAQ9N,OAAI4B,EAEdwL,EAAYQ,QAGT,IAA4B,IAAxBC,GAA2B,CAClC3D,EAAK/E,EAAI,CAAE/G,IAAK8L,EAAKnG,EAAGhJ,QAAS4O,aACjCzO,EAASgP,EAAK/E,EAAG+E,EAAKxF,GACtB6I,aAAaG,IACbP,GAAkB,iBAAiBD,YAAYhD,EAAKxF,QACpD0I,EAAYQ,OAGT,CACHL,aAAaI,GAAiB,GAC9BR,GAAkB,QAClBG,GAAsB/N,KAAKqO,GAAe,GAC1CR,EAAYM,GAIhBH,aAAapQ,EAAOyB,aA7DpBuO,GAAkBhQ,EAgEpB,IAAI8Q,EAAe,MACnBd,EAAiBA,EAAerO,QAAQoP,IAAmB,CAACnR,EAAOoR,EAAW/P,KAAS6P,GAAgBE,EAAWpR,EAAM+B,QAAQV,GAAK,IAAM,IAAIf,IAAIe,EAAK8L,EAAKnG,QACxJkK,IACHd,GAAkB,mBAAqBjD,EAAKnG,GAE9CmG,EAAKlF,EAAIkH,GAAWhP,WAAWiQ,GAC/BjD,EAAK9D,OAAIxE,EAKX,MAAMsM,GAAoB,mEAE1B,MAAME,GAAgB,4CACtB,MAAMC,GAAkB,iCACxB,MAAMC,GAAiB,gCAEvB,MAAMC,GAAc,yEAGpB,IAAIrN,GAAI,GACR,IAAI6D,GAAI,EACR,SAASyJ,gBACP,KAAMzJ,GAAI,IACR,OAAO,IAAI/C,SAAQ+B,GAAK7C,GAAE3B,KAAKwE,KAEnC,SAAS0K,eACP1J,KACI7D,GAAEtC,QACJsC,GAAEwN,OAAFxN,GAGJyH,eAAegG,QAASvQ,EAAK0N,EAAW7N,GACtC,GAAIhC,KAAqB6P,EAAU8C,UACjC,MAAMxN,MAAM,oBAAoBhD,IAAMJ,WAAWC,OACnD,MAAM4Q,EAAYL,gBACdK,SAAiBA,EACrB,IACE,IAAIC,QAAY9T,EAAUoD,EAAK0N,GAEjC,MAAOjI,GACLA,EAAEkL,QAAU,mBAAmB3Q,IAAMJ,WAAWC,sCAA6C4F,EAAEkL,QAC/F,MAAMlL,EAEA,QACN4K,eAEF,IAAKK,EAAIE,GACP,MAAM5N,MAAM,GAAG0N,EAAIG,UAAUH,EAAII,cAAcJ,EAAI1Q,MAAMJ,WAAWC,MACtE,OAAO6Q,EAGTnG,eAAewG,YAAa/Q,EAAK0N,EAAW7N,GAC1C,MAAM6Q,QAAYH,QAAQvQ,EAAK0N,EAAW7N,GAC1C,MAAMmR,EAAcN,EAAIO,QAAQC,IAAI,gBACpC,GAAIlB,GAAcmB,KAAKH,GACrB,MAAO,CAAErL,EAAG+K,EAAI1Q,IAAK4B,QAAS8O,EAAIU,OAAQpL,EAAG,MAC1C,GAAIiK,GAAgBkB,KAAKH,GAC5B,MAAO,CAAErL,EAAG+K,EAAI1Q,IAAK4B,EAAG,wBAAwB8O,EAAIU,SAAUpL,EAAG,QAC9D,GAAIkK,GAAeiB,KAAKH,GAC3B,MAAO,CAAErL,EAAG+K,EAAI1Q,IAAK4B,EAAG,2CACxB5F,KAAK0P,iBAAiBgF,EAAIU,QAAQ1Q,QAAQyP,IAAa,CAACkB,EAAQC,EAAS,GAAIC,EAASC,IAAY,OAAOF,IAASnR,WAAWoR,GAAWC,EAASxR,KAAOsR,6BACnItL,EAAG,OAGxB,MAAMhD,MAAM,6BAA6BgO,cAAwBhR,IAAMJ,WAAWC,kFAGtF,SAASgO,gBAAiB7N,EAAK0N,EAAW7N,EAAQd,GAChD,IAAI+M,EAAOH,GAAS3L,GACpB,GAAI8L,IAAS/M,EACX,OAAO+M,EAETA,EAAO,CAELxF,EAAGtG,EAEH2F,EAAG5G,EAASiB,OAAMwD,EAElB0C,OAAG1C,EAEHwE,OAAGxE,EAEHiE,OAAGjE,EAEHkC,OAAGlC,EAEH4D,OAAG5D,EAEHoD,OAAGpD,EAEH5B,OAAG4B,EAEH2C,EAAG,MAEHH,EAAG,KAEHe,EAAG,MAEL,GAAI4E,GAAS3L,GAAM,CACjB,IAAIiB,EAAI,EACR,MAAO0K,GAASG,EAAKxF,KAAMrF,IAC3B6K,EAAKxF,GAAKrF,EAEZ0K,GAASG,EAAKxF,GAAKwF,EAEnBA,EAAK5F,EAAI,WACP,IAAKnH,EAAQ,CAEX,IAAIiH,IACDL,EAAGmG,EAAKnG,EAAG/D,EAAG7C,EAAQiH,EAAAA,SAAayL,GAAWzR,IAAQ+Q,YAAY/Q,EAAK0N,EAAW7N,KACrF,GAAImG,IAAM1J,EAAU,CAClB,GAAU,QAAN0J,IAAgB7H,IAA2B,SAAN6H,IAAiB3H,GACxD,MAAM2E,MAAM,GAAGgD,uEAAuEA,4BAC9E,QAANA,IAAgBtB,IAA+B,SAANsB,IAAiBvB,MAC5DqH,EAAK3F,EAAI,OAGf,IACE2F,EAAKpG,EAAIzJ,MAAM8C,EAAQ+M,EAAKxF,GAE9B,MAAOb,GACLlG,WAAWkG,GACXqG,EAAKpG,EAAI,CAAC,GAAI,GAAI,OAEpBoG,EAAK9D,EAAIjJ,EACT,OAAO+M,GApBA,GAuBTA,EAAKrE,EAAIqE,EAAK5F,EAAE5B,MAAKiG,UACnB,IAAImH,EAAiBhE,EACrB5B,EAAK1E,SAAWxD,QAAQoB,IAAI8G,EAAKpG,EAAE,GAAGsG,KAAIzB,OAASpE,EAAAA,EAAGiB,EAAAA,OAChDA,GAAK,IAAMvC,IAA+B,IAANuC,IAAYzC,MAClDmH,EAAK3F,EAAI,MACX,IAAW,IAAPiB,IAAajB,EAAG,OACpB,MAAMR,EAAEA,EAACiB,EAAEA,SAAYjK,GAAQwJ,EAAG2F,EAAKnG,GAAKmG,EAAKxF,IAC7CM,GAAOhC,KAAsBuH,KAC/BL,EAAK3F,EAAI,MACX,GAAIlJ,GAAQA,EAAKkU,KAAKxL,GAAI,MAAO,CAAEiB,EAAGjB,GAClC+L,EAAelB,YACjBkB,EAAiBvV,OAAOC,OAAO,GAAIsV,EAAgB,CAAElB,eAAWhN,KAClE,OAAOqK,gBAAgBlI,EAAG+L,EAAgB5F,EAAKnG,GAAGO,OAC/CyL,QAAOtL,GAAKA,OAGnB,OAAOyF,EAGT,SAASsB,4BACP,IAAK,MAAMd,KAAUzQ,SAASuQ,iBAAiB9P,EAAW,2BAA6B,uBACrFuQ,cAAcP,GAChB,IAAK,MAAMsF,KAAQ/V,SAASuQ,iBAAiB9P,EAAW,+BAAiC,2BACvF0Q,eAAe4E,GAGnB,SAAS1G,oBACP,IAAK,MAAMoB,KAAUzQ,SAASuQ,iBAAiB9P,EAAW,gCAAkC,4BAC1FwQ,iBAAiBR,GAGrB,SAASuF,aAAcvF,GACrB,MAAMoB,EAAY,GACdpB,EAAOkE,YACT9C,EAAU8C,UAAYlE,EAAOkE,WAC3BlE,EAAOwF,iBACTpE,EAAUqE,eAAiBzF,EAAOwF,gBACT,oBAAvBxF,EAAO0F,YACTtE,EAAUrC,YAAc,UACM,cAAvBiB,EAAO0F,YACdtE,EAAUrC,YAAc,OAExBqC,EAAUrC,YAAc,cAC1B,OAAOqC,EAGT,IAAIE,GAAwBhK,QAAQjH,UAEpC,IAAIsV,GAAsB,EAC1B,SAASC,wBACuB,MAAxBD,IAA8BrU,IAClC/B,SAASsW,cAAc,IAAIjO,MAAM,qBAGrCrI,SAASuH,iBAAiB,oBAAoBmH,gBACtCQ,GACNmH,wBACA,GAAI5V,IAAa2O,GAAqB,CACpCC,oBACAkC,gCAIJ,IAAIgF,GAAwB,EAC5B,SAAS9E,0BACyB,MAA1B8E,IAAgCxU,IACpC/B,SAASsW,cAAc,IAAIjO,MAAM,qBAGrC,SAAS4I,iBAAkBR,GACzB,IAAIA,EAAO+F,KAGN/F,EAAO7I,KAAQ6I,EAAOpQ,WAA3B,CAEAoQ,EAAO+F,GAAK,KAEZ,GAAI/F,EAAO7I,IAAK,CACd,IAAKnH,EACH,OACF6P,GAAqB,KAEvB,GAAInB,GAAqB,CACvBG,GAAmBA,GAChB7G,MAAKiG,UACJ9H,GAAYpB,2BAA2BiL,EAAO7I,gBAAmB8M,QAAQjE,EAAO7I,IAAKoO,aAAavF,KAAUhL,OAAStF,KAAKC,MAAMqQ,EAAOpQ,WAAYoQ,EAAO7I,KAAO7E,GAAS6D,OAE3K6P,MAAM/S,YACJjD,IACH0O,GAAsB,SAI5B,SAAS6B,cAAeP,GACtB,GAAIA,EAAO+F,GACT,OACF,GAAsC,OAAlC/F,EAAOhP,aAAa,UACtB,OAEF,IAAKgP,EAAO7I,MAAQ6I,EAAOpQ,UACzB,OACFoQ,EAAO+F,GAAK,KAEZ,MAAME,EAAyD,OAAjCjG,EAAOhP,aAAa,UAAqB8U,GAAwB,EAE/F,MAAMI,EAA2BP,GAAsB,EACnDM,GAAuBH,KACvBI,GAA0BP,KAC9B,MAAMQ,EAAcrH,aAAakB,EAAO7I,KAAO7E,GAASiT,aAAavF,IAAUA,EAAO7I,KAAO6I,EAAOpQ,WAAYI,EAAUiW,GAAyB3E,IAAuB0E,MAAM/S,YAC5KgT,IACF3E,GAAwB6E,EAAYnO,KAAKgJ,0BACvCkF,GACFC,EAAYnO,KAAK4N,uBAGrB,MAAMT,GAAa,GACnB,SAASzE,eAAgB4E,GACvB,IAAIA,EAAKS,GAAT,CAEAT,EAAKS,GAAK,KACNZ,GAAWG,EAAKc,QAEpBjB,GAAWG,EAAKc,MAAQ3B,YAAYa,EAAKc,KAAMb,aAAaD,QAx0BhE"}
\ No newline at end of file
diff --git a/public/assets/es-module-shims.min-606ae9c3279013fe751cee30f719a592f759e705edb66496812f3d9dbce3d850.js b/public/assets/es-module-shims.min-606ae9c3279013fe751cee30f719a592f759e705edb66496812f3d9dbce3d850.js
new file mode 100644
index 0000000000000000000000000000000000000000..cfb7e8e320c0321402d0df95757c1798ee65fcae
--- /dev/null
+++ b/public/assets/es-module-shims.min-606ae9c3279013fe751cee30f719a592f759e705edb66496812f3d9dbce3d850.js
@@ -0,0 +1,5 @@
+(function(){const noop=()=>{};const e=document.querySelector("script[type=esms-options]");const t=e?JSON.parse(e.innerHTML):{};Object.assign(t,self.esmsInitOptions||{});let r=!!t.shimMode;const s=globalHook(r&&t.onimport);const a=globalHook(r&&t.resolve);let n=t.fetch?globalHook(t.fetch):fetch;const i=t.meta?globalHook(shimModule&&t.meta):noop;const c=t.skip?new RegExp(t.skip):null;let f=t.nonce;const te=t.mapOverrides;if(!f){const e=document.querySelector("script[nonce]");e&&(f=e.nonce||e.getAttribute("nonce"))}const re=globalHook(t.onerror||noop);const se=t.onpolyfill?globalHook(t.onpolyfill):()=>{console.log("%c^^ Module TypeError above is polyfilled and can be ignored ^^","font-weight:900;color:#391")};const{revokeBlobURLs:ae,noLoadEventRetriggers:ne,enforceIntegrity:ie}=t;function globalHook(e){return"string"===typeof e?self[e]:e}const oe=Array.isArray(t.polyfillEnable)?t.polyfillEnable:[];const ce=oe.includes("css-modules");const le=oe.includes("json-modules");function setShimMode(){r=true}const fe=!navigator.userAgentData&&!!navigator.userAgent.match(/Edge\/\d+\.\d+/);const ue=document.baseURI;function createBlob(e,t="text/javascript"){return URL.createObjectURL(new Blob([e],{type:t}))}const eoop=e=>setTimeout((()=>{throw e}));const throwError=e=>{(window.reportError||window.safari&&console.error||eoop)(e),void re(e)};function fromParent(e){return e?` imported from ${e}`:""}const de=/\\/g;function isURL(e){if(-1===e.indexOf(":"))return false;try{new URL(e);return true}catch(e){return false}}function resolveUrl(e,t){return resolveIfNotPlainOrUrl(e,t)||(isURL(e)?e:resolveIfNotPlainOrUrl("./"+e,t))}function resolveIfNotPlainOrUrl(e,t){const r=t.indexOf("?",-1===t.indexOf("#")?t.indexOf("#"):t.length);-1!==r&&(t=t.slice(0,r));-1!==e.indexOf("\\")&&(e=e.replace(de,"/"));if("/"===e[0]&&"/"===e[1])return t.slice(0,t.indexOf(":")+1)+e;if("."===e[0]&&("/"===e[1]||"."===e[1]&&("/"===e[2]||2===e.length&&(e+="/"))||1===e.length&&(e+="/"))||"/"===e[0]){const r=t.slice(0,t.indexOf(":")+1);let s;if("/"===t[r.length+1])if("file:"!==r){s=t.slice(r.length+2);s=s.slice(s.indexOf("/")+1)}else s=t.slice(8);else s=t.slice(r.length+("/"===t[r.length]));if("/"===e[0])return t.slice(0,t.length-s.length-1)+e;const a=s.slice(0,s.lastIndexOf("/")+1)+e;const n=[];let i=-1;for(let e=0;e<a.length;e++)if(-1===i){if("."===a[e]){if("."===a[e+1]&&("/"===a[e+2]||e+2===a.length)){n.pop();e+=2;continue}if("/"===a[e+1]||e+1===a.length){e+=1;continue}}while("/"===a[e])e++;i=e}else if("/"===a[e]){n.push(a.slice(i,e+1));i=-1}-1!==i&&n.push(a.slice(i));return t.slice(0,t.length-s.length)+n.join("")}}function resolveAndComposeImportMap(e,t,r){const s={imports:Object.assign({},r.imports),scopes:Object.assign({},r.scopes)};e.imports&&resolveAndComposePackages(e.imports,s.imports,t,r);if(e.scopes)for(let a in e.scopes){const n=resolveUrl(a,t);resolveAndComposePackages(e.scopes[a],s.scopes[n]||(s.scopes[n]={}),t,r)}return s}function getMatch(e,t){if(t[e])return e;let r=e.length;do{const s=e.slice(0,r+1);if(s in t)return s}while(-1!==(r=e.lastIndexOf("/",r-1)))}function applyPackages(e,t){const r=getMatch(e,t);if(r){const s=t[r];if(null===s)return;return s+e.slice(r.length)}}function resolveImportMap(e,t,r){let s=r&&getMatch(r,e.scopes);while(s){const r=applyPackages(t,e.scopes[s]);if(r)return r;s=getMatch(s.slice(0,s.lastIndexOf("/")),e.scopes)}return applyPackages(t,e.imports)||-1!==t.indexOf(":")&&t}function resolveAndComposePackages(e,t,s,a){for(let n in e){const i=resolveIfNotPlainOrUrl(n,s)||n;if((!r||!te)&&t[i]&&t[i]!==e[i])throw Error(`Rejected map override "${i}" from ${t[i]} to ${e[i]}.`);let c=e[n];if("string"!==typeof c)continue;const f=resolveImportMap(a,resolveIfNotPlainOrUrl(c,s)||c,s);f?t[i]=f:console.warn(`Mapping "${n}" -> "${e[n]}" does not resolve`)}}let pe;window.addEventListener("error",(e=>pe=e));function dynamicImportScript(e,{errUrl:t=e}={}){pe=void 0;const r=createBlob(`import*as m from'${e}';self._esmsi=m`);const s=Object.assign(document.createElement("script"),{type:"module",src:r});s.setAttribute("nonce",f);s.setAttribute("noshim","");const a=new Promise(((e,a)=>{s.addEventListener("error",cb);s.addEventListener("load",cb);function cb(n){document.head.removeChild(s);if(self._esmsi){e(self._esmsi,ue);self._esmsi=void 0}else{a(!(n instanceof Event)&&n||pe&&pe.error||new Error(`Error loading or executing the graph of ${t} (check the console for ${r}).`));pe=void 0}}}));document.head.appendChild(s);return a}let be=dynamicImportScript;const he=dynamicImportScript(createBlob("export default u=>import(u)")).then((e=>{e&&(be=e.default);return!!e}),noop);let me=false;let ke=false;let we=false;let ge=false;let ve=false;const ye=Promise.resolve(he).then((e=>{if(e){ve=true;return Promise.all([be(createBlob("import.meta")).then((()=>we=true),noop),ce&&be(createBlob('import"data:text/css,{}"assert{type:"css"}')).then((()=>ke=true),noop),le&&be(createBlob('import"data:text/json,{}"assert{type:"json"}')).then((()=>me=true),noop),HTMLScriptElement.supports?ge=HTMLScriptElement.supports("importmap"):new Promise((e=>{self._$s=r=>{document.head.removeChild(t);r&&(ge=true);delete self._$s;e()};const t=document.createElement("iframe");t.style.display="none";t.setAttribute("nonce",f);t.srcdoc=`<script type=importmap nonce="${f}">{"imports":{"x":"data:text/javascript,"}}<\/script><script nonce="${f}">import('x').then(()=>1,()=>0).then(v=>parent._$s(v))<\/script>`;document.head.appendChild(t)}))])}}));let Se,$e,Le,Oe=2<<19;const Ce=1===new Uint8Array(new Uint16Array([1]).buffer)[0]?function(e,t){const r=e.length;let s=0;for(;s<r;)t[s]=e.charCodeAt(s++)}:function(e,t){const r=e.length;let s=0;for(;s<r;){const r=e.charCodeAt(s);t[s++]=(255&r)<<8|r>>>8}},Ae="xportmportlassetafromssertvoyiedeleinstantyreturdebuggeawaithrwhileforifcatcfinallels";let Me,Ue,Ie;function parse(e,t="@"){Me=e,Ue=t;const r=2*Me.length+(2<<18);if(r>Oe||!Se){for(;r>Oe;)Oe*=2;$e=new ArrayBuffer(Oe),Ce(Ae,new Uint16Array($e,16,85)),Se=function(e,t,r){"use asm";var s=new e.Int8Array(r),a=new e.Int16Array(r),n=new e.Int32Array(r),i=new e.Uint8Array(r),c=new e.Uint16Array(r),f=992;function b(e){e=e|0;var t=0,r=0,i=0,te=0,re=0,se=0,ae=0;ae=f;f=f+11520|0;re=ae+2048|0;s[763]=1;a[377]=0;a[378]=0;a[379]=0;a[380]=-1;n[57]=n[2];s[764]=0;n[56]=0;s[762]=0;n[58]=ae+10496;n[59]=ae+2304;n[60]=ae;s[765]=0;e=(n[3]|0)+-2|0;n[61]=e;t=e+(n[54]<<1)|0;n[62]=t;e:while(1){r=e+2|0;n[61]=r;if(e>>>0>=t>>>0){te=18;break}t:do{switch(a[r>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if((((a[379]|0)==0?D(r)|0:0)?(m(e+4|0,16,10)|0)==0:0)?(k(),(s[763]|0)==0):0){te=9;break e}else te=17;break}case 105:{if(D(r)|0?(m(e+4|0,26,10)|0)==0:0){l();te=17}else te=17;break}case 59:{te=17;break}case 47:switch(a[e+4>>1]|0){case 47:{j();break t}case 42:{y(1);break t}default:{te=16;break e}}default:{te=16;break e}}}while(0);if((te|0)==17){te=0;n[57]=n[61]}e=n[61]|0;t=n[62]|0}if((te|0)==9){e=n[61]|0;n[57]=e;te=19}else if((te|0)==16){s[763]=0;n[61]=e;te=19}else if((te|0)==18)if(!(s[762]|0)){e=r;te=19}else e=0;do{if((te|0)==19){e:while(1){t=e+2|0;n[61]=t;i=t;if(e>>>0>=(n[62]|0)>>>0){te=75;break}t:do{switch(a[t>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if(((a[379]|0)==0?D(t)|0:0)?(m(e+4|0,16,10)|0)==0:0){k();te=74}else te=74;break}case 105:{if(D(t)|0?(m(e+4|0,26,10)|0)==0:0){l();te=74}else te=74;break}case 99:{if((D(t)|0?(m(e+4|0,36,8)|0)==0:0)?M(a[e+12>>1]|0)|0:0){s[765]=1;te=74}else te=74;break}case 40:{r=n[57]|0;i=n[59]|0;te=a[379]|0;a[379]=te+1<<16>>16;n[i+((te&65535)<<2)>>2]=r;te=74;break}case 41:{t=a[379]|0;if(!(t<<16>>16)){te=36;break e}t=t+-1<<16>>16;a[379]=t;r=a[378]|0;if(r<<16>>16!=0?(se=n[(n[60]|0)+((r&65535)+-1<<2)>>2]|0,(n[se+20>>2]|0)==(n[(n[59]|0)+((t&65535)<<2)>>2]|0)):0){t=se+4|0;if(!(n[t>>2]|0))n[t>>2]=i;n[se+12>>2]=e+4;a[378]=r+-1<<16>>16;te=74}else te=74;break}case 123:{te=n[57]|0;i=n[51]|0;e=te;do{if((a[te>>1]|0)==41&(i|0)!=0?(n[i+4>>2]|0)==(te|0):0){t=n[52]|0;n[51]=t;if(!t){n[47]=0;break}else{n[t+28>>2]=0;break}}}while(0);r=a[379]|0;te=r&65535;s[re+te>>0]=s[765]|0;s[765]=0;i=n[59]|0;a[379]=r+1<<16>>16;n[i+(te<<2)>>2]=e;te=74;break}case 125:{e=a[379]|0;if(!(e<<16>>16)){te=49;break e}r=e+-1<<16>>16;a[379]=r;t=a[380]|0;if(e<<16>>16!=t<<16>>16)if(t<<16>>16!=-1&(r&65535)<(t&65535)){te=53;break e}else{te=74;break t}else{i=n[58]|0;te=(a[377]|0)+-1<<16>>16;a[377]=te;a[380]=a[i+((te&65535)<<1)>>1]|0;h();te=74;break t}}case 39:{d(39);te=74;break}case 34:{d(34);te=74;break}case 47:switch(a[e+4>>1]|0){case 47:{j();break t}case 42:{y(1);break t}default:{t=n[57]|0;r=a[t>>1]|0;r:do{if(!(U(r)|0)){switch(r<<16>>16){case 41:if(q(n[(n[59]|0)+(c[379]<<2)>>2]|0)|0){te=71;break r}else{te=68;break r}case 125:break;default:{te=68;break r}}e=c[379]|0;if(!(p(n[(n[59]|0)+(e<<2)>>2]|0)|0)?(s[re+e>>0]|0)==0:0)te=68;else te=71}else switch(r<<16>>16){case 46:if(((a[t+-2>>1]|0)+-48&65535)<10){te=68;break r}else{te=71;break r}case 43:if((a[t+-2>>1]|0)==43){te=68;break r}else{te=71;break r}case 45:if((a[t+-2>>1]|0)==45){te=68;break r}else{te=71;break r}default:{te=71;break r}}}while(0);r:do{if((te|0)==68){te=0;if(!(o(t)|0)){switch(r<<16>>16){case 0:{te=71;break r}case 47:break;default:{e=1;break r}}if(!(s[764]|0))e=1;else te=71}else te=71}}while(0);if((te|0)==71){g();e=0}s[764]=e;te=74;break t}}case 96:{h();te=74;break}default:te=74}}while(0);if((te|0)==74){te=0;n[57]=n[61]}e=n[61]|0}if((te|0)==36){L();e=0;break}else if((te|0)==49){L();e=0;break}else if((te|0)==53){L();e=0;break}else if((te|0)==75){e=(a[380]|0)==-1&(a[379]|0)==0&(s[762]|0)==0&(a[378]|0)==0;break}}}while(0);f=ae;return e|0}function k(){var e=0,t=0,r=0,i=0,c=0,f=0;c=n[61]|0;f=c+12|0;n[61]=f;t=w(1)|0;e=n[61]|0;if(!((e|0)==(f|0)?!(I(t)|0):0))i=3;e:do{if((i|0)==3){t:do{switch(t<<16>>16){case 100:{B(e,e+14|0);break e}case 97:{n[61]=e+10;w(1)|0;e=n[61]|0;i=6;break}case 102:{i=6;break}case 99:{if((m(e+2|0,36,8)|0)==0?(r=e+10|0,$(a[r>>1]|0)|0):0){n[61]=r;c=w(1)|0;f=n[61]|0;E(c)|0;B(f,n[61]|0);n[61]=(n[61]|0)+-2;break e}e=e+4|0;n[61]=e;i=13;break}case 108:case 118:{i=13;break}case 123:{n[61]=e+2;e=w(1)|0;r=n[61]|0;while(1){if(N(e)|0){d(e);e=(n[61]|0)+2|0;n[61]=e}else{E(e)|0;e=n[61]|0}w(1)|0;e=C(r,e)|0;if(e<<16>>16==44){n[61]=(n[61]|0)+2;e=w(1)|0}t=r;r=n[61]|0;if(e<<16>>16==125){i=32;break}if((r|0)==(t|0)){i=29;break}if(r>>>0>(n[62]|0)>>>0){i=31;break}}if((i|0)==29){L();break e}else if((i|0)==31){L();break e}else if((i|0)==32){n[61]=r+2;i=34;break t}break}case 42:{n[61]=e+2;w(1)|0;i=n[61]|0;C(i,i)|0;i=34;break}default:{}}}while(0);if((i|0)==6){n[61]=e+16;e=w(1)|0;if(e<<16>>16==42){n[61]=(n[61]|0)+2;e=w(1)|0}f=n[61]|0;E(e)|0;B(f,n[61]|0);n[61]=(n[61]|0)+-2;break}else if((i|0)==13){e=e+4|0;n[61]=e;s[763]=0;t:while(1){n[61]=e+2;f=w(1)|0;e=n[61]|0;switch((E(f)|0)<<16>>16){case 91:case 123:{i=15;break t}default:{}}t=n[61]|0;if((t|0)==(e|0))break e;B(e,t);switch((w(1)|0)<<16>>16){case 61:{i=19;break t}case 44:break;default:{i=20;break t}}e=n[61]|0}if((i|0)==15){n[61]=(n[61]|0)+-2;break}else if((i|0)==19){n[61]=(n[61]|0)+-2;break}else if((i|0)==20){n[61]=(n[61]|0)+-2;break}}else if((i|0)==34)t=w(1)|0;e=n[61]|0;if(t<<16>>16==102?(m(e+2|0,52,6)|0)==0:0){n[61]=e+8;u(c,w(1)|0);break}n[61]=e+-2}}while(0);return}function l(){var e=0,t=0,r=0,i=0,c=0;c=n[61]|0;t=c+12|0;n[61]=t;e:do{switch((w(1)|0)<<16>>16){case 40:{e=n[61]|0;t=n[59]|0;r=a[379]|0;a[379]=r+1<<16>>16;n[t+((r&65535)<<2)>>2]=e;if((a[n[57]>>1]|0)!=46){e=n[61]|0;n[61]=e+2;r=w(1)|0;v(c,n[61]|0,0,e);e=n[51]|0;t=n[60]|0;c=a[378]|0;a[378]=c+1<<16>>16;n[t+((c&65535)<<2)>>2]=e;switch(r<<16>>16){case 39:{d(39);break}case 34:{d(34);break}default:{n[61]=(n[61]|0)+-2;break e}}e=(n[61]|0)+2|0;n[61]=e;switch((w(1)|0)<<16>>16){case 44:{n[61]=(n[61]|0)+2;w(1)|0;r=n[51]|0;n[r+4>>2]=e;c=n[61]|0;n[r+16>>2]=c;s[r+24>>0]=1;n[61]=c+-2;break e}case 41:{a[379]=(a[379]|0)+-1<<16>>16;c=n[51]|0;n[c+4>>2]=e;n[c+12>>2]=(n[61]|0)+2;s[c+24>>0]=1;a[378]=(a[378]|0)+-1<<16>>16;break e}default:{n[61]=(n[61]|0)+-2;break e}}}break}case 46:{n[61]=(n[61]|0)+2;if(((w(1)|0)<<16>>16==109?(e=n[61]|0,(m(e+2|0,44,6)|0)==0):0)?(a[n[57]>>1]|0)!=46:0)v(c,c,e+8|0,2);break}case 42:case 39:case 34:{i=16;break}case 123:{e=n[61]|0;if(a[379]|0){n[61]=e+-2;break e}while(1){if(e>>>0>=(n[62]|0)>>>0)break;e=w(1)|0;if(!(N(e)|0)){if(e<<16>>16==125){i=31;break}}else d(e);e=(n[61]|0)+2|0;n[61]=e}if((i|0)==31)n[61]=(n[61]|0)+2;w(1)|0;e=n[61]|0;if(m(e,50,8)|0){L();break e}n[61]=e+8;e=w(1)|0;if(N(e)|0){u(c,e);break e}else{L();break e}}default:if((n[61]|0)!=(t|0))i=16}}while(0);do{if((i|0)==16){if(a[379]|0){n[61]=(n[61]|0)+-2;break}e=n[62]|0;t=n[61]|0;while(1){if(t>>>0>=e>>>0){i=23;break}r=a[t>>1]|0;if(N(r)|0){i=21;break}i=t+2|0;n[61]=i;t=i}if((i|0)==21){u(c,r);break}else if((i|0)==23){L();break}}}while(0);return}function u(e,t){e=e|0;t=t|0;var r=0,s=0;r=(n[61]|0)+2|0;switch(t<<16>>16){case 39:{d(39);s=5;break}case 34:{d(34);s=5;break}default:L()}do{if((s|0)==5){v(e,r,n[61]|0,1);n[61]=(n[61]|0)+2;s=(w(0)|0)<<16>>16==97;t=n[61]|0;if(s?(m(t+2|0,58,10)|0)==0:0){n[61]=t+12;if((w(1)|0)<<16>>16!=123){n[61]=t;break}e=n[61]|0;r=e;e:while(1){n[61]=r+2;r=w(1)|0;switch(r<<16>>16){case 39:{d(39);n[61]=(n[61]|0)+2;r=w(1)|0;break}case 34:{d(34);n[61]=(n[61]|0)+2;r=w(1)|0;break}default:r=E(r)|0}if(r<<16>>16!=58){s=16;break}n[61]=(n[61]|0)+2;switch((w(1)|0)<<16>>16){case 39:{d(39);break}case 34:{d(34);break}default:{s=20;break e}}n[61]=(n[61]|0)+2;switch((w(1)|0)<<16>>16){case 125:{s=25;break e}case 44:break;default:{s=24;break e}}n[61]=(n[61]|0)+2;if((w(1)|0)<<16>>16==125){s=25;break}r=n[61]|0}if((s|0)==16){n[61]=t;break}else if((s|0)==20){n[61]=t;break}else if((s|0)==24){n[61]=t;break}else if((s|0)==25){s=n[51]|0;n[s+16>>2]=e;n[s+12>>2]=(n[61]|0)+2;break}}n[61]=t+-2}}while(0);return}function o(e){e=e|0;e:do{switch(a[e>>1]|0){case 100:switch(a[e+-2>>1]|0){case 105:{e=S(e+-4|0,68,2)|0;break e}case 108:{e=S(e+-4|0,72,3)|0;break e}default:{e=0;break e}}case 101:{switch(a[e+-2>>1]|0){case 115:break;case 116:{e=S(e+-4|0,78,4)|0;break e}default:{e=0;break e}}switch(a[e+-4>>1]|0){case 108:{e=O(e+-6|0,101)|0;break e}case 97:{e=O(e+-6|0,99)|0;break e}default:{e=0;break e}}}case 102:{if((a[e+-2>>1]|0)==111?(a[e+-4>>1]|0)==101:0)switch(a[e+-6>>1]|0){case 99:{e=S(e+-8|0,86,6)|0;break e}case 112:{e=S(e+-8|0,98,2)|0;break e}default:{e=0;break e}}else e=0;break}case 110:{e=e+-2|0;if(O(e,105)|0)e=1;else e=S(e,102,5)|0;break}case 111:{e=O(e+-2|0,100)|0;break}case 114:{e=S(e+-2|0,112,7)|0;break}case 116:{e=S(e+-2|0,126,4)|0;break}case 119:switch(a[e+-2>>1]|0){case 101:{e=O(e+-4|0,110)|0;break e}case 111:{e=S(e+-4|0,134,3)|0;break e}default:{e=0;break e}}default:e=0}}while(0);return e|0}function h(){var e=0,t=0,r=0;t=n[62]|0;r=n[61]|0;e:while(1){e=r+2|0;if(r>>>0>=t>>>0){t=8;break}switch(a[e>>1]|0){case 96:{t=9;break e}case 36:{if((a[r+4>>1]|0)==123){t=6;break e}break}case 92:{e=r+4|0;break}default:{}}r=e}if((t|0)==6){n[61]=r+4;e=a[380]|0;t=n[58]|0;r=a[377]|0;a[377]=r+1<<16>>16;a[t+((r&65535)<<1)>>1]=e;r=(a[379]|0)+1<<16>>16;a[379]=r;a[380]=r}else if((t|0)==8){n[61]=e;L()}else if((t|0)==9)n[61]=e;return}function w(e){e=e|0;var t=0,r=0,s=0;r=n[61]|0;e:do{t=a[r>>1]|0;t:do{if(t<<16>>16!=47)if(e)if(M(t)|0)break;else break e;else if(z(t)|0)break;else break e;else switch(a[r+2>>1]|0){case 47:{j();break t}case 42:{y(e);break t}default:{t=47;break e}}}while(0);s=n[61]|0;r=s+2|0;n[61]=r}while(s>>>0<(n[62]|0)>>>0);return t|0}function d(e){e=e|0;var t=0,r=0,s=0,i=0;i=n[62]|0;t=n[61]|0;while(1){s=t+2|0;if(t>>>0>=i>>>0){t=9;break}r=a[s>>1]|0;if(r<<16>>16==e<<16>>16){t=10;break}if(r<<16>>16==92){r=t+4|0;if((a[r>>1]|0)==13){t=t+6|0;t=(a[t>>1]|0)==10?t:r}else t=r}else if(T(r)|0){t=9;break}else t=s}if((t|0)==9){n[61]=s;L()}else if((t|0)==10)n[61]=s;return}function v(e,t,r,a){e=e|0;t=t|0;r=r|0;a=a|0;var i=0,c=0;i=n[55]|0;n[55]=i+32;c=n[51]|0;n[((c|0)==0?188:c+28|0)>>2]=i;n[52]=c;n[51]=i;n[i+8>>2]=e;if(2==(a|0))e=r;else e=1==(a|0)?r+2|0:0;n[i+12>>2]=e;n[i>>2]=t;n[i+4>>2]=r;n[i+16>>2]=0;n[i+20>>2]=a;s[i+24>>0]=1==(a|0)&1;n[i+28>>2]=0;return}function A(){var e=0,t=0,r=0;r=n[62]|0;t=n[61]|0;e:while(1){e=t+2|0;if(t>>>0>=r>>>0){t=6;break}switch(a[e>>1]|0){case 13:case 10:{t=6;break e}case 93:{t=7;break e}case 92:{e=t+4|0;break}default:{}}t=e}if((t|0)==6){n[61]=e;L();e=0}else if((t|0)==7){n[61]=e;e=93}return e|0}function C(e,t){e=e|0;t=t|0;var r=0,s=0;r=n[61]|0;s=a[r>>1]|0;if(s<<16>>16==97){n[61]=r+4;r=w(1)|0;e=n[61]|0;if(N(r)|0){d(r);t=(n[61]|0)+2|0;n[61]=t}else{E(r)|0;t=n[61]|0}s=w(1)|0;r=n[61]|0}if((r|0)!=(e|0))B(e,t);return s|0}function g(){var e=0,t=0,r=0;e:while(1){e=n[61]|0;t=e+2|0;n[61]=t;if(e>>>0>=(n[62]|0)>>>0){r=7;break}switch(a[t>>1]|0){case 13:case 10:{r=7;break e}case 47:break e;case 91:{A()|0;break}case 92:{n[61]=e+4;break}default:{}}}if((r|0)==7)L();return}function p(e){e=e|0;switch(a[e>>1]|0){case 62:{e=(a[e+-2>>1]|0)==61;break}case 41:case 59:{e=1;break}case 104:{e=S(e+-2|0,160,4)|0;break}case 121:{e=S(e+-2|0,168,6)|0;break}case 101:{e=S(e+-2|0,180,3)|0;break}default:e=0}return e|0}function y(e){e=e|0;var t=0,r=0,s=0,i=0,c=0;i=(n[61]|0)+2|0;n[61]=i;r=n[62]|0;while(1){t=i+2|0;if(i>>>0>=r>>>0)break;s=a[t>>1]|0;if(!e?T(s)|0:0)break;if(s<<16>>16==42?(a[i+4>>1]|0)==47:0){c=8;break}i=t}if((c|0)==8){n[61]=t;t=i+4|0}n[61]=t;return}function m(e,t,r){e=e|0;t=t|0;r=r|0;var a=0,n=0;e:do{if(!r)e=0;else{while(1){a=s[e>>0]|0;n=s[t>>0]|0;if(a<<24>>24!=n<<24>>24)break;r=r+-1|0;if(!r){e=0;break e}else{e=e+1|0;t=t+1|0}}e=(a&255)-(n&255)|0}}while(0);return e|0}function I(e){e=e|0;e:do{switch(e<<16>>16){case 38:case 37:case 33:{e=1;break}default:if((e&-8)<<16>>16==40|(e+-58&65535)<6)e=1;else{switch(e<<16>>16){case 91:case 93:case 94:{e=1;break e}default:{}}e=(e+-123&65535)<4}}}while(0);return e|0}function U(e){e=e|0;e:do{switch(e<<16>>16){case 38:case 37:case 33:break;default:if(!((e+-58&65535)<6|(e+-40&65535)<7&e<<16>>16!=41)){switch(e<<16>>16){case 91:case 94:break e;default:{}}return e<<16>>16!=125&(e+-123&65535)<4|0}}}while(0);return 1}function x(e){e=e|0;var t=0,r=0,s=0,i=0;r=f;f=f+16|0;s=r;n[s>>2]=0;n[54]=e;t=n[3]|0;i=t+(e<<1)|0;e=i+2|0;a[i>>1]=0;n[s>>2]=e;n[55]=e;n[47]=0;n[51]=0;n[49]=0;n[48]=0;n[53]=0;n[50]=0;f=r;return t|0}function S(e,t,r){e=e|0;t=t|0;r=r|0;var s=0,i=0;s=e+(0-r<<1)|0;i=s+2|0;e=n[3]|0;if(i>>>0>=e>>>0?(m(i,t,r<<1)|0)==0:0)if((i|0)==(e|0))e=1;else e=$(a[s>>1]|0)|0;else e=0;return e|0}function O(e,t){e=e|0;t=t|0;var r=0;r=n[3]|0;if(r>>>0<=e>>>0?(a[e>>1]|0)==t<<16>>16:0)if((r|0)==(e|0))r=1;else r=$(a[e+-2>>1]|0)|0;else r=0;return r|0}function $(e){e=e|0;e:do{if((e+-9&65535)<5)e=1;else{switch(e<<16>>16){case 32:case 160:{e=1;break e}default:{}}e=e<<16>>16!=46&(I(e)|0)}}while(0);return e|0}function j(){var e=0,t=0,r=0;e=n[62]|0;r=n[61]|0;e:while(1){t=r+2|0;if(r>>>0>=e>>>0)break;switch(a[t>>1]|0){case 13:case 10:break e;default:r=t}}n[61]=t;return}function B(e,t){e=e|0;t=t|0;var r=0,s=0;r=n[55]|0;n[55]=r+12;s=n[53]|0;n[((s|0)==0?192:s+8|0)>>2]=r;n[53]=r;n[r>>2]=e;n[r+4>>2]=t;n[r+8>>2]=0;return}function E(e){e=e|0;while(1){if(M(e)|0)break;if(I(e)|0)break;e=(n[61]|0)+2|0;n[61]=e;e=a[e>>1]|0;if(!(e<<16>>16)){e=0;break}}return e|0}function P(){var e=0;e=n[(n[49]|0)+20>>2]|0;switch(e|0){case 1:{e=-1;break}case 2:{e=-2;break}default:e=e-(n[3]|0)>>1}return e|0}function q(e){e=e|0;if(!(S(e,140,5)|0)?!(S(e,150,3)|0):0)e=S(e,156,2)|0;else e=1;return e|0}function z(e){e=e|0;switch(e<<16>>16){case 160:case 32:case 12:case 11:case 9:{e=1;break}default:e=0}return e|0}function D(e){e=e|0;if((n[3]|0)==(e|0))e=1;else e=$(a[e+-2>>1]|0)|0;return e|0}function F(){var e=0;e=n[(n[49]|0)+12>>2]|0;if(!e)e=-1;else e=e-(n[3]|0)>>1;return e|0}function G(){var e=0;e=n[(n[49]|0)+16>>2]|0;if(!e)e=-1;else e=e-(n[3]|0)>>1;return e|0}function H(){var e=0;e=n[(n[49]|0)+4>>2]|0;if(!e)e=-1;else e=e-(n[3]|0)>>1;return e|0}function J(){var e=0;e=n[49]|0;e=n[((e|0)==0?188:e+28|0)>>2]|0;n[49]=e;return(e|0)!=0|0}function K(){var e=0;e=n[50]|0;e=n[((e|0)==0?192:e+8|0)>>2]|0;n[50]=e;return(e|0)!=0|0}function L(){s[762]=1;n[56]=(n[61]|0)-(n[3]|0)>>1;n[61]=(n[62]|0)+2;return}function M(e){e=e|0;return(e|128)<<16>>16==160|(e+-9&65535)<5|0}function N(e){e=e|0;return e<<16>>16==39|e<<16>>16==34|0}function Q(){return(n[(n[49]|0)+8>>2]|0)-(n[3]|0)>>1|0}function R(){return(n[(n[50]|0)+4>>2]|0)-(n[3]|0)>>1|0}function T(e){e=e|0;return e<<16>>16==13|e<<16>>16==10|0}function V(){return(n[n[49]>>2]|0)-(n[3]|0)>>1|0}function W(){return(n[n[50]>>2]|0)-(n[3]|0)>>1|0}function X(){return i[(n[49]|0)+24>>0]|0|0}function Y(e){e=e|0;n[3]=e;return}function Z(){return(s[763]|0)!=0|0}function _(){return n[56]|0}function ee(e){e=e|0;f=e+992+15&-16;return 992}return{su:ee,ai:G,e:_,ee:R,es:W,f:Z,id:P,ie:H,ip:X,is:V,p:b,re:K,ri:J,sa:x,se:F,ses:Y,ss:Q}}("undefined"!=typeof self?self:global,{},$e),Le=Se.su(Oe-(2<<17))}const s=Me.length+1;Se.ses(Le),Se.sa(s-1),Ce(Me,new Uint16Array($e,Le,s)),Se.p()||(Ie=Se.e(),o());const a=[],n=[];for(;Se.ri();){const e=Se.is(),t=Se.ie(),r=Se.ai(),s=Se.id(),n=Se.ss(),i=Se.se();let c;Se.ip()&&(c=b(-1===s?e:e+1,Me.charCodeAt(-1===s?e-1:e))),a.push({n:c,s:e,e:t,ss:n,se:i,d:s,a:r})}for(;Se.re();){const e=Se.es(),t=Me.charCodeAt(e);n.push(34===t||39===t?b(e+1,t):Me.slice(Se.es(),Se.ee()))}return[a,n,!!Se.f()]}function b(e,t){Ie=e;let r="",s=Ie;for(;;){Ie>=Me.length&&o();const e=Me.charCodeAt(Ie);if(e===t)break;92===e?(r+=Me.slice(s,Ie),r+=k(),s=Ie):(8232===e||8233===e||u(e)&&o(),++Ie)}return r+=Me.slice(s,Ie++),r}function k(){let e=Me.charCodeAt(++Ie);switch(++Ie,e){case 110:return"\n";case 114:return"\r";case 120:return String.fromCharCode(l(2));case 117:return function(){let e;123===Me.charCodeAt(Ie)?(++Ie,e=l(Me.indexOf("}",Ie)-Ie),++Ie,e>1114111&&o()):e=l(4);return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}();case 116:return"\t";case 98:return"\b";case 118:return"\v";case 102:return"\f";case 13:10===Me.charCodeAt(Ie)&&++Ie;case 10:return"";case 56:case 57:o();default:if(e>=48&&e<=55){let t=Me.substr(Ie-1,3).match(/^[0-7]+/)[0],r=parseInt(t,8);return r>255&&(t=t.slice(0,-1),r=parseInt(t,8)),Ie+=t.length-1,e=Me.charCodeAt(Ie),"0"===t&&56!==e&&57!==e||o(),String.fromCharCode(r)}return u(e)?"":String.fromCharCode(e)}}function l(e){const t=Ie;let r=0,s=0;for(let t=0;t<e;++t,++Ie){let e,a=Me.charCodeAt(Ie);if(95!==a){if(a>=97)e=a-97+10;else if(a>=65)e=a-65+10;else{if(!(a>=48&&a<=57))break;e=a-48}if(e>=16)break;s=a,r=16*r+e}else 95!==s&&0!==t||o(),s=a}return 95!==s&&Ie-t===e||o(),r}function u(e){return 13===e||10===e}function o(){throw Object.assign(Error(`Parse error ${Ue}:${Me.slice(0,Ie).split("\n").length}:${Ie-Me.lastIndexOf("\n",Ie-1)}`),{idx:Ie})}async function _resolve(e,t){const r=resolveIfNotPlainOrUrl(e,t);return{r:resolveImportMap(xe,r||e,t)||throwUnresolved(e,t),b:!r&&!isURL(e)}}const Ee=a?async(e,t)=>{let r=a(e,t,defaultResolve);r&&r.then&&(r=await r);return r?{r:r,b:!resolveIfNotPlainOrUrl(e,t)&&!isURL(e)}:_resolve(e,t)}:_resolve;async function importShim(e,...t){let a=t[t.length-1];"string"!==typeof a&&(a=ue);await Ne;s&&await s(e,"string"!==typeof t[1]?t[1]:{},a);if(Be||r||!Re){processImportMaps();r||(Be=false)}await _e;return topLevelLoad((await Ee(e,a)).r,{credentials:"same-origin"})}self.importShim=importShim;function defaultResolve(e,t){return resolveImportMap(xe,resolveIfNotPlainOrUrl(e,t)||e,t)||throwUnresolved(e,t)}function throwUnresolved(e,t){throw Error(`Unable to resolve specifier '${e}'${fromParent(t)}`)}const resolveSync=(e,t=ue)=>{t=`${t}`;const r=a&&a(e,t,defaultResolve);return r&&!r.then?r:defaultResolve(e,t)};function metaResolve(e,t=this.url){return resolveSync(e,t)}importShim.resolve=resolveSync;importShim.getImportMap=()=>JSON.parse(JSON.stringify(xe));const Pe=importShim._r={};async function loadAll(e,t){if(!e.b&&!t[e.u]){t[e.u]=1;await e.L;await Promise.all(e.d.map((e=>loadAll(e,t))));e.n||(e.n=e.d.some((e=>e.n)))}}let xe={imports:{},scopes:{}};let je=false;let Re;const Ne=ye.then((()=>{if(!r)if(document.querySelectorAll("script[type=module-shim],script[type=importmap-shim],link[rel=modulepreload-shim]").length)setShimMode();else{let e=false;for(const s of document.querySelectorAll("script[type=module],script[type=importmap]"))if(e){if("importmap"===s.type){je=true;break}}else"module"===s.type&&(e=true)}Re=true!==t.polyfillEnable&&ve&&we&&ge&&(!le||me)&&(!ce||ke)&&!je&&true;if(!ge){const a=HTMLScriptElement.supports||(e=>"classic"===e||"module"===e);HTMLScriptElement.supports=e=>"importmap"===e||a(e)}if(!r&&Re);else{new MutationObserver((e=>{for(const t of e)if("childList"===t.type)for(const e of t.addedNodes)if("SCRIPT"===e.tagName){e.type===(r?"module-shim":"module")&&processScript(e);e.type===(r?"importmap-shim":"importmap")&&processImportMap(e)}else"LINK"===e.tagName&&e.rel===(r?"modulepreload-shim":"modulepreload")&&processPreload(e)})).observe(document,{childList:true,subtree:true});processImportMaps();processScriptsAndPreloads();if("complete"===document.readyState)readyStateCompleteCheck();else{async function readyListener(){await Ne;processImportMaps();if("complete"===document.readyState){readyStateCompleteCheck();document.removeEventListener("readystatechange",readyListener)}}document.addEventListener("readystatechange",readyListener)}}}));let _e=Ne;let Te=true;let Be=true;async function topLevelLoad(e,t,a,n,i){r||(Be=false);await _e;s&&await s(id,"string"!==typeof args[1]?args[1]:{},parentUrl);if(!r&&Re){if(n)return null;await i;return be(a?createBlob(a):e,{errUrl:e||a})}const c=getOrCreateLoad(e,t,null,a);const f={};await loadAll(c,f);He=void 0;resolveDeps(c,f);await i;if(a&&!r&&!c.n&&true){const e=await be(createBlob(a),{errUrl:a});ae&&revokeObjectURLs(Object.keys(f));return e}if(Te&&!r&&c.n&&n){se();Te=false}const te=await be(r||c.n||!n?c.b:c.u,{errUrl:c.u});c.s&&(await be(c.s)).u$_(te);ae&&revokeObjectURLs(Object.keys(f));return te}function revokeObjectURLs(e){let t=0;const r=e.length;const s=self.requestIdleCallback?self.requestIdleCallback:self.requestAnimationFrame;s(cleanup);function cleanup(){const a=100*t;if(!(a>r)){for(const t of e.slice(a,a+100)){const e=Pe[t];e&&URL.revokeObjectURL(e.b)}t++;s(cleanup)}}}function urlJsString(e){return`'${e.replace(/'/g,"\\'")}'`}let He;function resolveDeps(e,t){if(e.b||!t[e.u])return;t[e.u]=0;for(const c of e.d)resolveDeps(c,t);const[r]=e.a;const s=e.S;let a=fe&&He?`import '${He}';`:"";if(r.length){let f=0,te=0,re=[];function pushStringTo(t){while(re[re.length-1]<t){const t=re.pop();a+=`${s.slice(f,t)}, ${urlJsString(e.r)}`;f=t}a+=s.slice(f,t);f=t}for(const{s:se,ss:ae,se:ne,d:ie}of r)if(-1===ie){let oe=e.d[te++],ce=oe.b,le=!ce;le&&((ce=oe.s)||(ce=oe.s=createBlob(`export function u$_(m){${oe.a[1].map((e=>"default"===e?"d$_=m.default":`${e}=m.${e}`)).join(",")}}${oe.a[1].map((e=>"default"===e?"let d$_;export{d$_ as default}":`export let ${e}`)).join(";")}\n//# sourceURL=${oe.r}?cycle`)));pushStringTo(se-1);a+=`/*${s.slice(se-1,ne)}*/${urlJsString(ce)}`;if(!le&&oe.s){a+=`;import*as m$_${te} from'${oe.b}';import{u$_ as u$_${te}}from'${oe.s}';u$_${te}(m$_${te})`;oe.s=void 0}f=ne}else if(-2===ie){e.m={url:e.r,resolve:metaResolve};i(e.m,e.u);pushStringTo(se);a+=`importShim._r[${urlJsString(e.u)}].m`;f=ne}else{pushStringTo(ae+6);a+="Shim(";re.push(ne-1);f=se}pushStringTo(s.length)}else a+=s;let n=false;a=a.replace(Fe,((t,r,s)=>(n=!r,t.replace(s,(()=>new URL(s,e.r))))));n||(a+="\n//# sourceURL="+e.r);e.b=He=createBlob(a);e.S=void 0}const Fe=/\n\/\/# source(Mapping)?URL=([^\n]+)\s*((;|\/\/[^#][^\n]*)\s*)*$/;const qe=/^(text|application)\/(x-)?javascript(;|$)/;const De=/^(text|application)\/json(;|$)/;const Je=/^(text|application)\/css(;|$)/;const Ke=/url\(\s*(?:(["'])((?:\\.|[^\n\\"'])+)\1|((?:\\.|[^\s,"'()\\])+))\s*\)/g;let ze=[];let Ge=0;function pushFetchPool(){if(++Ge>100)return new Promise((e=>ze.push(e)))}function popFetchPool(){Ge--;ze.length&&ze.shift()()}async function doFetch(e,t,r){if(ie&&!t.integrity)throw Error(`No integrity for ${e}${fromParent(r)}.`);const s=pushFetchPool();s&&await s;try{var a=await n(e,t)}catch(t){t.message=`Unable to fetch ${e}${fromParent(r)} - see network log for details.\n`+t.message;throw t}finally{popFetchPool()}if(!a.ok)throw Error(`${a.status} ${a.statusText} ${a.url}${fromParent(r)}`);return a}async function fetchModule(e,t,r){const s=await doFetch(e,t,r);const a=s.headers.get("content-type");if(qe.test(a))return{r:s.url,s:await s.text(),t:"js"};if(De.test(a))return{r:s.url,s:`export default ${await s.text()}`,t:"json"};if(Je.test(a))return{r:s.url,s:`var s=new CSSStyleSheet();s.replaceSync(${JSON.stringify((await s.text()).replace(Ke,((t,r="",s,a)=>`url(${r}${resolveUrl(s||a,e)}${r})`)))});export default s;`,t:"css"};throw Error(`Unsupported Content-Type "${a}" loading ${e}${fromParent(r)}. Modules must be served with a valid MIME type like application/javascript.`)}function getOrCreateLoad(e,t,s,a){let n=Pe[e];if(n&&!a)return n;n={u:e,r:a?e:void 0,f:void 0,S:void 0,L:void 0,a:void 0,d:void 0,b:void 0,s:void 0,n:false,t:null,m:null};if(Pe[e]){let e=0;while(Pe[n.u+ ++e]);n.u+=e}Pe[n.u]=n;n.f=(async()=>{if(!a){let i;({r:n.r,s:a,t:i}=await(Xe[e]||fetchModule(e,t,s)));if(i&&!r){if("css"===i&&!ce||"json"===i&&!le)throw Error(`${i}-modules require <script type="esms-options">{ "polyfillEnable": ["${i}-modules"] }<\/script>`);("css"===i&&!ke||"json"===i&&!me)&&(n.n=true)}}try{n.a=parse(a,n.u)}catch(e){throwError(e);n.a=[[],[],false]}n.S=a;return n})();n.L=n.f.then((async()=>{let e=t;n.d=(await Promise.all(n.a[0].map((async({n:t,d:r})=>{(r>=0&&!ve||2===r&&!we)&&(n.n=true);if(-1!==r||!t)return;const{r:s,b:a}=await Ee(t,n.r||n.u);!a||ge&&!je||(n.n=true);if(c&&c.test(s))return{b:s};e.integrity&&(e=Object.assign({},e,{integrity:void 0}));return getOrCreateLoad(s,e,n.r).f})))).filter((e=>e))}));return n}function processScriptsAndPreloads(){for(const e of document.querySelectorAll(r?"script[type=module-shim]":"script[type=module]"))processScript(e);for(const e of document.querySelectorAll(r?"link[rel=modulepreload-shim]":"link[rel=modulepreload]"))processPreload(e)}function processImportMaps(){for(const e of document.querySelectorAll(r?'script[type="importmap-shim"]':'script[type="importmap"]'))processImportMap(e)}function getFetchOpts(e){const t={};e.integrity&&(t.integrity=e.integrity);e.referrerpolicy&&(t.referrerPolicy=e.referrerpolicy);"use-credentials"===e.crossorigin?t.credentials="include":"anonymous"===e.crossorigin?t.credentials="omit":t.credentials="same-origin";return t}let Qe=Promise.resolve();let Ve=1;function domContentLoadedCheck(){0!==--Ve||ne||document.dispatchEvent(new Event("DOMContentLoaded"))}document.addEventListener("DOMContentLoaded",(async()=>{await Ne;domContentLoadedCheck();if(r||!Re){processImportMaps();processScriptsAndPreloads()}}));let We=1;function readyStateCompleteCheck(){0!==--We||ne||document.dispatchEvent(new Event("readystatechange"))}function processImportMap(e){if(!e.ep&&(e.src||e.innerHTML)){e.ep=true;if(e.src){if(!r)return;je=true}if(Be){_e=_e.then((async()=>{xe=resolveAndComposeImportMap(e.src?await(await doFetch(e.src,getFetchOpts(e))).json():JSON.parse(e.innerHTML),e.src||ue,xe)})).catch(throwError);r||(Be=false)}}}function processScript(e){if(e.ep)return;if(null!==e.getAttribute("noshim"))return;if(!e.src&&!e.innerHTML)return;e.ep=true;const t=null===e.getAttribute("async")&&We>0;const s=Ve>0;t&&We++;s&&Ve++;const a=topLevelLoad(e.src||ue,getFetchOpts(e),!e.src&&e.innerHTML,!r,t&&Qe).catch(throwError);t&&(Qe=a.then(readyStateCompleteCheck));s&&a.then(domContentLoadedCheck)}const Xe={};function processPreload(e){if(!e.ep){e.ep=true;Xe[e.href]||(Xe[e.href]=fetchModule(e.href,getFetchOpts(e)))}}})();
+
+//# sourceMappingURL=/assets/es-module-shims.js-d8b1db8467f1af14f3ecf729b9fb6dd6a55f3ccff4499a3f033397e46d48bf68.map
+//!
+;
diff --git a/public/assets/es-module-shims.min-606ae9c3279013fe751cee30f719a592f759e705edb66496812f3d9dbce3d850.js.gz b/public/assets/es-module-shims.min-606ae9c3279013fe751cee30f719a592f759e705edb66496812f3d9dbce3d850.js.gz
new file mode 100644
index 0000000000000000000000000000000000000000..42789e7b2722453304e173e37cf34f8c18610419
Binary files /dev/null and b/public/assets/es-module-shims.min-606ae9c3279013fe751cee30f719a592f759e705edb66496812f3d9dbce3d850.js.gz differ
diff --git a/public/assets/tinymce-34d3e364e1001c7d181c7a0576664e91f6f69aed7cc29209cde56a622bec6841.js b/public/assets/tinymce-34d3e364e1001c7d181c7a0576664e91f6f69aed7cc29209cde56a622bec6841.js
new file mode 100644
index 0000000000000000000000000000000000000000..c12f67f63dd47371cad5e689f6c3d30102e6e070
--- /dev/null
+++ b/public/assets/tinymce-34d3e364e1001c7d181c7a0576664e91f6f69aed7cc29209cde56a622bec6841.js
@@ -0,0 +1,29113 @@
+window.TinyMCERails = {
+  configuration: {
+    default: {}
+  },
+
+  initialize: function(config, options) {
+    if (typeof tinyMCE != 'undefined') {
+      // Merge the custom options with the given configuration
+      var configuration = TinyMCERails.configuration[config || 'default'];
+      configuration = TinyMCERails._merge(configuration, options);
+
+      tinymce.init(configuration);
+    } else {
+      // Wait until TinyMCE is loaded
+      setTimeout(function() {
+        TinyMCERails.initialize(config, options);
+      }, 50);
+    }
+  },
+
+  setupTurbolinks: function() {
+    // Remove all TinyMCE instances before rendering
+    document.addEventListener('turbolinks:before-render', function() {
+      tinymce.remove();
+    });
+  },
+
+  _merge: function() {
+    var result = {};
+
+    for (var i = 0; i < arguments.length; ++i) {
+      var source = arguments[i];
+
+      for (var key in source) {
+        if (Object.prototype.hasOwnProperty.call(source, key)) {
+          if (Object.prototype.toString.call(source[key]) === '[object Object]') {
+            result[key] = TinyMCERails._merge(result[key], source[key]);
+          } else {
+            result[key] = source[key];
+          }
+        }
+      }
+    }
+
+    return result;
+  }
+};
+
+if (typeof Turbolinks != 'undefined' && Turbolinks.supported) {
+  TinyMCERails.setupTurbolinks();
+};
+window.tinymce = window.tinymce || {
+  base:   '/assets/tinymce',
+  suffix: ''
+};
+/**
+ * TinyMCE version 6.0.3 (2022-05-25)
+ */
+
+(function () {
+    'use strict';
+
+    var typeOf$1 = function (x) {
+      if (x === null) {
+        return 'null';
+      }
+      if (x === undefined) {
+        return 'undefined';
+      }
+      var t = typeof x;
+      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
+        return 'array';
+      }
+      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
+        return 'string';
+      }
+      return t;
+    };
+    var isEquatableType = function (x) {
+      return [
+        'undefined',
+        'boolean',
+        'number',
+        'string',
+        'function',
+        'xml',
+        'null'
+      ].indexOf(x) !== -1;
+    };
+
+    var sort$1 = function (xs, compareFn) {
+      var clone = Array.prototype.slice.call(xs);
+      return clone.sort(compareFn);
+    };
+
+    var contramap = function (eqa, f) {
+      return eq$2(function (x, y) {
+        return eqa.eq(f(x), f(y));
+      });
+    };
+    var eq$2 = function (f) {
+      return { eq: f };
+    };
+    var tripleEq = eq$2(function (x, y) {
+      return x === y;
+    });
+    var eqString = tripleEq;
+    var eqArray = function (eqa) {
+      return eq$2(function (x, y) {
+        if (x.length !== y.length) {
+          return false;
+        }
+        var len = x.length;
+        for (var i = 0; i < len; i++) {
+          if (!eqa.eq(x[i], y[i])) {
+            return false;
+          }
+        }
+        return true;
+      });
+    };
+    var eqSortedArray = function (eqa, compareFn) {
+      return contramap(eqArray(eqa), function (xs) {
+        return sort$1(xs, compareFn);
+      });
+    };
+    var eqRecord = function (eqa) {
+      return eq$2(function (x, y) {
+        var kx = Object.keys(x);
+        var ky = Object.keys(y);
+        if (!eqSortedArray(eqString).eq(kx, ky)) {
+          return false;
+        }
+        var len = kx.length;
+        for (var i = 0; i < len; i++) {
+          var q = kx[i];
+          if (!eqa.eq(x[q], y[q])) {
+            return false;
+          }
+        }
+        return true;
+      });
+    };
+    var eqAny = eq$2(function (x, y) {
+      if (x === y) {
+        return true;
+      }
+      var tx = typeOf$1(x);
+      var ty = typeOf$1(y);
+      if (tx !== ty) {
+        return false;
+      }
+      if (isEquatableType(tx)) {
+        return x === y;
+      } else if (tx === 'array') {
+        return eqArray(eqAny).eq(x, y);
+      } else if (tx === 'object') {
+        return eqRecord(eqAny).eq(x, y);
+      }
+      return false;
+    });
+
+    const getPrototypeOf$1 = Object.getPrototypeOf;
+    const hasProto = (v, constructor, predicate) => {
+      var _a;
+      if (predicate(v, constructor.prototype)) {
+        return true;
+      } else {
+        return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
+      }
+    };
+    const typeOf = x => {
+      const t = typeof x;
+      if (x === null) {
+        return 'null';
+      } else if (t === 'object' && Array.isArray(x)) {
+        return 'array';
+      } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
+        return 'string';
+      } else {
+        return t;
+      }
+    };
+    const isType$1 = type => value => typeOf(value) === type;
+    const isSimpleType = type => value => typeof value === type;
+    const eq$1 = t => a => t === a;
+    const is$4 = (value, constructor) => isObject(value) && hasProto(value, constructor, (o, proto) => getPrototypeOf$1(o) === proto);
+    const isString = isType$1('string');
+    const isObject = isType$1('object');
+    const isPlainObject = value => is$4(value, Object);
+    const isArray$1 = isType$1('array');
+    const isNull = eq$1(null);
+    const isBoolean = isSimpleType('boolean');
+    const isUndefined = eq$1(undefined);
+    const isNullable = a => a === null || a === undefined;
+    const isNonNullable = a => !isNullable(a);
+    const isFunction = isSimpleType('function');
+    const isNumber = isSimpleType('number');
+    const isArrayOf = (value, pred) => {
+      if (isArray$1(value)) {
+        for (let i = 0, len = value.length; i < len; ++i) {
+          if (!pred(value[i])) {
+            return false;
+          }
+        }
+        return true;
+      }
+      return false;
+    };
+
+    const noop = () => {
+    };
+    const compose = (fa, fb) => {
+      return (...args) => {
+        return fa(fb.apply(null, args));
+      };
+    };
+    const compose1 = (fbc, fab) => a => fbc(fab(a));
+    const constant = value => {
+      return () => {
+        return value;
+      };
+    };
+    const identity = x => {
+      return x;
+    };
+    const tripleEquals = (a, b) => {
+      return a === b;
+    };
+    function curry(fn, ...initialArgs) {
+      return (...restArgs) => {
+        const all = initialArgs.concat(restArgs);
+        return fn.apply(null, all);
+      };
+    }
+    const not = f => t => !f(t);
+    const die = msg => {
+      return () => {
+        throw new Error(msg);
+      };
+    };
+    const apply$1 = f => {
+      return f();
+    };
+    const call = f => {
+      f();
+    };
+    const never = constant(false);
+    const always = constant(true);
+
+    class Optional {
+      constructor(tag, value) {
+        this.tag = tag;
+        this.value = value;
+      }
+      static some(value) {
+        return new Optional(true, value);
+      }
+      static none() {
+        return Optional.singletonNone;
+      }
+      fold(onNone, onSome) {
+        if (this.tag) {
+          return onSome(this.value);
+        } else {
+          return onNone();
+        }
+      }
+      isSome() {
+        return this.tag;
+      }
+      isNone() {
+        return !this.tag;
+      }
+      map(mapper) {
+        if (this.tag) {
+          return Optional.some(mapper(this.value));
+        } else {
+          return Optional.none();
+        }
+      }
+      bind(binder) {
+        if (this.tag) {
+          return binder(this.value);
+        } else {
+          return Optional.none();
+        }
+      }
+      exists(predicate) {
+        return this.tag && predicate(this.value);
+      }
+      forall(predicate) {
+        return !this.tag || predicate(this.value);
+      }
+      filter(predicate) {
+        if (!this.tag || predicate(this.value)) {
+          return this;
+        } else {
+          return Optional.none();
+        }
+      }
+      getOr(replacement) {
+        return this.tag ? this.value : replacement;
+      }
+      or(replacement) {
+        return this.tag ? this : replacement;
+      }
+      getOrThunk(thunk) {
+        return this.tag ? this.value : thunk();
+      }
+      orThunk(thunk) {
+        return this.tag ? this : thunk();
+      }
+      getOrDie(message) {
+        if (!this.tag) {
+          throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
+        } else {
+          return this.value;
+        }
+      }
+      static from(value) {
+        return isNonNullable(value) ? Optional.some(value) : Optional.none();
+      }
+      getOrNull() {
+        return this.tag ? this.value : null;
+      }
+      getOrUndefined() {
+        return this.value;
+      }
+      each(worker) {
+        if (this.tag) {
+          worker(this.value);
+        }
+      }
+      toArray() {
+        return this.tag ? [this.value] : [];
+      }
+      toString() {
+        return this.tag ? `some(${ this.value })` : 'none()';
+      }
+    }
+    Optional.singletonNone = new Optional(false);
+
+    const nativeSlice = Array.prototype.slice;
+    const nativeIndexOf = Array.prototype.indexOf;
+    const nativePush = Array.prototype.push;
+    const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);
+    const indexOf$1 = (xs, x) => {
+      const r = rawIndexOf(xs, x);
+      return r === -1 ? Optional.none() : Optional.some(r);
+    };
+    const contains$2 = (xs, x) => rawIndexOf(xs, x) > -1;
+    const exists = (xs, pred) => {
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        if (pred(x, i)) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const map$3 = (xs, f) => {
+      const len = xs.length;
+      const r = new Array(len);
+      for (let i = 0; i < len; i++) {
+        const x = xs[i];
+        r[i] = f(x, i);
+      }
+      return r;
+    };
+    const each$g = (xs, f) => {
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        f(x, i);
+      }
+    };
+    const eachr = (xs, f) => {
+      for (let i = xs.length - 1; i >= 0; i--) {
+        const x = xs[i];
+        f(x, i);
+      }
+    };
+    const partition$2 = (xs, pred) => {
+      const pass = [];
+      const fail = [];
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        const arr = pred(x, i) ? pass : fail;
+        arr.push(x);
+      }
+      return {
+        pass,
+        fail
+      };
+    };
+    const filter$6 = (xs, pred) => {
+      const r = [];
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        if (pred(x, i)) {
+          r.push(x);
+        }
+      }
+      return r;
+    };
+    const foldr = (xs, f, acc) => {
+      eachr(xs, (x, i) => {
+        acc = f(acc, x, i);
+      });
+      return acc;
+    };
+    const foldl = (xs, f, acc) => {
+      each$g(xs, (x, i) => {
+        acc = f(acc, x, i);
+      });
+      return acc;
+    };
+    const findUntil$1 = (xs, pred, until) => {
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        if (pred(x, i)) {
+          return Optional.some(x);
+        } else if (until(x, i)) {
+          break;
+        }
+      }
+      return Optional.none();
+    };
+    const find$2 = (xs, pred) => {
+      return findUntil$1(xs, pred, never);
+    };
+    const findIndex$2 = (xs, pred) => {
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        if (pred(x, i)) {
+          return Optional.some(i);
+        }
+      }
+      return Optional.none();
+    };
+    const flatten = xs => {
+      const r = [];
+      for (let i = 0, len = xs.length; i < len; ++i) {
+        if (!isArray$1(xs[i])) {
+          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
+        }
+        nativePush.apply(r, xs[i]);
+      }
+      return r;
+    };
+    const bind$3 = (xs, f) => flatten(map$3(xs, f));
+    const forall = (xs, pred) => {
+      for (let i = 0, len = xs.length; i < len; ++i) {
+        const x = xs[i];
+        if (pred(x, i) !== true) {
+          return false;
+        }
+      }
+      return true;
+    };
+    const reverse = xs => {
+      const r = nativeSlice.call(xs, 0);
+      r.reverse();
+      return r;
+    };
+    const difference = (a1, a2) => filter$6(a1, x => !contains$2(a2, x));
+    const mapToObject = (xs, f) => {
+      const r = {};
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        r[String(x)] = f(x, i);
+      }
+      return r;
+    };
+    const sort = (xs, comparator) => {
+      const copy = nativeSlice.call(xs, 0);
+      copy.sort(comparator);
+      return copy;
+    };
+    const get$b = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
+    const head = xs => get$b(xs, 0);
+    const last$3 = xs => get$b(xs, xs.length - 1);
+    const from = isFunction(Array.from) ? Array.from : x => nativeSlice.call(x);
+    const findMap = (arr, f) => {
+      for (let i = 0; i < arr.length; i++) {
+        const r = f(arr[i], i);
+        if (r.isSome()) {
+          return r;
+        }
+      }
+      return Optional.none();
+    };
+    const unique$1 = (xs, comparator) => {
+      const r = [];
+      const isDuplicated = isFunction(comparator) ? x => exists(r, i => comparator(i, x)) : x => contains$2(r, x);
+      for (let i = 0, len = xs.length; i < len; i++) {
+        const x = xs[i];
+        if (!isDuplicated(x)) {
+          r.push(x);
+        }
+      }
+      return r;
+    };
+
+    const keys = Object.keys;
+    const hasOwnProperty$2 = Object.hasOwnProperty;
+    const each$f = (obj, f) => {
+      const props = keys(obj);
+      for (let k = 0, len = props.length; k < len; k++) {
+        const i = props[k];
+        const x = obj[i];
+        f(x, i);
+      }
+    };
+    const map$2 = (obj, f) => {
+      return tupleMap(obj, (x, i) => ({
+        k: i,
+        v: f(x, i)
+      }));
+    };
+    const tupleMap = (obj, f) => {
+      const r = {};
+      each$f(obj, (x, i) => {
+        const tuple = f(x, i);
+        r[tuple.k] = tuple.v;
+      });
+      return r;
+    };
+    const objAcc = r => (x, i) => {
+      r[i] = x;
+    };
+    const internalFilter = (obj, pred, onTrue, onFalse) => {
+      const r = {};
+      each$f(obj, (x, i) => {
+        (pred(x, i) ? onTrue : onFalse)(x, i);
+      });
+      return r;
+    };
+    const bifilter = (obj, pred) => {
+      const t = {};
+      const f = {};
+      internalFilter(obj, pred, objAcc(t), objAcc(f));
+      return {
+        t,
+        f
+      };
+    };
+    const filter$5 = (obj, pred) => {
+      const t = {};
+      internalFilter(obj, pred, objAcc(t), noop);
+      return t;
+    };
+    const mapToArray = (obj, f) => {
+      const r = [];
+      each$f(obj, (value, name) => {
+        r.push(f(value, name));
+      });
+      return r;
+    };
+    const values = obj => {
+      return mapToArray(obj, identity);
+    };
+    const get$a = (obj, key) => {
+      return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none();
+    };
+    const has$2 = (obj, key) => hasOwnProperty$2.call(obj, key);
+    const hasNonNullableKey = (obj, key) => has$2(obj, key) && obj[key] !== undefined && obj[key] !== null;
+    const equal$1 = (a1, a2, eq = eqAny) => eqRecord(eq).eq(a1, a2);
+
+    const stringArray = a => {
+      const all = {};
+      each$g(a, key => {
+        all[key] = {};
+      });
+      return keys(all);
+    };
+
+    const isArray = Array.isArray;
+    const toArray$1 = obj => {
+      if (!isArray(obj)) {
+        const array = [];
+        for (let i = 0, l = obj.length; i < l; i++) {
+          array[i] = obj[i];
+        }
+        return array;
+      } else {
+        return obj;
+      }
+    };
+    const each$e = (o, cb, s) => {
+      let n, l;
+      if (!o) {
+        return false;
+      }
+      s = s || o;
+      if (o.length !== undefined) {
+        for (n = 0, l = o.length; n < l; n++) {
+          if (cb.call(s, o[n], n, o) === false) {
+            return false;
+          }
+        }
+      } else {
+        for (n in o) {
+          if (has$2(o, n)) {
+            if (cb.call(s, o[n], n, o) === false) {
+              return false;
+            }
+          }
+        }
+      }
+      return true;
+    };
+    const map$1 = (array, callback) => {
+      const out = [];
+      each$e(array, (item, index) => {
+        out.push(callback(item, index, array));
+      });
+      return out;
+    };
+    const filter$4 = (a, f) => {
+      const o = [];
+      each$e(a, (v, index) => {
+        if (!f || f(v, index, a)) {
+          o.push(v);
+        }
+      });
+      return o;
+    };
+    const indexOf = (a, v) => {
+      if (a) {
+        for (let i = 0, l = a.length; i < l; i++) {
+          if (a[i] === v) {
+            return i;
+          }
+        }
+      }
+      return -1;
+    };
+    const reduce = (collection, iteratee, accumulator, thisArg) => {
+      let acc = isUndefined(accumulator) ? collection[0] : accumulator;
+      for (let i = 0; i < collection.length; i++) {
+        acc = iteratee.call(thisArg, acc, collection[i], i);
+      }
+      return acc;
+    };
+    const findIndex$1 = (array, predicate, thisArg) => {
+      let i, l;
+      for (i = 0, l = array.length; i < l; i++) {
+        if (predicate.call(thisArg, array[i], i, array)) {
+          return i;
+        }
+      }
+      return -1;
+    };
+    const last$2 = collection => collection[collection.length - 1];
+
+    const cached = f => {
+      let called = false;
+      let r;
+      return (...args) => {
+        if (!called) {
+          called = true;
+          r = f.apply(null, args);
+        }
+        return r;
+      };
+    };
+
+    const DeviceType = (os, browser, userAgent, mediaMatch) => {
+      const isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
+      const isiPhone = os.isiOS() && !isiPad;
+      const isMobile = os.isiOS() || os.isAndroid();
+      const isTouch = isMobile || mediaMatch('(pointer:coarse)');
+      const isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');
+      const isPhone = isiPhone || isMobile && !isTablet;
+      const iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
+      const isDesktop = !isPhone && !isTablet && !iOSwebview;
+      return {
+        isiPad: constant(isiPad),
+        isiPhone: constant(isiPhone),
+        isTablet: constant(isTablet),
+        isPhone: constant(isPhone),
+        isTouch: constant(isTouch),
+        isAndroid: os.isAndroid,
+        isiOS: os.isiOS,
+        isWebView: constant(iOSwebview),
+        isDesktop: constant(isDesktop)
+      };
+    };
+
+    const firstMatch = (regexes, s) => {
+      for (let i = 0; i < regexes.length; i++) {
+        const x = regexes[i];
+        if (x.test(s)) {
+          return x;
+        }
+      }
+      return undefined;
+    };
+    const find$1 = (regexes, agent) => {
+      const r = firstMatch(regexes, agent);
+      if (!r) {
+        return {
+          major: 0,
+          minor: 0
+        };
+      }
+      const group = i => {
+        return Number(agent.replace(r, '$' + i));
+      };
+      return nu$3(group(1), group(2));
+    };
+    const detect$5 = (versionRegexes, agent) => {
+      const cleanedAgent = String(agent).toLowerCase();
+      if (versionRegexes.length === 0) {
+        return unknown$2();
+      }
+      return find$1(versionRegexes, cleanedAgent);
+    };
+    const unknown$2 = () => {
+      return nu$3(0, 0);
+    };
+    const nu$3 = (major, minor) => {
+      return {
+        major,
+        minor
+      };
+    };
+    const Version = {
+      nu: nu$3,
+      detect: detect$5,
+      unknown: unknown$2
+    };
+
+    const detectBrowser$1 = (browsers, userAgentData) => {
+      return findMap(userAgentData.brands, uaBrand => {
+        const lcBrand = uaBrand.brand.toLowerCase();
+        return find$2(browsers, browser => {
+          var _a;
+          return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());
+        }).map(info => ({
+          current: info.name,
+          version: Version.nu(parseInt(uaBrand.version, 10), 0)
+        }));
+      });
+    };
+
+    const detect$4 = (candidates, userAgent) => {
+      const agent = String(userAgent).toLowerCase();
+      return find$2(candidates, candidate => {
+        return candidate.search(agent);
+      });
+    };
+    const detectBrowser = (browsers, userAgent) => {
+      return detect$4(browsers, userAgent).map(browser => {
+        const version = Version.detect(browser.versionRegexes, userAgent);
+        return {
+          current: browser.name,
+          version
+        };
+      });
+    };
+    const detectOs = (oses, userAgent) => {
+      return detect$4(oses, userAgent).map(os => {
+        const version = Version.detect(os.versionRegexes, userAgent);
+        return {
+          current: os.name,
+          version
+        };
+      });
+    };
+
+    const removeFromStart = (str, numChars) => {
+      return str.substring(numChars);
+    };
+
+    const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
+    const removeLeading = (str, prefix) => {
+      return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str;
+    };
+    const contains$1 = (str, substr) => {
+      return str.indexOf(substr) !== -1;
+    };
+    const startsWith = (str, prefix) => {
+      return checkRange(str, prefix, 0);
+    };
+    const endsWith = (str, suffix) => {
+      return checkRange(str, suffix, str.length - suffix.length);
+    };
+    const blank = r => s => s.replace(r, '');
+    const trim$3 = blank(/^\s+|\s+$/g);
+    const lTrim = blank(/^\s+/g);
+    const rTrim = blank(/\s+$/g);
+    const isNotEmpty = s => s.length > 0;
+    const isEmpty$3 = s => !isNotEmpty(s);
+    const repeat = (s, count) => count <= 0 ? '' : new Array(count + 1).join(s);
+    const toInt = (value, radix = 10) => {
+      const num = parseInt(value, radix);
+      return isNaN(num) ? Optional.none() : Optional.some(num);
+    };
+
+    const normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
+    const checkContains = target => {
+      return uastring => {
+        return contains$1(uastring, target);
+      };
+    };
+    const browsers = [
+      {
+        name: 'Edge',
+        versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
+        search: uastring => {
+          return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit');
+        }
+      },
+      {
+        name: 'Chromium',
+        brand: 'Chromium',
+        versionRegexes: [
+          /.*?chrome\/([0-9]+)\.([0-9]+).*/,
+          normalVersionRegex
+        ],
+        search: uastring => {
+          return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe');
+        }
+      },
+      {
+        name: 'IE',
+        versionRegexes: [
+          /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
+          /.*?rv:([0-9]+)\.([0-9]+).*/
+        ],
+        search: uastring => {
+          return contains$1(uastring, 'msie') || contains$1(uastring, 'trident');
+        }
+      },
+      {
+        name: 'Opera',
+        versionRegexes: [
+          normalVersionRegex,
+          /.*?opera\/([0-9]+)\.([0-9]+).*/
+        ],
+        search: checkContains('opera')
+      },
+      {
+        name: 'Firefox',
+        versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
+        search: checkContains('firefox')
+      },
+      {
+        name: 'Safari',
+        versionRegexes: [
+          normalVersionRegex,
+          /.*?cpu os ([0-9]+)_([0-9]+).*/
+        ],
+        search: uastring => {
+          return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit');
+        }
+      }
+    ];
+    const oses = [
+      {
+        name: 'Windows',
+        search: checkContains('win'),
+        versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
+      },
+      {
+        name: 'iOS',
+        search: uastring => {
+          return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad');
+        },
+        versionRegexes: [
+          /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
+          /.*cpu os ([0-9]+)_([0-9]+).*/,
+          /.*cpu iphone os ([0-9]+)_([0-9]+).*/
+        ]
+      },
+      {
+        name: 'Android',
+        search: checkContains('android'),
+        versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
+      },
+      {
+        name: 'macOS',
+        search: checkContains('mac os x'),
+        versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]
+      },
+      {
+        name: 'Linux',
+        search: checkContains('linux'),
+        versionRegexes: []
+      },
+      {
+        name: 'Solaris',
+        search: checkContains('sunos'),
+        versionRegexes: []
+      },
+      {
+        name: 'FreeBSD',
+        search: checkContains('freebsd'),
+        versionRegexes: []
+      },
+      {
+        name: 'ChromeOS',
+        search: checkContains('cros'),
+        versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/]
+      }
+    ];
+    const PlatformInfo = {
+      browsers: constant(browsers),
+      oses: constant(oses)
+    };
+
+    const edge = 'Edge';
+    const chromium = 'Chromium';
+    const ie = 'IE';
+    const opera = 'Opera';
+    const firefox = 'Firefox';
+    const safari = 'Safari';
+    const unknown$1 = () => {
+      return nu$2({
+        current: undefined,
+        version: Version.unknown()
+      });
+    };
+    const nu$2 = info => {
+      const current = info.current;
+      const version = info.version;
+      const isBrowser = name => () => current === name;
+      return {
+        current,
+        version,
+        isEdge: isBrowser(edge),
+        isChromium: isBrowser(chromium),
+        isIE: isBrowser(ie),
+        isOpera: isBrowser(opera),
+        isFirefox: isBrowser(firefox),
+        isSafari: isBrowser(safari)
+      };
+    };
+    const Browser = {
+      unknown: unknown$1,
+      nu: nu$2,
+      edge: constant(edge),
+      chromium: constant(chromium),
+      ie: constant(ie),
+      opera: constant(opera),
+      firefox: constant(firefox),
+      safari: constant(safari)
+    };
+
+    const windows = 'Windows';
+    const ios = 'iOS';
+    const android = 'Android';
+    const linux = 'Linux';
+    const macos = 'macOS';
+    const solaris = 'Solaris';
+    const freebsd = 'FreeBSD';
+    const chromeos = 'ChromeOS';
+    const unknown = () => {
+      return nu$1({
+        current: undefined,
+        version: Version.unknown()
+      });
+    };
+    const nu$1 = info => {
+      const current = info.current;
+      const version = info.version;
+      const isOS = name => () => current === name;
+      return {
+        current,
+        version,
+        isWindows: isOS(windows),
+        isiOS: isOS(ios),
+        isAndroid: isOS(android),
+        isMacOS: isOS(macos),
+        isLinux: isOS(linux),
+        isSolaris: isOS(solaris),
+        isFreeBSD: isOS(freebsd),
+        isChromeOS: isOS(chromeos)
+      };
+    };
+    const OperatingSystem = {
+      unknown,
+      nu: nu$1,
+      windows: constant(windows),
+      ios: constant(ios),
+      android: constant(android),
+      linux: constant(linux),
+      macos: constant(macos),
+      solaris: constant(solaris),
+      freebsd: constant(freebsd),
+      chromeos: constant(chromeos)
+    };
+
+    const detect$3 = (userAgent, userAgentDataOpt, mediaMatch) => {
+      const browsers = PlatformInfo.browsers();
+      const oses = PlatformInfo.oses();
+      const browser = userAgentDataOpt.bind(userAgentData => detectBrowser$1(browsers, userAgentData)).orThunk(() => detectBrowser(browsers, userAgent)).fold(Browser.unknown, Browser.nu);
+      const os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
+      const deviceType = DeviceType(os, browser, userAgent, mediaMatch);
+      return {
+        browser,
+        os,
+        deviceType
+      };
+    };
+    const PlatformDetection = { detect: detect$3 };
+
+    const mediaMatch = query => window.matchMedia(query).matches;
+    let platform$2 = cached(() => PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch));
+    const detect$2 = () => platform$2();
+
+    const userAgent = navigator.userAgent;
+    const platform$1 = detect$2();
+    const browser$1 = platform$1.browser;
+    const os = platform$1.os;
+    const deviceType = platform$1.deviceType;
+    const windowsPhone = userAgent.indexOf('Windows Phone') !== -1;
+    const Env = {
+      transparentSrc: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
+      documentMode: browser$1.isIE() ? document.documentMode || 7 : 10,
+      cacheSuffix: null,
+      container: null,
+      canHaveCSP: !browser$1.isIE(),
+      windowsPhone,
+      browser: {
+        current: browser$1.current,
+        version: browser$1.version,
+        isChromium: browser$1.isChromium,
+        isEdge: browser$1.isEdge,
+        isFirefox: browser$1.isFirefox,
+        isIE: browser$1.isIE,
+        isOpera: browser$1.isOpera,
+        isSafari: browser$1.isSafari
+      },
+      os: {
+        current: os.current,
+        version: os.version,
+        isAndroid: os.isAndroid,
+        isChromeOS: os.isChromeOS,
+        isFreeBSD: os.isFreeBSD,
+        isiOS: os.isiOS,
+        isLinux: os.isLinux,
+        isMacOS: os.isMacOS,
+        isSolaris: os.isSolaris,
+        isWindows: os.isWindows
+      },
+      deviceType: {
+        isDesktop: deviceType.isDesktop,
+        isiPad: deviceType.isiPad,
+        isiPhone: deviceType.isiPhone,
+        isPhone: deviceType.isPhone,
+        isTablet: deviceType.isTablet,
+        isTouch: deviceType.isTouch,
+        isWebView: deviceType.isWebView
+      }
+    };
+
+    const whiteSpaceRegExp$1 = /^\s*|\s*$/g;
+    const trim$2 = str => {
+      return str === null || str === undefined ? '' : ('' + str).replace(whiteSpaceRegExp$1, '');
+    };
+    const is$3 = (obj, type) => {
+      if (!type) {
+        return obj !== undefined;
+      }
+      if (type === 'array' && isArray(obj)) {
+        return true;
+      }
+      return typeof obj === type;
+    };
+    const makeMap$4 = (items, delim, map) => {
+      let i;
+      items = items || [];
+      delim = delim || ',';
+      if (typeof items === 'string') {
+        items = items.split(delim);
+      }
+      map = map || {};
+      i = items.length;
+      while (i--) {
+        map[items[i]] = {};
+      }
+      return map;
+    };
+    const hasOwnProperty$1 = has$2;
+    const extend$3 = (obj, ...exts) => {
+      for (let i = 0; i < exts.length; i++) {
+        const ext = exts[i];
+        for (const name in ext) {
+          if (has$2(ext, name)) {
+            const value = ext[name];
+            if (value !== undefined) {
+              obj[name] = value;
+            }
+          }
+        }
+      }
+      return obj;
+    };
+    const walk$4 = function (o, f, n, s) {
+      s = s || this;
+      if (o) {
+        if (n) {
+          o = o[n];
+        }
+        each$e(o, (o, i) => {
+          if (f.call(s, o, i, n) === false) {
+            return false;
+          }
+          walk$4(o, f, n, s);
+        });
+      }
+    };
+    const resolve$2 = (n, o) => {
+      let i, l;
+      o = o || window;
+      n = n.split('.');
+      for (i = 0, l = n.length; i < l; i++) {
+        o = o[n[i]];
+        if (!o) {
+          break;
+        }
+      }
+      return o;
+    };
+    const explode$3 = (s, d) => {
+      if (!s || is$3(s, 'array')) {
+        return s;
+      }
+      return map$1(s.split(d || ','), trim$2);
+    };
+    const _addCacheSuffix = url => {
+      const cacheSuffix = Env.cacheSuffix;
+      if (cacheSuffix) {
+        url += (url.indexOf('?') === -1 ? '?' : '&') + cacheSuffix;
+      }
+      return url;
+    };
+    const Tools = {
+      trim: trim$2,
+      isArray: isArray,
+      is: is$3,
+      toArray: toArray$1,
+      makeMap: makeMap$4,
+      each: each$e,
+      map: map$1,
+      grep: filter$4,
+      inArray: indexOf,
+      hasOwn: hasOwnProperty$1,
+      extend: extend$3,
+      walk: walk$4,
+      resolve: resolve$2,
+      explode: explode$3,
+      _addCacheSuffix
+    };
+
+    const is$2 = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));
+    const cat = arr => {
+      const r = [];
+      const push = x => {
+        r.push(x);
+      };
+      for (let i = 0; i < arr.length; i++) {
+        arr[i].each(push);
+      }
+      return r;
+    };
+    const lift2 = (oa, ob, f) => oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();
+    const lift3 = (oa, ob, oc, f) => oa.isSome() && ob.isSome() && oc.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Optional.none();
+    const someIf = (b, a) => b ? Optional.some(a) : Optional.none();
+
+    typeof window !== 'undefined' ? window : Function('return this;')();
+
+    const COMMENT = 8;
+    const DOCUMENT = 9;
+    const DOCUMENT_FRAGMENT = 11;
+    const ELEMENT = 1;
+    const TEXT = 3;
+
+    const name = element => {
+      const r = element.dom.nodeName;
+      return r.toLowerCase();
+    };
+    const type$1 = element => element.dom.nodeType;
+    const isType = t => element => type$1(element) === t;
+    const isComment$1 = element => type$1(element) === COMMENT || name(element) === '#comment';
+    const isElement$7 = isType(ELEMENT);
+    const isText$9 = isType(TEXT);
+    const isDocument$2 = isType(DOCUMENT);
+    const isDocumentFragment$1 = isType(DOCUMENT_FRAGMENT);
+    const isTag = tag => e => isElement$7(e) && name(e) === tag;
+
+    const rawSet = (dom, key, value) => {
+      if (isString(value) || isBoolean(value) || isNumber(value)) {
+        dom.setAttribute(key, value + '');
+      } else {
+        console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
+        throw new Error('Attribute value was not simple');
+      }
+    };
+    const set$2 = (element, key, value) => {
+      rawSet(element.dom, key, value);
+    };
+    const setAll$1 = (element, attrs) => {
+      const dom = element.dom;
+      each$f(attrs, (v, k) => {
+        rawSet(dom, k, v);
+      });
+    };
+    const get$9 = (element, key) => {
+      const v = element.dom.getAttribute(key);
+      return v === null ? undefined : v;
+    };
+    const getOpt = (element, key) => Optional.from(get$9(element, key));
+    const has$1 = (element, key) => {
+      const dom = element.dom;
+      return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;
+    };
+    const remove$a = (element, key) => {
+      element.dom.removeAttribute(key);
+    };
+    const hasNone = element => {
+      const attrs = element.dom.attributes;
+      return attrs === undefined || attrs === null || attrs.length === 0;
+    };
+    const clone$4 = element => foldl(element.dom.attributes, (acc, attr) => {
+      acc[attr.name] = attr.value;
+      return acc;
+    }, {});
+
+    const read$4 = (element, attr) => {
+      const value = get$9(element, attr);
+      return value === undefined || value === '' ? [] : value.split(' ');
+    };
+    const add$4 = (element, attr, id) => {
+      const old = read$4(element, attr);
+      const nu = old.concat([id]);
+      set$2(element, attr, nu.join(' '));
+      return true;
+    };
+    const remove$9 = (element, attr, id) => {
+      const nu = filter$6(read$4(element, attr), v => v !== id);
+      if (nu.length > 0) {
+        set$2(element, attr, nu.join(' '));
+      } else {
+        remove$a(element, attr);
+      }
+      return false;
+    };
+
+    const supports = element => element.dom.classList !== undefined;
+    const get$8 = element => read$4(element, 'class');
+    const add$3 = (element, clazz) => add$4(element, 'class', clazz);
+    const remove$8 = (element, clazz) => remove$9(element, 'class', clazz);
+    const toggle$2 = (element, clazz) => {
+      if (contains$2(get$8(element), clazz)) {
+        return remove$8(element, clazz);
+      } else {
+        return add$3(element, clazz);
+      }
+    };
+
+    const add$2 = (element, clazz) => {
+      if (supports(element)) {
+        element.dom.classList.add(clazz);
+      } else {
+        add$3(element, clazz);
+      }
+    };
+    const cleanClass = element => {
+      const classList = supports(element) ? element.dom.classList : get$8(element);
+      if (classList.length === 0) {
+        remove$a(element, 'class');
+      }
+    };
+    const remove$7 = (element, clazz) => {
+      if (supports(element)) {
+        const classList = element.dom.classList;
+        classList.remove(clazz);
+      } else {
+        remove$8(element, clazz);
+      }
+      cleanClass(element);
+    };
+    const toggle$1 = (element, clazz) => {
+      const result = supports(element) ? element.dom.classList.toggle(clazz) : toggle$2(element, clazz);
+      cleanClass(element);
+      return result;
+    };
+    const has = (element, clazz) => supports(element) && element.dom.classList.contains(clazz);
+
+    const isSupported$1 = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);
+
+    const fromHtml$1 = (html, scope) => {
+      const doc = scope || document;
+      const div = doc.createElement('div');
+      div.innerHTML = html;
+      if (!div.hasChildNodes() || div.childNodes.length > 1) {
+        const message = 'HTML does not have a single root node';
+        console.error(message, html);
+        throw new Error(message);
+      }
+      return fromDom$2(div.childNodes[0]);
+    };
+    const fromTag = (tag, scope) => {
+      const doc = scope || document;
+      const node = doc.createElement(tag);
+      return fromDom$2(node);
+    };
+    const fromText = (text, scope) => {
+      const doc = scope || document;
+      const node = doc.createTextNode(text);
+      return fromDom$2(node);
+    };
+    const fromDom$2 = node => {
+      if (node === null || node === undefined) {
+        throw new Error('Node cannot be null or undefined');
+      }
+      return { dom: node };
+    };
+    const fromPoint$2 = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$2);
+    const SugarElement = {
+      fromHtml: fromHtml$1,
+      fromTag,
+      fromText,
+      fromDom: fromDom$2,
+      fromPoint: fromPoint$2
+    };
+
+    const toArray = (target, f) => {
+      const r = [];
+      const recurse = e => {
+        r.push(e);
+        return f(e);
+      };
+      let cur = f(target);
+      do {
+        cur = cur.bind(recurse);
+      } while (cur.isSome());
+      return r;
+    };
+
+    const is$1 = (element, selector) => {
+      const dom = element.dom;
+      if (dom.nodeType !== ELEMENT) {
+        return false;
+      } else {
+        const elem = dom;
+        if (elem.matches !== undefined) {
+          return elem.matches(selector);
+        } else if (elem.msMatchesSelector !== undefined) {
+          return elem.msMatchesSelector(selector);
+        } else if (elem.webkitMatchesSelector !== undefined) {
+          return elem.webkitMatchesSelector(selector);
+        } else if (elem.mozMatchesSelector !== undefined) {
+          return elem.mozMatchesSelector(selector);
+        } else {
+          throw new Error('Browser lacks native selectors');
+        }
+      }
+    };
+    const bypassSelector = dom => dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;
+    const all = (selector, scope) => {
+      const base = scope === undefined ? document : scope.dom;
+      return bypassSelector(base) ? [] : map$3(base.querySelectorAll(selector), SugarElement.fromDom);
+    };
+    const one = (selector, scope) => {
+      const base = scope === undefined ? document : scope.dom;
+      return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);
+    };
+
+    const eq = (e1, e2) => e1.dom === e2.dom;
+    const contains = (e1, e2) => {
+      const d1 = e1.dom;
+      const d2 = e2.dom;
+      return d1 === d2 ? false : d1.contains(d2);
+    };
+
+    const owner$1 = element => SugarElement.fromDom(element.dom.ownerDocument);
+    const documentOrOwner = dos => isDocument$2(dos) ? dos : owner$1(dos);
+    const documentElement = element => SugarElement.fromDom(documentOrOwner(element).dom.documentElement);
+    const defaultView = element => SugarElement.fromDom(documentOrOwner(element).dom.defaultView);
+    const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
+    const parentElement = element => Optional.from(element.dom.parentElement).map(SugarElement.fromDom);
+    const parents$1 = (element, isRoot) => {
+      const stop = isFunction(isRoot) ? isRoot : never;
+      let dom = element.dom;
+      const ret = [];
+      while (dom.parentNode !== null && dom.parentNode !== undefined) {
+        const rawParent = dom.parentNode;
+        const p = SugarElement.fromDom(rawParent);
+        ret.push(p);
+        if (stop(p) === true) {
+          break;
+        } else {
+          dom = rawParent;
+        }
+      }
+      return ret;
+    };
+    const siblings = element => {
+      const filterSelf = elements => filter$6(elements, x => !eq(element, x));
+      return parent(element).map(children).map(filterSelf).getOr([]);
+    };
+    const prevSibling = element => Optional.from(element.dom.previousSibling).map(SugarElement.fromDom);
+    const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
+    const prevSiblings = element => reverse(toArray(element, prevSibling));
+    const nextSiblings = element => toArray(element, nextSibling);
+    const children = element => map$3(element.dom.childNodes, SugarElement.fromDom);
+    const child$1 = (element, index) => {
+      const cs = element.dom.childNodes;
+      return Optional.from(cs[index]).map(SugarElement.fromDom);
+    };
+    const firstChild = element => child$1(element, 0);
+    const lastChild = element => child$1(element, element.dom.childNodes.length - 1);
+    const childNodesCount = element => element.dom.childNodes.length;
+
+    const getHead = doc => {
+      const b = doc.dom.head;
+      if (b === null || b === undefined) {
+        throw new Error('Head is not available yet');
+      }
+      return SugarElement.fromDom(b);
+    };
+
+    const isShadowRoot = dos => isDocumentFragment$1(dos) && isNonNullable(dos.dom.host);
+    const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
+    const isSupported = constant(supported);
+    const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner;
+    const getStyleContainer = dos => isShadowRoot(dos) ? dos : getHead(documentOrOwner(dos));
+    const getShadowRoot = e => {
+      const r = getRootNode(e);
+      return isShadowRoot(r) ? Optional.some(r) : Optional.none();
+    };
+    const getShadowHost = e => SugarElement.fromDom(e.dom.host);
+    const getOriginalEventTarget = event => {
+      if (isSupported() && isNonNullable(event.target)) {
+        const el = SugarElement.fromDom(event.target);
+        if (isElement$7(el) && isOpenShadowHost(el)) {
+          if (event.composed && event.composedPath) {
+            const composedPath = event.composedPath();
+            if (composedPath) {
+              return head(composedPath);
+            }
+          }
+        }
+      }
+      return Optional.from(event.target);
+    };
+    const isOpenShadowHost = element => isNonNullable(element.dom.shadowRoot);
+
+    const inBody = element => {
+      const dom = isText$9(element) ? element.dom.parentNode : element.dom;
+      if (dom === undefined || dom === null || dom.ownerDocument === null) {
+        return false;
+      }
+      const doc = dom.ownerDocument;
+      return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost));
+    };
+
+    const internalSet = (dom, property, value) => {
+      if (!isString(value)) {
+        console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
+        throw new Error('CSS value must be a string: ' + value);
+      }
+      if (isSupported$1(dom)) {
+        dom.style.setProperty(property, value);
+      }
+    };
+    const internalRemove = (dom, property) => {
+      if (isSupported$1(dom)) {
+        dom.style.removeProperty(property);
+      }
+    };
+    const set$1 = (element, property, value) => {
+      const dom = element.dom;
+      internalSet(dom, property, value);
+    };
+    const setAll = (element, css) => {
+      const dom = element.dom;
+      each$f(css, (v, k) => {
+        internalSet(dom, k, v);
+      });
+    };
+    const get$7 = (element, property) => {
+      const dom = element.dom;
+      const styles = window.getComputedStyle(dom);
+      const r = styles.getPropertyValue(property);
+      return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
+    };
+    const getUnsafeProperty = (dom, property) => isSupported$1(dom) ? dom.style.getPropertyValue(property) : '';
+    const getRaw$1 = (element, property) => {
+      const dom = element.dom;
+      const raw = getUnsafeProperty(dom, property);
+      return Optional.from(raw).filter(r => r.length > 0);
+    };
+    const getAllRaw = element => {
+      const css = {};
+      const dom = element.dom;
+      if (isSupported$1(dom)) {
+        for (let i = 0; i < dom.style.length; i++) {
+          const ruleName = dom.style.item(i);
+          css[ruleName] = dom.style[ruleName];
+        }
+      }
+      return css;
+    };
+    const remove$6 = (element, property) => {
+      const dom = element.dom;
+      internalRemove(dom, property);
+      if (is$2(getOpt(element, 'style').map(trim$3), '')) {
+        remove$a(element, 'style');
+      }
+    };
+    const reflow = e => e.dom.offsetWidth;
+
+    const before$3 = (marker, element) => {
+      const parent$1 = parent(marker);
+      parent$1.each(v => {
+        v.dom.insertBefore(element.dom, marker.dom);
+      });
+    };
+    const after$4 = (marker, element) => {
+      const sibling = nextSibling(marker);
+      sibling.fold(() => {
+        const parent$1 = parent(marker);
+        parent$1.each(v => {
+          append$1(v, element);
+        });
+      }, v => {
+        before$3(v, element);
+      });
+    };
+    const prepend = (parent, element) => {
+      const firstChild$1 = firstChild(parent);
+      firstChild$1.fold(() => {
+        append$1(parent, element);
+      }, v => {
+        parent.dom.insertBefore(element.dom, v.dom);
+      });
+    };
+    const append$1 = (parent, element) => {
+      parent.dom.appendChild(element.dom);
+    };
+    const wrap$2 = (element, wrapper) => {
+      before$3(element, wrapper);
+      append$1(wrapper, element);
+    };
+
+    const after$3 = (marker, elements) => {
+      each$g(elements, (x, i) => {
+        const e = i === 0 ? marker : elements[i - 1];
+        after$4(e, x);
+      });
+    };
+    const append = (parent, elements) => {
+      each$g(elements, x => {
+        append$1(parent, x);
+      });
+    };
+
+    const empty = element => {
+      element.dom.textContent = '';
+      each$g(children(element), rogue => {
+        remove$5(rogue);
+      });
+    };
+    const remove$5 = element => {
+      const dom = element.dom;
+      if (dom.parentNode !== null) {
+        dom.parentNode.removeChild(dom);
+      }
+    };
+    const unwrap = wrapper => {
+      const children$1 = children(wrapper);
+      if (children$1.length > 0) {
+        after$3(wrapper, children$1);
+      }
+      remove$5(wrapper);
+    };
+
+    const fromHtml = (html, scope) => {
+      const doc = scope || document;
+      const div = doc.createElement('div');
+      div.innerHTML = html;
+      return children(SugarElement.fromDom(div));
+    };
+    const fromDom$1 = nodes => map$3(nodes, SugarElement.fromDom);
+
+    const get$6 = element => element.dom.innerHTML;
+    const set = (element, content) => {
+      const owner = owner$1(element);
+      const docDom = owner.dom;
+      const fragment = SugarElement.fromDom(docDom.createDocumentFragment());
+      const contentElements = fromHtml(content, docDom);
+      append(fragment, contentElements);
+      empty(element);
+      append$1(element, fragment);
+    };
+    const getOuter = element => {
+      const container = SugarElement.fromTag('div');
+      const clone = SugarElement.fromDom(element.dom.cloneNode(true));
+      append$1(container, clone);
+      return get$6(container);
+    };
+
+    const mkEvent = (target, x, y, stop, prevent, kill, raw) => ({
+      target,
+      x,
+      y,
+      stop,
+      prevent,
+      kill,
+      raw
+    });
+    const fromRawEvent = rawEvent => {
+      const target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));
+      const stop = () => rawEvent.stopPropagation();
+      const prevent = () => rawEvent.preventDefault();
+      const kill = compose(prevent, stop);
+      return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);
+    };
+    const handle$1 = (filter, handler) => rawEvent => {
+      if (filter(rawEvent)) {
+        handler(fromRawEvent(rawEvent));
+      }
+    };
+    const binder = (element, event, filter, handler, useCapture) => {
+      const wrapped = handle$1(filter, handler);
+      element.dom.addEventListener(event, wrapped, useCapture);
+      return { unbind: curry(unbind, element, event, wrapped, useCapture) };
+    };
+    const bind$2 = (element, event, filter, handler) => binder(element, event, filter, handler, false);
+    const unbind = (element, event, handler, useCapture) => {
+      element.dom.removeEventListener(event, handler, useCapture);
+    };
+
+    const r = (left, top) => {
+      const translate = (x, y) => r(left + x, top + y);
+      return {
+        left,
+        top,
+        translate
+      };
+    };
+    const SugarPosition = r;
+
+    const boxPosition = dom => {
+      const box = dom.getBoundingClientRect();
+      return SugarPosition(box.left, box.top);
+    };
+    const firstDefinedOrZero = (a, b) => {
+      if (a !== undefined) {
+        return a;
+      } else {
+        return b !== undefined ? b : 0;
+      }
+    };
+    const absolute = element => {
+      const doc = element.dom.ownerDocument;
+      const body = doc.body;
+      const win = doc.defaultView;
+      const html = doc.documentElement;
+      if (body === element.dom) {
+        return SugarPosition(body.offsetLeft, body.offsetTop);
+      }
+      const scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop);
+      const scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft);
+      const clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);
+      const clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);
+      return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);
+    };
+    const viewport = element => {
+      const dom = element.dom;
+      const doc = dom.ownerDocument;
+      const body = doc.body;
+      if (body === dom) {
+        return SugarPosition(body.offsetLeft, body.offsetTop);
+      }
+      if (!inBody(element)) {
+        return SugarPosition(0, 0);
+      }
+      return boxPosition(dom);
+    };
+
+    const get$5 = _DOC => {
+      const doc = _DOC !== undefined ? _DOC.dom : document;
+      const x = doc.body.scrollLeft || doc.documentElement.scrollLeft;
+      const y = doc.body.scrollTop || doc.documentElement.scrollTop;
+      return SugarPosition(x, y);
+    };
+    const to = (x, y, _DOC) => {
+      const doc = _DOC !== undefined ? _DOC.dom : document;
+      const win = doc.defaultView;
+      if (win) {
+        win.scrollTo(x, y);
+      }
+    };
+    const intoView = (element, alignToTop) => {
+      const isSafari = detect$2().browser.isSafari();
+      if (isSafari && isFunction(element.dom.scrollIntoViewIfNeeded)) {
+        element.dom.scrollIntoViewIfNeeded(false);
+      } else {
+        element.dom.scrollIntoView(alignToTop);
+      }
+    };
+
+    const get$4 = _win => {
+      const win = _win === undefined ? window : _win;
+      if (detect$2().browser.isFirefox()) {
+        return Optional.none();
+      } else {
+        return Optional.from(win.visualViewport);
+      }
+    };
+    const bounds = (x, y, width, height) => ({
+      x,
+      y,
+      width,
+      height,
+      right: x + width,
+      bottom: y + height
+    });
+    const getBounds = _win => {
+      const win = _win === undefined ? window : _win;
+      const doc = win.document;
+      const scroll = get$5(SugarElement.fromDom(doc));
+      return get$4(win).fold(() => {
+        const html = win.document.documentElement;
+        const width = html.clientWidth;
+        const height = html.clientHeight;
+        return bounds(scroll.left, scroll.top, width, height);
+      }, visualViewport => bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height));
+    };
+
+    const isNodeType = type => {
+      return node => {
+        return !!node && node.nodeType === type;
+      };
+    };
+    const isRestrictedNode = node => !!node && !Object.getPrototypeOf(node);
+    const isElement$6 = isNodeType(1);
+    const matchNodeNames = names => {
+      const lowercasedNames = names.map(s => s.toLowerCase());
+      return node => {
+        if (node && node.nodeName) {
+          const nodeName = node.nodeName.toLowerCase();
+          return contains$2(lowercasedNames, nodeName);
+        }
+        return false;
+      };
+    };
+    const matchStyleValues = (name, values) => {
+      const items = values.toLowerCase().split(' ');
+      return node => {
+        if (isElement$6(node)) {
+          for (let i = 0; i < items.length; i++) {
+            const computed = node.ownerDocument.defaultView.getComputedStyle(node, null);
+            const cssValue = computed ? computed.getPropertyValue(name) : null;
+            if (cssValue === items[i]) {
+              return true;
+            }
+          }
+        }
+        return false;
+      };
+    };
+    const hasAttribute = attrName => {
+      return node => {
+        return isElement$6(node) && node.hasAttribute(attrName);
+      };
+    };
+    const hasAttributeValue = (attrName, attrValue) => {
+      return node => {
+        return isElement$6(node) && node.getAttribute(attrName) === attrValue;
+      };
+    };
+    const isBogus$2 = node => isElement$6(node) && node.hasAttribute('data-mce-bogus');
+    const isBogusAll$1 = node => isElement$6(node) && node.getAttribute('data-mce-bogus') === 'all';
+    const isTable$3 = node => isElement$6(node) && node.tagName === 'TABLE';
+    const hasContentEditableState = value => {
+      return node => {
+        if (isElement$6(node)) {
+          if (node.contentEditable === value) {
+            return true;
+          }
+          if (node.getAttribute('data-mce-contenteditable') === value) {
+            return true;
+          }
+        }
+        return false;
+      };
+    };
+    const isTextareaOrInput = matchNodeNames([
+      'textarea',
+      'input'
+    ]);
+    const isText$8 = isNodeType(3);
+    const isCData = isNodeType(4);
+    const isPi = isNodeType(7);
+    const isComment = isNodeType(8);
+    const isDocument$1 = isNodeType(9);
+    const isDocumentFragment = isNodeType(11);
+    const isBr$5 = matchNodeNames(['br']);
+    const isImg = matchNodeNames(['img']);
+    const isContentEditableTrue$4 = hasContentEditableState('true');
+    const isContentEditableFalse$a = hasContentEditableState('false');
+    const isTableCell$5 = matchNodeNames([
+      'td',
+      'th'
+    ]);
+    const isMedia$2 = matchNodeNames([
+      'video',
+      'audio',
+      'object',
+      'embed'
+    ]);
+
+    const browser = detect$2().browser;
+    const firstElement = nodes => find$2(nodes, isElement$7);
+    const getTableCaptionDeltaY = elm => {
+      if (browser.isFirefox() && name(elm) === 'table') {
+        return firstElement(children(elm)).filter(elm => {
+          return name(elm) === 'caption';
+        }).bind(caption => {
+          return firstElement(nextSiblings(caption)).map(body => {
+            const bodyTop = body.dom.offsetTop;
+            const captionTop = caption.dom.offsetTop;
+            const captionHeight = caption.dom.offsetHeight;
+            return bodyTop <= captionTop ? -captionHeight : 0;
+          });
+        }).getOr(0);
+      } else {
+        return 0;
+      }
+    };
+    const hasChild = (elm, child) => elm.children && contains$2(elm.children, child);
+    const getPos = (body, elm, rootElm) => {
+      let x = 0, y = 0;
+      const doc = body.ownerDocument;
+      rootElm = rootElm ? rootElm : body;
+      if (elm) {
+        if (rootElm === body && elm.getBoundingClientRect && get$7(SugarElement.fromDom(body), 'position') === 'static') {
+          const pos = elm.getBoundingClientRect();
+          x = pos.left + (doc.documentElement.scrollLeft || body.scrollLeft) - doc.documentElement.clientLeft;
+          y = pos.top + (doc.documentElement.scrollTop || body.scrollTop) - doc.documentElement.clientTop;
+          return {
+            x,
+            y
+          };
+        }
+        let offsetParent = elm;
+        while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {
+          const castOffsetParent = offsetParent;
+          x += castOffsetParent.offsetLeft || 0;
+          y += castOffsetParent.offsetTop || 0;
+          offsetParent = castOffsetParent.offsetParent;
+        }
+        offsetParent = elm.parentNode;
+        while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {
+          x -= offsetParent.scrollLeft || 0;
+          y -= offsetParent.scrollTop || 0;
+          offsetParent = offsetParent.parentNode;
+        }
+        y += getTableCaptionDeltaY(SugarElement.fromDom(elm));
+      }
+      return {
+        x,
+        y
+      };
+    };
+
+    var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => {
+      if (is(scope, a)) {
+        return Optional.some(scope);
+      } else if (isFunction(isRoot) && isRoot(scope)) {
+        return Optional.none();
+      } else {
+        return ancestor(scope, a, isRoot);
+      }
+    };
+
+    const ancestor$3 = (scope, predicate, isRoot) => {
+      let element = scope.dom;
+      const stop = isFunction(isRoot) ? isRoot : never;
+      while (element.parentNode) {
+        element = element.parentNode;
+        const el = SugarElement.fromDom(element);
+        if (predicate(el)) {
+          return Optional.some(el);
+        } else if (stop(el)) {
+          break;
+        }
+      }
+      return Optional.none();
+    };
+    const closest$4 = (scope, predicate, isRoot) => {
+      const is = (s, test) => test(s);
+      return ClosestOrAncestor(is, ancestor$3, scope, predicate, isRoot);
+    };
+    const sibling$1 = (scope, predicate) => {
+      const element = scope.dom;
+      if (!element.parentNode) {
+        return Optional.none();
+      }
+      return child(SugarElement.fromDom(element.parentNode), x => !eq(scope, x) && predicate(x));
+    };
+    const child = (scope, predicate) => {
+      const pred = node => predicate(SugarElement.fromDom(node));
+      const result = find$2(scope.dom.childNodes, pred);
+      return result.map(SugarElement.fromDom);
+    };
+    const descendant$1 = (scope, predicate) => {
+      const descend = node => {
+        for (let i = 0; i < node.childNodes.length; i++) {
+          const child = SugarElement.fromDom(node.childNodes[i]);
+          if (predicate(child)) {
+            return Optional.some(child);
+          }
+          const res = descend(node.childNodes[i]);
+          if (res.isSome()) {
+            return res;
+          }
+        }
+        return Optional.none();
+      };
+      return descend(scope.dom);
+    };
+
+    const ancestor$2 = (scope, selector, isRoot) => ancestor$3(scope, e => is$1(e, selector), isRoot);
+    const descendant = (scope, selector) => one(selector, scope);
+    const closest$3 = (scope, selector, isRoot) => {
+      const is = (element, selector) => is$1(element, selector);
+      return ClosestOrAncestor(is, ancestor$2, scope, selector, isRoot);
+    };
+
+    const StyleSheetLoader = (documentOrShadowRoot, settings = {}) => {
+      let idCount = 0;
+      const loadedStates = {};
+      const edos = SugarElement.fromDom(documentOrShadowRoot);
+      const doc = documentOrOwner(edos);
+      const maxLoadTime = settings.maxLoadTime || 5000;
+      const _setReferrerPolicy = referrerPolicy => {
+        settings.referrerPolicy = referrerPolicy;
+      };
+      const addStyle = element => {
+        append$1(getStyleContainer(edos), element);
+      };
+      const removeStyle = id => {
+        const styleContainer = getStyleContainer(edos);
+        descendant(styleContainer, '#' + id).each(remove$5);
+      };
+      const getOrCreateState = url => get$a(loadedStates, url).getOrThunk(() => ({
+        id: 'mce-u' + idCount++,
+        passed: [],
+        failed: [],
+        count: 0
+      }));
+      const load = url => new Promise((success, failure) => {
+        let link;
+        const urlWithSuffix = Tools._addCacheSuffix(url);
+        const state = getOrCreateState(urlWithSuffix);
+        loadedStates[urlWithSuffix] = state;
+        state.count++;
+        const resolve = (callbacks, status) => {
+          each$g(callbacks, call);
+          state.status = status;
+          state.passed = [];
+          state.failed = [];
+          if (link) {
+            link.onload = null;
+            link.onerror = null;
+            link = null;
+          }
+        };
+        const passed = () => resolve(state.passed, 2);
+        const failed = () => resolve(state.failed, 3);
+        const wait = (testCallback, waitCallback) => {
+          if (!testCallback()) {
+            if (Date.now() - startTime < maxLoadTime) {
+              setTimeout(waitCallback);
+            } else {
+              failed();
+            }
+          }
+        };
+        const waitForWebKitLinkLoaded = () => {
+          wait(() => {
+            const styleSheets = documentOrShadowRoot.styleSheets;
+            let i = styleSheets.length;
+            while (i--) {
+              const styleSheet = styleSheets[i];
+              const owner = styleSheet.ownerNode;
+              if (owner && owner.id === link.id) {
+                passed();
+                return true;
+              }
+            }
+            return false;
+          }, waitForWebKitLinkLoaded);
+        };
+        if (success) {
+          state.passed.push(success);
+        }
+        if (failure) {
+          state.failed.push(failure);
+        }
+        if (state.status === 1) {
+          return;
+        }
+        if (state.status === 2) {
+          passed();
+          return;
+        }
+        if (state.status === 3) {
+          failed();
+          return;
+        }
+        state.status = 1;
+        const linkElem = SugarElement.fromTag('link', doc.dom);
+        setAll$1(linkElem, {
+          rel: 'stylesheet',
+          type: 'text/css',
+          id: state.id
+        });
+        const startTime = Date.now();
+        if (settings.contentCssCors) {
+          set$2(linkElem, 'crossOrigin', 'anonymous');
+        }
+        if (settings.referrerPolicy) {
+          set$2(linkElem, 'referrerpolicy', settings.referrerPolicy);
+        }
+        link = linkElem.dom;
+        link.onload = waitForWebKitLinkLoaded;
+        link.onerror = failed;
+        addStyle(linkElem);
+        set$2(linkElem, 'href', urlWithSuffix);
+      });
+      const loadAll = urls => {
+        const loadedUrls = Promise.allSettled(map$3(urls, url => load(url).then(constant(url))));
+        return loadedUrls.then(results => {
+          const parts = partition$2(results, r => r.status === 'fulfilled');
+          if (parts.fail.length > 0) {
+            return Promise.reject(map$3(parts.fail, result => result.reason));
+          } else {
+            return map$3(parts.pass, result => result.value);
+          }
+        });
+      };
+      const unload = url => {
+        const urlWithSuffix = Tools._addCacheSuffix(url);
+        get$a(loadedStates, urlWithSuffix).each(state => {
+          const count = --state.count;
+          if (count === 0) {
+            delete loadedStates[urlWithSuffix];
+            removeStyle(state.id);
+          }
+        });
+      };
+      const unloadAll = urls => {
+        each$g(urls, url => {
+          unload(url);
+        });
+      };
+      return {
+        load,
+        loadAll,
+        unload,
+        unloadAll,
+        _setReferrerPolicy
+      };
+    };
+
+    const create$c = () => {
+      const map = new WeakMap();
+      const forElement = (referenceElement, settings) => {
+        const root = getRootNode(referenceElement);
+        const rootDom = root.dom;
+        return Optional.from(map.get(rootDom)).getOrThunk(() => {
+          const sl = StyleSheetLoader(rootDom, settings);
+          map.set(rootDom, sl);
+          return sl;
+        });
+      };
+      return { forElement };
+    };
+    const instance = create$c();
+
+    class DomTreeWalker {
+      constructor(startNode, rootNode) {
+        this.node = startNode;
+        this.rootNode = rootNode;
+        this.current = this.current.bind(this);
+        this.next = this.next.bind(this);
+        this.prev = this.prev.bind(this);
+        this.prev2 = this.prev2.bind(this);
+      }
+      current() {
+        return this.node;
+      }
+      next(shallow) {
+        this.node = this.findSibling(this.node, 'firstChild', 'nextSibling', shallow);
+        return this.node;
+      }
+      prev(shallow) {
+        this.node = this.findSibling(this.node, 'lastChild', 'previousSibling', shallow);
+        return this.node;
+      }
+      prev2(shallow) {
+        this.node = this.findPreviousNode(this.node, 'lastChild', 'previousSibling', shallow);
+        return this.node;
+      }
+      findSibling(node, startName, siblingName, shallow) {
+        let sibling, parent;
+        if (node) {
+          if (!shallow && node[startName]) {
+            return node[startName];
+          }
+          if (node !== this.rootNode) {
+            sibling = node[siblingName];
+            if (sibling) {
+              return sibling;
+            }
+            for (parent = node.parentNode; parent && parent !== this.rootNode; parent = parent.parentNode) {
+              sibling = parent[siblingName];
+              if (sibling) {
+                return sibling;
+              }
+            }
+          }
+        }
+      }
+      findPreviousNode(node, startName, siblingName, shallow) {
+        let sibling, parent, child;
+        if (node) {
+          sibling = node[siblingName];
+          if (this.rootNode && sibling === this.rootNode) {
+            return;
+          }
+          if (sibling) {
+            if (!shallow) {
+              for (child = sibling[startName]; child; child = child[startName]) {
+                if (!child[startName]) {
+                  return child;
+                }
+              }
+            }
+            return sibling;
+          }
+          parent = node.parentNode;
+          if (parent && parent !== this.rootNode) {
+            return parent;
+          }
+        }
+      }
+    }
+
+    const blocks = [
+      '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'
+    ];
+    const tableCells = [
+      'td',
+      'th'
+    ];
+    const tableSections = [
+      'thead',
+      'tbody',
+      'tfoot'
+    ];
+    const textBlocks = [
+      'h1',
+      'h2',
+      'h3',
+      'h4',
+      'h5',
+      'h6',
+      'p',
+      'div',
+      'address',
+      'pre',
+      'form',
+      'blockquote',
+      'center',
+      'dir',
+      'fieldset',
+      'header',
+      'footer',
+      'article',
+      'section',
+      'hgroup',
+      'aside',
+      'nav',
+      'figure'
+    ];
+    const headings = [
+      'h1',
+      'h2',
+      'h3',
+      'h4',
+      'h5',
+      'h6'
+    ];
+    const listItems$1 = [
+      'li',
+      'dd',
+      'dt'
+    ];
+    const lists = [
+      'ul',
+      'ol',
+      'dl'
+    ];
+    const wsElements = [
+      'pre',
+      'script',
+      'textarea',
+      'style'
+    ];
+    const lazyLookup = items => {
+      let lookup;
+      return node => {
+        lookup = lookup ? lookup : mapToObject(items, always);
+        return has$2(lookup, name(node));
+      };
+    };
+    const isHeading = lazyLookup(headings);
+    const isBlock$2 = lazyLookup(blocks);
+    const isTable$2 = node => name(node) === 'table';
+    const isInline$1 = node => isElement$7(node) && !isBlock$2(node);
+    const isBr$4 = node => isElement$7(node) && name(node) === 'br';
+    const isTextBlock$2 = lazyLookup(textBlocks);
+    const isList = lazyLookup(lists);
+    const isListItem = lazyLookup(listItems$1);
+    const isTableSection = lazyLookup(tableSections);
+    const isTableCell$4 = lazyLookup(tableCells);
+    const isWsPreserveElement = lazyLookup(wsElements);
+
+    const ancestor$1 = (scope, selector, isRoot) => ancestor$2(scope, selector, isRoot).isSome();
+
+    const zeroWidth = '\uFEFF';
+    const nbsp = '\xA0';
+    const isZwsp$1 = char => char === zeroWidth;
+    const removeZwsp = s => s.replace(/\uFEFF/g, '');
+
+    const ZWSP$1 = zeroWidth;
+    const isZwsp = isZwsp$1;
+    const trim$1 = removeZwsp;
+
+    const isElement$5 = isElement$6;
+    const isText$7 = isText$8;
+    const isCaretContainerBlock$1 = node => {
+      if (isText$7(node)) {
+        node = node.parentNode;
+      }
+      return isElement$5(node) && node.hasAttribute('data-mce-caret');
+    };
+    const isCaretContainerInline = node => isText$7(node) && isZwsp(node.data);
+    const isCaretContainer$2 = node => isCaretContainerBlock$1(node) || isCaretContainerInline(node);
+    const hasContent = node => node.firstChild !== node.lastChild || !isBr$5(node.firstChild);
+    const insertInline$1 = (node, before) => {
+      const doc = node.ownerDocument;
+      const textNode = doc.createTextNode(ZWSP$1);
+      const parentNode = node.parentNode;
+      if (!before) {
+        const sibling = node.nextSibling;
+        if (isText$7(sibling)) {
+          if (isCaretContainer$2(sibling)) {
+            return sibling;
+          }
+          if (startsWithCaretContainer$1(sibling)) {
+            sibling.splitText(1);
+            return sibling;
+          }
+        }
+        if (node.nextSibling) {
+          parentNode.insertBefore(textNode, node.nextSibling);
+        } else {
+          parentNode.appendChild(textNode);
+        }
+      } else {
+        const sibling = node.previousSibling;
+        if (isText$7(sibling)) {
+          if (isCaretContainer$2(sibling)) {
+            return sibling;
+          }
+          if (endsWithCaretContainer$1(sibling)) {
+            return sibling.splitText(sibling.data.length - 1);
+          }
+        }
+        parentNode.insertBefore(textNode, node);
+      }
+      return textNode;
+    };
+    const isBeforeInline = pos => {
+      const container = pos.container();
+      if (!isText$8(container)) {
+        return false;
+      }
+      return container.data.charAt(pos.offset()) === ZWSP$1 || pos.isAtStart() && isCaretContainerInline(container.previousSibling);
+    };
+    const isAfterInline = pos => {
+      const container = pos.container();
+      if (!isText$8(container)) {
+        return false;
+      }
+      return container.data.charAt(pos.offset() - 1) === ZWSP$1 || pos.isAtEnd() && isCaretContainerInline(container.nextSibling);
+    };
+    const createBogusBr = () => {
+      const br = document.createElement('br');
+      br.setAttribute('data-mce-bogus', '1');
+      return br;
+    };
+    const insertBlock = (blockName, node, before) => {
+      const doc = node.ownerDocument;
+      const blockNode = doc.createElement(blockName);
+      blockNode.setAttribute('data-mce-caret', before ? 'before' : 'after');
+      blockNode.setAttribute('data-mce-bogus', 'all');
+      blockNode.appendChild(createBogusBr());
+      const parentNode = node.parentNode;
+      if (!before) {
+        if (node.nextSibling) {
+          parentNode.insertBefore(blockNode, node.nextSibling);
+        } else {
+          parentNode.appendChild(blockNode);
+        }
+      } else {
+        parentNode.insertBefore(blockNode, node);
+      }
+      return blockNode;
+    };
+    const startsWithCaretContainer$1 = node => isText$7(node) && node.data[0] === ZWSP$1;
+    const endsWithCaretContainer$1 = node => isText$7(node) && node.data[node.data.length - 1] === ZWSP$1;
+    const trimBogusBr = elm => {
+      const brs = elm.getElementsByTagName('br');
+      const lastBr = brs[brs.length - 1];
+      if (isBogus$2(lastBr)) {
+        lastBr.parentNode.removeChild(lastBr);
+      }
+    };
+    const showCaretContainerBlock = caretContainer => {
+      if (caretContainer && caretContainer.hasAttribute('data-mce-caret')) {
+        trimBogusBr(caretContainer);
+        caretContainer.removeAttribute('data-mce-caret');
+        caretContainer.removeAttribute('data-mce-bogus');
+        caretContainer.removeAttribute('style');
+        caretContainer.removeAttribute('data-mce-style');
+        caretContainer.removeAttribute('_moz_abspos');
+        return caretContainer;
+      }
+      return null;
+    };
+    const isRangeInCaretContainerBlock = range => isCaretContainerBlock$1(range.startContainer);
+
+    const isContentEditableTrue$3 = isContentEditableTrue$4;
+    const isContentEditableFalse$9 = isContentEditableFalse$a;
+    const isBr$3 = isBr$5;
+    const isText$6 = isText$8;
+    const isInvalidTextElement = matchNodeNames([
+      'script',
+      'style',
+      'textarea'
+    ]);
+    const isAtomicInline = matchNodeNames([
+      'img',
+      'input',
+      'textarea',
+      'hr',
+      'iframe',
+      'video',
+      'audio',
+      'object',
+      'embed'
+    ]);
+    const isTable$1 = matchNodeNames(['table']);
+    const isCaretContainer$1 = isCaretContainer$2;
+    const isCaretCandidate$3 = node => {
+      if (isCaretContainer$1(node)) {
+        return false;
+      }
+      if (isText$6(node)) {
+        return !isInvalidTextElement(node.parentNode);
+      }
+      return isAtomicInline(node) || isBr$3(node) || isTable$1(node) || isNonUiContentEditableFalse(node);
+    };
+    const isUnselectable = node => isElement$6(node) && node.getAttribute('unselectable') === 'true';
+    const isNonUiContentEditableFalse = node => isUnselectable(node) === false && isContentEditableFalse$9(node);
+    const isInEditable = (node, root) => {
+      for (node = node.parentNode; node && node !== root; node = node.parentNode) {
+        if (isNonUiContentEditableFalse(node)) {
+          return false;
+        }
+        if (isContentEditableTrue$3(node)) {
+          return true;
+        }
+      }
+      return true;
+    };
+    const isAtomicContentEditableFalse = node => {
+      if (!isNonUiContentEditableFalse(node)) {
+        return false;
+      }
+      return foldl(from(node.getElementsByTagName('*')), (result, elm) => {
+        return result || isContentEditableTrue$3(elm);
+      }, false) !== true;
+    };
+    const isAtomic$1 = node => isAtomicInline(node) || isAtomicContentEditableFalse(node);
+    const isEditableCaretCandidate$1 = (node, root) => isCaretCandidate$3(node) && isInEditable(node, root);
+
+    const whiteSpaceRegExp = /^[ \t\r\n]*$/;
+    const isWhitespaceText = text => whiteSpaceRegExp.test(text);
+    const isCollapsibleWhitespace$1 = c => ' \f\t\x0B'.indexOf(c) !== -1;
+    const isNewLineChar = c => c === '\n' || c === '\r';
+    const isNewline = (text, idx) => idx < text.length && idx >= 0 ? isNewLineChar(text[idx]) : false;
+    const normalize$4 = (text, tabSpaces = 4, isStartOfContent = true, isEndOfContent = true) => {
+      const tabSpace = repeat(' ', tabSpaces);
+      const normalizedText = text.replace(/\t/g, tabSpace);
+      const result = foldl(normalizedText, (acc, c) => {
+        if (isCollapsibleWhitespace$1(c) || c === nbsp) {
+          if (acc.pcIsSpace || acc.str === '' && isStartOfContent || acc.str.length === normalizedText.length - 1 && isEndOfContent || isNewline(normalizedText, acc.str.length + 1)) {
+            return {
+              pcIsSpace: false,
+              str: acc.str + nbsp
+            };
+          } else {
+            return {
+              pcIsSpace: true,
+              str: acc.str + ' '
+            };
+          }
+        } else {
+          return {
+            pcIsSpace: isNewLineChar(c),
+            str: acc.str + c
+          };
+        }
+      }, {
+        pcIsSpace: false,
+        str: ''
+      });
+      return result.str;
+    };
+
+    const hasWhitespacePreserveParent = (node, rootNode) => {
+      const rootElement = SugarElement.fromDom(rootNode);
+      const startNode = SugarElement.fromDom(node);
+      return ancestor$1(startNode, 'pre,code', curry(eq, rootElement));
+    };
+    const isWhitespace$1 = (node, rootNode) => {
+      return isText$8(node) && isWhitespaceText(node.data) && hasWhitespacePreserveParent(node, rootNode) === false;
+    };
+    const isNamedAnchor = node => {
+      return isElement$6(node) && node.nodeName === 'A' && !node.hasAttribute('href') && (node.hasAttribute('name') || node.hasAttribute('id'));
+    };
+    const isContent$1 = (node, rootNode) => {
+      return isCaretCandidate$3(node) && isWhitespace$1(node, rootNode) === false || isNamedAnchor(node) || isBookmark(node);
+    };
+    const isBookmark = hasAttribute('data-mce-bookmark');
+    const isBogus$1 = hasAttribute('data-mce-bogus');
+    const isBogusAll = hasAttributeValue('data-mce-bogus', 'all');
+    const isEmptyNode = (targetNode, skipBogus) => {
+      let brCount = 0;
+      if (isContent$1(targetNode, targetNode)) {
+        return false;
+      } else {
+        let node = targetNode.firstChild;
+        if (!node) {
+          return true;
+        }
+        const walker = new DomTreeWalker(node, targetNode);
+        do {
+          if (skipBogus) {
+            if (isBogusAll(node)) {
+              node = walker.next(true);
+              continue;
+            }
+            if (isBogus$1(node)) {
+              node = walker.next();
+              continue;
+            }
+          }
+          if (isBr$5(node)) {
+            brCount++;
+            node = walker.next();
+            continue;
+          }
+          if (isContent$1(node, targetNode)) {
+            return false;
+          }
+          node = walker.next();
+        } while (node);
+        return brCount <= 1;
+      }
+    };
+    const isEmpty$2 = (elm, skipBogus = true) => isEmptyNode(elm.dom, skipBogus);
+
+    const isSpan = node => node.nodeName.toLowerCase() === 'span';
+    const isInlineContent = (node, root) => isNonNullable(node) && (isContent$1(node, root) || isInline$1(SugarElement.fromDom(node)));
+    const surroundedByInlineContent = (node, root) => {
+      const prev = new DomTreeWalker(node, root).prev(false);
+      const next = new DomTreeWalker(node, root).next(false);
+      const prevIsInline = isUndefined(prev) || isInlineContent(prev, root);
+      const nextIsInline = isUndefined(next) || isInlineContent(next, root);
+      return prevIsInline && nextIsInline;
+    };
+    const isBookmarkNode$2 = node => isSpan(node) && node.getAttribute('data-mce-type') === 'bookmark';
+    const isKeepTextNode = (node, root) => isText$8(node) && node.data.length > 0 && surroundedByInlineContent(node, root);
+    const isKeepElement = node => isElement$6(node) ? node.childNodes.length > 0 : false;
+    const isDocument = node => isDocumentFragment(node) || isDocument$1(node);
+    const trimNode = (dom, node, root) => {
+      const rootNode = root || node;
+      if (isElement$6(node) && isBookmarkNode$2(node)) {
+        return node;
+      }
+      const children = node.childNodes;
+      for (let i = children.length - 1; i >= 0; i--) {
+        trimNode(dom, children[i], rootNode);
+      }
+      if (isElement$6(node)) {
+        const currentChildren = node.childNodes;
+        if (currentChildren.length === 1 && isBookmarkNode$2(currentChildren[0])) {
+          node.parentNode.insertBefore(currentChildren[0], node);
+        }
+      }
+      if (!isDocument(node) && !isContent$1(node, rootNode) && !isKeepElement(node) && !isKeepTextNode(node, rootNode)) {
+        dom.remove(node);
+      }
+      return node;
+    };
+
+    const makeMap$3 = Tools.makeMap;
+    const attrsCharsRegExp = /[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+    const textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+    const rawCharsRegExp = /[<>&\"\']/g;
+    const entityRegExp = /&#([a-z0-9]+);?|&([a-z0-9]+);/gi;
+    const asciiMap = {
+      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'
+    };
+    const baseEntities = {
+      '"': '&quot;',
+      '\'': '&#39;',
+      '<': '&lt;',
+      '>': '&gt;',
+      '&': '&amp;',
+      '`': '&#96;'
+    };
+    const reverseEntities = {
+      '&lt;': '<',
+      '&gt;': '>',
+      '&amp;': '&',
+      '&quot;': '"',
+      '&apos;': `'`
+    };
+    const nativeDecode = text => {
+      const elm = SugarElement.fromTag('div').dom;
+      elm.innerHTML = text;
+      return elm.textContent || elm.innerText || text;
+    };
+    const buildEntitiesLookup = (items, radix) => {
+      let i, chr, entity;
+      const lookup = {};
+      if (items) {
+        items = items.split(',');
+        radix = radix || 10;
+        for (i = 0; i < items.length; i += 2) {
+          chr = String.fromCharCode(parseInt(items[i], radix));
+          if (!baseEntities[chr]) {
+            entity = '&' + items[i + 1] + ';';
+            lookup[chr] = entity;
+            lookup[entity] = chr;
+          }
+        }
+        return lookup;
+      }
+    };
+    const namedEntities = buildEntitiesLookup('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);
+    const encodeRaw = (text, attr) => text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {
+      return baseEntities[chr] || chr;
+    });
+    const encodeAllRaw = text => ('' + text).replace(rawCharsRegExp, chr => {
+      return baseEntities[chr] || chr;
+    });
+    const encodeNumeric = (text, attr) => text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {
+      if (chr.length > 1) {
+        return '&#' + ((chr.charCodeAt(0) - 55296) * 1024 + (chr.charCodeAt(1) - 56320) + 65536) + ';';
+      }
+      return baseEntities[chr] || '&#' + chr.charCodeAt(0) + ';';
+    });
+    const encodeNamed = (text, attr, entities) => {
+      entities = entities || namedEntities;
+      return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {
+        return baseEntities[chr] || entities[chr] || chr;
+      });
+    };
+    const getEncodeFunc = (name, entities) => {
+      const entitiesMap = buildEntitiesLookup(entities) || namedEntities;
+      const encodeNamedAndNumeric = (text, attr) => text.replace(attr ? attrsCharsRegExp : textCharsRegExp, chr => {
+        if (baseEntities[chr] !== undefined) {
+          return baseEntities[chr];
+        }
+        if (entitiesMap[chr] !== undefined) {
+          return entitiesMap[chr];
+        }
+        if (chr.length > 1) {
+          return '&#' + ((chr.charCodeAt(0) - 55296) * 1024 + (chr.charCodeAt(1) - 56320) + 65536) + ';';
+        }
+        return '&#' + chr.charCodeAt(0) + ';';
+      });
+      const encodeCustomNamed = (text, attr) => {
+        return encodeNamed(text, attr, entitiesMap);
+      };
+      const nameMap = makeMap$3(name.replace(/\+/g, ','));
+      if (nameMap.named && nameMap.numeric) {
+        return encodeNamedAndNumeric;
+      }
+      if (nameMap.named) {
+        if (entities) {
+          return encodeCustomNamed;
+        }
+        return encodeNamed;
+      }
+      if (nameMap.numeric) {
+        return encodeNumeric;
+      }
+      return encodeRaw;
+    };
+    const decode = text => text.replace(entityRegExp, (all, numeric) => {
+      if (numeric) {
+        if (numeric.charAt(0).toLowerCase() === 'x') {
+          numeric = parseInt(numeric.substr(1), 16);
+        } else {
+          numeric = parseInt(numeric, 10);
+        }
+        if (numeric > 65535) {
+          numeric -= 65536;
+          return String.fromCharCode(55296 + (numeric >> 10), 56320 + (numeric & 1023));
+        }
+        return asciiMap[numeric] || String.fromCharCode(numeric);
+      }
+      return reverseEntities[all] || namedEntities[all] || nativeDecode(all);
+    });
+    const Entities = {
+      encodeRaw,
+      encodeAllRaw,
+      encodeNumeric,
+      encodeNamed,
+      getEncodeFunc,
+      decode
+    };
+
+    const mapCache = {}, dummyObj = {};
+    const makeMap$2 = Tools.makeMap, each$d = Tools.each, extend$2 = Tools.extend, explode$2 = Tools.explode, inArray = Tools.inArray;
+    const split$1 = (items, delim) => {
+      items = Tools.trim(items);
+      return items ? items.split(delim || ' ') : [];
+    };
+    const createMap = (defaultValue, extendWith) => {
+      const value = makeMap$2(defaultValue, ' ', makeMap$2(defaultValue.toUpperCase(), ' '));
+      return extend$2(value, extendWith);
+    };
+    const getTextRootBlockElements = schema => createMap('td th li dt dd figcaption caption details summary', schema.getTextBlockElements());
+    const compileSchema = type => {
+      const schema = {};
+      let globalAttributes, blockContent;
+      let phrasingContent, flowContent, html4BlockContent, html4PhrasingContent;
+      const add = (name, attributes = '', children = '') => {
+        const childNames = split$1(children);
+        const names = split$1(name);
+        let ni = names.length;
+        while (ni--) {
+          const attributesOrder = split$1([
+            globalAttributes,
+            attributes
+          ].join(' '));
+          schema[names[ni]] = {
+            attributes: mapToObject(attributesOrder, () => ({})),
+            attributesOrder,
+            children: mapToObject(childNames, constant(dummyObj))
+          };
+        }
+      };
+      const addAttrs = (name, attributes) => {
+        const names = split$1(name);
+        const attrs = split$1(attributes);
+        let ni = names.length;
+        while (ni--) {
+          const schemaItem = schema[names[ni]];
+          for (let i = 0, l = attrs.length; i < l; i++) {
+            schemaItem.attributes[attrs[i]] = {};
+            schemaItem.attributesOrder.push(attrs[i]);
+          }
+        }
+      };
+      if (mapCache[type]) {
+        return mapCache[type];
+      }
+      globalAttributes = 'id accesskey class dir lang style tabindex title role';
+      blockContent = 'address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul';
+      phrasingContent = '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';
+      if (type !== 'html4') {
+        globalAttributes += ' contenteditable contextmenu draggable dropzone ' + 'hidden spellcheck translate';
+        blockContent += ' article aside details dialog figure main header footer hgroup section nav';
+        phrasingContent += ' audio canvas command datalist mark meter output picture ' + 'progress time wbr video ruby bdi keygen';
+      }
+      if (type !== 'html5-strict') {
+        globalAttributes += ' xml:lang';
+        html4PhrasingContent = 'acronym applet basefont big font strike tt';
+        phrasingContent = [
+          phrasingContent,
+          html4PhrasingContent
+        ].join(' ');
+        each$d(split$1(html4PhrasingContent), name => {
+          add(name, '', phrasingContent);
+        });
+        html4BlockContent = 'center dir isindex noframes';
+        blockContent = [
+          blockContent,
+          html4BlockContent
+        ].join(' ');
+        flowContent = [
+          blockContent,
+          phrasingContent
+        ].join(' ');
+        each$d(split$1(html4BlockContent), name => {
+          add(name, '', flowContent);
+        });
+      }
+      flowContent = flowContent || [
+        blockContent,
+        phrasingContent
+      ].join(' ');
+      add('html', 'manifest', 'head body');
+      add('head', '', 'base command link meta noscript script style title');
+      add('title hr noscript br');
+      add('base', 'href target');
+      add('link', 'href rel media hreflang type sizes hreflang');
+      add('meta', 'name http-equiv content charset');
+      add('style', 'media type scoped');
+      add('script', 'src async defer type charset');
+      add('body', 'onafterprint onbeforeprint onbeforeunload onblur onerror onfocus ' + 'onhashchange onload onmessage onoffline ononline onpagehide onpageshow ' + 'onpopstate onresize onscroll onstorage onunload', flowContent);
+      add('address dt dd div caption', '', flowContent);
+      add('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', '', phrasingContent);
+      add('blockquote', 'cite', flowContent);
+      add('ol', 'reversed start type', 'li');
+      add('ul', '', 'li');
+      add('li', 'value', flowContent);
+      add('dl', '', 'dt dd');
+      add('a', 'href target rel media hreflang type', phrasingContent);
+      add('q', 'cite', phrasingContent);
+      add('ins del', 'cite datetime', flowContent);
+      add('img', 'src sizes srcset alt usemap ismap width height');
+      add('iframe', 'src name width height', flowContent);
+      add('embed', 'src type width height');
+      add('object', 'data type typemustmatch name usemap form width height', [
+        flowContent,
+        'param'
+      ].join(' '));
+      add('param', 'name value');
+      add('map', 'name', [
+        flowContent,
+        'area'
+      ].join(' '));
+      add('area', 'alt coords shape href target rel media hreflang type');
+      add('table', 'border', 'caption colgroup thead tfoot tbody tr' + (type === 'html4' ? ' col' : ''));
+      add('colgroup', 'span', 'col');
+      add('col', 'span');
+      add('tbody thead tfoot', '', 'tr');
+      add('tr', '', 'td th');
+      add('td', 'colspan rowspan headers', flowContent);
+      add('th', 'colspan rowspan headers scope abbr', flowContent);
+      add('form', 'accept-charset action autocomplete enctype method name novalidate target', flowContent);
+      add('fieldset', 'disabled form name', [
+        flowContent,
+        'legend'
+      ].join(' '));
+      add('label', 'form for', phrasingContent);
+      add('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');
+      add('button', 'disabled form formaction formenctype formmethod formnovalidate formtarget name type value', type === 'html4' ? flowContent : phrasingContent);
+      add('select', 'disabled form multiple name required size', 'option optgroup');
+      add('optgroup', 'disabled label', 'option');
+      add('option', 'disabled label selected value');
+      add('textarea', 'cols dirname disabled form maxlength name readonly required rows wrap');
+      add('menu', 'type label', [
+        flowContent,
+        'li'
+      ].join(' '));
+      add('noscript', '', flowContent);
+      if (type !== 'html4') {
+        add('wbr');
+        add('ruby', '', [
+          phrasingContent,
+          'rt rp'
+        ].join(' '));
+        add('figcaption', '', flowContent);
+        add('mark rt rp summary bdi', '', phrasingContent);
+        add('canvas', 'width height', flowContent);
+        add('video', 'src crossorigin poster preload autoplay mediagroup loop ' + 'muted controls width height buffered', [
+          flowContent,
+          'track source'
+        ].join(' '));
+        add('audio', 'src crossorigin preload autoplay mediagroup loop muted controls ' + 'buffered volume', [
+          flowContent,
+          'track source'
+        ].join(' '));
+        add('picture', '', 'img source');
+        add('source', 'src srcset type media sizes');
+        add('track', 'kind src srclang label default');
+        add('datalist', '', [
+          phrasingContent,
+          'option'
+        ].join(' '));
+        add('article section nav aside main header footer', '', flowContent);
+        add('hgroup', '', 'h1 h2 h3 h4 h5 h6');
+        add('figure', '', [
+          flowContent,
+          'figcaption'
+        ].join(' '));
+        add('time', 'datetime', phrasingContent);
+        add('dialog', 'open', flowContent);
+        add('command', 'type label icon disabled checked radiogroup command');
+        add('output', 'for form name', phrasingContent);
+        add('progress', 'value max', phrasingContent);
+        add('meter', 'value min max low high optimum', phrasingContent);
+        add('details', 'open', [
+          flowContent,
+          'summary'
+        ].join(' '));
+        add('keygen', 'autofocus challenge disabled form keytype name');
+      }
+      if (type !== 'html5-strict') {
+        addAttrs('script', 'language xml:space');
+        addAttrs('style', 'xml:space');
+        addAttrs('object', 'declare classid code codebase codetype archive standby align border hspace vspace');
+        addAttrs('embed', 'align name hspace vspace');
+        addAttrs('param', 'valuetype type');
+        addAttrs('a', 'charset name rev shape coords');
+        addAttrs('br', 'clear');
+        addAttrs('applet', 'codebase archive code object alt name width height align hspace vspace');
+        addAttrs('img', 'name longdesc align border hspace vspace');
+        addAttrs('iframe', 'longdesc frameborder marginwidth marginheight scrolling align');
+        addAttrs('font basefont', 'size color face');
+        addAttrs('input', 'usemap align');
+        addAttrs('select');
+        addAttrs('textarea');
+        addAttrs('h1 h2 h3 h4 h5 h6 div p legend caption', 'align');
+        addAttrs('ul', 'type compact');
+        addAttrs('li', 'type');
+        addAttrs('ol dl menu dir', 'compact');
+        addAttrs('pre', 'width xml:space');
+        addAttrs('hr', 'align noshade size width');
+        addAttrs('isindex', 'prompt');
+        addAttrs('table', 'summary width frame rules cellspacing cellpadding align bgcolor');
+        addAttrs('col', 'width align char charoff valign');
+        addAttrs('colgroup', 'width align char charoff valign');
+        addAttrs('thead', 'align char charoff valign');
+        addAttrs('tr', 'align char charoff valign bgcolor');
+        addAttrs('th', 'axis align char charoff valign nowrap bgcolor width height');
+        addAttrs('form', 'accept');
+        addAttrs('td', 'abbr axis scope align char charoff valign nowrap bgcolor width height');
+        addAttrs('tfoot', 'align char charoff valign');
+        addAttrs('tbody', 'align char charoff valign');
+        addAttrs('area', 'nohref');
+        addAttrs('body', 'background bgcolor text link vlink alink');
+      }
+      if (type !== 'html4') {
+        addAttrs('input button select textarea', 'autofocus');
+        addAttrs('input textarea', 'placeholder');
+        addAttrs('a', 'download');
+        addAttrs('link script img', 'crossorigin');
+        addAttrs('img', 'loading');
+        addAttrs('iframe', 'sandbox seamless allowfullscreen loading');
+      }
+      if (type !== 'html4') {
+        each$g([
+          schema.video,
+          schema.audio
+        ], item => {
+          delete item.children.audio;
+          delete item.children.video;
+        });
+      }
+      each$d(split$1('a form meter progress dfn'), name => {
+        if (schema[name]) {
+          delete schema[name].children[name];
+        }
+      });
+      delete schema.caption.children.table;
+      delete schema.script;
+      mapCache[type] = schema;
+      return schema;
+    };
+    const compileElementMap = (value, mode) => {
+      let styles;
+      if (value) {
+        styles = {};
+        if (typeof value === 'string') {
+          value = { '*': value };
+        }
+        each$d(value, (value, key) => {
+          styles[key] = styles[key.toUpperCase()] = mode === 'map' ? makeMap$2(value, /[, ]/) : explode$2(value, /[, ]/);
+        });
+      }
+      return styles;
+    };
+    const Schema = settings => {
+      var _a;
+      const elements = {};
+      const children = {};
+      let patternElements = [];
+      const customElementsMap = {}, specialElements = {};
+      const createLookupTable = (option, defaultValue, extendWith) => {
+        let value = settings[option];
+        if (!value) {
+          value = mapCache[option];
+          if (!value) {
+            value = createMap(defaultValue, extendWith);
+            mapCache[option] = value;
+          }
+        } else {
+          value = makeMap$2(value, /[, ]/, makeMap$2(value.toUpperCase(), /[, ]/));
+        }
+        return value;
+      };
+      settings = settings || {};
+      const schemaType = (_a = settings.schema) !== null && _a !== void 0 ? _a : 'html5';
+      const schemaItems = compileSchema(schemaType);
+      if (settings.verify_html === false) {
+        settings.valid_elements = '*[*]';
+      }
+      const validStyles = compileElementMap(settings.valid_styles);
+      const invalidStyles = compileElementMap(settings.invalid_styles, 'map');
+      const validClasses = compileElementMap(settings.valid_classes, 'map');
+      const whitespaceElementsMap = createLookupTable('whitespace_elements', 'pre script noscript style textarea video audio iframe object code');
+      const selfClosingElementsMap = createLookupTable('self_closing_elements', 'colgroup dd dt li option p td tfoot th thead tr');
+      const voidElementsMap = createLookupTable('void_elements', 'area base basefont br col frame hr img input isindex link ' + 'meta param embed source wbr track');
+      const boolAttrMap = createLookupTable('boolean_attributes', 'checked compact declare defer disabled ismap multiple nohref noresize ' + 'noshade nowrap readonly selected autoplay loop controls allowfullscreen');
+      const nonEmptyOrMoveCaretBeforeOnEnter = 'td th iframe video audio object script code';
+      const nonEmptyElementsMap = createLookupTable('non_empty_elements', nonEmptyOrMoveCaretBeforeOnEnter + ' pre', voidElementsMap);
+      const moveCaretBeforeOnEnterElementsMap = createLookupTable('move_caret_before_on_enter_elements', nonEmptyOrMoveCaretBeforeOnEnter + ' table', voidElementsMap);
+      const textBlockElementsMap = createLookupTable('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');
+      const blockElementsMap = createLookupTable('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', textBlockElementsMap);
+      const textInlineElementsMap = createLookupTable('text_inline_elements', 'span strong b em i font s strike u var cite ' + 'dfn code mark q sup sub samp');
+      each$d('script noscript iframe noframes noembed title style textarea xmp plaintext'.split(' '), name => {
+        specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');
+      });
+      const patternToRegExp = str => new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');
+      const addValidElements = validElements => {
+        let ei, el, ai, al, matches, element, attr, attrData, elementName, attrName, attrType, attributes, attributesOrder, prefix, outputName, globalAttributes, globalAttributesOrder, value;
+        const elementRuleRegExp = /^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)])?$/, attrRuleRegExp = /^([!\-])?(\w+[\\:]:\w+|[^=~<]+)?(?:([=~<])(.*))?$/, hasPatternsRegExp = /[*?+]/;
+        if (validElements) {
+          const validElementsArr = split$1(validElements, ',');
+          if (elements['@']) {
+            globalAttributes = elements['@'].attributes;
+            globalAttributesOrder = elements['@'].attributesOrder;
+          }
+          for (ei = 0, el = validElementsArr.length; ei < el; ei++) {
+            matches = elementRuleRegExp.exec(validElementsArr[ei]);
+            if (matches) {
+              prefix = matches[1];
+              elementName = matches[2];
+              outputName = matches[3];
+              attrData = matches[5];
+              attributes = {};
+              attributesOrder = [];
+              element = {
+                attributes,
+                attributesOrder
+              };
+              if (prefix === '#') {
+                element.paddEmpty = true;
+              }
+              if (prefix === '-') {
+                element.removeEmpty = true;
+              }
+              if (matches[4] === '!') {
+                element.removeEmptyAttrs = true;
+              }
+              if (globalAttributes) {
+                each$f(globalAttributes, (value, key) => {
+                  attributes[key] = value;
+                });
+                attributesOrder.push.apply(attributesOrder, globalAttributesOrder);
+              }
+              if (attrData) {
+                attrData = split$1(attrData, '|');
+                for (ai = 0, al = attrData.length; ai < al; ai++) {
+                  matches = attrRuleRegExp.exec(attrData[ai]);
+                  if (matches) {
+                    attr = {};
+                    attrType = matches[1];
+                    attrName = matches[2].replace(/[\\:]:/g, ':');
+                    prefix = matches[3];
+                    value = matches[4];
+                    if (attrType === '!') {
+                      element.attributesRequired = element.attributesRequired || [];
+                      element.attributesRequired.push(attrName);
+                      attr.required = true;
+                    }
+                    if (attrType === '-') {
+                      delete attributes[attrName];
+                      attributesOrder.splice(inArray(attributesOrder, attrName), 1);
+                      continue;
+                    }
+                    if (prefix) {
+                      if (prefix === '=') {
+                        element.attributesDefault = element.attributesDefault || [];
+                        element.attributesDefault.push({
+                          name: attrName,
+                          value
+                        });
+                        attr.defaultValue = value;
+                      }
+                      if (prefix === '~') {
+                        element.attributesForced = element.attributesForced || [];
+                        element.attributesForced.push({
+                          name: attrName,
+                          value
+                        });
+                        attr.forcedValue = value;
+                      }
+                      if (prefix === '<') {
+                        attr.validValues = makeMap$2(value, '?');
+                      }
+                    }
+                    if (hasPatternsRegExp.test(attrName)) {
+                      element.attributePatterns = element.attributePatterns || [];
+                      attr.pattern = patternToRegExp(attrName);
+                      element.attributePatterns.push(attr);
+                    } else {
+                      if (!attributes[attrName]) {
+                        attributesOrder.push(attrName);
+                      }
+                      attributes[attrName] = attr;
+                    }
+                  }
+                }
+              }
+              if (!globalAttributes && elementName === '@') {
+                globalAttributes = attributes;
+                globalAttributesOrder = attributesOrder;
+              }
+              if (outputName) {
+                element.outputName = elementName;
+                elements[outputName] = element;
+              }
+              if (hasPatternsRegExp.test(elementName)) {
+                element.pattern = patternToRegExp(elementName);
+                patternElements.push(element);
+              } else {
+                elements[elementName] = element;
+              }
+            }
+          }
+        }
+      };
+      const setValidElements = validElements => {
+        patternElements = [];
+        each$g(keys(elements), name => {
+          delete elements[name];
+        });
+        addValidElements(validElements);
+        each$d(schemaItems, (element, name) => {
+          children[name] = element.children;
+        });
+      };
+      const addCustomElements = customElements => {
+        const customElementRegExp = /^(~)?(.+)$/;
+        if (customElements) {
+          mapCache.text_block_elements = mapCache.block_elements = null;
+          each$d(split$1(customElements, ','), rule => {
+            const matches = customElementRegExp.exec(rule), inline = matches[1] === '~', cloneName = inline ? 'span' : 'div', name = matches[2];
+            children[name] = children[cloneName];
+            customElementsMap[name] = cloneName;
+            if (!inline) {
+              blockElementsMap[name.toUpperCase()] = {};
+              blockElementsMap[name] = {};
+            }
+            if (!elements[name]) {
+              let customRule = elements[cloneName];
+              customRule = extend$2({}, customRule);
+              delete customRule.removeEmptyAttrs;
+              delete customRule.removeEmpty;
+              elements[name] = customRule;
+            }
+            each$d(children, (element, elmName) => {
+              if (element[cloneName]) {
+                children[elmName] = element = extend$2({}, children[elmName]);
+                element[name] = element[cloneName];
+              }
+            });
+          });
+        }
+      };
+      const addValidChildren = validChildren => {
+        const childRuleRegExp = /^([+\-]?)([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]+)\[([^\]]+)]$/;
+        mapCache[schemaType] = null;
+        if (validChildren) {
+          each$d(split$1(validChildren, ','), rule => {
+            const matches = childRuleRegExp.exec(rule);
+            let parent, prefix;
+            if (matches) {
+              prefix = matches[1];
+              if (prefix) {
+                parent = children[matches[2]];
+              } else {
+                parent = children[matches[2]] = { '#comment': {} };
+              }
+              parent = children[matches[2]];
+              each$d(split$1(matches[3], '|'), child => {
+                if (prefix === '-') {
+                  delete parent[child];
+                } else {
+                  parent[child] = {};
+                }
+              });
+            }
+          });
+        }
+      };
+      const getElementRule = name => {
+        let element = elements[name], i;
+        if (element) {
+          return element;
+        }
+        i = patternElements.length;
+        while (i--) {
+          element = patternElements[i];
+          if (element.pattern.test(name)) {
+            return element;
+          }
+        }
+      };
+      if (!settings.valid_elements) {
+        each$d(schemaItems, (element, name) => {
+          elements[name] = {
+            attributes: element.attributes,
+            attributesOrder: element.attributesOrder
+          };
+          children[name] = element.children;
+        });
+        each$d(split$1('strong/b em/i'), item => {
+          const items = split$1(item, '/');
+          elements[items[1]].outputName = items[0];
+        });
+        each$d(textInlineElementsMap, (_val, name) => {
+          if (elements[name]) {
+            if (settings.padd_empty_block_inline_children) {
+              elements[name].paddInEmptyBlock = true;
+            }
+            elements[name].removeEmpty = true;
+          }
+        });
+        each$d(split$1('ol ul blockquote a table tbody'), name => {
+          if (elements[name]) {
+            elements[name].removeEmpty = true;
+          }
+        });
+        each$d(split$1('p h1 h2 h3 h4 h5 h6 th td pre div address caption li'), name => {
+          elements[name].paddEmpty = true;
+        });
+        each$d(split$1('span'), name => {
+          elements[name].removeEmptyAttrs = true;
+        });
+      } else {
+        setValidElements(settings.valid_elements);
+      }
+      addCustomElements(settings.custom_elements);
+      addValidChildren(settings.valid_children);
+      addValidElements(settings.extended_valid_elements);
+      addValidChildren('+ol[ul|ol],+ul[ul|ol]');
+      each$d({
+        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'
+      }, (parents, item) => {
+        if (elements[item]) {
+          elements[item].parentsRequired = split$1(parents);
+        }
+      });
+      if (settings.invalid_elements) {
+        each$d(explode$2(settings.invalid_elements), item => {
+          if (elements[item]) {
+            delete elements[item];
+          }
+        });
+      }
+      if (!getElementRule('span')) {
+        addValidElements('span[!data-mce-type|*]');
+      }
+      const getValidStyles = constant(validStyles);
+      const getInvalidStyles = constant(invalidStyles);
+      const getValidClasses = constant(validClasses);
+      const getBoolAttrs = constant(boolAttrMap);
+      const getBlockElements = constant(blockElementsMap);
+      const getTextBlockElements = constant(textBlockElementsMap);
+      const getTextInlineElements = constant(textInlineElementsMap);
+      const getVoidElements = constant(Object.seal(voidElementsMap));
+      const getSelfClosingElements = constant(selfClosingElementsMap);
+      const getNonEmptyElements = constant(nonEmptyElementsMap);
+      const getMoveCaretBeforeOnEnterElements = constant(moveCaretBeforeOnEnterElementsMap);
+      const getWhitespaceElements = constant(whitespaceElementsMap);
+      const getSpecialElements = constant(Object.seal(specialElements));
+      const isValidChild = (name, child) => {
+        const parent = children[name.toLowerCase()];
+        return !!(parent && parent[child.toLowerCase()]);
+      };
+      const isValid = (name, attr) => {
+        let attrPatterns, i;
+        const rule = getElementRule(name);
+        if (rule) {
+          if (attr) {
+            if (rule.attributes[attr]) {
+              return true;
+            }
+            attrPatterns = rule.attributePatterns;
+            if (attrPatterns) {
+              i = attrPatterns.length;
+              while (i--) {
+                if (attrPatterns[i].pattern.test(attr)) {
+                  return true;
+                }
+              }
+            }
+          } else {
+            return true;
+          }
+        }
+        return false;
+      };
+      const getCustomElements = constant(customElementsMap);
+      return {
+        type: schemaType,
+        children,
+        elements,
+        getValidStyles,
+        getValidClasses,
+        getBlockElements,
+        getInvalidStyles,
+        getVoidElements,
+        getTextBlockElements,
+        getTextInlineElements,
+        getBoolAttrs,
+        getElementRule,
+        getSelfClosingElements,
+        getNonEmptyElements,
+        getMoveCaretBeforeOnEnterElements,
+        getWhitespaceElements,
+        getSpecialElements,
+        isValidChild,
+        isValid,
+        getCustomElements,
+        addValidElements,
+        setValidElements,
+        addCustomElements,
+        addValidChildren
+      };
+    };
+
+    const Styles = (settings, schema) => {
+      const urlOrStrRegExp = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi;
+      const styleRegExp = /\s*([^:]+):\s*([^;]+);?/g;
+      const trimRightRegExp = /\s+$/;
+      let i;
+      const encodingLookup = {};
+      let validStyles;
+      let invalidStyles;
+      const invisibleChar = zeroWidth;
+      settings = settings || {};
+      if (schema) {
+        validStyles = schema.getValidStyles();
+        invalidStyles = schema.getInvalidStyles();
+      }
+      const encodingItems = (`\\" \\' \\; \\: ; : ` + invisibleChar).split(' ');
+      for (i = 0; i < encodingItems.length; i++) {
+        encodingLookup[encodingItems[i]] = invisibleChar + i;
+        encodingLookup[invisibleChar + i] = encodingItems[i];
+      }
+      const self = {
+        parse: css => {
+          const styles = {};
+          let matches, name, value, isEncoded;
+          const urlConverter = settings.url_converter;
+          const urlConverterScope = settings.url_converter_scope || self;
+          const compress = (prefix, suffix, noJoin) => {
+            const top = styles[prefix + '-top' + suffix];
+            if (!top) {
+              return;
+            }
+            const right = styles[prefix + '-right' + suffix];
+            if (!right) {
+              return;
+            }
+            const bottom = styles[prefix + '-bottom' + suffix];
+            if (!bottom) {
+              return;
+            }
+            const left = styles[prefix + '-left' + suffix];
+            if (!left) {
+              return;
+            }
+            const box = [
+              top,
+              right,
+              bottom,
+              left
+            ];
+            i = box.length - 1;
+            while (i--) {
+              if (box[i] !== box[i + 1]) {
+                break;
+              }
+            }
+            if (i > -1 && noJoin) {
+              return;
+            }
+            styles[prefix + suffix] = i === -1 ? box[0] : box.join(' ');
+            delete styles[prefix + '-top' + suffix];
+            delete styles[prefix + '-right' + suffix];
+            delete styles[prefix + '-bottom' + suffix];
+            delete styles[prefix + '-left' + suffix];
+          };
+          const canCompress = key => {
+            let value = styles[key], i;
+            if (!value) {
+              return;
+            }
+            value = value.split(' ');
+            i = value.length;
+            while (i--) {
+              if (value[i] !== value[0]) {
+                return false;
+              }
+            }
+            styles[key] = value[0];
+            return true;
+          };
+          const compress2 = (target, a, b, c) => {
+            if (!canCompress(a)) {
+              return;
+            }
+            if (!canCompress(b)) {
+              return;
+            }
+            if (!canCompress(c)) {
+              return;
+            }
+            styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c];
+            delete styles[a];
+            delete styles[b];
+            delete styles[c];
+          };
+          const encode = str => {
+            isEncoded = true;
+            return encodingLookup[str];
+          };
+          const decode = (str, keepSlashes) => {
+            if (isEncoded) {
+              str = str.replace(/\uFEFF[0-9]/g, str => {
+                return encodingLookup[str];
+              });
+            }
+            if (!keepSlashes) {
+              str = str.replace(/\\([\'\";:])/g, '$1');
+            }
+            return str;
+          };
+          const decodeSingleHexSequence = escSeq => {
+            return String.fromCharCode(parseInt(escSeq.slice(1), 16));
+          };
+          const decodeHexSequences = value => {
+            return value.replace(/\\[0-9a-f]+/gi, decodeSingleHexSequence);
+          };
+          const processUrl = (match, url, url2, url3, str, str2) => {
+            str = str || str2;
+            if (str) {
+              str = decode(str);
+              return `'` + str.replace(/\'/g, `\\'`) + `'`;
+            }
+            url = decode(url || url2 || url3);
+            if (!settings.allow_script_urls) {
+              const scriptUrl = url.replace(/[\s\r\n]+/g, '');
+              if (/(java|vb)script:/i.test(scriptUrl)) {
+                return '';
+              }
+              if (!settings.allow_svg_data_urls && /^data:image\/svg/i.test(scriptUrl)) {
+                return '';
+              }
+            }
+            if (urlConverter) {
+              url = urlConverter.call(urlConverterScope, url, 'style');
+            }
+            return `url('` + url.replace(/\'/g, `\\'`) + `')`;
+          };
+          if (css) {
+            css = css.replace(/[\u0000-\u001F]/g, '');
+            css = css.replace(/\\[\"\';:\uFEFF]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, str => {
+              return str.replace(/[;:]/g, encode);
+            });
+            while (matches = styleRegExp.exec(css)) {
+              styleRegExp.lastIndex = matches.index + matches[0].length;
+              name = matches[1].replace(trimRightRegExp, '').toLowerCase();
+              value = matches[2].replace(trimRightRegExp, '');
+              if (name && value) {
+                name = decodeHexSequences(name);
+                value = decodeHexSequences(value);
+                if (name.indexOf(invisibleChar) !== -1 || name.indexOf('"') !== -1) {
+                  continue;
+                }
+                if (!settings.allow_script_urls && (name === 'behavior' || /expression\s*\(|\/\*|\*\//.test(value))) {
+                  continue;
+                }
+                if (name === 'font-weight' && value === '700') {
+                  value = 'bold';
+                } else if (name === 'color' || name === 'background-color') {
+                  value = value.toLowerCase();
+                }
+                value = value.replace(urlOrStrRegExp, processUrl);
+                styles[name] = isEncoded ? decode(value, true) : value;
+              }
+            }
+            compress('border', '', true);
+            compress('border', '-width');
+            compress('border', '-color');
+            compress('border', '-style');
+            compress('padding', '');
+            compress('margin', '');
+            compress2('border', 'border-width', 'border-style', 'border-color');
+            if (styles.border === 'medium none') {
+              delete styles.border;
+            }
+            if (styles['border-image'] === 'none') {
+              delete styles['border-image'];
+            }
+          }
+          return styles;
+        },
+        serialize: (styles, elementName) => {
+          let css = '';
+          const serializeStyles = name => {
+            let value;
+            const styleList = validStyles[name];
+            if (styleList) {
+              for (let i = 0, l = styleList.length; i < l; i++) {
+                name = styleList[i];
+                value = styles[name];
+                if (value) {
+                  css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';
+                }
+              }
+            }
+          };
+          const isValid = (name, elementName) => {
+            let styleMap = invalidStyles['*'];
+            if (styleMap && styleMap[name]) {
+              return false;
+            }
+            styleMap = invalidStyles[elementName];
+            return !(styleMap && styleMap[name]);
+          };
+          if (elementName && validStyles) {
+            serializeStyles('*');
+            serializeStyles(elementName);
+          } else {
+            each$f(styles, (value, name) => {
+              if (value && (!invalidStyles || isValid(name, elementName))) {
+                css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';
+              }
+            });
+          }
+          return css;
+        }
+      };
+      return self;
+    };
+
+    const deprecated = {
+      keyLocation: true,
+      layerX: true,
+      layerY: true,
+      returnValue: true,
+      webkitMovementX: true,
+      webkitMovementY: true,
+      keyIdentifier: true,
+      mozPressure: true
+    };
+    const isNativeEvent = event => event instanceof Event || isFunction(event.initEvent);
+    const hasIsDefaultPrevented = event => event.isDefaultPrevented === always || event.isDefaultPrevented === never;
+    const needsNormalizing = event => isNullable(event.preventDefault) || isNativeEvent(event);
+    const clone$3 = (originalEvent, data) => {
+      const event = data !== null && data !== void 0 ? data : {};
+      for (const name in originalEvent) {
+        if (!has$2(deprecated, name)) {
+          event[name] = originalEvent[name];
+        }
+      }
+      if (isNonNullable(event.composedPath)) {
+        event.composedPath = () => originalEvent.composedPath();
+      }
+      return event;
+    };
+    const normalize$3 = (type, originalEvent, fallbackTarget, data) => {
+      var _a;
+      const event = clone$3(originalEvent, data);
+      event.type = type;
+      if (isNullable(event.target)) {
+        event.target = (_a = event.srcElement) !== null && _a !== void 0 ? _a : fallbackTarget;
+      }
+      if (needsNormalizing(originalEvent)) {
+        event.preventDefault = () => {
+          event.defaultPrevented = true;
+          event.isDefaultPrevented = always;
+          if (isFunction(originalEvent.preventDefault)) {
+            originalEvent.preventDefault();
+          }
+        };
+        event.stopPropagation = () => {
+          event.cancelBubble = true;
+          event.isPropagationStopped = always;
+          if (isFunction(originalEvent.stopPropagation)) {
+            originalEvent.stopPropagation();
+          }
+        };
+        event.stopImmediatePropagation = () => {
+          event.isImmediatePropagationStopped = always;
+          event.stopPropagation();
+        };
+        if (!hasIsDefaultPrevented(event)) {
+          event.isDefaultPrevented = event.defaultPrevented === true ? always : never;
+          event.isPropagationStopped = event.cancelBubble === true ? always : never;
+          event.isImmediatePropagationStopped = never;
+        }
+      }
+      return event;
+    };
+
+    const eventExpandoPrefix = 'mce-data-';
+    const mouseEventRe = /^(?:mouse|contextmenu)|click/;
+    const addEvent = (target, name, callback, capture) => {
+      if (target.addEventListener) {
+        target.addEventListener(name, callback, capture || false);
+      } else if (target.attachEvent) {
+        target.attachEvent('on' + name, callback);
+      }
+    };
+    const removeEvent = (target, name, callback, capture) => {
+      if (target.removeEventListener) {
+        target.removeEventListener(name, callback, capture || false);
+      } else if (target.detachEvent) {
+        target.detachEvent('on' + name, callback);
+      }
+    };
+    const isMouseEvent = event => isNonNullable(event) && mouseEventRe.test(event.type);
+    const fix = (originalEvent, data) => {
+      const event = normalize$3(originalEvent.type, originalEvent, document, data);
+      if (isMouseEvent(originalEvent) && isUndefined(originalEvent.pageX) && !isUndefined(originalEvent.clientX)) {
+        const eventDoc = event.target.ownerDocument || document;
+        const doc = eventDoc.documentElement;
+        const body = eventDoc.body;
+        const mouseEvent = event;
+        mouseEvent.pageX = originalEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+        mouseEvent.pageY = originalEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
+      }
+      return event;
+    };
+    const bindOnReady = (win, callback, eventUtils) => {
+      const doc = win.document, event = { type: 'ready' };
+      if (eventUtils.domLoaded) {
+        callback(event);
+        return;
+      }
+      const isDocReady = () => {
+        return doc.readyState === 'complete' || doc.readyState === 'interactive' && doc.body;
+      };
+      const readyHandler = () => {
+        removeEvent(win, 'DOMContentLoaded', readyHandler);
+        removeEvent(win, 'load', readyHandler);
+        if (!eventUtils.domLoaded) {
+          eventUtils.domLoaded = true;
+          callback(event);
+        }
+        win = null;
+      };
+      if (isDocReady()) {
+        readyHandler();
+      } else {
+        addEvent(win, 'DOMContentLoaded', readyHandler);
+      }
+      if (!eventUtils.domLoaded) {
+        addEvent(win, 'load', readyHandler);
+      }
+    };
+    class EventUtils {
+      constructor() {
+        this.domLoaded = false;
+        this.events = {};
+        this.count = 1;
+        this.expando = eventExpandoPrefix + (+new Date()).toString(32);
+        this.hasMouseEnterLeave = 'onmouseenter' in document.documentElement;
+        this.hasFocusIn = 'onfocusin' in document.documentElement;
+        this.count = 1;
+      }
+      bind(target, names, callback, scope) {
+        const self = this;
+        let id, callbackList, i, name, fakeName, nativeHandler, capture;
+        const win = window;
+        const defaultNativeHandler = evt => {
+          self.executeHandlers(fix(evt || win.event), id);
+        };
+        if (!target || target.nodeType === 3 || target.nodeType === 8) {
+          return;
+        }
+        if (!target[self.expando]) {
+          id = self.count++;
+          target[self.expando] = id;
+          self.events[id] = {};
+        } else {
+          id = target[self.expando];
+        }
+        scope = scope || target;
+        const namesList = names.split(' ');
+        i = namesList.length;
+        while (i--) {
+          name = namesList[i];
+          nativeHandler = defaultNativeHandler;
+          fakeName = capture = false;
+          if (name === 'DOMContentLoaded') {
+            name = 'ready';
+          }
+          if (self.domLoaded && name === 'ready' && target.readyState === 'complete') {
+            callback.call(scope, fix({ type: name }));
+            continue;
+          }
+          if (!self.hasMouseEnterLeave) {
+            fakeName = self.mouseEnterLeave[name];
+            if (fakeName) {
+              nativeHandler = evt => {
+                const current = evt.currentTarget;
+                let related = evt.relatedTarget;
+                if (related && current.contains) {
+                  related = current.contains(related);
+                } else {
+                  while (related && related !== current) {
+                    related = related.parentNode;
+                  }
+                }
+                if (!related) {
+                  evt = fix(evt || win.event);
+                  evt.type = evt.type === 'mouseout' ? 'mouseleave' : 'mouseenter';
+                  evt.target = current;
+                  self.executeHandlers(evt, id);
+                }
+              };
+            }
+          }
+          if (!self.hasFocusIn && (name === 'focusin' || name === 'focusout')) {
+            capture = true;
+            fakeName = name === 'focusin' ? 'focus' : 'blur';
+            nativeHandler = evt => {
+              evt = fix(evt || win.event);
+              evt.type = evt.type === 'focus' ? 'focusin' : 'focusout';
+              self.executeHandlers(evt, id);
+            };
+          }
+          callbackList = self.events[id][name];
+          if (!callbackList) {
+            self.events[id][name] = callbackList = [{
+                func: callback,
+                scope
+              }];
+            callbackList.fakeName = fakeName;
+            callbackList.capture = capture;
+            callbackList.nativeHandler = nativeHandler;
+            if (name === 'ready') {
+              bindOnReady(target, nativeHandler, self);
+            } else {
+              addEvent(target, fakeName || name, nativeHandler, capture);
+            }
+          } else {
+            if (name === 'ready' && self.domLoaded) {
+              callback(fix({ type: name }));
+            } else {
+              callbackList.push({
+                func: callback,
+                scope
+              });
+            }
+          }
+        }
+        target = callbackList = null;
+        return callback;
+      }
+      unbind(target, names, callback) {
+        let callbackList, i, ci, name, eventMap;
+        if (!target || target.nodeType === 3 || target.nodeType === 8) {
+          return this;
+        }
+        const id = target[this.expando];
+        if (id) {
+          eventMap = this.events[id];
+          if (names) {
+            const namesList = names.split(' ');
+            i = namesList.length;
+            while (i--) {
+              name = namesList[i];
+              callbackList = eventMap[name];
+              if (callbackList) {
+                if (callback) {
+                  ci = callbackList.length;
+                  while (ci--) {
+                    if (callbackList[ci].func === callback) {
+                      const nativeHandler = callbackList.nativeHandler;
+                      const fakeName = callbackList.fakeName, capture = callbackList.capture;
+                      callbackList = callbackList.slice(0, ci).concat(callbackList.slice(ci + 1));
+                      callbackList.nativeHandler = nativeHandler;
+                      callbackList.fakeName = fakeName;
+                      callbackList.capture = capture;
+                      eventMap[name] = callbackList;
+                    }
+                  }
+                }
+                if (!callback || callbackList.length === 0) {
+                  delete eventMap[name];
+                  removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);
+                }
+              }
+            }
+          } else {
+            each$f(eventMap, (callbackList, name) => {
+              removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);
+            });
+            eventMap = {};
+          }
+          for (name in eventMap) {
+            if (has$2(eventMap, name)) {
+              return this;
+            }
+          }
+          delete this.events[id];
+          try {
+            delete target[this.expando];
+          } catch (ex) {
+            target[this.expando] = null;
+          }
+        }
+        return this;
+      }
+      fire(target, name, args) {
+        return this.dispatch(target, name, args);
+      }
+      dispatch(target, name, args) {
+        let id;
+        if (!target || target.nodeType === 3 || target.nodeType === 8) {
+          return this;
+        }
+        const event = fix({
+          type: name,
+          target
+        }, args);
+        do {
+          id = target[this.expando];
+          if (id) {
+            this.executeHandlers(event, id);
+          }
+          target = target.parentNode || target.ownerDocument || target.defaultView || target.parentWindow;
+        } while (target && !event.isPropagationStopped());
+        return this;
+      }
+      clean(target) {
+        let i, children;
+        if (!target || target.nodeType === 3 || target.nodeType === 8) {
+          return this;
+        }
+        if (target[this.expando]) {
+          this.unbind(target);
+        }
+        if (!target.getElementsByTagName) {
+          target = target.document;
+        }
+        if (target && target.getElementsByTagName) {
+          this.unbind(target);
+          children = target.getElementsByTagName('*');
+          i = children.length;
+          while (i--) {
+            target = children[i];
+            if (target[this.expando]) {
+              this.unbind(target);
+            }
+          }
+        }
+        return this;
+      }
+      destroy() {
+        this.events = {};
+      }
+      cancel(e) {
+        if (e) {
+          e.preventDefault();
+          e.stopImmediatePropagation();
+        }
+        return false;
+      }
+      executeHandlers(evt, id) {
+        const container = this.events[id];
+        const callbackList = container && container[evt.type];
+        if (callbackList) {
+          for (let i = 0, l = callbackList.length; i < l; i++) {
+            const callback = callbackList[i];
+            if (callback && callback.func.call(callback.scope, evt) === false) {
+              evt.preventDefault();
+            }
+            if (evt.isImmediatePropagationStopped()) {
+              return;
+            }
+          }
+        }
+      }
+    }
+    EventUtils.Event = new EventUtils();
+
+    const each$c = Tools.each;
+    const grep = Tools.grep;
+    const internalStyleName = 'data-mce-style';
+    const legacySetAttribute = (elm, name, value) => {
+      if (isNullable(value) || value === '') {
+        remove$a(elm, name);
+      } else {
+        set$2(elm, name, value);
+      }
+    };
+    const setupAttrHooks = (styles, settings, getContext) => {
+      const keepValues = settings.keep_values;
+      const keepUrlHook = {
+        set: (elm, value, name) => {
+          const sugarElm = SugarElement.fromDom(elm);
+          if (isFunction(settings.url_converter) && isNonNullable(value)) {
+            value = settings.url_converter.call(settings.url_converter_scope || getContext(), value, name, elm[0]);
+          }
+          const internalName = 'data-mce-' + name;
+          legacySetAttribute(sugarElm, internalName, value);
+          legacySetAttribute(sugarElm, name, value);
+        },
+        get: (elm, name) => {
+          const sugarElm = SugarElement.fromDom(elm);
+          return get$9(sugarElm, 'data-mce-' + name) || get$9(sugarElm, name);
+        }
+      };
+      const attrHooks = {
+        style: {
+          set: (elm, value) => {
+            const sugarElm = SugarElement.fromDom(elm);
+            if (isObject(value)) {
+              setAll(sugarElm, value);
+              return;
+            }
+            if (keepValues) {
+              legacySetAttribute(sugarElm, internalStyleName, value);
+            }
+            remove$a(sugarElm, 'style');
+            if (isString(value)) {
+              setAll(sugarElm, styles.parse(value));
+            }
+          },
+          get: elm => {
+            const sugarElm = SugarElement.fromDom(elm);
+            const value = get$9(sugarElm, internalStyleName) || get$9(sugarElm, 'style');
+            return styles.serialize(styles.parse(value), name(sugarElm));
+          }
+        }
+      };
+      if (keepValues) {
+        attrHooks.href = attrHooks.src = keepUrlHook;
+      }
+      return attrHooks;
+    };
+    const updateInternalStyleAttr = (styles, elm) => {
+      const rawValue = get$9(elm, 'style');
+      const value = styles.serialize(styles.parse(rawValue), name(elm));
+      legacySetAttribute(elm, internalStyleName, value);
+    };
+    const findNodeIndex = (node, normalized) => {
+      let idx = 0, lastNodeType, nodeType;
+      if (node) {
+        for (lastNodeType = node.nodeType, node = node.previousSibling; node; node = node.previousSibling) {
+          nodeType = node.nodeType;
+          if (normalized && nodeType === 3) {
+            if (nodeType === lastNodeType || !node.nodeValue.length) {
+              continue;
+            }
+          }
+          idx++;
+          lastNodeType = nodeType;
+        }
+      }
+      return idx;
+    };
+    const numericalCssMap = Tools.makeMap('fill-opacity font-weight line-height opacity orphans widows z-index zoom', ' ');
+    const camelCaseToHyphens = name => name.replace(/[A-Z]/g, v => '-' + v.toLowerCase());
+    const DOMUtils = (doc, settings = {}) => {
+      const addedStyles = {};
+      const win = window;
+      const files = {};
+      let counter = 0;
+      const stdMode = true;
+      const boxModel = true;
+      const styleSheetLoader = instance.forElement(SugarElement.fromDom(doc), {
+        contentCssCors: settings.contentCssCors,
+        referrerPolicy: settings.referrerPolicy
+      });
+      const boundEvents = [];
+      const schema = settings.schema ? settings.schema : Schema({});
+      const styles = Styles({
+        url_converter: settings.url_converter,
+        url_converter_scope: settings.url_converter_scope
+      }, settings.schema);
+      const events = settings.ownEvents ? new EventUtils() : EventUtils.Event;
+      const blockElementsMap = schema.getBlockElements();
+      const isBlock = node => {
+        if (isString(node)) {
+          return has$2(blockElementsMap, node);
+        } else {
+          return isElement$6(node) && has$2(blockElementsMap, node.nodeName);
+        }
+      };
+      const get = elm => elm && doc && isString(elm) ? doc.getElementById(elm) : elm;
+      const _get = elm => {
+        const value = get(elm);
+        return isNonNullable(value) ? SugarElement.fromDom(value) : null;
+      };
+      const getAttrib = (elm, name, defaultVal) => {
+        let value;
+        const $elm = _get(elm);
+        if (isNonNullable($elm) && isElement$7($elm)) {
+          const hook = attrHooks[name];
+          if (hook && hook.get) {
+            value = hook.get($elm.dom, name);
+          } else {
+            value = get$9($elm, name);
+          }
+        }
+        return isNonNullable(value) ? value : defaultVal !== null && defaultVal !== void 0 ? defaultVal : '';
+      };
+      const getAttribs = elm => {
+        const node = get(elm);
+        return isNullable(node) ? [] : node.attributes;
+      };
+      const setAttrib = (elm, name, value) => {
+        run(elm, e => {
+          if (isElement$6(e)) {
+            const $elm = SugarElement.fromDom(e);
+            if (value === '') {
+              value = null;
+            }
+            const originalValue = get$9($elm, name);
+            const hook = attrHooks[name];
+            if (hook && hook.set) {
+              hook.set($elm.dom, value, name);
+            } else {
+              legacySetAttribute($elm, name, value);
+            }
+            if (originalValue !== value && settings.onSetAttrib) {
+              settings.onSetAttrib({
+                attrElm: $elm,
+                attrName: name,
+                attrValue: value
+              });
+            }
+          }
+        });
+      };
+      const clone = (node, deep) => {
+        return node.cloneNode(deep);
+      };
+      const getRoot = () => settings.root_element || doc.body;
+      const getViewPort = argWin => {
+        const vp = getBounds(argWin);
+        return {
+          x: vp.x,
+          y: vp.y,
+          w: vp.width,
+          h: vp.height
+        };
+      };
+      const getPos$1 = (elm, rootElm) => getPos(doc.body, get(elm), rootElm);
+      const setStyle = (elm, name, value) => {
+        const convertStyleToString = (cssValue, cssName) => {
+          if (isString(cssValue)) {
+            return cssValue;
+          } else if (isNumber(cssValue)) {
+            return has$2(numericalCssMap, cssName) ? cssValue + '' : cssValue + 'px';
+          } else {
+            return map$2(cssValue, convertStyleToString);
+          }
+        };
+        const applyStyle = ($elm, cssName, cssValue) => {
+          const normalizedName = camelCaseToHyphens(cssName);
+          if (isNullable(cssValue) || cssValue === '') {
+            remove$6($elm, normalizedName);
+          } else {
+            set$1($elm, normalizedName, convertStyleToString(cssValue, normalizedName));
+          }
+        };
+        run(elm, e => {
+          const $elm = SugarElement.fromDom(e);
+          if (isString(name)) {
+            applyStyle($elm, name, value);
+          } else {
+            each$f(name, (v, n) => {
+              applyStyle($elm, n, v);
+            });
+          }
+          if (settings.update_styles) {
+            updateInternalStyleAttr(styles, $elm);
+          }
+        });
+      };
+      const setStyles = (elm, stylesArg) => {
+        setStyle(elm, stylesArg);
+      };
+      const getStyle = (elm, name, computed) => {
+        const $elm = get(elm);
+        if (isNullable($elm) || !isElement$6($elm)) {
+          return undefined;
+        }
+        if (computed) {
+          return get$7(SugarElement.fromDom($elm), camelCaseToHyphens(name));
+        } else {
+          name = name.replace(/-(\D)/g, (a, b) => b.toUpperCase());
+          if (name === 'float') {
+            name = 'cssFloat';
+          }
+          return $elm.style ? $elm.style[name] : undefined;
+        }
+      };
+      const getSize = elm => {
+        let w, h;
+        const $elm = get(elm);
+        w = getStyle($elm, 'width');
+        h = getStyle($elm, 'height');
+        if (w.indexOf('px') === -1) {
+          w = 0;
+        }
+        if (h.indexOf('px') === -1) {
+          h = 0;
+        }
+        return {
+          w: parseInt(w, 10) || $elm.offsetWidth || $elm.clientWidth,
+          h: parseInt(h, 10) || $elm.offsetHeight || $elm.clientHeight
+        };
+      };
+      const getRect = elm => {
+        const $elm = get(elm);
+        const pos = getPos$1($elm);
+        const size = getSize($elm);
+        return {
+          x: pos.x,
+          y: pos.y,
+          w: size.w,
+          h: size.h
+        };
+      };
+      const is = (elm, selector) => {
+        if (!elm) {
+          return false;
+        }
+        const elms = isArray$1(elm) ? elm : [elm];
+        return exists(elms, e => {
+          return is$1(SugarElement.fromDom(e), selector);
+        });
+      };
+      const getParents = (elm, selector, root, collect) => {
+        const result = [];
+        let selectorVal;
+        let node = get(elm);
+        collect = collect === undefined;
+        root = root || (getRoot().nodeName !== 'BODY' ? getRoot().parentNode : null);
+        if (isString(selector)) {
+          selectorVal = selector;
+          if (selector === '*') {
+            selector = isElement$6;
+          } else {
+            selector = node => is(node, selectorVal);
+          }
+        }
+        while (node) {
+          if (node === root || isNullable(node.nodeType) || isDocument$1(node) || isDocumentFragment(node)) {
+            break;
+          }
+          if (!selector || selector(node)) {
+            if (collect) {
+              result.push(node);
+            } else {
+              return [node];
+            }
+          }
+          node = node.parentNode;
+        }
+        return collect ? result : null;
+      };
+      const getParent = (node, selector, root) => {
+        const parents = getParents(node, selector, root, false);
+        return parents && parents.length > 0 ? parents[0] : null;
+      };
+      const _findSib = (node, selector, name) => {
+        let func = selector;
+        if (node) {
+          if (isString(selector)) {
+            func = node => {
+              return is(node, selector);
+            };
+          }
+          for (node = node[name]; node; node = node[name]) {
+            if (isFunction(func) && func(node)) {
+              return node;
+            }
+          }
+        }
+        return null;
+      };
+      const getNext = (node, selector) => _findSib(node, selector, 'nextSibling');
+      const getPrev = (node, selector) => _findSib(node, selector, 'previousSibling');
+      const select = (selector, scope) => {
+        var _a, _b;
+        const elm = (_b = (_a = get(scope)) !== null && _a !== void 0 ? _a : settings.root_element) !== null && _b !== void 0 ? _b : doc;
+        return from(elm.querySelectorAll(selector));
+      };
+      const run = function (elm, func, scope) {
+        const context = scope !== null && scope !== void 0 ? scope : this;
+        const node = isString(elm) ? get(elm) : elm;
+        if (!node) {
+          return false;
+        }
+        if (isArray$1(node) && (node.length || node.length === 0)) {
+          const result = [];
+          each$c(node, (elm, i) => {
+            if (elm) {
+              result.push(func.call(context, isString(elm) ? get(elm) : elm, i));
+            }
+          });
+          return result;
+        } else {
+          return func.call(context, node);
+        }
+      };
+      const setAttribs = (elm, attrs) => {
+        run(elm, $elm => {
+          each$f(attrs, (value, name) => {
+            setAttrib($elm, name, value);
+          });
+        });
+      };
+      const setHTML = (elm, html) => {
+        run(elm, e => {
+          const $elm = SugarElement.fromDom(e);
+          set($elm, html);
+        });
+      };
+      const add = (parentElm, name, attrs, html, create) => run(parentElm, parentElm => {
+        const newElm = isString(name) ? doc.createElement(name) : name;
+        if (isNonNullable(attrs)) {
+          setAttribs(newElm, attrs);
+        }
+        if (html) {
+          if (!isString(html) && html.nodeType) {
+            newElm.appendChild(html);
+          } else if (isString(html)) {
+            setHTML(newElm, html);
+          }
+        }
+        return !create ? parentElm.appendChild(newElm) : newElm;
+      });
+      const create = (name, attrs, html) => add(doc.createElement(name), name, attrs, html, true);
+      const decode = Entities.decode;
+      const encode = Entities.encodeAllRaw;
+      const createHTML = (name, attrs, html = '') => {
+        let outHtml = '', key;
+        outHtml += '<' + name;
+        for (key in attrs) {
+          if (hasNonNullableKey(attrs, key)) {
+            outHtml += ' ' + key + '="' + encode(attrs[key]) + '"';
+          }
+        }
+        if (isEmpty$3(html) && has$2(schema.getVoidElements(), name)) {
+          return outHtml + ' />';
+        } else {
+          return outHtml + '>' + html + '</' + name + '>';
+        }
+      };
+      const createFragment = html => {
+        let node;
+        const container = doc.createElement('div');
+        const frag = doc.createDocumentFragment();
+        frag.appendChild(container);
+        if (html) {
+          container.innerHTML = html;
+        }
+        while (node = container.firstChild) {
+          frag.appendChild(node);
+        }
+        frag.removeChild(container);
+        return frag;
+      };
+      const remove = (node, keepChildren) => {
+        return run(node, n => {
+          const $node = SugarElement.fromDom(n);
+          if (keepChildren) {
+            each$g(children($node), child => {
+              if (isText$9(child) && child.dom.length === 0) {
+                remove$5(child);
+              } else {
+                before$3($node, child);
+              }
+            });
+          }
+          remove$5($node);
+          return $node.dom;
+        });
+      };
+      const removeAllAttribs = e => run(e, e => {
+        const attrs = e.attributes;
+        for (let i = attrs.length - 1; i >= 0; i--) {
+          e.removeAttributeNode(attrs.item(i));
+        }
+      });
+      const parseStyle = cssText => styles.parse(cssText);
+      const serializeStyle = (stylesArg, name) => styles.serialize(stylesArg, name);
+      const addStyle = cssText => {
+        let head, styleElm;
+        if (self !== DOMUtils.DOM && doc === document) {
+          if (addedStyles[cssText]) {
+            return;
+          }
+          addedStyles[cssText] = true;
+        }
+        styleElm = doc.getElementById('mceDefaultStyles');
+        if (!styleElm) {
+          styleElm = doc.createElement('style');
+          styleElm.id = 'mceDefaultStyles';
+          styleElm.type = 'text/css';
+          head = doc.getElementsByTagName('head')[0];
+          if (head.firstChild) {
+            head.insertBefore(styleElm, head.firstChild);
+          } else {
+            head.appendChild(styleElm);
+          }
+        }
+        if (styleElm.styleSheet) {
+          styleElm.styleSheet.cssText += cssText;
+        } else {
+          styleElm.appendChild(doc.createTextNode(cssText));
+        }
+      };
+      const loadCSS = urls => {
+        if (!urls) {
+          urls = '';
+        }
+        each$g(urls.split(','), url => {
+          files[url] = true;
+          styleSheetLoader.load(url).catch(noop);
+        });
+      };
+      const toggleClass = (elm, cls, state) => {
+        run(elm, e => {
+          if (isElement$6(e)) {
+            const $elm = SugarElement.fromDom(e);
+            const classes = cls.split(' ');
+            each$g(classes, c => {
+              if (isNonNullable(state)) {
+                const fn = state ? add$2 : remove$7;
+                fn($elm, c);
+              } else {
+                toggle$1($elm, c);
+              }
+            });
+          }
+        });
+      };
+      const addClass = (elm, cls) => {
+        toggleClass(elm, cls, true);
+      };
+      const removeClass = (elm, cls) => {
+        toggleClass(elm, cls, false);
+      };
+      const hasClass = (elm, cls) => {
+        const $elm = _get(elm);
+        const classes = cls.split(' ');
+        return forall(classes, c => has($elm, c));
+      };
+      const show = elm => {
+        run(elm, e => remove$6(SugarElement.fromDom(e), 'display'));
+      };
+      const hide = elm => {
+        run(elm, e => set$1(SugarElement.fromDom(e), 'display', 'none'));
+      };
+      const isHidden = elm => {
+        const $elm = _get(elm);
+        return is$2(getRaw$1($elm, 'display'), 'none');
+      };
+      const uniqueId = prefix => (!prefix ? 'mce_' : prefix) + counter++;
+      const getOuterHTML = elm => {
+        const $elm = _get(elm);
+        return isElement$6($elm.dom) ? $elm.dom.outerHTML : getOuter($elm);
+      };
+      const setOuterHTML = (elm, html) => {
+        run(elm, $elm => {
+          if (isElement$6($elm)) {
+            $elm.outerHTML = html;
+          }
+        });
+      };
+      const insertAfter = (node, reference) => {
+        const referenceNode = get(reference);
+        return run(node, node => {
+          const parent = referenceNode.parentNode;
+          const nextSibling = referenceNode.nextSibling;
+          if (nextSibling) {
+            parent.insertBefore(node, nextSibling);
+          } else {
+            parent.appendChild(node);
+          }
+          return node;
+        });
+      };
+      const replace = (newElm, oldElm, keepChildren) => run(oldElm, oldElm => {
+        if (isArray$1(oldElm)) {
+          newElm = newElm.cloneNode(true);
+        }
+        if (keepChildren) {
+          each$c(grep(oldElm.childNodes), node => {
+            newElm.appendChild(node);
+          });
+        }
+        return oldElm.parentNode.replaceChild(newElm, oldElm);
+      });
+      const rename = (elm, name) => {
+        let newElm;
+        if (elm.nodeName !== name.toUpperCase()) {
+          newElm = create(name);
+          each$c(getAttribs(elm), attrNode => {
+            setAttrib(newElm, attrNode.nodeName, getAttrib(elm, attrNode.nodeName));
+          });
+          replace(newElm, elm, true);
+        }
+        return newElm || elm;
+      };
+      const findCommonAncestor = (a, b) => {
+        let ps = a, pe;
+        while (ps) {
+          pe = b;
+          while (pe && ps !== pe) {
+            pe = pe.parentNode;
+          }
+          if (ps === pe) {
+            break;
+          }
+          ps = ps.parentNode;
+        }
+        if (!ps && a.ownerDocument) {
+          return a.ownerDocument.documentElement;
+        }
+        return ps;
+      };
+      const isNonEmptyElement = node => {
+        if (isElement$6(node)) {
+          const isNamedAnchor = node.nodeName.toLowerCase() === 'a' && !getAttrib(node, 'href') && getAttrib(node, 'id');
+          if (getAttrib(node, 'name') || getAttrib(node, 'data-mce-bookmark') || isNamedAnchor) {
+            return true;
+          }
+        }
+        return false;
+      };
+      const isEmpty = (node, elements) => {
+        let type, name, brCount = 0;
+        if (isNonEmptyElement(node)) {
+          return false;
+        }
+        node = node.firstChild;
+        if (node) {
+          const walker = new DomTreeWalker(node, node.parentNode);
+          const whitespace = schema ? schema.getWhitespaceElements() : {};
+          elements = elements || (schema ? schema.getNonEmptyElements() : null);
+          do {
+            type = node.nodeType;
+            if (isElement$6(node)) {
+              const bogusVal = node.getAttribute('data-mce-bogus');
+              if (bogusVal) {
+                node = walker.next(bogusVal === 'all');
+                continue;
+              }
+              name = node.nodeName.toLowerCase();
+              if (elements && elements[name]) {
+                if (name === 'br') {
+                  brCount++;
+                  node = walker.next();
+                  continue;
+                }
+                return false;
+              }
+              if (isNonEmptyElement(node)) {
+                return false;
+              }
+            }
+            if (type === 8) {
+              return false;
+            }
+            if (type === 3 && !isWhitespaceText(node.nodeValue)) {
+              return false;
+            }
+            if (type === 3 && node.parentNode && whitespace[node.parentNode.nodeName] && isWhitespaceText(node.nodeValue)) {
+              return false;
+            }
+            node = walker.next();
+          } while (node);
+        }
+        return brCount <= 1;
+      };
+      const createRng = () => doc.createRange();
+      const split = (parentElm, splitElm, replacementElm) => {
+        let range = createRng();
+        let beforeFragment;
+        let afterFragment;
+        let parentNode;
+        if (parentElm && splitElm) {
+          range.setStart(parentElm.parentNode, findNodeIndex(parentElm));
+          range.setEnd(splitElm.parentNode, findNodeIndex(splitElm));
+          beforeFragment = range.extractContents();
+          range = createRng();
+          range.setStart(splitElm.parentNode, findNodeIndex(splitElm) + 1);
+          range.setEnd(parentElm.parentNode, findNodeIndex(parentElm) + 1);
+          afterFragment = range.extractContents();
+          parentNode = parentElm.parentNode;
+          parentNode.insertBefore(trimNode(self, beforeFragment), parentElm);
+          if (replacementElm) {
+            parentNode.insertBefore(replacementElm, parentElm);
+          } else {
+            parentNode.insertBefore(splitElm, parentElm);
+          }
+          parentNode.insertBefore(trimNode(self, afterFragment), parentElm);
+          remove(parentElm);
+          return replacementElm || splitElm;
+        }
+      };
+      const bind = (target, name, func, scope) => {
+        if (isArray$1(target)) {
+          let i = target.length;
+          const rv = [];
+          while (i--) {
+            rv[i] = bind(target[i], name, func, scope);
+          }
+          return rv;
+        } else {
+          if (settings.collect && (target === doc || target === win)) {
+            boundEvents.push([
+              target,
+              name,
+              func,
+              scope
+            ]);
+          }
+          return events.bind(target, name, func, scope || self);
+        }
+      };
+      const unbind = (target, name, func) => {
+        if (isArray$1(target)) {
+          let i = target.length;
+          const rv = [];
+          while (i--) {
+            rv[i] = unbind(target[i], name, func);
+          }
+          return rv;
+        } else {
+          if (boundEvents.length > 0 && (target === doc || target === win)) {
+            let i = boundEvents.length;
+            while (i--) {
+              const item = boundEvents[i];
+              if (target === item[0] && (!name || name === item[1]) && (!func || func === item[2])) {
+                events.unbind(item[0], item[1], item[2]);
+              }
+            }
+          }
+          return events.unbind(target, name, func);
+        }
+      };
+      const dispatch = (target, name, evt) => events.dispatch(target, name, evt);
+      const fire = (target, name, evt) => events.dispatch(target, name, evt);
+      const getContentEditable = node => {
+        if (node && isElement$6(node)) {
+          const contentEditable = node.getAttribute('data-mce-contenteditable');
+          if (contentEditable && contentEditable !== 'inherit') {
+            return contentEditable;
+          }
+          return node.contentEditable !== 'inherit' ? node.contentEditable : null;
+        } else {
+          return null;
+        }
+      };
+      const getContentEditableParent = node => {
+        const root = getRoot();
+        let state = null;
+        for (; node && node !== root; node = node.parentNode) {
+          state = getContentEditable(node);
+          if (state !== null) {
+            break;
+          }
+        }
+        return state;
+      };
+      const destroy = () => {
+        if (boundEvents.length > 0) {
+          let i = boundEvents.length;
+          while (i--) {
+            const item = boundEvents[i];
+            events.unbind(item[0], item[1], item[2]);
+          }
+        }
+        each$f(files, (_, url) => {
+          styleSheetLoader.unload(url);
+          delete files[url];
+        });
+      };
+      const isChildOf = (node, parent) => {
+        return node === parent || parent.contains(node);
+      };
+      const dumpRng = r => 'startContainer: ' + r.startContainer.nodeName + ', startOffset: ' + r.startOffset + ', endContainer: ' + r.endContainer.nodeName + ', endOffset: ' + r.endOffset;
+      const self = {
+        doc,
+        settings,
+        win,
+        files,
+        stdMode,
+        boxModel,
+        styleSheetLoader,
+        boundEvents,
+        styles,
+        schema,
+        events,
+        isBlock,
+        root: null,
+        clone,
+        getRoot,
+        getViewPort,
+        getRect,
+        getSize,
+        getParent,
+        getParents,
+        get,
+        getNext,
+        getPrev,
+        select,
+        is,
+        add,
+        create,
+        createHTML,
+        createFragment,
+        remove,
+        setStyle,
+        getStyle,
+        setStyles,
+        removeAllAttribs,
+        setAttrib,
+        setAttribs,
+        getAttrib,
+        getPos: getPos$1,
+        parseStyle,
+        serializeStyle,
+        addStyle,
+        loadCSS,
+        addClass,
+        removeClass,
+        hasClass,
+        toggleClass,
+        show,
+        hide,
+        isHidden,
+        uniqueId,
+        setHTML,
+        getOuterHTML,
+        setOuterHTML,
+        decode,
+        encode,
+        insertAfter,
+        replace,
+        rename,
+        findCommonAncestor,
+        run,
+        getAttribs,
+        isEmpty,
+        createRng,
+        nodeIndex: findNodeIndex,
+        split,
+        bind: bind,
+        unbind: unbind,
+        fire,
+        dispatch,
+        getContentEditable,
+        getContentEditableParent,
+        destroy,
+        isChildOf,
+        dumpRng
+      };
+      const attrHooks = setupAttrHooks(styles, settings, constant(self));
+      return self;
+    };
+    DOMUtils.DOM = DOMUtils(document);
+    DOMUtils.nodeIndex = findNodeIndex;
+
+    const DOM$b = DOMUtils.DOM;
+    const QUEUED = 0;
+    const LOADING = 1;
+    const LOADED = 2;
+    const FAILED = 3;
+    class ScriptLoader {
+      constructor(settings = {}) {
+        this.states = {};
+        this.queue = [];
+        this.scriptLoadedCallbacks = {};
+        this.queueLoadedCallbacks = [];
+        this.loading = false;
+        this.settings = settings;
+      }
+      _setReferrerPolicy(referrerPolicy) {
+        this.settings.referrerPolicy = referrerPolicy;
+      }
+      loadScript(url) {
+        return new Promise((resolve, reject) => {
+          const dom = DOM$b;
+          let elm;
+          const cleanup = () => {
+            dom.remove(id);
+            if (elm) {
+              elm.onerror = elm.onload = elm = null;
+            }
+          };
+          const done = () => {
+            cleanup();
+            resolve();
+          };
+          const error = () => {
+            cleanup();
+            reject('Failed to load script: ' + url);
+          };
+          const id = dom.uniqueId();
+          elm = document.createElement('script');
+          elm.id = id;
+          elm.type = 'text/javascript';
+          elm.src = Tools._addCacheSuffix(url);
+          if (this.settings.referrerPolicy) {
+            dom.setAttrib(elm, 'referrerpolicy', this.settings.referrerPolicy);
+          }
+          elm.onload = done;
+          elm.onerror = error;
+          (document.getElementsByTagName('head')[0] || document.body).appendChild(elm);
+        });
+      }
+      isDone(url) {
+        return this.states[url] === LOADED;
+      }
+      markDone(url) {
+        this.states[url] = LOADED;
+      }
+      add(url) {
+        const self = this;
+        self.queue.push(url);
+        const state = self.states[url];
+        if (state === undefined) {
+          self.states[url] = QUEUED;
+        }
+        return new Promise((resolve, reject) => {
+          if (!self.scriptLoadedCallbacks[url]) {
+            self.scriptLoadedCallbacks[url] = [];
+          }
+          self.scriptLoadedCallbacks[url].push({
+            resolve,
+            reject
+          });
+        });
+      }
+      load(url) {
+        return this.add(url);
+      }
+      remove(url) {
+        delete this.states[url];
+        delete this.scriptLoadedCallbacks[url];
+      }
+      loadQueue() {
+        const queue = this.queue;
+        this.queue = [];
+        return this.loadScripts(queue);
+      }
+      loadScripts(scripts) {
+        const self = this;
+        const execCallbacks = (name, url) => {
+          get$a(self.scriptLoadedCallbacks, url).each(callbacks => {
+            each$g(callbacks, callback => callback[name](url));
+          });
+          delete self.scriptLoadedCallbacks[url];
+        };
+        const processResults = results => {
+          const failures = filter$6(results, result => result.status === 'rejected');
+          if (failures.length > 0) {
+            return Promise.reject(bind$3(failures, ({reason}) => isArray$1(reason) ? reason : [reason]));
+          } else {
+            return Promise.resolve();
+          }
+        };
+        const load = urls => Promise.allSettled(map$3(urls, url => {
+          if (self.states[url] === LOADED) {
+            execCallbacks('resolve', url);
+            return Promise.resolve();
+          } else if (self.states[url] === FAILED) {
+            execCallbacks('reject', url);
+            return Promise.reject(url);
+          } else {
+            self.states[url] = LOADING;
+            return self.loadScript(url).then(() => {
+              self.states[url] = LOADED;
+              execCallbacks('resolve', url);
+              const queue = self.queue;
+              if (queue.length > 0) {
+                self.queue = [];
+                return load(queue).then(processResults);
+              }
+            }, () => {
+              self.states[url] = FAILED;
+              execCallbacks('reject', url);
+              return Promise.reject(url);
+            });
+          }
+        }));
+        const processQueue = urls => {
+          self.loading = true;
+          return load(urls).then(results => {
+            self.loading = false;
+            const nextQueuedItem = self.queueLoadedCallbacks.shift();
+            Optional.from(nextQueuedItem).each(call);
+            return processResults(results);
+          });
+        };
+        const uniqueScripts = stringArray(scripts);
+        if (self.loading) {
+          return new Promise((resolve, reject) => {
+            self.queueLoadedCallbacks.push(() => processQueue(uniqueScripts).then(resolve, reject));
+          });
+        } else {
+          return processQueue(uniqueScripts);
+        }
+      }
+    }
+    ScriptLoader.ScriptLoader = new ScriptLoader();
+
+    const Cell = initial => {
+      let value = initial;
+      const get = () => {
+        return value;
+      };
+      const set = v => {
+        value = v;
+      };
+      return {
+        get,
+        set
+      };
+    };
+
+    const isRaw = str => isObject(str) && has$2(str, 'raw');
+    const isTokenised = str => isArray$1(str) && str.length > 1;
+    const data = {};
+    const currentCode = Cell('en');
+    const getLanguageData = () => get$a(data, currentCode.get());
+    const getData$1 = () => map$2(data, value => ({ ...value }));
+    const setCode = newCode => {
+      if (newCode) {
+        currentCode.set(newCode);
+      }
+    };
+    const getCode = () => currentCode.get();
+    const add$1 = (code, items) => {
+      let langData = data[code];
+      if (!langData) {
+        data[code] = langData = {};
+      }
+      each$f(items, (translation, name) => {
+        langData[name.toLowerCase()] = translation;
+      });
+    };
+    const translate = text => {
+      const langData = getLanguageData().getOr({});
+      const toString = obj => {
+        if (isFunction(obj)) {
+          return Object.prototype.toString.call(obj);
+        }
+        return !isEmpty(obj) ? '' + obj : '';
+      };
+      const isEmpty = text => text === '' || text === null || text === undefined;
+      const getLangData = text => {
+        const textstr = toString(text);
+        return get$a(langData, textstr.toLowerCase()).map(toString).getOr(textstr);
+      };
+      const removeContext = str => str.replace(/{context:\w+}$/, '');
+      if (isEmpty(text)) {
+        return '';
+      }
+      if (isRaw(text)) {
+        return toString(text.raw);
+      }
+      if (isTokenised(text)) {
+        const values = text.slice(1);
+        const substitued = getLangData(text[0]).replace(/\{([0-9]+)\}/g, ($1, $2) => has$2(values, $2) ? toString(values[$2]) : $1);
+        return removeContext(substitued);
+      }
+      return removeContext(getLangData(text));
+    };
+    const isRtl$1 = () => getLanguageData().bind(items => get$a(items, '_dir')).exists(dir => dir === 'rtl');
+    const hasCode = code => has$2(data, code);
+    const I18n = {
+      getData: getData$1,
+      setCode,
+      getCode,
+      add: add$1,
+      translate,
+      isRtl: isRtl$1,
+      hasCode
+    };
+
+    const AddOnManager = () => {
+      const items = [];
+      const urls = {};
+      const lookup = {};
+      const _listeners = [];
+      const runListeners = (name, state) => {
+        const matchedListeners = filter$6(_listeners, listener => listener.name === name && listener.state === state);
+        each$g(matchedListeners, listener => listener.resolve());
+      };
+      const isLoaded = name => has$2(urls, name);
+      const isAdded = name => has$2(lookup, name);
+      const get = name => {
+        if (lookup[name]) {
+          return lookup[name].instance;
+        }
+        return undefined;
+      };
+      const loadLanguagePack = (name, languages) => {
+        const language = I18n.getCode();
+        const wrappedLanguages = ',' + (languages || '') + ',';
+        if (!language || languages && wrappedLanguages.indexOf(',' + language + ',') === -1) {
+          return;
+        }
+        ScriptLoader.ScriptLoader.add(urls[name] + '/langs/' + language + '.js');
+      };
+      const requireLangPack = (name, languages) => {
+        if (AddOnManager.languageLoad !== false) {
+          if (isLoaded(name)) {
+            loadLanguagePack(name, languages);
+          } else {
+            waitFor(name, 'loaded').then(() => loadLanguagePack(name, languages));
+          }
+        }
+      };
+      const add = (id, addOn) => {
+        items.push(addOn);
+        lookup[id] = { instance: addOn };
+        runListeners(id, 'added');
+        return addOn;
+      };
+      const remove = name => {
+        delete urls[name];
+        delete lookup[name];
+      };
+      const createUrl = (baseUrl, dep) => {
+        if (isString(dep)) {
+          return isString(baseUrl) ? {
+            prefix: '',
+            resource: dep,
+            suffix: ''
+          } : {
+            prefix: baseUrl.prefix,
+            resource: dep,
+            suffix: baseUrl.suffix
+          };
+        } else {
+          return dep;
+        }
+      };
+      const load = (name, addOnUrl) => {
+        if (urls[name]) {
+          return Promise.resolve();
+        }
+        let urlString = isString(addOnUrl) ? addOnUrl : addOnUrl.prefix + addOnUrl.resource + addOnUrl.suffix;
+        if (urlString.indexOf('/') !== 0 && urlString.indexOf('://') === -1) {
+          urlString = AddOnManager.baseURL + '/' + urlString;
+        }
+        urls[name] = urlString.substring(0, urlString.lastIndexOf('/'));
+        const done = () => {
+          runListeners(name, 'loaded');
+          return Promise.resolve();
+        };
+        if (lookup[name]) {
+          return done();
+        } else {
+          return ScriptLoader.ScriptLoader.add(urlString).then(done);
+        }
+      };
+      const waitFor = (name, state = 'added') => {
+        if (state === 'added' && isAdded(name)) {
+          return Promise.resolve();
+        } else if (state === 'loaded' && isLoaded(name)) {
+          return Promise.resolve();
+        } else {
+          return new Promise(resolve => {
+            _listeners.push({
+              name,
+              state,
+              resolve
+            });
+          });
+        }
+      };
+      return {
+        items,
+        urls,
+        lookup,
+        get,
+        requireLangPack,
+        add,
+        remove,
+        createUrl,
+        load,
+        waitFor
+      };
+    };
+    AddOnManager.languageLoad = true;
+    AddOnManager.baseURL = '';
+    AddOnManager.PluginManager = AddOnManager();
+    AddOnManager.ThemeManager = AddOnManager();
+    AddOnManager.ModelManager = AddOnManager();
+
+    const singleton = doRevoke => {
+      const subject = Cell(Optional.none());
+      const revoke = () => subject.get().each(doRevoke);
+      const clear = () => {
+        revoke();
+        subject.set(Optional.none());
+      };
+      const isSet = () => subject.get().isSome();
+      const get = () => subject.get();
+      const set = s => {
+        revoke();
+        subject.set(Optional.some(s));
+      };
+      return {
+        clear,
+        isSet,
+        get,
+        set
+      };
+    };
+    const value$2 = () => {
+      const subject = singleton(noop);
+      const on = f => subject.get().each(f);
+      return {
+        ...subject,
+        on
+      };
+    };
+
+    const first$1 = (fn, rate) => {
+      let timer = null;
+      const cancel = () => {
+        if (!isNull(timer)) {
+          clearTimeout(timer);
+          timer = null;
+        }
+      };
+      const throttle = (...args) => {
+        if (isNull(timer)) {
+          timer = setTimeout(() => {
+            timer = null;
+            fn.apply(null, args);
+          }, rate);
+        }
+      };
+      return {
+        cancel,
+        throttle
+      };
+    };
+    const last$1 = (fn, rate) => {
+      let timer = null;
+      const cancel = () => {
+        if (!isNull(timer)) {
+          clearTimeout(timer);
+          timer = null;
+        }
+      };
+      const throttle = (...args) => {
+        cancel();
+        timer = setTimeout(() => {
+          timer = null;
+          fn.apply(null, args);
+        }, rate);
+      };
+      return {
+        cancel,
+        throttle
+      };
+    };
+
+    const descendants$1 = (scope, predicate) => {
+      let result = [];
+      each$g(children(scope), x => {
+        if (predicate(x)) {
+          result = result.concat([x]);
+        }
+        result = result.concat(descendants$1(x, predicate));
+      });
+      return result;
+    };
+
+    const descendants = (scope, selector) => all(selector, scope);
+
+    const annotation = constant('mce-annotation');
+    const dataAnnotation = constant('data-mce-annotation');
+    const dataAnnotationId = constant('data-mce-annotation-uid');
+    const dataAnnotationActive = constant('data-mce-annotation-active');
+
+    const identify = (editor, annotationName) => {
+      const rng = editor.selection.getRng();
+      const start = SugarElement.fromDom(rng.startContainer);
+      const root = SugarElement.fromDom(editor.getBody());
+      const selector = annotationName.fold(() => '.' + annotation(), an => `[${ dataAnnotation() }="${ an }"]`);
+      const newStart = child$1(start, rng.startOffset).getOr(start);
+      const closest = closest$3(newStart, selector, n => eq(n, root));
+      const getAttr = (c, property) => {
+        if (has$1(c, property)) {
+          return Optional.some(get$9(c, property));
+        } else {
+          return Optional.none();
+        }
+      };
+      return closest.bind(c => getAttr(c, `${ dataAnnotationId() }`).bind(uid => getAttr(c, `${ dataAnnotation() }`).map(name => {
+        const elements = findMarkers(editor, uid);
+        return {
+          uid,
+          name,
+          elements
+        };
+      })));
+    };
+    const isAnnotation = elem => isElement$7(elem) && has(elem, annotation());
+    const findMarkers = (editor, uid) => {
+      const body = SugarElement.fromDom(editor.getBody());
+      return descendants(body, `[${ dataAnnotationId() }="${ uid }"]`);
+    };
+    const findAll = (editor, name) => {
+      const body = SugarElement.fromDom(editor.getBody());
+      const markers = descendants(body, `[${ dataAnnotation() }="${ name }"]`);
+      const directory = {};
+      each$g(markers, m => {
+        const uid = get$9(m, dataAnnotationId());
+        const nodesAlready = get$a(directory, uid).getOr([]);
+        directory[uid] = nodesAlready.concat([m]);
+      });
+      return directory;
+    };
+
+    const setup$x = (editor, registry) => {
+      const changeCallbacks = Cell({});
+      const initData = () => ({
+        listeners: [],
+        previous: value$2()
+      });
+      const withCallbacks = (name, f) => {
+        updateCallbacks(name, data => {
+          f(data);
+          return data;
+        });
+      };
+      const updateCallbacks = (name, f) => {
+        const callbackMap = changeCallbacks.get();
+        const data = get$a(callbackMap, name).getOrThunk(initData);
+        const outputData = f(data);
+        callbackMap[name] = outputData;
+        changeCallbacks.set(callbackMap);
+      };
+      const fireCallbacks = (name, uid, elements) => {
+        withCallbacks(name, data => {
+          each$g(data.listeners, f => f(true, name, {
+            uid,
+            nodes: map$3(elements, elem => elem.dom)
+          }));
+        });
+      };
+      const fireNoAnnotation = name => {
+        withCallbacks(name, data => {
+          each$g(data.listeners, f => f(false, name));
+        });
+      };
+      const toggleActiveAttr = (uid, state) => {
+        each$g(findMarkers(editor, uid), span => {
+          if (state) {
+            set$2(span, dataAnnotationActive(), 'true');
+          } else {
+            remove$a(span, dataAnnotationActive());
+          }
+        });
+      };
+      const onNodeChange = last$1(() => {
+        const annotations = sort(registry.getNames());
+        each$g(annotations, name => {
+          updateCallbacks(name, data => {
+            const prev = data.previous.get();
+            identify(editor, Optional.some(name)).fold(() => {
+              prev.each(uid => {
+                fireNoAnnotation(name);
+                data.previous.clear();
+                toggleActiveAttr(uid, false);
+              });
+            }, ({uid, name, elements}) => {
+              if (!is$2(prev, uid)) {
+                prev.each(uid => toggleActiveAttr(uid, false));
+                fireCallbacks(name, uid, elements);
+                data.previous.set(uid);
+                toggleActiveAttr(uid, true);
+              }
+            });
+            return {
+              previous: data.previous,
+              listeners: data.listeners
+            };
+          });
+        });
+      }, 30);
+      editor.on('remove', () => {
+        onNodeChange.cancel();
+      });
+      editor.on('NodeChange', () => {
+        onNodeChange.throttle();
+      });
+      const addListener = (name, f) => {
+        updateCallbacks(name, data => ({
+          previous: data.previous,
+          listeners: data.listeners.concat([f])
+        }));
+      };
+      return { addListener };
+    };
+
+    const setup$w = (editor, registry) => {
+      const identifyParserNode = span => Optional.from(span.attr(dataAnnotation())).bind(registry.lookup);
+      editor.serializer.addTempAttr(dataAnnotationActive());
+      editor.serializer.addNodeFilter('span', spans => {
+        each$g(spans, span => {
+          identifyParserNode(span).each(settings => {
+            if (settings.persistent === false) {
+              span.unwrap();
+            }
+          });
+        });
+      });
+    };
+
+    const create$b = () => {
+      const annotations = {};
+      const register = (name, settings) => {
+        annotations[name] = {
+          name,
+          settings
+        };
+      };
+      const lookup = name => get$a(annotations, name).map(a => a.settings);
+      const getNames = () => keys(annotations);
+      return {
+        register,
+        lookup,
+        getNames
+      };
+    };
+
+    let unique = 0;
+    const generate$1 = prefix => {
+      const date = new Date();
+      const time = date.getTime();
+      const random = Math.floor(Math.random() * 1000000000);
+      unique++;
+      return prefix + '_' + random + unique + String(time);
+    };
+
+    const add = (element, classes) => {
+      each$g(classes, x => {
+        add$2(element, x);
+      });
+    };
+
+    const clone$2 = (original, isDeep) => SugarElement.fromDom(original.dom.cloneNode(isDeep));
+    const shallow$1 = original => clone$2(original, false);
+    const deep$1 = original => clone$2(original, true);
+    const shallowAs = (original, tag) => {
+      const nu = SugarElement.fromTag(tag);
+      const attributes = clone$4(original);
+      setAll$1(nu, attributes);
+      return nu;
+    };
+    const mutate = (original, tag) => {
+      const nu = shallowAs(original, tag);
+      after$4(original, nu);
+      const children$1 = children(original);
+      append(nu, children$1);
+      remove$5(original);
+      return nu;
+    };
+
+    const TextWalker = (startNode, rootNode, isBoundary = never) => {
+      const walker = new DomTreeWalker(startNode, rootNode);
+      const walk = direction => {
+        let next;
+        do {
+          next = walker[direction]();
+        } while (next && !isText$8(next) && !isBoundary(next));
+        return Optional.from(next).filter(isText$8);
+      };
+      return {
+        current: () => Optional.from(walker.current()).filter(isText$8),
+        next: () => walk('next'),
+        prev: () => walk('prev'),
+        prev2: () => walk('prev2')
+      };
+    };
+
+    const TextSeeker = (dom, isBoundary) => {
+      const isBlockBoundary = isBoundary ? isBoundary : node => dom.isBlock(node) || isBr$5(node) || isContentEditableFalse$a(node);
+      const walk = (node, offset, walker, process) => {
+        if (isText$8(node)) {
+          const newOffset = process(node, offset, node.data);
+          if (newOffset !== -1) {
+            return Optional.some({
+              container: node,
+              offset: newOffset
+            });
+          }
+        }
+        return walker().bind(next => walk(next.container, next.offset, walker, process));
+      };
+      const backwards = (node, offset, process, root) => {
+        const walker = TextWalker(node, root, isBlockBoundary);
+        return walk(node, offset, () => walker.prev().map(prev => ({
+          container: prev,
+          offset: prev.length
+        })), process).getOrNull();
+      };
+      const forwards = (node, offset, process, root) => {
+        const walker = TextWalker(node, root, isBlockBoundary);
+        return walk(node, offset, () => walker.next().map(next => ({
+          container: next,
+          offset: 0
+        })), process).getOrNull();
+      };
+      return {
+        backwards,
+        forwards
+      };
+    };
+
+    const round$1 = Math.round;
+    const clone$1 = rect => {
+      if (!rect) {
+        return {
+          left: 0,
+          top: 0,
+          bottom: 0,
+          right: 0,
+          width: 0,
+          height: 0
+        };
+      }
+      return {
+        left: round$1(rect.left),
+        top: round$1(rect.top),
+        bottom: round$1(rect.bottom),
+        right: round$1(rect.right),
+        width: round$1(rect.width),
+        height: round$1(rect.height)
+      };
+    };
+    const collapse = (rect, toStart) => {
+      rect = clone$1(rect);
+      if (toStart) {
+        rect.right = rect.left;
+      } else {
+        rect.left = rect.left + rect.width;
+        rect.right = rect.left;
+      }
+      rect.width = 0;
+      return rect;
+    };
+    const isEqual = (rect1, rect2) => rect1.left === rect2.left && rect1.top === rect2.top && rect1.bottom === rect2.bottom && rect1.right === rect2.right;
+    const isValidOverflow = (overflowY, rect1, rect2) => overflowY >= 0 && overflowY <= Math.min(rect1.height, rect2.height) / 2;
+    const isAbove$1 = (rect1, rect2) => {
+      const halfHeight = Math.min(rect2.height / 2, rect1.height / 2);
+      if (rect1.bottom - halfHeight < rect2.top) {
+        return true;
+      }
+      if (rect1.top > rect2.bottom) {
+        return false;
+      }
+      return isValidOverflow(rect2.top - rect1.bottom, rect1, rect2);
+    };
+    const isBelow$1 = (rect1, rect2) => {
+      if (rect1.top > rect2.bottom) {
+        return true;
+      }
+      if (rect1.bottom < rect2.top) {
+        return false;
+      }
+      return isValidOverflow(rect2.bottom - rect1.top, rect1, rect2);
+    };
+    const containsXY = (rect, clientX, clientY) => clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;
+    const boundingClientRectFromRects = rects => {
+      return foldl(rects, (acc, rect) => {
+        return acc.fold(() => Optional.some(rect), prevRect => {
+          const left = Math.min(rect.left, prevRect.left);
+          const top = Math.min(rect.top, prevRect.top);
+          const right = Math.max(rect.right, prevRect.right);
+          const bottom = Math.max(rect.bottom, prevRect.bottom);
+          return Optional.some({
+            top,
+            right,
+            bottom,
+            left,
+            width: right - left,
+            height: bottom - top
+          });
+        });
+      }, Optional.none());
+    };
+    const distanceToRectEdgeFromXY = (rect, x, y) => {
+      const cx = Math.max(Math.min(x, rect.left + rect.width), rect.left);
+      const cy = Math.max(Math.min(y, rect.top + rect.height), rect.top);
+      return Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy));
+    };
+    const overlapY = (r1, r2) => Math.max(0, Math.min(r1.bottom, r2.bottom) - Math.max(r1.top, r2.top));
+
+    const clamp$2 = (value, min, max) => Math.min(Math.max(value, min), max);
+
+    const getSelectedNode = range => {
+      const startContainer = range.startContainer, startOffset = range.startOffset;
+      if (startContainer.hasChildNodes() && range.endOffset === startOffset + 1) {
+        return startContainer.childNodes[startOffset];
+      }
+      return null;
+    };
+    const getNode$1 = (container, offset) => {
+      if (isElement$6(container) && container.hasChildNodes()) {
+        const childNodes = container.childNodes;
+        const safeOffset = clamp$2(offset, 0, childNodes.length - 1);
+        return childNodes[safeOffset];
+      } else {
+        return container;
+      }
+    };
+    const getNodeUnsafe = (container, offset) => {
+      if (offset < 0 && isElement$6(container) && container.hasChildNodes()) {
+        return undefined;
+      } else {
+        return getNode$1(container, offset);
+      }
+    };
+
+    const extendingChars = 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]');
+    const isExtendingChar = ch => typeof ch === 'string' && ch.charCodeAt(0) >= 768 && extendingChars.test(ch);
+
+    const or = (...args) => {
+      return x => {
+        for (let i = 0; i < args.length; i++) {
+          if (args[i](x)) {
+            return true;
+          }
+        }
+        return false;
+      };
+    };
+    const and = (...args) => {
+      return x => {
+        for (let i = 0; i < args.length; i++) {
+          if (!args[i](x)) {
+            return false;
+          }
+        }
+        return true;
+      };
+    };
+
+    const isElement$4 = isElement$6;
+    const isCaretCandidate$2 = isCaretCandidate$3;
+    const isBlock$1 = matchStyleValues('display', 'block table');
+    const isFloated = matchStyleValues('float', 'left right');
+    const isValidElementCaretCandidate = and(isElement$4, isCaretCandidate$2, not(isFloated));
+    const isNotPre = not(matchStyleValues('white-space', 'pre pre-line pre-wrap'));
+    const isText$5 = isText$8;
+    const isBr$2 = isBr$5;
+    const nodeIndex$1 = DOMUtils.nodeIndex;
+    const resolveIndex$1 = getNodeUnsafe;
+    const createRange$1 = doc => 'createRange' in doc ? doc.createRange() : DOMUtils.DOM.createRng();
+    const isWhiteSpace$1 = chr => chr && /[\r\n\t ]/.test(chr);
+    const isRange = rng => !!rng.setStart && !!rng.setEnd;
+    const isHiddenWhiteSpaceRange = range => {
+      const container = range.startContainer;
+      const offset = range.startOffset;
+      if (isWhiteSpace$1(range.toString()) && isNotPre(container.parentNode) && isText$8(container)) {
+        const text = container.data;
+        if (isWhiteSpace$1(text[offset - 1]) || isWhiteSpace$1(text[offset + 1])) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const getBrClientRect = brNode => {
+      const doc = brNode.ownerDocument;
+      const rng = createRange$1(doc);
+      const nbsp$1 = doc.createTextNode(nbsp);
+      const parentNode = brNode.parentNode;
+      parentNode.insertBefore(nbsp$1, brNode);
+      rng.setStart(nbsp$1, 0);
+      rng.setEnd(nbsp$1, 1);
+      const clientRect = clone$1(rng.getBoundingClientRect());
+      parentNode.removeChild(nbsp$1);
+      return clientRect;
+    };
+    const getBoundingClientRectWebKitText = rng => {
+      const sc = rng.startContainer;
+      const ec = rng.endContainer;
+      const so = rng.startOffset;
+      const eo = rng.endOffset;
+      if (sc === ec && isText$8(ec) && so === 0 && eo === 1) {
+        const newRng = rng.cloneRange();
+        newRng.setEndAfter(ec);
+        return getBoundingClientRect$1(newRng);
+      } else {
+        return null;
+      }
+    };
+    const isZeroRect = r => r.left === 0 && r.right === 0 && r.top === 0 && r.bottom === 0;
+    const getBoundingClientRect$1 = item => {
+      let clientRect;
+      const clientRects = item.getClientRects();
+      if (clientRects.length > 0) {
+        clientRect = clone$1(clientRects[0]);
+      } else {
+        clientRect = clone$1(item.getBoundingClientRect());
+      }
+      if (!isRange(item) && isBr$2(item) && isZeroRect(clientRect)) {
+        return getBrClientRect(item);
+      }
+      if (isZeroRect(clientRect) && isRange(item)) {
+        return getBoundingClientRectWebKitText(item);
+      }
+      return clientRect;
+    };
+    const collapseAndInflateWidth = (clientRect, toStart) => {
+      const newClientRect = collapse(clientRect, toStart);
+      newClientRect.width = 1;
+      newClientRect.right = newClientRect.left + 1;
+      return newClientRect;
+    };
+    const getCaretPositionClientRects = caretPosition => {
+      const clientRects = [];
+      const addUniqueAndValidRect = clientRect => {
+        if (clientRect.height === 0) {
+          return;
+        }
+        if (clientRects.length > 0) {
+          if (isEqual(clientRect, clientRects[clientRects.length - 1])) {
+            return;
+          }
+        }
+        clientRects.push(clientRect);
+      };
+      const addCharacterOffset = (container, offset) => {
+        const range = createRange$1(container.ownerDocument);
+        if (offset < container.data.length) {
+          if (isExtendingChar(container.data[offset])) {
+            return clientRects;
+          }
+          if (isExtendingChar(container.data[offset - 1])) {
+            range.setStart(container, offset);
+            range.setEnd(container, offset + 1);
+            if (!isHiddenWhiteSpaceRange(range)) {
+              addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(range), false));
+              return clientRects;
+            }
+          }
+        }
+        if (offset > 0) {
+          range.setStart(container, offset - 1);
+          range.setEnd(container, offset);
+          if (!isHiddenWhiteSpaceRange(range)) {
+            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(range), false));
+          }
+        }
+        if (offset < container.data.length) {
+          range.setStart(container, offset);
+          range.setEnd(container, offset + 1);
+          if (!isHiddenWhiteSpaceRange(range)) {
+            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(range), true));
+          }
+        }
+      };
+      const container = caretPosition.container();
+      const offset = caretPosition.offset();
+      if (isText$5(container)) {
+        addCharacterOffset(container, offset);
+        return clientRects;
+      }
+      if (isElement$4(container)) {
+        if (caretPosition.isAtEnd()) {
+          const node = resolveIndex$1(container, offset);
+          if (isText$5(node)) {
+            addCharacterOffset(node, node.data.length);
+          }
+          if (isValidElementCaretCandidate(node) && !isBr$2(node)) {
+            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(node), false));
+          }
+        } else {
+          const node = resolveIndex$1(container, offset);
+          if (isText$5(node)) {
+            addCharacterOffset(node, 0);
+          }
+          if (isValidElementCaretCandidate(node) && caretPosition.isAtEnd()) {
+            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(node), false));
+            return clientRects;
+          }
+          const beforeNode = resolveIndex$1(caretPosition.container(), caretPosition.offset() - 1);
+          if (isValidElementCaretCandidate(beforeNode) && !isBr$2(beforeNode)) {
+            if (isBlock$1(beforeNode) || isBlock$1(node) || !isValidElementCaretCandidate(node)) {
+              addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(beforeNode), false));
+            }
+          }
+          if (isValidElementCaretCandidate(node)) {
+            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect$1(node), true));
+          }
+        }
+      }
+      return clientRects;
+    };
+    const CaretPosition = (container, offset, clientRects) => {
+      const isAtStart = () => {
+        if (isText$5(container)) {
+          return offset === 0;
+        }
+        return offset === 0;
+      };
+      const isAtEnd = () => {
+        if (isText$5(container)) {
+          return offset >= container.data.length;
+        }
+        return offset >= container.childNodes.length;
+      };
+      const toRange = () => {
+        const range = createRange$1(container.ownerDocument);
+        range.setStart(container, offset);
+        range.setEnd(container, offset);
+        return range;
+      };
+      const getClientRects = () => {
+        if (!clientRects) {
+          clientRects = getCaretPositionClientRects(CaretPosition(container, offset));
+        }
+        return clientRects;
+      };
+      const isVisible = () => getClientRects().length > 0;
+      const isEqual = caretPosition => caretPosition && container === caretPosition.container() && offset === caretPosition.offset();
+      const getNode = before => resolveIndex$1(container, before ? offset - 1 : offset);
+      return {
+        container: constant(container),
+        offset: constant(offset),
+        toRange,
+        getClientRects,
+        isVisible,
+        isAtStart,
+        isAtEnd,
+        isEqual,
+        getNode
+      };
+    };
+    CaretPosition.fromRangeStart = range => CaretPosition(range.startContainer, range.startOffset);
+    CaretPosition.fromRangeEnd = range => CaretPosition(range.endContainer, range.endOffset);
+    CaretPosition.after = node => CaretPosition(node.parentNode, nodeIndex$1(node) + 1);
+    CaretPosition.before = node => CaretPosition(node.parentNode, nodeIndex$1(node));
+    CaretPosition.isAbove = (pos1, pos2) => lift2(head(pos2.getClientRects()), last$3(pos1.getClientRects()), isAbove$1).getOr(false);
+    CaretPosition.isBelow = (pos1, pos2) => lift2(last$3(pos2.getClientRects()), head(pos1.getClientRects()), isBelow$1).getOr(false);
+    CaretPosition.isAtStart = pos => pos ? pos.isAtStart() : false;
+    CaretPosition.isAtEnd = pos => pos ? pos.isAtEnd() : false;
+    CaretPosition.isTextPosition = pos => pos ? isText$8(pos.container()) : false;
+    CaretPosition.isElementPosition = pos => CaretPosition.isTextPosition(pos) === false;
+
+    const trimEmptyTextNode$1 = (dom, node) => {
+      if (isText$8(node) && node.data.length === 0) {
+        dom.remove(node);
+      }
+    };
+    const insertNode = (dom, rng, node) => {
+      rng.insertNode(node);
+      trimEmptyTextNode$1(dom, node.previousSibling);
+      trimEmptyTextNode$1(dom, node.nextSibling);
+    };
+    const insertFragment = (dom, rng, frag) => {
+      const firstChild = Optional.from(frag.firstChild);
+      const lastChild = Optional.from(frag.lastChild);
+      rng.insertNode(frag);
+      firstChild.each(child => trimEmptyTextNode$1(dom, child.previousSibling));
+      lastChild.each(child => trimEmptyTextNode$1(dom, child.nextSibling));
+    };
+    const rangeInsertNode = (dom, rng, node) => {
+      if (isDocumentFragment(node)) {
+        insertFragment(dom, rng, node);
+      } else {
+        insertNode(dom, rng, node);
+      }
+    };
+
+    const isText$4 = isText$8;
+    const isBogus = isBogus$2;
+    const nodeIndex = DOMUtils.nodeIndex;
+    const normalizedParent = node => {
+      const parentNode = node.parentNode;
+      if (isBogus(parentNode)) {
+        return normalizedParent(parentNode);
+      }
+      return parentNode;
+    };
+    const getChildNodes = node => {
+      if (!node) {
+        return [];
+      }
+      return reduce(node.childNodes, (result, node) => {
+        if (isBogus(node) && node.nodeName !== 'BR') {
+          result = result.concat(getChildNodes(node));
+        } else {
+          result.push(node);
+        }
+        return result;
+      }, []);
+    };
+    const normalizedTextOffset = (node, offset) => {
+      while (node = node.previousSibling) {
+        if (!isText$4(node)) {
+          break;
+        }
+        offset += node.data.length;
+      }
+      return offset;
+    };
+    const equal = a => b => a === b;
+    const normalizedNodeIndex = node => {
+      let nodes, index;
+      nodes = getChildNodes(normalizedParent(node));
+      index = findIndex$1(nodes, equal(node), node);
+      nodes = nodes.slice(0, index + 1);
+      const numTextFragments = reduce(nodes, (result, node, i) => {
+        if (isText$4(node) && isText$4(nodes[i - 1])) {
+          result++;
+        }
+        return result;
+      }, 0);
+      nodes = filter$4(nodes, matchNodeNames([node.nodeName]));
+      index = findIndex$1(nodes, equal(node), node);
+      return index - numTextFragments;
+    };
+    const createPathItem = node => {
+      let name;
+      if (isText$4(node)) {
+        name = 'text()';
+      } else {
+        name = node.nodeName.toLowerCase();
+      }
+      return name + '[' + normalizedNodeIndex(node) + ']';
+    };
+    const parentsUntil$1 = (root, node, predicate) => {
+      const parents = [];
+      for (node = node.parentNode; node !== root; node = node.parentNode) {
+        if (predicate && predicate(node)) {
+          break;
+        }
+        parents.push(node);
+      }
+      return parents;
+    };
+    const create$a = (root, caretPosition) => {
+      let container, offset, path = [], outputOffset, childNodes, parents;
+      container = caretPosition.container();
+      offset = caretPosition.offset();
+      if (isText$4(container)) {
+        outputOffset = normalizedTextOffset(container, offset);
+      } else {
+        childNodes = container.childNodes;
+        if (offset >= childNodes.length) {
+          outputOffset = 'after';
+          offset = childNodes.length - 1;
+        } else {
+          outputOffset = 'before';
+        }
+        container = childNodes[offset];
+      }
+      path.push(createPathItem(container));
+      parents = parentsUntil$1(root, container);
+      parents = filter$4(parents, not(isBogus$2));
+      path = path.concat(map$1(parents, node => {
+        return createPathItem(node);
+      }));
+      return path.reverse().join('/') + ',' + outputOffset;
+    };
+    const resolvePathItem = (node, name, index) => {
+      let nodes = getChildNodes(node);
+      nodes = filter$4(nodes, (node, index) => {
+        return !isText$4(node) || !isText$4(nodes[index - 1]);
+      });
+      nodes = filter$4(nodes, matchNodeNames([name]));
+      return nodes[index];
+    };
+    const findTextPosition = (container, offset) => {
+      let node = container, targetOffset = 0, dataLen;
+      while (isText$4(node)) {
+        dataLen = node.data.length;
+        if (offset >= targetOffset && offset <= targetOffset + dataLen) {
+          container = node;
+          offset = offset - targetOffset;
+          break;
+        }
+        if (!isText$4(node.nextSibling)) {
+          container = node;
+          offset = dataLen;
+          break;
+        }
+        targetOffset += dataLen;
+        node = node.nextSibling;
+      }
+      if (isText$4(container) && offset > container.data.length) {
+        offset = container.data.length;
+      }
+      return CaretPosition(container, offset);
+    };
+    const resolve$1 = (root, path) => {
+      let offset;
+      if (!path) {
+        return null;
+      }
+      const parts = path.split(',');
+      const paths = parts[0].split('/');
+      offset = parts.length > 1 ? parts[1] : 'before';
+      const container = reduce(paths, (result, value) => {
+        const match = /([\w\-\(\)]+)\[([0-9]+)\]/.exec(value);
+        if (!match) {
+          return null;
+        }
+        if (match[1] === 'text()') {
+          match[1] = '#text';
+        }
+        return resolvePathItem(result, match[1], parseInt(match[2], 10));
+      }, root);
+      if (!container) {
+        return null;
+      }
+      if (!isText$4(container)) {
+        if (offset === 'after') {
+          offset = nodeIndex(container) + 1;
+        } else {
+          offset = nodeIndex(container);
+        }
+        return CaretPosition(container.parentNode, offset);
+      }
+      return findTextPosition(container, parseInt(offset, 10));
+    };
+
+    const isContentEditableFalse$8 = isContentEditableFalse$a;
+    const getNormalizedTextOffset = (trim, container, offset) => {
+      let node, trimmedOffset;
+      trimmedOffset = trim(container.data.slice(0, offset)).length;
+      for (node = container.previousSibling; node && isText$8(node); node = node.previousSibling) {
+        trimmedOffset += trim(node.data).length;
+      }
+      return trimmedOffset;
+    };
+    const getPoint = (dom, trim, normalized, rng, start) => {
+      let container = rng[start ? 'startContainer' : 'endContainer'];
+      let offset = rng[start ? 'startOffset' : 'endOffset'];
+      const point = [];
+      let childNodes, after = 0;
+      const root = dom.getRoot();
+      if (isText$8(container)) {
+        point.push(normalized ? getNormalizedTextOffset(trim, container, offset) : offset);
+      } else {
+        childNodes = container.childNodes;
+        if (offset >= childNodes.length && childNodes.length) {
+          after = 1;
+          offset = Math.max(0, childNodes.length - 1);
+        }
+        point.push(dom.nodeIndex(childNodes[offset], normalized) + after);
+      }
+      for (; container && container !== root; container = container.parentNode) {
+        point.push(dom.nodeIndex(container, normalized));
+      }
+      return point;
+    };
+    const getLocation = (trim, selection, normalized, rng) => {
+      const dom = selection.dom, bookmark = {};
+      bookmark.start = getPoint(dom, trim, normalized, rng, true);
+      if (!selection.isCollapsed()) {
+        bookmark.end = getPoint(dom, trim, normalized, rng, false);
+      }
+      if (isRangeInCaretContainerBlock(rng)) {
+        bookmark.isFakeCaret = true;
+      }
+      return bookmark;
+    };
+    const findIndex = (dom, name, element) => {
+      let count = 0;
+      Tools.each(dom.select(name), node => {
+        if (node.getAttribute('data-mce-bogus') === 'all') {
+          return;
+        }
+        if (node === element) {
+          return false;
+        }
+        count++;
+      });
+      return count;
+    };
+    const moveEndPoint$1 = (rng, start) => {
+      let container, offset, childNodes;
+      const prefix = start ? 'start' : 'end';
+      container = rng[prefix + 'Container'];
+      offset = rng[prefix + 'Offset'];
+      if (isElement$6(container) && container.nodeName === 'TR') {
+        childNodes = container.childNodes;
+        container = childNodes[Math.min(start ? offset : offset - 1, childNodes.length - 1)];
+        if (container) {
+          offset = start ? 0 : container.childNodes.length;
+          rng['set' + (start ? 'Start' : 'End')](container, offset);
+        }
+      }
+    };
+    const normalizeTableCellSelection = rng => {
+      moveEndPoint$1(rng, true);
+      moveEndPoint$1(rng, false);
+      return rng;
+    };
+    const findSibling = (node, offset) => {
+      let sibling;
+      if (isElement$6(node)) {
+        node = getNode$1(node, offset);
+        if (isContentEditableFalse$8(node)) {
+          return node;
+        }
+      }
+      if (isCaretContainer$2(node)) {
+        if (isText$8(node) && isCaretContainerBlock$1(node)) {
+          node = node.parentNode;
+        }
+        sibling = node.previousSibling;
+        if (isContentEditableFalse$8(sibling)) {
+          return sibling;
+        }
+        sibling = node.nextSibling;
+        if (isContentEditableFalse$8(sibling)) {
+          return sibling;
+        }
+      }
+    };
+    const findAdjacentContentEditableFalseElm = rng => {
+      return findSibling(rng.startContainer, rng.startOffset) || findSibling(rng.endContainer, rng.endOffset);
+    };
+    const getOffsetBookmark = (trim, normalized, selection) => {
+      const element = selection.getNode();
+      let name = element ? element.nodeName : null;
+      const rng = selection.getRng();
+      if (isContentEditableFalse$8(element) || name === 'IMG') {
+        return {
+          name,
+          index: findIndex(selection.dom, name, element)
+        };
+      }
+      const sibling = findAdjacentContentEditableFalseElm(rng);
+      if (sibling) {
+        name = sibling.tagName;
+        return {
+          name,
+          index: findIndex(selection.dom, name, sibling)
+        };
+      }
+      return getLocation(trim, selection, normalized, rng);
+    };
+    const getCaretBookmark = selection => {
+      const rng = selection.getRng();
+      return {
+        start: create$a(selection.dom.getRoot(), CaretPosition.fromRangeStart(rng)),
+        end: create$a(selection.dom.getRoot(), CaretPosition.fromRangeEnd(rng))
+      };
+    };
+    const getRangeBookmark = selection => {
+      return { rng: selection.getRng() };
+    };
+    const createBookmarkSpan = (dom, id, filled) => {
+      const args = {
+        'data-mce-type': 'bookmark',
+        id,
+        'style': 'overflow:hidden;line-height:0px'
+      };
+      return filled ? dom.create('span', args, '&#xFEFF;') : dom.create('span', args);
+    };
+    const getPersistentBookmark = (selection, filled) => {
+      const dom = selection.dom;
+      let rng = selection.getRng();
+      const id = dom.uniqueId();
+      const collapsed = selection.isCollapsed();
+      const element = selection.getNode();
+      const name = element.nodeName;
+      if (name === 'IMG') {
+        return {
+          name,
+          index: findIndex(dom, name, element)
+        };
+      }
+      const rng2 = normalizeTableCellSelection(rng.cloneRange());
+      if (!collapsed) {
+        rng2.collapse(false);
+        const endBookmarkNode = createBookmarkSpan(dom, id + '_end', filled);
+        rangeInsertNode(dom, rng2, endBookmarkNode);
+      }
+      rng = normalizeTableCellSelection(rng);
+      rng.collapse(true);
+      const startBookmarkNode = createBookmarkSpan(dom, id + '_start', filled);
+      rangeInsertNode(dom, rng, startBookmarkNode);
+      selection.moveToBookmark({
+        id,
+        keep: true
+      });
+      return { id };
+    };
+    const getBookmark$2 = (selection, type, normalized) => {
+      if (type === 2) {
+        return getOffsetBookmark(trim$1, normalized, selection);
+      } else if (type === 3) {
+        return getCaretBookmark(selection);
+      } else if (type) {
+        return getRangeBookmark(selection);
+      } else {
+        return getPersistentBookmark(selection, false);
+      }
+    };
+    const getUndoBookmark = curry(getOffsetBookmark, identity, true);
+
+    const value$1 = value => {
+      const applyHelper = fn => fn(value);
+      const constHelper = constant(value);
+      const outputHelper = () => output;
+      const output = {
+        tag: true,
+        inner: value,
+        fold: (_onError, onValue) => onValue(value),
+        isValue: always,
+        isError: never,
+        map: mapper => Result.value(mapper(value)),
+        mapError: outputHelper,
+        bind: applyHelper,
+        exists: applyHelper,
+        forall: applyHelper,
+        getOr: constHelper,
+        or: outputHelper,
+        getOrThunk: constHelper,
+        orThunk: outputHelper,
+        getOrDie: constHelper,
+        each: fn => {
+          fn(value);
+        },
+        toOptional: () => Optional.some(value)
+      };
+      return output;
+    };
+    const error = error => {
+      const outputHelper = () => output;
+      const output = {
+        tag: false,
+        inner: error,
+        fold: (onError, _onValue) => onError(error),
+        isValue: never,
+        isError: always,
+        map: outputHelper,
+        mapError: mapper => Result.error(mapper(error)),
+        bind: outputHelper,
+        exists: never,
+        forall: always,
+        getOr: identity,
+        or: identity,
+        getOrThunk: apply$1,
+        orThunk: apply$1,
+        getOrDie: die(String(error)),
+        each: noop,
+        toOptional: Optional.none
+      };
+      return output;
+    };
+    const fromOption = (optional, err) => optional.fold(() => error(err), value$1);
+    const Result = {
+      value: value$1,
+      error,
+      fromOption
+    };
+
+    const generate = cases => {
+      if (!isArray$1(cases)) {
+        throw new Error('cases must be an array');
+      }
+      if (cases.length === 0) {
+        throw new Error('there must be at least one case');
+      }
+      const constructors = [];
+      const adt = {};
+      each$g(cases, (acase, count) => {
+        const keys$1 = keys(acase);
+        if (keys$1.length !== 1) {
+          throw new Error('one and only one name per case');
+        }
+        const key = keys$1[0];
+        const value = acase[key];
+        if (adt[key] !== undefined) {
+          throw new Error('duplicate key detected:' + key);
+        } else if (key === 'cata') {
+          throw new Error('cannot have a case named cata (sorry)');
+        } else if (!isArray$1(value)) {
+          throw new Error('case arguments must be an array');
+        }
+        constructors.push(key);
+        adt[key] = (...args) => {
+          const argLength = args.length;
+          if (argLength !== value.length) {
+            throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);
+          }
+          const match = branches => {
+            const branchKeys = keys(branches);
+            if (constructors.length !== branchKeys.length) {
+              throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(','));
+            }
+            const allReqd = forall(constructors, reqKey => {
+              return contains$2(branchKeys, reqKey);
+            });
+            if (!allReqd) {
+              throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', '));
+            }
+            return branches[key].apply(null, args);
+          };
+          return {
+            fold: (...foldArgs) => {
+              if (foldArgs.length !== cases.length) {
+                throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);
+              }
+              const target = foldArgs[count];
+              return target.apply(null, args);
+            },
+            match,
+            log: label => {
+              console.log(label, {
+                constructors,
+                constructor: key,
+                params: args
+              });
+            }
+          };
+        };
+      });
+      return adt;
+    };
+    const Adt = { generate };
+
+    Adt.generate([
+      {
+        bothErrors: [
+          'error1',
+          'error2'
+        ]
+      },
+      {
+        firstError: [
+          'error1',
+          'value2'
+        ]
+      },
+      {
+        secondError: [
+          'value1',
+          'error2'
+        ]
+      },
+      {
+        bothValues: [
+          'value1',
+          'value2'
+        ]
+      }
+    ]);
+    const partition$1 = results => {
+      const errors = [];
+      const values = [];
+      each$g(results, result => {
+        result.fold(err => {
+          errors.push(err);
+        }, value => {
+          values.push(value);
+        });
+      });
+      return {
+        errors,
+        values
+      };
+    };
+
+    const isInlinePattern = pattern => pattern.type === 'inline-command' || pattern.type === 'inline-format';
+    const isBlockPattern = pattern => pattern.type === 'block-command' || pattern.type === 'block-format';
+    const sortPatterns = patterns => sort(patterns, (a, b) => {
+      if (a.start.length === b.start.length) {
+        return 0;
+      }
+      return a.start.length > b.start.length ? -1 : 1;
+    });
+    const normalizePattern = pattern => {
+      const err = message => Result.error({
+        message,
+        pattern
+      });
+      const formatOrCmd = (name, onFormat, onCommand) => {
+        if (pattern.format !== undefined) {
+          let formats;
+          if (isArray$1(pattern.format)) {
+            if (!forall(pattern.format, isString)) {
+              return err(name + ' pattern has non-string items in the `format` array');
+            }
+            formats = pattern.format;
+          } else if (isString(pattern.format)) {
+            formats = [pattern.format];
+          } else {
+            return err(name + ' pattern has non-string `format` parameter');
+          }
+          return Result.value(onFormat(formats));
+        } else if (pattern.cmd !== undefined) {
+          if (!isString(pattern.cmd)) {
+            return err(name + ' pattern has non-string `cmd` parameter');
+          }
+          return Result.value(onCommand(pattern.cmd, pattern.value));
+        } else {
+          return err(name + ' pattern is missing both `format` and `cmd` parameters');
+        }
+      };
+      if (!isObject(pattern)) {
+        return err('Raw pattern is not an object');
+      }
+      if (!isString(pattern.start)) {
+        return err('Raw pattern is missing `start` parameter');
+      }
+      if (pattern.end !== undefined) {
+        if (!isString(pattern.end)) {
+          return err('Inline pattern has non-string `end` parameter');
+        }
+        if (pattern.start.length === 0 && pattern.end.length === 0) {
+          return err('Inline pattern has empty `start` and `end` parameters');
+        }
+        let start = pattern.start;
+        let end = pattern.end;
+        if (end.length === 0) {
+          end = start;
+          start = '';
+        }
+        return formatOrCmd('Inline', format => ({
+          type: 'inline-format',
+          start,
+          end,
+          format
+        }), (cmd, value) => ({
+          type: 'inline-command',
+          start,
+          end,
+          cmd,
+          value
+        }));
+      } else if (pattern.replacement !== undefined) {
+        if (!isString(pattern.replacement)) {
+          return err('Replacement pattern has non-string `replacement` parameter');
+        }
+        if (pattern.start.length === 0) {
+          return err('Replacement pattern has empty `start` parameter');
+        }
+        return Result.value({
+          type: 'inline-command',
+          start: '',
+          end: pattern.start,
+          cmd: 'mceInsertContent',
+          value: pattern.replacement
+        });
+      } else {
+        if (pattern.start.length === 0) {
+          return err('Block pattern has empty `start` parameter');
+        }
+        return formatOrCmd('Block', formats => ({
+          type: 'block-format',
+          start: pattern.start,
+          format: formats[0]
+        }), (command, commandValue) => ({
+          type: 'block-command',
+          start: pattern.start,
+          cmd: command,
+          value: commandValue
+        }));
+      }
+    };
+    const getBlockPatterns = patterns => sortPatterns(filter$6(patterns, isBlockPattern));
+    const getInlinePatterns = patterns => filter$6(patterns, isInlinePattern);
+    const createPatternSet = patterns => ({
+      inlinePatterns: getInlinePatterns(patterns),
+      blockPatterns: getBlockPatterns(patterns)
+    });
+    const fromRawPatterns = patterns => {
+      const normalized = partition$1(map$3(patterns, normalizePattern));
+      each$g(normalized.errors, err => console.error(err.message, err.pattern));
+      return normalized.values;
+    };
+
+    const deviceDetection$1 = detect$2().deviceType;
+    const isTouch = deviceDetection$1.isTouch();
+    const DOM$a = DOMUtils.DOM;
+    const getHash = value => {
+      const items = value.indexOf('=') > 0 ? value.split(/[;,](?![^=;,]*(?:[;,]|$))/) : value.split(',');
+      return foldl(items, (output, item) => {
+        const arr = item.split('=');
+        const key = arr[0];
+        const val = arr.length > 1 ? arr[1] : key;
+        output[trim$3(key)] = trim$3(val);
+        return output;
+      }, {});
+    };
+    const isRegExp = x => is$4(x, RegExp);
+    const option = name => editor => editor.options.get(name);
+    const stringOrObjectProcessor = value => isString(value) || isObject(value);
+    const bodyOptionProcessor = (editor, defaultValue = '') => value => {
+      const valid = isString(value);
+      if (valid) {
+        if (value.indexOf('=') !== -1) {
+          const bodyObj = getHash(value);
+          return {
+            value: get$a(bodyObj, editor.id).getOr(defaultValue),
+            valid
+          };
+        } else {
+          return {
+            value,
+            valid
+          };
+        }
+      } else {
+        return {
+          valid: false,
+          message: 'Must be a string.'
+        };
+      }
+    };
+    const register$7 = editor => {
+      const registerOption = editor.options.register;
+      registerOption('id', {
+        processor: 'string',
+        default: editor.id
+      });
+      registerOption('selector', { processor: 'string' });
+      registerOption('target', { processor: 'object' });
+      registerOption('suffix', { processor: 'string' });
+      registerOption('cache_suffix', { processor: 'string' });
+      registerOption('base_url', { processor: 'string' });
+      registerOption('referrer_policy', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('language_load', { processor: 'boolean' });
+      registerOption('inline', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('iframe_attrs', {
+        processor: 'object',
+        default: {}
+      });
+      registerOption('doctype', {
+        processor: 'string',
+        default: '<!DOCTYPE html>'
+      });
+      registerOption('document_base_url', {
+        processor: 'string',
+        default: editor.documentBaseUrl
+      });
+      registerOption('body_id', {
+        processor: bodyOptionProcessor(editor, 'tinymce'),
+        default: 'tinymce'
+      });
+      registerOption('body_class', {
+        processor: bodyOptionProcessor(editor),
+        default: ''
+      });
+      registerOption('content_security_policy', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('br_in_pre', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('forced_root_block', {
+        processor: value => {
+          const valid = isString(value) && isNotEmpty(value);
+          if (valid) {
+            return {
+              value,
+              valid
+            };
+          } else {
+            return {
+              valid: false,
+              message: 'Must be a non-empty string.'
+            };
+          }
+        },
+        default: 'p'
+      });
+      registerOption('forced_root_block_attrs', {
+        processor: 'object',
+        default: {}
+      });
+      registerOption('br_newline_selector', {
+        processor: 'string',
+        default: '.mce-toc h2,figcaption,caption'
+      });
+      registerOption('no_newline_selector', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('keep_styles', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('end_container_on_empty_block', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('font_size_style_values', {
+        processor: 'string',
+        default: 'xx-small,x-small,small,medium,large,x-large,xx-large'
+      });
+      registerOption('font_size_legacy_values', {
+        processor: 'string',
+        default: 'xx-small,small,medium,large,x-large,xx-large,300%'
+      });
+      registerOption('font_size_classes', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('automatic_uploads', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('images_reuse_filename', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('images_replace_blob_uris', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('icons', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('icons_url', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('images_upload_url', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('images_upload_base_path', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('images_upload_base_path', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('images_upload_credentials', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('images_upload_handler', { processor: 'function' });
+      registerOption('language', {
+        processor: 'string',
+        default: 'en'
+      });
+      registerOption('language_url', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('entity_encoding', {
+        processor: 'string',
+        default: 'named'
+      });
+      registerOption('indent', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('indent_before', {
+        processor: 'string',
+        default: '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'
+      });
+      registerOption('indent_after', {
+        processor: 'string',
+        default: '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'
+      });
+      registerOption('indent_use_margin', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('indentation', {
+        processor: 'string',
+        default: '40px'
+      });
+      registerOption('content_css', {
+        processor: value => {
+          const valid = value === false || isString(value) || isArrayOf(value, isString);
+          if (valid) {
+            if (isString(value)) {
+              return {
+                value: map$3(value.split(','), trim$3),
+                valid
+              };
+            } else if (isArray$1(value)) {
+              return {
+                value,
+                valid
+              };
+            } else if (value === false) {
+              return {
+                value: [],
+                valid
+              };
+            } else {
+              return {
+                value,
+                valid
+              };
+            }
+          } else {
+            return {
+              valid: false,
+              message: 'Must be false, a string or an array of strings.'
+            };
+          }
+        },
+        default: isInline(editor) ? [] : ['default']
+      });
+      registerOption('content_style', { processor: 'string' });
+      registerOption('content_css_cors', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('font_css', {
+        processor: value => {
+          const valid = isString(value) || isArrayOf(value, isString);
+          if (valid) {
+            const newValue = isArray$1(value) ? value : map$3(value.split(','), trim$3);
+            return {
+              value: newValue,
+              valid
+            };
+          } else {
+            return {
+              valid: false,
+              message: 'Must be a string or an array of strings.'
+            };
+          }
+        },
+        default: []
+      });
+      registerOption('inline_boundaries', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('inline_boundaries_selector', {
+        processor: 'string',
+        default: 'a[href],code,.mce-annotation'
+      });
+      registerOption('object_resizing', {
+        processor: value => {
+          const valid = isBoolean(value) || isString(value);
+          if (valid) {
+            if (value === false || deviceDetection$1.isiPhone() || deviceDetection$1.isiPad()) {
+              return {
+                value: '',
+                valid
+              };
+            } else {
+              return {
+                value: value === true ? 'table,img,figure.image,div,video,iframe' : value,
+                valid
+              };
+            }
+          } else {
+            return {
+              valid: false,
+              message: 'Must be boolean or a string'
+            };
+          }
+        },
+        default: !isTouch
+      });
+      registerOption('resize_img_proportional', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('event_root', { processor: 'object' });
+      registerOption('service_message', { processor: 'string' });
+      registerOption('theme', {
+        processor: value => value === false || isString(value) || isFunction(value),
+        default: 'silver'
+      });
+      registerOption('theme_url', { processor: 'string' });
+      registerOption('formats', { processor: 'object' });
+      registerOption('format_empty_lines', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('preview_styles', {
+        processor: value => {
+          const valid = value === false || isString(value);
+          if (valid) {
+            return {
+              value: value === false ? '' : value,
+              valid
+            };
+          } else {
+            return {
+              valid: false,
+              message: 'Must be false or a string'
+            };
+          }
+        },
+        default: 'font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow'
+      });
+      registerOption('custom_ui_selector', {
+        processor: 'string',
+        default: ''
+      });
+      registerOption('hidden_input', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('submit_patch', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('encoding', { processor: 'string' });
+      registerOption('add_form_submit_trigger', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('add_unload_trigger', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('custom_undo_redo_levels', {
+        processor: 'number',
+        default: 0
+      });
+      registerOption('disable_nodechange', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('readonly', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('plugins', {
+        processor: 'string[]',
+        default: []
+      });
+      registerOption('external_plugins', { processor: 'object' });
+      registerOption('forced_plugins', { processor: 'string[]' });
+      registerOption('model', {
+        processor: 'string',
+        default: editor.hasPlugin('rtc') ? 'plugin' : 'dom'
+      });
+      registerOption('model_url', { processor: 'string' });
+      registerOption('block_unsupported_drop', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('visual', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('visual_table_class', {
+        processor: 'string',
+        default: 'mce-item-table'
+      });
+      registerOption('visual_anchor_class', {
+        processor: 'string',
+        default: 'mce-item-anchor'
+      });
+      registerOption('iframe_aria_text', {
+        processor: 'string',
+        default: 'Rich Text Area. Press ALT-0 for help.'
+      });
+      registerOption('setup', { processor: 'function' });
+      registerOption('init_instance_callback', { processor: 'function' });
+      registerOption('url_converter', {
+        processor: 'function',
+        default: editor.convertURL
+      });
+      registerOption('url_converter_scope', {
+        processor: 'object',
+        default: editor
+      });
+      registerOption('urlconverter_callback', { processor: 'function' });
+      registerOption('allow_conditional_comments', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('allow_html_data_urls', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('allow_svg_data_urls', { processor: 'boolean' });
+      registerOption('allow_html_in_named_anchor', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('allow_script_urls', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('allow_unsafe_link_target', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('convert_fonts_to_spans', {
+        processor: 'boolean',
+        default: true,
+        deprecated: true
+      });
+      registerOption('fix_list_elements', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('preserve_cdata', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('remove_trailing_brs', { processor: 'boolean' });
+      registerOption('inline_styles', {
+        processor: 'boolean',
+        default: true,
+        deprecated: true
+      });
+      registerOption('element_format', {
+        processor: 'string',
+        default: 'html'
+      });
+      registerOption('entities', { processor: 'string' });
+      registerOption('schema', {
+        processor: 'string',
+        default: 'html5'
+      });
+      registerOption('convert_urls', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('relative_urls', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('remove_script_host', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('custom_elements', { processor: 'string' });
+      registerOption('extended_valid_elements', { processor: 'string' });
+      registerOption('invalid_elements', { processor: 'string' });
+      registerOption('invalid_styles', { processor: stringOrObjectProcessor });
+      registerOption('valid_children', { processor: 'string' });
+      registerOption('valid_classes', { processor: stringOrObjectProcessor });
+      registerOption('valid_elements', { processor: 'string' });
+      registerOption('valid_styles', { processor: stringOrObjectProcessor });
+      registerOption('verify_html', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('auto_focus', { processor: value => isString(value) || value === true });
+      registerOption('browser_spellcheck', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('protect', { processor: 'array' });
+      registerOption('images_file_types', {
+        processor: 'string',
+        default: 'jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp'
+      });
+      registerOption('deprecation_warnings', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('a11y_advanced_options', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('api_key', { processor: 'string' });
+      registerOption('paste_block_drop', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('paste_data_images', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('paste_preprocess', { processor: 'function' });
+      registerOption('paste_postprocess', { processor: 'function' });
+      registerOption('paste_webkit_styles', {
+        processor: 'string',
+        default: 'none'
+      });
+      registerOption('paste_remove_styles_if_webkit', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('paste_merge_formats', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('smart_paste', {
+        processor: 'boolean',
+        default: true
+      });
+      registerOption('paste_as_text', {
+        processor: 'boolean',
+        default: false
+      });
+      registerOption('paste_tab_spaces', {
+        processor: 'number',
+        default: 4
+      });
+      registerOption('text_patterns', {
+        processor: value => {
+          if (isArrayOf(value, isObject) || value === false) {
+            const patterns = value === false ? [] : value;
+            return {
+              value: fromRawPatterns(patterns),
+              valid: true
+            };
+          } else {
+            return {
+              valid: false,
+              message: 'Must be an array of objects or false.'
+            };
+          }
+        },
+        default: [
+          {
+            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'
+          }
+        ]
+      });
+      registerOption('noneditable_class', {
+        processor: 'string',
+        default: 'mceNonEditable'
+      });
+      registerOption('editable_class', {
+        processor: 'string',
+        default: 'mceEditable'
+      });
+      registerOption('noneditable_regexp', {
+        processor: value => {
+          if (isArrayOf(value, isRegExp)) {
+            return {
+              value,
+              valid: true
+            };
+          } else if (isRegExp(value)) {
+            return {
+              value: [value],
+              valid: true
+            };
+          } else {
+            return {
+              valid: false,
+              message: 'Must be a RegExp or an array of RegExp.'
+            };
+          }
+        },
+        default: []
+      });
+      registerOption('table_tab_navigation', {
+        processor: 'boolean',
+        default: true
+      });
+      editor.on('ScriptsLoaded', () => {
+        registerOption('directionality', {
+          processor: 'string',
+          default: I18n.isRtl() ? 'rtl' : undefined
+        });
+        registerOption('placeholder', {
+          processor: 'string',
+          default: DOM$a.getAttrib(editor.getElement(), 'placeholder')
+        });
+      });
+    };
+    const getIframeAttrs = option('iframe_attrs');
+    const getDocType = option('doctype');
+    const getDocumentBaseUrl = option('document_base_url');
+    const getBodyId = option('body_id');
+    const getBodyClass = option('body_class');
+    const getContentSecurityPolicy = option('content_security_policy');
+    const shouldPutBrInPre$1 = option('br_in_pre');
+    const getForcedRootBlock = option('forced_root_block');
+    const getForcedRootBlockAttrs = option('forced_root_block_attrs');
+    const getBrNewLineSelector = option('br_newline_selector');
+    const getNoNewLineSelector = option('no_newline_selector');
+    const shouldKeepStyles = option('keep_styles');
+    const shouldEndContainerOnEmptyBlock = option('end_container_on_empty_block');
+    const isAutomaticUploadsEnabled = option('automatic_uploads');
+    const shouldReuseFileName = option('images_reuse_filename');
+    const shouldReplaceBlobUris = option('images_replace_blob_uris');
+    const getIconPackName = option('icons');
+    const getIconsUrl = option('icons_url');
+    const getImageUploadUrl = option('images_upload_url');
+    const getImageUploadBasePath = option('images_upload_base_path');
+    const getImagesUploadCredentials = option('images_upload_credentials');
+    const getImagesUploadHandler = option('images_upload_handler');
+    const shouldUseContentCssCors = option('content_css_cors');
+    const getReferrerPolicy = option('referrer_policy');
+    const getLanguageCode = option('language');
+    const getLanguageUrl = option('language_url');
+    const shouldIndentUseMargin = option('indent_use_margin');
+    const getIndentation = option('indentation');
+    const getContentCss = option('content_css');
+    const getContentStyle = option('content_style');
+    const getFontCss = option('font_css');
+    const getDirectionality = option('directionality');
+    const getInlineBoundarySelector = option('inline_boundaries_selector');
+    const getObjectResizing = option('object_resizing');
+    const getResizeImgProportional = option('resize_img_proportional');
+    const getPlaceholder = option('placeholder');
+    const getEventRoot = option('event_root');
+    const getServiceMessage = option('service_message');
+    const getTheme = option('theme');
+    const getThemeUrl = option('theme_url');
+    const getModel = option('model');
+    const getModelUrl = option('model_url');
+    const isInlineBoundariesEnabled = option('inline_boundaries');
+    const getFormats = option('formats');
+    const getPreviewStyles = option('preview_styles');
+    const canFormatEmptyLines = option('format_empty_lines');
+    const getCustomUiSelector = option('custom_ui_selector');
+    const isInline = option('inline');
+    const hasHiddenInput = option('hidden_input');
+    const shouldPatchSubmit = option('submit_patch');
+    const shouldAddFormSubmitTrigger = option('add_form_submit_trigger');
+    const shouldAddUnloadTrigger = option('add_unload_trigger');
+    const getCustomUndoRedoLevels = option('custom_undo_redo_levels');
+    const shouldDisableNodeChange = option('disable_nodechange');
+    const isReadOnly$1 = option('readonly');
+    const hasContentCssCors = option('content_css_cors');
+    const getPlugins = option('plugins');
+    const getExternalPlugins$1 = option('external_plugins');
+    const shouldBlockUnsupportedDrop = option('block_unsupported_drop');
+    const isVisualAidsEnabled = option('visual');
+    const getVisualAidsTableClass = option('visual_table_class');
+    const getVisualAidsAnchorClass = option('visual_anchor_class');
+    const getIframeAriaText = option('iframe_aria_text');
+    const getSetupCallback = option('setup');
+    const getInitInstanceCallback = option('init_instance_callback');
+    const getUrlConverterCallback = option('urlconverter_callback');
+    const getAutoFocus = option('auto_focus');
+    const shouldBrowserSpellcheck = option('browser_spellcheck');
+    const getProtect = option('protect');
+    const shouldPasteBlockDrop = option('paste_block_drop');
+    const shouldPasteDataImages = option('paste_data_images');
+    const getPastePreProcess = option('paste_preprocess');
+    const getPastePostProcess = option('paste_postprocess');
+    const getPasteWebkitStyles = option('paste_webkit_styles');
+    const shouldPasteRemoveWebKitStyles = option('paste_remove_styles_if_webkit');
+    const shouldPasteMergeFormats = option('paste_merge_formats');
+    const isSmartPasteEnabled = option('smart_paste');
+    const isPasteAsTextEnabled = option('paste_as_text');
+    const getPasteTabSpaces = option('paste_tab_spaces');
+    const shouldAllowHtmlDataUrls = option('allow_html_data_urls');
+    const getTextPatterns = option('text_patterns');
+    const getNonEditableClass = option('noneditable_class');
+    const getEditableClass = option('editable_class');
+    const getNonEditableRegExps = option('noneditable_regexp');
+    const getFontStyleValues = editor => Tools.explode(editor.options.get('font_size_style_values'));
+    const getFontSizeClasses = editor => Tools.explode(editor.options.get('font_size_classes'));
+    const isEncodingXml = editor => editor.options.get('encoding') === 'xml';
+    const getAllowedImageFileTypes = editor => Tools.explode(editor.options.get('images_file_types'));
+    const hasTableTabNavigation = option('table_tab_navigation');
+
+    const isElement$3 = isElement$6;
+    const isText$3 = isText$8;
+    const removeNode$1 = node => {
+      const parentNode = node.parentNode;
+      if (parentNode) {
+        parentNode.removeChild(node);
+      }
+    };
+    const trimCount = text => {
+      const trimmedText = trim$1(text);
+      return {
+        count: text.length - trimmedText.length,
+        text: trimmedText
+      };
+    };
+    const deleteZwspChars = caretContainer => {
+      let idx;
+      while ((idx = caretContainer.data.lastIndexOf(ZWSP$1)) !== -1) {
+        caretContainer.deleteData(idx, 1);
+      }
+    };
+    const removeUnchanged = (caretContainer, pos) => {
+      remove$4(caretContainer);
+      return pos;
+    };
+    const removeTextAndReposition = (caretContainer, pos) => {
+      const before = trimCount(caretContainer.data.substr(0, pos.offset()));
+      const after = trimCount(caretContainer.data.substr(pos.offset()));
+      const text = before.text + after.text;
+      if (text.length > 0) {
+        deleteZwspChars(caretContainer);
+        return CaretPosition(caretContainer, pos.offset() - before.count);
+      } else {
+        return pos;
+      }
+    };
+    const removeElementAndReposition = (caretContainer, pos) => {
+      const parentNode = pos.container();
+      const newPosition = indexOf$1(from(parentNode.childNodes), caretContainer).map(index => {
+        return index < pos.offset() ? CaretPosition(parentNode, pos.offset() - 1) : pos;
+      }).getOr(pos);
+      remove$4(caretContainer);
+      return newPosition;
+    };
+    const removeTextCaretContainer = (caretContainer, pos) => isText$3(caretContainer) && pos.container() === caretContainer ? removeTextAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);
+    const removeElementCaretContainer = (caretContainer, pos) => pos.container() === caretContainer.parentNode ? removeElementAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);
+    const removeAndReposition = (container, pos) => CaretPosition.isTextPosition(pos) ? removeTextCaretContainer(container, pos) : removeElementCaretContainer(container, pos);
+    const remove$4 = caretContainerNode => {
+      if (isElement$3(caretContainerNode) && isCaretContainer$2(caretContainerNode)) {
+        if (hasContent(caretContainerNode)) {
+          caretContainerNode.removeAttribute('data-mce-caret');
+        } else {
+          removeNode$1(caretContainerNode);
+        }
+      }
+      if (isText$3(caretContainerNode)) {
+        deleteZwspChars(caretContainerNode);
+        if (caretContainerNode.data.length === 0) {
+          removeNode$1(caretContainerNode);
+        }
+      }
+    };
+
+    const isContentEditableFalse$7 = isContentEditableFalse$a;
+    const isMedia$1 = isMedia$2;
+    const isTableCell$3 = isTableCell$5;
+    const inlineFakeCaretSelector = '*[contentEditable=false],video,audio,embed,object';
+    const getAbsoluteClientRect = (root, element, before) => {
+      const clientRect = collapse(element.getBoundingClientRect(), before);
+      let scrollX;
+      let scrollY;
+      if (root.tagName === 'BODY') {
+        const docElm = root.ownerDocument.documentElement;
+        scrollX = root.scrollLeft || docElm.scrollLeft;
+        scrollY = root.scrollTop || docElm.scrollTop;
+      } else {
+        const rootRect = root.getBoundingClientRect();
+        scrollX = root.scrollLeft - rootRect.left;
+        scrollY = root.scrollTop - rootRect.top;
+      }
+      clientRect.left += scrollX;
+      clientRect.right += scrollX;
+      clientRect.top += scrollY;
+      clientRect.bottom += scrollY;
+      clientRect.width = 1;
+      let margin = element.offsetWidth - element.clientWidth;
+      if (margin > 0) {
+        if (before) {
+          margin *= -1;
+        }
+        clientRect.left += margin;
+        clientRect.right += margin;
+      }
+      return clientRect;
+    };
+    const trimInlineCaretContainers = root => {
+      const fakeCaretTargetNodes = descendants(SugarElement.fromDom(root), inlineFakeCaretSelector);
+      for (let i = 0; i < fakeCaretTargetNodes.length; i++) {
+        const node = fakeCaretTargetNodes[i].dom;
+        let sibling = node.previousSibling;
+        if (endsWithCaretContainer$1(sibling)) {
+          const data = sibling.data;
+          if (data.length === 1) {
+            sibling.parentNode.removeChild(sibling);
+          } else {
+            sibling.deleteData(data.length - 1, 1);
+          }
+        }
+        sibling = node.nextSibling;
+        if (startsWithCaretContainer$1(sibling)) {
+          const data = sibling.data;
+          if (data.length === 1) {
+            sibling.parentNode.removeChild(sibling);
+          } else {
+            sibling.deleteData(0, 1);
+          }
+        }
+      }
+    };
+    const FakeCaret = (editor, root, isBlock, hasFocus) => {
+      const lastVisualCaret = value$2();
+      let cursorInterval;
+      let caretContainerNode;
+      const caretBlock = getForcedRootBlock(editor);
+      const dom = editor.dom;
+      const show = (before, element) => {
+        let rng;
+        hide();
+        if (isTableCell$3(element)) {
+          return null;
+        }
+        if (isBlock(element)) {
+          caretContainerNode = insertBlock(caretBlock, element, before);
+          const clientRect = getAbsoluteClientRect(root, element, before);
+          dom.setStyle(caretContainerNode, 'top', clientRect.top);
+          const caret = dom.create('div', {
+            'class': 'mce-visual-caret',
+            'data-mce-bogus': 'all'
+          });
+          dom.setStyles(caret, { ...clientRect });
+          dom.add(root, caret);
+          lastVisualCaret.set({
+            caret,
+            element,
+            before
+          });
+          if (before) {
+            dom.addClass(caret, 'mce-visual-caret-before');
+          }
+          startBlink();
+          rng = element.ownerDocument.createRange();
+          rng.setStart(caretContainerNode, 0);
+          rng.setEnd(caretContainerNode, 0);
+        } else {
+          caretContainerNode = insertInline$1(element, before);
+          rng = element.ownerDocument.createRange();
+          if (isInlineFakeCaretTarget(caretContainerNode.nextSibling)) {
+            rng.setStart(caretContainerNode, 0);
+            rng.setEnd(caretContainerNode, 0);
+          } else {
+            rng.setStart(caretContainerNode, 1);
+            rng.setEnd(caretContainerNode, 1);
+          }
+          return rng;
+        }
+        return rng;
+      };
+      const hide = () => {
+        trimInlineCaretContainers(root);
+        if (caretContainerNode) {
+          remove$4(caretContainerNode);
+          caretContainerNode = null;
+        }
+        lastVisualCaret.on(caretState => {
+          dom.remove(caretState.caret);
+          lastVisualCaret.clear();
+        });
+        if (cursorInterval) {
+          clearInterval(cursorInterval);
+          cursorInterval = undefined;
+        }
+      };
+      const startBlink = () => {
+        cursorInterval = setInterval(() => {
+          lastVisualCaret.on(caretState => {
+            if (hasFocus()) {
+              dom.toggleClass(caretState.caret, 'mce-visual-caret-hidden');
+            } else {
+              dom.addClass(caretState.caret, 'mce-visual-caret-hidden');
+            }
+          });
+        }, 500);
+      };
+      const reposition = () => {
+        lastVisualCaret.on(caretState => {
+          const clientRect = getAbsoluteClientRect(root, caretState.element, caretState.before);
+          dom.setStyles(caretState.caret, { ...clientRect });
+        });
+      };
+      const destroy = () => clearInterval(cursorInterval);
+      const getCss = () => '.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;' + '}';
+      return {
+        show,
+        hide,
+        getCss,
+        reposition,
+        destroy
+      };
+    };
+    const isFakeCaretTableBrowser = () => Env.browser.isFirefox();
+    const isInlineFakeCaretTarget = node => isContentEditableFalse$7(node) || isMedia$1(node);
+    const isFakeCaretTarget = node => isInlineFakeCaretTarget(node) || isTable$3(node) && isFakeCaretTableBrowser();
+
+    const isContentEditableTrue$2 = isContentEditableTrue$4;
+    const isContentEditableFalse$6 = isContentEditableFalse$a;
+    const isMedia = isMedia$2;
+    const isBlockLike = matchStyleValues('display', 'block table table-cell table-caption list-item');
+    const isCaretContainer = isCaretContainer$2;
+    const isCaretContainerBlock = isCaretContainerBlock$1;
+    const isElement$2 = isElement$6;
+    const isCaretCandidate$1 = isCaretCandidate$3;
+    const isForwards = direction => direction > 0;
+    const isBackwards = direction => direction < 0;
+    const skipCaretContainers = (walk, shallow) => {
+      let node;
+      while (node = walk(shallow)) {
+        if (!isCaretContainerBlock(node)) {
+          return node;
+        }
+      }
+      return null;
+    };
+    const findNode = (node, direction, predicateFn, rootNode, shallow) => {
+      const walker = new DomTreeWalker(node, rootNode);
+      const isCefOrCaretContainer = isContentEditableFalse$6(node) || isCaretContainerBlock(node);
+      if (isBackwards(direction)) {
+        if (isCefOrCaretContainer) {
+          node = skipCaretContainers(walker.prev.bind(walker), true);
+          if (predicateFn(node)) {
+            return node;
+          }
+        }
+        while (node = skipCaretContainers(walker.prev.bind(walker), shallow)) {
+          if (predicateFn(node)) {
+            return node;
+          }
+        }
+      }
+      if (isForwards(direction)) {
+        if (isCefOrCaretContainer) {
+          node = skipCaretContainers(walker.next.bind(walker), true);
+          if (predicateFn(node)) {
+            return node;
+          }
+        }
+        while (node = skipCaretContainers(walker.next.bind(walker), shallow)) {
+          if (predicateFn(node)) {
+            return node;
+          }
+        }
+      }
+      return null;
+    };
+    const getEditingHost = (node, rootNode) => {
+      const isCETrue = node => isContentEditableTrue$2(node.dom);
+      const isRoot = node => node.dom === rootNode;
+      return ancestor$3(SugarElement.fromDom(node), isCETrue, isRoot).map(elm => elm.dom).getOr(rootNode);
+    };
+    const getParentBlock$3 = (node, rootNode) => {
+      while (node && node !== rootNode) {
+        if (isBlockLike(node)) {
+          return node;
+        }
+        node = node.parentNode;
+      }
+      return null;
+    };
+    const isInSameBlock = (caretPosition1, caretPosition2, rootNode) => getParentBlock$3(caretPosition1.container(), rootNode) === getParentBlock$3(caretPosition2.container(), rootNode);
+    const getChildNodeAtRelativeOffset = (relativeOffset, caretPosition) => {
+      if (!caretPosition) {
+        return null;
+      }
+      const container = caretPosition.container();
+      const offset = caretPosition.offset();
+      if (!isElement$2(container)) {
+        return null;
+      }
+      return container.childNodes[offset + relativeOffset];
+    };
+    const beforeAfter = (before, node) => {
+      const range = node.ownerDocument.createRange();
+      if (before) {
+        range.setStartBefore(node);
+        range.setEndBefore(node);
+      } else {
+        range.setStartAfter(node);
+        range.setEndAfter(node);
+      }
+      return range;
+    };
+    const isNodesInSameBlock = (root, node1, node2) => getParentBlock$3(node1, root) === getParentBlock$3(node2, root);
+    const lean = (left, root, node) => {
+      const siblingName = left ? 'previousSibling' : 'nextSibling';
+      while (node && node !== root) {
+        let sibling = node[siblingName];
+        if (isCaretContainer(sibling)) {
+          sibling = sibling[siblingName];
+        }
+        if (isContentEditableFalse$6(sibling) || isMedia(sibling)) {
+          if (isNodesInSameBlock(root, sibling, node)) {
+            return sibling;
+          }
+          break;
+        }
+        if (isCaretCandidate$1(sibling)) {
+          break;
+        }
+        node = node.parentNode;
+      }
+      return null;
+    };
+    const before$2 = curry(beforeAfter, true);
+    const after$2 = curry(beforeAfter, false);
+    const normalizeRange = (direction, root, range) => {
+      let node;
+      const leanLeft = curry(lean, true, root);
+      const leanRight = curry(lean, false, root);
+      let container = range.startContainer;
+      const offset = range.startOffset;
+      if (isCaretContainerBlock$1(container)) {
+        if (!isElement$2(container)) {
+          container = container.parentNode;
+        }
+        const location = container.getAttribute('data-mce-caret');
+        if (location === 'before') {
+          node = container.nextSibling;
+          if (isFakeCaretTarget(node)) {
+            return before$2(node);
+          }
+        }
+        if (location === 'after') {
+          node = container.previousSibling;
+          if (isFakeCaretTarget(node)) {
+            return after$2(node);
+          }
+        }
+      }
+      if (!range.collapsed) {
+        return range;
+      }
+      if (isText$8(container)) {
+        if (isCaretContainer(container)) {
+          if (direction === 1) {
+            node = leanRight(container);
+            if (node) {
+              return before$2(node);
+            }
+            node = leanLeft(container);
+            if (node) {
+              return after$2(node);
+            }
+          }
+          if (direction === -1) {
+            node = leanLeft(container);
+            if (node) {
+              return after$2(node);
+            }
+            node = leanRight(container);
+            if (node) {
+              return before$2(node);
+            }
+          }
+          return range;
+        }
+        if (endsWithCaretContainer$1(container) && offset >= container.data.length - 1) {
+          if (direction === 1) {
+            node = leanRight(container);
+            if (node) {
+              return before$2(node);
+            }
+          }
+          return range;
+        }
+        if (startsWithCaretContainer$1(container) && offset <= 1) {
+          if (direction === -1) {
+            node = leanLeft(container);
+            if (node) {
+              return after$2(node);
+            }
+          }
+          return range;
+        }
+        if (offset === container.data.length) {
+          node = leanRight(container);
+          if (node) {
+            return before$2(node);
+          }
+          return range;
+        }
+        if (offset === 0) {
+          node = leanLeft(container);
+          if (node) {
+            return after$2(node);
+          }
+          return range;
+        }
+      }
+      return range;
+    };
+    const getRelativeCefElm = (forward, caretPosition) => Optional.from(getChildNodeAtRelativeOffset(forward ? 0 : -1, caretPosition)).filter(isContentEditableFalse$6);
+    const getNormalizedRangeEndPoint = (direction, root, range) => {
+      const normalizedRange = normalizeRange(direction, root, range);
+      if (direction === -1) {
+        return CaretPosition.fromRangeStart(normalizedRange);
+      }
+      return CaretPosition.fromRangeEnd(normalizedRange);
+    };
+    const getElementFromPosition = pos => Optional.from(pos.getNode()).map(SugarElement.fromDom);
+    const getElementFromPrevPosition = pos => Optional.from(pos.getNode(true)).map(SugarElement.fromDom);
+    const getVisualCaretPosition = (walkFn, caretPosition) => {
+      while (caretPosition = walkFn(caretPosition)) {
+        if (caretPosition.isVisible()) {
+          return caretPosition;
+        }
+      }
+      return caretPosition;
+    };
+    const isMoveInsideSameBlock = (from, to) => {
+      const inSameBlock = isInSameBlock(from, to);
+      if (!inSameBlock && isBr$5(from.getNode())) {
+        return true;
+      }
+      return inSameBlock;
+    };
+
+    var HDirection;
+    (function (HDirection) {
+      HDirection[HDirection['Backwards'] = -1] = 'Backwards';
+      HDirection[HDirection['Forwards'] = 1] = 'Forwards';
+    }(HDirection || (HDirection = {})));
+    const isContentEditableFalse$5 = isContentEditableFalse$a;
+    const isText$2 = isText$8;
+    const isElement$1 = isElement$6;
+    const isBr$1 = isBr$5;
+    const isCaretCandidate = isCaretCandidate$3;
+    const isAtomic = isAtomic$1;
+    const isEditableCaretCandidate = isEditableCaretCandidate$1;
+    const getParents$3 = (node, root) => {
+      const parents = [];
+      while (node && node !== root) {
+        parents.push(node);
+        node = node.parentNode;
+      }
+      return parents;
+    };
+    const nodeAtIndex = (container, offset) => {
+      if (container.hasChildNodes() && offset < container.childNodes.length) {
+        return container.childNodes[offset];
+      }
+      return null;
+    };
+    const getCaretCandidatePosition = (direction, node) => {
+      if (isForwards(direction)) {
+        if (isCaretCandidate(node.previousSibling) && !isText$2(node.previousSibling)) {
+          return CaretPosition.before(node);
+        }
+        if (isText$2(node)) {
+          return CaretPosition(node, 0);
+        }
+      }
+      if (isBackwards(direction)) {
+        if (isCaretCandidate(node.nextSibling) && !isText$2(node.nextSibling)) {
+          return CaretPosition.after(node);
+        }
+        if (isText$2(node)) {
+          return CaretPosition(node, node.data.length);
+        }
+      }
+      if (isBackwards(direction)) {
+        if (isBr$1(node)) {
+          return CaretPosition.before(node);
+        }
+        return CaretPosition.after(node);
+      }
+      return CaretPosition.before(node);
+    };
+    const moveForwardFromBr = (root, nextNode) => {
+      const nextSibling = nextNode.nextSibling;
+      if (nextSibling && isCaretCandidate(nextSibling)) {
+        if (isText$2(nextSibling)) {
+          return CaretPosition(nextSibling, 0);
+        } else {
+          return CaretPosition.before(nextSibling);
+        }
+      } else {
+        return findCaretPosition$1(HDirection.Forwards, CaretPosition.after(nextNode), root);
+      }
+    };
+    const findCaretPosition$1 = (direction, startPos, root) => {
+      let node;
+      let nextNode;
+      let innerNode;
+      let caretPosition;
+      if (!isElement$1(root) || !startPos) {
+        return null;
+      }
+      if (startPos.isEqual(CaretPosition.after(root)) && root.lastChild) {
+        caretPosition = CaretPosition.after(root.lastChild);
+        if (isBackwards(direction) && isCaretCandidate(root.lastChild) && isElement$1(root.lastChild)) {
+          return isBr$1(root.lastChild) ? CaretPosition.before(root.lastChild) : caretPosition;
+        }
+      } else {
+        caretPosition = startPos;
+      }
+      const container = caretPosition.container();
+      let offset = caretPosition.offset();
+      if (isText$2(container)) {
+        if (isBackwards(direction) && offset > 0) {
+          return CaretPosition(container, --offset);
+        }
+        if (isForwards(direction) && offset < container.length) {
+          return CaretPosition(container, ++offset);
+        }
+        node = container;
+      } else {
+        if (isBackwards(direction) && offset > 0) {
+          nextNode = nodeAtIndex(container, offset - 1);
+          if (isCaretCandidate(nextNode)) {
+            if (!isAtomic(nextNode)) {
+              innerNode = findNode(nextNode, direction, isEditableCaretCandidate, nextNode);
+              if (innerNode) {
+                if (isText$2(innerNode)) {
+                  return CaretPosition(innerNode, innerNode.data.length);
+                }
+                return CaretPosition.after(innerNode);
+              }
+            }
+            if (isText$2(nextNode)) {
+              return CaretPosition(nextNode, nextNode.data.length);
+            }
+            return CaretPosition.before(nextNode);
+          }
+        }
+        if (isForwards(direction) && offset < container.childNodes.length) {
+          nextNode = nodeAtIndex(container, offset);
+          if (isCaretCandidate(nextNode)) {
+            if (isBr$1(nextNode)) {
+              return moveForwardFromBr(root, nextNode);
+            }
+            if (!isAtomic(nextNode)) {
+              innerNode = findNode(nextNode, direction, isEditableCaretCandidate, nextNode);
+              if (innerNode) {
+                if (isText$2(innerNode)) {
+                  return CaretPosition(innerNode, 0);
+                }
+                return CaretPosition.before(innerNode);
+              }
+            }
+            if (isText$2(nextNode)) {
+              return CaretPosition(nextNode, 0);
+            }
+            return CaretPosition.after(nextNode);
+          }
+        }
+        node = nextNode ? nextNode : caretPosition.getNode();
+      }
+      if (isForwards(direction) && caretPosition.isAtEnd() || isBackwards(direction) && caretPosition.isAtStart()) {
+        node = findNode(node, direction, always, root, true);
+        if (isEditableCaretCandidate(node, root)) {
+          return getCaretCandidatePosition(direction, node);
+        }
+      }
+      nextNode = findNode(node, direction, isEditableCaretCandidate, root);
+      const rootContentEditableFalseElm = last$2(filter$6(getParents$3(container, root), isContentEditableFalse$5));
+      if (rootContentEditableFalseElm && (!nextNode || !rootContentEditableFalseElm.contains(nextNode))) {
+        if (isForwards(direction)) {
+          caretPosition = CaretPosition.after(rootContentEditableFalseElm);
+        } else {
+          caretPosition = CaretPosition.before(rootContentEditableFalseElm);
+        }
+        return caretPosition;
+      }
+      if (nextNode) {
+        return getCaretCandidatePosition(direction, nextNode);
+      }
+      return null;
+    };
+    const CaretWalker = root => ({
+      next: caretPosition => {
+        return findCaretPosition$1(HDirection.Forwards, caretPosition, root);
+      },
+      prev: caretPosition => {
+        return findCaretPosition$1(HDirection.Backwards, caretPosition, root);
+      }
+    });
+
+    const walkToPositionIn = (forward, root, start) => {
+      const position = forward ? CaretPosition.before(start) : CaretPosition.after(start);
+      return fromPosition(forward, root, position);
+    };
+    const afterElement = node => isBr$5(node) ? CaretPosition.before(node) : CaretPosition.after(node);
+    const isBeforeOrStart = position => {
+      if (CaretPosition.isTextPosition(position)) {
+        return position.offset() === 0;
+      } else {
+        return isCaretCandidate$3(position.getNode());
+      }
+    };
+    const isAfterOrEnd = position => {
+      if (CaretPosition.isTextPosition(position)) {
+        const container = position.container();
+        return position.offset() === container.data.length;
+      } else {
+        return isCaretCandidate$3(position.getNode(true));
+      }
+    };
+    const isBeforeAfterSameElement = (from, to) => !CaretPosition.isTextPosition(from) && !CaretPosition.isTextPosition(to) && from.getNode() === to.getNode(true);
+    const isAtBr = position => !CaretPosition.isTextPosition(position) && isBr$5(position.getNode());
+    const shouldSkipPosition = (forward, from, to) => {
+      if (forward) {
+        return !isBeforeAfterSameElement(from, to) && !isAtBr(from) && isAfterOrEnd(from) && isBeforeOrStart(to);
+      } else {
+        return !isBeforeAfterSameElement(to, from) && isBeforeOrStart(from) && isAfterOrEnd(to);
+      }
+    };
+    const fromPosition = (forward, root, pos) => {
+      const walker = CaretWalker(root);
+      return Optional.from(forward ? walker.next(pos) : walker.prev(pos));
+    };
+    const navigate = (forward, root, from) => fromPosition(forward, root, from).bind(to => {
+      if (isInSameBlock(from, to, root) && shouldSkipPosition(forward, from, to)) {
+        return fromPosition(forward, root, to);
+      } else {
+        return Optional.some(to);
+      }
+    });
+    const navigateIgnore = (forward, root, from, ignoreFilter) => navigate(forward, root, from).bind(pos => ignoreFilter(pos) ? navigateIgnore(forward, root, pos, ignoreFilter) : Optional.some(pos));
+    const positionIn = (forward, element) => {
+      const startNode = forward ? element.firstChild : element.lastChild;
+      if (isText$8(startNode)) {
+        return Optional.some(CaretPosition(startNode, forward ? 0 : startNode.data.length));
+      } else if (startNode) {
+        if (isCaretCandidate$3(startNode)) {
+          return Optional.some(forward ? CaretPosition.before(startNode) : afterElement(startNode));
+        } else {
+          return walkToPositionIn(forward, element, startNode);
+        }
+      } else {
+        return Optional.none();
+      }
+    };
+    const nextPosition = curry(fromPosition, true);
+    const prevPosition = curry(fromPosition, false);
+    const firstPositionIn = curry(positionIn, true);
+    const lastPositionIn = curry(positionIn, false);
+
+    const CARET_ID$1 = '_mce_caret';
+    const isCaretNode = node => isElement$6(node) && node.id === CARET_ID$1;
+    const getParentCaretContainer = (body, node) => {
+      while (node && node !== body) {
+        if (node.id === CARET_ID$1) {
+          return node;
+        }
+        node = node.parentNode;
+      }
+      return null;
+    };
+
+    const isStringPathBookmark = bookmark => isString(bookmark.start);
+    const isRangeBookmark = bookmark => has$2(bookmark, 'rng');
+    const isIdBookmark = bookmark => has$2(bookmark, 'id');
+    const isIndexBookmark = bookmark => has$2(bookmark, 'name');
+    const isPathBookmark = bookmark => Tools.isArray(bookmark.start);
+
+    const addBogus = (dom, node) => {
+      if (isElement$6(node) && dom.isBlock(node) && !node.innerHTML) {
+        node.innerHTML = '<br data-mce-bogus="1" />';
+      }
+      return node;
+    };
+    const resolveCaretPositionBookmark = (dom, bookmark) => {
+      let pos;
+      const rng = dom.createRng();
+      pos = resolve$1(dom.getRoot(), bookmark.start);
+      rng.setStart(pos.container(), pos.offset());
+      pos = resolve$1(dom.getRoot(), bookmark.end);
+      rng.setEnd(pos.container(), pos.offset());
+      return rng;
+    };
+    const insertZwsp = (node, rng) => {
+      const textNode = node.ownerDocument.createTextNode(ZWSP$1);
+      node.appendChild(textNode);
+      rng.setStart(textNode, 0);
+      rng.setEnd(textNode, 0);
+    };
+    const isEmpty$1 = node => node.hasChildNodes() === false;
+    const tryFindRangePosition = (node, rng) => lastPositionIn(node).fold(never, pos => {
+      rng.setStart(pos.container(), pos.offset());
+      rng.setEnd(pos.container(), pos.offset());
+      return true;
+    });
+    const padEmptyCaretContainer = (root, node, rng) => {
+      if (isEmpty$1(node) && getParentCaretContainer(root, node)) {
+        insertZwsp(node, rng);
+        return true;
+      } else {
+        return false;
+      }
+    };
+    const setEndPoint = (dom, start, bookmark, rng) => {
+      const point = bookmark[start ? 'start' : 'end'];
+      let i, node, offset, children;
+      const root = dom.getRoot();
+      if (point) {
+        offset = point[0];
+        for (node = root, i = point.length - 1; i >= 1; i--) {
+          children = node.childNodes;
+          if (padEmptyCaretContainer(root, node, rng)) {
+            return true;
+          }
+          if (point[i] > children.length - 1) {
+            if (padEmptyCaretContainer(root, node, rng)) {
+              return true;
+            }
+            return tryFindRangePosition(node, rng);
+          }
+          node = children[point[i]];
+        }
+        if (node.nodeType === 3) {
+          offset = Math.min(point[0], node.nodeValue.length);
+        }
+        if (node.nodeType === 1) {
+          offset = Math.min(point[0], node.childNodes.length);
+        }
+        if (start) {
+          rng.setStart(node, offset);
+        } else {
+          rng.setEnd(node, offset);
+        }
+      }
+      return true;
+    };
+    const isValidTextNode = node => isText$8(node) && node.data.length > 0;
+    const restoreEndPoint = (dom, suffix, bookmark) => {
+      let marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev;
+      const keep = bookmark.keep;
+      let container, offset;
+      if (marker) {
+        node = marker.parentNode;
+        if (suffix === 'start') {
+          if (!keep) {
+            idx = dom.nodeIndex(marker);
+          } else {
+            if (marker.hasChildNodes()) {
+              node = marker.firstChild;
+              idx = 1;
+            } else if (isValidTextNode(marker.nextSibling)) {
+              node = marker.nextSibling;
+              idx = 0;
+            } else if (isValidTextNode(marker.previousSibling)) {
+              node = marker.previousSibling;
+              idx = marker.previousSibling.data.length;
+            } else {
+              node = marker.parentNode;
+              idx = dom.nodeIndex(marker) + 1;
+            }
+          }
+          container = node;
+          offset = idx;
+        } else {
+          if (!keep) {
+            idx = dom.nodeIndex(marker);
+          } else {
+            if (marker.hasChildNodes()) {
+              node = marker.firstChild;
+              idx = 1;
+            } else if (isValidTextNode(marker.previousSibling)) {
+              node = marker.previousSibling;
+              idx = marker.previousSibling.data.length;
+            } else {
+              node = marker.parentNode;
+              idx = dom.nodeIndex(marker);
+            }
+          }
+          container = node;
+          offset = idx;
+        }
+        if (!keep) {
+          prev = marker.previousSibling;
+          next = marker.nextSibling;
+          Tools.each(Tools.grep(marker.childNodes), node => {
+            if (isText$8(node)) {
+              node.nodeValue = node.nodeValue.replace(/\uFEFF/g, '');
+            }
+          });
+          while (marker = dom.get(bookmark.id + '_' + suffix)) {
+            dom.remove(marker, true);
+          }
+          if (prev && next && prev.nodeType === next.nodeType && isText$8(prev) && !Env.browser.isOpera()) {
+            idx = prev.nodeValue.length;
+            prev.appendData(next.nodeValue);
+            dom.remove(next);
+            container = prev;
+            offset = idx;
+          }
+        }
+        return Optional.some(CaretPosition(container, offset));
+      } else {
+        return Optional.none();
+      }
+    };
+    const resolvePaths = (dom, bookmark) => {
+      const rng = dom.createRng();
+      if (setEndPoint(dom, true, bookmark, rng) && setEndPoint(dom, false, bookmark, rng)) {
+        return Optional.some(rng);
+      } else {
+        return Optional.none();
+      }
+    };
+    const resolveId = (dom, bookmark) => {
+      const startPos = restoreEndPoint(dom, 'start', bookmark);
+      const endPos = restoreEndPoint(dom, 'end', bookmark);
+      return lift2(startPos, endPos.or(startPos), (spos, epos) => {
+        const rng = dom.createRng();
+        rng.setStart(addBogus(dom, spos.container()), spos.offset());
+        rng.setEnd(addBogus(dom, epos.container()), epos.offset());
+        return rng;
+      });
+    };
+    const resolveIndex = (dom, bookmark) => Optional.from(dom.select(bookmark.name)[bookmark.index]).map(elm => {
+      const rng = dom.createRng();
+      rng.selectNode(elm);
+      return rng;
+    });
+    const resolve = (selection, bookmark) => {
+      const dom = selection.dom;
+      if (bookmark) {
+        if (isPathBookmark(bookmark)) {
+          return resolvePaths(dom, bookmark);
+        } else if (isStringPathBookmark(bookmark)) {
+          return Optional.some(resolveCaretPositionBookmark(dom, bookmark));
+        } else if (isIdBookmark(bookmark)) {
+          return resolveId(dom, bookmark);
+        } else if (isIndexBookmark(bookmark)) {
+          return resolveIndex(dom, bookmark);
+        } else if (isRangeBookmark(bookmark)) {
+          return Optional.some(bookmark.rng);
+        }
+      }
+      return Optional.none();
+    };
+
+    const getBookmark$1 = (selection, type, normalized) => {
+      return getBookmark$2(selection, type, normalized);
+    };
+    const moveToBookmark = (selection, bookmark) => {
+      resolve(selection, bookmark).each(rng => {
+        selection.setRng(rng);
+      });
+    };
+    const isBookmarkNode$1 = node => {
+      return isElement$6(node) && node.tagName === 'SPAN' && node.getAttribute('data-mce-type') === 'bookmark';
+    };
+
+    const is = expected => actual => expected === actual;
+    const isNbsp = is(nbsp);
+    const isWhiteSpace = chr => chr !== '' && ' \f\n\r\t\x0B'.indexOf(chr) !== -1;
+    const isContent = chr => !isWhiteSpace(chr) && !isNbsp(chr) && !isZwsp$1(chr);
+
+    const hexColour = value => ({ value });
+    const toHex = component => {
+      const hex = component.toString(16);
+      return (hex.length === 1 ? '0' + hex : hex).toUpperCase();
+    };
+    const fromRgba = rgbaColour => {
+      const value = toHex(rgbaColour.red) + toHex(rgbaColour.green) + toHex(rgbaColour.blue);
+      return hexColour(value);
+    };
+
+    const rgbRegex = /^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/i;
+    const rgbaRegex = /^\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?(?:\.\d+)?)\s*\)\s*$/i;
+    const rgbaColour = (red, green, blue, alpha) => ({
+      red,
+      green,
+      blue,
+      alpha
+    });
+    const fromStringValues = (red, green, blue, alpha) => {
+      const r = parseInt(red, 10);
+      const g = parseInt(green, 10);
+      const b = parseInt(blue, 10);
+      const a = parseFloat(alpha);
+      return rgbaColour(r, g, b, a);
+    };
+    const fromString = rgbaString => {
+      if (rgbaString === 'transparent') {
+        return Optional.some(rgbaColour(0, 0, 0, 0));
+      }
+      const rgbMatch = rgbRegex.exec(rgbaString);
+      if (rgbMatch !== null) {
+        return Optional.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1'));
+      }
+      const rgbaMatch = rgbaRegex.exec(rgbaString);
+      if (rgbaMatch !== null) {
+        return Optional.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4]));
+      }
+      return Optional.none();
+    };
+
+    const rgbaToHexString = color => fromString(color).map(fromRgba).map(h => '#' + h.value).getOr(color);
+
+    const isNode = node => !!node.nodeType;
+    const isInlineBlock = node => {
+      return node && /^(IMG)$/.test(node.nodeName);
+    };
+    const moveStart = (dom, selection, rng) => {
+      const offset = rng.startOffset;
+      let container = rng.startContainer;
+      if (container === rng.endContainer) {
+        if (isInlineBlock(container.childNodes[offset])) {
+          return;
+        }
+      }
+      if (isElement$6(container)) {
+        const nodes = container.childNodes;
+        let walker;
+        if (offset < nodes.length) {
+          container = nodes[offset];
+          walker = new DomTreeWalker(container, dom.getParent(container, dom.isBlock));
+        } else {
+          container = nodes[nodes.length - 1];
+          walker = new DomTreeWalker(container, dom.getParent(container, dom.isBlock));
+          walker.next(true);
+        }
+        for (let node = walker.current(); node; node = walker.next()) {
+          if (isText$8(node) && !isWhiteSpaceNode$1(node)) {
+            rng.setStart(node, 0);
+            selection.setRng(rng);
+            return;
+          }
+        }
+      }
+    };
+    const getNonWhiteSpaceSibling = (node, next, inc) => {
+      if (node) {
+        const nextName = next ? 'nextSibling' : 'previousSibling';
+        for (node = inc ? node : node[nextName]; node; node = node[nextName]) {
+          if (isElement$6(node) || !isWhiteSpaceNode$1(node)) {
+            return node;
+          }
+        }
+      }
+    };
+    const isTextBlock$1 = (editor, name) => {
+      if (isNode(name)) {
+        name = name.nodeName;
+      }
+      return !!editor.schema.getTextBlockElements()[name.toLowerCase()];
+    };
+    const isValid = (ed, parent, child) => {
+      return ed.schema.isValidChild(parent, child);
+    };
+    const isWhiteSpaceNode$1 = (node, allowSpaces = false) => {
+      if (isNonNullable(node) && isText$8(node)) {
+        const data = allowSpaces ? node.data.replace(/ /g, '\xA0') : node.data;
+        return isWhitespaceText(data);
+      } else {
+        return false;
+      }
+    };
+    const isEmptyTextNode$1 = node => {
+      return isNonNullable(node) && isText$8(node) && node.length === 0;
+    };
+    const replaceVars = (value, vars) => {
+      if (isFunction(value)) {
+        value = value(vars);
+      } else if (isNonNullable(vars)) {
+        value = value.replace(/%(\w+)/g, (str, name) => {
+          return vars[name] || str;
+        });
+      }
+      return value;
+    };
+    const isEq$5 = (str1, str2) => {
+      str1 = str1 || '';
+      str2 = str2 || '';
+      str1 = '' + (str1.nodeName || str1);
+      str2 = '' + (str2.nodeName || str2);
+      return str1.toLowerCase() === str2.toLowerCase();
+    };
+    const normalizeStyleValue = (value, name) => {
+      if (name === 'color' || name === 'backgroundColor') {
+        value = rgbaToHexString(value);
+      }
+      if (name === 'fontWeight' && value === 700) {
+        value = 'bold';
+      }
+      if (name === 'fontFamily') {
+        value = value.replace(/[\'\"]/g, '').replace(/,\s+/g, ',');
+      }
+      return '' + value;
+    };
+    const getStyle = (dom, node, name) => {
+      return normalizeStyleValue(dom.getStyle(node, name), name);
+    };
+    const getTextDecoration = (dom, node) => {
+      let decoration;
+      dom.getParent(node, n => {
+        decoration = dom.getStyle(n, 'text-decoration');
+        return decoration && decoration !== 'none';
+      });
+      return decoration;
+    };
+    const getParents$2 = (dom, node, selector) => {
+      return dom.getParents(node, selector, dom.getRoot());
+    };
+    const isVariableFormatName = (editor, formatName) => {
+      const hasVariableValues = format => {
+        const isVariableValue = val => val.length > 1 && val.charAt(0) === '%';
+        return exists([
+          'styles',
+          'attributes'
+        ], key => get$a(format, key).exists(field => {
+          const fieldValues = isArray$1(field) ? field : values(field);
+          return exists(fieldValues, isVariableValue);
+        }));
+      };
+      return exists(editor.formatter.get(formatName), hasVariableValues);
+    };
+    const areSimilarFormats = (editor, formatName, otherFormatName) => {
+      const validKeys = [
+        'inline',
+        'block',
+        'selector',
+        'attributes',
+        'styles',
+        'classes'
+      ];
+      const filterObj = format => filter$5(format, (_, key) => exists(validKeys, validKey => validKey === key));
+      return exists(editor.formatter.get(formatName), fmt1 => {
+        const filteredFmt1 = filterObj(fmt1);
+        return exists(editor.formatter.get(otherFormatName), fmt2 => {
+          const filteredFmt2 = filterObj(fmt2);
+          return equal$1(filteredFmt1, filteredFmt2);
+        });
+      });
+    };
+    const isBlockFormat = format => hasNonNullableKey(format, 'block');
+    const isSelectorFormat = format => hasNonNullableKey(format, 'selector');
+    const isInlineFormat = format => hasNonNullableKey(format, 'inline');
+    const isMixedFormat = format => isSelectorFormat(format) && isInlineFormat(format) && is$2(get$a(format, 'mixed'), true);
+    const shouldExpandToSelector = format => isSelectorFormat(format) && format.expand !== false && !isInlineFormat(format);
+
+    const isBookmarkNode = isBookmarkNode$1;
+    const getParents$1 = getParents$2;
+    const isWhiteSpaceNode = isWhiteSpaceNode$1;
+    const isTextBlock = isTextBlock$1;
+    const isBogusBr = node => {
+      return isBr$5(node) && node.getAttribute('data-mce-bogus') && !node.nextSibling;
+    };
+    const findParentContentEditable = (dom, node) => {
+      let parent = node;
+      while (parent) {
+        if (isElement$6(parent) && dom.getContentEditable(parent)) {
+          return dom.getContentEditable(parent) === 'false' ? parent : node;
+        }
+        parent = parent.parentNode;
+      }
+      return node;
+    };
+    const walkText = (start, node, offset, predicate) => {
+      const str = node.data;
+      for (let i = offset; start ? i >= 0 : i < str.length; start ? i-- : i++) {
+        if (predicate(str.charAt(i))) {
+          return start ? i + 1 : i;
+        }
+      }
+      return -1;
+    };
+    const findSpace = (start, node, offset) => walkText(start, node, offset, c => isNbsp(c) || isWhiteSpace(c));
+    const findContent = (start, node, offset) => walkText(start, node, offset, isContent);
+    const findWordEndPoint = (dom, body, container, offset, start, includeTrailingSpaces) => {
+      let lastTextNode;
+      const rootNode = dom.getParent(container, dom.isBlock) || body;
+      const walk = (container, offset, pred) => {
+        const textSeeker = TextSeeker(dom);
+        const walker = start ? textSeeker.backwards : textSeeker.forwards;
+        return Optional.from(walker(container, offset, (text, textOffset) => {
+          if (isBookmarkNode(text.parentNode)) {
+            return -1;
+          } else {
+            lastTextNode = text;
+            return pred(start, text, textOffset);
+          }
+        }, rootNode));
+      };
+      const spaceResult = walk(container, offset, findSpace);
+      return spaceResult.bind(result => includeTrailingSpaces ? walk(result.container, result.offset + (start ? -1 : 0), findContent) : Optional.some(result)).orThunk(() => lastTextNode ? Optional.some({
+        container: lastTextNode,
+        offset: start ? 0 : lastTextNode.length
+      }) : Optional.none());
+    };
+    const findSelectorEndPoint = (dom, formatList, rng, container, siblingName) => {
+      if (isText$8(container) && isEmpty$3(container.data) && container[siblingName]) {
+        container = container[siblingName];
+      }
+      const parents = getParents$1(dom, container);
+      for (let i = 0; i < parents.length; i++) {
+        for (let y = 0; y < formatList.length; y++) {
+          const curFormat = formatList[y];
+          if (isNonNullable(curFormat.collapsed) && curFormat.collapsed !== rng.collapsed) {
+            continue;
+          }
+          if (isSelectorFormat(curFormat) && dom.is(parents[i], curFormat.selector)) {
+            return parents[i];
+          }
+        }
+      }
+      return container;
+    };
+    const findBlockEndPoint = (editor, formatList, container, siblingName) => {
+      let node = container;
+      const dom = editor.dom;
+      const root = dom.getRoot();
+      const format = formatList[0];
+      if (isBlockFormat(format)) {
+        node = format.wrapper ? null : dom.getParent(container, format.block, root);
+      }
+      if (!node) {
+        const scopeRoot = dom.getParent(container, 'LI,TD,TH');
+        node = dom.getParent(isText$8(container) ? container.parentNode : container, node => node !== root && isTextBlock(editor, node), scopeRoot);
+      }
+      if (node && isBlockFormat(format) && format.wrapper) {
+        node = getParents$1(dom, node, 'ul,ol').reverse()[0] || node;
+      }
+      if (!node) {
+        node = container;
+        while (node[siblingName] && !dom.isBlock(node[siblingName])) {
+          node = node[siblingName];
+          if (isEq$5(node, 'br')) {
+            break;
+          }
+        }
+      }
+      return node || container;
+    };
+    const isAtBlockBoundary$1 = (dom, root, container, siblingName) => {
+      const parent = container.parentNode;
+      if (isNonNullable(container[siblingName])) {
+        return false;
+      } else if (parent === root || isNullable(parent) || dom.isBlock(parent)) {
+        return true;
+      } else {
+        return isAtBlockBoundary$1(dom, root, parent, siblingName);
+      }
+    };
+    const findParentContainer = (dom, formatList, container, offset, start) => {
+      let parent = container;
+      const siblingName = start ? 'previousSibling' : 'nextSibling';
+      const root = dom.getRoot();
+      if (isText$8(container) && !isWhiteSpaceNode(container)) {
+        if (start ? offset > 0 : offset < container.data.length) {
+          return container;
+        }
+      }
+      while (true) {
+        if (!formatList[0].block_expand && dom.isBlock(parent)) {
+          return parent;
+        }
+        for (let sibling = parent[siblingName]; sibling; sibling = sibling[siblingName]) {
+          const allowSpaces = isText$8(sibling) && !isAtBlockBoundary$1(dom, root, sibling, siblingName);
+          if (!isBookmarkNode(sibling) && !isBogusBr(sibling) && !isWhiteSpaceNode(sibling, allowSpaces)) {
+            return parent;
+          }
+        }
+        if (parent === root || parent.parentNode === root) {
+          container = parent;
+          break;
+        }
+        parent = parent.parentNode;
+      }
+      return container;
+    };
+    const isSelfOrParentBookmark = container => isBookmarkNode(container.parentNode) || isBookmarkNode(container);
+    const expandRng = (editor, rng, formatList, includeTrailingSpace = false) => {
+      let {startContainer, startOffset, endContainer, endOffset} = rng;
+      const dom = editor.dom;
+      const format = formatList[0];
+      if (isElement$6(startContainer) && startContainer.hasChildNodes()) {
+        startContainer = getNode$1(startContainer, startOffset);
+        if (isText$8(startContainer)) {
+          startOffset = 0;
+        }
+      }
+      if (isElement$6(endContainer) && endContainer.hasChildNodes()) {
+        endContainer = getNode$1(endContainer, rng.collapsed ? endOffset : endOffset - 1);
+        if (isText$8(endContainer)) {
+          endOffset = endContainer.nodeValue.length;
+        }
+      }
+      startContainer = findParentContentEditable(dom, startContainer);
+      endContainer = findParentContentEditable(dom, endContainer);
+      if (isSelfOrParentBookmark(startContainer)) {
+        startContainer = isBookmarkNode(startContainer) ? startContainer : startContainer.parentNode;
+        if (rng.collapsed) {
+          startContainer = startContainer.previousSibling || startContainer;
+        } else {
+          startContainer = startContainer.nextSibling || startContainer;
+        }
+        if (isText$8(startContainer)) {
+          startOffset = rng.collapsed ? startContainer.length : 0;
+        }
+      }
+      if (isSelfOrParentBookmark(endContainer)) {
+        endContainer = isBookmarkNode(endContainer) ? endContainer : endContainer.parentNode;
+        if (rng.collapsed) {
+          endContainer = endContainer.nextSibling || endContainer;
+        } else {
+          endContainer = endContainer.previousSibling || endContainer;
+        }
+        if (isText$8(endContainer)) {
+          endOffset = rng.collapsed ? 0 : endContainer.length;
+        }
+      }
+      if (rng.collapsed) {
+        const startPoint = findWordEndPoint(dom, editor.getBody(), startContainer, startOffset, true, includeTrailingSpace);
+        startPoint.each(({container, offset}) => {
+          startContainer = container;
+          startOffset = offset;
+        });
+        const endPoint = findWordEndPoint(dom, editor.getBody(), endContainer, endOffset, false, includeTrailingSpace);
+        endPoint.each(({container, offset}) => {
+          endContainer = container;
+          endOffset = offset;
+        });
+      }
+      if (isInlineFormat(format) || format.block_expand) {
+        if (!isInlineFormat(format) || (!isText$8(startContainer) || startOffset === 0)) {
+          startContainer = findParentContainer(dom, formatList, startContainer, startOffset, true);
+        }
+        if (!isInlineFormat(format) || (!isText$8(endContainer) || endOffset === endContainer.nodeValue.length)) {
+          endContainer = findParentContainer(dom, formatList, endContainer, endOffset, false);
+        }
+      }
+      if (shouldExpandToSelector(format)) {
+        startContainer = findSelectorEndPoint(dom, formatList, rng, startContainer, 'previousSibling');
+        endContainer = findSelectorEndPoint(dom, formatList, rng, endContainer, 'nextSibling');
+      }
+      if (isBlockFormat(format) || isSelectorFormat(format)) {
+        startContainer = findBlockEndPoint(editor, formatList, startContainer, 'previousSibling');
+        endContainer = findBlockEndPoint(editor, formatList, endContainer, 'nextSibling');
+        if (isBlockFormat(format)) {
+          if (!dom.isBlock(startContainer)) {
+            startContainer = findParentContainer(dom, formatList, startContainer, startOffset, true);
+          }
+          if (!dom.isBlock(endContainer)) {
+            endContainer = findParentContainer(dom, formatList, endContainer, endOffset, false);
+          }
+        }
+      }
+      if (isElement$6(startContainer)) {
+        startOffset = dom.nodeIndex(startContainer);
+        startContainer = startContainer.parentNode;
+      }
+      if (isElement$6(endContainer)) {
+        endOffset = dom.nodeIndex(endContainer) + 1;
+        endContainer = endContainer.parentNode;
+      }
+      return {
+        startContainer,
+        startOffset,
+        endContainer,
+        endOffset
+      };
+    };
+
+    const walk$3 = (dom, rng, callback) => {
+      const startOffset = rng.startOffset;
+      const startContainer = getNode$1(rng.startContainer, startOffset);
+      const endOffset = rng.endOffset;
+      const endContainer = getNode$1(rng.endContainer, endOffset - 1);
+      const exclude = nodes => {
+        const firstNode = nodes[0];
+        if (isText$8(firstNode) && firstNode === startContainer && startOffset >= firstNode.data.length) {
+          nodes.splice(0, 1);
+        }
+        const lastNode = nodes[nodes.length - 1];
+        if (endOffset === 0 && nodes.length > 0 && lastNode === endContainer && isText$8(lastNode)) {
+          nodes.splice(nodes.length - 1, 1);
+        }
+        return nodes;
+      };
+      const collectSiblings = (node, name, endNode) => {
+        const siblings = [];
+        for (; node && node !== endNode; node = node[name]) {
+          siblings.push(node);
+        }
+        return siblings;
+      };
+      const findEndPoint = (node, root) => dom.getParent(node, node => node.parentNode === root, root);
+      const walkBoundary = (startNode, endNode, next) => {
+        const siblingName = next ? 'nextSibling' : 'previousSibling';
+        for (let node = startNode, parent = node.parentNode; node && node !== endNode; node = parent) {
+          parent = node.parentNode;
+          const siblings = collectSiblings(node === startNode ? node : node[siblingName], siblingName);
+          if (siblings.length) {
+            if (!next) {
+              siblings.reverse();
+            }
+            callback(exclude(siblings));
+          }
+        }
+      };
+      if (startContainer === endContainer) {
+        return callback(exclude([startContainer]));
+      }
+      const ancestor = dom.findCommonAncestor(startContainer, endContainer);
+      if (dom.isChildOf(startContainer, endContainer)) {
+        return walkBoundary(startContainer, ancestor, true);
+      }
+      if (dom.isChildOf(endContainer, startContainer)) {
+        return walkBoundary(endContainer, ancestor);
+      }
+      const startPoint = findEndPoint(startContainer, ancestor) || startContainer;
+      const endPoint = findEndPoint(endContainer, ancestor) || endContainer;
+      walkBoundary(startContainer, startPoint, true);
+      const siblings = collectSiblings(startPoint === startContainer ? startPoint : startPoint.nextSibling, 'nextSibling', endPoint === endContainer ? endPoint.nextSibling : endPoint);
+      if (siblings.length) {
+        callback(exclude(siblings));
+      }
+      walkBoundary(endContainer, endPoint);
+    };
+
+    const getRanges$1 = selection => {
+      const ranges = [];
+      if (selection) {
+        for (let i = 0; i < selection.rangeCount; i++) {
+          ranges.push(selection.getRangeAt(i));
+        }
+      }
+      return ranges;
+    };
+    const getSelectedNodes = ranges => {
+      return bind$3(ranges, range => {
+        const node = getSelectedNode(range);
+        return node ? [SugarElement.fromDom(node)] : [];
+      });
+    };
+    const hasMultipleRanges = selection => {
+      return getRanges$1(selection).length > 1;
+    };
+
+    const getCellsFromRanges = ranges => filter$6(getSelectedNodes(ranges), isTableCell$4);
+    const getCellsFromElement = elm => descendants(elm, 'td[data-mce-selected],th[data-mce-selected]');
+    const getCellsFromElementOrRanges = (ranges, element) => {
+      const selectedCells = getCellsFromElement(element);
+      return selectedCells.length > 0 ? selectedCells : getCellsFromRanges(ranges);
+    };
+    const getCellsFromEditor = editor => getCellsFromElementOrRanges(getRanges$1(editor.selection.getSel()), SugarElement.fromDom(editor.getBody()));
+    const getClosestTable = (cell, isRoot) => ancestor$2(cell, 'table', isRoot);
+
+    const getStartNode = rng => {
+      const sc = rng.startContainer, so = rng.startOffset;
+      if (isText$8(sc)) {
+        return so === 0 ? Optional.some(SugarElement.fromDom(sc)) : Optional.none();
+      } else {
+        return Optional.from(sc.childNodes[so]).map(SugarElement.fromDom);
+      }
+    };
+    const getEndNode = rng => {
+      const ec = rng.endContainer, eo = rng.endOffset;
+      if (isText$8(ec)) {
+        return eo === ec.data.length ? Optional.some(SugarElement.fromDom(ec)) : Optional.none();
+      } else {
+        return Optional.from(ec.childNodes[eo - 1]).map(SugarElement.fromDom);
+      }
+    };
+    const getFirstChildren = node => {
+      return firstChild(node).fold(constant([node]), child => {
+        return [node].concat(getFirstChildren(child));
+      });
+    };
+    const getLastChildren$1 = node => {
+      return lastChild(node).fold(constant([node]), child => {
+        if (name(child) === 'br') {
+          return prevSibling(child).map(sibling => {
+            return [node].concat(getLastChildren$1(sibling));
+          }).getOr([]);
+        } else {
+          return [node].concat(getLastChildren$1(child));
+        }
+      });
+    };
+    const hasAllContentsSelected = (elm, rng) => {
+      return lift2(getStartNode(rng), getEndNode(rng), (startNode, endNode) => {
+        const start = find$2(getFirstChildren(elm), curry(eq, startNode));
+        const end = find$2(getLastChildren$1(elm), curry(eq, endNode));
+        return start.isSome() && end.isSome();
+      }).getOr(false);
+    };
+    const moveEndPoint = (dom, rng, node, start) => {
+      const root = node, walker = new DomTreeWalker(node, root);
+      const moveCaretBeforeOnEnterElementsMap = filter$5(dom.schema.getMoveCaretBeforeOnEnterElements(), (_, name) => !contains$2([
+        'td',
+        'th',
+        'table'
+      ], name.toLowerCase()));
+      do {
+        if (isText$8(node) && Tools.trim(node.nodeValue).length !== 0) {
+          if (start) {
+            rng.setStart(node, 0);
+          } else {
+            rng.setEnd(node, node.nodeValue.length);
+          }
+          return;
+        }
+        if (moveCaretBeforeOnEnterElementsMap[node.nodeName]) {
+          if (start) {
+            rng.setStartBefore(node);
+          } else {
+            if (node.nodeName === 'BR') {
+              rng.setEndBefore(node);
+            } else {
+              rng.setEndAfter(node);
+            }
+          }
+          return;
+        }
+      } while (node = start ? walker.next() : walker.prev());
+      if (root.nodeName === 'BODY') {
+        if (start) {
+          rng.setStart(root, 0);
+        } else {
+          rng.setEnd(root, root.childNodes.length);
+        }
+      }
+    };
+    const hasAnyRanges = editor => {
+      const sel = editor.selection.getSel();
+      return sel && sel.rangeCount > 0;
+    };
+    const runOnRanges = (editor, executor) => {
+      const fakeSelectionNodes = getCellsFromEditor(editor);
+      if (fakeSelectionNodes.length > 0) {
+        each$g(fakeSelectionNodes, elem => {
+          const node = elem.dom;
+          const fakeNodeRng = editor.dom.createRng();
+          fakeNodeRng.setStartBefore(node);
+          fakeNodeRng.setEndAfter(node);
+          executor(fakeNodeRng, true);
+        });
+      } else {
+        executor(editor.selection.getRng(), false);
+      }
+    };
+    const preserve = (selection, fillBookmark, executor) => {
+      const bookmark = getPersistentBookmark(selection, fillBookmark);
+      executor(bookmark);
+      selection.moveToBookmark(bookmark);
+    };
+
+    const NodeValue = (is, name) => {
+      const get = element => {
+        if (!is(element)) {
+          throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
+        }
+        return getOption(element).getOr('');
+      };
+      const getOption = element => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();
+      const set = (element, value) => {
+        if (!is(element)) {
+          throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
+        }
+        element.dom.nodeValue = value;
+      };
+      return {
+        get,
+        getOption,
+        set
+      };
+    };
+
+    const api$1 = NodeValue(isText$9, 'text');
+    const get$3 = element => api$1.get(element);
+    const getOption = element => api$1.getOption(element);
+
+    const isZeroWidth = elem => isText$9(elem) && get$3(elem) === ZWSP$1;
+    const context = (editor, elem, wrapName, nodeName) => parent(elem).fold(() => 'skipping', parent => {
+      if (nodeName === 'br' || isZeroWidth(elem)) {
+        return 'valid';
+      } else if (isAnnotation(elem)) {
+        return 'existing';
+      } else if (isCaretNode(elem.dom)) {
+        return 'caret';
+      } else if (!isValid(editor, wrapName, nodeName) || !isValid(editor, name(parent), wrapName)) {
+        return 'invalid-child';
+      } else {
+        return 'valid';
+      }
+    });
+
+    const applyWordGrab = (editor, rng) => {
+      const r = expandRng(editor, rng, [{ inline: 'span' }]);
+      rng.setStart(r.startContainer, r.startOffset);
+      rng.setEnd(r.endContainer, r.endOffset);
+      editor.selection.setRng(rng);
+    };
+    const makeAnnotation = (eDoc, {uid = generate$1('mce-annotation'), ...data}, annotationName, decorate) => {
+      const master = SugarElement.fromTag('span', eDoc);
+      add$2(master, annotation());
+      set$2(master, `${ dataAnnotationId() }`, uid);
+      set$2(master, `${ dataAnnotation() }`, annotationName);
+      const {attributes = {}, classes = []} = decorate(uid, data);
+      setAll$1(master, attributes);
+      add(master, classes);
+      return master;
+    };
+    const annotate = (editor, rng, annotationName, decorate, data) => {
+      const newWrappers = [];
+      const master = makeAnnotation(editor.getDoc(), data, annotationName, decorate);
+      const wrapper = value$2();
+      const finishWrapper = () => {
+        wrapper.clear();
+      };
+      const getOrOpenWrapper = () => wrapper.get().getOrThunk(() => {
+        const nu = shallow$1(master);
+        newWrappers.push(nu);
+        wrapper.set(nu);
+        return nu;
+      });
+      const processElements = elems => {
+        each$g(elems, processElement);
+      };
+      const processElement = elem => {
+        const ctx = context(editor, elem, 'span', name(elem));
+        switch (ctx) {
+        case 'invalid-child': {
+            finishWrapper();
+            const children$1 = children(elem);
+            processElements(children$1);
+            finishWrapper();
+            break;
+          }
+        case 'valid': {
+            const w = getOrOpenWrapper();
+            wrap$2(elem, w);
+            break;
+          }
+        }
+      };
+      const processNodes = nodes => {
+        const elems = map$3(nodes, SugarElement.fromDom);
+        processElements(elems);
+      };
+      walk$3(editor.dom, rng, nodes => {
+        finishWrapper();
+        processNodes(nodes);
+      });
+      return newWrappers;
+    };
+    const annotateWithBookmark = (editor, name, settings, data) => {
+      editor.undoManager.transact(() => {
+        const selection = editor.selection;
+        const initialRng = selection.getRng();
+        const hasFakeSelection = getCellsFromEditor(editor).length > 0;
+        if (initialRng.collapsed && !hasFakeSelection) {
+          applyWordGrab(editor, initialRng);
+        }
+        if (selection.getRng().collapsed && !hasFakeSelection) {
+          const wrapper = makeAnnotation(editor.getDoc(), data, name, settings.decorate);
+          set(wrapper, nbsp);
+          selection.getRng().insertNode(wrapper.dom);
+          selection.select(wrapper.dom);
+        } else {
+          preserve(selection, false, () => {
+            runOnRanges(editor, selectionRng => {
+              annotate(editor, selectionRng, name, settings.decorate, data);
+            });
+          });
+        }
+      });
+    };
+
+    const Annotator = editor => {
+      const registry = create$b();
+      setup$w(editor, registry);
+      const changes = setup$x(editor, registry);
+      return {
+        register: (name, settings) => {
+          registry.register(name, settings);
+        },
+        annotate: (name, data) => {
+          registry.lookup(name).each(settings => {
+            annotateWithBookmark(editor, name, settings, data);
+          });
+        },
+        annotationChanged: (name, callback) => {
+          changes.addListener(name, callback);
+        },
+        remove: name => {
+          const bookmark = editor.selection.getBookmark();
+          identify(editor, Optional.some(name)).each(({elements}) => {
+            each$g(elements, unwrap);
+          });
+          editor.selection.moveToBookmark(bookmark);
+        },
+        removeAll: name => {
+          const bookmark = editor.selection.getBookmark();
+          each$f(findAll(editor, name), (spans, _) => each$g(spans, unwrap));
+          editor.selection.moveToBookmark(bookmark);
+        },
+        getAll: name => {
+          const directory = findAll(editor, name);
+          return map$2(directory, elems => map$3(elems, elem => elem.dom));
+        }
+      };
+    };
+
+    const BookmarkManager = selection => {
+      return {
+        getBookmark: curry(getBookmark$1, selection),
+        moveToBookmark: curry(moveToBookmark, selection)
+      };
+    };
+    BookmarkManager.isBookmarkNode = isBookmarkNode$1;
+
+    const isXYWithinRange = (clientX, clientY, range) => {
+      if (range.collapsed) {
+        return false;
+      } else {
+        return exists(range.getClientRects(), rect => containsXY(rect, clientX, clientY));
+      }
+    };
+
+    const firePreProcess = (editor, args) => editor.dispatch('PreProcess', args);
+    const firePostProcess = (editor, args) => editor.dispatch('PostProcess', args);
+    const fireRemove = editor => editor.dispatch('remove');
+    const fireDetach = editor => editor.dispatch('detach');
+    const fireSwitchMode = (editor, mode) => editor.dispatch('SwitchMode', { mode });
+    const fireObjectResizeStart = (editor, target, width, height, origin) => {
+      editor.dispatch('ObjectResizeStart', {
+        target,
+        width,
+        height,
+        origin
+      });
+    };
+    const fireObjectResized = (editor, target, width, height, origin) => {
+      editor.dispatch('ObjectResized', {
+        target,
+        width,
+        height,
+        origin
+      });
+    };
+    const firePreInit = editor => editor.dispatch('PreInit');
+    const firePostRender = editor => editor.dispatch('PostRender');
+    const fireInit = editor => editor.dispatch('Init');
+    const firePlaceholderToggle = (editor, state) => editor.dispatch('PlaceholderToggle', { state });
+    const fireError = (editor, errorType, error) => editor.dispatch(errorType, error);
+    const fireFormatApply = (editor, format, node, vars) => editor.dispatch('FormatApply', {
+      format,
+      node,
+      vars
+    });
+    const fireFormatRemove = (editor, format, node, vars) => editor.dispatch('FormatRemove', {
+      format,
+      node,
+      vars
+    });
+    const fireBeforeSetContent = (editor, args) => editor.dispatch('BeforeSetContent', args);
+    const fireSetContent = (editor, args) => editor.dispatch('SetContent', args);
+    const fireBeforeGetContent = (editor, args) => editor.dispatch('BeforeGetContent', args);
+    const fireGetContent = (editor, args) => editor.dispatch('GetContent', args);
+    const fireAutocompleterStart = (editor, args) => editor.dispatch('AutocompleterStart', args);
+    const fireAutocompleterUpdate = (editor, args) => editor.dispatch('AutocompleterUpdate', args);
+    const fireAutocompleterEnd = editor => editor.dispatch('AutocompleterEnd');
+    const firePastePreProcess = (editor, html, internal) => editor.dispatch('PastePreProcess', {
+      content: html,
+      internal
+    });
+    const firePastePostProcess = (editor, node, internal) => editor.dispatch('PastePostProcess', {
+      node,
+      internal
+    });
+    const firePastePlainTextToggle = (editor, state) => editor.dispatch('PastePlainTextToggle', { state });
+
+    const VK = {
+      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: e => {
+        return e.shiftKey || e.ctrlKey || e.altKey || VK.metaKeyPressed(e);
+      },
+      metaKeyPressed: e => {
+        return Env.os.isMacOS() || Env.os.isiOS() ? e.metaKey : e.ctrlKey && !e.altKey;
+      }
+    };
+
+    const ControlSelection = (selection, editor) => {
+      const elementSelectionAttr = 'data-mce-selected';
+      const dom = editor.dom, each = Tools.each;
+      let selectedElm, selectedElmGhost, resizeHelper, selectedHandle, resizeBackdrop;
+      let startX, startY, selectedElmX, selectedElmY, startW, startH, ratio, resizeStarted;
+      let width, height;
+      const editableDoc = editor.getDoc(), rootDocument = document;
+      const abs = Math.abs, round = Math.round, rootElement = editor.getBody();
+      let startScrollWidth, startScrollHeight;
+      const resizeHandles = {
+        nw: [
+          0,
+          0,
+          -1,
+          -1
+        ],
+        ne: [
+          1,
+          0,
+          1,
+          -1
+        ],
+        se: [
+          1,
+          1,
+          1,
+          1
+        ],
+        sw: [
+          0,
+          1,
+          -1,
+          1
+        ]
+      };
+      const isImage = elm => isNonNullable(elm) && (isImg(elm) || editor.dom.is(elm, 'figure.image'));
+      const isMedia = elm => isMedia$2(elm) || dom.hasClass(elm, 'mce-preview-object');
+      const isEventOnImageOutsideRange = (evt, range) => {
+        if (evt.type === 'longpress' || evt.type.indexOf('touch') === 0) {
+          const touch = evt.touches[0];
+          return isImage(evt.target) && !isXYWithinRange(touch.clientX, touch.clientY, range);
+        } else {
+          return isImage(evt.target) && !isXYWithinRange(evt.clientX, evt.clientY, range);
+        }
+      };
+      const contextMenuSelectImage = evt => {
+        const target = evt.target;
+        if (isEventOnImageOutsideRange(evt, editor.selection.getRng()) && !evt.isDefaultPrevented()) {
+          editor.selection.select(target);
+        }
+      };
+      const getResizeTargets = elm => {
+        if (dom.is(elm, 'figure.image')) {
+          return [elm.querySelector('img')];
+        } else if (dom.hasClass(elm, 'mce-preview-object') && isNonNullable(elm.firstElementChild)) {
+          return [
+            elm,
+            elm.firstElementChild
+          ];
+        } else {
+          return [elm];
+        }
+      };
+      const isResizable = elm => {
+        const selector = getObjectResizing(editor);
+        if (!selector) {
+          return false;
+        }
+        if (elm.getAttribute('data-mce-resize') === 'false') {
+          return false;
+        }
+        if (elm === editor.getBody()) {
+          return false;
+        }
+        if (dom.hasClass(elm, 'mce-preview-object')) {
+          return is$1(SugarElement.fromDom(elm.firstElementChild), selector);
+        } else {
+          return is$1(SugarElement.fromDom(elm), selector);
+        }
+      };
+      const createGhostElement = elm => {
+        if (isMedia(elm)) {
+          return dom.create('img', { src: Env.transparentSrc });
+        } else {
+          return elm.cloneNode(true);
+        }
+      };
+      const setSizeProp = (element, name, value) => {
+        if (isNonNullable(value)) {
+          const targets = getResizeTargets(element);
+          each$g(targets, target => {
+            if (target.style[name] || !editor.schema.isValid(target.nodeName.toLowerCase(), name)) {
+              dom.setStyle(target, name, value);
+            } else {
+              dom.setAttrib(target, name, '' + value);
+            }
+          });
+        }
+      };
+      const setGhostElmSize = (ghostElm, width, height) => {
+        setSizeProp(ghostElm, 'width', width);
+        setSizeProp(ghostElm, 'height', height);
+      };
+      const resizeGhostElement = e => {
+        let deltaX, deltaY, proportional;
+        let resizeHelperX, resizeHelperY;
+        deltaX = e.screenX - startX;
+        deltaY = e.screenY - startY;
+        width = deltaX * selectedHandle[2] + startW;
+        height = deltaY * selectedHandle[3] + startH;
+        width = width < 5 ? 5 : width;
+        height = height < 5 ? 5 : height;
+        if ((isImage(selectedElm) || isMedia(selectedElm)) && getResizeImgProportional(editor) !== false) {
+          proportional = !VK.modifierPressed(e);
+        } else {
+          proportional = VK.modifierPressed(e);
+        }
+        if (proportional) {
+          if (abs(deltaX) > abs(deltaY)) {
+            height = round(width * ratio);
+            width = round(height / ratio);
+          } else {
+            width = round(height / ratio);
+            height = round(width * ratio);
+          }
+        }
+        setGhostElmSize(selectedElmGhost, width, height);
+        resizeHelperX = selectedHandle.startPos.x + deltaX;
+        resizeHelperY = selectedHandle.startPos.y + deltaY;
+        resizeHelperX = resizeHelperX > 0 ? resizeHelperX : 0;
+        resizeHelperY = resizeHelperY > 0 ? resizeHelperY : 0;
+        dom.setStyles(resizeHelper, {
+          left: resizeHelperX,
+          top: resizeHelperY,
+          display: 'block'
+        });
+        resizeHelper.innerHTML = width + ' &times; ' + height;
+        if (selectedHandle[2] < 0 && selectedElmGhost.clientWidth <= width) {
+          dom.setStyle(selectedElmGhost, 'left', selectedElmX + (startW - width));
+        }
+        if (selectedHandle[3] < 0 && selectedElmGhost.clientHeight <= height) {
+          dom.setStyle(selectedElmGhost, 'top', selectedElmY + (startH - height));
+        }
+        deltaX = rootElement.scrollWidth - startScrollWidth;
+        deltaY = rootElement.scrollHeight - startScrollHeight;
+        if (deltaX + deltaY !== 0) {
+          dom.setStyles(resizeHelper, {
+            left: resizeHelperX - deltaX,
+            top: resizeHelperY - deltaY
+          });
+        }
+        if (!resizeStarted) {
+          fireObjectResizeStart(editor, selectedElm, startW, startH, 'corner-' + selectedHandle.name);
+          resizeStarted = true;
+        }
+      };
+      const endGhostResize = () => {
+        const wasResizeStarted = resizeStarted;
+        resizeStarted = false;
+        if (wasResizeStarted) {
+          setSizeProp(selectedElm, 'width', width);
+          setSizeProp(selectedElm, 'height', height);
+        }
+        dom.unbind(editableDoc, 'mousemove', resizeGhostElement);
+        dom.unbind(editableDoc, 'mouseup', endGhostResize);
+        if (rootDocument !== editableDoc) {
+          dom.unbind(rootDocument, 'mousemove', resizeGhostElement);
+          dom.unbind(rootDocument, 'mouseup', endGhostResize);
+        }
+        dom.remove(selectedElmGhost);
+        dom.remove(resizeHelper);
+        dom.remove(resizeBackdrop);
+        showResizeRect(selectedElm);
+        if (wasResizeStarted) {
+          fireObjectResized(editor, selectedElm, width, height, 'corner-' + selectedHandle.name);
+          dom.setAttrib(selectedElm, 'style', dom.getAttrib(selectedElm, 'style'));
+        }
+        editor.nodeChanged();
+      };
+      const showResizeRect = targetElm => {
+        unbindResizeHandleEvents();
+        const position = dom.getPos(targetElm, rootElement);
+        const selectedElmX = position.x;
+        const selectedElmY = position.y;
+        const rect = targetElm.getBoundingClientRect();
+        const targetWidth = rect.width || rect.right - rect.left;
+        const targetHeight = rect.height || rect.bottom - rect.top;
+        if (selectedElm !== targetElm) {
+          hideResizeRect();
+          selectedElm = targetElm;
+          width = height = 0;
+        }
+        const e = editor.dispatch('ObjectSelected', { target: targetElm });
+        const selectedValue = dom.getAttrib(selectedElm, elementSelectionAttr, '1');
+        if (isResizable(targetElm) && !e.isDefaultPrevented()) {
+          each(resizeHandles, (handle, name) => {
+            let handleElm;
+            const startDrag = e => {
+              const target = getResizeTargets(selectedElm)[0];
+              startX = e.screenX;
+              startY = e.screenY;
+              startW = target.clientWidth;
+              startH = target.clientHeight;
+              ratio = startH / startW;
+              selectedHandle = handle;
+              selectedHandle.name = name;
+              selectedHandle.startPos = {
+                x: targetWidth * handle[0] + selectedElmX,
+                y: targetHeight * handle[1] + selectedElmY
+              };
+              startScrollWidth = rootElement.scrollWidth;
+              startScrollHeight = rootElement.scrollHeight;
+              resizeBackdrop = dom.add(rootElement, 'div', {
+                'class': 'mce-resize-backdrop',
+                'data-mce-bogus': 'all'
+              });
+              dom.setStyles(resizeBackdrop, {
+                position: 'fixed',
+                left: '0',
+                top: '0',
+                width: '100%',
+                height: '100%'
+              });
+              selectedElmGhost = createGhostElement(selectedElm);
+              dom.addClass(selectedElmGhost, 'mce-clonedresizable');
+              dom.setAttrib(selectedElmGhost, 'data-mce-bogus', 'all');
+              selectedElmGhost.contentEditable = 'false';
+              dom.setStyles(selectedElmGhost, {
+                left: selectedElmX,
+                top: selectedElmY,
+                margin: 0
+              });
+              setGhostElmSize(selectedElmGhost, targetWidth, targetHeight);
+              selectedElmGhost.removeAttribute(elementSelectionAttr);
+              rootElement.appendChild(selectedElmGhost);
+              dom.bind(editableDoc, 'mousemove', resizeGhostElement);
+              dom.bind(editableDoc, 'mouseup', endGhostResize);
+              if (rootDocument !== editableDoc) {
+                dom.bind(rootDocument, 'mousemove', resizeGhostElement);
+                dom.bind(rootDocument, 'mouseup', endGhostResize);
+              }
+              resizeHelper = dom.add(rootElement, 'div', {
+                'class': 'mce-resize-helper',
+                'data-mce-bogus': 'all'
+              }, startW + ' &times; ' + startH);
+            };
+            handleElm = dom.get('mceResizeHandle' + name);
+            if (handleElm) {
+              dom.remove(handleElm);
+            }
+            handleElm = dom.add(rootElement, 'div', {
+              'id': 'mceResizeHandle' + name,
+              'data-mce-bogus': 'all',
+              'class': 'mce-resizehandle',
+              'unselectable': true,
+              'style': 'cursor:' + name + '-resize; margin:0; padding:0'
+            });
+            dom.bind(handleElm, 'mousedown', e => {
+              e.stopImmediatePropagation();
+              e.preventDefault();
+              startDrag(e);
+            });
+            handle.elm = handleElm;
+            dom.setStyles(handleElm, {
+              left: targetWidth * handle[0] + selectedElmX - handleElm.offsetWidth / 2,
+              top: targetHeight * handle[1] + selectedElmY - handleElm.offsetHeight / 2
+            });
+          });
+        } else {
+          hideResizeRect();
+        }
+        if (!dom.getAttrib(selectedElm, elementSelectionAttr)) {
+          selectedElm.setAttribute(elementSelectionAttr, selectedValue);
+        }
+      };
+      const hideResizeRect = () => {
+        unbindResizeHandleEvents();
+        if (selectedElm) {
+          selectedElm.removeAttribute(elementSelectionAttr);
+        }
+        each$f(resizeHandles, (value, name) => {
+          const handleElm = dom.get('mceResizeHandle' + name);
+          if (handleElm) {
+            dom.unbind(handleElm);
+            dom.remove(handleElm);
+          }
+        });
+      };
+      const updateResizeRect = e => {
+        var _a;
+        let startElm, controlElm;
+        const isChildOrEqual = (node, parent) => {
+          if (node) {
+            do {
+              if (node === parent) {
+                return true;
+              }
+            } while (node = node.parentNode);
+          }
+        };
+        if (resizeStarted || editor.removed) {
+          return;
+        }
+        each(dom.select('img[data-mce-selected],hr[data-mce-selected]'), img => {
+          img.removeAttribute(elementSelectionAttr);
+        });
+        controlElm = e.type === 'mousedown' ? e.target : selection.getNode();
+        controlElm = (_a = closest$3(SugarElement.fromDom(controlElm), 'table,img,figure.image,hr,video,span.mce-preview-object').getOrUndefined()) === null || _a === void 0 ? void 0 : _a.dom;
+        if (isChildOrEqual(controlElm, rootElement)) {
+          disableGeckoResize();
+          startElm = selection.getStart(true);
+          if (isChildOrEqual(startElm, controlElm) && isChildOrEqual(selection.getEnd(true), controlElm)) {
+            showResizeRect(controlElm);
+            return;
+          }
+        }
+        hideResizeRect();
+      };
+      const unbindResizeHandleEvents = () => {
+        each$f(resizeHandles, handle => {
+          if (handle.elm) {
+            dom.unbind(handle.elm);
+            delete handle.elm;
+          }
+        });
+      };
+      const disableGeckoResize = () => {
+        try {
+          editor.getDoc().execCommand('enableObjectResizing', false, 'false');
+        } catch (ex) {
+        }
+      };
+      editor.on('init', () => {
+        disableGeckoResize();
+        const throttledUpdateResizeRect = first$1(e => {
+          if (!editor.composing) {
+            updateResizeRect(e);
+          }
+        }, 0);
+        editor.on('nodechange ResizeEditor ResizeWindow ResizeContent drop FullscreenStateChanged', throttledUpdateResizeRect.throttle);
+        editor.on('keyup compositionend', e => {
+          if (selectedElm && selectedElm.nodeName === 'TABLE') {
+            throttledUpdateResizeRect.throttle(e);
+          }
+        });
+        editor.on('hide blur', hideResizeRect);
+        editor.on('contextmenu longpress', contextMenuSelectImage, true);
+      });
+      editor.on('remove', unbindResizeHandleEvents);
+      const destroy = () => {
+        selectedElm = selectedElmGhost = resizeBackdrop = null;
+      };
+      return {
+        isResizable,
+        showResizeRect,
+        hideResizeRect,
+        updateResizeRect,
+        destroy
+      };
+    };
+
+    const setStart = (rng, situ) => {
+      situ.fold(e => {
+        rng.setStartBefore(e.dom);
+      }, (e, o) => {
+        rng.setStart(e.dom, o);
+      }, e => {
+        rng.setStartAfter(e.dom);
+      });
+    };
+    const setFinish = (rng, situ) => {
+      situ.fold(e => {
+        rng.setEndBefore(e.dom);
+      }, (e, o) => {
+        rng.setEnd(e.dom, o);
+      }, e => {
+        rng.setEndAfter(e.dom);
+      });
+    };
+    const relativeToNative = (win, startSitu, finishSitu) => {
+      const range = win.document.createRange();
+      setStart(range, startSitu);
+      setFinish(range, finishSitu);
+      return range;
+    };
+    const exactToNative = (win, start, soffset, finish, foffset) => {
+      const rng = win.document.createRange();
+      rng.setStart(start.dom, soffset);
+      rng.setEnd(finish.dom, foffset);
+      return rng;
+    };
+
+    const adt$3 = Adt.generate([
+      {
+        ltr: [
+          'start',
+          'soffset',
+          'finish',
+          'foffset'
+        ]
+      },
+      {
+        rtl: [
+          'start',
+          'soffset',
+          'finish',
+          'foffset'
+        ]
+      }
+    ]);
+    const fromRange = (win, type, range) => type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);
+    const getRanges = (win, selection) => selection.match({
+      domRange: rng => {
+        return {
+          ltr: constant(rng),
+          rtl: Optional.none
+        };
+      },
+      relative: (startSitu, finishSitu) => {
+        return {
+          ltr: cached(() => relativeToNative(win, startSitu, finishSitu)),
+          rtl: cached(() => Optional.some(relativeToNative(win, finishSitu, startSitu)))
+        };
+      },
+      exact: (start, soffset, finish, foffset) => {
+        return {
+          ltr: cached(() => exactToNative(win, start, soffset, finish, foffset)),
+          rtl: cached(() => Optional.some(exactToNative(win, finish, foffset, start, soffset)))
+        };
+      }
+    });
+    const doDiagnose = (win, ranges) => {
+      const rng = ranges.ltr();
+      if (rng.collapsed) {
+        const reversed = ranges.rtl().filter(rev => rev.collapsed === false);
+        return reversed.map(rev => adt$3.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset)).getOrThunk(() => fromRange(win, adt$3.ltr, rng));
+      } else {
+        return fromRange(win, adt$3.ltr, rng);
+      }
+    };
+    const diagnose = (win, selection) => {
+      const ranges = getRanges(win, selection);
+      return doDiagnose(win, ranges);
+    };
+    adt$3.ltr;
+    adt$3.rtl;
+
+    const create$9 = (start, soffset, finish, foffset) => ({
+      start,
+      soffset,
+      finish,
+      foffset
+    });
+    const SimRange = { create: create$9 };
+
+    const caretPositionFromPoint = (doc, x, y) => {
+      var _a, _b;
+      return Optional.from((_b = (_a = doc.dom).caretPositionFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y)).bind(pos => {
+        if (pos.offsetNode === null) {
+          return Optional.none();
+        }
+        const r = doc.dom.createRange();
+        r.setStart(pos.offsetNode, pos.offset);
+        r.collapse();
+        return Optional.some(r);
+      });
+    };
+    const caretRangeFromPoint = (doc, x, y) => {
+      var _a, _b;
+      return Optional.from((_b = (_a = doc.dom).caretRangeFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y));
+    };
+    const availableSearch = (() => {
+      if (document.caretPositionFromPoint) {
+        return caretPositionFromPoint;
+      } else if (document.caretRangeFromPoint) {
+        return caretRangeFromPoint;
+      } else {
+        return Optional.none;
+      }
+    })();
+    const fromPoint$1 = (win, x, y) => {
+      const doc = SugarElement.fromDom(win.document);
+      return availableSearch(doc, x, y).map(rng => SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset));
+    };
+
+    const adt$2 = Adt.generate([
+      { before: ['element'] },
+      {
+        on: [
+          'element',
+          'offset'
+        ]
+      },
+      { after: ['element'] }
+    ]);
+    const cata = (subject, onBefore, onOn, onAfter) => subject.fold(onBefore, onOn, onAfter);
+    const getStart$2 = situ => situ.fold(identity, identity, identity);
+    const before$1 = adt$2.before;
+    const on = adt$2.on;
+    const after$1 = adt$2.after;
+    const Situ = {
+      before: before$1,
+      on,
+      after: after$1,
+      cata,
+      getStart: getStart$2
+    };
+
+    const adt$1 = Adt.generate([
+      { domRange: ['rng'] },
+      {
+        relative: [
+          'startSitu',
+          'finishSitu'
+        ]
+      },
+      {
+        exact: [
+          'start',
+          'soffset',
+          'finish',
+          'foffset'
+        ]
+      }
+    ]);
+    const exactFromRange = simRange => adt$1.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);
+    const getStart$1 = selection => selection.match({
+      domRange: rng => SugarElement.fromDom(rng.startContainer),
+      relative: (startSitu, _finishSitu) => Situ.getStart(startSitu),
+      exact: (start, _soffset, _finish, _foffset) => start
+    });
+    const domRange = adt$1.domRange;
+    const relative = adt$1.relative;
+    const exact = adt$1.exact;
+    const getWin = selection => {
+      const start = getStart$1(selection);
+      return defaultView(start);
+    };
+    const range = SimRange.create;
+    const SimSelection = {
+      domRange,
+      relative,
+      exact,
+      exactFromRange,
+      getWin,
+      range
+    };
+
+    const beforeSpecial = (element, offset) => {
+      const name$1 = name(element);
+      if ('input' === name$1) {
+        return Situ.after(element);
+      } else if (!contains$2([
+          'br',
+          'img'
+        ], name$1)) {
+        return Situ.on(element, offset);
+      } else {
+        return offset === 0 ? Situ.before(element) : Situ.after(element);
+      }
+    };
+    const preprocessRelative = (startSitu, finishSitu) => {
+      const start = startSitu.fold(Situ.before, beforeSpecial, Situ.after);
+      const finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after);
+      return SimSelection.relative(start, finish);
+    };
+    const preprocessExact = (start, soffset, finish, foffset) => {
+      const startSitu = beforeSpecial(start, soffset);
+      const finishSitu = beforeSpecial(finish, foffset);
+      return SimSelection.relative(startSitu, finishSitu);
+    };
+    const preprocess = selection => selection.match({
+      domRange: rng => {
+        const start = SugarElement.fromDom(rng.startContainer);
+        const finish = SugarElement.fromDom(rng.endContainer);
+        return preprocessExact(start, rng.startOffset, finish, rng.endOffset);
+      },
+      relative: preprocessRelative,
+      exact: preprocessExact
+    });
+
+    const fromElements = (elements, scope) => {
+      const doc = scope || document;
+      const fragment = doc.createDocumentFragment();
+      each$g(elements, element => {
+        fragment.appendChild(element.dom);
+      });
+      return SugarElement.fromDom(fragment);
+    };
+
+    const toNative = selection => {
+      const win = SimSelection.getWin(selection).dom;
+      const getDomRange = (start, soffset, finish, foffset) => exactToNative(win, start, soffset, finish, foffset);
+      const filtered = preprocess(selection);
+      return diagnose(win, filtered).match({
+        ltr: getDomRange,
+        rtl: getDomRange
+      });
+    };
+    const getAtPoint = (win, x, y) => fromPoint$1(win, x, y);
+
+    const fromPoint = (clientX, clientY, doc) => getAtPoint(doc.defaultView, clientX, clientY).map(simRange => {
+      const rng = doc.createRange();
+      rng.setStart(simRange.start.dom, simRange.soffset);
+      rng.setEnd(simRange.finish.dom, simRange.foffset);
+      return rng;
+    }).getOrUndefined();
+
+    const isEq$4 = (rng1, rng2) => {
+      return rng1 && rng2 && (rng1.startContainer === rng2.startContainer && rng1.startOffset === rng2.startOffset) && (rng1.endContainer === rng2.endContainer && rng1.endOffset === rng2.endOffset);
+    };
+
+    const findParent = (node, rootNode, predicate) => {
+      while (node && node !== rootNode) {
+        if (predicate(node)) {
+          return node;
+        }
+        node = node.parentNode;
+      }
+      return null;
+    };
+    const hasParent$1 = (node, rootNode, predicate) => findParent(node, rootNode, predicate) !== null;
+    const hasParentWithName = (node, rootNode, name) => hasParent$1(node, rootNode, node => {
+      return node.nodeName === name;
+    });
+    const isTable = node => node && node.nodeName === 'TABLE';
+    const isTableCell$2 = node => node && /^(TD|TH|CAPTION)$/.test(node.nodeName);
+    const isCeFalseCaretContainer = (node, rootNode) => isCaretContainer$2(node) && hasParent$1(node, rootNode, isCaretNode) === false;
+    const hasBrBeforeAfter = (dom, node, left) => {
+      const walker = new DomTreeWalker(node, dom.getParent(node.parentNode, dom.isBlock) || dom.getRoot());
+      while (node = walker[left ? 'prev' : 'next']()) {
+        if (isBr$5(node)) {
+          return true;
+        }
+      }
+    };
+    const isPrevNode = (node, name) => node.previousSibling && node.previousSibling.nodeName === name;
+    const hasContentEditableFalseParent = (body, node) => {
+      while (node && node !== body) {
+        if (isContentEditableFalse$a(node)) {
+          return true;
+        }
+        node = node.parentNode;
+      }
+      return false;
+    };
+    const findTextNodeRelative = (dom, isAfterNode, collapsed, left, startNode) => {
+      let lastInlineElement;
+      const body = dom.getRoot();
+      let node;
+      const nonEmptyElementsMap = dom.schema.getNonEmptyElements();
+      const parentBlockContainer = dom.getParent(startNode.parentNode, dom.isBlock) || body;
+      if (left && isBr$5(startNode) && isAfterNode && dom.isEmpty(parentBlockContainer)) {
+        return Optional.some(CaretPosition(startNode.parentNode, dom.nodeIndex(startNode)));
+      }
+      const walker = new DomTreeWalker(startNode, parentBlockContainer);
+      while (node = walker[left ? 'prev' : 'next']()) {
+        if (dom.getContentEditableParent(node) === 'false' || isCeFalseCaretContainer(node, body)) {
+          return Optional.none();
+        }
+        if (isText$8(node) && node.nodeValue.length > 0) {
+          if (hasParentWithName(node, body, 'A') === false) {
+            return Optional.some(CaretPosition(node, left ? node.nodeValue.length : 0));
+          }
+          return Optional.none();
+        }
+        if (dom.isBlock(node) || nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
+          return Optional.none();
+        }
+        lastInlineElement = node;
+      }
+      if (collapsed && lastInlineElement) {
+        return Optional.some(CaretPosition(lastInlineElement, 0));
+      }
+      return Optional.none();
+    };
+    const normalizeEndPoint = (dom, collapsed, start, rng) => {
+      let container, offset;
+      const body = dom.getRoot();
+      let node;
+      let directionLeft, normalized = false;
+      container = rng[(start ? 'start' : 'end') + 'Container'];
+      offset = rng[(start ? 'start' : 'end') + 'Offset'];
+      const isAfterNode = isElement$6(container) && offset === container.childNodes.length;
+      const nonEmptyElementsMap = dom.schema.getNonEmptyElements();
+      directionLeft = start;
+      if (isCaretContainer$2(container)) {
+        return Optional.none();
+      }
+      if (isElement$6(container) && offset > container.childNodes.length - 1) {
+        directionLeft = false;
+      }
+      if (isDocument$1(container)) {
+        container = body;
+        offset = 0;
+      }
+      if (container === body) {
+        if (directionLeft) {
+          node = container.childNodes[offset > 0 ? offset - 1 : 0];
+          if (node) {
+            if (isCaretContainer$2(node)) {
+              return Optional.none();
+            }
+            if (nonEmptyElementsMap[node.nodeName] || isTable(node)) {
+              return Optional.none();
+            }
+          }
+        }
+        if (container.hasChildNodes()) {
+          offset = Math.min(!directionLeft && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1);
+          container = container.childNodes[offset];
+          offset = isText$8(container) && isAfterNode ? container.data.length : 0;
+          if (!collapsed && container === body.lastChild && isTable(container)) {
+            return Optional.none();
+          }
+          if (hasContentEditableFalseParent(body, container) || isCaretContainer$2(container)) {
+            return Optional.none();
+          }
+          if (container.hasChildNodes() && isTable(container) === false) {
+            node = container;
+            const walker = new DomTreeWalker(container, body);
+            do {
+              if (isContentEditableFalse$a(node) || isCaretContainer$2(node)) {
+                normalized = false;
+                break;
+              }
+              if (isText$8(node) && node.nodeValue.length > 0) {
+                offset = directionLeft ? 0 : node.nodeValue.length;
+                container = node;
+                normalized = true;
+                break;
+              }
+              if (nonEmptyElementsMap[node.nodeName.toLowerCase()] && !isTableCell$2(node)) {
+                offset = dom.nodeIndex(node);
+                container = node.parentNode;
+                if (!directionLeft) {
+                  offset++;
+                }
+                normalized = true;
+                break;
+              }
+            } while (node = directionLeft ? walker.next() : walker.prev());
+          }
+        }
+      }
+      if (collapsed) {
+        if (isText$8(container) && offset === 0) {
+          findTextNodeRelative(dom, isAfterNode, collapsed, true, container).each(pos => {
+            container = pos.container();
+            offset = pos.offset();
+            normalized = true;
+          });
+        }
+        if (isElement$6(container)) {
+          node = container.childNodes[offset];
+          if (!node) {
+            node = container.childNodes[offset - 1];
+          }
+          if (node && isBr$5(node) && !isPrevNode(node, 'A') && !hasBrBeforeAfter(dom, node, false) && !hasBrBeforeAfter(dom, node, true)) {
+            findTextNodeRelative(dom, isAfterNode, collapsed, true, node).each(pos => {
+              container = pos.container();
+              offset = pos.offset();
+              normalized = true;
+            });
+          }
+        }
+      }
+      if (directionLeft && !collapsed && isText$8(container) && offset === container.nodeValue.length) {
+        findTextNodeRelative(dom, isAfterNode, collapsed, false, container).each(pos => {
+          container = pos.container();
+          offset = pos.offset();
+          normalized = true;
+        });
+      }
+      return normalized ? Optional.some(CaretPosition(container, offset)) : Optional.none();
+    };
+    const normalize$2 = (dom, rng) => {
+      const collapsed = rng.collapsed, normRng = rng.cloneRange();
+      const startPos = CaretPosition.fromRangeStart(rng);
+      normalizeEndPoint(dom, collapsed, true, normRng).each(pos => {
+        if (!collapsed || !CaretPosition.isAbove(startPos, pos)) {
+          normRng.setStart(pos.container(), pos.offset());
+        }
+      });
+      if (!collapsed) {
+        normalizeEndPoint(dom, collapsed, false, normRng).each(pos => {
+          normRng.setEnd(pos.container(), pos.offset());
+        });
+      }
+      if (collapsed) {
+        normRng.collapse(true);
+      }
+      return isEq$4(rng, normRng) ? Optional.none() : Optional.some(normRng);
+    };
+
+    const splitText = (node, offset) => {
+      return node.splitText(offset);
+    };
+    const split = rng => {
+      let startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset;
+      if (startContainer === endContainer && isText$8(startContainer)) {
+        if (startOffset > 0 && startOffset < startContainer.nodeValue.length) {
+          endContainer = splitText(startContainer, startOffset);
+          startContainer = endContainer.previousSibling;
+          if (endOffset > startOffset) {
+            endOffset = endOffset - startOffset;
+            startContainer = endContainer = splitText(endContainer, endOffset).previousSibling;
+            endOffset = endContainer.nodeValue.length;
+            startOffset = 0;
+          } else {
+            endOffset = 0;
+          }
+        }
+      } else {
+        if (isText$8(startContainer) && startOffset > 0 && startOffset < startContainer.nodeValue.length) {
+          startContainer = splitText(startContainer, startOffset);
+          startOffset = 0;
+        }
+        if (isText$8(endContainer) && endOffset > 0 && endOffset < endContainer.nodeValue.length) {
+          endContainer = splitText(endContainer, endOffset).previousSibling;
+          endOffset = endContainer.nodeValue.length;
+        }
+      }
+      return {
+        startContainer,
+        startOffset,
+        endContainer,
+        endOffset
+      };
+    };
+
+    const RangeUtils = dom => {
+      const walk = (rng, callback) => {
+        return walk$3(dom, rng, callback);
+      };
+      const split$1 = split;
+      const normalize = rng => {
+        return normalize$2(dom, rng).fold(never, normalizedRng => {
+          rng.setStart(normalizedRng.startContainer, normalizedRng.startOffset);
+          rng.setEnd(normalizedRng.endContainer, normalizedRng.endOffset);
+          return true;
+        });
+      };
+      return {
+        walk,
+        split: split$1,
+        normalize
+      };
+    };
+    RangeUtils.compareRanges = isEq$4;
+    RangeUtils.getCaretRangeFromPoint = fromPoint;
+    RangeUtils.getSelectedNode = getSelectedNode;
+    RangeUtils.getNode = getNode$1;
+
+    const Dimension = (name, getOffset) => {
+      const set = (element, h) => {
+        if (!isNumber(h) && !h.match(/^[0-9]+$/)) {
+          throw new Error(name + '.set accepts only positive integer values. Value was ' + h);
+        }
+        const dom = element.dom;
+        if (isSupported$1(dom)) {
+          dom.style[name] = h + 'px';
+        }
+      };
+      const get = element => {
+        const r = getOffset(element);
+        if (r <= 0 || r === null) {
+          const css = get$7(element, name);
+          return parseFloat(css) || 0;
+        }
+        return r;
+      };
+      const getOuter = get;
+      const aggregate = (element, properties) => foldl(properties, (acc, property) => {
+        const val = get$7(element, property);
+        const value = val === undefined ? 0 : parseInt(val, 10);
+        return isNaN(value) ? acc : acc + value;
+      }, 0);
+      const max = (element, value, properties) => {
+        const cumulativeInclusions = aggregate(element, properties);
+        const absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;
+        return absoluteMax;
+      };
+      return {
+        set,
+        get,
+        getOuter,
+        aggregate,
+        max
+      };
+    };
+
+    const api = Dimension('height', element => {
+      const dom = element.dom;
+      return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;
+    });
+    const get$2 = element => api.get(element);
+
+    const getDocument = () => SugarElement.fromDom(document);
+
+    const walkUp = (navigation, doc) => {
+      const frame = navigation.view(doc);
+      return frame.fold(constant([]), f => {
+        const parent = navigation.owner(f);
+        const rest = walkUp(navigation, parent);
+        return [f].concat(rest);
+      });
+    };
+    const pathTo = (element, navigation) => {
+      const d = navigation.owner(element);
+      return walkUp(navigation, d);
+    };
+
+    const view = doc => {
+      var _a;
+      const element = doc.dom === document ? Optional.none() : Optional.from((_a = doc.dom.defaultView) === null || _a === void 0 ? void 0 : _a.frameElement);
+      return element.map(SugarElement.fromDom);
+    };
+    const owner = element => documentOrOwner(element);
+
+    var Navigation = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        view: view,
+        owner: owner
+    });
+
+    const find = element => {
+      const doc = getDocument();
+      const scroll = get$5(doc);
+      const frames = pathTo(element, Navigation);
+      const offset = viewport(element);
+      const r = foldr(frames, (b, a) => {
+        const loc = viewport(a);
+        return {
+          left: b.left + loc.left,
+          top: b.top + loc.top
+        };
+      }, {
+        left: 0,
+        top: 0
+      });
+      return SugarPosition(r.left + offset.left + scroll.left, r.top + offset.top + scroll.top);
+    };
+
+    const excludeFromDescend = element => name(element) === 'textarea';
+    const fireScrollIntoViewEvent = (editor, data) => {
+      const scrollEvent = editor.dispatch('ScrollIntoView', data);
+      return scrollEvent.isDefaultPrevented();
+    };
+    const fireAfterScrollIntoViewEvent = (editor, data) => {
+      editor.dispatch('AfterScrollIntoView', data);
+    };
+    const descend = (element, offset) => {
+      const children$1 = children(element);
+      if (children$1.length === 0 || excludeFromDescend(element)) {
+        return {
+          element,
+          offset
+        };
+      } else if (offset < children$1.length && !excludeFromDescend(children$1[offset])) {
+        return {
+          element: children$1[offset],
+          offset: 0
+        };
+      } else {
+        const last = children$1[children$1.length - 1];
+        if (excludeFromDescend(last)) {
+          return {
+            element,
+            offset
+          };
+        } else {
+          if (name(last) === 'img') {
+            return {
+              element: last,
+              offset: 1
+            };
+          } else if (isText$9(last)) {
+            return {
+              element: last,
+              offset: get$3(last).length
+            };
+          } else {
+            return {
+              element: last,
+              offset: children(last).length
+            };
+          }
+        }
+      }
+    };
+    const markerInfo = (element, cleanupFun) => {
+      const pos = absolute(element);
+      const height = get$2(element);
+      return {
+        element,
+        bottom: pos.top + height,
+        height,
+        pos,
+        cleanup: cleanupFun
+      };
+    };
+    const createMarker$1 = (element, offset) => {
+      const startPoint = descend(element, offset);
+      const span = SugarElement.fromHtml('<span data-mce-bogus="all" style="display: inline-block;">' + ZWSP$1 + '</span>');
+      before$3(startPoint.element, span);
+      return markerInfo(span, () => remove$5(span));
+    };
+    const elementMarker = element => markerInfo(SugarElement.fromDom(element), noop);
+    const withMarker = (editor, f, rng, alignToTop) => {
+      preserveWith(editor, (_s, _e) => applyWithMarker(editor, f, rng, alignToTop), rng);
+    };
+    const withScrollEvents = (editor, doc, f, marker, alignToTop) => {
+      const data = {
+        elm: marker.element.dom,
+        alignToTop
+      };
+      if (fireScrollIntoViewEvent(editor, data)) {
+        return;
+      }
+      const scrollTop = get$5(doc).top;
+      f(doc, scrollTop, marker, alignToTop);
+      fireAfterScrollIntoViewEvent(editor, data);
+    };
+    const applyWithMarker = (editor, f, rng, alignToTop) => {
+      const body = SugarElement.fromDom(editor.getBody());
+      const doc = SugarElement.fromDom(editor.getDoc());
+      reflow(body);
+      const marker = createMarker$1(SugarElement.fromDom(rng.startContainer), rng.startOffset);
+      withScrollEvents(editor, doc, f, marker, alignToTop);
+      marker.cleanup();
+    };
+    const withElement = (editor, element, f, alignToTop) => {
+      const doc = SugarElement.fromDom(editor.getDoc());
+      withScrollEvents(editor, doc, f, elementMarker(element), alignToTop);
+    };
+    const preserveWith = (editor, f, rng) => {
+      const startElement = rng.startContainer;
+      const startOffset = rng.startOffset;
+      const endElement = rng.endContainer;
+      const endOffset = rng.endOffset;
+      f(SugarElement.fromDom(startElement), SugarElement.fromDom(endElement));
+      const newRng = editor.dom.createRng();
+      newRng.setStart(startElement, startOffset);
+      newRng.setEnd(endElement, endOffset);
+      editor.selection.setRng(rng);
+    };
+    const scrollToMarker = (marker, viewHeight, alignToTop, doc) => {
+      const pos = marker.pos;
+      if (alignToTop) {
+        to(pos.left, pos.top, doc);
+      } else {
+        const y = pos.top - viewHeight + marker.height;
+        to(pos.left, y, doc);
+      }
+    };
+    const intoWindowIfNeeded = (doc, scrollTop, viewHeight, marker, alignToTop) => {
+      const viewportBottom = viewHeight + scrollTop;
+      const markerTop = marker.pos.top;
+      const markerBottom = marker.bottom;
+      const largerThanViewport = markerBottom - markerTop >= viewHeight;
+      if (markerTop < scrollTop) {
+        scrollToMarker(marker, viewHeight, alignToTop !== false, doc);
+      } else if (markerTop > viewportBottom) {
+        const align = largerThanViewport ? alignToTop !== false : alignToTop === true;
+        scrollToMarker(marker, viewHeight, align, doc);
+      } else if (markerBottom > viewportBottom && !largerThanViewport) {
+        scrollToMarker(marker, viewHeight, alignToTop === true, doc);
+      }
+    };
+    const intoWindow = (doc, scrollTop, marker, alignToTop) => {
+      const viewHeight = doc.dom.defaultView.innerHeight;
+      intoWindowIfNeeded(doc, scrollTop, viewHeight, marker, alignToTop);
+    };
+    const intoFrame = (doc, scrollTop, marker, alignToTop) => {
+      const frameViewHeight = doc.dom.defaultView.innerHeight;
+      intoWindowIfNeeded(doc, scrollTop, frameViewHeight, marker, alignToTop);
+      const op = find(marker.element);
+      const viewportBounds = getBounds(window);
+      if (op.top < viewportBounds.y) {
+        intoView(marker.element, alignToTop !== false);
+      } else if (op.top > viewportBounds.bottom) {
+        intoView(marker.element, alignToTop === true);
+      }
+    };
+    const rangeIntoWindow = (editor, rng, alignToTop) => withMarker(editor, intoWindow, rng, alignToTop);
+    const elementIntoWindow = (editor, element, alignToTop) => withElement(editor, element, intoWindow, alignToTop);
+    const rangeIntoFrame = (editor, rng, alignToTop) => withMarker(editor, intoFrame, rng, alignToTop);
+    const elementIntoFrame = (editor, element, alignToTop) => withElement(editor, element, intoFrame, alignToTop);
+    const scrollElementIntoView = (editor, element, alignToTop) => {
+      const scroller = editor.inline ? elementIntoWindow : elementIntoFrame;
+      scroller(editor, element, alignToTop);
+    };
+    const scrollRangeIntoView = (editor, rng, alignToTop) => {
+      const scroller = editor.inline ? rangeIntoWindow : rangeIntoFrame;
+      scroller(editor, rng, alignToTop);
+    };
+
+    const focus$1 = element => element.dom.focus();
+    const hasFocus$1 = element => {
+      const root = getRootNode(element).dom;
+      return element.dom === root.activeElement;
+    };
+    const active$1 = (root = getDocument()) => Optional.from(root.dom.activeElement).map(SugarElement.fromDom);
+    const search = element => active$1(getRootNode(element)).filter(e => element.dom.contains(e.dom));
+
+    const clamp$1 = (offset, element) => {
+      const max = isText$9(element) ? get$3(element).length : children(element).length + 1;
+      if (offset > max) {
+        return max;
+      } else if (offset < 0) {
+        return 0;
+      }
+      return offset;
+    };
+    const normalizeRng = rng => SimSelection.range(rng.start, clamp$1(rng.soffset, rng.start), rng.finish, clamp$1(rng.foffset, rng.finish));
+    const isOrContains = (root, elm) => !isRestrictedNode(elm.dom) && (contains(root, elm) || eq(root, elm));
+    const isRngInRoot = root => rng => isOrContains(root, rng.start) && isOrContains(root, rng.finish);
+    const shouldStore = editor => editor.inline;
+    const nativeRangeToSelectionRange = r => SimSelection.range(SugarElement.fromDom(r.startContainer), r.startOffset, SugarElement.fromDom(r.endContainer), r.endOffset);
+    const readRange = win => {
+      const selection = win.getSelection();
+      const rng = !selection || selection.rangeCount === 0 ? Optional.none() : Optional.from(selection.getRangeAt(0));
+      return rng.map(nativeRangeToSelectionRange);
+    };
+    const getBookmark = root => {
+      const win = defaultView(root);
+      return readRange(win.dom).filter(isRngInRoot(root));
+    };
+    const validate = (root, bookmark) => Optional.from(bookmark).filter(isRngInRoot(root)).map(normalizeRng);
+    const bookmarkToNativeRng = bookmark => {
+      const rng = document.createRange();
+      try {
+        rng.setStart(bookmark.start.dom, bookmark.soffset);
+        rng.setEnd(bookmark.finish.dom, bookmark.foffset);
+        return Optional.some(rng);
+      } catch (_) {
+        return Optional.none();
+      }
+    };
+    const store = editor => {
+      const newBookmark = shouldStore(editor) ? getBookmark(SugarElement.fromDom(editor.getBody())) : Optional.none();
+      editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark;
+    };
+    const getRng = editor => {
+      const bookmark = editor.bookmark ? editor.bookmark : Optional.none();
+      return bookmark.bind(x => validate(SugarElement.fromDom(editor.getBody()), x)).bind(bookmarkToNativeRng);
+    };
+    const restore = editor => {
+      getRng(editor).each(rng => editor.selection.setRng(rng));
+    };
+
+    const isEditorUIElement$1 = elm => {
+      const className = elm.className.toString();
+      return className.indexOf('tox-') !== -1 || className.indexOf('mce-') !== -1;
+    };
+    const FocusManager = { isEditorUIElement: isEditorUIElement$1 };
+
+    const wrappedSetTimeout = (callback, time) => {
+      if (!isNumber(time)) {
+        time = 0;
+      }
+      return setTimeout(callback, time);
+    };
+    const wrappedSetInterval = (callback, time) => {
+      if (!isNumber(time)) {
+        time = 0;
+      }
+      return setInterval(callback, time);
+    };
+    const Delay = {
+      setEditorTimeout: (editor, callback, time) => {
+        return wrappedSetTimeout(() => {
+          if (!editor.removed) {
+            callback();
+          }
+        }, time);
+      },
+      setEditorInterval: (editor, callback, time) => {
+        const timer = wrappedSetInterval(() => {
+          if (!editor.removed) {
+            callback();
+          } else {
+            clearInterval(timer);
+          }
+        }, time);
+        return timer;
+      }
+    };
+
+    const isManualNodeChange = e => {
+      return e.type === 'nodechange' && e.selectionChange;
+    };
+    const registerPageMouseUp = (editor, throttledStore) => {
+      const mouseUpPage = () => {
+        throttledStore.throttle();
+      };
+      DOMUtils.DOM.bind(document, 'mouseup', mouseUpPage);
+      editor.on('remove', () => {
+        DOMUtils.DOM.unbind(document, 'mouseup', mouseUpPage);
+      });
+    };
+    const registerMouseUp = (editor, throttledStore) => {
+      editor.on('mouseup touchend', _e => {
+        throttledStore.throttle();
+      });
+    };
+    const registerEditorEvents = (editor, throttledStore) => {
+      registerMouseUp(editor, throttledStore);
+      editor.on('keyup NodeChange AfterSetSelectionRange', e => {
+        if (!isManualNodeChange(e)) {
+          store(editor);
+        }
+      });
+    };
+    const register$6 = editor => {
+      const throttledStore = first$1(() => {
+        store(editor);
+      }, 0);
+      editor.on('init', () => {
+        if (editor.inline) {
+          registerPageMouseUp(editor, throttledStore);
+        }
+        registerEditorEvents(editor, throttledStore);
+      });
+      editor.on('remove', () => {
+        throttledStore.cancel();
+      });
+    };
+
+    let documentFocusInHandler;
+    const DOM$9 = DOMUtils.DOM;
+    const isEditorUIElement = elm => {
+      return FocusManager.isEditorUIElement(elm);
+    };
+    const isEditorContentAreaElement = elm => {
+      const classList = elm.classList;
+      if (classList !== undefined) {
+        return classList.contains('tox-edit-area') || classList.contains('tox-edit-area__iframe') || classList.contains('mce-content-body');
+      } else {
+        return false;
+      }
+    };
+    const isUIElement = (editor, elm) => {
+      const customSelector = getCustomUiSelector(editor);
+      const parent = DOM$9.getParent(elm, elm => {
+        return isEditorUIElement(elm) || (customSelector ? editor.dom.is(elm, customSelector) : false);
+      });
+      return parent !== null;
+    };
+    const getActiveElement = editor => {
+      try {
+        const root = getRootNode(SugarElement.fromDom(editor.getElement()));
+        return active$1(root).fold(() => document.body, x => x.dom);
+      } catch (ex) {
+        return document.body;
+      }
+    };
+    const registerEvents$1 = (editorManager, e) => {
+      const editor = e.editor;
+      register$6(editor);
+      editor.on('focusin', () => {
+        const focusedEditor = editorManager.focusedEditor;
+        if (focusedEditor !== editor) {
+          if (focusedEditor) {
+            focusedEditor.dispatch('blur', { focusedEditor: editor });
+          }
+          editorManager.setActive(editor);
+          editorManager.focusedEditor = editor;
+          editor.dispatch('focus', { blurredEditor: focusedEditor });
+          editor.focus(true);
+        }
+      });
+      editor.on('focusout', () => {
+        Delay.setEditorTimeout(editor, () => {
+          const focusedEditor = editorManager.focusedEditor;
+          if (!isUIElement(editor, getActiveElement(editor)) && focusedEditor === editor) {
+            editor.dispatch('blur', { focusedEditor: null });
+            editorManager.focusedEditor = null;
+          }
+        });
+      });
+      if (!documentFocusInHandler) {
+        documentFocusInHandler = e => {
+          const activeEditor = editorManager.activeEditor;
+          if (activeEditor) {
+            getOriginalEventTarget(e).each(target => {
+              if (target.ownerDocument === document) {
+                if (target !== document.body && !isUIElement(activeEditor, target) && editorManager.focusedEditor === activeEditor) {
+                  activeEditor.dispatch('blur', { focusedEditor: null });
+                  editorManager.focusedEditor = null;
+                }
+              }
+            });
+          }
+        };
+        DOM$9.bind(document, 'focusin', documentFocusInHandler);
+      }
+    };
+    const unregisterDocumentEvents = (editorManager, e) => {
+      if (editorManager.focusedEditor === e.editor) {
+        editorManager.focusedEditor = null;
+      }
+      if (!editorManager.activeEditor) {
+        DOM$9.unbind(document, 'focusin', documentFocusInHandler);
+        documentFocusInHandler = null;
+      }
+    };
+    const setup$v = editorManager => {
+      editorManager.on('AddEditor', curry(registerEvents$1, editorManager));
+      editorManager.on('RemoveEditor', curry(unregisterDocumentEvents, editorManager));
+    };
+
+    const getContentEditableHost = (editor, node) => editor.dom.getParent(node, node => editor.dom.getContentEditable(node) === 'true');
+    const getCollapsedNode = rng => rng.collapsed ? Optional.from(getNode$1(rng.startContainer, rng.startOffset)).map(SugarElement.fromDom) : Optional.none();
+    const getFocusInElement = (root, rng) => getCollapsedNode(rng).bind(node => {
+      if (isTableSection(node)) {
+        return Optional.some(node);
+      } else if (contains(root, node) === false) {
+        return Optional.some(root);
+      } else {
+        return Optional.none();
+      }
+    });
+    const normalizeSelection$1 = (editor, rng) => {
+      getFocusInElement(SugarElement.fromDom(editor.getBody()), rng).bind(elm => {
+        return firstPositionIn(elm.dom);
+      }).fold(() => {
+        editor.selection.normalize();
+        return;
+      }, caretPos => editor.selection.setRng(caretPos.toRange()));
+    };
+    const focusBody = body => {
+      if (body.setActive) {
+        try {
+          body.setActive();
+        } catch (ex) {
+          body.focus();
+        }
+      } else {
+        body.focus();
+      }
+    };
+    const hasElementFocus = elm => hasFocus$1(elm) || search(elm).isSome();
+    const hasIframeFocus = editor => editor.iframeElement && hasFocus$1(SugarElement.fromDom(editor.iframeElement));
+    const hasInlineFocus = editor => {
+      const rawBody = editor.getBody();
+      return rawBody && hasElementFocus(SugarElement.fromDom(rawBody));
+    };
+    const hasUiFocus = editor => {
+      const dos = getRootNode(SugarElement.fromDom(editor.getElement()));
+      return active$1(dos).filter(elem => !isEditorContentAreaElement(elem.dom) && isUIElement(editor, elem.dom)).isSome();
+    };
+    const hasFocus = editor => editor.inline ? hasInlineFocus(editor) : hasIframeFocus(editor);
+    const hasEditorOrUiFocus = editor => hasFocus(editor) || hasUiFocus(editor);
+    const focusEditor = editor => {
+      const selection = editor.selection;
+      const body = editor.getBody();
+      let rng = selection.getRng();
+      editor.quirks.refreshContentEditable();
+      if (editor.bookmark !== undefined && hasFocus(editor) === false) {
+        getRng(editor).each(bookmarkRng => {
+          editor.selection.setRng(bookmarkRng);
+          rng = bookmarkRng;
+        });
+      }
+      const contentEditableHost = getContentEditableHost(editor, selection.getNode());
+      if (editor.dom.isChildOf(contentEditableHost, body)) {
+        focusBody(contentEditableHost);
+        normalizeSelection$1(editor, rng);
+        activateEditor(editor);
+        return;
+      }
+      if (!editor.inline) {
+        if (!Env.browser.isOpera()) {
+          focusBody(body);
+        }
+        editor.getWin().focus();
+      }
+      if (Env.browser.isFirefox() || editor.inline) {
+        focusBody(body);
+        normalizeSelection$1(editor, rng);
+      }
+      activateEditor(editor);
+    };
+    const activateEditor = editor => editor.editorManager.setActive(editor);
+    const focus = (editor, skipFocus) => {
+      if (editor.removed) {
+        return;
+      }
+      if (skipFocus) {
+        activateEditor(editor);
+      } else {
+        focusEditor(editor);
+      }
+    };
+
+    const getEndpointElement = (root, rng, start, real, resolve) => {
+      const container = start ? rng.startContainer : rng.endContainer;
+      const offset = start ? rng.startOffset : rng.endOffset;
+      return Optional.from(container).map(SugarElement.fromDom).map(elm => !real || !rng.collapsed ? child$1(elm, resolve(elm, offset)).getOr(elm) : elm).bind(elm => isElement$7(elm) ? Optional.some(elm) : parent(elm).filter(isElement$7)).map(elm => elm.dom).getOr(root);
+    };
+    const getStart = (root, rng, real) => getEndpointElement(root, rng, true, real, (elm, offset) => Math.min(childNodesCount(elm), offset));
+    const getEnd$1 = (root, rng, real) => getEndpointElement(root, rng, false, real, (elm, offset) => offset > 0 ? offset - 1 : offset);
+    const skipEmptyTextNodes = (node, forwards) => {
+      const orig = node;
+      while (node && isText$8(node) && node.length === 0) {
+        node = forwards ? node.nextSibling : node.previousSibling;
+      }
+      return node || orig;
+    };
+    const getNode = (root, rng) => {
+      let elm, startContainer, endContainer;
+      if (!rng) {
+        return root;
+      }
+      startContainer = rng.startContainer;
+      endContainer = rng.endContainer;
+      const startOffset = rng.startOffset;
+      const endOffset = rng.endOffset;
+      elm = rng.commonAncestorContainer;
+      if (!rng.collapsed) {
+        if (startContainer === endContainer) {
+          if (endOffset - startOffset < 2) {
+            if (startContainer.hasChildNodes()) {
+              elm = startContainer.childNodes[startOffset];
+            }
+          }
+        }
+        if (startContainer.nodeType === 3 && endContainer.nodeType === 3) {
+          if (startContainer.length === startOffset) {
+            startContainer = skipEmptyTextNodes(startContainer.nextSibling, true);
+          } else {
+            startContainer = startContainer.parentNode;
+          }
+          if (endOffset === 0) {
+            endContainer = skipEmptyTextNodes(endContainer.previousSibling, false);
+          } else {
+            endContainer = endContainer.parentNode;
+          }
+          if (startContainer && startContainer === endContainer) {
+            return startContainer;
+          }
+        }
+      }
+      if (elm && elm.nodeType === 3) {
+        return elm.parentNode;
+      }
+      return elm;
+    };
+    const getSelectedBlocks = (dom, rng, startElm, endElm) => {
+      let node;
+      const selectedBlocks = [];
+      const root = dom.getRoot();
+      startElm = dom.getParent(startElm || getStart(root, rng, rng.collapsed), dom.isBlock);
+      endElm = dom.getParent(endElm || getEnd$1(root, rng, rng.collapsed), dom.isBlock);
+      if (startElm && startElm !== root) {
+        selectedBlocks.push(startElm);
+      }
+      if (startElm && endElm && startElm !== endElm) {
+        node = startElm;
+        const walker = new DomTreeWalker(startElm, root);
+        while ((node = walker.next()) && node !== endElm) {
+          if (dom.isBlock(node)) {
+            selectedBlocks.push(node);
+          }
+        }
+      }
+      if (endElm && startElm !== endElm && endElm !== root) {
+        selectedBlocks.push(endElm);
+      }
+      return selectedBlocks;
+    };
+    const select = (dom, node, content) => Optional.from(node).map(node => {
+      const idx = dom.nodeIndex(node);
+      const rng = dom.createRng();
+      rng.setStart(node.parentNode, idx);
+      rng.setEnd(node.parentNode, idx + 1);
+      if (content) {
+        moveEndPoint(dom, rng, node, true);
+        moveEndPoint(dom, rng, node, false);
+      }
+      return rng;
+    });
+
+    const processRanges = (editor, ranges) => map$3(ranges, range => {
+      const evt = editor.dispatch('GetSelectionRange', { range });
+      return evt.range !== range ? evt.range : range;
+    });
+
+    const getEnd = element => name(element) === 'img' ? 1 : getOption(element).fold(() => children(element).length, v => v.length);
+    const isTextNodeWithCursorPosition = el => getOption(el).filter(text => text.trim().length !== 0 || text.indexOf(nbsp) > -1).isSome();
+    const elementsWithCursorPosition = [
+      'img',
+      'br'
+    ];
+    const isCursorPosition = elem => {
+      const hasCursorPosition = isTextNodeWithCursorPosition(elem);
+      return hasCursorPosition || contains$2(elementsWithCursorPosition, name(elem));
+    };
+
+    const first = element => descendant$1(element, isCursorPosition);
+    const last = element => descendantRtl(element, isCursorPosition);
+    const descendantRtl = (scope, predicate) => {
+      const descend = element => {
+        const children$1 = children(element);
+        for (let i = children$1.length - 1; i >= 0; i--) {
+          const child = children$1[i];
+          if (predicate(child)) {
+            return Optional.some(child);
+          }
+          const res = descend(child);
+          if (res.isSome()) {
+            return res;
+          }
+        }
+        return Optional.none();
+      };
+      return descend(scope);
+    };
+
+    const autocompleteSelector = '[data-mce-autocompleter]';
+    const create$8 = (editor, range) => {
+      if (findIn(SugarElement.fromDom(editor.getBody())).isNone()) {
+        const wrapper = SugarElement.fromHtml('<span data-mce-autocompleter="1" data-mce-bogus="1"></span>', editor.getDoc());
+        append$1(wrapper, SugarElement.fromDom(range.extractContents()));
+        range.insertNode(wrapper.dom);
+        parent(wrapper).each(elm => elm.dom.normalize());
+        last(wrapper).map(last => {
+          editor.selection.setCursorLocation(last.dom, getEnd(last));
+        });
+      }
+    };
+    const detect$1 = elm => closest$3(elm, autocompleteSelector);
+    const findIn = elm => descendant(elm, autocompleteSelector);
+    const remove$3 = (editor, elm) => findIn(elm).each(wrapper => {
+      const bookmark = editor.selection.getBookmark();
+      unwrap(wrapper);
+      editor.selection.moveToBookmark(bookmark);
+    });
+
+    const typeLookup = {
+      '#text': 3,
+      '#comment': 8,
+      '#cdata': 4,
+      '#pi': 7,
+      '#doctype': 10,
+      '#document-fragment': 11
+    };
+    const walk$2 = (node, root, prev) => {
+      const startName = prev ? 'lastChild' : 'firstChild';
+      const siblingName = prev ? 'prev' : 'next';
+      if (node[startName]) {
+        return node[startName];
+      }
+      if (node !== root) {
+        let sibling = node[siblingName];
+        if (sibling) {
+          return sibling;
+        }
+        for (let parent = node.parent; parent && parent !== root; parent = parent.parent) {
+          sibling = parent[siblingName];
+          if (sibling) {
+            return sibling;
+          }
+        }
+      }
+    };
+    const isEmptyTextNode = node => {
+      if (!isWhitespaceText(node.value)) {
+        return false;
+      }
+      const parentNode = node.parent;
+      if (parentNode && (parentNode.name !== 'span' || parentNode.attr('style')) && /^[ ]+$/.test(node.value)) {
+        return false;
+      }
+      return true;
+    };
+    const isNonEmptyElement = node => {
+      const isNamedAnchor = node.name === 'a' && !node.attr('href') && node.attr('id');
+      return node.attr('name') || node.attr('id') && !node.firstChild || node.attr('data-mce-bookmark') || isNamedAnchor;
+    };
+    class AstNode {
+      constructor(name, type) {
+        this.name = name;
+        this.type = type;
+        if (type === 1) {
+          this.attributes = [];
+          this.attributes.map = {};
+        }
+      }
+      static create(name, attrs) {
+        const node = new AstNode(name, typeLookup[name] || 1);
+        if (attrs) {
+          each$f(attrs, (value, attrName) => {
+            node.attr(attrName, value);
+          });
+        }
+        return node;
+      }
+      replace(node) {
+        const self = this;
+        if (node.parent) {
+          node.remove();
+        }
+        self.insert(node, self);
+        self.remove();
+        return self;
+      }
+      attr(name, value) {
+        const self = this;
+        let attrs;
+        if (typeof name !== 'string') {
+          if (name !== undefined && name !== null) {
+            each$f(name, (value, key) => {
+              self.attr(key, value);
+            });
+          }
+          return self;
+        }
+        if (attrs = self.attributes) {
+          if (value !== undefined) {
+            if (value === null) {
+              if (name in attrs.map) {
+                delete attrs.map[name];
+                let i = attrs.length;
+                while (i--) {
+                  if (attrs[i].name === name) {
+                    attrs.splice(i, 1);
+                    return self;
+                  }
+                }
+              }
+              return self;
+            }
+            if (name in attrs.map) {
+              let i = attrs.length;
+              while (i--) {
+                if (attrs[i].name === name) {
+                  attrs[i].value = value;
+                  break;
+                }
+              }
+            } else {
+              attrs.push({
+                name,
+                value
+              });
+            }
+            attrs.map[name] = value;
+            return self;
+          }
+          return attrs.map[name];
+        }
+      }
+      clone() {
+        const self = this;
+        const clone = new AstNode(self.name, self.type);
+        let selfAttrs;
+        if (selfAttrs = self.attributes) {
+          const cloneAttrs = [];
+          cloneAttrs.map = {};
+          for (let i = 0, l = selfAttrs.length; i < l; i++) {
+            const selfAttr = selfAttrs[i];
+            if (selfAttr.name !== 'id') {
+              cloneAttrs[cloneAttrs.length] = {
+                name: selfAttr.name,
+                value: selfAttr.value
+              };
+              cloneAttrs.map[selfAttr.name] = selfAttr.value;
+            }
+          }
+          clone.attributes = cloneAttrs;
+        }
+        clone.value = self.value;
+        return clone;
+      }
+      wrap(wrapper) {
+        const self = this;
+        self.parent.insert(wrapper, self);
+        wrapper.append(self);
+        return self;
+      }
+      unwrap() {
+        const self = this;
+        for (let node = self.firstChild; node;) {
+          const next = node.next;
+          self.insert(node, self, true);
+          node = next;
+        }
+        self.remove();
+      }
+      remove() {
+        const self = this, parent = self.parent, next = self.next, prev = self.prev;
+        if (parent) {
+          if (parent.firstChild === self) {
+            parent.firstChild = next;
+            if (next) {
+              next.prev = null;
+            }
+          } else {
+            prev.next = next;
+          }
+          if (parent.lastChild === self) {
+            parent.lastChild = prev;
+            if (prev) {
+              prev.next = null;
+            }
+          } else {
+            next.prev = prev;
+          }
+          self.parent = self.next = self.prev = null;
+        }
+        return self;
+      }
+      append(node) {
+        const self = this;
+        if (node.parent) {
+          node.remove();
+        }
+        const last = self.lastChild;
+        if (last) {
+          last.next = node;
+          node.prev = last;
+          self.lastChild = node;
+        } else {
+          self.lastChild = self.firstChild = node;
+        }
+        node.parent = self;
+        return node;
+      }
+      insert(node, refNode, before) {
+        if (node.parent) {
+          node.remove();
+        }
+        const parent = refNode.parent || this;
+        if (before) {
+          if (refNode === parent.firstChild) {
+            parent.firstChild = node;
+          } else {
+            refNode.prev.next = node;
+          }
+          node.prev = refNode.prev;
+          node.next = refNode;
+          refNode.prev = node;
+        } else {
+          if (refNode === parent.lastChild) {
+            parent.lastChild = node;
+          } else {
+            refNode.next.prev = node;
+          }
+          node.next = refNode.next;
+          node.prev = refNode;
+          refNode.next = node;
+        }
+        node.parent = parent;
+        return node;
+      }
+      getAll(name) {
+        const self = this;
+        const collection = [];
+        for (let node = self.firstChild; node; node = walk$2(node, self)) {
+          if (node.name === name) {
+            collection.push(node);
+          }
+        }
+        return collection;
+      }
+      children() {
+        const self = this;
+        const collection = [];
+        for (let node = self.firstChild; node; node = node.next) {
+          collection.push(node);
+        }
+        return collection;
+      }
+      empty() {
+        const self = this;
+        if (self.firstChild) {
+          const nodes = [];
+          for (let node = self.firstChild; node; node = walk$2(node, self)) {
+            nodes.push(node);
+          }
+          let i = nodes.length;
+          while (i--) {
+            const node = nodes[i];
+            node.parent = node.firstChild = node.lastChild = node.next = node.prev = null;
+          }
+        }
+        self.firstChild = self.lastChild = null;
+        return self;
+      }
+      isEmpty(elements, whitespace = {}, predicate) {
+        const self = this;
+        let node = self.firstChild;
+        if (isNonEmptyElement(self)) {
+          return false;
+        }
+        if (node) {
+          do {
+            if (node.type === 1) {
+              if (node.attr('data-mce-bogus')) {
+                continue;
+              }
+              if (elements[node.name]) {
+                return false;
+              }
+              if (isNonEmptyElement(node)) {
+                return false;
+              }
+            }
+            if (node.type === 8) {
+              return false;
+            }
+            if (node.type === 3 && !isEmptyTextNode(node)) {
+              return false;
+            }
+            if (node.type === 3 && node.parent && whitespace[node.parent.name] && isWhitespaceText(node.value)) {
+              return false;
+            }
+            if (predicate && predicate(node)) {
+              return false;
+            }
+          } while (node = walk$2(node, self));
+        }
+        return true;
+      }
+      walk(prev) {
+        return walk$2(this, null, prev);
+      }
+    }
+
+    const isConditionalComment = (html, startIndex) => /^\s*\[if [\w\W]+\]>.*<!\[endif\](--!?)?>/.test(html.substr(startIndex));
+    const findCommentEndIndex = (html, isBogus, startIndex = 0) => {
+      const lcHtml = html.toLowerCase();
+      if (lcHtml.indexOf('[if ', startIndex) !== -1 && isConditionalComment(lcHtml, startIndex)) {
+        const endIfIndex = lcHtml.indexOf('[endif]', startIndex);
+        return lcHtml.indexOf('>', endIfIndex);
+      } else {
+        if (isBogus) {
+          const endIndex = lcHtml.indexOf('>', startIndex);
+          return endIndex !== -1 ? endIndex : lcHtml.length;
+        } else {
+          const endCommentRegexp = /--!?>/g;
+          endCommentRegexp.lastIndex = startIndex;
+          const match = endCommentRegexp.exec(html);
+          return match ? match.index + match[0].length : lcHtml.length;
+        }
+      }
+    };
+    const findMatchingEndTagIndex = (schema, html, startIndex) => {
+      const startTagRegExp = /<([!?\/])?([A-Za-z0-9\-_:.]+)/g;
+      const endTagRegExp = /(?:\s(?:[^'">]+(?:"[^"]*"|'[^']*'))*[^"'>]*(?:"[^">]*|'[^'>]*)?|\s*|\/)>/g;
+      const voidElements = schema.getVoidElements();
+      let count = 1, index = startIndex;
+      while (count !== 0) {
+        startTagRegExp.lastIndex = index;
+        while (true) {
+          const startMatch = startTagRegExp.exec(html);
+          if (startMatch === null) {
+            return index;
+          } else if (startMatch[1] === '!') {
+            if (startsWith(startMatch[2], '--')) {
+              index = findCommentEndIndex(html, false, startMatch.index + '!--'.length);
+            } else {
+              index = findCommentEndIndex(html, true, startMatch.index + 1);
+            }
+            break;
+          } else {
+            endTagRegExp.lastIndex = startTagRegExp.lastIndex;
+            const endMatch = endTagRegExp.exec(html);
+            if (isNull(endMatch) || endMatch.index !== startTagRegExp.lastIndex) {
+              continue;
+            }
+            if (startMatch[1] === '/') {
+              count -= 1;
+            } else if (!has$2(voidElements, startMatch[2])) {
+              count += 1;
+            }
+            index = startTagRegExp.lastIndex + endMatch[0].length;
+            break;
+          }
+        }
+      }
+      return index;
+    };
+    const trimHtml$1 = (tempAttrs, html) => {
+      const trimContentRegExp = new RegExp(['\\s?(' + tempAttrs.join('|') + ')="[^"]+"'].join('|'), 'gi');
+      return html.replace(trimContentRegExp, '');
+    };
+    const trimInternal = (serializer, html) => {
+      const bogusAllRegExp = /<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g;
+      const schema = serializer.schema;
+      let content = trimHtml$1(serializer.getTempAttrs(), html);
+      const voidElements = schema.getVoidElements();
+      let matches;
+      while (matches = bogusAllRegExp.exec(content)) {
+        const index = bogusAllRegExp.lastIndex;
+        const matchLength = matches[0].length;
+        let endTagIndex;
+        if (voidElements[matches[1]]) {
+          endTagIndex = index;
+        } else {
+          endTagIndex = findMatchingEndTagIndex(schema, content, index);
+        }
+        content = content.substring(0, index - matchLength) + content.substring(endTagIndex);
+        bogusAllRegExp.lastIndex = index - matchLength;
+      }
+      return trim$1(content);
+    };
+    const trimExternal = trimInternal;
+
+    const trimEmptyContents = (editor, html) => {
+      const blockName = getForcedRootBlock(editor);
+      const emptyRegExp = new RegExp(`^(<${ blockName }[^>]*>(&nbsp;|&#160;|\\s|\u00a0|<br \\/>|)<\\/${ blockName }>[\r\n]*|<br \\/>[\r\n]*)$`);
+      return html.replace(emptyRegExp, '');
+    };
+    const getContentFromBody = (editor, args, body) => {
+      let content;
+      if (args.format === 'raw') {
+        content = Tools.trim(trimExternal(editor.serializer, body.innerHTML));
+      } else if (args.format === 'text') {
+        content = editor.dom.isEmpty(body) ? '' : trim$1(body.innerText || body.textContent);
+      } else if (args.format === 'tree') {
+        content = editor.serializer.serialize(body, args);
+      } else {
+        content = trimEmptyContents(editor, editor.serializer.serialize(body, args));
+      }
+      const shouldTrim = args.format !== 'text' && !isWsPreserveElement(SugarElement.fromDom(body));
+      return shouldTrim && isString(content) ? Tools.trim(content) : content;
+    };
+    const getContentInternal = (editor, args) => Optional.from(editor.getBody()).fold(constant(args.format === 'tree' ? new AstNode('body', 11) : ''), body => getContentFromBody(editor, args, body));
+
+    const each$b = Tools.each;
+    const ElementUtils = dom => {
+      const compare = (node1, node2) => {
+        if (node1.nodeName !== node2.nodeName) {
+          return false;
+        }
+        const getAttribs = node => {
+          const attribs = {};
+          each$b(dom.getAttribs(node), attr => {
+            const name = attr.nodeName.toLowerCase();
+            if (name.indexOf('_') !== 0 && name !== 'style' && name.indexOf('data-') !== 0) {
+              attribs[name] = dom.getAttrib(node, name);
+            }
+          });
+          return attribs;
+        };
+        const compareObjects = (obj1, obj2) => {
+          let value, name;
+          for (name in obj1) {
+            if (has$2(obj1, name)) {
+              value = obj2[name];
+              if (typeof value === 'undefined') {
+                return false;
+              }
+              if (obj1[name] !== value) {
+                return false;
+              }
+              delete obj2[name];
+            }
+          }
+          for (name in obj2) {
+            if (has$2(obj2, name)) {
+              return false;
+            }
+          }
+          return true;
+        };
+        if (!compareObjects(getAttribs(node1), getAttribs(node2))) {
+          return false;
+        }
+        if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) {
+          return false;
+        }
+        return !isBookmarkNode$1(node1) && !isBookmarkNode$1(node2);
+      };
+      return { compare };
+    };
+
+    const makeMap$1 = Tools.makeMap;
+    const Writer = settings => {
+      const html = [];
+      settings = settings || {};
+      const indent = settings.indent;
+      const indentBefore = makeMap$1(settings.indent_before || '');
+      const indentAfter = makeMap$1(settings.indent_after || '');
+      const encode = Entities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities);
+      const htmlOutput = settings.element_format !== 'xhtml';
+      return {
+        start: (name, attrs, empty) => {
+          let i, l, attr, value;
+          if (indent && indentBefore[name] && html.length > 0) {
+            value = html[html.length - 1];
+            if (value.length > 0 && value !== '\n') {
+              html.push('\n');
+            }
+          }
+          html.push('<', name);
+          if (attrs) {
+            for (i = 0, l = attrs.length; i < l; i++) {
+              attr = attrs[i];
+              html.push(' ', attr.name, '="', encode(attr.value, true), '"');
+            }
+          }
+          if (!empty || htmlOutput) {
+            html[html.length] = '>';
+          } else {
+            html[html.length] = ' />';
+          }
+          if (empty && indent && indentAfter[name] && html.length > 0) {
+            value = html[html.length - 1];
+            if (value.length > 0 && value !== '\n') {
+              html.push('\n');
+            }
+          }
+        },
+        end: name => {
+          let value;
+          html.push('</', name, '>');
+          if (indent && indentAfter[name] && html.length > 0) {
+            value = html[html.length - 1];
+            if (value.length > 0 && value !== '\n') {
+              html.push('\n');
+            }
+          }
+        },
+        text: (text, raw) => {
+          if (text.length > 0) {
+            html[html.length] = raw ? text : encode(text);
+          }
+        },
+        cdata: text => {
+          html.push('<![CDATA[', text, ']]>');
+        },
+        comment: text => {
+          html.push('<!--', text, '-->');
+        },
+        pi: (name, text) => {
+          if (text) {
+            html.push('<?', name, ' ', encode(text), '?>');
+          } else {
+            html.push('<?', name, '?>');
+          }
+          if (indent) {
+            html.push('\n');
+          }
+        },
+        doctype: text => {
+          html.push('<!DOCTYPE', text, '>', indent ? '\n' : '');
+        },
+        reset: () => {
+          html.length = 0;
+        },
+        getContent: () => {
+          return html.join('').replace(/\n$/, '');
+        }
+      };
+    };
+
+    const HtmlSerializer = (settings, schema = Schema()) => {
+      const writer = Writer(settings);
+      settings = settings || {};
+      settings.validate = 'validate' in settings ? settings.validate : true;
+      const serialize = node => {
+        const validate = settings.validate;
+        const handlers = {
+          3: node => {
+            writer.text(node.value, node.raw);
+          },
+          8: node => {
+            writer.comment(node.value);
+          },
+          7: node => {
+            writer.pi(node.name, node.value);
+          },
+          10: node => {
+            writer.doctype(node.value);
+          },
+          4: node => {
+            writer.cdata(node.value);
+          },
+          11: node => {
+            if (node = node.firstChild) {
+              do {
+                walk(node);
+              } while (node = node.next);
+            }
+          }
+        };
+        writer.reset();
+        const walk = node => {
+          const handler = handlers[node.type];
+          if (!handler) {
+            const name = node.name;
+            const isEmpty = name in schema.getVoidElements();
+            let attrs = node.attributes;
+            if (validate && attrs && attrs.length > 1) {
+              const sortedAttrs = [];
+              sortedAttrs.map = {};
+              const elementRule = schema.getElementRule(node.name);
+              if (elementRule) {
+                for (let i = 0, l = elementRule.attributesOrder.length; i < l; i++) {
+                  const attrName = elementRule.attributesOrder[i];
+                  if (attrName in attrs.map) {
+                    const attrValue = attrs.map[attrName];
+                    sortedAttrs.map[attrName] = attrValue;
+                    sortedAttrs.push({
+                      name: attrName,
+                      value: attrValue
+                    });
+                  }
+                }
+                for (let i = 0, l = attrs.length; i < l; i++) {
+                  const attrName = attrs[i].name;
+                  if (!(attrName in sortedAttrs.map)) {
+                    const attrValue = attrs.map[attrName];
+                    sortedAttrs.map[attrName] = attrValue;
+                    sortedAttrs.push({
+                      name: attrName,
+                      value: attrValue
+                    });
+                  }
+                }
+                attrs = sortedAttrs;
+              }
+            }
+            writer.start(name, attrs, isEmpty);
+            if (!isEmpty) {
+              let child = node.firstChild;
+              if (child) {
+                if ((name === 'pre' || name === 'textarea') && child.type === 3 && child.value[0] === '\n') {
+                  writer.text('\n', true);
+                }
+                do {
+                  walk(child);
+                } while (child = child.next);
+              }
+              writer.end(name);
+            }
+          } else {
+            handler(node);
+          }
+        };
+        if (node.type === 1 && !settings.inner) {
+          walk(node);
+        } else if (node.type === 3) {
+          handlers[3](node);
+        } else {
+          handlers[11](node);
+        }
+        return writer.getContent();
+      };
+      return { serialize };
+    };
+
+    const nonInheritableStyles = new Set();
+    (() => {
+      const nonInheritableStylesArr = [
+        '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'
+      ];
+      each$g(nonInheritableStylesArr, style => {
+        nonInheritableStyles.add(style);
+      });
+    })();
+    const shorthandStyleProps = [
+      'font',
+      'text-decoration',
+      'text-emphasis'
+    ];
+    const getStyleProps = (dom, node) => keys(dom.parseStyle(dom.getAttrib(node, 'style')));
+    const isNonInheritableStyle = style => nonInheritableStyles.has(style);
+    const hasInheritableStyles = (dom, node) => forall(getStyleProps(dom, node), style => !isNonInheritableStyle(style));
+    const getLonghandStyleProps = styles => filter$6(styles, style => exists(shorthandStyleProps, prop => startsWith(style, prop)));
+    const hasStyleConflict = (dom, node, parentNode) => {
+      const nodeStyleProps = getStyleProps(dom, node);
+      const parentNodeStyleProps = getStyleProps(dom, parentNode);
+      const valueMismatch = prop => {
+        var _a, _b;
+        const nodeValue = (_a = dom.getStyle(node, prop)) !== null && _a !== void 0 ? _a : '';
+        const parentValue = (_b = dom.getStyle(parentNode, prop)) !== null && _b !== void 0 ? _b : '';
+        return isNotEmpty(nodeValue) && isNotEmpty(parentValue) && nodeValue !== parentValue;
+      };
+      return exists(nodeStyleProps, nodeStyleProp => {
+        const propExists = props => exists(props, prop => prop === nodeStyleProp);
+        if (!propExists(parentNodeStyleProps) && propExists(shorthandStyleProps)) {
+          const longhandProps = getLonghandStyleProps(parentNodeStyleProps);
+          return exists(longhandProps, valueMismatch);
+        } else {
+          return valueMismatch(nodeStyleProp);
+        }
+      });
+    };
+
+    const isChar = (forward, predicate, pos) => Optional.from(pos.container()).filter(isText$8).exists(text => {
+      const delta = forward ? 0 : -1;
+      return predicate(text.data.charAt(pos.offset() + delta));
+    });
+    const isBeforeSpace = curry(isChar, true, isWhiteSpace);
+    const isAfterSpace = curry(isChar, false, isWhiteSpace);
+    const isEmptyText = pos => {
+      const container = pos.container();
+      return isText$8(container) && (container.data.length === 0 || isZwsp(container.data) && BookmarkManager.isBookmarkNode(container.parentNode));
+    };
+    const matchesElementPosition = (before, predicate) => pos => Optional.from(getChildNodeAtRelativeOffset(before ? 0 : -1, pos)).filter(predicate).isSome();
+    const isImageBlock = node => isImg(node) && get$7(SugarElement.fromDom(node), 'display') === 'block';
+    const isCefNode = node => isContentEditableFalse$a(node) && !isBogusAll$1(node);
+    const isBeforeImageBlock = matchesElementPosition(true, isImageBlock);
+    const isAfterImageBlock = matchesElementPosition(false, isImageBlock);
+    const isBeforeMedia = matchesElementPosition(true, isMedia$2);
+    const isAfterMedia = matchesElementPosition(false, isMedia$2);
+    const isBeforeTable = matchesElementPosition(true, isTable$3);
+    const isAfterTable = matchesElementPosition(false, isTable$3);
+    const isBeforeContentEditableFalse = matchesElementPosition(true, isCefNode);
+    const isAfterContentEditableFalse = matchesElementPosition(false, isCefNode);
+
+    const getLastChildren = elm => {
+      const children = [];
+      let rawNode = elm.dom;
+      while (rawNode) {
+        children.push(SugarElement.fromDom(rawNode));
+        rawNode = rawNode.lastChild;
+      }
+      return children;
+    };
+    const removeTrailingBr = elm => {
+      const allBrs = descendants(elm, 'br');
+      const brs = filter$6(getLastChildren(elm).slice(-1), isBr$4);
+      if (allBrs.length === brs.length) {
+        each$g(brs, remove$5);
+      }
+    };
+    const fillWithPaddingBr = elm => {
+      empty(elm);
+      append$1(elm, SugarElement.fromHtml('<br data-mce-bogus="1">'));
+    };
+    const trimBlockTrailingBr = elm => {
+      lastChild(elm).each(lastChild => {
+        prevSibling(lastChild).each(lastChildPrevSibling => {
+          if (isBlock$2(elm) && isBr$4(lastChild) && isBlock$2(lastChildPrevSibling)) {
+            remove$5(lastChild);
+          }
+        });
+      });
+    };
+
+    const dropLast = xs => xs.slice(0, -1);
+    const parentsUntil = (start, root, predicate) => {
+      if (contains(root, start)) {
+        return dropLast(parents$1(start, elm => {
+          return predicate(elm) || eq(elm, root);
+        }));
+      } else {
+        return [];
+      }
+    };
+    const parents = (start, root) => parentsUntil(start, root, never);
+    const parentsAndSelf = (start, root) => [start].concat(parents(start, root));
+
+    const navigateIgnoreEmptyTextNodes = (forward, root, from) => navigateIgnore(forward, root, from, isEmptyText);
+    const getClosestBlock$1 = (root, pos) => find$2(parentsAndSelf(SugarElement.fromDom(pos.container()), root), isBlock$2);
+    const isAtBeforeAfterBlockBoundary = (forward, root, pos) => navigateIgnoreEmptyTextNodes(forward, root.dom, pos).forall(newPos => getClosestBlock$1(root, pos).fold(() => isInSameBlock(newPos, pos, root.dom) === false, fromBlock => isInSameBlock(newPos, pos, root.dom) === false && contains(fromBlock, SugarElement.fromDom(newPos.container()))));
+    const isAtBlockBoundary = (forward, root, pos) => getClosestBlock$1(root, pos).fold(() => navigateIgnoreEmptyTextNodes(forward, root.dom, pos).forall(newPos => isInSameBlock(newPos, pos, root.dom) === false), parent => navigateIgnoreEmptyTextNodes(forward, parent.dom, pos).isNone());
+    const isAtStartOfBlock = curry(isAtBlockBoundary, false);
+    const isAtEndOfBlock = curry(isAtBlockBoundary, true);
+    const isBeforeBlock = curry(isAtBeforeAfterBlockBoundary, false);
+    const isAfterBlock = curry(isAtBeforeAfterBlockBoundary, true);
+
+    const isBr = pos => getElementFromPosition(pos).exists(isBr$4);
+    const findBr = (forward, root, pos) => {
+      const parentBlocks = filter$6(parentsAndSelf(SugarElement.fromDom(pos.container()), root), isBlock$2);
+      const scope = head(parentBlocks).getOr(root);
+      return fromPosition(forward, scope.dom, pos).filter(isBr);
+    };
+    const isBeforeBr$1 = (root, pos) => getElementFromPosition(pos).exists(isBr$4) || findBr(true, root, pos).isSome();
+    const isAfterBr = (root, pos) => getElementFromPrevPosition(pos).exists(isBr$4) || findBr(false, root, pos).isSome();
+    const findPreviousBr = curry(findBr, false);
+    const findNextBr = curry(findBr, true);
+
+    const isInMiddleOfText = pos => CaretPosition.isTextPosition(pos) && !pos.isAtStart() && !pos.isAtEnd();
+    const getClosestBlock = (root, pos) => {
+      const parentBlocks = filter$6(parentsAndSelf(SugarElement.fromDom(pos.container()), root), isBlock$2);
+      return head(parentBlocks).getOr(root);
+    };
+    const hasSpaceBefore = (root, pos) => {
+      if (isInMiddleOfText(pos)) {
+        return isAfterSpace(pos);
+      } else {
+        return isAfterSpace(pos) || prevPosition(getClosestBlock(root, pos).dom, pos).exists(isAfterSpace);
+      }
+    };
+    const hasSpaceAfter = (root, pos) => {
+      if (isInMiddleOfText(pos)) {
+        return isBeforeSpace(pos);
+      } else {
+        return isBeforeSpace(pos) || nextPosition(getClosestBlock(root, pos).dom, pos).exists(isBeforeSpace);
+      }
+    };
+    const isPreValue = value => contains$2([
+      'pre',
+      'pre-wrap'
+    ], value);
+    const isInPre = pos => getElementFromPosition(pos).bind(elm => closest$4(elm, isElement$7)).exists(elm => isPreValue(get$7(elm, 'white-space')));
+    const isAtBeginningOfBody = (root, pos) => prevPosition(root.dom, pos).isNone();
+    const isAtEndOfBody = (root, pos) => nextPosition(root.dom, pos).isNone();
+    const isAtLineBoundary = (root, pos) => isAtBeginningOfBody(root, pos) || isAtEndOfBody(root, pos) || isAtStartOfBlock(root, pos) || isAtEndOfBlock(root, pos) || isAfterBr(root, pos) || isBeforeBr$1(root, pos);
+    const needsToHaveNbsp = (root, pos) => {
+      if (isInPre(pos)) {
+        return false;
+      } else {
+        return isAtLineBoundary(root, pos) || hasSpaceBefore(root, pos) || hasSpaceAfter(root, pos);
+      }
+    };
+    const needsToBeNbspLeft = (root, pos) => {
+      if (isInPre(pos)) {
+        return false;
+      } else {
+        return isAtStartOfBlock(root, pos) || isBeforeBlock(root, pos) || isAfterBr(root, pos) || hasSpaceBefore(root, pos);
+      }
+    };
+    const leanRight = pos => {
+      const container = pos.container();
+      const offset = pos.offset();
+      if (isText$8(container) && offset < container.data.length) {
+        return CaretPosition(container, offset + 1);
+      } else {
+        return pos;
+      }
+    };
+    const needsToBeNbspRight = (root, pos) => {
+      if (isInPre(pos)) {
+        return false;
+      } else {
+        return isAtEndOfBlock(root, pos) || isAfterBlock(root, pos) || isBeforeBr$1(root, pos) || hasSpaceAfter(root, pos);
+      }
+    };
+    const needsToBeNbsp = (root, pos) => needsToBeNbspLeft(root, pos) || needsToBeNbspRight(root, leanRight(pos));
+    const isNbspAt = (text, offset) => isNbsp(text.charAt(offset));
+    const hasNbsp = pos => {
+      const container = pos.container();
+      return isText$8(container) && contains$1(container.data, nbsp);
+    };
+    const normalizeNbspMiddle = text => {
+      const chars = text.split('');
+      return map$3(chars, (chr, i) => {
+        if (isNbsp(chr) && i > 0 && i < chars.length - 1 && isContent(chars[i - 1]) && isContent(chars[i + 1])) {
+          return ' ';
+        } else {
+          return chr;
+        }
+      }).join('');
+    };
+    const normalizeNbspAtStart = (root, node) => {
+      const text = node.data;
+      const firstPos = CaretPosition(node, 0);
+      if (isNbspAt(text, 0) && !needsToBeNbsp(root, firstPos)) {
+        node.data = ' ' + text.slice(1);
+        return true;
+      } else {
+        return false;
+      }
+    };
+    const normalizeNbspInMiddleOfTextNode = node => {
+      const text = node.data;
+      const newText = normalizeNbspMiddle(text);
+      if (newText !== text) {
+        node.data = newText;
+        return true;
+      } else {
+        return false;
+      }
+    };
+    const normalizeNbspAtEnd = (root, node) => {
+      const text = node.data;
+      const lastPos = CaretPosition(node, text.length - 1);
+      if (isNbspAt(text, text.length - 1) && !needsToBeNbsp(root, lastPos)) {
+        node.data = text.slice(0, -1) + ' ';
+        return true;
+      } else {
+        return false;
+      }
+    };
+    const normalizeNbsps = (root, pos) => Optional.some(pos).filter(hasNbsp).bind(pos => {
+      const container = pos.container();
+      const normalized = normalizeNbspAtStart(root, container) || normalizeNbspInMiddleOfTextNode(container) || normalizeNbspAtEnd(root, container);
+      return normalized ? Optional.some(pos) : Optional.none();
+    });
+    const normalizeNbspsInEditor = editor => {
+      const root = SugarElement.fromDom(editor.getBody());
+      if (editor.selection.isCollapsed()) {
+        normalizeNbsps(root, CaretPosition.fromRangeStart(editor.selection.getRng())).each(pos => {
+          editor.selection.setRng(pos.toRange());
+        });
+      }
+    };
+
+    const normalize$1 = (node, offset, count) => {
+      if (count === 0) {
+        return;
+      }
+      const elm = SugarElement.fromDom(node);
+      const root = ancestor$3(elm, isBlock$2).getOr(elm);
+      const whitespace = node.data.slice(offset, offset + count);
+      const isEndOfContent = offset + count >= node.data.length && needsToBeNbspRight(root, CaretPosition(node, node.data.length));
+      const isStartOfContent = offset === 0 && needsToBeNbspLeft(root, CaretPosition(node, 0));
+      node.replaceData(offset, count, normalize$4(whitespace, 4, isStartOfContent, isEndOfContent));
+    };
+    const normalizeWhitespaceAfter = (node, offset) => {
+      const content = node.data.slice(offset);
+      const whitespaceCount = content.length - lTrim(content).length;
+      normalize$1(node, offset, whitespaceCount);
+    };
+    const normalizeWhitespaceBefore = (node, offset) => {
+      const content = node.data.slice(0, offset);
+      const whitespaceCount = content.length - rTrim(content).length;
+      normalize$1(node, offset - whitespaceCount, whitespaceCount);
+    };
+    const mergeTextNodes = (prevNode, nextNode, normalizeWhitespace, mergeToPrev = true) => {
+      const whitespaceOffset = rTrim(prevNode.data).length;
+      const newNode = mergeToPrev ? prevNode : nextNode;
+      const removeNode = mergeToPrev ? nextNode : prevNode;
+      if (mergeToPrev) {
+        newNode.appendData(removeNode.data);
+      } else {
+        newNode.insertData(0, removeNode.data);
+      }
+      remove$5(SugarElement.fromDom(removeNode));
+      if (normalizeWhitespace) {
+        normalizeWhitespaceAfter(newNode, whitespaceOffset);
+      }
+      return newNode;
+    };
+
+    const needsReposition = (pos, elm) => {
+      const container = pos.container();
+      const offset = pos.offset();
+      return CaretPosition.isTextPosition(pos) === false && container === elm.parentNode && offset > CaretPosition.before(elm).offset();
+    };
+    const reposition = (elm, pos) => needsReposition(pos, elm) ? CaretPosition(pos.container(), pos.offset() - 1) : pos;
+    const beforeOrStartOf = node => isText$8(node) ? CaretPosition(node, 0) : CaretPosition.before(node);
+    const afterOrEndOf = node => isText$8(node) ? CaretPosition(node, node.data.length) : CaretPosition.after(node);
+    const getPreviousSiblingCaretPosition = elm => {
+      if (isCaretCandidate$3(elm.previousSibling)) {
+        return Optional.some(afterOrEndOf(elm.previousSibling));
+      } else {
+        return elm.previousSibling ? lastPositionIn(elm.previousSibling) : Optional.none();
+      }
+    };
+    const getNextSiblingCaretPosition = elm => {
+      if (isCaretCandidate$3(elm.nextSibling)) {
+        return Optional.some(beforeOrStartOf(elm.nextSibling));
+      } else {
+        return elm.nextSibling ? firstPositionIn(elm.nextSibling) : Optional.none();
+      }
+    };
+    const findCaretPositionBackwardsFromElm = (rootElement, elm) => {
+      const startPosition = CaretPosition.before(elm.previousSibling ? elm.previousSibling : elm.parentNode);
+      return prevPosition(rootElement, startPosition).fold(() => nextPosition(rootElement, CaretPosition.after(elm)), Optional.some);
+    };
+    const findCaretPositionForwardsFromElm = (rootElement, elm) => nextPosition(rootElement, CaretPosition.after(elm)).fold(() => prevPosition(rootElement, CaretPosition.before(elm)), Optional.some);
+    const findCaretPositionBackwards = (rootElement, elm) => getPreviousSiblingCaretPosition(elm).orThunk(() => getNextSiblingCaretPosition(elm)).orThunk(() => findCaretPositionBackwardsFromElm(rootElement, elm));
+    const findCaretPositionForward = (rootElement, elm) => getNextSiblingCaretPosition(elm).orThunk(() => getPreviousSiblingCaretPosition(elm)).orThunk(() => findCaretPositionForwardsFromElm(rootElement, elm));
+    const findCaretPosition = (forward, rootElement, elm) => forward ? findCaretPositionForward(rootElement, elm) : findCaretPositionBackwards(rootElement, elm);
+    const findCaretPosOutsideElmAfterDelete = (forward, rootElement, elm) => findCaretPosition(forward, rootElement, elm).map(curry(reposition, elm));
+    const setSelection$1 = (editor, forward, pos) => {
+      pos.fold(() => {
+        editor.focus();
+      }, pos => {
+        editor.selection.setRng(pos.toRange(), forward);
+      });
+    };
+    const eqRawNode = rawNode => elm => elm.dom === rawNode;
+    const isBlock = (editor, elm) => elm && has$2(editor.schema.getBlockElements(), name(elm));
+    const paddEmptyBlock = elm => {
+      if (isEmpty$2(elm)) {
+        const br = SugarElement.fromHtml('<br data-mce-bogus="1">');
+        empty(elm);
+        append$1(elm, br);
+        return Optional.some(CaretPosition.before(br.dom));
+      } else {
+        return Optional.none();
+      }
+    };
+    const deleteNormalized = (elm, afterDeletePosOpt, normalizeWhitespace) => {
+      const prevTextOpt = prevSibling(elm).filter(isText$9);
+      const nextTextOpt = nextSibling(elm).filter(isText$9);
+      remove$5(elm);
+      return lift3(prevTextOpt, nextTextOpt, afterDeletePosOpt, (prev, next, pos) => {
+        const prevNode = prev.dom, nextNode = next.dom;
+        const offset = prevNode.data.length;
+        mergeTextNodes(prevNode, nextNode, normalizeWhitespace);
+        return pos.container() === nextNode ? CaretPosition(prevNode, offset) : pos;
+      }).orThunk(() => {
+        if (normalizeWhitespace) {
+          prevTextOpt.each(elm => normalizeWhitespaceBefore(elm.dom, elm.dom.length));
+          nextTextOpt.each(elm => normalizeWhitespaceAfter(elm.dom, 0));
+        }
+        return afterDeletePosOpt;
+      });
+    };
+    const isInlineElement = (editor, element) => has$2(editor.schema.getTextInlineElements(), name(element));
+    const deleteElement$2 = (editor, forward, elm, moveCaret = true) => {
+      const afterDeletePos = findCaretPosOutsideElmAfterDelete(forward, editor.getBody(), elm.dom);
+      const parentBlock = ancestor$3(elm, curry(isBlock, editor), eqRawNode(editor.getBody()));
+      const normalizedAfterDeletePos = deleteNormalized(elm, afterDeletePos, isInlineElement(editor, elm));
+      if (editor.dom.isEmpty(editor.getBody())) {
+        editor.setContent('');
+        editor.selection.setCursorLocation();
+      } else {
+        parentBlock.bind(paddEmptyBlock).fold(() => {
+          if (moveCaret) {
+            setSelection$1(editor, forward, normalizedAfterDeletePos);
+          }
+        }, paddPos => {
+          if (moveCaret) {
+            setSelection$1(editor, forward, Optional.some(paddPos));
+          }
+        });
+      }
+    };
+
+    const isRootFromElement = root => cur => eq(root, cur);
+    const getTableCells = table => descendants(table, 'td,th');
+    const getTableDetailsFromRange = (rng, isRoot) => {
+      const getTable = node => getClosestTable(SugarElement.fromDom(node), isRoot);
+      const startTable = getTable(rng.startContainer);
+      const endTable = getTable(rng.endContainer);
+      const isStartInTable = startTable.isSome();
+      const isEndInTable = endTable.isSome();
+      const isSameTable = lift2(startTable, endTable, eq).getOr(false);
+      const isMultiTable = !isSameTable && isStartInTable && isEndInTable;
+      return {
+        startTable,
+        endTable,
+        isStartInTable,
+        isEndInTable,
+        isSameTable,
+        isMultiTable
+      };
+    };
+
+    const tableCellRng = (start, end) => ({
+      start,
+      end
+    });
+    const tableSelection = (rng, table, cells) => ({
+      rng,
+      table,
+      cells
+    });
+    const deleteAction = Adt.generate([
+      {
+        singleCellTable: [
+          'rng',
+          'cell'
+        ]
+      },
+      { fullTable: ['table'] },
+      {
+        partialTable: [
+          'cells',
+          'outsideDetails'
+        ]
+      },
+      {
+        multiTable: [
+          'startTableCells',
+          'endTableCells',
+          'betweenRng'
+        ]
+      }
+    ]);
+    const getClosestCell$1 = (container, isRoot) => closest$3(SugarElement.fromDom(container), 'td,th', isRoot);
+    const isExpandedCellRng = cellRng => !eq(cellRng.start, cellRng.end);
+    const getTableFromCellRng = (cellRng, isRoot) => getClosestTable(cellRng.start, isRoot).bind(startParentTable => getClosestTable(cellRng.end, isRoot).bind(endParentTable => someIf(eq(startParentTable, endParentTable), startParentTable)));
+    const isSingleCellTable = (cellRng, isRoot) => !isExpandedCellRng(cellRng) && getTableFromCellRng(cellRng, isRoot).exists(table => {
+      const rows = table.dom.rows;
+      return rows.length === 1 && rows[0].cells.length === 1;
+    });
+    const getCellRng = (rng, isRoot) => {
+      const startCell = getClosestCell$1(rng.startContainer, isRoot);
+      const endCell = getClosestCell$1(rng.endContainer, isRoot);
+      return lift2(startCell, endCell, tableCellRng);
+    };
+    const getCellRangeFromStartTable = isRoot => startCell => getClosestTable(startCell, isRoot).bind(table => last$3(getTableCells(table)).map(endCell => tableCellRng(startCell, endCell)));
+    const getCellRangeFromEndTable = isRoot => endCell => getClosestTable(endCell, isRoot).bind(table => head(getTableCells(table)).map(startCell => tableCellRng(startCell, endCell)));
+    const getTableSelectionFromCellRng = isRoot => cellRng => getTableFromCellRng(cellRng, isRoot).map(table => tableSelection(cellRng, table, getTableCells(table)));
+    const getTableSelections = (cellRng, selectionDetails, rng, isRoot) => {
+      if (rng.collapsed || !cellRng.forall(isExpandedCellRng)) {
+        return Optional.none();
+      } else if (selectionDetails.isSameTable) {
+        const sameTableSelection = cellRng.bind(getTableSelectionFromCellRng(isRoot));
+        return Optional.some({
+          start: sameTableSelection,
+          end: sameTableSelection
+        });
+      } else {
+        const startCell = getClosestCell$1(rng.startContainer, isRoot);
+        const endCell = getClosestCell$1(rng.endContainer, isRoot);
+        const startTableSelection = startCell.bind(getCellRangeFromStartTable(isRoot)).bind(getTableSelectionFromCellRng(isRoot));
+        const endTableSelection = endCell.bind(getCellRangeFromEndTable(isRoot)).bind(getTableSelectionFromCellRng(isRoot));
+        return Optional.some({
+          start: startTableSelection,
+          end: endTableSelection
+        });
+      }
+    };
+    const getCellIndex = (cells, cell) => findIndex$2(cells, x => eq(x, cell));
+    const getSelectedCells = tableSelection => lift2(getCellIndex(tableSelection.cells, tableSelection.rng.start), getCellIndex(tableSelection.cells, tableSelection.rng.end), (startIndex, endIndex) => tableSelection.cells.slice(startIndex, endIndex + 1));
+    const isSingleCellTableContentSelected = (optCellRng, rng, isRoot) => optCellRng.exists(cellRng => isSingleCellTable(cellRng, isRoot) && hasAllContentsSelected(cellRng.start, rng));
+    const unselectCells = (rng, selectionDetails) => {
+      const {startTable, endTable} = selectionDetails;
+      const otherContentRng = rng.cloneRange();
+      startTable.each(table => otherContentRng.setStartAfter(table.dom));
+      endTable.each(table => otherContentRng.setEndBefore(table.dom));
+      return otherContentRng;
+    };
+    const handleSingleTable = (cellRng, selectionDetails, rng, isRoot) => getTableSelections(cellRng, selectionDetails, rng, isRoot).bind(({start, end}) => start.or(end)).bind(tableSelection => {
+      const {isSameTable} = selectionDetails;
+      const selectedCells = getSelectedCells(tableSelection).getOr([]);
+      if (isSameTable && tableSelection.cells.length === selectedCells.length) {
+        return Optional.some(deleteAction.fullTable(tableSelection.table));
+      } else if (selectedCells.length > 0) {
+        if (isSameTable) {
+          return Optional.some(deleteAction.partialTable(selectedCells, Optional.none()));
+        } else {
+          const otherContentRng = unselectCells(rng, selectionDetails);
+          return Optional.some(deleteAction.partialTable(selectedCells, Optional.some({
+            ...selectionDetails,
+            rng: otherContentRng
+          })));
+        }
+      } else {
+        return Optional.none();
+      }
+    });
+    const handleMultiTable = (cellRng, selectionDetails, rng, isRoot) => getTableSelections(cellRng, selectionDetails, rng, isRoot).bind(({start, end}) => {
+      const startTableSelectedCells = start.bind(getSelectedCells).getOr([]);
+      const endTableSelectedCells = end.bind(getSelectedCells).getOr([]);
+      if (startTableSelectedCells.length > 0 && endTableSelectedCells.length > 0) {
+        const otherContentRng = unselectCells(rng, selectionDetails);
+        return Optional.some(deleteAction.multiTable(startTableSelectedCells, endTableSelectedCells, otherContentRng));
+      } else {
+        return Optional.none();
+      }
+    });
+    const getActionFromRange = (root, rng) => {
+      const isRoot = isRootFromElement(root);
+      const optCellRng = getCellRng(rng, isRoot);
+      const selectionDetails = getTableDetailsFromRange(rng, isRoot);
+      if (isSingleCellTableContentSelected(optCellRng, rng, isRoot)) {
+        return optCellRng.map(cellRng => deleteAction.singleCellTable(rng, cellRng.start));
+      } else if (selectionDetails.isMultiTable) {
+        return handleMultiTable(optCellRng, selectionDetails, rng, isRoot);
+      } else {
+        return handleSingleTable(optCellRng, selectionDetails, rng, isRoot);
+      }
+    };
+
+    const freefallRtl = root => {
+      const child = isComment$1(root) ? prevSibling(root) : lastChild(root);
+      return child.bind(freefallRtl).orThunk(() => Optional.some(root));
+    };
+    const cleanCells = cells => each$g(cells, cell => {
+      remove$a(cell, 'contenteditable');
+      fillWithPaddingBr(cell);
+    });
+    const getOutsideBlock = (editor, container) => Optional.from(editor.dom.getParent(container, editor.dom.isBlock)).map(SugarElement.fromDom);
+    const handleEmptyBlock = (editor, startInTable, emptyBlock) => {
+      emptyBlock.each(block => {
+        if (startInTable) {
+          remove$5(block);
+        } else {
+          fillWithPaddingBr(block);
+          editor.selection.setCursorLocation(block.dom, 0);
+        }
+      });
+    };
+    const deleteContentInsideCell = (editor, cell, rng, isFirstCellInSelection) => {
+      const insideTableRng = rng.cloneRange();
+      if (isFirstCellInSelection) {
+        insideTableRng.setStart(rng.startContainer, rng.startOffset);
+        insideTableRng.setEndAfter(cell.dom.lastChild);
+      } else {
+        insideTableRng.setStartBefore(cell.dom.firstChild);
+        insideTableRng.setEnd(rng.endContainer, rng.endOffset);
+      }
+      deleteCellContents(editor, insideTableRng, cell, false).each(action => action());
+    };
+    const collapseAndRestoreCellSelection = editor => {
+      const selectedCells = getCellsFromEditor(editor);
+      const selectedNode = SugarElement.fromDom(editor.selection.getNode());
+      if (isTableCell$5(selectedNode.dom) && isEmpty$2(selectedNode)) {
+        editor.selection.setCursorLocation(selectedNode.dom, 0);
+      } else {
+        editor.selection.collapse(true);
+      }
+      if (selectedCells.length > 1 && exists(selectedCells, cell => eq(cell, selectedNode))) {
+        set$2(selectedNode, 'data-mce-selected', '1');
+      }
+    };
+    const emptySingleTableCells = (editor, cells, outsideDetails) => Optional.some(() => {
+      const editorRng = editor.selection.getRng();
+      const cellsToClean = outsideDetails.bind(({rng, isStartInTable}) => {
+        const outsideBlock = getOutsideBlock(editor, isStartInTable ? rng.endContainer : rng.startContainer);
+        rng.deleteContents();
+        handleEmptyBlock(editor, isStartInTable, outsideBlock.filter(isEmpty$2));
+        const endPointCell = isStartInTable ? cells[0] : cells[cells.length - 1];
+        deleteContentInsideCell(editor, endPointCell, editorRng, isStartInTable);
+        if (!isEmpty$2(endPointCell)) {
+          return Optional.some(isStartInTable ? cells.slice(1) : cells.slice(0, -1));
+        } else {
+          return Optional.none();
+        }
+      }).getOr(cells);
+      cleanCells(cellsToClean);
+      collapseAndRestoreCellSelection(editor);
+    });
+    const emptyMultiTableCells = (editor, startTableCells, endTableCells, betweenRng) => Optional.some(() => {
+      const rng = editor.selection.getRng();
+      const startCell = startTableCells[0];
+      const endCell = endTableCells[endTableCells.length - 1];
+      deleteContentInsideCell(editor, startCell, rng, true);
+      deleteContentInsideCell(editor, endCell, rng, false);
+      const startTableCellsToClean = isEmpty$2(startCell) ? startTableCells : startTableCells.slice(1);
+      const endTableCellsToClean = isEmpty$2(endCell) ? endTableCells : endTableCells.slice(0, -1);
+      cleanCells(startTableCellsToClean.concat(endTableCellsToClean));
+      betweenRng.deleteContents();
+      collapseAndRestoreCellSelection(editor);
+    });
+    const deleteCellContents = (editor, rng, cell, moveSelection = true) => Optional.some(() => {
+      rng.deleteContents();
+      const lastNode = freefallRtl(cell).getOr(cell);
+      const lastBlock = SugarElement.fromDom(editor.dom.getParent(lastNode.dom, editor.dom.isBlock));
+      if (isEmpty$2(lastBlock)) {
+        fillWithPaddingBr(lastBlock);
+        if (moveSelection) {
+          editor.selection.setCursorLocation(lastBlock.dom, 0);
+        }
+      }
+      if (!eq(cell, lastBlock)) {
+        const additionalCleanupNodes = is$2(parent(lastBlock), cell) ? [] : siblings(lastBlock);
+        each$g(additionalCleanupNodes.concat(children(cell)), node => {
+          if (!eq(node, lastBlock) && !contains(node, lastBlock) && isEmpty$2(node)) {
+            remove$5(node);
+          }
+        });
+      }
+    });
+    const deleteTableElement = (editor, table) => Optional.some(() => deleteElement$2(editor, false, table));
+    const deleteCellRange = (editor, rootElm, rng) => getActionFromRange(rootElm, rng).bind(action => action.fold(curry(deleteCellContents, editor), curry(deleteTableElement, editor), curry(emptySingleTableCells, editor), curry(emptyMultiTableCells, editor)));
+    const deleteCaptionRange = (editor, caption) => emptyElement(editor, caption);
+    const deleteTableRange = (editor, rootElm, rng, startElm) => getParentCaption(rootElm, startElm).fold(() => deleteCellRange(editor, rootElm, rng), caption => deleteCaptionRange(editor, caption));
+    const deleteRange$2 = (editor, startElm, selectedCells) => {
+      const rootNode = SugarElement.fromDom(editor.getBody());
+      const rng = editor.selection.getRng();
+      return selectedCells.length !== 0 ? emptySingleTableCells(editor, selectedCells, Optional.none()) : deleteTableRange(editor, rootNode, rng, startElm);
+    };
+    const getParentCell = (rootElm, elm) => find$2(parentsAndSelf(elm, rootElm), isTableCell$4);
+    const getParentCaption = (rootElm, elm) => find$2(parentsAndSelf(elm, rootElm), isTag('caption'));
+    const deleteBetweenCells = (editor, rootElm, forward, fromCell, from) => navigate(forward, editor.getBody(), from).bind(to => getParentCell(rootElm, SugarElement.fromDom(to.getNode())).bind(toCell => eq(toCell, fromCell) ? Optional.none() : Optional.some(noop)));
+    const emptyElement = (editor, elm) => Optional.some(() => {
+      fillWithPaddingBr(elm);
+      editor.selection.setCursorLocation(elm.dom, 0);
+    });
+    const isDeleteOfLastCharPos = (fromCaption, forward, from, to) => firstPositionIn(fromCaption.dom).bind(first => lastPositionIn(fromCaption.dom).map(last => forward ? from.isEqual(first) && to.isEqual(last) : from.isEqual(last) && to.isEqual(first))).getOr(true);
+    const emptyCaretCaption = (editor, elm) => emptyElement(editor, elm);
+    const validateCaretCaption = (rootElm, fromCaption, to) => getParentCaption(rootElm, SugarElement.fromDom(to.getNode())).fold(() => Optional.some(noop), toCaption => someIf(!eq(toCaption, fromCaption), noop));
+    const deleteCaretInsideCaption = (editor, rootElm, forward, fromCaption, from) => navigate(forward, editor.getBody(), from).fold(() => Optional.some(noop), to => isDeleteOfLastCharPos(fromCaption, forward, from, to) ? emptyCaretCaption(editor, fromCaption) : validateCaretCaption(rootElm, fromCaption, to));
+    const deleteCaretCells = (editor, forward, rootElm, startElm) => {
+      const from = CaretPosition.fromRangeStart(editor.selection.getRng());
+      return getParentCell(rootElm, startElm).bind(fromCell => isEmpty$2(fromCell) ? emptyElement(editor, fromCell) : deleteBetweenCells(editor, rootElm, forward, fromCell, from));
+    };
+    const deleteCaretCaption = (editor, forward, rootElm, fromCaption) => {
+      const from = CaretPosition.fromRangeStart(editor.selection.getRng());
+      return isEmpty$2(fromCaption) ? emptyElement(editor, fromCaption) : deleteCaretInsideCaption(editor, rootElm, forward, fromCaption, from);
+    };
+    const isNearTable = (forward, pos) => forward ? isBeforeTable(pos) : isAfterTable(pos);
+    const isBeforeOrAfterTable = (editor, forward) => {
+      const fromPos = CaretPosition.fromRangeStart(editor.selection.getRng());
+      return isNearTable(forward, fromPos) || fromPosition(forward, editor.getBody(), fromPos).exists(pos => isNearTable(forward, pos));
+    };
+    const deleteCaret$3 = (editor, forward, startElm) => {
+      const rootElm = SugarElement.fromDom(editor.getBody());
+      return getParentCaption(rootElm, startElm).fold(() => deleteCaretCells(editor, forward, rootElm, startElm).orThunk(() => someIf(isBeforeOrAfterTable(editor, forward), noop)), fromCaption => deleteCaretCaption(editor, forward, rootElm, fromCaption));
+    };
+    const backspaceDelete$9 = (editor, forward) => {
+      const startElm = SugarElement.fromDom(editor.selection.getStart(true));
+      const cells = getCellsFromEditor(editor);
+      return editor.selection.isCollapsed() && cells.length === 0 ? deleteCaret$3(editor, forward, startElm) : deleteRange$2(editor, startElm, cells);
+    };
+
+    const getContentEditableRoot$1 = (root, node) => {
+      while (node && node !== root) {
+        if (isContentEditableTrue$4(node) || isContentEditableFalse$a(node)) {
+          return node;
+        }
+        node = node.parentNode;
+      }
+      return null;
+    };
+
+    const traverse = (node, fn) => {
+      fn(node);
+      if (node.firstChild) {
+        traverse(node.firstChild, fn);
+      }
+      if (node.next) {
+        traverse(node.next, fn);
+      }
+    };
+    const matchNode$1 = (nodeFilters, attributeFilters, node, matches) => {
+      const name = node.name;
+      for (let ni = 0, nl = nodeFilters.length; ni < nl; ni++) {
+        const filter = nodeFilters[ni];
+        if (filter.name === name) {
+          const match = matches.nodes[name];
+          if (match) {
+            match.nodes.push(node);
+          } else {
+            matches.nodes[name] = {
+              filter,
+              nodes: [node]
+            };
+          }
+        }
+      }
+      if (node.attributes) {
+        for (let ai = 0, al = attributeFilters.length; ai < al; ai++) {
+          const filter = attributeFilters[ai];
+          const attrName = filter.name;
+          if (attrName in node.attributes.map) {
+            const match = matches.attributes[attrName];
+            if (match) {
+              match.nodes.push(node);
+            } else {
+              matches.attributes[attrName] = {
+                filter,
+                nodes: [node]
+              };
+            }
+          }
+        }
+      }
+    };
+    const findMatchingNodes = (nodeFilters, attributeFilters, node) => {
+      const matches = {
+        nodes: {},
+        attributes: {}
+      };
+      if (node.firstChild) {
+        traverse(node.firstChild, node => {
+          matchNode$1(nodeFilters, attributeFilters, node, matches);
+        });
+      }
+      return matches;
+    };
+    const runFilters = (matches, args) => {
+      const run = matchRecord => {
+        each$f(matchRecord, match => {
+          const nodes = filter$6(match.nodes, node => isNonNullable(node.parent));
+          each$g(match.filter.callbacks, callback => {
+            callback(nodes, match.filter.name, args);
+          });
+        });
+      };
+      run(matches.nodes);
+      run(matches.attributes);
+    };
+    const filter$3 = (nodeFilters, attributeFilters, node, args = {}) => {
+      const matches = findMatchingNodes(nodeFilters, attributeFilters, node);
+      runFilters(matches, args);
+    };
+
+    const paddEmptyNode = (settings, args, blockElements, node) => {
+      if (args.insert && blockElements[node.name]) {
+        node.empty().append(new AstNode('br', 1));
+      } else {
+        node.empty().append(new AstNode('#text', 3)).value = nbsp;
+      }
+    };
+    const isPaddedWithNbsp = node => hasOnlyChild(node, '#text') && node.firstChild.value === nbsp;
+    const hasOnlyChild = (node, name) => node && node.firstChild && node.firstChild === node.lastChild && node.firstChild.name === name;
+    const isPadded = (schema, node) => {
+      const rule = schema.getElementRule(node.name);
+      return rule && rule.paddEmpty;
+    };
+    const isEmpty = (schema, nonEmptyElements, whitespaceElements, node) => node.isEmpty(nonEmptyElements, whitespaceElements, node => isPadded(schema, node));
+    const isLineBreakNode = (node, blockElements) => node && (node.name in blockElements || node.name === 'br');
+
+    const removeOrUnwrapInvalidNode = (node, schema, originalNodeParent = node.parent) => {
+      if (schema.getSpecialElements()[node.name]) {
+        node.empty().remove();
+      } else {
+        const children = node.children();
+        for (const childNode of children) {
+          if (!schema.isValidChild(originalNodeParent.name, childNode.name)) {
+            removeOrUnwrapInvalidNode(childNode, schema, originalNodeParent);
+          }
+        }
+        node.unwrap();
+      }
+    };
+    const cleanInvalidNodes = (nodes, schema, onCreate = noop) => {
+      const textBlockElements = schema.getTextBlockElements();
+      const nonEmptyElements = schema.getNonEmptyElements();
+      const whitespaceElements = schema.getWhitespaceElements();
+      const nonSplittableElements = Tools.makeMap('tr,td,th,tbody,thead,tfoot,table');
+      const fixed = new Set();
+      for (let ni = 0; ni < nodes.length; ni++) {
+        const node = nodes[ni];
+        let parent;
+        let newParent;
+        let tempNode;
+        if (!node.parent || fixed.has(node)) {
+          continue;
+        }
+        if (textBlockElements[node.name] && node.parent.name === 'li') {
+          let sibling = node.next;
+          while (sibling) {
+            if (textBlockElements[sibling.name]) {
+              sibling.name = 'li';
+              fixed.add(sibling);
+              node.parent.insert(sibling, node.parent);
+            } else {
+              break;
+            }
+            sibling = sibling.next;
+          }
+          node.unwrap();
+          continue;
+        }
+        const parents = [node];
+        for (parent = node.parent; parent && !schema.isValidChild(parent.name, node.name) && !nonSplittableElements[parent.name]; parent = parent.parent) {
+          parents.push(parent);
+        }
+        if (parent && parents.length > 1) {
+          if (schema.isValidChild(parent.name, node.name)) {
+            parents.reverse();
+            newParent = parents[0].clone();
+            onCreate(newParent);
+            let currentNode = newParent;
+            for (let i = 0; i < parents.length - 1; i++) {
+              if (schema.isValidChild(currentNode.name, parents[i].name)) {
+                tempNode = parents[i].clone();
+                onCreate(tempNode);
+                currentNode.append(tempNode);
+              } else {
+                tempNode = currentNode;
+              }
+              for (let childNode = parents[i].firstChild; childNode && childNode !== parents[i + 1];) {
+                const nextNode = childNode.next;
+                tempNode.append(childNode);
+                childNode = nextNode;
+              }
+              currentNode = tempNode;
+            }
+            if (!isEmpty(schema, nonEmptyElements, whitespaceElements, newParent)) {
+              parent.insert(newParent, parents[0], true);
+              parent.insert(node, newParent);
+            } else {
+              parent.insert(node, parents[0], true);
+            }
+            parent = parents[0];
+            if (isEmpty(schema, nonEmptyElements, whitespaceElements, parent) || hasOnlyChild(parent, 'br')) {
+              parent.empty().remove();
+            }
+          } else {
+            removeOrUnwrapInvalidNode(node, schema);
+          }
+        } else if (node.parent) {
+          if (node.name === 'li') {
+            let sibling = node.prev;
+            if (sibling && (sibling.name === 'ul' || sibling.name === 'ol')) {
+              sibling.append(node);
+              continue;
+            }
+            sibling = node.next;
+            if (sibling && (sibling.name === 'ul' || sibling.name === 'ol')) {
+              sibling.insert(node, sibling.firstChild, true);
+              continue;
+            }
+            const wrapper = new AstNode('ul', 1);
+            onCreate(wrapper);
+            node.wrap(wrapper);
+            continue;
+          }
+          if (schema.isValidChild(node.parent.name, 'div') && schema.isValidChild('div', node.name)) {
+            const wrapper = new AstNode('div', 1);
+            onCreate(wrapper);
+            node.wrap(wrapper);
+          } else {
+            removeOrUnwrapInvalidNode(node, schema);
+          }
+        }
+      }
+    };
+
+    const createRange = (sc, so, ec, eo) => {
+      const rng = document.createRange();
+      rng.setStart(sc, so);
+      rng.setEnd(ec, eo);
+      return rng;
+    };
+    const normalizeBlockSelectionRange = rng => {
+      const startPos = CaretPosition.fromRangeStart(rng);
+      const endPos = CaretPosition.fromRangeEnd(rng);
+      const rootNode = rng.commonAncestorContainer;
+      return fromPosition(false, rootNode, endPos).map(newEndPos => {
+        if (!isInSameBlock(startPos, endPos, rootNode) && isInSameBlock(startPos, newEndPos, rootNode)) {
+          return createRange(startPos.container(), startPos.offset(), newEndPos.container(), newEndPos.offset());
+        } else {
+          return rng;
+        }
+      }).getOr(rng);
+    };
+    const normalize = rng => rng.collapsed ? rng : normalizeBlockSelectionRange(rng);
+
+    const hasOnlyOneChild$1 = node => {
+      return node.firstChild && node.firstChild === node.lastChild;
+    };
+    const isPaddingNode = node => {
+      return node.name === 'br' || node.value === nbsp;
+    };
+    const isPaddedEmptyBlock = (schema, node) => {
+      const blockElements = schema.getBlockElements();
+      return blockElements[node.name] && hasOnlyOneChild$1(node) && isPaddingNode(node.firstChild);
+    };
+    const isEmptyFragmentElement = (schema, node) => {
+      const nonEmptyElements = schema.getNonEmptyElements();
+      return node && (node.isEmpty(nonEmptyElements) || isPaddedEmptyBlock(schema, node));
+    };
+    const isListFragment = (schema, fragment) => {
+      let firstChild = fragment.firstChild;
+      let lastChild = fragment.lastChild;
+      if (firstChild && firstChild.name === 'meta') {
+        firstChild = firstChild.next;
+      }
+      if (lastChild && lastChild.attr('id') === 'mce_marker') {
+        lastChild = lastChild.prev;
+      }
+      if (isEmptyFragmentElement(schema, lastChild)) {
+        lastChild = lastChild.prev;
+      }
+      if (!firstChild || firstChild !== lastChild) {
+        return false;
+      }
+      return firstChild.name === 'ul' || firstChild.name === 'ol';
+    };
+    const cleanupDomFragment = domFragment => {
+      const firstChild = domFragment.firstChild;
+      const lastChild = domFragment.lastChild;
+      if (firstChild && firstChild.nodeName === 'META') {
+        firstChild.parentNode.removeChild(firstChild);
+      }
+      if (lastChild && lastChild.id === 'mce_marker') {
+        lastChild.parentNode.removeChild(lastChild);
+      }
+      return domFragment;
+    };
+    const toDomFragment = (dom, serializer, fragment) => {
+      const html = serializer.serialize(fragment);
+      const domFragment = dom.createFragment(html);
+      return cleanupDomFragment(domFragment);
+    };
+    const listItems = elm => {
+      return filter$6(elm.childNodes, child => {
+        return child.nodeName === 'LI';
+      });
+    };
+    const isPadding = node => {
+      return node.data === nbsp || isBr$5(node);
+    };
+    const isListItemPadded = node => {
+      return node && node.firstChild && node.firstChild === node.lastChild && isPadding(node.firstChild);
+    };
+    const isEmptyOrPadded = elm => {
+      return !elm.firstChild || isListItemPadded(elm);
+    };
+    const trimListItems = elms => {
+      return elms.length > 0 && isEmptyOrPadded(elms[elms.length - 1]) ? elms.slice(0, -1) : elms;
+    };
+    const getParentLi = (dom, node) => {
+      const parentBlock = dom.getParent(node, dom.isBlock);
+      return parentBlock && parentBlock.nodeName === 'LI' ? parentBlock : null;
+    };
+    const isParentBlockLi = (dom, node) => {
+      return !!getParentLi(dom, node);
+    };
+    const getSplit = (parentNode, rng) => {
+      const beforeRng = rng.cloneRange();
+      const afterRng = rng.cloneRange();
+      beforeRng.setStartBefore(parentNode);
+      afterRng.setEndAfter(parentNode);
+      return [
+        beforeRng.cloneContents(),
+        afterRng.cloneContents()
+      ];
+    };
+    const findFirstIn = (node, rootNode) => {
+      const caretPos = CaretPosition.before(node);
+      const caretWalker = CaretWalker(rootNode);
+      const newCaretPos = caretWalker.next(caretPos);
+      return newCaretPos ? newCaretPos.toRange() : null;
+    };
+    const findLastOf = (node, rootNode) => {
+      const caretPos = CaretPosition.after(node);
+      const caretWalker = CaretWalker(rootNode);
+      const newCaretPos = caretWalker.prev(caretPos);
+      return newCaretPos ? newCaretPos.toRange() : null;
+    };
+    const insertMiddle = (target, elms, rootNode, rng) => {
+      const parts = getSplit(target, rng);
+      const parentElm = target.parentNode;
+      parentElm.insertBefore(parts[0], target);
+      Tools.each(elms, li => {
+        parentElm.insertBefore(li, target);
+      });
+      parentElm.insertBefore(parts[1], target);
+      parentElm.removeChild(target);
+      return findLastOf(elms[elms.length - 1], rootNode);
+    };
+    const insertBefore$1 = (target, elms, rootNode) => {
+      const parentElm = target.parentNode;
+      Tools.each(elms, elm => {
+        parentElm.insertBefore(elm, target);
+      });
+      return findFirstIn(target, rootNode);
+    };
+    const insertAfter$1 = (target, elms, rootNode, dom) => {
+      dom.insertAfter(elms.reverse(), target);
+      return findLastOf(elms[0], rootNode);
+    };
+    const insertAtCaret$1 = (serializer, dom, rng, fragment) => {
+      const domFragment = toDomFragment(dom, serializer, fragment);
+      const liTarget = getParentLi(dom, rng.startContainer);
+      const liElms = trimListItems(listItems(domFragment.firstChild));
+      const BEGINNING = 1, END = 2;
+      const rootNode = dom.getRoot();
+      const isAt = location => {
+        const caretPos = CaretPosition.fromRangeStart(rng);
+        const caretWalker = CaretWalker(dom.getRoot());
+        const newPos = location === BEGINNING ? caretWalker.prev(caretPos) : caretWalker.next(caretPos);
+        return newPos ? getParentLi(dom, newPos.getNode()) !== liTarget : true;
+      };
+      if (isAt(BEGINNING)) {
+        return insertBefore$1(liTarget, liElms, rootNode);
+      } else if (isAt(END)) {
+        return insertAfter$1(liTarget, liElms, rootNode, dom);
+      }
+      return insertMiddle(liTarget, liElms, rootNode, rng);
+    };
+
+    const isTableCell$1 = isTableCell$5;
+    const isTableCellContentSelected = (dom, rng, cell) => {
+      if (cell !== null) {
+        const endCell = dom.getParent(rng.endContainer, isTableCell$1);
+        return cell === endCell && hasAllContentsSelected(SugarElement.fromDom(cell), rng);
+      } else {
+        return false;
+      }
+    };
+    const validInsertion = (editor, value, parentNode) => {
+      if (parentNode.getAttribute('data-mce-bogus') === 'all') {
+        parentNode.parentNode.insertBefore(editor.dom.createFragment(value), parentNode);
+      } else {
+        const node = parentNode.firstChild;
+        const node2 = parentNode.lastChild;
+        if (!node || node === node2 && node.nodeName === 'BR') {
+          editor.dom.setHTML(parentNode, value);
+        } else {
+          editor.selection.setContent(value, { no_events: true });
+        }
+      }
+    };
+    const trimBrsFromTableCell = (dom, elm) => {
+      Optional.from(dom.getParent(elm, 'td,th')).map(SugarElement.fromDom).each(trimBlockTrailingBr);
+    };
+    const reduceInlineTextElements = (editor, merge) => {
+      const textInlineElements = editor.schema.getTextInlineElements();
+      const dom = editor.dom;
+      if (merge) {
+        const root = editor.getBody();
+        const elementUtils = ElementUtils(dom);
+        Tools.each(dom.select('*[data-mce-fragment]'), node => {
+          const isInline = isNonNullable(textInlineElements[node.nodeName.toLowerCase()]);
+          if (isInline && hasInheritableStyles(dom, node)) {
+            for (let parentNode = node.parentNode; isNonNullable(parentNode) && parentNode !== root; parentNode = parentNode.parentNode) {
+              const styleConflict = hasStyleConflict(dom, node, parentNode);
+              if (styleConflict) {
+                break;
+              }
+              if (elementUtils.compare(parentNode, node)) {
+                dom.remove(node, true);
+                break;
+              }
+            }
+          }
+        });
+      }
+    };
+    const markFragmentElements = fragment => {
+      let node = fragment;
+      while (node = node.walk()) {
+        if (node.type === 1) {
+          node.attr('data-mce-fragment', '1');
+        }
+      }
+    };
+    const unmarkFragmentElements = elm => {
+      Tools.each(elm.getElementsByTagName('*'), elm => {
+        elm.removeAttribute('data-mce-fragment');
+      });
+    };
+    const isPartOfFragment = node => {
+      return !!node.getAttribute('data-mce-fragment');
+    };
+    const canHaveChildren = (editor, node) => {
+      return node && !editor.schema.getVoidElements()[node.nodeName];
+    };
+    const moveSelectionToMarker = (editor, marker) => {
+      let nextRng;
+      const dom = editor.dom;
+      const selection = editor.selection;
+      if (!marker) {
+        return;
+      }
+      selection.scrollIntoView(marker);
+      const parentEditableElm = getContentEditableRoot$1(editor.getBody(), marker);
+      if (dom.getContentEditable(parentEditableElm) === 'false') {
+        dom.remove(marker);
+        selection.select(parentEditableElm);
+        return;
+      }
+      let rng = dom.createRng();
+      const node = marker.previousSibling;
+      if (isText$8(node)) {
+        rng.setStart(node, node.nodeValue.length);
+        const node2 = marker.nextSibling;
+        if (isText$8(node2)) {
+          node.appendData(node2.data);
+          node2.parentNode.removeChild(node2);
+        }
+      } else {
+        rng.setStartBefore(marker);
+        rng.setEndBefore(marker);
+      }
+      const findNextCaretRng = rng => {
+        let caretPos = CaretPosition.fromRangeStart(rng);
+        const caretWalker = CaretWalker(editor.getBody());
+        caretPos = caretWalker.next(caretPos);
+        if (caretPos) {
+          return caretPos.toRange();
+        }
+      };
+      const parentBlock = dom.getParent(marker, dom.isBlock);
+      dom.remove(marker);
+      if (parentBlock && dom.isEmpty(parentBlock)) {
+        empty(SugarElement.fromDom(parentBlock));
+        rng.setStart(parentBlock, 0);
+        rng.setEnd(parentBlock, 0);
+        if (!isTableCell$1(parentBlock) && !isPartOfFragment(parentBlock) && (nextRng = findNextCaretRng(rng))) {
+          rng = nextRng;
+          dom.remove(parentBlock);
+        } else {
+          dom.add(parentBlock, dom.create('br', { 'data-mce-bogus': '1' }));
+        }
+      }
+      selection.setRng(rng);
+    };
+    const deleteSelectedContent = editor => {
+      const dom = editor.dom;
+      const rng = normalize(editor.selection.getRng());
+      editor.selection.setRng(rng);
+      const startCell = dom.getParent(rng.startContainer, isTableCell$1);
+      if (isTableCellContentSelected(dom, rng, startCell)) {
+        deleteCellContents(editor, rng, SugarElement.fromDom(startCell));
+      } else {
+        editor.getDoc().execCommand('Delete', false, null);
+      }
+    };
+    const insertHtmlAtCaret = (editor, value, details) => {
+      let parentNode;
+      let rng, node;
+      const selection = editor.selection;
+      const dom = editor.dom;
+      const parser = editor.parser;
+      const merge = details.merge;
+      const serializer = HtmlSerializer({ validate: true }, editor.schema);
+      const bookmarkHtml = '<span id="mce_marker" data-mce-type="bookmark">&#xFEFF;</span>';
+      if (value.indexOf('{$caret}') === -1) {
+        value += '{$caret}';
+      }
+      value = value.replace(/\{\$caret\}/, bookmarkHtml);
+      rng = selection.getRng();
+      const caretElement = rng.startContainer || (rng.parentElement ? rng.parentElement() : null);
+      const body = editor.getBody();
+      if (caretElement === body && selection.isCollapsed()) {
+        if (dom.isBlock(body.firstChild) && canHaveChildren(editor, body.firstChild) && dom.isEmpty(body.firstChild)) {
+          rng = dom.createRng();
+          rng.setStart(body.firstChild, 0);
+          rng.setEnd(body.firstChild, 0);
+          selection.setRng(rng);
+        }
+      }
+      if (!selection.isCollapsed()) {
+        deleteSelectedContent(editor);
+      }
+      parentNode = selection.getNode();
+      const parserArgs = {
+        context: parentNode.nodeName.toLowerCase(),
+        data: details.data,
+        insert: true
+      };
+      const fragment = parser.parse(value, parserArgs);
+      if (details.paste === true && isListFragment(editor.schema, fragment) && isParentBlockLi(dom, parentNode)) {
+        rng = insertAtCaret$1(serializer, dom, selection.getRng(), fragment);
+        selection.setRng(rng);
+        return value;
+      }
+      markFragmentElements(fragment);
+      node = fragment.lastChild;
+      if (node.attr('id') === 'mce_marker') {
+        const marker = node;
+        for (node = node.prev; node; node = node.walk(true)) {
+          if (node.type === 3 || !dom.isBlock(node.name)) {
+            if (editor.schema.isValidChild(node.parent.name, 'span')) {
+              node.parent.insert(marker, node, node.name === 'br');
+            }
+            break;
+          }
+        }
+      }
+      editor._selectionOverrides.showBlockCaretContainer(parentNode);
+      if (!parserArgs.invalid) {
+        value = serializer.serialize(fragment);
+        validInsertion(editor, value, parentNode);
+      } else {
+        editor.selection.setContent(bookmarkHtml);
+        parentNode = selection.getNode();
+        const rootNode = editor.getBody();
+        if (parentNode.nodeType === 9) {
+          parentNode = node = rootNode;
+        } else {
+          node = parentNode;
+        }
+        while (node !== rootNode) {
+          parentNode = node;
+          node = node.parentNode;
+        }
+        value = parentNode === rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode);
+        const root = parser.parse(value);
+        for (let markerNode = root; markerNode; markerNode = markerNode.walk()) {
+          if (markerNode.attr('id') === 'mce_marker') {
+            markerNode.replace(fragment);
+            break;
+          }
+        }
+        const toExtract = fragment.children();
+        const parent = fragment.parent.name;
+        fragment.unwrap();
+        const invalidChildren = filter$6(toExtract, node => !editor.schema.isValidChild(parent, node.name));
+        cleanInvalidNodes(invalidChildren, editor.schema);
+        filter$3(parser.getNodeFilters(), parser.getAttributeFilters(), root);
+        value = serializer.serialize(root);
+        if (parentNode === rootNode) {
+          dom.setHTML(rootNode, value);
+        } else {
+          dom.setOuterHTML(parentNode, value);
+        }
+      }
+      reduceInlineTextElements(editor, merge);
+      moveSelectionToMarker(editor, dom.get('mce_marker'));
+      unmarkFragmentElements(editor.getBody());
+      trimBrsFromTableCell(dom, selection.getStart());
+      return value;
+    };
+
+    const isTreeNode = content => content instanceof AstNode;
+
+    const moveSelection = editor => {
+      if (hasFocus(editor)) {
+        firstPositionIn(editor.getBody()).each(pos => {
+          const node = pos.getNode();
+          const caretPos = isTable$3(node) ? firstPositionIn(node).getOr(pos) : pos;
+          editor.selection.setRng(caretPos.toRange());
+        });
+      }
+    };
+    const setEditorHtml = (editor, html, noSelection) => {
+      editor.dom.setHTML(editor.getBody(), html);
+      if (noSelection !== true) {
+        moveSelection(editor);
+      }
+    };
+    const setContentString = (editor, body, content, args) => {
+      if (content.length === 0 || /^\s+$/.test(content)) {
+        const padd = '<br data-mce-bogus="1">';
+        if (body.nodeName === 'TABLE') {
+          content = '<tr><td>' + padd + '</td></tr>';
+        } else if (/^(UL|OL)$/.test(body.nodeName)) {
+          content = '<li>' + padd + '</li>';
+        }
+        const forcedRootBlockName = getForcedRootBlock(editor);
+        if (editor.schema.isValidChild(body.nodeName.toLowerCase(), forcedRootBlockName.toLowerCase())) {
+          content = padd;
+          content = editor.dom.createHTML(forcedRootBlockName, getForcedRootBlockAttrs(editor), content);
+        } else if (!content) {
+          content = padd;
+        }
+        setEditorHtml(editor, content, args.no_selection);
+        return {
+          content,
+          html: content
+        };
+      } else {
+        if (args.format !== 'raw') {
+          content = HtmlSerializer({ validate: false }, editor.schema).serialize(editor.parser.parse(content, {
+            isRootContent: true,
+            insert: true
+          }));
+        }
+        const trimmedHtml = isWsPreserveElement(SugarElement.fromDom(body)) ? content : Tools.trim(content);
+        setEditorHtml(editor, trimmedHtml, args.no_selection);
+        return {
+          content: trimmedHtml,
+          html: trimmedHtml
+        };
+      }
+    };
+    const setContentTree = (editor, body, content, args) => {
+      filter$3(editor.parser.getNodeFilters(), editor.parser.getAttributeFilters(), content);
+      const html = HtmlSerializer({ validate: false }, editor.schema).serialize(content);
+      const trimmedHtml = isWsPreserveElement(SugarElement.fromDom(body)) ? html : Tools.trim(html);
+      setEditorHtml(editor, trimmedHtml, args.no_selection);
+      return {
+        content,
+        html: trimmedHtml
+      };
+    };
+    const setContentInternal = (editor, content, args) => {
+      return Optional.from(editor.getBody()).map(body => {
+        if (isTreeNode(content)) {
+          return setContentTree(editor, body, content, args);
+        } else {
+          return setContentString(editor, body, content, args);
+        }
+      }).getOr({
+        content,
+        html: isTreeNode(args.content) ? '' : args.content
+      });
+    };
+
+    const sibling = (scope, predicate) => sibling$1(scope, predicate).isSome();
+
+    const ensureIsRoot = isRoot => isFunction(isRoot) ? isRoot : never;
+    const ancestor = (scope, transform, isRoot) => {
+      let element = scope.dom;
+      const stop = ensureIsRoot(isRoot);
+      while (element.parentNode) {
+        element = element.parentNode;
+        const el = SugarElement.fromDom(element);
+        const transformed = transform(el);
+        if (transformed.isSome()) {
+          return transformed;
+        } else if (stop(el)) {
+          break;
+        }
+      }
+      return Optional.none();
+    };
+    const closest$2 = (scope, transform, isRoot) => {
+      const current = transform(scope);
+      const stop = ensureIsRoot(isRoot);
+      return current.orThunk(() => stop(scope) ? Optional.none() : ancestor(scope, transform, stop));
+    };
+
+    const isEq$3 = isEq$5;
+    const matchesUnInheritedFormatSelector = (ed, node, name) => {
+      const formatList = ed.formatter.get(name);
+      if (formatList) {
+        for (let i = 0; i < formatList.length; i++) {
+          const format = formatList[i];
+          if (isSelectorFormat(format) && format.inherit === false && ed.dom.is(node, format.selector)) {
+            return true;
+          }
+        }
+      }
+      return false;
+    };
+    const matchParents = (editor, node, name, vars, similar) => {
+      const root = editor.dom.getRoot();
+      if (node === root) {
+        return false;
+      }
+      node = editor.dom.getParent(node, node => {
+        if (matchesUnInheritedFormatSelector(editor, node, name)) {
+          return true;
+        }
+        return node.parentNode === root || !!matchNode(editor, node, name, vars, true);
+      });
+      return !!matchNode(editor, node, name, vars, similar);
+    };
+    const matchName = (dom, node, format) => {
+      if (isInlineFormat(format) && isEq$3(node, format.inline)) {
+        return true;
+      }
+      if (isBlockFormat(format) && isEq$3(node, format.block)) {
+        return true;
+      }
+      if (isSelectorFormat(format)) {
+        return isElement$6(node) && dom.is(node, format.selector);
+      }
+      return false;
+    };
+    const matchItems = (dom, node, format, itemName, similar, vars) => {
+      const items = format[itemName];
+      if (isFunction(format.onmatch)) {
+        return format.onmatch(node, format, itemName);
+      }
+      if (items) {
+        if (isUndefined(items.length)) {
+          for (const key in items) {
+            if (has$2(items, key)) {
+              const value = itemName === 'attributes' ? dom.getAttrib(node, key) : getStyle(dom, node, key);
+              const expectedValue = replaceVars(items[key], vars);
+              const isEmptyValue = isNullable(value) || isEmpty$3(value);
+              if (isEmptyValue && isNullable(expectedValue)) {
+                continue;
+              }
+              if (similar && isEmptyValue && !format.exact) {
+                return false;
+              }
+              if ((!similar || format.exact) && !isEq$3(value, normalizeStyleValue(expectedValue, key))) {
+                return false;
+              }
+            }
+          }
+        } else {
+          for (let i = 0; i < items.length; i++) {
+            if (itemName === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(dom, node, items[i])) {
+              return true;
+            }
+          }
+        }
+      }
+      return true;
+    };
+    const matchNode = (ed, node, name, vars, similar) => {
+      const formatList = ed.formatter.get(name);
+      const dom = ed.dom;
+      if (formatList && node) {
+        for (let i = 0; i < formatList.length; i++) {
+          const format = formatList[i];
+          if (matchName(ed.dom, node, format) && matchItems(dom, node, format, 'attributes', similar, vars) && matchItems(dom, node, format, 'styles', similar, vars)) {
+            const classes = format.classes;
+            if (classes) {
+              for (let x = 0; x < classes.length; x++) {
+                if (!ed.dom.hasClass(node, replaceVars(classes[x], vars))) {
+                  return;
+                }
+              }
+            }
+            return format;
+          }
+        }
+      }
+    };
+    const match$2 = (editor, name, vars, node, similar) => {
+      if (node) {
+        return matchParents(editor, node, name, vars, similar);
+      }
+      node = editor.selection.getNode();
+      if (matchParents(editor, node, name, vars, similar)) {
+        return true;
+      }
+      const startNode = editor.selection.getStart();
+      if (startNode !== node) {
+        if (matchParents(editor, startNode, name, vars, similar)) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const matchAll = (editor, names, vars) => {
+      const matchedFormatNames = [];
+      const checkedMap = {};
+      const startElement = editor.selection.getStart();
+      editor.dom.getParent(startElement, node => {
+        for (let i = 0; i < names.length; i++) {
+          const name = names[i];
+          if (!checkedMap[name] && matchNode(editor, node, name, vars)) {
+            checkedMap[name] = true;
+            matchedFormatNames.push(name);
+          }
+        }
+      }, editor.dom.getRoot());
+      return matchedFormatNames;
+    };
+    const closest$1 = (editor, names) => {
+      const isRoot = elm => eq(elm, SugarElement.fromDom(editor.getBody()));
+      const match = (elm, name) => matchNode(editor, elm.dom, name) ? Optional.some(name) : Optional.none();
+      return Optional.from(editor.selection.getStart(true)).bind(rawElm => closest$2(SugarElement.fromDom(rawElm), elm => findMap(names, name => match(elm, name)), isRoot)).getOrNull();
+    };
+    const canApply = (editor, name) => {
+      const formatList = editor.formatter.get(name);
+      const dom = editor.dom;
+      if (formatList) {
+        const startNode = editor.selection.getStart();
+        const parents = getParents$2(dom, startNode);
+        for (let x = formatList.length - 1; x >= 0; x--) {
+          const format = formatList[x];
+          if (!isSelectorFormat(format)) {
+            return true;
+          }
+          for (let i = parents.length - 1; i >= 0; i--) {
+            if (dom.is(parents[i], format.selector)) {
+              return true;
+            }
+          }
+        }
+      }
+      return false;
+    };
+    const matchAllOnNode = (editor, node, formatNames) => foldl(formatNames, (acc, name) => {
+      const matchSimilar = isVariableFormatName(editor, name);
+      if (editor.formatter.matchNode(node, name, {}, matchSimilar)) {
+        return acc.concat([name]);
+      } else {
+        return acc;
+      }
+    }, []);
+
+    const ZWSP = ZWSP$1, CARET_ID = '_mce_caret';
+    const importNode = (ownerDocument, node) => {
+      return ownerDocument.importNode(node, true);
+    };
+    const getEmptyCaretContainers = node => {
+      const nodes = [];
+      while (node) {
+        if (node.nodeType === 3 && node.nodeValue !== ZWSP || node.childNodes.length > 1) {
+          return [];
+        }
+        if (node.nodeType === 1) {
+          nodes.push(node);
+        }
+        node = node.firstChild;
+      }
+      return nodes;
+    };
+    const isCaretContainerEmpty = node => {
+      return getEmptyCaretContainers(node).length > 0;
+    };
+    const findFirstTextNode = node => {
+      if (node) {
+        const walker = new DomTreeWalker(node, node);
+        for (node = walker.current(); node; node = walker.next()) {
+          if (isText$8(node)) {
+            return node;
+          }
+        }
+      }
+      return null;
+    };
+    const createCaretContainer = fill => {
+      const caretContainer = SugarElement.fromTag('span');
+      setAll$1(caretContainer, {
+        'id': CARET_ID,
+        'data-mce-bogus': '1',
+        'data-mce-type': 'format-caret'
+      });
+      if (fill) {
+        append$1(caretContainer, SugarElement.fromText(ZWSP));
+      }
+      return caretContainer;
+    };
+    const trimZwspFromCaretContainer = caretContainerNode => {
+      const textNode = findFirstTextNode(caretContainerNode);
+      if (textNode && textNode.nodeValue.charAt(0) === ZWSP) {
+        textNode.deleteData(0, 1);
+      }
+      return textNode;
+    };
+    const removeCaretContainerNode = (editor, node, moveCaret = true) => {
+      const dom = editor.dom, selection = editor.selection;
+      if (isCaretContainerEmpty(node)) {
+        deleteElement$2(editor, false, SugarElement.fromDom(node), moveCaret);
+      } else {
+        const rng = selection.getRng();
+        const block = dom.getParent(node, dom.isBlock);
+        const startContainer = rng.startContainer;
+        const startOffset = rng.startOffset;
+        const endContainer = rng.endContainer;
+        const endOffset = rng.endOffset;
+        const textNode = trimZwspFromCaretContainer(node);
+        dom.remove(node, true);
+        if (startContainer === textNode && startOffset > 0) {
+          rng.setStart(textNode, startOffset - 1);
+        }
+        if (endContainer === textNode && endOffset > 0) {
+          rng.setEnd(textNode, endOffset - 1);
+        }
+        if (block && dom.isEmpty(block)) {
+          fillWithPaddingBr(SugarElement.fromDom(block));
+        }
+        selection.setRng(rng);
+      }
+    };
+    const removeCaretContainer = (editor, node, moveCaret = true) => {
+      const dom = editor.dom, selection = editor.selection;
+      if (!node) {
+        node = getParentCaretContainer(editor.getBody(), selection.getStart());
+        if (!node) {
+          while (node = dom.get(CARET_ID)) {
+            removeCaretContainerNode(editor, node, false);
+          }
+        }
+      } else {
+        removeCaretContainerNode(editor, node, moveCaret);
+      }
+    };
+    const insertCaretContainerNode = (editor, caretContainer, formatNode) => {
+      const dom = editor.dom, block = dom.getParent(formatNode, curry(isTextBlock$1, editor));
+      if (block && dom.isEmpty(block)) {
+        formatNode.parentNode.replaceChild(caretContainer, formatNode);
+      } else {
+        removeTrailingBr(SugarElement.fromDom(formatNode));
+        if (dom.isEmpty(formatNode)) {
+          formatNode.parentNode.replaceChild(caretContainer, formatNode);
+        } else {
+          dom.insertAfter(caretContainer, formatNode);
+        }
+      }
+    };
+    const appendNode = (parentNode, node) => {
+      parentNode.appendChild(node);
+      return node;
+    };
+    const insertFormatNodesIntoCaretContainer = (formatNodes, caretContainer) => {
+      const innerMostFormatNode = foldr(formatNodes, (parentNode, formatNode) => {
+        return appendNode(parentNode, formatNode.cloneNode(false));
+      }, caretContainer);
+      return appendNode(innerMostFormatNode, innerMostFormatNode.ownerDocument.createTextNode(ZWSP));
+    };
+    const cleanFormatNode = (editor, caretContainer, formatNode, name, vars, similar) => {
+      const formatter = editor.formatter;
+      const dom = editor.dom;
+      const validFormats = filter$6(keys(formatter.get()), formatName => formatName !== name && !contains$1(formatName, 'removeformat'));
+      const matchedFormats = matchAllOnNode(editor, formatNode, validFormats);
+      const uniqueFormats = filter$6(matchedFormats, fmtName => !areSimilarFormats(editor, fmtName, name));
+      if (uniqueFormats.length > 0) {
+        const clonedFormatNode = formatNode.cloneNode(false);
+        dom.add(caretContainer, clonedFormatNode);
+        formatter.remove(name, vars, clonedFormatNode, similar);
+        dom.remove(clonedFormatNode);
+        return Optional.some(clonedFormatNode);
+      } else {
+        return Optional.none();
+      }
+    };
+    const applyCaretFormat = (editor, name, vars) => {
+      let caretContainer, textNode;
+      const selection = editor.selection;
+      const selectionRng = selection.getRng();
+      let offset = selectionRng.startOffset;
+      const container = selectionRng.startContainer;
+      const text = container.nodeValue;
+      caretContainer = getParentCaretContainer(editor.getBody(), selection.getStart());
+      if (caretContainer) {
+        textNode = findFirstTextNode(caretContainer);
+      }
+      const wordcharRegex = /[^\s\u00a0\u00ad\u200b\ufeff]/;
+      if (text && offset > 0 && offset < text.length && wordcharRegex.test(text.charAt(offset)) && wordcharRegex.test(text.charAt(offset - 1))) {
+        const bookmark = selection.getBookmark();
+        selectionRng.collapse(true);
+        let rng = expandRng(editor, selectionRng, editor.formatter.get(name));
+        rng = split(rng);
+        editor.formatter.apply(name, vars, rng);
+        selection.moveToBookmark(bookmark);
+      } else {
+        if (!caretContainer || textNode.nodeValue !== ZWSP) {
+          caretContainer = importNode(editor.getDoc(), createCaretContainer(true).dom);
+          textNode = caretContainer.firstChild;
+          selectionRng.insertNode(caretContainer);
+          offset = 1;
+          editor.formatter.apply(name, vars, caretContainer);
+        } else {
+          editor.formatter.apply(name, vars, caretContainer);
+        }
+        selection.setCursorLocation(textNode, offset);
+      }
+    };
+    const removeCaretFormat = (editor, name, vars, similar) => {
+      const dom = editor.dom;
+      const selection = editor.selection;
+      let hasContentAfter, node, formatNode;
+      const parents = [];
+      const rng = selection.getRng();
+      const container = rng.startContainer;
+      const offset = rng.startOffset;
+      node = container;
+      if (container.nodeType === 3) {
+        if (offset !== container.nodeValue.length) {
+          hasContentAfter = true;
+        }
+        node = node.parentNode;
+      }
+      while (node) {
+        if (matchNode(editor, node, name, vars, similar)) {
+          formatNode = node;
+          break;
+        }
+        if (node.nextSibling) {
+          hasContentAfter = true;
+        }
+        parents.push(node);
+        node = node.parentNode;
+      }
+      if (!formatNode) {
+        return;
+      }
+      if (hasContentAfter) {
+        const bookmark = selection.getBookmark();
+        rng.collapse(true);
+        let expandedRng = expandRng(editor, rng, editor.formatter.get(name), true);
+        expandedRng = split(expandedRng);
+        editor.formatter.remove(name, vars, expandedRng, similar);
+        selection.moveToBookmark(bookmark);
+      } else {
+        const caretContainer = getParentCaretContainer(editor.getBody(), formatNode);
+        const newCaretContainer = createCaretContainer(false).dom;
+        insertCaretContainerNode(editor, newCaretContainer, caretContainer !== null ? caretContainer : formatNode);
+        const cleanedFormatNode = cleanFormatNode(editor, newCaretContainer, formatNode, name, vars, similar);
+        const caretTextNode = insertFormatNodesIntoCaretContainer(parents.concat(cleanedFormatNode.toArray()), newCaretContainer);
+        removeCaretContainerNode(editor, caretContainer, false);
+        selection.setCursorLocation(caretTextNode, 1);
+        if (dom.isEmpty(formatNode)) {
+          dom.remove(formatNode);
+        }
+      }
+    };
+    const disableCaretContainer = (editor, keyCode) => {
+      const selection = editor.selection, body = editor.getBody();
+      removeCaretContainer(editor, null, false);
+      if ((keyCode === 8 || keyCode === 46) && selection.isCollapsed() && selection.getStart().innerHTML === ZWSP) {
+        removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()));
+      }
+      if (keyCode === 37 || keyCode === 39) {
+        removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()));
+      }
+    };
+    const setup$u = editor => {
+      editor.on('mouseup keydown', e => {
+        disableCaretContainer(editor, e.keyCode);
+      });
+    };
+    const replaceWithCaretFormat = (targetNode, formatNodes) => {
+      const caretContainer = createCaretContainer(false);
+      const innerMost = insertFormatNodesIntoCaretContainer(formatNodes, caretContainer.dom);
+      before$3(SugarElement.fromDom(targetNode), caretContainer);
+      remove$5(SugarElement.fromDom(targetNode));
+      return CaretPosition(innerMost, 0);
+    };
+    const isFormatElement = (editor, element) => {
+      const inlineElements = editor.schema.getTextInlineElements();
+      return has$2(inlineElements, name(element)) && !isCaretNode(element.dom) && !isBogus$2(element.dom);
+    };
+    const isEmptyCaretFormatElement = element => {
+      return isCaretNode(element.dom) && isCaretContainerEmpty(element.dom);
+    };
+
+    const postProcessHooks = {};
+    const filter$2 = filter$4;
+    const each$a = each$e;
+    const addPostProcessHook = (name, hook) => {
+      const hooks = postProcessHooks[name];
+      if (!hooks) {
+        postProcessHooks[name] = [];
+      }
+      postProcessHooks[name].push(hook);
+    };
+    const postProcess$1 = (name, editor) => {
+      each$a(postProcessHooks[name], hook => {
+        hook(editor);
+      });
+    };
+    addPostProcessHook('pre', editor => {
+      const rng = editor.selection.getRng();
+      let blocks;
+      const hasPreSibling = pre => {
+        return isPre(pre.previousSibling) && indexOf(blocks, pre.previousSibling) !== -1;
+      };
+      const joinPre = (pre1, pre2) => {
+        const sPre2 = SugarElement.fromDom(pre2);
+        const doc = documentOrOwner(sPre2).dom;
+        remove$5(sPre2);
+        append(SugarElement.fromDom(pre1), [
+          SugarElement.fromTag('br', doc),
+          SugarElement.fromTag('br', doc),
+          ...children(sPre2)
+        ]);
+      };
+      const isPre = matchNodeNames(['pre']);
+      if (!rng.collapsed) {
+        blocks = editor.selection.getSelectedBlocks();
+        each$a(filter$2(filter$2(blocks, isPre), hasPreSibling), pre => {
+          joinPre(pre.previousSibling, pre);
+        });
+      }
+    });
+
+    const each$9 = Tools.each;
+    const isElementNode$1 = node => isElement$6(node) && !isBookmarkNode$1(node) && !isCaretNode(node) && !isBogus$2(node);
+    const findElementSibling = (node, siblingName) => {
+      for (let sibling = node; sibling; sibling = sibling[siblingName]) {
+        if (isText$8(sibling) && isNotEmpty(sibling.data)) {
+          return node;
+        }
+        if (isElement$6(sibling) && !isBookmarkNode$1(sibling)) {
+          return sibling;
+        }
+      }
+      return node;
+    };
+    const mergeSiblingsNodes = (dom, prev, next) => {
+      const elementUtils = ElementUtils(dom);
+      if (prev && next) {
+        prev = findElementSibling(prev, 'previousSibling');
+        next = findElementSibling(next, 'nextSibling');
+        if (elementUtils.compare(prev, next)) {
+          for (let sibling = prev.nextSibling; sibling && sibling !== next;) {
+            const tmpSibling = sibling;
+            sibling = sibling.nextSibling;
+            prev.appendChild(tmpSibling);
+          }
+          dom.remove(next);
+          Tools.each(Tools.grep(next.childNodes), node => {
+            prev.appendChild(node);
+          });
+          return prev;
+        }
+      }
+      return next;
+    };
+    const mergeSiblings = (dom, format, vars, node) => {
+      if (node && format.merge_siblings !== false) {
+        const newNode = mergeSiblingsNodes(dom, getNonWhiteSpaceSibling(node), node);
+        mergeSiblingsNodes(dom, newNode, getNonWhiteSpaceSibling(newNode, true));
+      }
+    };
+    const clearChildStyles = (dom, format, node) => {
+      if (format.clear_child_styles) {
+        const selector = format.links ? '*:not(a)' : '*';
+        each$9(dom.select(selector, node), node => {
+          if (isElementNode$1(node)) {
+            each$9(format.styles, (value, name) => {
+              dom.setStyle(node, name, '');
+            });
+          }
+        });
+      }
+    };
+    const processChildElements = (node, filter, process) => {
+      each$9(node.childNodes, node => {
+        if (isElementNode$1(node)) {
+          if (filter(node)) {
+            process(node);
+          }
+          if (node.hasChildNodes()) {
+            processChildElements(node, filter, process);
+          }
+        }
+      });
+    };
+    const unwrapEmptySpan = (dom, node) => {
+      if (node.nodeName === 'SPAN' && dom.getAttribs(node).length === 0) {
+        dom.remove(node, true);
+      }
+    };
+    const hasStyle = (dom, name) => node => !!(node && getStyle(dom, node, name));
+    const applyStyle = (dom, name, value) => node => {
+      dom.setStyle(node, name, value);
+      if (node.getAttribute('style') === '') {
+        node.removeAttribute('style');
+      }
+      unwrapEmptySpan(dom, node);
+    };
+
+    const removeResult = Adt.generate([
+      { keep: [] },
+      { rename: ['name'] },
+      { removed: [] }
+    ]);
+    const MCE_ATTR_RE = /^(src|href|style)$/;
+    const each$8 = Tools.each;
+    const isEq$2 = isEq$5;
+    const isTableCellOrRow = node => /^(TR|TH|TD)$/.test(node.nodeName);
+    const isChildOfInlineParent = (dom, node, parent) => dom.isChildOf(node, parent) && node !== parent && !dom.isBlock(parent);
+    const getContainer = (ed, rng, start) => {
+      let container = rng[start ? 'startContainer' : 'endContainer'];
+      let offset = rng[start ? 'startOffset' : 'endOffset'];
+      if (isElement$6(container)) {
+        const lastIdx = container.childNodes.length - 1;
+        if (!start && offset) {
+          offset--;
+        }
+        container = container.childNodes[offset > lastIdx ? lastIdx : offset];
+      }
+      if (isText$8(container) && start && offset >= container.nodeValue.length) {
+        container = new DomTreeWalker(container, ed.getBody()).next() || container;
+      }
+      if (isText$8(container) && !start && offset === 0) {
+        container = new DomTreeWalker(container, ed.getBody()).prev() || container;
+      }
+      return container;
+    };
+    const normalizeTableSelection = (node, start) => {
+      const prop = start ? 'firstChild' : 'lastChild';
+      if (isTableCellOrRow(node) && node[prop]) {
+        const childNode = node[prop];
+        if (node.nodeName === 'TR') {
+          return childNode[prop] || childNode;
+        } else {
+          return childNode;
+        }
+      }
+      return node;
+    };
+    const wrap$1 = (dom, node, name, attrs) => {
+      const wrapper = dom.create(name, attrs);
+      node.parentNode.insertBefore(wrapper, node);
+      wrapper.appendChild(node);
+      return wrapper;
+    };
+    const wrapWithSiblings = (dom, node, next, name, attrs) => {
+      const start = SugarElement.fromDom(node);
+      const wrapper = SugarElement.fromDom(dom.create(name, attrs));
+      const siblings = next ? nextSiblings(start) : prevSiblings(start);
+      append(wrapper, siblings);
+      if (next) {
+        before$3(start, wrapper);
+        prepend(wrapper, start);
+      } else {
+        after$4(start, wrapper);
+        append$1(wrapper, start);
+      }
+      return wrapper.dom;
+    };
+    const isColorFormatAndAnchor = (node, format) => format.links && node.nodeName === 'A';
+    const removeNode = (ed, node, format) => {
+      const parentNode = node.parentNode;
+      let rootBlockElm;
+      const dom = ed.dom;
+      const forcedRootBlock = getForcedRootBlock(ed);
+      if (isBlockFormat(format)) {
+        if (parentNode === dom.getRoot()) {
+          if (!format.list_block || !isEq$2(node, format.list_block)) {
+            each$g(from(node.childNodes), node => {
+              if (isValid(ed, forcedRootBlock, node.nodeName.toLowerCase())) {
+                if (!rootBlockElm) {
+                  rootBlockElm = wrap$1(dom, node, forcedRootBlock);
+                  dom.setAttribs(rootBlockElm, getForcedRootBlockAttrs(ed));
+                } else {
+                  rootBlockElm.appendChild(node);
+                }
+              } else {
+                rootBlockElm = null;
+              }
+            });
+          }
+        }
+      }
+      if (isMixedFormat(format) && !isEq$2(format.inline, node)) {
+        return;
+      }
+      dom.remove(node, true);
+    };
+    const removeFormatInternal = (ed, format, vars, node, compareNode) => {
+      let stylesModified;
+      const dom = ed.dom;
+      if (!matchName(dom, node, format) && !isColorFormatAndAnchor(node, format)) {
+        return removeResult.keep();
+      }
+      const elm = node;
+      if (isInlineFormat(format) && format.remove === 'all' && isArray$1(format.preserve_attributes)) {
+        const attrsToPreserve = filter$6(dom.getAttribs(elm), attr => contains$2(format.preserve_attributes, attr.name.toLowerCase()));
+        dom.removeAllAttribs(elm);
+        each$g(attrsToPreserve, attr => dom.setAttrib(elm, attr.name, attr.value));
+        if (attrsToPreserve.length > 0) {
+          return removeResult.rename('span');
+        }
+      }
+      if (format.remove !== 'all') {
+        each$8(format.styles, (value, name) => {
+          value = normalizeStyleValue(replaceVars(value, vars), name + '');
+          if (isNumber(name)) {
+            name = value;
+            compareNode = null;
+          }
+          if (format.remove_similar || (!compareNode || isEq$2(getStyle(dom, compareNode, name), value))) {
+            dom.setStyle(elm, name, '');
+          }
+          stylesModified = true;
+        });
+        if (stylesModified && dom.getAttrib(elm, 'style') === '') {
+          elm.removeAttribute('style');
+          elm.removeAttribute('data-mce-style');
+        }
+        each$8(format.attributes, (value, name) => {
+          let valueOut;
+          value = replaceVars(value, vars);
+          if (isNumber(name)) {
+            name = value;
+            compareNode = null;
+          }
+          if (format.remove_similar || (!compareNode || isEq$2(dom.getAttrib(compareNode, name), value))) {
+            if (name === 'class') {
+              value = dom.getAttrib(elm, name);
+              if (value) {
+                valueOut = '';
+                each$g(value.split(/\s+/), cls => {
+                  if (/mce\-\w+/.test(cls)) {
+                    valueOut += (valueOut ? ' ' : '') + cls;
+                  }
+                });
+                if (valueOut) {
+                  dom.setAttrib(elm, name, valueOut);
+                  return;
+                }
+              }
+            }
+            if (MCE_ATTR_RE.test(name)) {
+              elm.removeAttribute('data-mce-' + name);
+            }
+            if (name === 'style' && matchNodeNames(['li'])(elm) && dom.getStyle(elm, 'list-style-type') === 'none') {
+              elm.removeAttribute(name);
+              dom.setStyle(elm, 'list-style-type', 'none');
+              return;
+            }
+            if (name === 'class') {
+              elm.removeAttribute('className');
+            }
+            elm.removeAttribute(name);
+          }
+        });
+        each$8(format.classes, value => {
+          value = replaceVars(value, vars);
+          if (!compareNode || dom.hasClass(compareNode, value)) {
+            dom.removeClass(elm, value);
+          }
+        });
+        const attrs = dom.getAttribs(elm);
+        for (let i = 0; i < attrs.length; i++) {
+          const attrName = attrs[i].nodeName;
+          if (attrName.indexOf('_') !== 0 && attrName.indexOf('data-') !== 0) {
+            return removeResult.keep();
+          }
+        }
+      }
+      if (format.remove !== 'none') {
+        removeNode(ed, elm, format);
+        return removeResult.removed();
+      }
+      return removeResult.keep();
+    };
+    const removeFormat$1 = (ed, format, vars, node, compareNode) => removeFormatInternal(ed, format, vars, node, compareNode).fold(never, newName => {
+      ed.dom.rename(node, newName);
+      return true;
+    }, always);
+    const findFormatRoot = (editor, container, name, vars, similar) => {
+      let formatRoot;
+      each$g(getParents$2(editor.dom, container.parentNode).reverse(), parent => {
+        if (!formatRoot && parent.id !== '_start' && parent.id !== '_end') {
+          const format = matchNode(editor, parent, name, vars, similar);
+          if (format && format.split !== false) {
+            formatRoot = parent;
+          }
+        }
+      });
+      return formatRoot;
+    };
+    const removeFormatFromClone = (editor, format, vars, clone) => removeFormatInternal(editor, format, vars, clone, clone).fold(constant(clone), newName => {
+      const fragment = editor.dom.createFragment();
+      fragment.appendChild(clone);
+      return editor.dom.rename(clone, newName);
+    }, constant(null));
+    const wrapAndSplit = (editor, formatList, formatRoot, container, target, split, format, vars) => {
+      let clone, lastClone, firstClone;
+      const dom = editor.dom;
+      if (formatRoot) {
+        const formatRootParent = formatRoot.parentNode;
+        for (let parent = container.parentNode; parent && parent !== formatRootParent; parent = parent.parentNode) {
+          clone = dom.clone(parent, false);
+          for (let i = 0; i < formatList.length; i++) {
+            clone = removeFormatFromClone(editor, formatList[i], vars, clone);
+            if (clone === null) {
+              break;
+            }
+          }
+          if (clone) {
+            if (lastClone) {
+              clone.appendChild(lastClone);
+            }
+            if (!firstClone) {
+              firstClone = clone;
+            }
+            lastClone = clone;
+          }
+        }
+        if (split && (!format.mixed || !dom.isBlock(formatRoot))) {
+          container = dom.split(formatRoot, container);
+        }
+        if (lastClone) {
+          target.parentNode.insertBefore(lastClone, target);
+          firstClone.appendChild(target);
+          if (isInlineFormat(format)) {
+            mergeSiblings(dom, format, vars, lastClone);
+          }
+        }
+      }
+      return container;
+    };
+    const remove$2 = (ed, name, vars, node, similar) => {
+      const formatList = ed.formatter.get(name);
+      const format = formatList[0];
+      let contentEditable = true;
+      const dom = ed.dom;
+      const selection = ed.selection;
+      const splitToFormatRoot = container => {
+        const formatRoot = findFormatRoot(ed, container, name, vars, similar);
+        return wrapAndSplit(ed, formatList, formatRoot, container, container, true, format, vars);
+      };
+      const isRemoveBookmarkNode = node => isBookmarkNode$1(node) && isElement$6(node) && (node.id === '_start' || node.id === '_end');
+      const removeNodeFormat = node => exists(formatList, fmt => removeFormat$1(ed, fmt, vars, node, node));
+      const process = node => {
+        let lastContentEditable = true;
+        let hasContentEditableState = false;
+        if (isElement$6(node) && dom.getContentEditable(node)) {
+          lastContentEditable = contentEditable;
+          contentEditable = dom.getContentEditable(node) === 'true';
+          hasContentEditableState = true;
+        }
+        const children = from(node.childNodes);
+        if (contentEditable && !hasContentEditableState) {
+          const removed = removeNodeFormat(node);
+          const currentNodeMatches = removed || exists(formatList, f => matchName(dom, node, f));
+          const parentNode = node.parentNode;
+          if (!currentNodeMatches && isNonNullable(parentNode) && shouldExpandToSelector(format)) {
+            removeNodeFormat(parentNode);
+          }
+        }
+        if (format.deep) {
+          if (children.length) {
+            for (let i = 0; i < children.length; i++) {
+              process(children[i]);
+            }
+            if (hasContentEditableState) {
+              contentEditable = lastContentEditable;
+            }
+          }
+        }
+        const textDecorations = [
+          'underline',
+          'line-through',
+          'overline'
+        ];
+        each$g(textDecorations, decoration => {
+          if (isElement$6(node) && ed.dom.getStyle(node, 'text-decoration') === decoration && node.parentNode && getTextDecoration(dom, node.parentNode) === decoration) {
+            removeFormat$1(ed, {
+              deep: false,
+              exact: true,
+              inline: 'span',
+              styles: { textDecoration: decoration }
+            }, null, node);
+          }
+        });
+      };
+      const unwrap = start => {
+        const node = dom.get(start ? '_start' : '_end');
+        let out = node[start ? 'firstChild' : 'lastChild'];
+        if (isRemoveBookmarkNode(out)) {
+          out = out[start ? 'firstChild' : 'lastChild'];
+        }
+        if (isText$8(out) && out.data.length === 0) {
+          out = start ? node.previousSibling || node.nextSibling : node.nextSibling || node.previousSibling;
+        }
+        dom.remove(node, true);
+        return out;
+      };
+      const removeRngStyle = rng => {
+        let startContainer, endContainer;
+        let expandedRng = expandRng(ed, rng, formatList, rng.collapsed);
+        if (format.split) {
+          expandedRng = split(expandedRng);
+          startContainer = getContainer(ed, expandedRng, true);
+          endContainer = getContainer(ed, expandedRng);
+          if (startContainer !== endContainer) {
+            startContainer = normalizeTableSelection(startContainer, true);
+            endContainer = normalizeTableSelection(endContainer, false);
+            if (isChildOfInlineParent(dom, startContainer, endContainer)) {
+              const marker = Optional.from(startContainer.firstChild).getOr(startContainer);
+              splitToFormatRoot(wrapWithSiblings(dom, marker, true, 'span', {
+                'id': '_start',
+                'data-mce-type': 'bookmark'
+              }));
+              unwrap(true);
+              return;
+            }
+            if (isChildOfInlineParent(dom, endContainer, startContainer)) {
+              const marker = Optional.from(endContainer.lastChild).getOr(endContainer);
+              splitToFormatRoot(wrapWithSiblings(dom, marker, false, 'span', {
+                'id': '_end',
+                'data-mce-type': 'bookmark'
+              }));
+              unwrap(false);
+              return;
+            }
+            startContainer = wrap$1(dom, startContainer, 'span', {
+              'id': '_start',
+              'data-mce-type': 'bookmark'
+            });
+            endContainer = wrap$1(dom, endContainer, 'span', {
+              'id': '_end',
+              'data-mce-type': 'bookmark'
+            });
+            const newRng = dom.createRng();
+            newRng.setStartAfter(startContainer);
+            newRng.setEndBefore(endContainer);
+            walk$3(dom, newRng, nodes => {
+              each$g(nodes, n => {
+                if (!isBookmarkNode$1(n) && !isBookmarkNode$1(n.parentNode)) {
+                  splitToFormatRoot(n);
+                }
+              });
+            });
+            splitToFormatRoot(startContainer);
+            splitToFormatRoot(endContainer);
+            startContainer = unwrap(true);
+            endContainer = unwrap();
+          } else {
+            startContainer = endContainer = splitToFormatRoot(startContainer);
+          }
+          expandedRng.startContainer = startContainer.parentNode ? startContainer.parentNode : startContainer;
+          expandedRng.startOffset = dom.nodeIndex(startContainer);
+          expandedRng.endContainer = endContainer.parentNode ? endContainer.parentNode : endContainer;
+          expandedRng.endOffset = dom.nodeIndex(endContainer) + 1;
+        }
+        walk$3(dom, expandedRng, nodes => {
+          each$g(nodes, process);
+        });
+      };
+      if (node) {
+        if (isNode(node)) {
+          const rng = dom.createRng();
+          rng.setStartBefore(node);
+          rng.setEndAfter(node);
+          removeRngStyle(rng);
+        } else {
+          removeRngStyle(node);
+        }
+        fireFormatRemove(ed, name, node, vars);
+        return;
+      }
+      if (dom.getContentEditable(selection.getNode()) === 'false') {
+        node = selection.getNode();
+        for (let i = 0; i < formatList.length; i++) {
+          if (formatList[i].ceFalseOverride) {
+            if (removeFormat$1(ed, formatList[i], vars, node, node)) {
+              break;
+            }
+          }
+        }
+        fireFormatRemove(ed, name, node, vars);
+        return;
+      }
+      if (!selection.isCollapsed() || !isInlineFormat(format) || getCellsFromEditor(ed).length) {
+        preserve(selection, true, () => {
+          runOnRanges(ed, removeRngStyle);
+        });
+        if (isInlineFormat(format) && match$2(ed, name, vars, selection.getStart())) {
+          moveStart(dom, selection, selection.getRng());
+        }
+        ed.nodeChanged();
+      } else {
+        removeCaretFormat(ed, name, vars, similar);
+      }
+      fireFormatRemove(ed, name, node, vars);
+    };
+
+    const each$7 = Tools.each;
+    const mergeTextDecorationsAndColor = (dom, format, vars, node) => {
+      const processTextDecorationsAndColor = n => {
+        if (n.nodeType === 1 && n.parentNode && n.parentNode.nodeType === 1) {
+          const textDecoration = getTextDecoration(dom, n.parentNode);
+          if (dom.getStyle(n, 'color') && textDecoration) {
+            dom.setStyle(n, 'text-decoration', textDecoration);
+          } else if (dom.getStyle(n, 'text-decoration') === textDecoration) {
+            dom.setStyle(n, 'text-decoration', null);
+          }
+        }
+      };
+      if (format.styles && (format.styles.color || format.styles.textDecoration)) {
+        Tools.walk(node, processTextDecorationsAndColor, 'childNodes');
+        processTextDecorationsAndColor(node);
+      }
+    };
+    const mergeBackgroundColorAndFontSize = (dom, format, vars, node) => {
+      if (format.styles && format.styles.backgroundColor) {
+        processChildElements(node, hasStyle(dom, 'fontSize'), applyStyle(dom, 'backgroundColor', replaceVars(format.styles.backgroundColor, vars)));
+      }
+    };
+    const mergeSubSup = (dom, format, vars, node) => {
+      if (isInlineFormat(format) && (format.inline === 'sub' || format.inline === 'sup')) {
+        processChildElements(node, hasStyle(dom, 'fontSize'), applyStyle(dom, 'fontSize', ''));
+        dom.remove(dom.select(format.inline === 'sup' ? 'sub' : 'sup', node), true);
+      }
+    };
+    const mergeWithChildren = (editor, formatList, vars, node) => {
+      each$7(formatList, format => {
+        if (isInlineFormat(format)) {
+          each$7(editor.dom.select(format.inline, node), child => {
+            if (!isElementNode$1(child)) {
+              return;
+            }
+            removeFormat$1(editor, format, vars, child, format.exact ? child : null);
+          });
+        }
+        clearChildStyles(editor.dom, format, node);
+      });
+    };
+    const mergeWithParents = (editor, format, name, vars, node) => {
+      if (matchNode(editor, node.parentNode, name, vars)) {
+        if (removeFormat$1(editor, format, vars, node)) {
+          return;
+        }
+      }
+      if (format.merge_with_parents) {
+        editor.dom.getParent(node.parentNode, parent => {
+          if (matchNode(editor, parent, name, vars)) {
+            removeFormat$1(editor, format, vars, node);
+            return true;
+          }
+        });
+      }
+    };
+
+    const each$6 = Tools.each;
+    const isElementNode = node => {
+      return isElement$6(node) && !isBookmarkNode$1(node) && !isCaretNode(node) && !isBogus$2(node);
+    };
+    const canFormatBR = (editor, format, node, parentName) => {
+      if (canFormatEmptyLines(editor) && isInlineFormat(format)) {
+        const validBRParentElements = getTextRootBlockElements(editor.schema);
+        const hasCaretNodeSibling = sibling(SugarElement.fromDom(node), sibling => isCaretNode(sibling.dom));
+        return hasNonNullableKey(validBRParentElements, parentName) && isEmpty$2(SugarElement.fromDom(node.parentNode), false) && !hasCaretNodeSibling;
+      } else {
+        return false;
+      }
+    };
+    const applyFormat$1 = (ed, name, vars, node) => {
+      const formatList = ed.formatter.get(name);
+      const format = formatList[0];
+      const isCollapsed = !node && ed.selection.isCollapsed();
+      const dom = ed.dom;
+      const selection = ed.selection;
+      const setElementFormat = (elm, fmt = format) => {
+        if (isFunction(fmt.onformat)) {
+          fmt.onformat(elm, fmt, vars, node);
+        }
+        each$6(fmt.styles, (value, name) => {
+          dom.setStyle(elm, name, replaceVars(value, vars));
+        });
+        if (fmt.styles) {
+          const styleVal = dom.getAttrib(elm, 'style');
+          if (styleVal) {
+            dom.setAttrib(elm, 'data-mce-style', styleVal);
+          }
+        }
+        each$6(fmt.attributes, (value, name) => {
+          dom.setAttrib(elm, name, replaceVars(value, vars));
+        });
+        each$6(fmt.classes, value => {
+          value = replaceVars(value, vars);
+          if (!dom.hasClass(elm, value)) {
+            dom.addClass(elm, value);
+          }
+        });
+      };
+      const applyNodeStyle = (formatList, node) => {
+        let found = false;
+        each$6(formatList, format => {
+          if (!isSelectorFormat(format)) {
+            return false;
+          }
+          if (isNonNullable(format.collapsed) && format.collapsed !== isCollapsed) {
+            return;
+          }
+          if (dom.is(node, format.selector) && !isCaretNode(node)) {
+            setElementFormat(node, format);
+            found = true;
+            return false;
+          }
+        });
+        return found;
+      };
+      const createWrapElement = wrapName => {
+        if (isString(wrapName)) {
+          const wrapElm = dom.create(wrapName);
+          setElementFormat(wrapElm);
+          return wrapElm;
+        } else {
+          return null;
+        }
+      };
+      const applyRngStyle = (dom, rng, nodeSpecific) => {
+        const newWrappers = [];
+        let contentEditable = true;
+        const wrapName = format.inline || format.block;
+        const wrapElm = createWrapElement(wrapName);
+        walk$3(dom, rng, nodes => {
+          let currentWrapElm;
+          const process = node => {
+            let hasContentEditableState = false;
+            let lastContentEditable = contentEditable;
+            const nodeName = node.nodeName.toLowerCase();
+            const parentNode = node.parentNode;
+            const parentName = parentNode.nodeName.toLowerCase();
+            if (isElement$6(node) && dom.getContentEditable(node)) {
+              lastContentEditable = contentEditable;
+              contentEditable = dom.getContentEditable(node) === 'true';
+              hasContentEditableState = true;
+            }
+            if (isBr$5(node) && !canFormatBR(ed, format, node, parentName)) {
+              currentWrapElm = null;
+              if (isBlockFormat(format)) {
+                dom.remove(node);
+              }
+              return;
+            }
+            if (isBlockFormat(format) && format.wrapper && matchNode(ed, node, name, vars)) {
+              currentWrapElm = null;
+              return;
+            }
+            if (contentEditable && !hasContentEditableState && isBlockFormat(format) && !format.wrapper && isTextBlock$1(ed, nodeName) && isValid(ed, parentName, wrapName)) {
+              const elm = dom.rename(node, wrapName);
+              setElementFormat(elm);
+              newWrappers.push(elm);
+              currentWrapElm = null;
+              return;
+            }
+            if (isSelectorFormat(format)) {
+              let found = applyNodeStyle(formatList, node);
+              if (!found && isNonNullable(parentNode) && shouldExpandToSelector(format)) {
+                found = applyNodeStyle(formatList, parentNode);
+              }
+              if (!isInlineFormat(format) || found) {
+                currentWrapElm = null;
+                return;
+              }
+            }
+            if (contentEditable && !hasContentEditableState && isValid(ed, wrapName, nodeName) && isValid(ed, parentName, wrapName) && !(!nodeSpecific && isText$8(node) && isZwsp(node.data)) && !isCaretNode(node) && (!isInlineFormat(format) || !dom.isBlock(node))) {
+              if (!currentWrapElm) {
+                currentWrapElm = dom.clone(wrapElm, false);
+                node.parentNode.insertBefore(currentWrapElm, node);
+                newWrappers.push(currentWrapElm);
+              }
+              currentWrapElm.appendChild(node);
+            } else {
+              currentWrapElm = null;
+              each$g(from(node.childNodes), process);
+              if (hasContentEditableState) {
+                contentEditable = lastContentEditable;
+              }
+              currentWrapElm = null;
+            }
+          };
+          each$g(nodes, process);
+        });
+        if (format.links === true) {
+          each$g(newWrappers, node => {
+            const process = node => {
+              if (node.nodeName === 'A') {
+                setElementFormat(node, format);
+              }
+              each$g(from(node.childNodes), process);
+            };
+            process(node);
+          });
+        }
+        each$g(newWrappers, node => {
+          const getChildCount = node => {
+            let count = 0;
+            each$g(node.childNodes, node => {
+              if (!isEmptyTextNode$1(node) && !isBookmarkNode$1(node)) {
+                count++;
+              }
+            });
+            return count;
+          };
+          const mergeStyles = node => {
+            const childElement = find$2(node.childNodes, isElementNode).filter(child => matchName(dom, child, format));
+            return childElement.map(child => {
+              const clone = dom.clone(child, false);
+              setElementFormat(clone);
+              dom.replace(clone, node, true);
+              dom.remove(child, true);
+              return clone;
+            }).getOr(node);
+          };
+          const childCount = getChildCount(node);
+          if ((newWrappers.length > 1 || !dom.isBlock(node)) && childCount === 0) {
+            dom.remove(node, true);
+            return;
+          }
+          if (isInlineFormat(format) || isBlockFormat(format) && format.wrapper) {
+            if (!format.exact && childCount === 1) {
+              node = mergeStyles(node);
+            }
+            mergeWithChildren(ed, formatList, vars, node);
+            mergeWithParents(ed, format, name, vars, node);
+            mergeBackgroundColorAndFontSize(dom, format, vars, node);
+            mergeTextDecorationsAndColor(dom, format, vars, node);
+            mergeSubSup(dom, format, vars, node);
+            mergeSiblings(dom, format, vars, node);
+          }
+        });
+      };
+      if (dom.getContentEditable(selection.getNode()) === 'false') {
+        node = selection.getNode();
+        for (let i = 0, l = formatList.length; i < l; i++) {
+          const formatItem = formatList[i];
+          if (formatItem.ceFalseOverride && isSelectorFormat(formatItem) && dom.is(node, formatItem.selector)) {
+            setElementFormat(node, formatItem);
+            break;
+          }
+        }
+        fireFormatApply(ed, name, node, vars);
+        return;
+      }
+      if (format) {
+        if (node) {
+          if (isNode(node)) {
+            if (!applyNodeStyle(formatList, node)) {
+              const rng = dom.createRng();
+              rng.setStartBefore(node);
+              rng.setEndAfter(node);
+              applyRngStyle(dom, expandRng(ed, rng, formatList), true);
+            }
+          } else {
+            applyRngStyle(dom, node, true);
+          }
+        } else {
+          if (!isCollapsed || !isInlineFormat(format) || getCellsFromEditor(ed).length) {
+            selection.setRng(normalize(selection.getRng()));
+            preserve(selection, true, () => {
+              runOnRanges(ed, (selectionRng, fake) => {
+                const expandedRng = fake ? selectionRng : expandRng(ed, selectionRng, formatList);
+                applyRngStyle(dom, expandedRng, false);
+              });
+            });
+            moveStart(dom, selection, selection.getRng());
+            ed.nodeChanged();
+          } else {
+            applyCaretFormat(ed, name, vars);
+          }
+        }
+        postProcess$1(name, ed);
+      }
+      fireFormatApply(ed, name, node, vars);
+    };
+
+    const hasVars = value => has$2(value, 'vars');
+    const setup$t = (registeredFormatListeners, editor) => {
+      registeredFormatListeners.set({});
+      editor.on('NodeChange', e => {
+        updateAndFireChangeCallbacks(editor, e.element, registeredFormatListeners.get());
+      });
+      editor.on('FormatApply FormatRemove', e => {
+        const element = Optional.from(e.node).map(nodeOrRange => isNode(nodeOrRange) ? nodeOrRange : nodeOrRange.startContainer).bind(node => isElement$6(node) ? Optional.some(node) : Optional.from(node.parentElement)).getOrThunk(() => fallbackElement(editor));
+        updateAndFireChangeCallbacks(editor, element, registeredFormatListeners.get());
+      });
+    };
+    const fallbackElement = editor => editor.selection.getStart();
+    const matchingNode = (editor, parents, format, similar, vars) => {
+      const isMatchingNode = node => {
+        const matchingFormat = editor.formatter.matchNode(node, format, vars !== null && vars !== void 0 ? vars : {}, similar);
+        return !isUndefined(matchingFormat);
+      };
+      const isUnableToMatch = node => {
+        if (matchesUnInheritedFormatSelector(editor, node, format)) {
+          return true;
+        } else {
+          if (!similar) {
+            return isNonNullable(editor.formatter.matchNode(node, format, vars, true));
+          } else {
+            return false;
+          }
+        }
+      };
+      return findUntil$1(parents, isMatchingNode, isUnableToMatch);
+    };
+    const getParents = (editor, elm) => {
+      const element = elm !== null && elm !== void 0 ? elm : fallbackElement(editor);
+      return filter$6(getParents$2(editor.dom, element), node => isElement$6(node) && !isBogus$2(node));
+    };
+    const updateAndFireChangeCallbacks = (editor, elm, registeredCallbacks) => {
+      const parents = getParents(editor, elm);
+      each$f(registeredCallbacks, (data, format) => {
+        const runIfChanged = spec => {
+          const match = matchingNode(editor, parents, format, spec.similar, hasVars(spec) ? spec.vars : undefined);
+          const isSet = match.isSome();
+          if (spec.state.get() !== isSet) {
+            spec.state.set(isSet);
+            const node = match.getOr(elm);
+            if (hasVars(spec)) {
+              spec.callback(isSet, {
+                node,
+                format,
+                parents
+              });
+            } else {
+              each$g(spec.callbacks, callback => callback(isSet, {
+                node,
+                format,
+                parents
+              }));
+            }
+          }
+        };
+        each$g([
+          data.withSimilar,
+          data.withoutSimilar
+        ], runIfChanged);
+        each$g(data.withVars, runIfChanged);
+      });
+    };
+    const addListeners = (editor, registeredFormatListeners, formats, callback, similar, vars) => {
+      const formatChangeItems = registeredFormatListeners.get();
+      each$g(formats.split(','), format => {
+        const group = get$a(formatChangeItems, format).getOrThunk(() => {
+          const base = {
+            withSimilar: {
+              state: Cell(false),
+              similar: true,
+              callbacks: []
+            },
+            withoutSimilar: {
+              state: Cell(false),
+              similar: false,
+              callbacks: []
+            },
+            withVars: []
+          };
+          formatChangeItems[format] = base;
+          return base;
+        });
+        const getCurrent = () => {
+          const parents = getParents(editor);
+          return matchingNode(editor, parents, format, similar, vars).isSome();
+        };
+        if (isUndefined(vars)) {
+          const toAppendTo = similar ? group.withSimilar : group.withoutSimilar;
+          toAppendTo.callbacks.push(callback);
+          if (toAppendTo.callbacks.length === 1) {
+            toAppendTo.state.set(getCurrent());
+          }
+        } else {
+          group.withVars.push({
+            state: Cell(getCurrent()),
+            similar,
+            vars,
+            callback
+          });
+        }
+      });
+      registeredFormatListeners.set(formatChangeItems);
+    };
+    const removeListeners = (registeredFormatListeners, formats, callback) => {
+      const formatChangeItems = registeredFormatListeners.get();
+      each$g(formats.split(','), format => get$a(formatChangeItems, format).each(group => {
+        formatChangeItems[format] = {
+          withSimilar: {
+            ...group.withSimilar,
+            callbacks: filter$6(group.withSimilar.callbacks, cb => cb !== callback)
+          },
+          withoutSimilar: {
+            ...group.withoutSimilar,
+            callbacks: filter$6(group.withoutSimilar.callbacks, cb => cb !== callback)
+          },
+          withVars: filter$6(group.withVars, item => item.callback !== callback)
+        };
+      }));
+      registeredFormatListeners.set(formatChangeItems);
+    };
+    const formatChangedInternal = (editor, registeredFormatListeners, formats, callback, similar, vars) => {
+      if (registeredFormatListeners.get() === null) {
+        setup$t(registeredFormatListeners, editor);
+      }
+      addListeners(editor, registeredFormatListeners, formats, callback, similar, vars);
+      return { unbind: () => removeListeners(registeredFormatListeners, formats, callback) };
+    };
+
+    const toggle = (editor, name, vars, node) => {
+      const fmt = editor.formatter.get(name);
+      if (match$2(editor, name, vars, node) && (!('toggle' in fmt[0]) || fmt[0].toggle)) {
+        remove$2(editor, name, vars, node);
+      } else {
+        applyFormat$1(editor, name, vars, node);
+      }
+    };
+
+    function _toConsumableArray(arr) {
+      if (Array.isArray(arr)) {
+        for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
+          arr2[i] = arr[i];
+        }
+        return arr2;
+      } else {
+        return Array.from(arr);
+      }
+    }
+    var hasOwnProperty = Object.hasOwnProperty, setPrototypeOf = Object.setPrototypeOf, isFrozen = Object.isFrozen, getPrototypeOf = Object.getPrototypeOf, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+    var freeze = Object.freeze, seal = Object.seal, create$7 = Object.create;
+    var _ref = typeof Reflect !== 'undefined' && Reflect, apply = _ref.apply, construct = _ref.construct;
+    if (!apply) {
+      apply = function apply(fun, thisValue, args) {
+        return fun.apply(thisValue, args);
+      };
+    }
+    if (!freeze) {
+      freeze = function freeze(x) {
+        return x;
+      };
+    }
+    if (!seal) {
+      seal = function seal(x) {
+        return x;
+      };
+    }
+    if (!construct) {
+      construct = function construct(Func, args) {
+        return new (Function.prototype.bind.apply(Func, [null].concat(_toConsumableArray(args))))();
+      };
+    }
+    var arrayForEach = unapply(Array.prototype.forEach);
+    var arrayPop = unapply(Array.prototype.pop);
+    var arrayPush = unapply(Array.prototype.push);
+    var stringToLowerCase = unapply(String.prototype.toLowerCase);
+    var stringMatch = unapply(String.prototype.match);
+    var stringReplace = unapply(String.prototype.replace);
+    var stringIndexOf = unapply(String.prototype.indexOf);
+    var stringTrim = unapply(String.prototype.trim);
+    var regExpTest = unapply(RegExp.prototype.test);
+    var typeErrorCreate = unconstruct(TypeError);
+    function unapply(func) {
+      return function (thisArg) {
+        for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+          args[_key - 1] = arguments[_key];
+        }
+        return apply(func, thisArg, args);
+      };
+    }
+    function unconstruct(func) {
+      return function () {
+        for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+          args[_key2] = arguments[_key2];
+        }
+        return construct(func, args);
+      };
+    }
+    function addToSet(set, array) {
+      if (setPrototypeOf) {
+        setPrototypeOf(set, null);
+      }
+      var l = array.length;
+      while (l--) {
+        var element = array[l];
+        if (typeof element === 'string') {
+          var lcElement = stringToLowerCase(element);
+          if (lcElement !== element) {
+            if (!isFrozen(array)) {
+              array[l] = lcElement;
+            }
+            element = lcElement;
+          }
+        }
+        set[element] = true;
+      }
+      return set;
+    }
+    function clone(object) {
+      var newObject = create$7(null);
+      var property = void 0;
+      for (property in object) {
+        if (apply(hasOwnProperty, object, [property])) {
+          newObject[property] = object[property];
+        }
+      }
+      return newObject;
+    }
+    function lookupGetter(object, prop) {
+      while (object !== null) {
+        var desc = getOwnPropertyDescriptor(object, prop);
+        if (desc) {
+          if (desc.get) {
+            return unapply(desc.get);
+          }
+          if (typeof desc.value === 'function') {
+            return unapply(desc.value);
+          }
+        }
+        object = getPrototypeOf(object);
+      }
+      function fallbackValue(element) {
+        console.warn('fallback value for', element);
+        return null;
+      }
+      return fallbackValue;
+    }
+    var html = freeze([
+      'a',
+      'abbr',
+      'acronym',
+      'address',
+      'area',
+      'article',
+      'aside',
+      'audio',
+      'b',
+      'bdi',
+      'bdo',
+      'big',
+      'blink',
+      'blockquote',
+      'body',
+      'br',
+      'button',
+      'canvas',
+      'caption',
+      'center',
+      'cite',
+      'code',
+      'col',
+      'colgroup',
+      'content',
+      'data',
+      'datalist',
+      'dd',
+      'decorator',
+      'del',
+      'details',
+      'dfn',
+      'dialog',
+      'dir',
+      'div',
+      'dl',
+      'dt',
+      'element',
+      'em',
+      'fieldset',
+      'figcaption',
+      'figure',
+      'font',
+      'footer',
+      'form',
+      'h1',
+      'h2',
+      'h3',
+      'h4',
+      'h5',
+      'h6',
+      'head',
+      'header',
+      'hgroup',
+      'hr',
+      'html',
+      'i',
+      'img',
+      'input',
+      'ins',
+      'kbd',
+      'label',
+      'legend',
+      'li',
+      'main',
+      'map',
+      'mark',
+      'marquee',
+      'menu',
+      'menuitem',
+      'meter',
+      'nav',
+      'nobr',
+      'ol',
+      'optgroup',
+      'option',
+      'output',
+      'p',
+      'picture',
+      'pre',
+      'progress',
+      'q',
+      'rp',
+      'rt',
+      'ruby',
+      's',
+      'samp',
+      'section',
+      'select',
+      'shadow',
+      'small',
+      'source',
+      'spacer',
+      'span',
+      'strike',
+      'strong',
+      'style',
+      'sub',
+      'summary',
+      'sup',
+      'table',
+      'tbody',
+      'td',
+      'template',
+      'textarea',
+      'tfoot',
+      'th',
+      'thead',
+      'time',
+      'tr',
+      'track',
+      'tt',
+      'u',
+      'ul',
+      'var',
+      'video',
+      'wbr'
+    ]);
+    var svg = freeze([
+      'svg',
+      'a',
+      'altglyph',
+      'altglyphdef',
+      'altglyphitem',
+      'animatecolor',
+      'animatemotion',
+      'animatetransform',
+      'circle',
+      'clippath',
+      'defs',
+      'desc',
+      'ellipse',
+      'filter',
+      'font',
+      'g',
+      'glyph',
+      'glyphref',
+      'hkern',
+      'image',
+      'line',
+      'lineargradient',
+      'marker',
+      'mask',
+      'metadata',
+      'mpath',
+      'path',
+      'pattern',
+      'polygon',
+      'polyline',
+      'radialgradient',
+      'rect',
+      'stop',
+      'style',
+      'switch',
+      'symbol',
+      'text',
+      'textpath',
+      'title',
+      'tref',
+      'tspan',
+      'view',
+      'vkern'
+    ]);
+    var svgFilters = freeze([
+      'feBlend',
+      'feColorMatrix',
+      'feComponentTransfer',
+      'feComposite',
+      'feConvolveMatrix',
+      'feDiffuseLighting',
+      'feDisplacementMap',
+      'feDistantLight',
+      'feFlood',
+      'feFuncA',
+      'feFuncB',
+      'feFuncG',
+      'feFuncR',
+      'feGaussianBlur',
+      'feImage',
+      'feMerge',
+      'feMergeNode',
+      'feMorphology',
+      'feOffset',
+      'fePointLight',
+      'feSpecularLighting',
+      'feSpotLight',
+      'feTile',
+      'feTurbulence'
+    ]);
+    var svgDisallowed = freeze([
+      'animate',
+      'color-profile',
+      'cursor',
+      'discard',
+      'fedropshadow',
+      'font-face',
+      'font-face-format',
+      'font-face-name',
+      'font-face-src',
+      'font-face-uri',
+      'foreignobject',
+      'hatch',
+      'hatchpath',
+      'mesh',
+      'meshgradient',
+      'meshpatch',
+      'meshrow',
+      'missing-glyph',
+      'script',
+      'set',
+      'solidcolor',
+      'unknown',
+      'use'
+    ]);
+    var mathMl = freeze([
+      'math',
+      'menclose',
+      'merror',
+      'mfenced',
+      'mfrac',
+      'mglyph',
+      'mi',
+      'mlabeledtr',
+      'mmultiscripts',
+      'mn',
+      'mo',
+      'mover',
+      'mpadded',
+      'mphantom',
+      'mroot',
+      'mrow',
+      'ms',
+      'mspace',
+      'msqrt',
+      'mstyle',
+      'msub',
+      'msup',
+      'msubsup',
+      'mtable',
+      'mtd',
+      'mtext',
+      'mtr',
+      'munder',
+      'munderover'
+    ]);
+    var mathMlDisallowed = freeze([
+      'maction',
+      'maligngroup',
+      'malignmark',
+      'mlongdiv',
+      'mscarries',
+      'mscarry',
+      'msgroup',
+      'mstack',
+      'msline',
+      'msrow',
+      'semantics',
+      'annotation',
+      'annotation-xml',
+      'mprescripts',
+      'none'
+    ]);
+    var text = freeze(['#text']);
+    var html$1 = freeze([
+      'accept',
+      'action',
+      'align',
+      'alt',
+      'autocapitalize',
+      'autocomplete',
+      'autopictureinpicture',
+      'autoplay',
+      'background',
+      'bgcolor',
+      'border',
+      'capture',
+      'cellpadding',
+      'cellspacing',
+      'checked',
+      'cite',
+      'class',
+      'clear',
+      'color',
+      'cols',
+      'colspan',
+      'controls',
+      'controlslist',
+      'coords',
+      'crossorigin',
+      'datetime',
+      'decoding',
+      'default',
+      'dir',
+      'disabled',
+      'disablepictureinpicture',
+      'disableremoteplayback',
+      'download',
+      'draggable',
+      'enctype',
+      'enterkeyhint',
+      'face',
+      'for',
+      'headers',
+      'height',
+      'hidden',
+      'high',
+      'href',
+      'hreflang',
+      'id',
+      'inputmode',
+      'integrity',
+      'ismap',
+      'kind',
+      'label',
+      'lang',
+      'list',
+      'loading',
+      'loop',
+      'low',
+      'max',
+      'maxlength',
+      'media',
+      'method',
+      'min',
+      'minlength',
+      'multiple',
+      'muted',
+      'name',
+      'nonce',
+      'noshade',
+      'novalidate',
+      'nowrap',
+      'open',
+      'optimum',
+      'pattern',
+      'placeholder',
+      'playsinline',
+      'poster',
+      'preload',
+      'pubdate',
+      'radiogroup',
+      'readonly',
+      'rel',
+      'required',
+      'rev',
+      'reversed',
+      'role',
+      'rows',
+      'rowspan',
+      'spellcheck',
+      'scope',
+      'selected',
+      'shape',
+      'size',
+      'sizes',
+      'span',
+      'srclang',
+      'start',
+      'src',
+      'srcset',
+      'step',
+      'style',
+      'summary',
+      'tabindex',
+      'title',
+      'translate',
+      'type',
+      'usemap',
+      'valign',
+      'value',
+      'width',
+      'xmlns',
+      'slot'
+    ]);
+    var svg$1 = freeze([
+      'accent-height',
+      'accumulate',
+      'additive',
+      'alignment-baseline',
+      'ascent',
+      'attributename',
+      'attributetype',
+      'azimuth',
+      'basefrequency',
+      'baseline-shift',
+      'begin',
+      'bias',
+      'by',
+      'class',
+      'clip',
+      'clippathunits',
+      'clip-path',
+      'clip-rule',
+      'color',
+      'color-interpolation',
+      'color-interpolation-filters',
+      'color-profile',
+      'color-rendering',
+      'cx',
+      'cy',
+      'd',
+      'dx',
+      'dy',
+      'diffuseconstant',
+      'direction',
+      'display',
+      'divisor',
+      'dur',
+      'edgemode',
+      'elevation',
+      'end',
+      'fill',
+      'fill-opacity',
+      'fill-rule',
+      'filter',
+      'filterunits',
+      'flood-color',
+      'flood-opacity',
+      'font-family',
+      'font-size',
+      'font-size-adjust',
+      'font-stretch',
+      'font-style',
+      'font-variant',
+      'font-weight',
+      'fx',
+      'fy',
+      'g1',
+      'g2',
+      'glyph-name',
+      'glyphref',
+      'gradientunits',
+      'gradienttransform',
+      'height',
+      'href',
+      'id',
+      'image-rendering',
+      'in',
+      'in2',
+      'k',
+      'k1',
+      'k2',
+      'k3',
+      'k4',
+      'kerning',
+      'keypoints',
+      'keysplines',
+      'keytimes',
+      'lang',
+      'lengthadjust',
+      'letter-spacing',
+      'kernelmatrix',
+      'kernelunitlength',
+      'lighting-color',
+      'local',
+      'marker-end',
+      'marker-mid',
+      'marker-start',
+      'markerheight',
+      'markerunits',
+      'markerwidth',
+      'maskcontentunits',
+      'maskunits',
+      'max',
+      'mask',
+      'media',
+      'method',
+      'mode',
+      'min',
+      'name',
+      'numoctaves',
+      'offset',
+      'operator',
+      'opacity',
+      'order',
+      'orient',
+      'orientation',
+      'origin',
+      'overflow',
+      'paint-order',
+      'path',
+      'pathlength',
+      'patterncontentunits',
+      'patterntransform',
+      'patternunits',
+      'points',
+      'preservealpha',
+      'preserveaspectratio',
+      'primitiveunits',
+      'r',
+      'rx',
+      'ry',
+      'radius',
+      'refx',
+      'refy',
+      'repeatcount',
+      'repeatdur',
+      'restart',
+      'result',
+      'rotate',
+      'scale',
+      'seed',
+      'shape-rendering',
+      'specularconstant',
+      'specularexponent',
+      'spreadmethod',
+      'startoffset',
+      'stddeviation',
+      'stitchtiles',
+      'stop-color',
+      'stop-opacity',
+      'stroke-dasharray',
+      'stroke-dashoffset',
+      'stroke-linecap',
+      'stroke-linejoin',
+      'stroke-miterlimit',
+      'stroke-opacity',
+      'stroke',
+      'stroke-width',
+      'style',
+      'surfacescale',
+      'systemlanguage',
+      'tabindex',
+      'targetx',
+      'targety',
+      'transform',
+      'transform-origin',
+      'text-anchor',
+      'text-decoration',
+      'text-rendering',
+      'textlength',
+      'type',
+      'u1',
+      'u2',
+      'unicode',
+      'values',
+      'viewbox',
+      'visibility',
+      'version',
+      'vert-adv-y',
+      'vert-origin-x',
+      'vert-origin-y',
+      'width',
+      'word-spacing',
+      'wrap',
+      'writing-mode',
+      'xchannelselector',
+      'ychannelselector',
+      'x',
+      'x1',
+      'x2',
+      'xmlns',
+      'y',
+      'y1',
+      'y2',
+      'z',
+      'zoomandpan'
+    ]);
+    var mathMl$1 = freeze([
+      'accent',
+      'accentunder',
+      'align',
+      'bevelled',
+      'close',
+      'columnsalign',
+      'columnlines',
+      'columnspan',
+      'denomalign',
+      'depth',
+      'dir',
+      'display',
+      'displaystyle',
+      'encoding',
+      'fence',
+      'frame',
+      'height',
+      'href',
+      'id',
+      'largeop',
+      'length',
+      'linethickness',
+      'lspace',
+      'lquote',
+      'mathbackground',
+      'mathcolor',
+      'mathsize',
+      'mathvariant',
+      'maxsize',
+      'minsize',
+      'movablelimits',
+      'notation',
+      'numalign',
+      'open',
+      'rowalign',
+      'rowlines',
+      'rowspacing',
+      'rowspan',
+      'rspace',
+      'rquote',
+      'scriptlevel',
+      'scriptminsize',
+      'scriptsizemultiplier',
+      'selection',
+      'separator',
+      'separators',
+      'stretchy',
+      'subscriptshift',
+      'supscriptshift',
+      'symmetric',
+      'voffset',
+      'width',
+      'xmlns'
+    ]);
+    var xml = freeze([
+      'xlink:href',
+      'xml:id',
+      'xlink:title',
+      'xml:space',
+      'xmlns:xlink'
+    ]);
+    var MUSTACHE_EXPR = seal(/\{\{[\s\S]*|[\s\S]*\}\}/gm);
+    var ERB_EXPR = seal(/<%[\s\S]*|[\s\S]*%>/gm);
+    var DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/);
+    var ARIA_ATTR = seal(/^aria-[\-\w]+$/);
+    var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i);
+    var IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
+    var ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g);
+    var DOCTYPE_NAME = seal(/^html$/i);
+    var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function (obj) {
+      return typeof obj;
+    } : function (obj) {
+      return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+    };
+    function _toConsumableArray$1(arr) {
+      if (Array.isArray(arr)) {
+        for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
+          arr2[i] = arr[i];
+        }
+        return arr2;
+      } else {
+        return Array.from(arr);
+      }
+    }
+    var getGlobal = function getGlobal() {
+      return typeof window === 'undefined' ? null : window;
+    };
+    var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {
+      if ((typeof trustedTypes === 'undefined' ? 'undefined' : _typeof(trustedTypes)) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {
+        return null;
+      }
+      var suffix = null;
+      var ATTR_NAME = 'data-tt-policy-suffix';
+      if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {
+        suffix = document.currentScript.getAttribute(ATTR_NAME);
+      }
+      var policyName = 'dompurify' + (suffix ? '#' + suffix : '');
+      try {
+        return trustedTypes.createPolicy(policyName, {
+          createHTML: function createHTML(html$$1) {
+            return html$$1;
+          }
+        });
+      } catch (_) {
+        console.warn('TrustedTypes policy ' + policyName + ' could not be created.');
+        return null;
+      }
+    };
+    function createDOMPurify() {
+      var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
+      var DOMPurify = function DOMPurify(root) {
+        return createDOMPurify(root);
+      };
+      DOMPurify.version = '2.3.6';
+      DOMPurify.removed = [];
+      if (!window || !window.document || window.document.nodeType !== 9) {
+        DOMPurify.isSupported = false;
+        return DOMPurify;
+      }
+      var originalDocument = window.document;
+      var document = window.document;
+      var DocumentFragment = window.DocumentFragment, HTMLTemplateElement = window.HTMLTemplateElement, Node = window.Node, Element = window.Element, NodeFilter = window.NodeFilter, _window$NamedNodeMap = window.NamedNodeMap, NamedNodeMap = _window$NamedNodeMap === undefined ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap, HTMLFormElement = window.HTMLFormElement, DOMParser = window.DOMParser, trustedTypes = window.trustedTypes;
+      var ElementPrototype = Element.prototype;
+      var cloneNode = lookupGetter(ElementPrototype, 'cloneNode');
+      var getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');
+      var getChildNodes = lookupGetter(ElementPrototype, 'childNodes');
+      var getParentNode = lookupGetter(ElementPrototype, 'parentNode');
+      if (typeof HTMLTemplateElement === 'function') {
+        var template = document.createElement('template');
+        if (template.content && template.content.ownerDocument) {
+          document = template.content.ownerDocument;
+        }
+      }
+      var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);
+      var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';
+      var _document = document, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;
+      var importNode = originalDocument.importNode;
+      var documentMode = {};
+      try {
+        documentMode = clone(document).documentMode ? document.documentMode : {};
+      } catch (_) {
+      }
+      var hooks = {};
+      DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9;
+      var MUSTACHE_EXPR$$1 = MUSTACHE_EXPR, ERB_EXPR$$1 = ERB_EXPR, DATA_ATTR$$1 = DATA_ATTR, ARIA_ATTR$$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$$1 = ATTR_WHITESPACE;
+      var IS_ALLOWED_URI$$1 = IS_ALLOWED_URI;
+      var ALLOWED_TAGS = null;
+      var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray$1(html), _toConsumableArray$1(svg), _toConsumableArray$1(svgFilters), _toConsumableArray$1(mathMl), _toConsumableArray$1(text)));
+      var ALLOWED_ATTR = null;
+      var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray$1(html$1), _toConsumableArray$1(svg$1), _toConsumableArray$1(mathMl$1), _toConsumableArray$1(xml)));
+      var CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {
+        tagNameCheck: {
+          writable: true,
+          configurable: false,
+          enumerable: true,
+          value: null
+        },
+        attributeNameCheck: {
+          writable: true,
+          configurable: false,
+          enumerable: true,
+          value: null
+        },
+        allowCustomizedBuiltInElements: {
+          writable: true,
+          configurable: false,
+          enumerable: true,
+          value: false
+        }
+      }));
+      var FORBID_TAGS = null;
+      var FORBID_ATTR = null;
+      var ALLOW_ARIA_ATTR = true;
+      var ALLOW_DATA_ATTR = true;
+      var ALLOW_UNKNOWN_PROTOCOLS = false;
+      var SAFE_FOR_TEMPLATES = false;
+      var WHOLE_DOCUMENT = false;
+      var SET_CONFIG = false;
+      var FORCE_BODY = false;
+      var RETURN_DOM = false;
+      var RETURN_DOM_FRAGMENT = false;
+      var RETURN_TRUSTED_TYPE = false;
+      var SANITIZE_DOM = true;
+      var KEEP_CONTENT = true;
+      var IN_PLACE = false;
+      var USE_PROFILES = {};
+      var FORBID_CONTENTS = null;
+      var DEFAULT_FORBID_CONTENTS = addToSet({}, [
+        'annotation-xml',
+        'audio',
+        'colgroup',
+        'desc',
+        'foreignobject',
+        'head',
+        'iframe',
+        'math',
+        'mi',
+        'mn',
+        'mo',
+        'ms',
+        'mtext',
+        'noembed',
+        'noframes',
+        'noscript',
+        'plaintext',
+        'script',
+        'style',
+        'svg',
+        'template',
+        'thead',
+        'title',
+        'video',
+        'xmp'
+      ]);
+      var DATA_URI_TAGS = null;
+      var DEFAULT_DATA_URI_TAGS = addToSet({}, [
+        'audio',
+        'video',
+        'img',
+        'source',
+        'image',
+        'track'
+      ]);
+      var URI_SAFE_ATTRIBUTES = null;
+      var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [
+        'alt',
+        'class',
+        'for',
+        'id',
+        'label',
+        'name',
+        'pattern',
+        'placeholder',
+        'role',
+        'summary',
+        'title',
+        'value',
+        'style',
+        'xmlns'
+      ]);
+      var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
+      var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
+      var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
+      var NAMESPACE = HTML_NAMESPACE;
+      var IS_EMPTY_INPUT = false;
+      var PARSER_MEDIA_TYPE = void 0;
+      var SUPPORTED_PARSER_MEDIA_TYPES = [
+        'application/xhtml+xml',
+        'text/html'
+      ];
+      var DEFAULT_PARSER_MEDIA_TYPE = 'text/html';
+      var transformCaseFunc = void 0;
+      var CONFIG = null;
+      var formElement = document.createElement('form');
+      var isRegexOrFunction = function isRegexOrFunction(testValue) {
+        return testValue instanceof RegExp || testValue instanceof Function;
+      };
+      var _parseConfig = function _parseConfig(cfg) {
+        if (CONFIG && CONFIG === cfg) {
+          return;
+        }
+        if (!cfg || (typeof cfg === 'undefined' ? 'undefined' : _typeof(cfg)) !== 'object') {
+          cfg = {};
+        }
+        cfg = clone(cfg);
+        ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS;
+        ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR;
+        URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR) : DEFAULT_URI_SAFE_ATTRIBUTES;
+        DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS) : DEFAULT_DATA_URI_TAGS;
+        FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS) : DEFAULT_FORBID_CONTENTS;
+        FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS) : {};
+        FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR) : {};
+        USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;
+        ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;
+        ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;
+        ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;
+        SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;
+        WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;
+        RETURN_DOM = cfg.RETURN_DOM || false;
+        RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;
+        RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;
+        FORCE_BODY = cfg.FORCE_BODY || false;
+        SANITIZE_DOM = cfg.SANITIZE_DOM !== false;
+        KEEP_CONTENT = cfg.KEEP_CONTENT !== false;
+        IN_PLACE = cfg.IN_PLACE || false;
+        IS_ALLOWED_URI$$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$$1;
+        NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;
+        if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {
+          CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;
+        }
+        if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {
+          CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;
+        }
+        if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {
+          CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;
+        }
+        PARSER_MEDIA_TYPE = SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE;
+        transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? function (x) {
+          return x;
+        } : stringToLowerCase;
+        if (SAFE_FOR_TEMPLATES) {
+          ALLOW_DATA_ATTR = false;
+        }
+        if (RETURN_DOM_FRAGMENT) {
+          RETURN_DOM = true;
+        }
+        if (USE_PROFILES) {
+          ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray$1(text)));
+          ALLOWED_ATTR = [];
+          if (USE_PROFILES.html === true) {
+            addToSet(ALLOWED_TAGS, html);
+            addToSet(ALLOWED_ATTR, html$1);
+          }
+          if (USE_PROFILES.svg === true) {
+            addToSet(ALLOWED_TAGS, svg);
+            addToSet(ALLOWED_ATTR, svg$1);
+            addToSet(ALLOWED_ATTR, xml);
+          }
+          if (USE_PROFILES.svgFilters === true) {
+            addToSet(ALLOWED_TAGS, svgFilters);
+            addToSet(ALLOWED_ATTR, svg$1);
+            addToSet(ALLOWED_ATTR, xml);
+          }
+          if (USE_PROFILES.mathMl === true) {
+            addToSet(ALLOWED_TAGS, mathMl);
+            addToSet(ALLOWED_ATTR, mathMl$1);
+            addToSet(ALLOWED_ATTR, xml);
+          }
+        }
+        if (cfg.ADD_TAGS) {
+          if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
+            ALLOWED_TAGS = clone(ALLOWED_TAGS);
+          }
+          addToSet(ALLOWED_TAGS, cfg.ADD_TAGS);
+        }
+        if (cfg.ADD_ATTR) {
+          if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
+            ALLOWED_ATTR = clone(ALLOWED_ATTR);
+          }
+          addToSet(ALLOWED_ATTR, cfg.ADD_ATTR);
+        }
+        if (cfg.ADD_URI_SAFE_ATTR) {
+          addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR);
+        }
+        if (cfg.FORBID_CONTENTS) {
+          if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
+            FORBID_CONTENTS = clone(FORBID_CONTENTS);
+          }
+          addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS);
+        }
+        if (KEEP_CONTENT) {
+          ALLOWED_TAGS['#text'] = true;
+        }
+        if (WHOLE_DOCUMENT) {
+          addToSet(ALLOWED_TAGS, [
+            'html',
+            'head',
+            'body'
+          ]);
+        }
+        if (ALLOWED_TAGS.table) {
+          addToSet(ALLOWED_TAGS, ['tbody']);
+          delete FORBID_TAGS.tbody;
+        }
+        if (freeze) {
+          freeze(cfg);
+        }
+        CONFIG = cfg;
+      };
+      var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [
+        'mi',
+        'mo',
+        'mn',
+        'ms',
+        'mtext'
+      ]);
+      var HTML_INTEGRATION_POINTS = addToSet({}, [
+        'foreignobject',
+        'desc',
+        'title',
+        'annotation-xml'
+      ]);
+      var COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [
+        'title',
+        'style',
+        'font',
+        'a',
+        'script'
+      ]);
+      var ALL_SVG_TAGS = addToSet({}, svg);
+      addToSet(ALL_SVG_TAGS, svgFilters);
+      addToSet(ALL_SVG_TAGS, svgDisallowed);
+      var ALL_MATHML_TAGS = addToSet({}, mathMl);
+      addToSet(ALL_MATHML_TAGS, mathMlDisallowed);
+      var _checkValidNamespace = function _checkValidNamespace(element) {
+        var parent = getParentNode(element);
+        if (!parent || !parent.tagName) {
+          parent = {
+            namespaceURI: HTML_NAMESPACE,
+            tagName: 'template'
+          };
+        }
+        var tagName = stringToLowerCase(element.tagName);
+        var parentTagName = stringToLowerCase(parent.tagName);
+        if (element.namespaceURI === SVG_NAMESPACE) {
+          if (parent.namespaceURI === HTML_NAMESPACE) {
+            return tagName === 'svg';
+          }
+          if (parent.namespaceURI === MATHML_NAMESPACE) {
+            return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
+          }
+          return Boolean(ALL_SVG_TAGS[tagName]);
+        }
+        if (element.namespaceURI === MATHML_NAMESPACE) {
+          if (parent.namespaceURI === HTML_NAMESPACE) {
+            return tagName === 'math';
+          }
+          if (parent.namespaceURI === SVG_NAMESPACE) {
+            return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];
+          }
+          return Boolean(ALL_MATHML_TAGS[tagName]);
+        }
+        if (element.namespaceURI === HTML_NAMESPACE) {
+          if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {
+            return false;
+          }
+          if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {
+            return false;
+          }
+          return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
+        }
+        return false;
+      };
+      var _forceRemove = function _forceRemove(node) {
+        arrayPush(DOMPurify.removed, { element: node });
+        try {
+          node.parentNode.removeChild(node);
+        } catch (_) {
+          try {
+            node.outerHTML = emptyHTML;
+          } catch (_) {
+            node.remove();
+          }
+        }
+      };
+      var _removeAttribute = function _removeAttribute(name, node) {
+        try {
+          arrayPush(DOMPurify.removed, {
+            attribute: node.getAttributeNode(name),
+            from: node
+          });
+        } catch (_) {
+          arrayPush(DOMPurify.removed, {
+            attribute: null,
+            from: node
+          });
+        }
+        node.removeAttribute(name);
+        if (name === 'is' && !ALLOWED_ATTR[name]) {
+          if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
+            try {
+              _forceRemove(node);
+            } catch (_) {
+            }
+          } else {
+            try {
+              node.setAttribute(name, '');
+            } catch (_) {
+            }
+          }
+        }
+      };
+      var _initDocument = function _initDocument(dirty) {
+        var doc = void 0;
+        var leadingWhitespace = void 0;
+        if (FORCE_BODY) {
+          dirty = '<remove></remove>' + dirty;
+        } else {
+          var matches = stringMatch(dirty, /^[\r\n\t ]+/);
+          leadingWhitespace = matches && matches[0];
+        }
+        if (PARSER_MEDIA_TYPE === 'application/xhtml+xml') {
+          dirty = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + dirty + '</body></html>';
+        }
+        var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;
+        if (NAMESPACE === HTML_NAMESPACE) {
+          try {
+            doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
+          } catch (_) {
+          }
+        }
+        if (!doc || !doc.documentElement) {
+          doc = implementation.createDocument(NAMESPACE, 'template', null);
+          try {
+            doc.documentElement.innerHTML = IS_EMPTY_INPUT ? '' : dirtyPayload;
+          } catch (_) {
+          }
+        }
+        var body = doc.body || doc.documentElement;
+        if (dirty && leadingWhitespace) {
+          body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);
+        }
+        if (NAMESPACE === HTML_NAMESPACE) {
+          return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];
+        }
+        return WHOLE_DOCUMENT ? doc.documentElement : body;
+      };
+      var _createIterator = function _createIterator(root) {
+        return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);
+      };
+      var _isClobbered = function _isClobbered(elm) {
+        return elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function');
+      };
+      var _isNode = function _isNode(object) {
+        return (typeof Node === 'undefined' ? 'undefined' : _typeof(Node)) === 'object' ? object instanceof Node : object && (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';
+      };
+      var _executeHook = function _executeHook(entryPoint, currentNode, data) {
+        if (!hooks[entryPoint]) {
+          return;
+        }
+        arrayForEach(hooks[entryPoint], function (hook) {
+          hook.call(DOMPurify, currentNode, data, CONFIG);
+        });
+      };
+      var _sanitizeElements = function _sanitizeElements(currentNode) {
+        var content = void 0;
+        _executeHook('beforeSanitizeElements', currentNode, null);
+        if (_isClobbered(currentNode)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        if (regExpTest(/[\u0080-\uFFFF]/, currentNode.nodeName)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        var tagName = transformCaseFunc(currentNode.nodeName);
+        _executeHook('uponSanitizeElement', currentNode, {
+          tagName: tagName,
+          allowedTags: ALLOWED_TAGS
+        });
+        if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        if (tagName === 'select' && regExpTest(/<template/i, currentNode.innerHTML)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
+          if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {
+            if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName))
+              return false;
+            if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName))
+              return false;
+          }
+          if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
+            var parentNode = getParentNode(currentNode) || currentNode.parentNode;
+            var childNodes = getChildNodes(currentNode) || currentNode.childNodes;
+            if (childNodes && parentNode) {
+              var childCount = childNodes.length;
+              for (var i = childCount - 1; i >= 0; --i) {
+                parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));
+              }
+            }
+          }
+          _forceRemove(currentNode);
+          return true;
+        }
+        if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\/no(script|embed)/i, currentNode.innerHTML)) {
+          _forceRemove(currentNode);
+          return true;
+        }
+        if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
+          content = currentNode.textContent;
+          content = stringReplace(content, MUSTACHE_EXPR$$1, ' ');
+          content = stringReplace(content, ERB_EXPR$$1, ' ');
+          if (currentNode.textContent !== content) {
+            arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });
+            currentNode.textContent = content;
+          }
+        }
+        _executeHook('afterSanitizeElements', currentNode, null);
+        return false;
+      };
+      var _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
+        if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
+          return false;
+        }
+        if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR$$1, lcName));
+        else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$$1, lcName));
+        else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {
+          if (_basicCustomElementTest(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value)));
+          else {
+            return false;
+          }
+        } else if (URI_SAFE_ATTRIBUTES[lcName]);
+        else if (regExpTest(IS_ALLOWED_URI$$1, stringReplace(value, ATTR_WHITESPACE$$1, '')));
+        else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]);
+        else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$$1, stringReplace(value, ATTR_WHITESPACE$$1, '')));
+        else if (!value);
+        else {
+          return false;
+        }
+        return true;
+      };
+      var _basicCustomElementTest = function _basicCustomElementTest(tagName) {
+        return tagName.indexOf('-') > 0;
+      };
+      var _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
+        var attr = void 0;
+        var value = void 0;
+        var lcName = void 0;
+        var l = void 0;
+        _executeHook('beforeSanitizeAttributes', currentNode, null);
+        var attributes = currentNode.attributes;
+        if (!attributes) {
+          return;
+        }
+        var hookEvent = {
+          attrName: '',
+          attrValue: '',
+          keepAttr: true,
+          allowedAttributes: ALLOWED_ATTR
+        };
+        l = attributes.length;
+        while (l--) {
+          attr = attributes[l];
+          var _attr = attr, name = _attr.name, namespaceURI = _attr.namespaceURI;
+          value = stringTrim(attr.value);
+          lcName = transformCaseFunc(name);
+          var initValue = value;
+          hookEvent.attrName = lcName;
+          hookEvent.attrValue = value;
+          hookEvent.keepAttr = true;
+          hookEvent.forceKeepAttr = undefined;
+          _executeHook('uponSanitizeAttribute', currentNode, hookEvent);
+          value = hookEvent.attrValue;
+          if (hookEvent.forceKeepAttr) {
+            continue;
+          }
+          if (!hookEvent.keepAttr) {
+            _removeAttribute(name, currentNode);
+            continue;
+          }
+          if (regExpTest(/\/>/i, value)) {
+            _removeAttribute(name, currentNode);
+            continue;
+          }
+          if (SAFE_FOR_TEMPLATES) {
+            value = stringReplace(value, MUSTACHE_EXPR$$1, ' ');
+            value = stringReplace(value, ERB_EXPR$$1, ' ');
+          }
+          var lcTag = transformCaseFunc(currentNode.nodeName);
+          if (!_isValidAttribute(lcTag, lcName, value)) {
+            _removeAttribute(name, currentNode);
+            continue;
+          }
+          if (value !== initValue) {
+            try {
+              if (namespaceURI) {
+                currentNode.setAttributeNS(namespaceURI, name, value);
+              } else {
+                currentNode.setAttribute(name, value);
+              }
+            } catch (_) {
+              _removeAttribute(name, currentNode);
+            }
+          }
+        }
+        _executeHook('afterSanitizeAttributes', currentNode, null);
+      };
+      var _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {
+        var shadowNode = void 0;
+        var shadowIterator = _createIterator(fragment);
+        _executeHook('beforeSanitizeShadowDOM', fragment, null);
+        while (shadowNode = shadowIterator.nextNode()) {
+          _executeHook('uponSanitizeShadowNode', shadowNode, null);
+          if (_sanitizeElements(shadowNode)) {
+            continue;
+          }
+          if (shadowNode.content instanceof DocumentFragment) {
+            _sanitizeShadowDOM(shadowNode.content);
+          }
+          _sanitizeAttributes(shadowNode);
+        }
+        _executeHook('afterSanitizeShadowDOM', fragment, null);
+      };
+      DOMPurify.sanitize = function (dirty, cfg) {
+        var body = void 0;
+        var importedNode = void 0;
+        var currentNode = void 0;
+        var oldNode = void 0;
+        var returnNode = void 0;
+        IS_EMPTY_INPUT = !dirty;
+        if (IS_EMPTY_INPUT) {
+          dirty = '<!-->';
+        }
+        if (typeof dirty !== 'string' && !_isNode(dirty)) {
+          if (typeof dirty.toString !== 'function') {
+            throw typeErrorCreate('toString is not a function');
+          } else {
+            dirty = dirty.toString();
+            if (typeof dirty !== 'string') {
+              throw typeErrorCreate('dirty is not a string, aborting');
+            }
+          }
+        }
+        if (!DOMPurify.isSupported) {
+          if (_typeof(window.toStaticHTML) === 'object' || typeof window.toStaticHTML === 'function') {
+            if (typeof dirty === 'string') {
+              return window.toStaticHTML(dirty);
+            }
+            if (_isNode(dirty)) {
+              return window.toStaticHTML(dirty.outerHTML);
+            }
+          }
+          return dirty;
+        }
+        if (!SET_CONFIG) {
+          _parseConfig(cfg);
+        }
+        DOMPurify.removed = [];
+        if (typeof dirty === 'string') {
+          IN_PLACE = false;
+        }
+        if (IN_PLACE) {
+          if (dirty.nodeName) {
+            var tagName = transformCaseFunc(dirty.nodeName);
+            if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
+              throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');
+            }
+          }
+        } else if (dirty instanceof Node) {
+          body = _initDocument('<!---->');
+          importedNode = body.ownerDocument.importNode(dirty, true);
+          if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {
+            body = importedNode;
+          } else if (importedNode.nodeName === 'HTML') {
+            body = importedNode;
+          } else {
+            body.appendChild(importedNode);
+          }
+        } else {
+          if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && dirty.indexOf('<') === -1) {
+            return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;
+          }
+          body = _initDocument(dirty);
+          if (!body) {
+            return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';
+          }
+        }
+        if (body && FORCE_BODY) {
+          _forceRemove(body.firstChild);
+        }
+        var nodeIterator = _createIterator(IN_PLACE ? dirty : body);
+        while (currentNode = nodeIterator.nextNode()) {
+          if (currentNode.nodeType === 3 && currentNode === oldNode) {
+            continue;
+          }
+          if (_sanitizeElements(currentNode)) {
+            continue;
+          }
+          if (currentNode.content instanceof DocumentFragment) {
+            _sanitizeShadowDOM(currentNode.content);
+          }
+          _sanitizeAttributes(currentNode);
+          oldNode = currentNode;
+        }
+        oldNode = null;
+        if (IN_PLACE) {
+          return dirty;
+        }
+        if (RETURN_DOM) {
+          if (RETURN_DOM_FRAGMENT) {
+            returnNode = createDocumentFragment.call(body.ownerDocument);
+            while (body.firstChild) {
+              returnNode.appendChild(body.firstChild);
+            }
+          } else {
+            returnNode = body;
+          }
+          if (ALLOWED_ATTR.shadowroot) {
+            returnNode = importNode.call(originalDocument, returnNode, true);
+          }
+          return returnNode;
+        }
+        var serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
+        if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {
+          serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\n' + serializedHTML;
+        }
+        if (SAFE_FOR_TEMPLATES) {
+          serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR$$1, ' ');
+          serializedHTML = stringReplace(serializedHTML, ERB_EXPR$$1, ' ');
+        }
+        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;
+      };
+      DOMPurify.setConfig = function (cfg) {
+        _parseConfig(cfg);
+        SET_CONFIG = true;
+      };
+      DOMPurify.clearConfig = function () {
+        CONFIG = null;
+        SET_CONFIG = false;
+      };
+      DOMPurify.isValidAttribute = function (tag, attr, value) {
+        if (!CONFIG) {
+          _parseConfig({});
+        }
+        var lcTag = transformCaseFunc(tag);
+        var lcName = transformCaseFunc(attr);
+        return _isValidAttribute(lcTag, lcName, value);
+      };
+      DOMPurify.addHook = function (entryPoint, hookFunction) {
+        if (typeof hookFunction !== 'function') {
+          return;
+        }
+        hooks[entryPoint] = hooks[entryPoint] || [];
+        arrayPush(hooks[entryPoint], hookFunction);
+      };
+      DOMPurify.removeHook = function (entryPoint) {
+        if (hooks[entryPoint]) {
+          arrayPop(hooks[entryPoint]);
+        }
+      };
+      DOMPurify.removeHooks = function (entryPoint) {
+        if (hooks[entryPoint]) {
+          hooks[entryPoint] = [];
+        }
+      };
+      DOMPurify.removeAllHooks = function () {
+        hooks = {};
+      };
+      return DOMPurify;
+    }
+    var purify = createDOMPurify();
+
+    const removeAttrs = (node, names) => {
+      each$g(names, name => {
+        node.attr(name, null);
+      });
+    };
+    const addFontToSpansFilter = (domParser, styles, fontSizes) => {
+      domParser.addNodeFilter('font', nodes => {
+        each$g(nodes, node => {
+          const props = styles.parse(node.attr('style'));
+          const color = node.attr('color');
+          const face = node.attr('face');
+          const size = node.attr('size');
+          if (color) {
+            props.color = color;
+          }
+          if (face) {
+            props['font-family'] = face;
+          }
+          if (size) {
+            props['font-size'] = fontSizes[parseInt(node.attr('size'), 10) - 1];
+          }
+          node.name = 'span';
+          node.attr('style', styles.serialize(props));
+          removeAttrs(node, [
+            'color',
+            'face',
+            'size'
+          ]);
+        });
+      });
+    };
+    const addStrikeFilter = (domParser, schema, styles) => {
+      domParser.addNodeFilter('strike', nodes => {
+        const convertToSTag = schema.type !== 'html4';
+        each$g(nodes, node => {
+          if (convertToSTag) {
+            node.name = 's';
+          } else {
+            const props = styles.parse(node.attr('style'));
+            props['text-decoration'] = 'line-through';
+            node.name = 'span';
+            node.attr('style', styles.serialize(props));
+          }
+        });
+      });
+    };
+    const addFilters = (domParser, settings, schema) => {
+      const styles = Styles();
+      if (settings.convert_fonts_to_spans) {
+        addFontToSpansFilter(domParser, styles, Tools.explode(settings.font_size_legacy_values));
+      }
+      addStrikeFilter(domParser, schema, styles);
+    };
+    const register$5 = (domParser, settings, schema) => {
+      if (settings.inline_styles) {
+        addFilters(domParser, settings, schema);
+      }
+    };
+
+    const blobUriToBlob = url => {
+      return new Promise((resolve, reject) => {
+        const rejectWithError = () => {
+          reject('Cannot convert ' + url + ' to Blob. Resource might not exist or is inaccessible.');
+        };
+        try {
+          const xhr = new XMLHttpRequest();
+          xhr.open('GET', url, true);
+          xhr.responseType = 'blob';
+          xhr.onload = () => {
+            if (xhr.status === 200) {
+              resolve(xhr.response);
+            } else {
+              rejectWithError();
+            }
+          };
+          xhr.onerror = rejectWithError;
+          xhr.send();
+        } catch (ex) {
+          rejectWithError();
+        }
+      });
+    };
+    const parseDataUri$1 = uri => {
+      let type;
+      const uriParts = decodeURIComponent(uri).split(',');
+      const matches = /data:([^;]+)/.exec(uriParts[0]);
+      if (matches) {
+        type = matches[1];
+      }
+      return {
+        type,
+        data: uriParts[1]
+      };
+    };
+    const buildBlob = (type, data) => {
+      let str;
+      try {
+        str = atob(data);
+      } catch (e) {
+        return Optional.none();
+      }
+      const arr = new Uint8Array(str.length);
+      for (let i = 0; i < arr.length; i++) {
+        arr[i] = str.charCodeAt(i);
+      }
+      return Optional.some(new Blob([arr], { type }));
+    };
+    const dataUriToBlob = uri => {
+      return new Promise(resolve => {
+        const {type, data} = parseDataUri$1(uri);
+        buildBlob(type, data).fold(() => resolve(new Blob([])), resolve);
+      });
+    };
+    const uriToBlob = url => {
+      if (url.indexOf('blob:') === 0) {
+        return blobUriToBlob(url);
+      }
+      if (url.indexOf('data:') === 0) {
+        return dataUriToBlob(url);
+      }
+      return null;
+    };
+    const blobToDataUri = blob => {
+      return new Promise(resolve => {
+        const reader = new FileReader();
+        reader.onloadend = () => {
+          resolve(reader.result);
+        };
+        reader.readAsDataURL(blob);
+      });
+    };
+
+    let count$1 = 0;
+    const uniqueId$1 = prefix => {
+      return (prefix || 'blobid') + count$1++;
+    };
+    const imageToBlobInfo = (blobCache, img, resolve, reject) => {
+      let base64, blobInfo;
+      if (img.src.indexOf('blob:') === 0) {
+        blobInfo = blobCache.getByUri(img.src);
+        if (blobInfo) {
+          resolve({
+            image: img,
+            blobInfo
+          });
+        } else {
+          uriToBlob(img.src).then(blob => {
+            blobToDataUri(blob).then(dataUri => {
+              base64 = parseDataUri$1(dataUri).data;
+              blobInfo = blobCache.create(uniqueId$1(), blob, base64);
+              blobCache.add(blobInfo);
+              resolve({
+                image: img,
+                blobInfo
+              });
+            });
+          }, err => {
+            reject(err);
+          });
+        }
+        return;
+      }
+      const {data, type} = parseDataUri$1(img.src);
+      base64 = data;
+      blobInfo = blobCache.getByData(base64, type);
+      if (blobInfo) {
+        resolve({
+          image: img,
+          blobInfo
+        });
+      } else {
+        uriToBlob(img.src).then(blob => {
+          blobInfo = blobCache.create(uniqueId$1(), blob, base64);
+          blobCache.add(blobInfo);
+          resolve({
+            image: img,
+            blobInfo
+          });
+        }, err => {
+          reject(err);
+        });
+      }
+    };
+    const getAllImages = elm => {
+      return elm ? from(elm.getElementsByTagName('img')) : [];
+    };
+    const ImageScanner = (uploadStatus, blobCache) => {
+      const cachedPromises = {};
+      const findAll = (elm, predicate) => {
+        if (!predicate) {
+          predicate = always;
+        }
+        const images = filter$6(getAllImages(elm), img => {
+          const src = img.src;
+          if (img.hasAttribute('data-mce-bogus')) {
+            return false;
+          }
+          if (img.hasAttribute('data-mce-placeholder')) {
+            return false;
+          }
+          if (!src || src === Env.transparentSrc) {
+            return false;
+          }
+          if (src.indexOf('blob:') === 0) {
+            return !uploadStatus.isUploaded(src) && predicate(img);
+          }
+          if (src.indexOf('data:') === 0) {
+            return predicate(img);
+          }
+          return false;
+        });
+        const promises = map$3(images, img => {
+          if (cachedPromises[img.src] !== undefined) {
+            return new Promise(resolve => {
+              cachedPromises[img.src].then(imageInfo => {
+                if (typeof imageInfo === 'string') {
+                  return imageInfo;
+                }
+                resolve({
+                  image: img,
+                  blobInfo: imageInfo.blobInfo
+                });
+              });
+            });
+          }
+          const newPromise = new Promise((resolve, reject) => {
+            imageToBlobInfo(blobCache, img, resolve, reject);
+          }).then(result => {
+            delete cachedPromises[result.image.src];
+            return result;
+          }).catch(error => {
+            delete cachedPromises[img.src];
+            return error;
+          });
+          cachedPromises[img.src] = newPromise;
+          return newPromise;
+        });
+        return Promise.all(promises);
+      };
+      return { findAll };
+    };
+
+    const parseDataUri = uri => {
+      const matches = /data:([^;]+);base64,([a-z0-9\+\/=\s]+)/i.exec(uri);
+      if (matches) {
+        return Optional.some({
+          type: matches[1],
+          data: decodeURIComponent(matches[2])
+        });
+      } else {
+        return Optional.none();
+      }
+    };
+
+    const isBogusImage = img => isNonNullable(img.attr('data-mce-bogus'));
+    const isInternalImageSource = img => img.attr('src') === Env.transparentSrc || isNonNullable(img.attr('data-mce-placeholder'));
+    const registerBase64ImageFilter = (parser, settings) => {
+      const {blob_cache: blobCache} = settings;
+      const processImage = img => {
+        const inputSrc = img.attr('src');
+        if (isInternalImageSource(img) || isBogusImage(img)) {
+          return;
+        }
+        parseDataUri(inputSrc).bind(({type, data}) => Optional.from(blobCache.getByData(data, type)).orThunk(() => buildBlob(type, data).map(blob => {
+          const blobInfo = blobCache.create(uniqueId$1(), blob, data);
+          blobCache.add(blobInfo);
+          return blobInfo;
+        }))).each(blobInfo => {
+          img.attr('src', blobInfo.blobUri());
+        });
+      };
+      if (blobCache) {
+        parser.addAttributeFilter('src', nodes => each$g(nodes, processImage));
+      }
+    };
+    const register$4 = (parser, settings) => {
+      const schema = parser.schema;
+      if (settings.remove_trailing_brs) {
+        parser.addNodeFilter('br', (nodes, _, args) => {
+          const blockElements = Tools.extend({}, schema.getBlockElements());
+          const nonEmptyElements = schema.getNonEmptyElements();
+          const whitespaceElements = schema.getWhitespaceElements();
+          blockElements.body = 1;
+          for (let i = 0, l = nodes.length; i < l; i++) {
+            let node = nodes[i];
+            let parent = node.parent;
+            if (blockElements[node.parent.name] && node === parent.lastChild) {
+              let prev = node.prev;
+              while (prev) {
+                const prevName = prev.name;
+                if (prevName !== 'span' || prev.attr('data-mce-type') !== 'bookmark') {
+                  if (prevName === 'br') {
+                    node = null;
+                  }
+                  break;
+                }
+                prev = prev.prev;
+              }
+              if (node) {
+                node.remove();
+                if (isEmpty(schema, nonEmptyElements, whitespaceElements, parent)) {
+                  const elementRule = schema.getElementRule(parent.name);
+                  if (elementRule) {
+                    if (elementRule.removeEmpty) {
+                      parent.remove();
+                    } else if (elementRule.paddEmpty) {
+                      paddEmptyNode(settings, args, blockElements, parent);
+                    }
+                  }
+                }
+              }
+            } else {
+              let lastParent = node;
+              while (parent && parent.firstChild === lastParent && parent.lastChild === lastParent) {
+                lastParent = parent;
+                if (blockElements[parent.name]) {
+                  break;
+                }
+                parent = parent.parent;
+              }
+              if (lastParent === parent) {
+                const textNode = new AstNode('#text', 3);
+                textNode.value = nbsp;
+                node.replace(textNode);
+              }
+            }
+          }
+        });
+      }
+      parser.addAttributeFilter('href', nodes => {
+        let i = nodes.length;
+        const appendRel = rel => {
+          const parts = rel.split(' ').filter(p => p.length > 0);
+          return parts.concat(['noopener']).sort().join(' ');
+        };
+        const addNoOpener = rel => {
+          const newRel = rel ? Tools.trim(rel) : '';
+          if (!/\b(noopener)\b/g.test(newRel)) {
+            return appendRel(newRel);
+          } else {
+            return newRel;
+          }
+        };
+        if (!settings.allow_unsafe_link_target) {
+          while (i--) {
+            const node = nodes[i];
+            if (node.name === 'a' && node.attr('target') === '_blank') {
+              node.attr('rel', addNoOpener(node.attr('rel')));
+            }
+          }
+        }
+      });
+      if (!settings.allow_html_in_named_anchor) {
+        parser.addAttributeFilter('id,name', nodes => {
+          let i = nodes.length, sibling, prevSibling, parent, node;
+          while (i--) {
+            node = nodes[i];
+            if (node.name === 'a' && node.firstChild && !node.attr('href')) {
+              parent = node.parent;
+              sibling = node.lastChild;
+              do {
+                prevSibling = sibling.prev;
+                parent.insert(sibling, node);
+                sibling = prevSibling;
+              } while (sibling);
+            }
+          }
+        });
+      }
+      if (settings.fix_list_elements) {
+        parser.addNodeFilter('ul,ol', nodes => {
+          let i = nodes.length, node, parentNode;
+          while (i--) {
+            node = nodes[i];
+            parentNode = node.parent;
+            if (parentNode.name === 'ul' || parentNode.name === 'ol') {
+              if (node.prev && node.prev.name === 'li') {
+                node.prev.append(node);
+              } else {
+                const li = new AstNode('li', 1);
+                li.attr('style', 'list-style-type: none');
+                node.wrap(li);
+              }
+            }
+          }
+        });
+      }
+      if (settings.validate && schema.getValidClasses()) {
+        parser.addAttributeFilter('class', nodes => {
+          const validClasses = schema.getValidClasses();
+          let i = nodes.length;
+          while (i--) {
+            const node = nodes[i];
+            const classList = node.attr('class').split(' ');
+            let classValue = '';
+            for (let ci = 0; ci < classList.length; ci++) {
+              const className = classList[ci];
+              let valid = false;
+              let validClassesMap = validClasses['*'];
+              if (validClassesMap && validClassesMap[className]) {
+                valid = true;
+              }
+              validClassesMap = validClasses[node.name];
+              if (!valid && validClassesMap && validClassesMap[className]) {
+                valid = true;
+              }
+              if (valid) {
+                if (classValue) {
+                  classValue += ' ';
+                }
+                classValue += className;
+              }
+            }
+            if (!classValue.length) {
+              classValue = null;
+            }
+            node.attr('class', classValue);
+          }
+        });
+      }
+      registerBase64ImageFilter(parser, settings);
+    };
+
+    const each$5 = Tools.each, trim = Tools.trim;
+    const queryParts = 'source protocol authority userInfo user password host port relative path directory file query anchor'.split(' ');
+    const DEFAULT_PORTS = {
+      ftp: 21,
+      http: 80,
+      https: 443,
+      mailto: 25
+    };
+    const safeSvgDataUrlElements = [
+      'img',
+      'video'
+    ];
+    const blockSvgDataUris = (allowSvgDataUrls, tagName) => {
+      if (isNonNullable(allowSvgDataUrls)) {
+        return !allowSvgDataUrls;
+      } else {
+        return isNonNullable(tagName) ? !contains$2(safeSvgDataUrlElements, tagName) : true;
+      }
+    };
+    const decodeUri = encodedUri => {
+      try {
+        return decodeURIComponent(encodedUri);
+      } catch (ex) {
+        return unescape(encodedUri);
+      }
+    };
+    const isInvalidUri = (settings, uri, tagName) => {
+      const decodedUri = decodeUri(uri);
+      if (settings.allow_script_urls) {
+        return false;
+      } else if (/((java|vb)script|mhtml):/i.test(decodedUri)) {
+        return true;
+      } else if (settings.allow_html_data_urls) {
+        return false;
+      } else if (/^data:image\//i.test(decodedUri)) {
+        return blockSvgDataUris(settings.allow_svg_data_urls, tagName) && /^data:image\/svg\+xml/i.test(decodedUri);
+      } else {
+        return /^data:/i.test(decodedUri);
+      }
+    };
+    class URI {
+      constructor(url, settings) {
+        url = trim(url);
+        this.settings = settings || {};
+        const baseUri = this.settings.base_uri;
+        const self = this;
+        if (/^([\w\-]+):([^\/]{2})/i.test(url) || /^\s*#/.test(url)) {
+          self.source = url;
+          return;
+        }
+        const isProtocolRelative = url.indexOf('//') === 0;
+        if (url.indexOf('/') === 0 && !isProtocolRelative) {
+          url = (baseUri ? baseUri.protocol || 'http' : 'http') + '://mce_host' + url;
+        }
+        if (!/^[\w\-]*:?\/\//.test(url)) {
+          const baseUrl = this.settings.base_uri ? this.settings.base_uri.path : new URI(document.location.href).directory;
+          if (this.settings.base_uri && this.settings.base_uri.protocol == '') {
+            url = '//mce_host' + self.toAbsPath(baseUrl, url);
+          } else {
+            const match = /([^#?]*)([#?]?.*)/.exec(url);
+            url = (baseUri && baseUri.protocol || 'http') + '://mce_host' + self.toAbsPath(baseUrl, match[1]) + match[2];
+          }
+        }
+        url = url.replace(/@@/g, '(mce_at)');
+        const urlMatch = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?(\[[a-zA-Z0-9:.%]+\]|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(url);
+        each$5(queryParts, (v, i) => {
+          let part = urlMatch[i];
+          if (part) {
+            part = part.replace(/\(mce_at\)/g, '@@');
+          }
+          self[v] = part;
+        });
+        if (baseUri) {
+          if (!self.protocol) {
+            self.protocol = baseUri.protocol;
+          }
+          if (!self.userInfo) {
+            self.userInfo = baseUri.userInfo;
+          }
+          if (!self.port && self.host === 'mce_host') {
+            self.port = baseUri.port;
+          }
+          if (!self.host || self.host === 'mce_host') {
+            self.host = baseUri.host;
+          }
+          self.source = '';
+        }
+        if (isProtocolRelative) {
+          self.protocol = '';
+        }
+      }
+      static parseDataUri(uri) {
+        let type;
+        const uriComponents = decodeURIComponent(uri).split(',');
+        const matches = /data:([^;]+)/.exec(uriComponents[0]);
+        if (matches) {
+          type = matches[1];
+        }
+        return {
+          type,
+          data: uriComponents[1]
+        };
+      }
+      static isDomSafe(uri, context, options = {}) {
+        if (options.allow_script_urls) {
+          return true;
+        } else {
+          const decodedUri = Entities.decode(uri).replace(/[\s\u0000-\u001F]+/g, '');
+          return !isInvalidUri(options, decodedUri, context);
+        }
+      }
+      static getDocumentBaseUrl(loc) {
+        let baseUrl;
+        if (loc.protocol.indexOf('http') !== 0 && loc.protocol !== 'file:') {
+          baseUrl = loc.href;
+        } else {
+          baseUrl = loc.protocol + '//' + loc.host + loc.pathname;
+        }
+        if (/^[^:]+:\/\/\/?[^\/]+\//.test(baseUrl)) {
+          baseUrl = baseUrl.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
+          if (!/[\/\\]$/.test(baseUrl)) {
+            baseUrl += '/';
+          }
+        }
+        return baseUrl;
+      }
+      setPath(path) {
+        const pathMatch = /^(.*?)\/?(\w+)?$/.exec(path);
+        this.path = pathMatch[0];
+        this.directory = pathMatch[1];
+        this.file = pathMatch[2];
+        this.source = '';
+        this.getURI();
+      }
+      toRelative(uri) {
+        let output;
+        if (uri === './') {
+          return uri;
+        }
+        const relativeUri = new URI(uri, { base_uri: this });
+        if (relativeUri.host !== 'mce_host' && this.host !== relativeUri.host && relativeUri.host || this.port !== relativeUri.port || this.protocol !== relativeUri.protocol && relativeUri.protocol !== '') {
+          return relativeUri.getURI();
+        }
+        const tu = this.getURI(), uu = relativeUri.getURI();
+        if (tu === uu || tu.charAt(tu.length - 1) === '/' && tu.substr(0, tu.length - 1) === uu) {
+          return tu;
+        }
+        output = this.toRelPath(this.path, relativeUri.path);
+        if (relativeUri.query) {
+          output += '?' + relativeUri.query;
+        }
+        if (relativeUri.anchor) {
+          output += '#' + relativeUri.anchor;
+        }
+        return output;
+      }
+      toAbsolute(uri, noHost) {
+        const absoluteUri = new URI(uri, { base_uri: this });
+        return absoluteUri.getURI(noHost && this.isSameOrigin(absoluteUri));
+      }
+      isSameOrigin(uri) {
+        if (this.host == uri.host && this.protocol == uri.protocol) {
+          if (this.port == uri.port) {
+            return true;
+          }
+          const defaultPort = DEFAULT_PORTS[this.protocol];
+          if (defaultPort && (this.port || defaultPort) == (uri.port || defaultPort)) {
+            return true;
+          }
+        }
+        return false;
+      }
+      toRelPath(base, path) {
+        let breakPoint = 0, out = '', i, l;
+        const normalizedBase = base.substring(0, base.lastIndexOf('/')).split('/');
+        const items = path.split('/');
+        if (normalizedBase.length >= items.length) {
+          for (i = 0, l = normalizedBase.length; i < l; i++) {
+            if (i >= items.length || normalizedBase[i] !== items[i]) {
+              breakPoint = i + 1;
+              break;
+            }
+          }
+        }
+        if (normalizedBase.length < items.length) {
+          for (i = 0, l = items.length; i < l; i++) {
+            if (i >= normalizedBase.length || normalizedBase[i] !== items[i]) {
+              breakPoint = i + 1;
+              break;
+            }
+          }
+        }
+        if (breakPoint === 1) {
+          return path;
+        }
+        for (i = 0, l = normalizedBase.length - (breakPoint - 1); i < l; i++) {
+          out += '../';
+        }
+        for (i = breakPoint - 1, l = items.length; i < l; i++) {
+          if (i !== breakPoint - 1) {
+            out += '/' + items[i];
+          } else {
+            out += items[i];
+          }
+        }
+        return out;
+      }
+      toAbsPath(base, path) {
+        let i, nb = 0, o = [], outPath;
+        const tr = /\/$/.test(path) ? '/' : '';
+        let normalizedBase = base.split('/');
+        const normalizedPath = path.split('/');
+        each$5(normalizedBase, k => {
+          if (k) {
+            o.push(k);
+          }
+        });
+        normalizedBase = o;
+        for (i = normalizedPath.length - 1, o = []; i >= 0; i--) {
+          if (normalizedPath[i].length === 0 || normalizedPath[i] === '.') {
+            continue;
+          }
+          if (normalizedPath[i] === '..') {
+            nb++;
+            continue;
+          }
+          if (nb > 0) {
+            nb--;
+            continue;
+          }
+          o.push(normalizedPath[i]);
+        }
+        i = normalizedBase.length - nb;
+        if (i <= 0) {
+          outPath = reverse(o).join('/');
+        } else {
+          outPath = normalizedBase.slice(0, i).join('/') + '/' + reverse(o).join('/');
+        }
+        if (outPath.indexOf('/') !== 0) {
+          outPath = '/' + outPath;
+        }
+        if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) {
+          outPath += tr;
+        }
+        return outPath;
+      }
+      getURI(noProtoHost = false) {
+        let s;
+        if (!this.source || noProtoHost) {
+          s = '';
+          if (!noProtoHost) {
+            if (this.protocol) {
+              s += this.protocol + '://';
+            } else {
+              s += '//';
+            }
+            if (this.userInfo) {
+              s += this.userInfo + '@';
+            }
+            if (this.host) {
+              s += this.host;
+            }
+            if (this.port) {
+              s += ':' + this.port;
+            }
+          }
+          if (this.path) {
+            s += this.path;
+          }
+          if (this.query) {
+            s += '?' + this.query;
+          }
+          if (this.anchor) {
+            s += '#' + this.anchor;
+          }
+          this.source = s;
+        }
+        return this.source;
+      }
+    }
+
+    const makeMap = Tools.makeMap, each$4 = Tools.each, explode$1 = Tools.explode, extend$1 = Tools.extend;
+    const basePurifyConfig = {
+      IN_PLACE: true,
+      ALLOW_UNKNOWN_PROTOCOLS: true,
+      ALLOWED_TAGS: [
+        '#comment',
+        '#cdata-section',
+        'body'
+      ],
+      ALLOWED_ATTR: []
+    };
+    const filteredUrlAttrs = Tools.makeMap('src,href,data,background,action,formaction,poster,xlink:href');
+    const internalElementAttr = 'data-mce-type';
+    const getPurifyConfig = (settings, mimeType) => {
+      const config = { ...basePurifyConfig };
+      config.PARSER_MEDIA_TYPE = mimeType;
+      if (settings.allow_script_urls) {
+        config.ALLOWED_URI_REGEXP = /.*/;
+      } else if (settings.allow_html_data_urls) {
+        config.ALLOWED_URI_REGEXP = /^(?!(\w+script|mhtml):)/i;
+      }
+      return config;
+    };
+    const setupPurify = (settings, schema) => {
+      const purify$1 = purify();
+      const validate = settings.validate;
+      let uid = 0;
+      purify$1.addHook('uponSanitizeElement', (ele, evt) => {
+        var _a, _b;
+        if (ele.nodeType === COMMENT && !settings.allow_conditional_comments && /^\[if/i.test(ele.nodeValue)) {
+          ele.nodeValue = ' ' + ele.nodeValue;
+        }
+        const tagName = evt.tagName;
+        if (ele.nodeType !== ELEMENT || tagName === 'body') {
+          return;
+        }
+        const element = SugarElement.fromDom(ele);
+        const isInternalElement = has$1(element, internalElementAttr);
+        const bogus = get$9(element, 'data-mce-bogus');
+        if (!isInternalElement && isString(bogus)) {
+          if (bogus === 'all') {
+            remove$5(element);
+          } else {
+            unwrap(element);
+          }
+          return;
+        }
+        const rule = schema.getElementRule(tagName.toLowerCase());
+        if (validate && !rule) {
+          unwrap(element);
+          return;
+        } else {
+          evt.allowedTags[tagName] = true;
+        }
+        if (validate && !isInternalElement) {
+          each$g((_a = rule.attributesForced) !== null && _a !== void 0 ? _a : [], attr => {
+            set$2(element, attr.name, attr.value === '{$uid}' ? `mce_${ uid++ }` : attr.value);
+          });
+          each$g((_b = rule.attributesDefault) !== null && _b !== void 0 ? _b : [], attr => {
+            if (!has$1(element, attr.name)) {
+              set$2(element, attr.name, attr.value === '{$uid}' ? `mce_${ uid++ }` : attr.value);
+            }
+          });
+          if (rule.attributesRequired && !exists(rule.attributesRequired, attr => has$1(element, attr))) {
+            unwrap(element);
+            return;
+          }
+          if (rule.removeEmptyAttrs && hasNone(element)) {
+            unwrap(element);
+            return;
+          }
+          if (rule.outputName && rule.outputName !== tagName.toLowerCase()) {
+            mutate(element, rule.outputName);
+          }
+        }
+      });
+      purify$1.addHook('uponSanitizeAttribute', (ele, evt) => {
+        const tagName = ele.tagName.toLowerCase();
+        const {attrName, attrValue} = evt;
+        evt.keepAttr = !validate || schema.isValid(tagName, attrName) || startsWith(attrName, 'data-') || startsWith(attrName, 'aria-');
+        if (attrName in filteredUrlAttrs && isInvalidUri(settings, attrValue, tagName)) {
+          evt.keepAttr = false;
+        }
+        if (evt.keepAttr) {
+          evt.allowedAttributes[attrName] = true;
+          if (attrName in schema.getBoolAttrs()) {
+            evt.attrValue = attrName;
+          }
+          if (settings.allow_svg_data_urls && startsWith(attrValue, 'data:image/svg+xml')) {
+            evt.forceKeepAttr = true;
+          }
+        } else if (ele.hasAttribute(internalElementAttr) && (attrName === 'id' || attrName === 'class' || attrName === 'style')) {
+          evt.forceKeepAttr = true;
+        }
+      });
+      return purify$1;
+    };
+    const transferChildren = (parent, nativeParent, specialElements) => {
+      const parentName = parent.name;
+      const isSpecial = parentName in specialElements && parentName !== 'title' && parentName !== 'textarea';
+      const childNodes = nativeParent.childNodes;
+      for (let ni = 0, nl = childNodes.length; ni < nl; ni++) {
+        const nativeChild = childNodes[ni];
+        const child = new AstNode(nativeChild.nodeName.toLowerCase(), nativeChild.nodeType);
+        if (isElement$6(nativeChild)) {
+          const attributes = nativeChild.attributes;
+          for (let ai = 0, al = attributes.length; ai < al; ai++) {
+            const attr = attributes[ai];
+            child.attr(attr.name, attr.value);
+          }
+        } else if (isText$8(nativeChild)) {
+          child.value = nativeChild.data;
+          if (isSpecial) {
+            child.raw = true;
+          }
+        } else if (isComment(nativeChild) || isCData(nativeChild) || isPi(nativeChild)) {
+          child.value = nativeChild.data;
+        }
+        transferChildren(child, nativeChild, specialElements);
+        parent.append(child);
+      }
+    };
+    const walkTree = (root, preprocessors, postprocessors) => {
+      const traverseOrder = [];
+      for (let node = root, lastNode = node; isNonNullable(node); lastNode = node, node = node.walk()) {
+        each$g(preprocessors, preprocess => preprocess(node));
+        if (isNullable(node.parent) && node !== root) {
+          node = lastNode;
+        } else {
+          traverseOrder.push(node);
+        }
+      }
+      for (let i = traverseOrder.length - 1; i >= 0; i--) {
+        const node = traverseOrder[i];
+        each$g(postprocessors, postprocess => postprocess(node));
+      }
+    };
+    const whitespaceCleaner = (root, schema, settings, args) => {
+      const validate = settings.validate;
+      const nonEmptyElements = schema.getNonEmptyElements();
+      const whitespaceElements = schema.getWhitespaceElements();
+      const blockElements = extend$1(makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements());
+      const textRootBlockElements = getTextRootBlockElements(schema);
+      const allWhiteSpaceRegExp = /[ \t\r\n]+/g;
+      const startWhiteSpaceRegExp = /^[ \t\r\n]+/;
+      const endWhiteSpaceRegExp = /[ \t\r\n]+$/;
+      const hasWhitespaceParent = node => {
+        node = node.parent;
+        while (isNonNullable(node)) {
+          if (node.name in whitespaceElements) {
+            return true;
+          } else {
+            node = node.parent;
+          }
+        }
+        return false;
+      };
+      const isTextRootBlockEmpty = node => {
+        let tempNode = node;
+        while (isNonNullable(tempNode)) {
+          if (tempNode.name in textRootBlockElements) {
+            return isEmpty(schema, nonEmptyElements, whitespaceElements, tempNode);
+          } else {
+            tempNode = tempNode.parent;
+          }
+        }
+        return false;
+      };
+      const isAtEdgeOfBlock = (node, start) => {
+        const neighbour = start ? node.prev : node.next;
+        if (isNonNullable(neighbour)) {
+          return false;
+        }
+        return node.parent.name in blockElements && (node.parent !== root || args.isRootContent);
+      };
+      const preprocess = node => {
+        if (node.type === 3) {
+          if (!hasWhitespaceParent(node)) {
+            let text = node.value;
+            text = text.replace(allWhiteSpaceRegExp, ' ');
+            if (isLineBreakNode(node.prev, blockElements) || isAtEdgeOfBlock(node, true)) {
+              text = text.replace(startWhiteSpaceRegExp, '');
+            }
+            if (text.length === 0) {
+              node.remove();
+            } else {
+              node.value = text;
+            }
+          }
+        }
+      };
+      const postprocess = node => {
+        var _a;
+        if (node.type === 1) {
+          const elementRule = schema.getElementRule(node.name);
+          if (validate && elementRule) {
+            const isNodeEmpty = isEmpty(schema, nonEmptyElements, whitespaceElements, node);
+            if (elementRule.paddInEmptyBlock && isNodeEmpty && isTextRootBlockEmpty(node)) {
+              paddEmptyNode(settings, args, blockElements, node);
+            } else if (elementRule.removeEmpty && isNodeEmpty) {
+              if (blockElements[node.name]) {
+                node.remove();
+              } else {
+                node.unwrap();
+              }
+            } else if (elementRule.paddEmpty && (isNodeEmpty || isPaddedWithNbsp(node))) {
+              paddEmptyNode(settings, args, blockElements, node);
+            }
+          }
+        } else if (node.type === 3) {
+          if (!hasWhitespaceParent(node)) {
+            let text = node.value;
+            if (blockElements[(_a = node.next) === null || _a === void 0 ? void 0 : _a.name] || isAtEdgeOfBlock(node, false)) {
+              text = text.replace(endWhiteSpaceRegExp, '');
+            }
+            if (text.length === 0) {
+              node.remove();
+            } else {
+              node.value = text;
+            }
+          }
+        }
+      };
+      return [
+        preprocess,
+        postprocess
+      ];
+    };
+    const getRootBlockName = (settings, args) => {
+      var _a;
+      const name = (_a = args.forced_root_block) !== null && _a !== void 0 ? _a : settings.forced_root_block;
+      if (name === false) {
+        return '';
+      } else if (name === true) {
+        return 'p';
+      } else {
+        return name;
+      }
+    };
+    const DomParser = (settings = {}, schema = Schema()) => {
+      const nodeFilters = {};
+      const attributeFilters = [];
+      const defaultedSettings = {
+        validate: true,
+        root_name: 'body',
+        ...settings
+      };
+      const parser = new DOMParser();
+      const purify = setupPurify(defaultedSettings, schema);
+      const parseAndSanitizeWithContext = (html, rootName, format = 'html') => {
+        const mimeType = format === 'xhtml' ? 'application/xhtml+xml' : 'text/html';
+        const isSpecialRoot = has$2(schema.getSpecialElements(), rootName.toLowerCase());
+        const content = isSpecialRoot ? `<${ rootName }>${ html }</${ rootName }>` : html;
+        const wrappedHtml = format === 'xhtml' ? `<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>${ content }</body></html>` : `<body>${ content }</body>`;
+        const body = parser.parseFromString(wrappedHtml, mimeType).body;
+        purify.sanitize(body, getPurifyConfig(defaultedSettings, mimeType));
+        purify.removed = [];
+        return isSpecialRoot ? body.firstChild : body;
+      };
+      const addNodeFilter = (name, callback) => {
+        each$4(explode$1(name), name => {
+          let list = nodeFilters[name];
+          if (!list) {
+            nodeFilters[name] = list = [];
+          }
+          list.push(callback);
+        });
+      };
+      const getNodeFilters = () => {
+        const out = [];
+        for (const name in nodeFilters) {
+          if (has$2(nodeFilters, name)) {
+            out.push({
+              name,
+              callbacks: nodeFilters[name]
+            });
+          }
+        }
+        return out;
+      };
+      const addAttributeFilter = (name, callback) => {
+        each$4(explode$1(name), name => {
+          let i;
+          for (i = 0; i < attributeFilters.length; i++) {
+            if (attributeFilters[i].name === name) {
+              attributeFilters[i].callbacks.push(callback);
+              return;
+            }
+          }
+          attributeFilters.push({
+            name,
+            callbacks: [callback]
+          });
+        });
+      };
+      const getAttributeFilters = () => [].concat(attributeFilters);
+      const findInvalidChildren = (node, invalidChildren) => {
+        const parent = node.parent;
+        if (parent && schema.children[node.name] && !schema.isValidChild(parent.name, node.name)) {
+          invalidChildren.push(node);
+        }
+      };
+      const addRootBlocks = (rootNode, rootBlockName) => {
+        const blockElements = extend$1(makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements());
+        const startWhiteSpaceRegExp = /^[ \t\r\n]+/;
+        const endWhiteSpaceRegExp = /[ \t\r\n]+$/;
+        let node = rootNode.firstChild, rootBlockNode = null;
+        const trim = rootBlock => {
+          if (rootBlock) {
+            node = rootBlock.firstChild;
+            if (node && node.type === 3) {
+              node.value = node.value.replace(startWhiteSpaceRegExp, '');
+            }
+            node = rootBlock.lastChild;
+            if (node && node.type === 3) {
+              node.value = node.value.replace(endWhiteSpaceRegExp, '');
+            }
+          }
+        };
+        if (!schema.isValidChild(rootNode.name, rootBlockName.toLowerCase())) {
+          return;
+        }
+        while (node) {
+          const next = node.next;
+          if (node.type === 3 || node.type === 1 && node.name !== 'p' && !blockElements[node.name] && !node.attr(internalElementAttr)) {
+            if (!rootBlockNode) {
+              rootBlockNode = new AstNode(rootBlockName, 1);
+              rootBlockNode.attr(defaultedSettings.forced_root_block_attrs);
+              rootNode.insert(rootBlockNode, node);
+              rootBlockNode.append(node);
+            } else {
+              rootBlockNode.append(node);
+            }
+          } else {
+            trim(rootBlockNode);
+            rootBlockNode = null;
+          }
+          node = next;
+        }
+        trim(rootBlockNode);
+      };
+      const parse = (html, args = {}) => {
+        var _a;
+        const validate = defaultedSettings.validate;
+        const rootName = (_a = args.context) !== null && _a !== void 0 ? _a : defaultedSettings.root_name;
+        const element = parseAndSanitizeWithContext(html, rootName, args.format);
+        const rootNode = new AstNode(rootName, 11);
+        transferChildren(rootNode, element, schema.getSpecialElements());
+        const [whitespacePre, whitespacePost] = whitespaceCleaner(rootNode, schema, defaultedSettings, args);
+        const invalidChildren = [];
+        const invalidFinder = validate ? node => findInvalidChildren(node, invalidChildren) : noop;
+        const nodeFilters = getNodeFilters();
+        const matches = {
+          nodes: {},
+          attributes: {}
+        };
+        const matchFinder = node => matchNode$1(nodeFilters, attributeFilters, node, matches);
+        walkTree(rootNode, [
+          whitespacePre,
+          matchFinder
+        ], [
+          whitespacePost,
+          invalidFinder
+        ]);
+        invalidChildren.reverse();
+        if (validate && invalidChildren.length > 0) {
+          if (args.context) {
+            const {
+              pass: topLevelChildren,
+              fail: otherChildren
+            } = partition$2(invalidChildren, child => child.parent === rootNode);
+            cleanInvalidNodes(otherChildren, schema, matchFinder);
+            args.invalid = topLevelChildren.length > 0;
+          } else {
+            cleanInvalidNodes(invalidChildren, schema, matchFinder);
+          }
+        }
+        const rootBlockName = getRootBlockName(defaultedSettings, args);
+        if (rootBlockName && (rootNode.name === 'body' || args.isRootContent)) {
+          addRootBlocks(rootNode, rootBlockName);
+        }
+        if (!args.invalid) {
+          runFilters(matches, args);
+        }
+        return rootNode;
+      };
+      const exports = {
+        schema,
+        addAttributeFilter,
+        getAttributeFilters,
+        addNodeFilter,
+        getNodeFilters,
+        parse
+      };
+      register$4(exports, defaultedSettings);
+      register$5(exports, defaultedSettings, schema);
+      return exports;
+    };
+
+    const serializeContent = content => isTreeNode(content) ? HtmlSerializer({ validate: false }).serialize(content) : content;
+    const withSerializedContent = (content, fireEvent) => {
+      const serializedContent = serializeContent(content);
+      const eventArgs = fireEvent(serializedContent);
+      if (eventArgs.isDefaultPrevented()) {
+        return eventArgs;
+      } else if (isTreeNode(content)) {
+        if (eventArgs.content !== serializedContent) {
+          const rootNode = DomParser({
+            validate: false,
+            forced_root_block: false
+          }).parse(eventArgs.content, { context: content.name });
+          return {
+            ...eventArgs,
+            content: rootNode
+          };
+        } else {
+          return {
+            ...eventArgs,
+            content
+          };
+        }
+      } else {
+        return eventArgs;
+      }
+    };
+    const preProcessGetContent = (editor, args) => {
+      if (args.no_events) {
+        return Result.value(args);
+      } else {
+        const eventArgs = fireBeforeGetContent(editor, args);
+        if (eventArgs.isDefaultPrevented()) {
+          return Result.error(fireGetContent(editor, {
+            content: '',
+            ...eventArgs
+          }).content);
+        } else {
+          return Result.value(eventArgs);
+        }
+      }
+    };
+    const postProcessGetContent = (editor, content, args) => {
+      if (args.no_events) {
+        return content;
+      } else {
+        const processedEventArgs = withSerializedContent(content, c => fireGetContent(editor, {
+          ...args,
+          content: c
+        }));
+        return processedEventArgs.content;
+      }
+    };
+    const preProcessSetContent = (editor, args) => {
+      if (args.no_events) {
+        return Result.value(args);
+      } else {
+        const processedEventArgs = withSerializedContent(args.content, content => fireBeforeSetContent(editor, {
+          ...args,
+          content
+        }));
+        if (processedEventArgs.isDefaultPrevented()) {
+          fireSetContent(editor, processedEventArgs);
+          return Result.error(undefined);
+        } else {
+          return Result.value(processedEventArgs);
+        }
+      }
+    };
+    const postProcessSetContent = (editor, content, args) => {
+      if (!args.no_events) {
+        fireSetContent(editor, {
+          ...args,
+          content
+        });
+      }
+    };
+
+    const tableModel = (element, width, rows) => ({
+      element,
+      width,
+      rows
+    });
+    const tableRow = (element, cells) => ({
+      element,
+      cells
+    });
+    const cellPosition = (x, y) => ({
+      x,
+      y
+    });
+    const getSpan = (td, key) => {
+      const value = parseInt(get$9(td, key), 10);
+      return isNaN(value) ? 1 : value;
+    };
+    const fillout = (table, x, y, tr, td) => {
+      const rowspan = getSpan(td, 'rowspan');
+      const colspan = getSpan(td, 'colspan');
+      const rows = table.rows;
+      for (let y2 = y; y2 < y + rowspan; y2++) {
+        if (!rows[y2]) {
+          rows[y2] = tableRow(deep$1(tr), []);
+        }
+        for (let x2 = x; x2 < x + colspan; x2++) {
+          const cells = rows[y2].cells;
+          cells[x2] = y2 === y && x2 === x ? td : shallow$1(td);
+        }
+      }
+    };
+    const cellExists = (table, x, y) => {
+      const rows = table.rows;
+      const cells = rows[y] ? rows[y].cells : [];
+      return !!cells[x];
+    };
+    const skipCellsX = (table, x, y) => {
+      while (cellExists(table, x, y)) {
+        x++;
+      }
+      return x;
+    };
+    const getWidth = rows => {
+      return foldl(rows, (acc, row) => {
+        return row.cells.length > acc ? row.cells.length : acc;
+      }, 0);
+    };
+    const findElementPos = (table, element) => {
+      const rows = table.rows;
+      for (let y = 0; y < rows.length; y++) {
+        const cells = rows[y].cells;
+        for (let x = 0; x < cells.length; x++) {
+          if (eq(cells[x], element)) {
+            return Optional.some(cellPosition(x, y));
+          }
+        }
+      }
+      return Optional.none();
+    };
+    const extractRows = (table, sx, sy, ex, ey) => {
+      const newRows = [];
+      const rows = table.rows;
+      for (let y = sy; y <= ey; y++) {
+        const cells = rows[y].cells;
+        const slice = sx < ex ? cells.slice(sx, ex + 1) : cells.slice(ex, sx + 1);
+        newRows.push(tableRow(rows[y].element, slice));
+      }
+      return newRows;
+    };
+    const subTable = (table, startPos, endPos) => {
+      const sx = startPos.x, sy = startPos.y;
+      const ex = endPos.x, ey = endPos.y;
+      const newRows = sy < ey ? extractRows(table, sx, sy, ex, ey) : extractRows(table, sx, ey, ex, sy);
+      return tableModel(table.element, getWidth(newRows), newRows);
+    };
+    const createDomTable = (table, rows) => {
+      const tableElement = shallow$1(table.element);
+      const tableBody = SugarElement.fromTag('tbody');
+      append(tableBody, rows);
+      append$1(tableElement, tableBody);
+      return tableElement;
+    };
+    const modelRowsToDomRows = table => {
+      return map$3(table.rows, row => {
+        const cells = map$3(row.cells, cell => {
+          const td = deep$1(cell);
+          remove$a(td, 'colspan');
+          remove$a(td, 'rowspan');
+          return td;
+        });
+        const tr = shallow$1(row.element);
+        append(tr, cells);
+        return tr;
+      });
+    };
+    const fromDom = tableElm => {
+      const table = tableModel(shallow$1(tableElm), 0, []);
+      each$g(descendants(tableElm, 'tr'), (tr, y) => {
+        each$g(descendants(tr, 'td,th'), (td, x) => {
+          fillout(table, skipCellsX(table, x, y), y, tr, td);
+        });
+      });
+      return tableModel(table.element, getWidth(table.rows), table.rows);
+    };
+    const toDom = table => {
+      return createDomTable(table, modelRowsToDomRows(table));
+    };
+    const subsection = (table, startElement, endElement) => {
+      return findElementPos(table, startElement).bind(startPos => {
+        return findElementPos(table, endElement).map(endPos => {
+          return subTable(table, startPos, endPos);
+        });
+      });
+    };
+
+    const findParentListContainer = parents => find$2(parents, elm => name(elm) === 'ul' || name(elm) === 'ol');
+    const getFullySelectedListWrappers = (parents, rng) => find$2(parents, elm => name(elm) === 'li' && hasAllContentsSelected(elm, rng)).fold(constant([]), _li => findParentListContainer(parents).map(listCont => {
+      const listElm = SugarElement.fromTag(name(listCont));
+      const listStyles = filter$5(getAllRaw(listCont), (_style, name) => startsWith(name, 'list-style'));
+      setAll(listElm, listStyles);
+      return [
+        SugarElement.fromTag('li'),
+        listElm
+      ];
+    }).getOr([]));
+    const wrap = (innerElm, elms) => {
+      const wrapped = foldl(elms, (acc, elm) => {
+        append$1(elm, acc);
+        return elm;
+      }, innerElm);
+      return elms.length > 0 ? fromElements([wrapped]) : wrapped;
+    };
+    const directListWrappers = commonAnchorContainer => {
+      if (isListItem(commonAnchorContainer)) {
+        return parent(commonAnchorContainer).filter(isList).fold(constant([]), listElm => [
+          commonAnchorContainer,
+          listElm
+        ]);
+      } else {
+        return isList(commonAnchorContainer) ? [commonAnchorContainer] : [];
+      }
+    };
+    const getWrapElements = (rootNode, rng) => {
+      const commonAnchorContainer = SugarElement.fromDom(rng.commonAncestorContainer);
+      const parents = parentsAndSelf(commonAnchorContainer, rootNode);
+      const wrapElements = filter$6(parents, elm => isInline$1(elm) || isHeading(elm));
+      const listWrappers = getFullySelectedListWrappers(parents, rng);
+      const allWrappers = wrapElements.concat(listWrappers.length ? listWrappers : directListWrappers(commonAnchorContainer));
+      return map$3(allWrappers, shallow$1);
+    };
+    const emptyFragment = () => fromElements([]);
+    const getFragmentFromRange = (rootNode, rng) => wrap(SugarElement.fromDom(rng.cloneContents()), getWrapElements(rootNode, rng));
+    const getParentTable = (rootElm, cell) => ancestor$2(cell, 'table', curry(eq, rootElm));
+    const getTableFragment = (rootNode, selectedTableCells) => getParentTable(rootNode, selectedTableCells[0]).bind(tableElm => {
+      const firstCell = selectedTableCells[0];
+      const lastCell = selectedTableCells[selectedTableCells.length - 1];
+      const fullTableModel = fromDom(tableElm);
+      return subsection(fullTableModel, firstCell, lastCell).map(sectionedTableModel => fromElements([toDom(sectionedTableModel)]));
+    }).getOrThunk(emptyFragment);
+    const getSelectionFragment = (rootNode, ranges) => ranges.length > 0 && ranges[0].collapsed ? emptyFragment() : getFragmentFromRange(rootNode, ranges[0]);
+    const read$3 = (rootNode, ranges) => {
+      const selectedCells = getCellsFromElementOrRanges(ranges, rootNode);
+      return selectedCells.length > 0 ? getTableFragment(rootNode, selectedCells) : getSelectionFragment(rootNode, ranges);
+    };
+
+    const isCollapsibleWhitespace = (text, index) => index >= 0 && index < text.length && isWhiteSpace(text.charAt(index));
+    const getInnerText = bin => {
+      return trim$1(bin.innerText);
+    };
+    const getContextNodeName = parentBlockOpt => parentBlockOpt.map(block => block.nodeName).getOr('div').toLowerCase();
+    const getTextContent = editor => Optional.from(editor.selection.getRng()).map(rng => {
+      const parentBlockOpt = Optional.from(editor.dom.getParent(rng.commonAncestorContainer, editor.dom.isBlock));
+      const body = editor.getBody();
+      const contextNodeName = getContextNodeName(parentBlockOpt);
+      const bin = editor.dom.add(body, contextNodeName, {
+        'data-mce-bogus': 'all',
+        'style': 'overflow: hidden; opacity: 0;'
+      }, rng.cloneContents());
+      const text = getInnerText(bin);
+      const nonRenderedText = trim$1(bin.textContent);
+      editor.dom.remove(bin);
+      if (isCollapsibleWhitespace(nonRenderedText, 0) || isCollapsibleWhitespace(nonRenderedText, nonRenderedText.length - 1)) {
+        const parentBlock = parentBlockOpt.getOr(body);
+        const parentBlockText = getInnerText(parentBlock);
+        const textIndex = parentBlockText.indexOf(text);
+        if (textIndex === -1) {
+          return text;
+        } else {
+          const hasProceedingSpace = isCollapsibleWhitespace(parentBlockText, textIndex - 1);
+          const hasTrailingSpace = isCollapsibleWhitespace(parentBlockText, textIndex + text.length);
+          return (hasProceedingSpace ? ' ' : '') + text + (hasTrailingSpace ? ' ' : '');
+        }
+      } else {
+        return text;
+      }
+    }).getOr('');
+    const getSerializedContent = (editor, args) => {
+      const rng = editor.selection.getRng(), tmpElm = editor.dom.create('body');
+      const sel = editor.selection.getSel();
+      const ranges = processRanges(editor, getRanges$1(sel));
+      const fragment = args.contextual ? read$3(SugarElement.fromDom(editor.getBody()), ranges).dom : rng.cloneContents();
+      if (fragment) {
+        tmpElm.appendChild(fragment);
+      }
+      return editor.selection.serializer.serialize(tmpElm, args);
+    };
+    const extractSelectedContent = (editor, args) => {
+      if (args.format === 'text') {
+        return getTextContent(editor);
+      } else {
+        const content = getSerializedContent(editor, args);
+        if (args.format === 'tree') {
+          return content;
+        } else {
+          return editor.selection.isCollapsed() ? '' : content;
+        }
+      }
+    };
+    const setupArgs$3 = (args, format) => ({
+      ...args,
+      format,
+      get: true,
+      selection: true,
+      getInner: true
+    });
+    const getSelectedContentInternal = (editor, format, args = {}) => {
+      const defaultedArgs = setupArgs$3(args, format);
+      return preProcessGetContent(editor, defaultedArgs).fold(identity, updatedArgs => {
+        const content = extractSelectedContent(editor, updatedArgs);
+        return postProcessGetContent(editor, content, updatedArgs);
+      });
+    };
+
+    const KEEP = 0, INSERT = 1, DELETE = 2;
+    const diff = (left, right) => {
+      const size = left.length + right.length + 2;
+      const vDown = new Array(size);
+      const vUp = new Array(size);
+      const snake = (start, end, diag) => {
+        return {
+          start,
+          end,
+          diag
+        };
+      };
+      const buildScript = (start1, end1, start2, end2, script) => {
+        const middle = getMiddleSnake(start1, end1, start2, end2);
+        if (middle === null || middle.start === end1 && middle.diag === end1 - end2 || middle.end === start1 && middle.diag === start1 - start2) {
+          let i = start1;
+          let j = start2;
+          while (i < end1 || j < end2) {
+            if (i < end1 && j < end2 && left[i] === right[j]) {
+              script.push([
+                KEEP,
+                left[i]
+              ]);
+              ++i;
+              ++j;
+            } else {
+              if (end1 - start1 > end2 - start2) {
+                script.push([
+                  DELETE,
+                  left[i]
+                ]);
+                ++i;
+              } else {
+                script.push([
+                  INSERT,
+                  right[j]
+                ]);
+                ++j;
+              }
+            }
+          }
+        } else {
+          buildScript(start1, middle.start, start2, middle.start - middle.diag, script);
+          for (let i2 = middle.start; i2 < middle.end; ++i2) {
+            script.push([
+              KEEP,
+              left[i2]
+            ]);
+          }
+          buildScript(middle.end, end1, middle.end - middle.diag, end2, script);
+        }
+      };
+      const buildSnake = (start, diag, end1, end2) => {
+        let end = start;
+        while (end - diag < end2 && end < end1 && left[end] === right[end - diag]) {
+          ++end;
+        }
+        return snake(start, end, diag);
+      };
+      const getMiddleSnake = (start1, end1, start2, end2) => {
+        const m = end1 - start1;
+        const n = end2 - start2;
+        if (m === 0 || n === 0) {
+          return null;
+        }
+        const delta = m - n;
+        const sum = n + m;
+        const offset = (sum % 2 === 0 ? sum : sum + 1) / 2;
+        vDown[1 + offset] = start1;
+        vUp[1 + offset] = end1 + 1;
+        let d, k, i, x, y;
+        for (d = 0; d <= offset; ++d) {
+          for (k = -d; k <= d; k += 2) {
+            i = k + offset;
+            if (k === -d || k !== d && vDown[i - 1] < vDown[i + 1]) {
+              vDown[i] = vDown[i + 1];
+            } else {
+              vDown[i] = vDown[i - 1] + 1;
+            }
+            x = vDown[i];
+            y = x - start1 + start2 - k;
+            while (x < end1 && y < end2 && left[x] === right[y]) {
+              vDown[i] = ++x;
+              ++y;
+            }
+            if (delta % 2 !== 0 && delta - d <= k && k <= delta + d) {
+              if (vUp[i - delta] <= vDown[i]) {
+                return buildSnake(vUp[i - delta], k + start1 - start2, end1, end2);
+              }
+            }
+          }
+          for (k = delta - d; k <= delta + d; k += 2) {
+            i = k + offset - delta;
+            if (k === delta - d || k !== delta + d && vUp[i + 1] <= vUp[i - 1]) {
+              vUp[i] = vUp[i + 1] - 1;
+            } else {
+              vUp[i] = vUp[i - 1];
+            }
+            x = vUp[i] - 1;
+            y = x - start1 + start2 - k;
+            while (x >= start1 && y >= start2 && left[x] === right[y]) {
+              vUp[i] = x--;
+              y--;
+            }
+            if (delta % 2 === 0 && -d <= k && k <= d) {
+              if (vUp[i] <= vDown[i + delta]) {
+                return buildSnake(vUp[i], k + start1 - start2, end1, end2);
+              }
+            }
+          }
+        }
+      };
+      const script = [];
+      buildScript(0, left.length, 0, right.length, script);
+      return script;
+    };
+
+    const getOuterHtml = elm => {
+      if (isElement$6(elm)) {
+        return elm.outerHTML;
+      } else if (isText$8(elm)) {
+        return Entities.encodeRaw(elm.data, false);
+      } else if (isComment(elm)) {
+        return '<!--' + elm.data + '-->';
+      }
+      return '';
+    };
+    const createFragment = html => {
+      let node;
+      const container = document.createElement('div');
+      const frag = document.createDocumentFragment();
+      if (html) {
+        container.innerHTML = html;
+      }
+      while (node = container.firstChild) {
+        frag.appendChild(node);
+      }
+      return frag;
+    };
+    const insertAt = (elm, html, index) => {
+      const fragment = createFragment(html);
+      if (elm.hasChildNodes() && index < elm.childNodes.length) {
+        const target = elm.childNodes[index];
+        target.parentNode.insertBefore(fragment, target);
+      } else {
+        elm.appendChild(fragment);
+      }
+    };
+    const removeAt = (elm, index) => {
+      if (elm.hasChildNodes() && index < elm.childNodes.length) {
+        const target = elm.childNodes[index];
+        target.parentNode.removeChild(target);
+      }
+    };
+    const applyDiff = (diff, elm) => {
+      let index = 0;
+      each$g(diff, action => {
+        if (action[0] === KEEP) {
+          index++;
+        } else if (action[0] === INSERT) {
+          insertAt(elm, action[1], index);
+          index++;
+        } else if (action[0] === DELETE) {
+          removeAt(elm, index);
+        }
+      });
+    };
+    const read$2 = elm => {
+      return filter$6(map$3(from(elm.childNodes), getOuterHtml), item => {
+        return item.length > 0;
+      });
+    };
+    const write = (fragments, elm) => {
+      const currentFragments = map$3(from(elm.childNodes), getOuterHtml);
+      applyDiff(diff(currentFragments, fragments), elm);
+      return elm;
+    };
+
+    const lazyTempDocument = cached(() => document.implementation.createHTMLDocument('undo'));
+    const hasIframes = html => {
+      return html.indexOf('</iframe>') !== -1;
+    };
+    const createFragmentedLevel = fragments => {
+      return {
+        type: 'fragmented',
+        fragments,
+        content: '',
+        bookmark: null,
+        beforeBookmark: null
+      };
+    };
+    const createCompleteLevel = content => {
+      return {
+        type: 'complete',
+        fragments: null,
+        content,
+        bookmark: null,
+        beforeBookmark: null
+      };
+    };
+    const createFromEditor = editor => {
+      const fragments = read$2(editor.getBody());
+      const trimmedFragments = bind$3(fragments, html => {
+        const trimmed = trimInternal(editor.serializer, html);
+        return trimmed.length > 0 ? [trimmed] : [];
+      });
+      const content = trimmedFragments.join('');
+      return hasIframes(content) ? createFragmentedLevel(trimmedFragments) : createCompleteLevel(content);
+    };
+    const applyToEditor = (editor, level, before) => {
+      const bookmark = before ? level.beforeBookmark : level.bookmark;
+      if (level.type === 'fragmented') {
+        write(level.fragments, editor.getBody());
+      } else {
+        editor.setContent(level.content, {
+          format: 'raw',
+          no_selection: isNonNullable(bookmark) && isPathBookmark(bookmark) ? !bookmark.isFakeCaret : true
+        });
+      }
+      editor.selection.moveToBookmark(bookmark);
+    };
+    const getLevelContent = level => {
+      return level.type === 'fragmented' ? level.fragments.join('') : level.content;
+    };
+    const getCleanLevelContent = level => {
+      const elm = SugarElement.fromTag('body', lazyTempDocument());
+      set(elm, getLevelContent(level));
+      each$g(descendants(elm, '*[data-mce-bogus]'), unwrap);
+      return get$6(elm);
+    };
+    const hasEqualContent = (level1, level2) => getLevelContent(level1) === getLevelContent(level2);
+    const hasEqualCleanedContent = (level1, level2) => getCleanLevelContent(level1) === getCleanLevelContent(level2);
+    const isEq$1 = (level1, level2) => {
+      if (!level1 || !level2) {
+        return false;
+      } else if (hasEqualContent(level1, level2)) {
+        return true;
+      } else {
+        return hasEqualCleanedContent(level1, level2);
+      }
+    };
+
+    const isUnlocked = locks => locks.get() === 0;
+
+    const setTyping = (undoManager, typing, locks) => {
+      if (isUnlocked(locks)) {
+        undoManager.typing = typing;
+      }
+    };
+    const endTyping = (undoManager, locks) => {
+      if (undoManager.typing) {
+        setTyping(undoManager, false, locks);
+        undoManager.add();
+      }
+    };
+    const endTypingLevelIgnoreLocks = undoManager => {
+      if (undoManager.typing) {
+        undoManager.typing = false;
+        undoManager.add();
+      }
+    };
+
+    const beforeChange$1 = (editor, locks, beforeBookmark) => {
+      if (isUnlocked(locks)) {
+        beforeBookmark.set(getUndoBookmark(editor.selection));
+      }
+    };
+    const addUndoLevel$1 = (editor, undoManager, index, locks, beforeBookmark, level, event) => {
+      const currentLevel = createFromEditor(editor);
+      level = level || {};
+      level = Tools.extend(level, currentLevel);
+      if (isUnlocked(locks) === false || editor.removed) {
+        return null;
+      }
+      const lastLevel = undoManager.data[index.get()];
+      if (editor.dispatch('BeforeAddUndo', {
+          level,
+          lastLevel,
+          originalEvent: event
+        }).isDefaultPrevented()) {
+        return null;
+      }
+      if (lastLevel && isEq$1(lastLevel, level)) {
+        return null;
+      }
+      if (undoManager.data[index.get()]) {
+        beforeBookmark.get().each(bm => {
+          undoManager.data[index.get()].beforeBookmark = bm;
+        });
+      }
+      const customUndoRedoLevels = getCustomUndoRedoLevels(editor);
+      if (customUndoRedoLevels) {
+        if (undoManager.data.length > customUndoRedoLevels) {
+          for (let i = 0; i < undoManager.data.length - 1; i++) {
+            undoManager.data[i] = undoManager.data[i + 1];
+          }
+          undoManager.data.length--;
+          index.set(undoManager.data.length);
+        }
+      }
+      level.bookmark = getUndoBookmark(editor.selection);
+      if (index.get() < undoManager.data.length - 1) {
+        undoManager.data.length = index.get() + 1;
+      }
+      undoManager.data.push(level);
+      index.set(undoManager.data.length - 1);
+      const args = {
+        level,
+        lastLevel,
+        originalEvent: event
+      };
+      if (index.get() > 0) {
+        editor.setDirty(true);
+        editor.dispatch('AddUndo', args);
+        editor.dispatch('change', args);
+      } else {
+        editor.dispatch('AddUndo', args);
+      }
+      return level;
+    };
+    const clear$1 = (editor, undoManager, index) => {
+      undoManager.data = [];
+      index.set(0);
+      undoManager.typing = false;
+      editor.dispatch('ClearUndos');
+    };
+    const extra$1 = (editor, undoManager, index, callback1, callback2) => {
+      if (undoManager.transact(callback1)) {
+        const bookmark = undoManager.data[index.get()].bookmark;
+        const lastLevel = undoManager.data[index.get() - 1];
+        applyToEditor(editor, lastLevel, true);
+        if (undoManager.transact(callback2)) {
+          undoManager.data[index.get() - 1].beforeBookmark = bookmark;
+        }
+      }
+    };
+    const redo$1 = (editor, index, data) => {
+      let level;
+      if (index.get() < data.length - 1) {
+        index.set(index.get() + 1);
+        level = data[index.get()];
+        applyToEditor(editor, level, false);
+        editor.setDirty(true);
+        editor.dispatch('Redo', { level });
+      }
+      return level;
+    };
+    const undo$1 = (editor, undoManager, locks, index) => {
+      let level;
+      if (undoManager.typing) {
+        undoManager.add();
+        undoManager.typing = false;
+        setTyping(undoManager, false, locks);
+      }
+      if (index.get() > 0) {
+        index.set(index.get() - 1);
+        level = undoManager.data[index.get()];
+        applyToEditor(editor, level, true);
+        editor.setDirty(true);
+        editor.dispatch('Undo', { level });
+      }
+      return level;
+    };
+    const reset$1 = undoManager => {
+      undoManager.clear();
+      undoManager.add();
+    };
+    const hasUndo$1 = (editor, undoManager, index) => index.get() > 0 || undoManager.typing && undoManager.data[0] && !isEq$1(createFromEditor(editor), undoManager.data[0]);
+    const hasRedo$1 = (undoManager, index) => index.get() < undoManager.data.length - 1 && !undoManager.typing;
+    const transact$1 = (undoManager, locks, callback) => {
+      endTyping(undoManager, locks);
+      undoManager.beforeChange();
+      undoManager.ignore(callback);
+      return undoManager.add();
+    };
+    const ignore$1 = (locks, callback) => {
+      try {
+        locks.set(locks.get() + 1);
+        callback();
+      } finally {
+        locks.set(locks.get() - 1);
+      }
+    };
+
+    const addVisualInternal = (editor, elm) => {
+      const dom = editor.dom;
+      const scope = isNonNullable(elm) ? elm : editor.getBody();
+      if (isUndefined(editor.hasVisual)) {
+        editor.hasVisual = isVisualAidsEnabled(editor);
+      }
+      each$g(dom.select('table,a', scope), matchedElm => {
+        switch (matchedElm.nodeName) {
+        case 'TABLE':
+          const cls = getVisualAidsTableClass(editor);
+          const value = dom.getAttrib(matchedElm, 'border');
+          if ((!value || value === '0') && editor.hasVisual) {
+            dom.addClass(matchedElm, cls);
+          } else {
+            dom.removeClass(matchedElm, cls);
+          }
+          break;
+        case 'A':
+          if (!dom.getAttrib(matchedElm, 'href')) {
+            const value = dom.getAttrib(matchedElm, 'name') || matchedElm.id;
+            const cls = getVisualAidsAnchorClass(editor);
+            if (value && editor.hasVisual) {
+              dom.addClass(matchedElm, cls);
+            } else {
+              dom.removeClass(matchedElm, cls);
+            }
+          }
+          break;
+        }
+      });
+      editor.dispatch('VisualAid', {
+        element: elm,
+        hasVisual: editor.hasVisual
+      });
+    };
+
+    const makePlainAdaptor = editor => ({
+      init: { bindEvents: noop },
+      undoManager: {
+        beforeChange: (locks, beforeBookmark) => beforeChange$1(editor, locks, beforeBookmark),
+        add: (undoManager, index, locks, beforeBookmark, level, event) => addUndoLevel$1(editor, undoManager, index, locks, beforeBookmark, level, event),
+        undo: (undoManager, locks, index) => undo$1(editor, undoManager, locks, index),
+        redo: (index, data) => redo$1(editor, index, data),
+        clear: (undoManager, index) => clear$1(editor, undoManager, index),
+        reset: undoManager => reset$1(undoManager),
+        hasUndo: (undoManager, index) => hasUndo$1(editor, undoManager, index),
+        hasRedo: (undoManager, index) => hasRedo$1(undoManager, index),
+        transact: (undoManager, locks, callback) => transact$1(undoManager, locks, callback),
+        ignore: (locks, callback) => ignore$1(locks, callback),
+        extra: (undoManager, index, callback1, callback2) => extra$1(editor, undoManager, index, callback1, callback2)
+      },
+      formatter: {
+        match: (name, vars, node, similar) => match$2(editor, name, vars, node, similar),
+        matchAll: (names, vars) => matchAll(editor, names, vars),
+        matchNode: (node, name, vars, similar) => matchNode(editor, node, name, vars, similar),
+        canApply: name => canApply(editor, name),
+        closest: names => closest$1(editor, names),
+        apply: (name, vars, node) => applyFormat$1(editor, name, vars, node),
+        remove: (name, vars, node, similar) => remove$2(editor, name, vars, node, similar),
+        toggle: (name, vars, node) => toggle(editor, name, vars, node),
+        formatChanged: (registeredFormatListeners, formats, callback, similar, vars) => formatChangedInternal(editor, registeredFormatListeners, formats, callback, similar, vars)
+      },
+      editor: {
+        getContent: args => getContentInternal(editor, args),
+        setContent: (content, args) => setContentInternal(editor, content, args),
+        insertContent: (value, details) => insertHtmlAtCaret(editor, value, details),
+        addVisual: elm => addVisualInternal(editor, elm)
+      },
+      selection: { getContent: (format, args) => getSelectedContentInternal(editor, format, args) },
+      autocompleter: {
+        addDecoration: range => create$8(editor, range),
+        removeDecoration: () => remove$3(editor, SugarElement.fromDom(editor.getBody()))
+      },
+      raw: { getModel: () => Optional.none() }
+    });
+    const makeRtcAdaptor = rtcEditor => {
+      const defaultVars = vars => isObject(vars) ? vars : {};
+      const {init, undoManager, formatter, editor, selection, autocompleter, raw} = rtcEditor;
+      return {
+        init: { bindEvents: init.bindEvents },
+        undoManager: {
+          beforeChange: undoManager.beforeChange,
+          add: undoManager.add,
+          undo: undoManager.undo,
+          redo: undoManager.redo,
+          clear: undoManager.clear,
+          reset: undoManager.reset,
+          hasUndo: undoManager.hasUndo,
+          hasRedo: undoManager.hasRedo,
+          transact: (_undoManager, _locks, fn) => undoManager.transact(fn),
+          ignore: (_locks, callback) => undoManager.ignore(callback),
+          extra: (_undoManager, _index, callback1, callback2) => undoManager.extra(callback1, callback2)
+        },
+        formatter: {
+          match: (name, vars, _node, similar) => formatter.match(name, defaultVars(vars), similar),
+          matchAll: formatter.matchAll,
+          matchNode: formatter.matchNode,
+          canApply: name => formatter.canApply(name),
+          closest: names => formatter.closest(names),
+          apply: (name, vars, _node) => formatter.apply(name, defaultVars(vars)),
+          remove: (name, vars, _node, _similar) => formatter.remove(name, defaultVars(vars)),
+          toggle: (name, vars, _node) => formatter.toggle(name, defaultVars(vars)),
+          formatChanged: (_rfl, formats, callback, similar, vars) => formatter.formatChanged(formats, callback, similar, vars)
+        },
+        editor: {
+          getContent: args => editor.getContent(args),
+          setContent: (content, args) => {
+            return {
+              content: editor.setContent(content, args),
+              html: ''
+            };
+          },
+          insertContent: (content, _details) => {
+            editor.insertContent(content);
+            return '';
+          },
+          addVisual: editor.addVisual
+        },
+        selection: { getContent: (_format, args) => selection.getContent(args) },
+        autocompleter: {
+          addDecoration: autocompleter.addDecoration,
+          removeDecoration: autocompleter.removeDecoration
+        },
+        raw: { getModel: () => Optional.some(raw.getRawModel()) }
+      };
+    };
+    const makeNoopAdaptor = () => {
+      const nul = constant(null);
+      const empty = constant('');
+      return {
+        init: { bindEvents: noop },
+        undoManager: {
+          beforeChange: noop,
+          add: nul,
+          undo: nul,
+          redo: nul,
+          clear: noop,
+          reset: noop,
+          hasUndo: never,
+          hasRedo: never,
+          transact: nul,
+          ignore: noop,
+          extra: noop
+        },
+        formatter: {
+          match: never,
+          matchAll: constant([]),
+          matchNode: constant(undefined),
+          canApply: never,
+          closest: empty,
+          apply: noop,
+          remove: noop,
+          toggle: noop,
+          formatChanged: constant({ unbind: noop })
+        },
+        editor: {
+          getContent: empty,
+          setContent: constant({
+            content: '',
+            html: ''
+          }),
+          insertContent: constant(''),
+          addVisual: noop
+        },
+        selection: { getContent: empty },
+        autocompleter: {
+          addDecoration: noop,
+          removeDecoration: noop
+        },
+        raw: { getModel: constant(Optional.none()) }
+      };
+    };
+    const isRtc = editor => has$2(editor.plugins, 'rtc');
+    const getRtcSetup = editor => get$a(editor.plugins, 'rtc').bind(rtcPlugin => Optional.from(rtcPlugin.setup));
+    const setup$s = editor => {
+      const editorCast = editor;
+      return getRtcSetup(editor).fold(() => {
+        editorCast.rtcInstance = makePlainAdaptor(editor);
+        return Optional.none();
+      }, setup => {
+        editorCast.rtcInstance = makeNoopAdaptor();
+        return Optional.some(() => setup().then(rtcEditor => {
+          editorCast.rtcInstance = makeRtcAdaptor(rtcEditor);
+          return rtcEditor.rtc.isRemote;
+        }));
+      });
+    };
+    const getRtcInstanceWithFallback = editor => editor.rtcInstance ? editor.rtcInstance : makePlainAdaptor(editor);
+    const getRtcInstanceWithError = editor => {
+      const rtcInstance = editor.rtcInstance;
+      if (!rtcInstance) {
+        throw new Error('Failed to get RTC instance not yet initialized.');
+      } else {
+        return rtcInstance;
+      }
+    };
+    const beforeChange = (editor, locks, beforeBookmark) => {
+      getRtcInstanceWithError(editor).undoManager.beforeChange(locks, beforeBookmark);
+    };
+    const addUndoLevel = (editor, undoManager, index, locks, beforeBookmark, level, event) => getRtcInstanceWithError(editor).undoManager.add(undoManager, index, locks, beforeBookmark, level, event);
+    const undo = (editor, undoManager, locks, index) => getRtcInstanceWithError(editor).undoManager.undo(undoManager, locks, index);
+    const redo = (editor, index, data) => getRtcInstanceWithError(editor).undoManager.redo(index, data);
+    const clear = (editor, undoManager, index) => {
+      getRtcInstanceWithError(editor).undoManager.clear(undoManager, index);
+    };
+    const reset = (editor, undoManager) => {
+      getRtcInstanceWithError(editor).undoManager.reset(undoManager);
+    };
+    const hasUndo = (editor, undoManager, index) => getRtcInstanceWithError(editor).undoManager.hasUndo(undoManager, index);
+    const hasRedo = (editor, undoManager, index) => getRtcInstanceWithError(editor).undoManager.hasRedo(undoManager, index);
+    const transact = (editor, undoManager, locks, callback) => getRtcInstanceWithError(editor).undoManager.transact(undoManager, locks, callback);
+    const ignore = (editor, locks, callback) => {
+      getRtcInstanceWithError(editor).undoManager.ignore(locks, callback);
+    };
+    const extra = (editor, undoManager, index, callback1, callback2) => {
+      getRtcInstanceWithError(editor).undoManager.extra(undoManager, index, callback1, callback2);
+    };
+    const matchFormat = (editor, name, vars, node, similar) => getRtcInstanceWithError(editor).formatter.match(name, vars, node, similar);
+    const matchAllFormats = (editor, names, vars) => getRtcInstanceWithError(editor).formatter.matchAll(names, vars);
+    const matchNodeFormat = (editor, node, name, vars, similar) => getRtcInstanceWithError(editor).formatter.matchNode(node, name, vars, similar);
+    const canApplyFormat = (editor, name) => getRtcInstanceWithError(editor).formatter.canApply(name);
+    const closestFormat = (editor, names) => getRtcInstanceWithError(editor).formatter.closest(names);
+    const applyFormat = (editor, name, vars, node) => {
+      getRtcInstanceWithError(editor).formatter.apply(name, vars, node);
+    };
+    const removeFormat = (editor, name, vars, node, similar) => {
+      getRtcInstanceWithError(editor).formatter.remove(name, vars, node, similar);
+    };
+    const toggleFormat = (editor, name, vars, node) => {
+      getRtcInstanceWithError(editor).formatter.toggle(name, vars, node);
+    };
+    const formatChanged = (editor, registeredFormatListeners, formats, callback, similar, vars) => getRtcInstanceWithError(editor).formatter.formatChanged(registeredFormatListeners, formats, callback, similar, vars);
+    const getContent$2 = (editor, args) => getRtcInstanceWithFallback(editor).editor.getContent(args);
+    const setContent$2 = (editor, content, args) => getRtcInstanceWithFallback(editor).editor.setContent(content, args);
+    const insertContent$1 = (editor, value, details) => getRtcInstanceWithFallback(editor).editor.insertContent(value, details);
+    const getSelectedContent = (editor, format, args) => getRtcInstanceWithError(editor).selection.getContent(format, args);
+    const addVisual$1 = (editor, elm) => getRtcInstanceWithError(editor).editor.addVisual(elm);
+    const bindEvents = editor => getRtcInstanceWithError(editor).init.bindEvents();
+    const addAutocompleterDecoration = (editor, range) => getRtcInstanceWithError(editor).autocompleter.addDecoration(range);
+    const removeAutocompleterDecoration = editor => getRtcInstanceWithError(editor).autocompleter.removeDecoration();
+
+    const getContent$1 = (editor, args = {}) => {
+      const format = args.format ? args.format : 'html';
+      return getSelectedContent(editor, format, args);
+    };
+
+    const removeEmpty = text => {
+      if (text.dom.length === 0) {
+        remove$5(text);
+        return Optional.none();
+      } else {
+        return Optional.some(text);
+      }
+    };
+    const walkPastBookmark = (node, start) => node.filter(elm => BookmarkManager.isBookmarkNode(elm.dom)).bind(start ? nextSibling : prevSibling);
+    const merge$1 = (outer, inner, rng, start) => {
+      const outerElm = outer.dom;
+      const innerElm = inner.dom;
+      const oldLength = start ? outerElm.length : innerElm.length;
+      if (start) {
+        mergeTextNodes(outerElm, innerElm, false, !start);
+        rng.setStart(innerElm, oldLength);
+      } else {
+        mergeTextNodes(innerElm, outerElm, false, !start);
+        rng.setEnd(innerElm, oldLength);
+      }
+    };
+    const normalizeTextIfRequired = (inner, start) => {
+      parent(inner).each(root => {
+        const text = inner.dom;
+        if (start && needsToBeNbspLeft(root, CaretPosition(text, 0))) {
+          normalizeWhitespaceAfter(text, 0);
+        } else if (!start && needsToBeNbspRight(root, CaretPosition(text, text.length))) {
+          normalizeWhitespaceBefore(text, text.length);
+        }
+      });
+    };
+    const mergeAndNormalizeText = (outerNode, innerNode, rng, start) => {
+      outerNode.bind(outer => {
+        const normalizer = start ? normalizeWhitespaceBefore : normalizeWhitespaceAfter;
+        normalizer(outer.dom, start ? outer.dom.length : 0);
+        return innerNode.filter(isText$9).map(inner => merge$1(outer, inner, rng, start));
+      }).orThunk(() => {
+        const innerTextNode = walkPastBookmark(innerNode, start).or(innerNode).filter(isText$9);
+        return innerTextNode.map(inner => normalizeTextIfRequired(inner, start));
+      });
+    };
+    const rngSetContent = (rng, fragment) => {
+      const firstChild = Optional.from(fragment.firstChild).map(SugarElement.fromDom);
+      const lastChild = Optional.from(fragment.lastChild).map(SugarElement.fromDom);
+      rng.deleteContents();
+      rng.insertNode(fragment);
+      const prevText = firstChild.bind(prevSibling).filter(isText$9).bind(removeEmpty);
+      const nextText = lastChild.bind(nextSibling).filter(isText$9).bind(removeEmpty);
+      mergeAndNormalizeText(prevText, firstChild, rng, true);
+      mergeAndNormalizeText(nextText, lastChild, rng, false);
+      rng.collapse(false);
+    };
+    const setupArgs$2 = (args, content) => ({
+      format: 'html',
+      ...args,
+      set: true,
+      selection: true,
+      content
+    });
+    const cleanContent = (editor, args) => {
+      if (args.format !== 'raw') {
+        const rng = editor.selection.getRng();
+        const contextBlock = editor.dom.getParent(rng.commonAncestorContainer, editor.dom.isBlock);
+        const contextArgs = contextBlock ? { context: contextBlock.nodeName.toLowerCase() } : {};
+        const node = editor.parser.parse(args.content, {
+          forced_root_block: false,
+          ...contextArgs,
+          ...args
+        });
+        return HtmlSerializer({ validate: false }, editor.schema).serialize(node);
+      } else {
+        return args.content;
+      }
+    };
+    const setContent$1 = (editor, content, args = {}) => {
+      const defaultedArgs = setupArgs$2(args, content);
+      preProcessSetContent(editor, defaultedArgs).each(updatedArgs => {
+        const cleanedContent = cleanContent(editor, updatedArgs);
+        const rng = editor.selection.getRng();
+        rngSetContent(rng, rng.createContextualFragment(cleanedContent));
+        editor.selection.setRng(rng);
+        scrollRangeIntoView(editor, rng);
+        postProcessSetContent(editor, cleanedContent, updatedArgs);
+      });
+    };
+
+    const deleteFromCallbackMap = (callbackMap, selector, callback) => {
+      if (callbackMap && has$2(callbackMap, selector)) {
+        const newCallbacks = filter$6(callbackMap[selector], cb => cb !== callback);
+        if (newCallbacks.length === 0) {
+          delete callbackMap[selector];
+        } else {
+          callbackMap[selector] = newCallbacks;
+        }
+      }
+    };
+    var SelectorChanged = (dom, editor) => {
+      let selectorChangedData;
+      let currentSelectors;
+      const findMatchingNode = (selector, nodes) => find$2(nodes, node => dom.is(node, selector));
+      const getParents = elem => dom.getParents(elem, null, dom.getRoot());
+      return {
+        selectorChangedWithUnbind: (selector, callback) => {
+          if (!selectorChangedData) {
+            selectorChangedData = {};
+            currentSelectors = {};
+            editor.on('NodeChange', e => {
+              const node = e.element;
+              const parents = getParents(node);
+              const matchedSelectors = {};
+              Tools.each(selectorChangedData, (callbacks, selector) => {
+                findMatchingNode(selector, parents).each(node => {
+                  if (!currentSelectors[selector]) {
+                    each$g(callbacks, callback => {
+                      callback(true, {
+                        node,
+                        selector,
+                        parents
+                      });
+                    });
+                    currentSelectors[selector] = callbacks;
+                  }
+                  matchedSelectors[selector] = callbacks;
+                });
+              });
+              Tools.each(currentSelectors, (callbacks, selector) => {
+                if (!matchedSelectors[selector]) {
+                  delete currentSelectors[selector];
+                  Tools.each(callbacks, callback => {
+                    callback(false, {
+                      node,
+                      selector,
+                      parents
+                    });
+                  });
+                }
+              });
+            });
+          }
+          if (!selectorChangedData[selector]) {
+            selectorChangedData[selector] = [];
+          }
+          selectorChangedData[selector].push(callback);
+          findMatchingNode(selector, getParents(editor.selection.getStart())).each(() => {
+            currentSelectors[selector] = selectorChangedData[selector];
+          });
+          return {
+            unbind: () => {
+              deleteFromCallbackMap(selectorChangedData, selector, callback);
+              deleteFromCallbackMap(currentSelectors, selector, callback);
+            }
+          };
+        }
+      };
+    };
+
+    const isAttachedToDom = node => {
+      return !!(node && node.ownerDocument) && contains(SugarElement.fromDom(node.ownerDocument), SugarElement.fromDom(node));
+    };
+    const isValidRange = rng => {
+      if (!rng) {
+        return false;
+      } else {
+        return isAttachedToDom(rng.startContainer) && isAttachedToDom(rng.endContainer);
+      }
+    };
+    const EditorSelection = (dom, win, serializer, editor) => {
+      let selectedRange;
+      let explicitRange;
+      const {selectorChangedWithUnbind} = SelectorChanged(dom, editor);
+      const setCursorLocation = (node, offset) => {
+        const rng = dom.createRng();
+        if (isNonNullable(node) && isNonNullable(offset)) {
+          rng.setStart(node, offset);
+          rng.setEnd(node, offset);
+          setRng(rng);
+          collapse(false);
+        } else {
+          moveEndPoint(dom, rng, editor.getBody(), true);
+          setRng(rng);
+        }
+      };
+      const getContent = args => getContent$1(editor, args);
+      const setContent = (content, args) => setContent$1(editor, content, args);
+      const getStart$1 = real => getStart(editor.getBody(), getRng$1(), real);
+      const getEnd = real => getEnd$1(editor.getBody(), getRng$1(), real);
+      const getBookmark = (type, normalized) => bookmarkManager.getBookmark(type, normalized);
+      const moveToBookmark = bookmark => bookmarkManager.moveToBookmark(bookmark);
+      const select$1 = (node, content) => {
+        select(dom, node, content).each(setRng);
+        return node;
+      };
+      const isCollapsed = () => {
+        const rng = getRng$1(), sel = getSel();
+        if (!rng || rng.item) {
+          return false;
+        }
+        if (rng.compareEndPoints) {
+          return rng.compareEndPoints('StartToEnd', rng) === 0;
+        }
+        return !sel || rng.collapsed;
+      };
+      const collapse = toStart => {
+        const rng = getRng$1();
+        rng.collapse(!!toStart);
+        setRng(rng);
+      };
+      const getSel = () => win.getSelection ? win.getSelection() : win.document.selection;
+      const getRng$1 = () => {
+        let selection, rng, elm;
+        const tryCompareBoundaryPoints = (how, sourceRange, destinationRange) => {
+          try {
+            return sourceRange.compareBoundaryPoints(how, destinationRange);
+          } catch (ex) {
+            return -1;
+          }
+        };
+        const doc = win.document;
+        if (editor.bookmark !== undefined && hasFocus(editor) === false) {
+          const bookmark = getRng(editor);
+          if (bookmark.isSome()) {
+            return bookmark.map(r => processRanges(editor, [r])[0]).getOr(doc.createRange());
+          }
+        }
+        try {
+          if ((selection = getSel()) && !isRestrictedNode(selection.anchorNode)) {
+            if (selection.rangeCount > 0) {
+              rng = selection.getRangeAt(0);
+            } else {
+              rng = selection.createRange ? selection.createRange() : doc.createRange();
+            }
+            rng = processRanges(editor, [rng])[0];
+          }
+        } catch (ex) {
+        }
+        if (!rng) {
+          rng = doc.createRange();
+        }
+        if (rng.setStart && rng.startContainer.nodeType === 9 && rng.collapsed) {
+          elm = dom.getRoot();
+          rng.setStart(elm, 0);
+          rng.setEnd(elm, 0);
+        }
+        if (selectedRange && explicitRange) {
+          if (tryCompareBoundaryPoints(rng.START_TO_START, rng, selectedRange) === 0 && tryCompareBoundaryPoints(rng.END_TO_END, rng, selectedRange) === 0) {
+            rng = explicitRange;
+          } else {
+            selectedRange = null;
+            explicitRange = null;
+          }
+        }
+        return rng;
+      };
+      const setRng = (rng, forward) => {
+        let node;
+        if (!isValidRange(rng)) {
+          return;
+        }
+        const sel = getSel();
+        const evt = editor.dispatch('SetSelectionRange', {
+          range: rng,
+          forward
+        });
+        rng = evt.range;
+        if (sel) {
+          explicitRange = rng;
+          try {
+            sel.removeAllRanges();
+            sel.addRange(rng);
+          } catch (ex) {
+          }
+          if (forward === false && sel.extend) {
+            sel.collapse(rng.endContainer, rng.endOffset);
+            sel.extend(rng.startContainer, rng.startOffset);
+          }
+          selectedRange = sel.rangeCount > 0 ? sel.getRangeAt(0) : null;
+        }
+        if (!rng.collapsed && rng.startContainer === rng.endContainer && sel.setBaseAndExtent) {
+          if (rng.endOffset - rng.startOffset < 2) {
+            if (rng.startContainer.hasChildNodes()) {
+              node = rng.startContainer.childNodes[rng.startOffset];
+              if (node && node.tagName === 'IMG') {
+                sel.setBaseAndExtent(rng.startContainer, rng.startOffset, rng.endContainer, rng.endOffset);
+                if (sel.anchorNode !== rng.startContainer || sel.focusNode !== rng.endContainer) {
+                  sel.setBaseAndExtent(node, 0, node, 1);
+                }
+              }
+            }
+          }
+        }
+        editor.dispatch('AfterSetSelectionRange', {
+          range: rng,
+          forward
+        });
+      };
+      const setNode = elm => {
+        setContent(dom.getOuterHTML(elm));
+        return elm;
+      };
+      const getNode$1 = () => getNode(editor.getBody(), getRng$1());
+      const getSelectedBlocks$1 = (startElm, endElm) => getSelectedBlocks(dom, getRng$1(), startElm, endElm);
+      const isForward = () => {
+        const sel = getSel();
+        const anchorNode = sel === null || sel === void 0 ? void 0 : sel.anchorNode;
+        const focusNode = sel === null || sel === void 0 ? void 0 : sel.focusNode;
+        if (!sel || !anchorNode || !focusNode || isRestrictedNode(anchorNode) || isRestrictedNode(focusNode)) {
+          return true;
+        }
+        const anchorRange = dom.createRng();
+        anchorRange.setStart(anchorNode, sel.anchorOffset);
+        anchorRange.collapse(true);
+        const focusRange = dom.createRng();
+        focusRange.setStart(focusNode, sel.focusOffset);
+        focusRange.collapse(true);
+        return anchorRange.compareBoundaryPoints(anchorRange.START_TO_START, focusRange) <= 0;
+      };
+      const normalize = () => {
+        const rng = getRng$1();
+        const sel = getSel();
+        if (!hasMultipleRanges(sel) && hasAnyRanges(editor)) {
+          const normRng = normalize$2(dom, rng);
+          normRng.each(normRng => {
+            setRng(normRng, isForward());
+          });
+          return normRng.getOr(rng);
+        }
+        return rng;
+      };
+      const selectorChanged = (selector, callback) => {
+        selectorChangedWithUnbind(selector, callback);
+        return exports;
+      };
+      const getScrollContainer = () => {
+        let scrollContainer;
+        let node = dom.getRoot();
+        while (node && node.nodeName !== 'BODY') {
+          if (node.scrollHeight > node.clientHeight) {
+            scrollContainer = node;
+            break;
+          }
+          node = node.parentNode;
+        }
+        return scrollContainer;
+      };
+      const scrollIntoView = (elm, alignToTop) => {
+        if (isNonNullable(elm)) {
+          scrollElementIntoView(editor, elm, alignToTop);
+        } else {
+          scrollRangeIntoView(editor, getRng$1(), alignToTop);
+        }
+      };
+      const placeCaretAt = (clientX, clientY) => setRng(fromPoint(clientX, clientY, editor.getDoc()));
+      const getBoundingClientRect = () => {
+        const rng = getRng$1();
+        return rng.collapsed ? CaretPosition.fromRangeStart(rng).getClientRects()[0] : rng.getBoundingClientRect();
+      };
+      const destroy = () => {
+        win = selectedRange = explicitRange = null;
+        controlSelection.destroy();
+      };
+      const exports = {
+        bookmarkManager: null,
+        controlSelection: null,
+        dom,
+        win,
+        serializer,
+        editor,
+        collapse,
+        setCursorLocation,
+        getContent,
+        setContent,
+        getBookmark,
+        moveToBookmark,
+        select: select$1,
+        isCollapsed,
+        isForward,
+        setNode,
+        getNode: getNode$1,
+        getSel,
+        setRng,
+        getRng: getRng$1,
+        getStart: getStart$1,
+        getEnd,
+        getSelectedBlocks: getSelectedBlocks$1,
+        normalize,
+        selectorChanged,
+        selectorChangedWithUnbind,
+        getScrollContainer,
+        scrollIntoView,
+        placeCaretAt,
+        getBoundingClientRect,
+        destroy
+      };
+      const bookmarkManager = BookmarkManager(exports);
+      const controlSelection = ControlSelection(exports, editor);
+      exports.bookmarkManager = bookmarkManager;
+      exports.controlSelection = controlSelection;
+      return exports;
+    };
+
+    const register$3 = (htmlParser, settings, dom) => {
+      htmlParser.addAttributeFilter('data-mce-tabindex', (nodes, name) => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          node.attr('tabindex', node.attr('data-mce-tabindex'));
+          node.attr(name, null);
+        }
+      });
+      htmlParser.addAttributeFilter('src,href,style', (nodes, name) => {
+        const internalName = 'data-mce-' + name;
+        const urlConverter = settings.url_converter;
+        const urlConverterScope = settings.url_converter_scope;
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          let value = node.attr(internalName);
+          if (value !== undefined) {
+            node.attr(name, value.length > 0 ? value : null);
+            node.attr(internalName, null);
+          } else {
+            value = node.attr(name);
+            if (name === 'style') {
+              value = dom.serializeStyle(dom.parseStyle(value), node.name);
+            } else if (urlConverter) {
+              value = urlConverter.call(urlConverterScope, value, name, node.name);
+            }
+            node.attr(name, value.length > 0 ? value : null);
+          }
+        }
+      });
+      htmlParser.addAttributeFilter('class', nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          let value = node.attr('class');
+          if (value) {
+            value = node.attr('class').replace(/(?:^|\s)mce-item-\w+(?!\S)/g, '');
+            node.attr('class', value.length > 0 ? value : null);
+          }
+        }
+      });
+      htmlParser.addAttributeFilter('data-mce-type', (nodes, name, args) => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          if (node.attr('data-mce-type') === 'bookmark' && !args.cleanup) {
+            const hasChildren = Optional.from(node.firstChild).exists(firstChild => !isZwsp(firstChild.value));
+            if (hasChildren) {
+              node.unwrap();
+            } else {
+              node.remove();
+            }
+          }
+        }
+      });
+      htmlParser.addNodeFilter('noscript', nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i].firstChild;
+          if (node) {
+            node.value = Entities.decode(node.value);
+          }
+        }
+      });
+      htmlParser.addNodeFilter('script,style', (nodes, name) => {
+        const trim = value => {
+          return value.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, '');
+        };
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          const value = node.firstChild ? node.firstChild.value : '';
+          if (name === 'script') {
+            const type = node.attr('type');
+            if (type) {
+              node.attr('type', type === 'mce-no/type' ? null : type.replace(/^mce\-/, ''));
+            }
+            if (settings.element_format === 'xhtml' && value.length > 0) {
+              node.firstChild.value = '// <![CDATA[\n' + trim(value) + '\n// ]]>';
+            }
+          } else {
+            if (settings.element_format === 'xhtml' && value.length > 0) {
+              node.firstChild.value = '<!--\n' + trim(value) + '\n-->';
+            }
+          }
+        }
+      });
+      htmlParser.addNodeFilter('#comment', nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          if (settings.preserve_cdata && node.value.indexOf('[CDATA[') === 0) {
+            node.name = '#cdata';
+            node.type = 4;
+            node.value = dom.decode(node.value.replace(/^\[CDATA\[|\]\]$/g, ''));
+          } else if (node.value.indexOf('mce:protected ') === 0) {
+            node.name = '#text';
+            node.type = 3;
+            node.raw = true;
+            node.value = unescape(node.value).substr(14);
+          }
+        }
+      });
+      htmlParser.addNodeFilter('xml:namespace,input', (nodes, name) => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          if (node.type === 7) {
+            node.remove();
+          } else if (node.type === 1) {
+            if (name === 'input' && !node.attr('type')) {
+              node.attr('type', 'text');
+            }
+          }
+        }
+      });
+      htmlParser.addAttributeFilter('data-mce-type', nodes => {
+        each$g(nodes, node => {
+          if (node.attr('data-mce-type') === 'format-caret') {
+            if (node.isEmpty(htmlParser.schema.getNonEmptyElements())) {
+              node.remove();
+            } else {
+              node.unwrap();
+            }
+          }
+        });
+      });
+      htmlParser.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', (nodes, name) => {
+        let i = nodes.length;
+        while (i--) {
+          nodes[i].attr(name, null);
+        }
+      });
+    };
+    const trimTrailingBr = rootNode => {
+      const isBr = node => {
+        return node && node.name === 'br';
+      };
+      const brNode1 = rootNode.lastChild;
+      if (isBr(brNode1)) {
+        const brNode2 = brNode1.prev;
+        if (isBr(brNode2)) {
+          brNode1.remove();
+          brNode2.remove();
+        }
+      }
+    };
+
+    const preProcess$1 = (editor, node, args) => {
+      let oldDoc;
+      const dom = editor.dom;
+      let clonedNode = node.cloneNode(true);
+      const impl = document.implementation;
+      if (impl.createHTMLDocument) {
+        const doc = impl.createHTMLDocument('');
+        Tools.each(clonedNode.nodeName === 'BODY' ? clonedNode.childNodes : [clonedNode], node => {
+          doc.body.appendChild(doc.importNode(node, true));
+        });
+        if (clonedNode.nodeName !== 'BODY') {
+          clonedNode = doc.body.firstChild;
+        } else {
+          clonedNode = doc.body;
+        }
+        oldDoc = dom.doc;
+        dom.doc = doc;
+      }
+      firePreProcess(editor, {
+        ...args,
+        node: clonedNode
+      });
+      if (oldDoc) {
+        dom.doc = oldDoc;
+      }
+      return clonedNode;
+    };
+    const shouldFireEvent = (editor, args) => {
+      return editor && editor.hasEventListeners('PreProcess') && !args.no_events;
+    };
+    const process$1 = (editor, node, args) => {
+      return shouldFireEvent(editor, args) ? preProcess$1(editor, node, args) : node;
+    };
+
+    const addTempAttr = (htmlParser, tempAttrs, name) => {
+      if (Tools.inArray(tempAttrs, name) === -1) {
+        htmlParser.addAttributeFilter(name, (nodes, name) => {
+          let i = nodes.length;
+          while (i--) {
+            nodes[i].attr(name, null);
+          }
+        });
+        tempAttrs.push(name);
+      }
+    };
+    const postProcess = (editor, args, content) => {
+      if (!args.no_events && editor) {
+        const outArgs = firePostProcess(editor, {
+          ...args,
+          content
+        });
+        return outArgs.content;
+      } else {
+        return content;
+      }
+    };
+    const getHtmlFromNode = (dom, node, args) => {
+      const html = trim$1(args.getInner ? node.innerHTML : dom.getOuterHTML(node));
+      return args.selection || isWsPreserveElement(SugarElement.fromDom(node)) ? html : Tools.trim(html);
+    };
+    const parseHtml = (htmlParser, html, args) => {
+      const parserArgs = args.selection ? {
+        forced_root_block: false,
+        ...args
+      } : args;
+      const rootNode = htmlParser.parse(html, parserArgs);
+      trimTrailingBr(rootNode);
+      return rootNode;
+    };
+    const serializeNode = (settings, schema, node) => {
+      const htmlSerializer = HtmlSerializer(settings, schema);
+      return htmlSerializer.serialize(node);
+    };
+    const toHtml = (editor, settings, schema, rootNode, args) => {
+      const content = serializeNode(settings, schema, rootNode);
+      return postProcess(editor, args, content);
+    };
+    const DomSerializerImpl = (settings, editor) => {
+      const tempAttrs = ['data-mce-selected'];
+      const dom = editor && editor.dom ? editor.dom : DOMUtils.DOM;
+      const schema = editor && editor.schema ? editor.schema : Schema(settings);
+      settings.entity_encoding = settings.entity_encoding || 'named';
+      settings.remove_trailing_brs = 'remove_trailing_brs' in settings ? settings.remove_trailing_brs : true;
+      const htmlParser = DomParser(settings, schema);
+      register$3(htmlParser, settings, dom);
+      const serialize = (node, parserArgs = {}) => {
+        const args = {
+          format: 'html',
+          ...parserArgs
+        };
+        const targetNode = process$1(editor, node, args);
+        const html = getHtmlFromNode(dom, targetNode, args);
+        const rootNode = parseHtml(htmlParser, html, args);
+        return args.format === 'tree' ? rootNode : toHtml(editor, settings, schema, rootNode, args);
+      };
+      return {
+        schema,
+        addNodeFilter: htmlParser.addNodeFilter,
+        addAttributeFilter: htmlParser.addAttributeFilter,
+        serialize: serialize,
+        addRules: schema.addValidElements,
+        setRules: schema.setValidElements,
+        addTempAttr: curry(addTempAttr, htmlParser, tempAttrs),
+        getTempAttrs: constant(tempAttrs),
+        getNodeFilters: htmlParser.getNodeFilters,
+        getAttributeFilters: htmlParser.getAttributeFilters
+      };
+    };
+
+    const DomSerializer = (settings, editor) => {
+      const domSerializer = DomSerializerImpl(settings, editor);
+      return {
+        schema: domSerializer.schema,
+        addNodeFilter: domSerializer.addNodeFilter,
+        addAttributeFilter: domSerializer.addAttributeFilter,
+        serialize: domSerializer.serialize,
+        addRules: domSerializer.addRules,
+        setRules: domSerializer.setRules,
+        addTempAttr: domSerializer.addTempAttr,
+        getTempAttrs: domSerializer.getTempAttrs,
+        getNodeFilters: domSerializer.getNodeFilters,
+        getAttributeFilters: domSerializer.getAttributeFilters
+      };
+    };
+
+    const defaultFormat$1 = 'html';
+    const setupArgs$1 = (args, format) => ({
+      ...args,
+      format,
+      get: true,
+      getInner: true
+    });
+    const getContent = (editor, args = {}) => {
+      const format = args.format ? args.format : defaultFormat$1;
+      const defaultedArgs = setupArgs$1(args, format);
+      return preProcessGetContent(editor, defaultedArgs).fold(identity, updatedArgs => {
+        const content = getContent$2(editor, updatedArgs);
+        return postProcessGetContent(editor, content, updatedArgs);
+      });
+    };
+
+    const defaultFormat = 'html';
+    const setupArgs = (args, content) => ({
+      format: defaultFormat,
+      ...args,
+      set: true,
+      content
+    });
+    const setContent = (editor, content, args = {}) => {
+      const defaultedArgs = setupArgs(args, content);
+      return preProcessSetContent(editor, defaultedArgs).map(updatedArgs => {
+        const result = setContent$2(editor, updatedArgs.content, updatedArgs);
+        postProcessSetContent(editor, result.html, updatedArgs);
+        return result.content;
+      }).getOr(content);
+    };
+
+    const removedOptions = ('autoresize_on_init,content_editable_state,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,tabfocus_elements,table_responsive_width,text_block_elements,text_inline_elements,toolbar_drawer,types,validate,whitespace_elements,' + 'paste_enable_default_filters,paste_filter_drop,paste_word_valid_elements,paste_retain_style_properties,paste_convert_word_fake_lists').split(',');
+    const removedPlugins = 'bbcode,colorpicker,contextmenu,fullpage,legacyoutput,spellchecker,textcolor'.split(',');
+    const getRemovedOptions = options => {
+      const settingNames = filter$6(removedOptions, setting => has$2(options, setting));
+      const forcedRootBlock = options.forced_root_block;
+      if (forcedRootBlock === false || forcedRootBlock === '') {
+        settingNames.push('forced_root_block (false only)');
+      }
+      return sort(settingNames);
+    };
+    const getRemovedPlugins = options => {
+      const plugins = Tools.makeMap(options.plugins, ' ');
+      const hasPlugin = plugin => has$2(plugins, plugin);
+      const pluginNames = filter$6(removedPlugins, hasPlugin);
+      return sort(pluginNames);
+    };
+    const logRemovedWarnings = (rawOptions, normalizedOptions) => {
+      const removedOptions = getRemovedOptions(rawOptions);
+      const removedPlugins = getRemovedPlugins(normalizedOptions);
+      const hasRemovedPlugins = removedPlugins.length > 0;
+      const hasRemovedOptions = removedOptions.length > 0;
+      const isLegacyMobileTheme = normalizedOptions.theme === 'mobile';
+      if (hasRemovedPlugins || hasRemovedOptions || isLegacyMobileTheme) {
+        const listJoiner = '\n- ';
+        const themesMessage = isLegacyMobileTheme ? `\n\nThemes:${ listJoiner }mobile` : '';
+        const pluginsMessage = hasRemovedPlugins ? `\n\nPlugins:${ listJoiner }${ removedPlugins.join(listJoiner) }` : '';
+        const optionsMessage = hasRemovedOptions ? `\n\nOptions:${ listJoiner }${ removedOptions.join(listJoiner) }` : '';
+        console.warn('The following deprecated features are currently enabled and have been removed in TinyMCE 6.0. These features will no longer work and should be removed from the TinyMCE configuration. ' + 'See https://www.tiny.cloud/docs/tinymce/6/migration-from-5x/ for more information.' + themesMessage + pluginsMessage + optionsMessage);
+      }
+    };
+    const logWarnings = (rawOptions, normalizedOptions) => {
+      logRemovedWarnings(rawOptions, normalizedOptions);
+    };
+
+    const DOM$8 = DOMUtils.DOM;
+    const restoreOriginalStyles = editor => {
+      DOM$8.setStyle(editor.id, 'display', editor.orgDisplay);
+    };
+    const safeDestroy = x => Optional.from(x).each(x => x.destroy());
+    const clearDomReferences = editor => {
+      editor.contentAreaContainer = editor.formElement = editor.container = editor.editorContainer = null;
+      editor.bodyElement = editor.contentDocument = editor.contentWindow = null;
+      editor.iframeElement = editor.targetElm = null;
+      if (editor.selection) {
+        editor.selection = editor.selection.win = editor.selection.dom = editor.selection.dom.doc = null;
+      }
+    };
+    const restoreForm = editor => {
+      const form = editor.formElement;
+      if (form) {
+        if (form._mceOldSubmit) {
+          form.submit = form._mceOldSubmit;
+          form._mceOldSubmit = null;
+        }
+        DOM$8.unbind(form, 'submit reset', editor.formEventDelegate);
+      }
+    };
+    const remove$1 = editor => {
+      if (!editor.removed) {
+        const {_selectionOverrides, editorUpload} = editor;
+        const body = editor.getBody();
+        const element = editor.getElement();
+        if (body) {
+          editor.save({ is_removing: true });
+        }
+        editor.removed = true;
+        editor.unbindAllNativeEvents();
+        if (editor.hasHiddenInput && element) {
+          DOM$8.remove(element.nextSibling);
+        }
+        fireRemove(editor);
+        editor.editorManager.remove(editor);
+        if (!editor.inline && body) {
+          restoreOriginalStyles(editor);
+        }
+        fireDetach(editor);
+        DOM$8.remove(editor.getContainer());
+        safeDestroy(_selectionOverrides);
+        safeDestroy(editorUpload);
+        editor.destroy();
+      }
+    };
+    const destroy = (editor, automatic) => {
+      const {selection, dom} = editor;
+      if (editor.destroyed) {
+        return;
+      }
+      if (!automatic && !editor.removed) {
+        editor.remove();
+        return;
+      }
+      if (!automatic) {
+        editor.editorManager.off('beforeunload', editor._beforeUnload);
+        if (editor.theme && editor.theme.destroy) {
+          editor.theme.destroy();
+        }
+        safeDestroy(selection);
+        safeDestroy(dom);
+      }
+      restoreForm(editor);
+      clearDomReferences(editor);
+      editor.destroyed = true;
+    };
+
+    const CreateIconManager = () => {
+      const lookup = {};
+      const add = (id, iconPack) => {
+        lookup[id] = iconPack;
+      };
+      const get = id => {
+        if (lookup[id]) {
+          return lookup[id];
+        }
+        return { icons: {} };
+      };
+      const has = id => has$2(lookup, id);
+      return {
+        add,
+        get,
+        has
+      };
+    };
+    const IconManager = CreateIconManager();
+
+    const ModelManager = AddOnManager.ModelManager;
+
+    const getProp = (propName, elm) => {
+      const rawElm = elm.dom;
+      return rawElm[propName];
+    };
+    const getComputedSizeProp = (propName, elm) => parseInt(get$7(elm, propName), 10);
+    const getClientWidth = curry(getProp, 'clientWidth');
+    const getClientHeight = curry(getProp, 'clientHeight');
+    const getMarginTop = curry(getComputedSizeProp, 'margin-top');
+    const getMarginLeft = curry(getComputedSizeProp, 'margin-left');
+    const getBoundingClientRect = elm => elm.dom.getBoundingClientRect();
+    const isInsideElementContentArea = (bodyElm, clientX, clientY) => {
+      const clientWidth = getClientWidth(bodyElm);
+      const clientHeight = getClientHeight(bodyElm);
+      return clientX >= 0 && clientY >= 0 && clientX <= clientWidth && clientY <= clientHeight;
+    };
+    const transpose = (inline, elm, clientX, clientY) => {
+      const clientRect = getBoundingClientRect(elm);
+      const deltaX = inline ? clientRect.left + elm.dom.clientLeft + getMarginLeft(elm) : 0;
+      const deltaY = inline ? clientRect.top + elm.dom.clientTop + getMarginTop(elm) : 0;
+      const x = clientX - deltaX;
+      const y = clientY - deltaY;
+      return {
+        x,
+        y
+      };
+    };
+    const isXYInContentArea = (editor, clientX, clientY) => {
+      const bodyElm = SugarElement.fromDom(editor.getBody());
+      const targetElm = editor.inline ? bodyElm : documentElement(bodyElm);
+      const transposedPoint = transpose(editor.inline, targetElm, clientX, clientY);
+      return isInsideElementContentArea(targetElm, transposedPoint.x, transposedPoint.y);
+    };
+    const fromDomSafe = node => Optional.from(node).map(SugarElement.fromDom);
+    const isEditorAttachedToDom = editor => {
+      const rawContainer = editor.inline ? editor.getBody() : editor.getContentAreaContainer();
+      return fromDomSafe(rawContainer).map(inBody).getOr(false);
+    };
+
+    const NotificationManagerImpl = () => {
+      const unimplemented = () => {
+        throw new Error('Theme did not provide a NotificationManager implementation.');
+      };
+      return {
+        open: unimplemented,
+        close: unimplemented,
+        getArgs: unimplemented
+      };
+    };
+
+    const NotificationManager = editor => {
+      const notifications = [];
+      const getImplementation = () => {
+        const theme = editor.theme;
+        return theme && theme.getNotificationManagerImpl ? theme.getNotificationManagerImpl() : NotificationManagerImpl();
+      };
+      const getTopNotification = () => {
+        return Optional.from(notifications[0]);
+      };
+      const isEqual = (a, b) => {
+        return a.type === b.type && a.text === b.text && !a.progressBar && !a.timeout && !b.progressBar && !b.timeout;
+      };
+      const reposition = () => {
+        each$g(notifications, notification => {
+          notification.reposition();
+        });
+      };
+      const addNotification = notification => {
+        notifications.push(notification);
+      };
+      const closeNotification = notification => {
+        findIndex$2(notifications, otherNotification => {
+          return otherNotification === notification;
+        }).each(index => {
+          notifications.splice(index, 1);
+        });
+      };
+      const open = (spec, fireEvent = true) => {
+        if (editor.removed || !isEditorAttachedToDom(editor)) {
+          return;
+        }
+        if (fireEvent) {
+          editor.dispatch('BeforeOpenNotification', { notification: spec });
+        }
+        return find$2(notifications, notification => {
+          return isEqual(getImplementation().getArgs(notification), spec);
+        }).getOrThunk(() => {
+          editor.editorManager.setActive(editor);
+          const notification = getImplementation().open(spec, () => {
+            closeNotification(notification);
+            reposition();
+            getTopNotification().fold(() => editor.focus(), top => focus$1(SugarElement.fromDom(top.getEl())));
+          });
+          addNotification(notification);
+          reposition();
+          editor.dispatch('OpenNotification', { notification: { ...notification } });
+          return notification;
+        });
+      };
+      const close = () => {
+        getTopNotification().each(notification => {
+          getImplementation().close(notification);
+          closeNotification(notification);
+          reposition();
+        });
+      };
+      const getNotifications = constant(notifications);
+      const registerEvents = editor => {
+        editor.on('SkinLoaded', () => {
+          const serviceMessage = getServiceMessage(editor);
+          if (serviceMessage) {
+            open({
+              text: serviceMessage,
+              type: 'warning',
+              timeout: 0
+            }, false);
+          }
+          reposition();
+        });
+        editor.on('show ResizeEditor ResizeWindow NodeChange', () => {
+          requestAnimationFrame(reposition);
+        });
+        editor.on('remove', () => {
+          each$g(notifications.slice(), notification => {
+            getImplementation().close(notification);
+          });
+        });
+      };
+      registerEvents(editor);
+      return {
+        open,
+        close,
+        getNotifications
+      };
+    };
+
+    const PluginManager = AddOnManager.PluginManager;
+
+    const ThemeManager = AddOnManager.ThemeManager;
+
+    var WindowManagerImpl = () => {
+      const unimplemented = () => {
+        throw new Error('Theme did not provide a WindowManager implementation.');
+      };
+      return {
+        open: unimplemented,
+        openUrl: unimplemented,
+        alert: unimplemented,
+        confirm: unimplemented,
+        close: unimplemented,
+        getParams: unimplemented,
+        setParams: unimplemented
+      };
+    };
+
+    const WindowManager = editor => {
+      let dialogs = [];
+      const getImplementation = () => {
+        const theme = editor.theme;
+        return theme && theme.getWindowManagerImpl ? theme.getWindowManagerImpl() : WindowManagerImpl();
+      };
+      const funcBind = (scope, f) => {
+        return (...args) => {
+          return f ? f.apply(scope, args) : undefined;
+        };
+      };
+      const fireOpenEvent = dialog => {
+        editor.dispatch('OpenWindow', { dialog });
+      };
+      const fireCloseEvent = dialog => {
+        editor.dispatch('CloseWindow', { dialog });
+      };
+      const addDialog = dialog => {
+        dialogs.push(dialog);
+        fireOpenEvent(dialog);
+      };
+      const closeDialog = dialog => {
+        fireCloseEvent(dialog);
+        dialogs = filter$6(dialogs, otherDialog => {
+          return otherDialog !== dialog;
+        });
+        if (dialogs.length === 0) {
+          editor.focus();
+        }
+      };
+      const getTopDialog = () => {
+        return Optional.from(dialogs[dialogs.length - 1]);
+      };
+      const storeSelectionAndOpenDialog = openDialog => {
+        editor.editorManager.setActive(editor);
+        store(editor);
+        editor.ui.show();
+        const dialog = openDialog();
+        addDialog(dialog);
+        return dialog;
+      };
+      const open = (args, params) => {
+        return storeSelectionAndOpenDialog(() => getImplementation().open(args, params, closeDialog));
+      };
+      const openUrl = args => {
+        return storeSelectionAndOpenDialog(() => getImplementation().openUrl(args, closeDialog));
+      };
+      const alert = (message, callback, scope) => {
+        const windowManagerImpl = getImplementation();
+        windowManagerImpl.alert(message, funcBind(scope ? scope : windowManagerImpl, callback));
+      };
+      const confirm = (message, callback, scope) => {
+        const windowManagerImpl = getImplementation();
+        windowManagerImpl.confirm(message, funcBind(scope ? scope : windowManagerImpl, callback));
+      };
+      const close = () => {
+        getTopDialog().each(dialog => {
+          getImplementation().close(dialog);
+          closeDialog(dialog);
+        });
+      };
+      editor.on('remove', () => {
+        each$g(dialogs, dialog => {
+          getImplementation().close(dialog);
+        });
+      });
+      return {
+        open,
+        openUrl,
+        alert,
+        confirm,
+        close
+      };
+    };
+
+    const displayNotification = (editor, message) => {
+      editor.notificationManager.open({
+        type: 'error',
+        text: message
+      });
+    };
+    const displayError = (editor, message) => {
+      if (editor._skinLoaded) {
+        displayNotification(editor, message);
+      } else {
+        editor.on('SkinLoaded', () => {
+          displayNotification(editor, message);
+        });
+      }
+    };
+    const uploadError = (editor, message) => {
+      displayError(editor, I18n.translate([
+        'Failed to upload image: {0}',
+        message
+      ]));
+    };
+    const logError = (editor, errorType, msg) => {
+      fireError(editor, errorType, { message: msg });
+      console.error(msg);
+    };
+    const createLoadError = (type, url, name) => name ? `Failed to load ${ type }: ${ name } from url ${ url }` : `Failed to load ${ type } url: ${ url }`;
+    const pluginLoadError = (editor, url, name) => {
+      logError(editor, 'PluginLoadError', createLoadError('plugin', url, name));
+    };
+    const iconsLoadError = (editor, url, name) => {
+      logError(editor, 'IconsLoadError', createLoadError('icons', url, name));
+    };
+    const languageLoadError = (editor, url, name) => {
+      logError(editor, 'LanguageLoadError', createLoadError('language', url, name));
+    };
+    const themeLoadError = (editor, url, name) => {
+      logError(editor, 'ThemeLoadError', createLoadError('theme', url, name));
+    };
+    const modelLoadError = (editor, url, name) => {
+      logError(editor, 'ModelLoadError', createLoadError('model', url, name));
+    };
+    const pluginInitError = (editor, name, err) => {
+      const message = I18n.translate([
+        'Failed to initialize plugin: {0}',
+        name
+      ]);
+      fireError(editor, 'PluginLoadError', { message });
+      initError(message, err);
+      displayError(editor, message);
+    };
+    const initError = (message, ...x) => {
+      const console = window.console;
+      if (console) {
+        if (console.error) {
+          console.error(message, ...x);
+        } else {
+          console.log(message, ...x);
+        }
+      }
+    };
+
+    const isContentCssSkinName = url => /^[a-z0-9\-]+$/i.test(url);
+    const getContentCssUrls = editor => {
+      return transformToUrls(editor, getContentCss(editor));
+    };
+    const getFontCssUrls = editor => {
+      return transformToUrls(editor, getFontCss(editor));
+    };
+    const transformToUrls = (editor, cssLinks) => {
+      const skinUrl = editor.editorManager.baseURL + '/skins/content';
+      const suffix = editor.editorManager.suffix;
+      const contentCssFile = `content${ suffix }.css`;
+      const inline = editor.inline === true;
+      return map$3(cssLinks, url => {
+        if (isContentCssSkinName(url) && !inline) {
+          return `${ skinUrl }/${ url }/${ contentCssFile }`;
+        } else {
+          return editor.documentBaseURI.toAbsolute(url);
+        }
+      });
+    };
+    const appendContentCssFromSettings = editor => {
+      editor.contentCSS = editor.contentCSS.concat(getContentCssUrls(editor), getFontCssUrls(editor));
+    };
+
+    const filter$1 = always;
+    const bind$1 = (element, event, handler) => bind$2(element, event, filter$1, handler);
+
+    const UploadStatus = () => {
+      const PENDING = 1, UPLOADED = 2;
+      let blobUriStatuses = {};
+      const createStatus = (status, resultUri) => {
+        return {
+          status,
+          resultUri
+        };
+      };
+      const hasBlobUri = blobUri => {
+        return blobUri in blobUriStatuses;
+      };
+      const getResultUri = blobUri => {
+        const result = blobUriStatuses[blobUri];
+        return result ? result.resultUri : null;
+      };
+      const isPending = blobUri => {
+        return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === PENDING : false;
+      };
+      const isUploaded = blobUri => {
+        return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === UPLOADED : false;
+      };
+      const markPending = blobUri => {
+        blobUriStatuses[blobUri] = createStatus(PENDING, null);
+      };
+      const markUploaded = (blobUri, resultUri) => {
+        blobUriStatuses[blobUri] = createStatus(UPLOADED, resultUri);
+      };
+      const removeFailed = blobUri => {
+        delete blobUriStatuses[blobUri];
+      };
+      const destroy = () => {
+        blobUriStatuses = {};
+      };
+      return {
+        hasBlobUri,
+        getResultUri,
+        isPending,
+        isUploaded,
+        markPending,
+        markUploaded,
+        removeFailed,
+        destroy
+      };
+    };
+
+    let count = 0;
+    const seed = () => {
+      const rnd = () => {
+        return Math.round(Math.random() * 4294967295).toString(36);
+      };
+      const now = new Date().getTime();
+      return 's' + now.toString(36) + rnd() + rnd() + rnd();
+    };
+    const uuid = prefix => {
+      return prefix + count++ + seed();
+    };
+
+    const BlobCache = () => {
+      let cache = [];
+      const mimeToExt = mime => {
+        const mimes = {
+          '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'
+        };
+        return mimes[mime.toLowerCase()] || 'dat';
+      };
+      const create = (o, blob, base64, name, filename) => {
+        if (isString(o)) {
+          const id = o;
+          return toBlobInfo({
+            id,
+            name,
+            filename,
+            blob,
+            base64
+          });
+        } else if (isObject(o)) {
+          return toBlobInfo(o);
+        } else {
+          throw new Error('Unknown input type');
+        }
+      };
+      const toBlobInfo = o => {
+        if (!o.blob || !o.base64) {
+          throw new Error('blob and base64 representations of the image are required for BlobInfo to be created');
+        }
+        const id = o.id || uuid('blobid');
+        const name = o.name || id;
+        const blob = o.blob;
+        return {
+          id: constant(id),
+          name: constant(name),
+          filename: constant(o.filename || name + '.' + mimeToExt(blob.type)),
+          blob: constant(blob),
+          base64: constant(o.base64),
+          blobUri: constant(o.blobUri || URL.createObjectURL(blob)),
+          uri: constant(o.uri)
+        };
+      };
+      const add = blobInfo => {
+        if (!get(blobInfo.id())) {
+          cache.push(blobInfo);
+        }
+      };
+      const findFirst = predicate => find$2(cache, predicate).getOrUndefined();
+      const get = id => findFirst(cachedBlobInfo => cachedBlobInfo.id() === id);
+      const getByUri = blobUri => findFirst(blobInfo => blobInfo.blobUri() === blobUri);
+      const getByData = (base64, type) => findFirst(blobInfo => blobInfo.base64() === base64 && blobInfo.blob().type === type);
+      const removeByUri = blobUri => {
+        cache = filter$6(cache, blobInfo => {
+          if (blobInfo.blobUri() === blobUri) {
+            URL.revokeObjectURL(blobInfo.blobUri());
+            return false;
+          }
+          return true;
+        });
+      };
+      const destroy = () => {
+        each$g(cache, cachedBlobInfo => {
+          URL.revokeObjectURL(cachedBlobInfo.blobUri());
+        });
+        cache = [];
+      };
+      return {
+        create,
+        add,
+        get,
+        getByUri,
+        getByData,
+        findFirst,
+        removeByUri,
+        destroy
+      };
+    };
+
+    const Uploader = (uploadStatus, settings) => {
+      const pendingPromises = {};
+      const pathJoin = (path1, path2) => {
+        if (path1) {
+          return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, '');
+        }
+        return path2;
+      };
+      const defaultHandler = (blobInfo, progress) => new Promise((success, failure) => {
+        const xhr = new XMLHttpRequest();
+        xhr.open('POST', settings.url);
+        xhr.withCredentials = settings.credentials;
+        xhr.upload.onprogress = e => {
+          progress(e.loaded / e.total * 100);
+        };
+        xhr.onerror = () => {
+          failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status);
+        };
+        xhr.onload = () => {
+          if (xhr.status < 200 || xhr.status >= 300) {
+            failure('HTTP Error: ' + xhr.status);
+            return;
+          }
+          const json = JSON.parse(xhr.responseText);
+          if (!json || !isString(json.location)) {
+            failure('Invalid JSON: ' + xhr.responseText);
+            return;
+          }
+          success(pathJoin(settings.basePath, json.location));
+        };
+        const formData = new FormData();
+        formData.append('file', blobInfo.blob(), blobInfo.filename());
+        xhr.send(formData);
+      });
+      const noUpload = () => new Promise(resolve => {
+        resolve([]);
+      });
+      const handlerSuccess = (blobInfo, url) => ({
+        url,
+        blobInfo,
+        status: true
+      });
+      const handlerFailure = (blobInfo, error) => ({
+        url: '',
+        blobInfo,
+        status: false,
+        error
+      });
+      const resolvePending = (blobUri, result) => {
+        Tools.each(pendingPromises[blobUri], resolve => {
+          resolve(result);
+        });
+        delete pendingPromises[blobUri];
+      };
+      const uploadBlobInfo = (blobInfo, handler, openNotification) => {
+        uploadStatus.markPending(blobInfo.blobUri());
+        return new Promise(resolve => {
+          let notification;
+          let progress;
+          try {
+            const closeNotification = () => {
+              if (notification) {
+                notification.close();
+                progress = noop;
+              }
+            };
+            const success = url => {
+              closeNotification();
+              uploadStatus.markUploaded(blobInfo.blobUri(), url);
+              resolvePending(blobInfo.blobUri(), handlerSuccess(blobInfo, url));
+              resolve(handlerSuccess(blobInfo, url));
+            };
+            const failure = error => {
+              closeNotification();
+              uploadStatus.removeFailed(blobInfo.blobUri());
+              resolvePending(blobInfo.blobUri(), handlerFailure(blobInfo, error));
+              resolve(handlerFailure(blobInfo, error));
+            };
+            progress = percent => {
+              if (percent < 0 || percent > 100) {
+                return;
+              }
+              Optional.from(notification).orThunk(() => Optional.from(openNotification).map(apply$1)).each(n => {
+                notification = n;
+                n.progressBar.value(percent);
+              });
+            };
+            handler(blobInfo, progress).then(success, err => {
+              failure(isString(err) ? { message: err } : err);
+            });
+          } catch (ex) {
+            resolve(handlerFailure(blobInfo, ex));
+          }
+        });
+      };
+      const isDefaultHandler = handler => handler === defaultHandler;
+      const pendingUploadBlobInfo = blobInfo => {
+        const blobUri = blobInfo.blobUri();
+        return new Promise(resolve => {
+          pendingPromises[blobUri] = pendingPromises[blobUri] || [];
+          pendingPromises[blobUri].push(resolve);
+        });
+      };
+      const uploadBlobs = (blobInfos, openNotification) => {
+        blobInfos = Tools.grep(blobInfos, blobInfo => !uploadStatus.isUploaded(blobInfo.blobUri()));
+        return Promise.all(Tools.map(blobInfos, blobInfo => uploadStatus.isPending(blobInfo.blobUri()) ? pendingUploadBlobInfo(blobInfo) : uploadBlobInfo(blobInfo, settings.handler, openNotification)));
+      };
+      const upload = (blobInfos, openNotification) => !settings.url && isDefaultHandler(settings.handler) ? noUpload() : uploadBlobs(blobInfos, openNotification);
+      if (isFunction(settings.handler) === false) {
+        settings.handler = defaultHandler;
+      }
+      return { upload };
+    };
+
+    const openNotification = editor => () => editor.notificationManager.open({
+      text: editor.translate('Image uploading...'),
+      type: 'info',
+      timeout: -1,
+      progressBar: true
+    });
+    const createUploader = (editor, uploadStatus) => Uploader(uploadStatus, {
+      url: getImageUploadUrl(editor),
+      basePath: getImageUploadBasePath(editor),
+      credentials: getImagesUploadCredentials(editor),
+      handler: getImagesUploadHandler(editor)
+    });
+    const ImageUploader = editor => {
+      const uploadStatus = UploadStatus();
+      const uploader = createUploader(editor, uploadStatus);
+      return { upload: (blobInfos, showNotification = true) => uploader.upload(blobInfos, showNotification ? openNotification(editor) : undefined) };
+    };
+
+    const UploadChangeHandler = editor => {
+      const lastChangedLevel = Cell(null);
+      editor.on('change AddUndo', e => {
+        lastChangedLevel.set({ ...e.level });
+      });
+      const fireIfChanged = () => {
+        const data = editor.undoManager.data;
+        last$3(data).filter(level => {
+          return !isEq$1(lastChangedLevel.get(), level);
+        }).each(level => {
+          editor.setDirty(true);
+          editor.dispatch('change', {
+            level,
+            lastLevel: get$b(data, data.length - 2).getOrNull()
+          });
+        });
+      };
+      return { fireIfChanged };
+    };
+    const EditorUpload = editor => {
+      const blobCache = BlobCache();
+      let uploader, imageScanner;
+      const uploadStatus = UploadStatus();
+      const urlFilters = [];
+      const changeHandler = UploadChangeHandler(editor);
+      const aliveGuard = callback => {
+        return result => {
+          if (editor.selection) {
+            return callback(result);
+          }
+          return [];
+        };
+      };
+      const cacheInvalidator = url => url + (url.indexOf('?') === -1 ? '?' : '&') + new Date().getTime();
+      const replaceString = (content, search, replace) => {
+        let index = 0;
+        do {
+          index = content.indexOf(search, index);
+          if (index !== -1) {
+            content = content.substring(0, index) + replace + content.substr(index + search.length);
+            index += replace.length - search.length + 1;
+          }
+        } while (index !== -1);
+        return content;
+      };
+      const replaceImageUrl = (content, targetUrl, replacementUrl) => {
+        const replacementString = `src="${ replacementUrl }"${ replacementUrl === Env.transparentSrc ? ' data-mce-placeholder="1"' : '' }`;
+        content = replaceString(content, `src="${ targetUrl }"`, replacementString);
+        content = replaceString(content, 'data-mce-src="' + targetUrl + '"', 'data-mce-src="' + replacementUrl + '"');
+        return content;
+      };
+      const replaceUrlInUndoStack = (targetUrl, replacementUrl) => {
+        each$g(editor.undoManager.data, level => {
+          if (level.type === 'fragmented') {
+            level.fragments = map$3(level.fragments, fragment => replaceImageUrl(fragment, targetUrl, replacementUrl));
+          } else {
+            level.content = replaceImageUrl(level.content, targetUrl, replacementUrl);
+          }
+        });
+      };
+      const replaceImageUriInView = (image, resultUri) => {
+        const src = editor.convertURL(resultUri, 'src');
+        replaceUrlInUndoStack(image.src, resultUri);
+        setAll$1(SugarElement.fromDom(image), {
+          'src': shouldReuseFileName(editor) ? cacheInvalidator(resultUri) : resultUri,
+          'data-mce-src': src
+        });
+      };
+      const uploadImages = () => {
+        if (!uploader) {
+          uploader = createUploader(editor, uploadStatus);
+        }
+        return scanForImages().then(aliveGuard(imageInfos => {
+          const blobInfos = map$3(imageInfos, imageInfo => imageInfo.blobInfo);
+          return uploader.upload(blobInfos, openNotification(editor)).then(aliveGuard(result => {
+            const imagesToRemove = [];
+            const filteredResult = map$3(result, (uploadInfo, index) => {
+              const blobInfo = imageInfos[index].blobInfo;
+              const image = imageInfos[index].image;
+              let removed = false;
+              if (uploadInfo.status && shouldReplaceBlobUris(editor)) {
+                blobCache.removeByUri(image.src);
+                if (isRtc(editor)) ; else {
+                  replaceImageUriInView(image, uploadInfo.url);
+                }
+              } else if (uploadInfo.error) {
+                if (uploadInfo.error.remove) {
+                  replaceUrlInUndoStack(image.getAttribute('src'), Env.transparentSrc);
+                  imagesToRemove.push(image);
+                  removed = true;
+                }
+                uploadError(editor, uploadInfo.error.message);
+              }
+              return {
+                element: image,
+                status: uploadInfo.status,
+                uploadUri: uploadInfo.url,
+                blobInfo,
+                removed
+              };
+            });
+            if (filteredResult.length > 0) {
+              changeHandler.fireIfChanged();
+            }
+            if (imagesToRemove.length > 0 && !isRtc(editor)) {
+              editor.undoManager.transact(() => {
+                each$g(imagesToRemove, element => {
+                  editor.dom.remove(element);
+                  blobCache.removeByUri(element.src);
+                });
+              });
+            }
+            return filteredResult;
+          }));
+        }));
+      };
+      const uploadImagesAuto = () => isAutomaticUploadsEnabled(editor) ? uploadImages() : Promise.resolve([]);
+      const isValidDataUriImage = imgElm => forall(urlFilters, filter => filter(imgElm));
+      const addFilter = filter => {
+        urlFilters.push(filter);
+      };
+      const scanForImages = () => {
+        if (!imageScanner) {
+          imageScanner = ImageScanner(uploadStatus, blobCache);
+        }
+        return imageScanner.findAll(editor.getBody(), isValidDataUriImage).then(aliveGuard(result => {
+          result = filter$6(result, resultItem => {
+            if (typeof resultItem === 'string') {
+              displayError(editor, resultItem);
+              return false;
+            }
+            return true;
+          });
+          if (isRtc(editor)) ; else {
+            each$g(result, resultItem => {
+              replaceUrlInUndoStack(resultItem.image.src, resultItem.blobInfo.blobUri());
+              resultItem.image.src = resultItem.blobInfo.blobUri();
+              resultItem.image.removeAttribute('data-mce-src');
+            });
+          }
+          return result;
+        }));
+      };
+      const destroy = () => {
+        blobCache.destroy();
+        uploadStatus.destroy();
+        imageScanner = uploader = null;
+      };
+      const replaceBlobUris = content => {
+        return content.replace(/src="(blob:[^"]+)"/g, (match, blobUri) => {
+          const resultUri = uploadStatus.getResultUri(blobUri);
+          if (resultUri) {
+            return 'src="' + resultUri + '"';
+          }
+          let blobInfo = blobCache.getByUri(blobUri);
+          if (!blobInfo) {
+            blobInfo = foldl(editor.editorManager.get(), (result, editor) => {
+              return result || editor.editorUpload && editor.editorUpload.blobCache.getByUri(blobUri);
+            }, null);
+          }
+          if (blobInfo) {
+            const blob = blobInfo.blob();
+            return 'src="data:' + blob.type + ';base64,' + blobInfo.base64() + '"';
+          }
+          return match;
+        });
+      };
+      editor.on('SetContent', () => {
+        if (isAutomaticUploadsEnabled(editor)) {
+          uploadImagesAuto();
+        } else {
+          scanForImages();
+        }
+      });
+      editor.on('RawSaveContent', e => {
+        e.content = replaceBlobUris(e.content);
+      });
+      editor.on('GetContent', e => {
+        if (e.source_view || e.format === 'raw' || e.format === 'tree') {
+          return;
+        }
+        e.content = replaceBlobUris(e.content);
+      });
+      editor.on('PostRender', () => {
+        editor.parser.addNodeFilter('img', images => {
+          each$g(images, img => {
+            const src = img.attr('src');
+            if (blobCache.getByUri(src)) {
+              return;
+            }
+            const resultUri = uploadStatus.getResultUri(src);
+            if (resultUri) {
+              img.attr('src', resultUri);
+            }
+          });
+        });
+      });
+      return {
+        blobCache,
+        addFilter,
+        uploadImages,
+        uploadImagesAuto,
+        scanForImages,
+        destroy
+      };
+    };
+
+    const get$1 = editor => {
+      const dom = editor.dom;
+      const schemaType = editor.schema.type;
+      const formats = {
+        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: false,
+            classes: 'align-left',
+            ceFalseOverride: true,
+            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: false,
+            preview: false
+          },
+          {
+            selector: 'img,audio,video',
+            collapsed: false,
+            styles: { float: 'left' },
+            preview: 'font-family font-size'
+          },
+          {
+            selector: 'table',
+            collapsed: false,
+            styles: {
+              marginLeft: '0px',
+              marginRight: 'auto'
+            },
+            onformat: table => {
+              dom.setStyle(table, 'float', null);
+            },
+            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: false,
+            preview: 'font-family font-size'
+          },
+          {
+            selector: 'figure.image',
+            collapsed: false,
+            classes: 'align-center',
+            ceFalseOverride: true,
+            preview: 'font-family font-size'
+          },
+          {
+            selector: 'img,audio,video',
+            collapsed: false,
+            styles: {
+              display: 'block',
+              marginLeft: 'auto',
+              marginRight: 'auto'
+            },
+            preview: false
+          },
+          {
+            selector: 'table',
+            collapsed: false,
+            styles: {
+              marginLeft: 'auto',
+              marginRight: 'auto'
+            },
+            preview: 'font-family font-size'
+          }
+        ],
+        alignright: [
+          {
+            selector: 'figure.image',
+            collapsed: false,
+            classes: 'align-right',
+            ceFalseOverride: true,
+            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: false,
+            preview: 'font-family font-size'
+          },
+          {
+            selector: 'img,audio,video',
+            collapsed: false,
+            styles: { float: 'right' },
+            preview: 'font-family font-size'
+          },
+          {
+            selector: 'table',
+            collapsed: false,
+            styles: {
+              marginRight: '0px',
+              marginLeft: 'auto'
+            },
+            onformat: table => {
+              dom.setStyle(table, 'float', null);
+            },
+            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: false,
+            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: true
+          },
+          {
+            inline: 'u',
+            remove: 'all',
+            preserve_attributes: [
+              'class',
+              'style'
+            ]
+          }
+        ],
+        strikethrough: (() => {
+          const span = {
+            inline: 'span',
+            styles: { textDecoration: 'line-through' },
+            exact: true
+          };
+          const strike = {
+            inline: 'strike',
+            remove: 'all',
+            preserve_attributes: [
+              'class',
+              'style'
+            ]
+          };
+          const s = {
+            inline: 's',
+            remove: 'all',
+            preserve_attributes: [
+              'class',
+              'style'
+            ]
+          };
+          return schemaType !== 'html4' ? [
+            s,
+            span,
+            strike
+          ] : [
+            span,
+            s,
+            strike
+          ];
+        })(),
+        forecolor: {
+          inline: 'span',
+          styles: { color: '%value' },
+          links: true,
+          remove_similar: true,
+          clear_child_styles: true
+        },
+        hilitecolor: {
+          inline: 'span',
+          styles: { backgroundColor: '%value' },
+          links: true,
+          remove_similar: true,
+          clear_child_styles: true
+        },
+        fontname: {
+          inline: 'span',
+          toggle: false,
+          styles: { fontFamily: '%value' },
+          clear_child_styles: true
+        },
+        fontsize: {
+          inline: 'span',
+          toggle: false,
+          styles: { fontSize: '%value' },
+          clear_child_styles: true
+        },
+        lineheight: {
+          selector: 'h1,h2,h3,h4,h5,h6,p,li,td,th,div',
+          styles: { lineHeight: '%value' }
+        },
+        fontsize_class: {
+          inline: 'span',
+          attributes: { class: '%value' }
+        },
+        blockquote: {
+          block: 'blockquote',
+          wrapper: true,
+          remove: 'all'
+        },
+        subscript: { inline: 'sub' },
+        superscript: { inline: 'sup' },
+        code: { inline: 'code' },
+        link: {
+          inline: 'a',
+          selector: 'a',
+          remove: 'all',
+          split: true,
+          deep: true,
+          onmatch: (node, _fmt, _itemName) => {
+            return isElement$6(node) && node.hasAttribute('href');
+          },
+          onformat: (elm, _fmt, vars) => {
+            Tools.each(vars, (value, key) => {
+              dom.setAttrib(elm, key, value);
+            });
+          }
+        },
+        lang: {
+          inline: 'span',
+          clear_child_styles: true,
+          remove_similar: true,
+          attributes: {
+            'lang': '%value',
+            'data-mce-lang': vars => {
+              var _a;
+              return (_a = vars === null || vars === void 0 ? void 0 : vars.customValue) !== null && _a !== void 0 ? _a : 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: true,
+            expand: false,
+            block_expand: true,
+            deep: true
+          },
+          {
+            selector: 'span',
+            attributes: [
+              'style',
+              'class'
+            ],
+            remove: 'empty',
+            split: true,
+            expand: false,
+            deep: true
+          },
+          {
+            selector: '*',
+            attributes: [
+              'style',
+              'class'
+            ],
+            split: false,
+            expand: false,
+            deep: true
+          }
+        ]
+      };
+      Tools.each('p h1 h2 h3 h4 h5 h6 div address pre dt dd samp'.split(/\s/), name => {
+        formats[name] = {
+          block: name,
+          remove: 'all'
+        };
+      });
+      return formats;
+    };
+
+    const genericBase = {
+      remove_similar: true,
+      inherit: false
+    };
+    const cellBase = {
+      selector: 'td,th',
+      ...genericBase
+    };
+    const cellFormats = {
+      tablecellbackgroundcolor: {
+        styles: { backgroundColor: '%value' },
+        ...cellBase
+      },
+      tablecellverticalalign: {
+        styles: { 'vertical-align': '%value' },
+        ...cellBase
+      },
+      tablecellbordercolor: {
+        styles: { borderColor: '%value' },
+        ...cellBase
+      },
+      tablecellclass: {
+        classes: ['%value'],
+        ...cellBase
+      },
+      tableclass: {
+        selector: 'table',
+        classes: ['%value'],
+        ...genericBase
+      },
+      tablecellborderstyle: {
+        styles: { borderStyle: '%value' },
+        ...cellBase
+      },
+      tablecellborderwidth: {
+        styles: { borderWidth: '%value' },
+        ...cellBase
+      }
+    };
+    const get = constant(cellFormats);
+
+    const FormatRegistry = editor => {
+      const formats = {};
+      const get$2 = name => isNonNullable(name) ? formats[name] : formats;
+      const has = name => has$2(formats, name);
+      const register = (name, format) => {
+        if (name) {
+          if (!isString(name)) {
+            each$f(name, (format, name) => {
+              register(name, format);
+            });
+          } else {
+            if (!isArray$1(format)) {
+              format = [format];
+            }
+            each$g(format, format => {
+              if (isUndefined(format.deep)) {
+                format.deep = !isSelectorFormat(format);
+              }
+              if (isUndefined(format.split)) {
+                format.split = !isSelectorFormat(format) || isInlineFormat(format);
+              }
+              if (isUndefined(format.remove) && isSelectorFormat(format) && !isInlineFormat(format)) {
+                format.remove = 'none';
+              }
+              if (isSelectorFormat(format) && isInlineFormat(format)) {
+                format.mixed = true;
+                format.block_expand = true;
+              }
+              if (isString(format.classes)) {
+                format.classes = format.classes.split(/\s+/);
+              }
+            });
+            formats[name] = format;
+          }
+        }
+      };
+      const unregister = name => {
+        if (name && formats[name]) {
+          delete formats[name];
+        }
+        return formats;
+      };
+      register(get$1(editor));
+      register(get());
+      register(getFormats(editor));
+      return {
+        get: get$2,
+        has,
+        register,
+        unregister
+      };
+    };
+
+    const each$3 = Tools.each;
+    const dom = DOMUtils.DOM;
+    const parsedSelectorToHtml = (ancestry, editor) => {
+      let elm, item, fragment;
+      const schema = editor && editor.schema || Schema({});
+      const decorate = (elm, item) => {
+        if (item.classes.length) {
+          dom.addClass(elm, item.classes.join(' '));
+        }
+        dom.setAttribs(elm, item.attrs);
+      };
+      const createElement = sItem => {
+        item = typeof sItem === 'string' ? {
+          name: sItem,
+          classes: [],
+          attrs: {}
+        } : sItem;
+        const elm = dom.create(item.name);
+        decorate(elm, item);
+        return elm;
+      };
+      const getRequiredParent = (elm, candidate) => {
+        const name = typeof elm !== 'string' ? elm.nodeName.toLowerCase() : elm;
+        const elmRule = schema.getElementRule(name);
+        const parentsRequired = elmRule && elmRule.parentsRequired;
+        if (parentsRequired && parentsRequired.length) {
+          return candidate && Tools.inArray(parentsRequired, candidate) !== -1 ? candidate : parentsRequired[0];
+        } else {
+          return false;
+        }
+      };
+      const wrapInHtml = (elm, ancestry, siblings) => {
+        let parent, parentCandidate;
+        const ancestor = ancestry.length > 0 && ancestry[0];
+        const ancestorName = ancestor && ancestor.name;
+        const parentRequired = getRequiredParent(elm, ancestorName);
+        if (parentRequired) {
+          if (ancestorName === parentRequired) {
+            parentCandidate = ancestry[0];
+            ancestry = ancestry.slice(1);
+          } else {
+            parentCandidate = parentRequired;
+          }
+        } else if (ancestor) {
+          parentCandidate = ancestry[0];
+          ancestry = ancestry.slice(1);
+        } else if (!siblings) {
+          return elm;
+        }
+        if (parentCandidate) {
+          parent = createElement(parentCandidate);
+          parent.appendChild(elm);
+        }
+        if (siblings) {
+          if (!parent) {
+            parent = dom.create('div');
+            parent.appendChild(elm);
+          }
+          Tools.each(siblings, sibling => {
+            const siblingElm = createElement(sibling);
+            parent.insertBefore(siblingElm, elm);
+          });
+        }
+        return wrapInHtml(parent, ancestry, parentCandidate && parentCandidate.siblings);
+      };
+      if (ancestry && ancestry.length) {
+        item = ancestry[0];
+        elm = createElement(item);
+        fragment = dom.create('div');
+        fragment.appendChild(wrapInHtml(elm, ancestry.slice(1), item.siblings));
+        return fragment;
+      } else {
+        return '';
+      }
+    };
+    const parseSelectorItem = item => {
+      let tagName;
+      const obj = {
+        classes: [],
+        attrs: {}
+      };
+      item = obj.selector = Tools.trim(item);
+      if (item !== '*') {
+        tagName = item.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g, ($0, $1, $2, $3, $4) => {
+          switch ($1) {
+          case '#':
+            obj.attrs.id = $2;
+            break;
+          case '.':
+            obj.classes.push($2);
+            break;
+          case ':':
+            if (Tools.inArray('checked disabled enabled read-only required'.split(' '), $2) !== -1) {
+              obj.attrs[$2] = $2;
+            }
+            break;
+          }
+          if ($3 === '[') {
+            const m = $4.match(/([\w\-]+)(?:\=\"([^\"]+))?/);
+            if (m) {
+              obj.attrs[m[1]] = m[2];
+            }
+          }
+          return '';
+        });
+      }
+      obj.name = tagName || 'div';
+      return obj;
+    };
+    const parseSelector = selector => {
+      if (!selector || typeof selector !== 'string') {
+        return [];
+      }
+      selector = selector.split(/\s*,\s*/)[0];
+      selector = selector.replace(/\s*(~\+|~|\+|>)\s*/g, '$1');
+      return Tools.map(selector.split(/(?:>|\s+(?![^\[\]]+\]))/), item => {
+        const siblings = Tools.map(item.split(/(?:~\+|~|\+)/), parseSelectorItem);
+        const obj = siblings.pop();
+        if (siblings.length) {
+          obj.siblings = siblings;
+        }
+        return obj;
+      }).reverse();
+    };
+    const getCssText = (editor, format) => {
+      let name, previewFrag;
+      let previewCss = '', parentFontSize;
+      let previewStyles = getPreviewStyles(editor);
+      if (previewStyles === '') {
+        return '';
+      }
+      const removeVars = val => {
+        return val.replace(/%(\w+)/g, '');
+      };
+      if (typeof format === 'string') {
+        format = editor.formatter.get(format);
+        if (!format) {
+          return;
+        }
+        format = format[0];
+      }
+      if ('preview' in format) {
+        const previewOpt = get$a(format, 'preview');
+        if (is$2(previewOpt, false)) {
+          return '';
+        } else {
+          previewStyles = previewOpt.getOr(previewStyles);
+        }
+      }
+      name = format.block || format.inline || 'span';
+      const items = parseSelector(format.selector);
+      if (items.length) {
+        if (!items[0].name) {
+          items[0].name = name;
+        }
+        name = format.selector;
+        previewFrag = parsedSelectorToHtml(items, editor);
+      } else {
+        previewFrag = parsedSelectorToHtml([name], editor);
+      }
+      const previewElm = dom.select(name, previewFrag)[0] || previewFrag.firstChild;
+      each$3(format.styles, (value, name) => {
+        const newValue = removeVars(value);
+        if (newValue) {
+          dom.setStyle(previewElm, name, newValue);
+        }
+      });
+      each$3(format.attributes, (value, name) => {
+        const newValue = removeVars(value);
+        if (newValue) {
+          dom.setAttrib(previewElm, name, newValue);
+        }
+      });
+      each$3(format.classes, value => {
+        const newValue = removeVars(value);
+        if (!dom.hasClass(previewElm, newValue)) {
+          dom.addClass(previewElm, newValue);
+        }
+      });
+      editor.dispatch('PreviewFormats');
+      dom.setStyles(previewFrag, {
+        position: 'absolute',
+        left: -65535
+      });
+      editor.getBody().appendChild(previewFrag);
+      parentFontSize = dom.getStyle(editor.getBody(), 'fontSize', true);
+      parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;
+      each$3(previewStyles.split(' '), name => {
+        let value = dom.getStyle(previewElm, name, true);
+        if (name === 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) {
+          value = dom.getStyle(editor.getBody(), name, true);
+          if (rgbaToHexString(value).toLowerCase() === '#ffffff') {
+            return;
+          }
+        }
+        if (name === 'color') {
+          if (rgbaToHexString(value).toLowerCase() === '#000000') {
+            return;
+          }
+        }
+        if (name === 'font-size') {
+          if (/em|%$/.test(value)) {
+            if (parentFontSize === 0) {
+              return;
+            }
+            const numValue = parseFloat(value) / (/%$/.test(value) ? 100 : 1);
+            value = numValue * parentFontSize + 'px';
+          }
+        }
+        if (name === 'border' && value) {
+          previewCss += 'padding:0 2px;';
+        }
+        previewCss += name + ':' + value + ';';
+      });
+      editor.dispatch('AfterPreviewFormats');
+      dom.remove(previewFrag);
+      return previewCss;
+    };
+
+    const setup$r = editor => {
+      editor.addShortcut('meta+b', '', 'Bold');
+      editor.addShortcut('meta+i', '', 'Italic');
+      editor.addShortcut('meta+u', '', 'Underline');
+      for (let i = 1; i <= 6; i++) {
+        editor.addShortcut('access+' + i, '', [
+          'FormatBlock',
+          false,
+          'h' + i
+        ]);
+      }
+      editor.addShortcut('access+7', '', [
+        'FormatBlock',
+        false,
+        'p'
+      ]);
+      editor.addShortcut('access+8', '', [
+        'FormatBlock',
+        false,
+        'div'
+      ]);
+      editor.addShortcut('access+9', '', [
+        'FormatBlock',
+        false,
+        'address'
+      ]);
+    };
+
+    const Formatter = editor => {
+      const formats = FormatRegistry(editor);
+      const formatChangeState = Cell(null);
+      setup$r(editor);
+      setup$u(editor);
+      return {
+        get: formats.get,
+        has: formats.has,
+        register: formats.register,
+        unregister: formats.unregister,
+        apply: (name, vars, node) => {
+          applyFormat(editor, name, vars, node);
+        },
+        remove: (name, vars, node, similar) => {
+          removeFormat(editor, name, vars, node, similar);
+        },
+        toggle: (name, vars, node) => {
+          toggleFormat(editor, name, vars, node);
+        },
+        match: (name, vars, node, similar) => matchFormat(editor, name, vars, node, similar),
+        closest: names => closestFormat(editor, names),
+        matchAll: (names, vars) => matchAllFormats(editor, names, vars),
+        matchNode: (node, name, vars, similar) => matchNodeFormat(editor, node, name, vars, similar),
+        canApply: name => canApplyFormat(editor, name),
+        formatChanged: (formats, callback, similar, vars) => formatChanged(editor, formatChangeState, formats, callback, similar, vars),
+        getCssText: curry(getCssText, editor)
+      };
+    };
+
+    const shouldIgnoreCommand = cmd => {
+      switch (cmd.toLowerCase()) {
+      case 'undo':
+      case 'redo':
+      case 'mcefocus':
+        return true;
+      default:
+        return false;
+      }
+    };
+    const registerEvents = (editor, undoManager, locks) => {
+      const isFirstTypedCharacter = Cell(false);
+      const addNonTypingUndoLevel = e => {
+        setTyping(undoManager, false, locks);
+        undoManager.add({}, e);
+      };
+      editor.on('init', () => {
+        undoManager.add();
+      });
+      editor.on('BeforeExecCommand', e => {
+        const cmd = e.command;
+        if (!shouldIgnoreCommand(cmd)) {
+          endTyping(undoManager, locks);
+          undoManager.beforeChange();
+        }
+      });
+      editor.on('ExecCommand', e => {
+        const cmd = e.command;
+        if (!shouldIgnoreCommand(cmd)) {
+          addNonTypingUndoLevel(e);
+        }
+      });
+      editor.on('ObjectResizeStart cut', () => {
+        undoManager.beforeChange();
+      });
+      editor.on('SaveContent ObjectResized blur', addNonTypingUndoLevel);
+      editor.on('dragend', addNonTypingUndoLevel);
+      editor.on('keyup', e => {
+        const keyCode = e.keyCode;
+        if (e.isDefaultPrevented()) {
+          return;
+        }
+        if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45 || e.ctrlKey) {
+          addNonTypingUndoLevel();
+          editor.nodeChanged();
+        }
+        if (keyCode === 46 || keyCode === 8) {
+          editor.nodeChanged();
+        }
+        if (isFirstTypedCharacter.get() && undoManager.typing && isEq$1(createFromEditor(editor), undoManager.data[0]) === false) {
+          if (editor.isDirty() === false) {
+            editor.setDirty(true);
+          }
+          editor.dispatch('TypingUndo');
+          isFirstTypedCharacter.set(false);
+          editor.nodeChanged();
+        }
+      });
+      editor.on('keydown', e => {
+        const keyCode = e.keyCode;
+        if (e.isDefaultPrevented()) {
+          return;
+        }
+        if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45) {
+          if (undoManager.typing) {
+            addNonTypingUndoLevel(e);
+          }
+          return;
+        }
+        const modKey = e.ctrlKey && !e.altKey || e.metaKey;
+        if ((keyCode < 16 || keyCode > 20) && keyCode !== 224 && keyCode !== 91 && !undoManager.typing && !modKey) {
+          undoManager.beforeChange();
+          setTyping(undoManager, true, locks);
+          undoManager.add({}, e);
+          isFirstTypedCharacter.set(true);
+        }
+      });
+      editor.on('mousedown', e => {
+        if (undoManager.typing) {
+          addNonTypingUndoLevel(e);
+        }
+      });
+      const isInsertReplacementText = event => event.inputType === 'insertReplacementText';
+      const isInsertTextDataNull = event => event.inputType === 'insertText' && event.data === null;
+      const isInsertFromPasteOrDrop = event => event.inputType === 'insertFromPaste' || event.inputType === 'insertFromDrop';
+      editor.on('input', e => {
+        if (e.inputType && (isInsertReplacementText(e) || isInsertTextDataNull(e) || isInsertFromPasteOrDrop(e))) {
+          addNonTypingUndoLevel(e);
+        }
+      });
+      editor.on('AddUndo Undo Redo ClearUndos', e => {
+        if (!e.isDefaultPrevented()) {
+          editor.nodeChanged();
+        }
+      });
+    };
+    const addKeyboardShortcuts = editor => {
+      editor.addShortcut('meta+z', '', 'Undo');
+      editor.addShortcut('meta+y,meta+shift+z', '', 'Redo');
+    };
+
+    const UndoManager = editor => {
+      const beforeBookmark = value$2();
+      const locks = Cell(0);
+      const index = Cell(0);
+      const undoManager = {
+        data: [],
+        typing: false,
+        beforeChange: () => {
+          beforeChange(editor, locks, beforeBookmark);
+        },
+        add: (level, event) => {
+          return addUndoLevel(editor, undoManager, index, locks, beforeBookmark, level, event);
+        },
+        undo: () => {
+          return undo(editor, undoManager, locks, index);
+        },
+        redo: () => {
+          return redo(editor, index, undoManager.data);
+        },
+        clear: () => {
+          clear(editor, undoManager, index);
+        },
+        reset: () => {
+          reset(editor, undoManager);
+        },
+        hasUndo: () => {
+          return hasUndo(editor, undoManager, index);
+        },
+        hasRedo: () => {
+          return hasRedo(editor, undoManager, index);
+        },
+        transact: callback => {
+          return transact(editor, undoManager, locks, callback);
+        },
+        ignore: callback => {
+          ignore(editor, locks, callback);
+        },
+        extra: (callback1, callback2) => {
+          extra(editor, undoManager, index, callback1, callback2);
+        }
+      };
+      if (!isRtc(editor)) {
+        registerEvents(editor, undoManager, locks);
+      }
+      addKeyboardShortcuts(editor);
+      return undoManager;
+    };
+
+    const nonTypingKeycodes = [
+      9,
+      27,
+      VK.HOME,
+      VK.END,
+      19,
+      20,
+      44,
+      144,
+      145,
+      33,
+      34,
+      45,
+      16,
+      17,
+      18,
+      91,
+      92,
+      93,
+      VK.DOWN,
+      VK.UP,
+      VK.LEFT,
+      VK.RIGHT
+    ].concat(Env.browser.isFirefox() ? [224] : []);
+    const placeholderAttr = 'data-mce-placeholder';
+    const isKeyboardEvent = e => e.type === 'keydown' || e.type === 'keyup';
+    const isDeleteEvent = e => {
+      const keyCode = e.keyCode;
+      return keyCode === VK.BACKSPACE || keyCode === VK.DELETE;
+    };
+    const isNonTypingKeyboardEvent = e => {
+      if (isKeyboardEvent(e)) {
+        const keyCode = e.keyCode;
+        return !isDeleteEvent(e) && (VK.metaKeyPressed(e) || e.altKey || keyCode >= 112 && keyCode <= 123 || contains$2(nonTypingKeycodes, keyCode));
+      } else {
+        return false;
+      }
+    };
+    const isTypingKeyboardEvent = e => isKeyboardEvent(e) && !(isDeleteEvent(e) || e.type === 'keyup' && e.keyCode === 229);
+    const isVisuallyEmpty = (dom, rootElm, forcedRootBlock) => {
+      if (isEmpty$2(SugarElement.fromDom(rootElm), false)) {
+        const firstElement = rootElm.firstElementChild;
+        if (!firstElement) {
+          return true;
+        } else if (dom.getStyle(rootElm.firstElementChild, 'padding-left') || dom.getStyle(rootElm.firstElementChild, 'padding-right')) {
+          return false;
+        } else {
+          return forcedRootBlock === firstElement.nodeName.toLowerCase();
+        }
+      } else {
+        return false;
+      }
+    };
+    const setup$q = editor => {
+      const dom = editor.dom;
+      const rootBlock = getForcedRootBlock(editor);
+      const placeholder = getPlaceholder(editor);
+      const updatePlaceholder = (e, initial) => {
+        if (isNonTypingKeyboardEvent(e)) {
+          return;
+        }
+        const body = editor.getBody();
+        const showPlaceholder = isTypingKeyboardEvent(e) ? false : isVisuallyEmpty(dom, body, rootBlock);
+        const isPlaceholderShown = dom.getAttrib(body, placeholderAttr) !== '';
+        if (isPlaceholderShown !== showPlaceholder || initial) {
+          dom.setAttrib(body, placeholderAttr, showPlaceholder ? placeholder : null);
+          dom.setAttrib(body, 'aria-placeholder', showPlaceholder ? placeholder : null);
+          firePlaceholderToggle(editor, showPlaceholder);
+          editor.on(showPlaceholder ? 'keydown' : 'keyup', updatePlaceholder);
+          editor.off(showPlaceholder ? 'keyup' : 'keydown', updatePlaceholder);
+        }
+      };
+      if (placeholder) {
+        editor.on('init', e => {
+          updatePlaceholder(e, true);
+          editor.on('change SetContent ExecCommand', updatePlaceholder);
+          editor.on('paste', e => Delay.setEditorTimeout(editor, () => updatePlaceholder(e)));
+        });
+      }
+    };
+
+    const strongRtl = /[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/;
+    const hasStrongRtl = text => strongRtl.test(text);
+
+    const isInlineTarget = (editor, elm) => is$1(SugarElement.fromDom(elm), getInlineBoundarySelector(editor));
+    const isRtl = element => DOMUtils.DOM.getStyle(element, 'direction', true) === 'rtl' || hasStrongRtl(element.textContent);
+    const findInlineParents = (isInlineTarget, rootNode, pos) => filter$6(DOMUtils.DOM.getParents(pos.container(), '*', rootNode), isInlineTarget);
+    const findRootInline = (isInlineTarget, rootNode, pos) => {
+      const parents = findInlineParents(isInlineTarget, rootNode, pos);
+      return Optional.from(parents[parents.length - 1]);
+    };
+    const hasSameParentBlock = (rootNode, node1, node2) => {
+      const block1 = getParentBlock$3(node1, rootNode);
+      const block2 = getParentBlock$3(node2, rootNode);
+      return block1 && block1 === block2;
+    };
+    const isAtZwsp = pos => isBeforeInline(pos) || isAfterInline(pos);
+    const normalizePosition = (forward, pos) => {
+      if (!pos) {
+        return pos;
+      }
+      const container = pos.container(), offset = pos.offset();
+      if (forward) {
+        if (isCaretContainerInline(container)) {
+          if (isText$8(container.nextSibling)) {
+            return CaretPosition(container.nextSibling, 0);
+          } else {
+            return CaretPosition.after(container);
+          }
+        } else {
+          return isBeforeInline(pos) ? CaretPosition(container, offset + 1) : pos;
+        }
+      } else {
+        if (isCaretContainerInline(container)) {
+          if (isText$8(container.previousSibling)) {
+            return CaretPosition(container.previousSibling, container.previousSibling.data.length);
+          } else {
+            return CaretPosition.before(container);
+          }
+        } else {
+          return isAfterInline(pos) ? CaretPosition(container, offset - 1) : pos;
+        }
+      }
+    };
+    const normalizeForwards = curry(normalizePosition, true);
+    const normalizeBackwards = curry(normalizePosition, false);
+
+    const execCommandIgnoreInputEvents = (editor, command) => {
+      const inputBlocker = e => e.stopImmediatePropagation();
+      editor.on('beforeinput input', inputBlocker, true);
+      editor.getDoc().execCommand(command);
+      editor.off('beforeinput input', inputBlocker);
+    };
+    const execDeleteCommand = editor => execCommandIgnoreInputEvents(editor, 'Delete');
+    const execForwardDeleteCommand = editor => execCommandIgnoreInputEvents(editor, 'ForwardDelete');
+    const isBeforeRoot = rootNode => elm => eq(rootNode, SugarElement.fromDom(elm.dom.parentNode));
+    const isTextBlockOrListItem = element => isTextBlock$2(element) || isListItem(element);
+    const getParentBlock$2 = (rootNode, elm) => {
+      if (contains(rootNode, elm)) {
+        return closest$4(elm, isTextBlockOrListItem, isBeforeRoot(rootNode));
+      } else {
+        return Optional.none();
+      }
+    };
+    const placeCaretInEmptyBody = editor => {
+      const body = editor.getBody();
+      const node = body.firstChild && editor.dom.isBlock(body.firstChild) ? body.firstChild : body;
+      editor.selection.setCursorLocation(node, 0);
+    };
+    const paddEmptyBody = editor => {
+      if (editor.dom.isEmpty(editor.getBody())) {
+        editor.setContent('');
+        placeCaretInEmptyBody(editor);
+      }
+    };
+    const willDeleteLastPositionInElement = (forward, fromPos, elm) => lift2(firstPositionIn(elm), lastPositionIn(elm), (firstPos, lastPos) => {
+      const normalizedFirstPos = normalizePosition(true, firstPos);
+      const normalizedLastPos = normalizePosition(false, lastPos);
+      const normalizedFromPos = normalizePosition(false, fromPos);
+      if (forward) {
+        return nextPosition(elm, normalizedFromPos).exists(nextPos => nextPos.isEqual(normalizedLastPos) && fromPos.isEqual(normalizedFirstPos));
+      } else {
+        return prevPosition(elm, normalizedFromPos).exists(prevPos => prevPos.isEqual(normalizedFirstPos) && fromPos.isEqual(normalizedLastPos));
+      }
+    }).getOr(true);
+
+    const blockPosition = (block, position) => ({
+      block,
+      position
+    });
+    const blockBoundary = (from, to) => ({
+      from,
+      to
+    });
+    const getBlockPosition = (rootNode, pos) => {
+      const rootElm = SugarElement.fromDom(rootNode);
+      const containerElm = SugarElement.fromDom(pos.container());
+      return getParentBlock$2(rootElm, containerElm).map(block => blockPosition(block, pos));
+    };
+    const isDifferentBlocks = blockBoundary => eq(blockBoundary.from.block, blockBoundary.to.block) === false;
+    const hasSameParent = blockBoundary => parent(blockBoundary.from.block).bind(parent1 => parent(blockBoundary.to.block).filter(parent2 => eq(parent1, parent2))).isSome();
+    const isEditable$2 = blockBoundary => isContentEditableFalse$a(blockBoundary.from.block.dom) === false && isContentEditableFalse$a(blockBoundary.to.block.dom) === false;
+    const skipLastBr = (rootNode, forward, blockPosition) => {
+      if (isBr$5(blockPosition.position.getNode()) && isEmpty$2(blockPosition.block) === false) {
+        return positionIn(false, blockPosition.block.dom).bind(lastPositionInBlock => {
+          if (lastPositionInBlock.isEqual(blockPosition.position)) {
+            return fromPosition(forward, rootNode, lastPositionInBlock).bind(to => getBlockPosition(rootNode, to));
+          } else {
+            return Optional.some(blockPosition);
+          }
+        }).getOr(blockPosition);
+      } else {
+        return blockPosition;
+      }
+    };
+    const readFromRange = (rootNode, forward, rng) => {
+      const fromBlockPos = getBlockPosition(rootNode, CaretPosition.fromRangeStart(rng));
+      const toBlockPos = fromBlockPos.bind(blockPos => fromPosition(forward, rootNode, blockPos.position).bind(to => getBlockPosition(rootNode, to).map(blockPos => skipLastBr(rootNode, forward, blockPos))));
+      return lift2(fromBlockPos, toBlockPos, blockBoundary).filter(blockBoundary => isDifferentBlocks(blockBoundary) && hasSameParent(blockBoundary) && isEditable$2(blockBoundary));
+    };
+    const read$1 = (rootNode, forward, rng) => rng.collapsed ? readFromRange(rootNode, forward, rng) : Optional.none();
+
+    const getChildrenUntilBlockBoundary = block => {
+      const children$1 = children(block);
+      return findIndex$2(children$1, isBlock$2).fold(constant(children$1), index => children$1.slice(0, index));
+    };
+    const extractChildren = block => {
+      const children = getChildrenUntilBlockBoundary(block);
+      each$g(children, remove$5);
+      return children;
+    };
+    const removeEmptyRoot = (rootNode, block) => {
+      const parents = parentsAndSelf(block, rootNode);
+      return find$2(parents.reverse(), element => isEmpty$2(element)).each(remove$5);
+    };
+    const isEmptyBefore = el => filter$6(prevSiblings(el), el => !isEmpty$2(el)).length === 0;
+    const nestedBlockMerge = (rootNode, fromBlock, toBlock, insertionPoint) => {
+      if (isEmpty$2(toBlock)) {
+        fillWithPaddingBr(toBlock);
+        return firstPositionIn(toBlock.dom);
+      }
+      if (isEmptyBefore(insertionPoint) && isEmpty$2(fromBlock)) {
+        before$3(insertionPoint, SugarElement.fromTag('br'));
+      }
+      const position = prevPosition(toBlock.dom, CaretPosition.before(insertionPoint.dom));
+      each$g(extractChildren(fromBlock), child => {
+        before$3(insertionPoint, child);
+      });
+      removeEmptyRoot(rootNode, fromBlock);
+      return position;
+    };
+    const sidelongBlockMerge = (rootNode, fromBlock, toBlock) => {
+      if (isEmpty$2(toBlock)) {
+        remove$5(toBlock);
+        if (isEmpty$2(fromBlock)) {
+          fillWithPaddingBr(fromBlock);
+        }
+        return firstPositionIn(fromBlock.dom);
+      }
+      const position = lastPositionIn(toBlock.dom);
+      each$g(extractChildren(fromBlock), child => {
+        append$1(toBlock, child);
+      });
+      removeEmptyRoot(rootNode, fromBlock);
+      return position;
+    };
+    const findInsertionPoint = (toBlock, block) => {
+      const parentsAndSelf$1 = parentsAndSelf(block, toBlock);
+      return Optional.from(parentsAndSelf$1[parentsAndSelf$1.length - 1]);
+    };
+    const getInsertionPoint = (fromBlock, toBlock) => contains(toBlock, fromBlock) ? findInsertionPoint(toBlock, fromBlock) : Optional.none();
+    const trimBr = (first, block) => {
+      positionIn(first, block.dom).map(position => position.getNode()).map(SugarElement.fromDom).filter(isBr$4).each(remove$5);
+    };
+    const mergeBlockInto = (rootNode, fromBlock, toBlock) => {
+      trimBr(true, fromBlock);
+      trimBr(false, toBlock);
+      return getInsertionPoint(fromBlock, toBlock).fold(curry(sidelongBlockMerge, rootNode, fromBlock, toBlock), curry(nestedBlockMerge, rootNode, fromBlock, toBlock));
+    };
+    const mergeBlocks = (rootNode, forward, block1, block2) => forward ? mergeBlockInto(rootNode, block2, block1) : mergeBlockInto(rootNode, block1, block2);
+
+    const backspaceDelete$8 = (editor, forward) => {
+      const rootNode = SugarElement.fromDom(editor.getBody());
+      const position = read$1(rootNode.dom, forward, editor.selection.getRng()).map(blockBoundary => () => {
+        mergeBlocks(rootNode, forward, blockBoundary.from.block, blockBoundary.to.block).each(pos => {
+          editor.selection.setRng(pos.toRange());
+        });
+      });
+      return position;
+    };
+
+    const deleteRangeMergeBlocks = (rootNode, selection) => {
+      const rng = selection.getRng();
+      return lift2(getParentBlock$2(rootNode, SugarElement.fromDom(rng.startContainer)), getParentBlock$2(rootNode, SugarElement.fromDom(rng.endContainer)), (block1, block2) => {
+        if (eq(block1, block2) === false) {
+          return Optional.some(() => {
+            rng.deleteContents();
+            mergeBlocks(rootNode, true, block1, block2).each(pos => {
+              selection.setRng(pos.toRange());
+            });
+          });
+        } else {
+          return Optional.none();
+        }
+      }).getOr(Optional.none());
+    };
+    const isRawNodeInTable = (root, rawNode) => {
+      const node = SugarElement.fromDom(rawNode);
+      const isRoot = curry(eq, root);
+      return ancestor$3(node, isTableCell$4, isRoot).isSome();
+    };
+    const isSelectionInTable = (root, rng) => isRawNodeInTable(root, rng.startContainer) || isRawNodeInTable(root, rng.endContainer);
+    const isEverythingSelected = (root, rng) => {
+      const noPrevious = prevPosition(root.dom, CaretPosition.fromRangeStart(rng)).isNone();
+      const noNext = nextPosition(root.dom, CaretPosition.fromRangeEnd(rng)).isNone();
+      return !isSelectionInTable(root, rng) && noPrevious && noNext;
+    };
+    const emptyEditor = editor => {
+      return Optional.some(() => {
+        editor.setContent('');
+        editor.selection.setCursorLocation();
+      });
+    };
+    const deleteRange$1 = editor => {
+      const rootNode = SugarElement.fromDom(editor.getBody());
+      const rng = editor.selection.getRng();
+      return isEverythingSelected(rootNode, rng) ? emptyEditor(editor) : deleteRangeMergeBlocks(rootNode, editor.selection);
+    };
+    const backspaceDelete$7 = (editor, _forward) => editor.selection.isCollapsed() ? Optional.none() : deleteRange$1(editor);
+
+    const isContentEditableTrue$1 = isContentEditableTrue$4;
+    const isContentEditableFalse$4 = isContentEditableFalse$a;
+    const showCaret = (direction, editor, node, before, scrollIntoView) => Optional.from(editor._selectionOverrides.showCaret(direction, node, before, scrollIntoView));
+    const getNodeRange = node => {
+      const rng = node.ownerDocument.createRange();
+      rng.selectNode(node);
+      return rng;
+    };
+    const selectNode = (editor, node) => {
+      const e = editor.dispatch('BeforeObjectSelected', { target: node });
+      if (e.isDefaultPrevented()) {
+        return Optional.none();
+      }
+      return Optional.some(getNodeRange(node));
+    };
+    const renderCaretAtRange = (editor, range, scrollIntoView) => {
+      const normalizedRange = normalizeRange(1, editor.getBody(), range);
+      const caretPosition = CaretPosition.fromRangeStart(normalizedRange);
+      const caretPositionNode = caretPosition.getNode();
+      if (isInlineFakeCaretTarget(caretPositionNode)) {
+        return showCaret(1, editor, caretPositionNode, !caretPosition.isAtEnd(), false);
+      }
+      const caretPositionBeforeNode = caretPosition.getNode(true);
+      if (isInlineFakeCaretTarget(caretPositionBeforeNode)) {
+        return showCaret(1, editor, caretPositionBeforeNode, false, false);
+      }
+      const ceRoot = editor.dom.getParent(caretPosition.getNode(), node => isContentEditableFalse$4(node) || isContentEditableTrue$1(node));
+      if (isInlineFakeCaretTarget(ceRoot)) {
+        return showCaret(1, editor, ceRoot, false, scrollIntoView);
+      }
+      return Optional.none();
+    };
+    const renderRangeCaret = (editor, range, scrollIntoView) => range.collapsed ? renderCaretAtRange(editor, range, scrollIntoView).getOr(range) : range;
+
+    const isBeforeBoundary = pos => isBeforeContentEditableFalse(pos) || isBeforeMedia(pos);
+    const isAfterBoundary = pos => isAfterContentEditableFalse(pos) || isAfterMedia(pos);
+    const trimEmptyTextNode = (dom, node) => {
+      if (isText$8(node) && node.data.length === 0) {
+        dom.remove(node);
+      }
+    };
+    const deleteContentAndShowCaret = (editor, range, node, direction, forward, peekCaretPosition) => {
+      showCaret(direction, editor, peekCaretPosition.getNode(!forward), forward, true).each(caretRange => {
+        if (range.collapsed) {
+          const deleteRange = range.cloneRange();
+          if (forward) {
+            deleteRange.setEnd(caretRange.startContainer, caretRange.startOffset);
+          } else {
+            deleteRange.setStart(caretRange.endContainer, caretRange.endOffset);
+          }
+          deleteRange.deleteContents();
+        } else {
+          range.deleteContents();
+        }
+        editor.selection.setRng(caretRange);
+      });
+      trimEmptyTextNode(editor.dom, node);
+    };
+    const deleteBoundaryText = (editor, forward) => {
+      const range = editor.selection.getRng();
+      if (!isText$8(range.commonAncestorContainer)) {
+        return Optional.none();
+      }
+      const direction = forward ? HDirection.Forwards : HDirection.Backwards;
+      const caretWalker = CaretWalker(editor.getBody());
+      const getNextPosFn = curry(getVisualCaretPosition, forward ? caretWalker.next : caretWalker.prev);
+      const isBeforeFn = forward ? isBeforeBoundary : isAfterBoundary;
+      const caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);
+      const nextCaretPosition = normalizePosition(forward, getNextPosFn(caretPosition));
+      if (!nextCaretPosition || !isMoveInsideSameBlock(caretPosition, nextCaretPosition)) {
+        return Optional.none();
+      } else if (isBeforeFn(nextCaretPosition)) {
+        return Optional.some(() => deleteContentAndShowCaret(editor, range, caretPosition.getNode(), direction, forward, nextCaretPosition));
+      }
+      const peekCaretPosition = getNextPosFn(nextCaretPosition);
+      if (peekCaretPosition && isBeforeFn(peekCaretPosition)) {
+        if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {
+          return Optional.some(() => deleteContentAndShowCaret(editor, range, caretPosition.getNode(), direction, forward, peekCaretPosition));
+        }
+      }
+      return Optional.none();
+    };
+    const backspaceDelete$6 = (editor, forward) => deleteBoundaryText(editor, forward);
+
+    const isCompoundElement = node => isTableCell$4(SugarElement.fromDom(node)) || isListItem(SugarElement.fromDom(node));
+    const DeleteAction = Adt.generate([
+      { remove: ['element'] },
+      { moveToElement: ['element'] },
+      { moveToPosition: ['position'] }
+    ]);
+    const isAtContentEditableBlockCaret = (forward, from) => {
+      const elm = from.getNode(forward === false);
+      const caretLocation = forward ? 'after' : 'before';
+      return isElement$6(elm) && elm.getAttribute('data-mce-caret') === caretLocation;
+    };
+    const isDeleteFromCefDifferentBlocks = (root, forward, from, to) => {
+      const inSameBlock = elm => isInline$1(SugarElement.fromDom(elm)) && !isInSameBlock(from, to, root);
+      return getRelativeCefElm(!forward, from).fold(() => getRelativeCefElm(forward, to).fold(never, inSameBlock), inSameBlock);
+    };
+    const deleteEmptyBlockOrMoveToCef = (root, forward, from, to) => {
+      const toCefElm = to.getNode(forward === false);
+      return getParentBlock$2(SugarElement.fromDom(root), SugarElement.fromDom(from.getNode())).map(blockElm => isEmpty$2(blockElm) ? DeleteAction.remove(blockElm.dom) : DeleteAction.moveToElement(toCefElm)).orThunk(() => Optional.some(DeleteAction.moveToElement(toCefElm)));
+    };
+    const findCefPosition = (root, forward, from) => fromPosition(forward, root, from).bind(to => {
+      if (isCompoundElement(to.getNode())) {
+        return Optional.none();
+      } else if (isDeleteFromCefDifferentBlocks(root, forward, from, to)) {
+        return Optional.none();
+      } else if (forward && isContentEditableFalse$a(to.getNode())) {
+        return deleteEmptyBlockOrMoveToCef(root, forward, from, to);
+      } else if (forward === false && isContentEditableFalse$a(to.getNode(true))) {
+        return deleteEmptyBlockOrMoveToCef(root, forward, from, to);
+      } else if (forward && isAfterContentEditableFalse(from)) {
+        return Optional.some(DeleteAction.moveToPosition(to));
+      } else if (forward === false && isBeforeContentEditableFalse(from)) {
+        return Optional.some(DeleteAction.moveToPosition(to));
+      } else {
+        return Optional.none();
+      }
+    });
+    const getContentEditableBlockAction = (forward, elm) => {
+      if (forward && isContentEditableFalse$a(elm.nextSibling)) {
+        return Optional.some(DeleteAction.moveToElement(elm.nextSibling));
+      } else if (forward === false && isContentEditableFalse$a(elm.previousSibling)) {
+        return Optional.some(DeleteAction.moveToElement(elm.previousSibling));
+      } else {
+        return Optional.none();
+      }
+    };
+    const skipMoveToActionFromInlineCefToContent = (root, from, deleteAction) => deleteAction.fold(elm => Optional.some(DeleteAction.remove(elm)), elm => Optional.some(DeleteAction.moveToElement(elm)), to => {
+      if (isInSameBlock(from, to, root)) {
+        return Optional.none();
+      } else {
+        return Optional.some(DeleteAction.moveToPosition(to));
+      }
+    });
+    const getContentEditableAction = (root, forward, from) => {
+      if (isAtContentEditableBlockCaret(forward, from)) {
+        return getContentEditableBlockAction(forward, from.getNode(forward === false)).fold(() => findCefPosition(root, forward, from), Optional.some);
+      } else {
+        return findCefPosition(root, forward, from).bind(deleteAction => skipMoveToActionFromInlineCefToContent(root, from, deleteAction));
+      }
+    };
+    const read = (root, forward, rng) => {
+      const normalizedRange = normalizeRange(forward ? 1 : -1, root, rng);
+      const from = CaretPosition.fromRangeStart(normalizedRange);
+      const rootElement = SugarElement.fromDom(root);
+      if (forward === false && isAfterContentEditableFalse(from)) {
+        return Optional.some(DeleteAction.remove(from.getNode(true)));
+      } else if (forward && isBeforeContentEditableFalse(from)) {
+        return Optional.some(DeleteAction.remove(from.getNode()));
+      } else if (forward === false && isBeforeContentEditableFalse(from) && isAfterBr(rootElement, from)) {
+        return findPreviousBr(rootElement, from).map(br => DeleteAction.remove(br.getNode()));
+      } else if (forward && isAfterContentEditableFalse(from) && isBeforeBr$1(rootElement, from)) {
+        return findNextBr(rootElement, from).map(br => DeleteAction.remove(br.getNode()));
+      } else {
+        return getContentEditableAction(root, forward, from);
+      }
+    };
+
+    const deleteElement$1 = (editor, forward) => element => {
+      editor._selectionOverrides.hideFakeCaret();
+      deleteElement$2(editor, forward, SugarElement.fromDom(element));
+      return true;
+    };
+    const moveToElement = (editor, forward) => element => {
+      const pos = forward ? CaretPosition.before(element) : CaretPosition.after(element);
+      editor.selection.setRng(pos.toRange());
+      return true;
+    };
+    const moveToPosition = editor => pos => {
+      editor.selection.setRng(pos.toRange());
+      return true;
+    };
+    const getAncestorCe = (editor, node) => Optional.from(getContentEditableRoot$1(editor.getBody(), node));
+    const backspaceDeleteCaret = (editor, forward) => {
+      const selectedNode = editor.selection.getNode();
+      return getAncestorCe(editor, selectedNode).filter(isContentEditableFalse$a).fold(() => read(editor.getBody(), forward, editor.selection.getRng()).map(deleteAction => () => deleteAction.fold(deleteElement$1(editor, forward), moveToElement(editor, forward), moveToPosition(editor))), () => Optional.some(noop));
+    };
+    const deleteOffscreenSelection = rootElement => {
+      each$g(descendants(rootElement, '.mce-offscreen-selection'), remove$5);
+    };
+    const backspaceDeleteRange = (editor, forward) => {
+      const selectedNode = editor.selection.getNode();
+      if (isContentEditableFalse$a(selectedNode) && !isTableCell$5(selectedNode)) {
+        const hasCefAncestor = getAncestorCe(editor, selectedNode.parentNode).filter(isContentEditableFalse$a);
+        return hasCefAncestor.fold(() => Optional.some(() => {
+          deleteOffscreenSelection(SugarElement.fromDom(editor.getBody()));
+          deleteElement$2(editor, forward, SugarElement.fromDom(editor.selection.getNode()));
+          paddEmptyBody(editor);
+        }), () => Optional.some(noop));
+      }
+      return Optional.none();
+    };
+    const paddEmptyElement = editor => {
+      const dom = editor.dom, selection = editor.selection;
+      const ceRoot = getContentEditableRoot$1(editor.getBody(), selection.getNode());
+      if (isContentEditableTrue$4(ceRoot) && dom.isBlock(ceRoot) && dom.isEmpty(ceRoot)) {
+        const br = dom.create('br', { 'data-mce-bogus': '1' });
+        dom.setHTML(ceRoot, '');
+        ceRoot.appendChild(br);
+        selection.setRng(CaretPosition.before(br).toRange());
+      }
+      return true;
+    };
+    const backspaceDelete$5 = (editor, forward) => {
+      if (editor.selection.isCollapsed()) {
+        return backspaceDeleteCaret(editor, forward);
+      } else {
+        return backspaceDeleteRange(editor, forward);
+      }
+    };
+
+    const deleteCaret$2 = (editor, forward) => {
+      const fromPos = CaretPosition.fromRangeStart(editor.selection.getRng());
+      return fromPosition(forward, editor.getBody(), fromPos).filter(pos => forward ? isBeforeImageBlock(pos) : isAfterImageBlock(pos)).bind(pos => Optional.from(getChildNodeAtRelativeOffset(forward ? 0 : -1, pos))).map(elm => () => editor.selection.select(elm));
+    };
+    const backspaceDelete$4 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret$2(editor, forward) : Optional.none();
+
+    const isText$1 = isText$8;
+    const startsWithCaretContainer = node => isText$1(node) && node.data[0] === ZWSP$1;
+    const endsWithCaretContainer = node => isText$1(node) && node.data[node.data.length - 1] === ZWSP$1;
+    const createZwsp = node => node.ownerDocument.createTextNode(ZWSP$1);
+    const insertBefore = node => {
+      if (isText$1(node.previousSibling)) {
+        if (endsWithCaretContainer(node.previousSibling)) {
+          return node.previousSibling;
+        } else {
+          node.previousSibling.appendData(ZWSP$1);
+          return node.previousSibling;
+        }
+      } else if (isText$1(node)) {
+        if (startsWithCaretContainer(node)) {
+          return node;
+        } else {
+          node.insertData(0, ZWSP$1);
+          return node;
+        }
+      } else {
+        const newNode = createZwsp(node);
+        node.parentNode.insertBefore(newNode, node);
+        return newNode;
+      }
+    };
+    const insertAfter = node => {
+      if (isText$1(node.nextSibling)) {
+        if (startsWithCaretContainer(node.nextSibling)) {
+          return node.nextSibling;
+        } else {
+          node.nextSibling.insertData(0, ZWSP$1);
+          return node.nextSibling;
+        }
+      } else if (isText$1(node)) {
+        if (endsWithCaretContainer(node)) {
+          return node;
+        } else {
+          node.appendData(ZWSP$1);
+          return node;
+        }
+      } else {
+        const newNode = createZwsp(node);
+        if (node.nextSibling) {
+          node.parentNode.insertBefore(newNode, node.nextSibling);
+        } else {
+          node.parentNode.appendChild(newNode);
+        }
+        return newNode;
+      }
+    };
+    const insertInline = (before, node) => before ? insertBefore(node) : insertAfter(node);
+    const insertInlineBefore = curry(insertInline, true);
+    const insertInlineAfter = curry(insertInline, false);
+
+    const insertInlinePos = (pos, before) => {
+      if (isText$8(pos.container())) {
+        return insertInline(before, pos.container());
+      } else {
+        return insertInline(before, pos.getNode());
+      }
+    };
+    const isPosCaretContainer = (pos, caret) => {
+      const caretNode = caret.get();
+      return caretNode && pos.container() === caretNode && isCaretContainerInline(caretNode);
+    };
+    const renderCaret = (caret, location) => location.fold(element => {
+      remove$4(caret.get());
+      const text = insertInlineBefore(element);
+      caret.set(text);
+      return Optional.some(CaretPosition(text, text.length - 1));
+    }, element => firstPositionIn(element).map(pos => {
+      if (!isPosCaretContainer(pos, caret)) {
+        remove$4(caret.get());
+        const text = insertInlinePos(pos, true);
+        caret.set(text);
+        return CaretPosition(text, 1);
+      } else {
+        return CaretPosition(caret.get(), 1);
+      }
+    }), element => lastPositionIn(element).map(pos => {
+      if (!isPosCaretContainer(pos, caret)) {
+        remove$4(caret.get());
+        const text = insertInlinePos(pos, false);
+        caret.set(text);
+        return CaretPosition(text, text.length - 1);
+      } else {
+        return CaretPosition(caret.get(), caret.get().length - 1);
+      }
+    }), element => {
+      remove$4(caret.get());
+      const text = insertInlineAfter(element);
+      caret.set(text);
+      return Optional.some(CaretPosition(text, 1));
+    });
+
+    const evaluateUntil = (fns, args) => {
+      for (let i = 0; i < fns.length; i++) {
+        const result = fns[i].apply(null, args);
+        if (result.isSome()) {
+          return result;
+        }
+      }
+      return Optional.none();
+    };
+
+    const Location = Adt.generate([
+      { before: ['element'] },
+      { start: ['element'] },
+      { end: ['element'] },
+      { after: ['element'] }
+    ]);
+    const rescope$1 = (rootNode, node) => {
+      const parentBlock = getParentBlock$3(node, rootNode);
+      return parentBlock ? parentBlock : rootNode;
+    };
+    const before = (isInlineTarget, rootNode, pos) => {
+      const nPos = normalizeForwards(pos);
+      const scope = rescope$1(rootNode, nPos.container());
+      return findRootInline(isInlineTarget, scope, nPos).fold(() => nextPosition(scope, nPos).bind(curry(findRootInline, isInlineTarget, scope)).map(inline => Location.before(inline)), Optional.none);
+    };
+    const isNotInsideFormatCaretContainer = (rootNode, elm) => getParentCaretContainer(rootNode, elm) === null;
+    const findInsideRootInline = (isInlineTarget, rootNode, pos) => findRootInline(isInlineTarget, rootNode, pos).filter(curry(isNotInsideFormatCaretContainer, rootNode));
+    const start$1 = (isInlineTarget, rootNode, pos) => {
+      const nPos = normalizeBackwards(pos);
+      return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(inline => {
+        const prevPos = prevPosition(inline, nPos);
+        return prevPos.isNone() ? Optional.some(Location.start(inline)) : Optional.none();
+      });
+    };
+    const end = (isInlineTarget, rootNode, pos) => {
+      const nPos = normalizeForwards(pos);
+      return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(inline => {
+        const nextPos = nextPosition(inline, nPos);
+        return nextPos.isNone() ? Optional.some(Location.end(inline)) : Optional.none();
+      });
+    };
+    const after = (isInlineTarget, rootNode, pos) => {
+      const nPos = normalizeBackwards(pos);
+      const scope = rescope$1(rootNode, nPos.container());
+      return findRootInline(isInlineTarget, scope, nPos).fold(() => prevPosition(scope, nPos).bind(curry(findRootInline, isInlineTarget, scope)).map(inline => Location.after(inline)), Optional.none);
+    };
+    const isValidLocation = location => isRtl(getElement(location)) === false;
+    const readLocation = (isInlineTarget, rootNode, pos) => {
+      const location = evaluateUntil([
+        before,
+        start$1,
+        end,
+        after
+      ], [
+        isInlineTarget,
+        rootNode,
+        pos
+      ]);
+      return location.filter(isValidLocation);
+    };
+    const getElement = location => location.fold(identity, identity, identity, identity);
+    const getName = location => location.fold(constant('before'), constant('start'), constant('end'), constant('after'));
+    const outside = location => location.fold(Location.before, Location.before, Location.after, Location.after);
+    const inside = location => location.fold(Location.start, Location.start, Location.end, Location.end);
+    const isEq = (location1, location2) => getName(location1) === getName(location2) && getElement(location1) === getElement(location2);
+    const betweenInlines = (forward, isInlineTarget, rootNode, from, to, location) => lift2(findRootInline(isInlineTarget, rootNode, from), findRootInline(isInlineTarget, rootNode, to), (fromInline, toInline) => {
+      if (fromInline !== toInline && hasSameParentBlock(rootNode, fromInline, toInline)) {
+        return Location.after(forward ? fromInline : toInline);
+      } else {
+        return location;
+      }
+    }).getOr(location);
+    const skipNoMovement = (fromLocation, toLocation) => fromLocation.fold(always, fromLocation => !isEq(fromLocation, toLocation));
+    const findLocationTraverse = (forward, isInlineTarget, rootNode, fromLocation, pos) => {
+      const from = normalizePosition(forward, pos);
+      const to = fromPosition(forward, rootNode, from).map(curry(normalizePosition, forward));
+      const location = to.fold(() => fromLocation.map(outside), to => readLocation(isInlineTarget, rootNode, to).map(curry(betweenInlines, forward, isInlineTarget, rootNode, from, to)).filter(curry(skipNoMovement, fromLocation)));
+      return location.filter(isValidLocation);
+    };
+    const findLocationSimple = (forward, location) => {
+      if (forward) {
+        return location.fold(compose(Optional.some, Location.start), Optional.none, compose(Optional.some, Location.after), Optional.none);
+      } else {
+        return location.fold(Optional.none, compose(Optional.some, Location.before), Optional.none, compose(Optional.some, Location.end));
+      }
+    };
+    const findLocation$1 = (forward, isInlineTarget, rootNode, pos) => {
+      const from = normalizePosition(forward, pos);
+      const fromLocation = readLocation(isInlineTarget, rootNode, from);
+      return readLocation(isInlineTarget, rootNode, from).bind(curry(findLocationSimple, forward)).orThunk(() => findLocationTraverse(forward, isInlineTarget, rootNode, fromLocation, pos));
+    };
+
+    const hasSelectionModifyApi = editor => {
+      return isFunction(editor.selection.getSel().modify);
+    };
+    const moveRel = (forward, selection, pos) => {
+      const delta = forward ? 1 : -1;
+      selection.setRng(CaretPosition(pos.container(), pos.offset() + delta).toRange());
+      selection.getSel().modify('move', forward ? 'forward' : 'backward', 'word');
+      return true;
+    };
+    const moveByWord = (forward, editor) => {
+      const rng = editor.selection.getRng();
+      const pos = forward ? CaretPosition.fromRangeEnd(rng) : CaretPosition.fromRangeStart(rng);
+      if (!hasSelectionModifyApi(editor)) {
+        return false;
+      } else if (forward && isBeforeInline(pos)) {
+        return moveRel(true, editor.selection, pos);
+      } else if (!forward && isAfterInline(pos)) {
+        return moveRel(false, editor.selection, pos);
+      } else {
+        return false;
+      }
+    };
+
+    var BreakType;
+    (function (BreakType) {
+      BreakType[BreakType['Br'] = 0] = 'Br';
+      BreakType[BreakType['Block'] = 1] = 'Block';
+      BreakType[BreakType['Wrap'] = 2] = 'Wrap';
+      BreakType[BreakType['Eol'] = 3] = 'Eol';
+    }(BreakType || (BreakType = {})));
+    const flip = (direction, positions) => direction === HDirection.Backwards ? reverse(positions) : positions;
+    const walk$1 = (direction, caretWalker, pos) => direction === HDirection.Forwards ? caretWalker.next(pos) : caretWalker.prev(pos);
+    const getBreakType = (scope, direction, currentPos, nextPos) => {
+      if (isBr$5(nextPos.getNode(direction === HDirection.Forwards))) {
+        return BreakType.Br;
+      } else if (isInSameBlock(currentPos, nextPos) === false) {
+        return BreakType.Block;
+      } else {
+        return BreakType.Wrap;
+      }
+    };
+    const getPositionsUntil = (predicate, direction, scope, start) => {
+      const caretWalker = CaretWalker(scope);
+      let currentPos = start;
+      const positions = [];
+      while (currentPos) {
+        const nextPos = walk$1(direction, caretWalker, currentPos);
+        if (!nextPos) {
+          break;
+        }
+        if (isBr$5(nextPos.getNode(false))) {
+          if (direction === HDirection.Forwards) {
+            return {
+              positions: flip(direction, positions).concat([nextPos]),
+              breakType: BreakType.Br,
+              breakAt: Optional.some(nextPos)
+            };
+          } else {
+            return {
+              positions: flip(direction, positions),
+              breakType: BreakType.Br,
+              breakAt: Optional.some(nextPos)
+            };
+          }
+        }
+        if (!nextPos.isVisible()) {
+          currentPos = nextPos;
+          continue;
+        }
+        if (predicate(currentPos, nextPos)) {
+          const breakType = getBreakType(scope, direction, currentPos, nextPos);
+          return {
+            positions: flip(direction, positions),
+            breakType,
+            breakAt: Optional.some(nextPos)
+          };
+        }
+        positions.push(nextPos);
+        currentPos = nextPos;
+      }
+      return {
+        positions: flip(direction, positions),
+        breakType: BreakType.Eol,
+        breakAt: Optional.none()
+      };
+    };
+    const getAdjacentLinePositions = (direction, getPositionsUntilBreak, scope, start) => getPositionsUntilBreak(scope, start).breakAt.map(pos => {
+      const positions = getPositionsUntilBreak(scope, pos).positions;
+      return direction === HDirection.Backwards ? positions.concat(pos) : [pos].concat(positions);
+    }).getOr([]);
+    const findClosestHorizontalPositionFromPoint = (positions, x) => foldl(positions, (acc, newPos) => acc.fold(() => Optional.some(newPos), lastPos => lift2(head(lastPos.getClientRects()), head(newPos.getClientRects()), (lastRect, newRect) => {
+      const lastDist = Math.abs(x - lastRect.left);
+      const newDist = Math.abs(x - newRect.left);
+      return newDist <= lastDist ? newPos : lastPos;
+    }).or(acc)), Optional.none());
+    const findClosestHorizontalPosition = (positions, pos) => head(pos.getClientRects()).bind(targetRect => findClosestHorizontalPositionFromPoint(positions, targetRect.left));
+    const getPositionsUntilPreviousLine = curry(getPositionsUntil, CaretPosition.isAbove, -1);
+    const getPositionsUntilNextLine = curry(getPositionsUntil, CaretPosition.isBelow, 1);
+    const getPositionsAbove = curry(getAdjacentLinePositions, -1, getPositionsUntilPreviousLine);
+    const getPositionsBelow = curry(getAdjacentLinePositions, 1, getPositionsUntilNextLine);
+    const isAtFirstLine = (scope, pos) => getPositionsUntilPreviousLine(scope, pos).breakAt.isNone();
+    const isAtLastLine = (scope, pos) => getPositionsUntilNextLine(scope, pos).breakAt.isNone();
+    const getFirstLinePositions = scope => firstPositionIn(scope).map(pos => [pos].concat(getPositionsUntilNextLine(scope, pos).positions)).getOr([]);
+    const getLastLinePositions = scope => lastPositionIn(scope).map(pos => getPositionsUntilPreviousLine(scope, pos).positions.concat(pos)).getOr([]);
+
+    const isContentEditableFalse$3 = isContentEditableFalse$a;
+    const distanceToRectLeft$1 = (clientRect, clientX) => Math.abs(clientRect.left - clientX);
+    const distanceToRectRight$1 = (clientRect, clientX) => Math.abs(clientRect.right - clientX);
+    const isNodeClientRect = rect => hasNonNullableKey(rect, 'node');
+    const findClosestClientRect = (clientRects, clientX) => reduce(clientRects, (oldClientRect, clientRect) => {
+      const oldDistance = Math.min(distanceToRectLeft$1(oldClientRect, clientX), distanceToRectRight$1(oldClientRect, clientX));
+      const newDistance = Math.min(distanceToRectLeft$1(clientRect, clientX), distanceToRectRight$1(clientRect, clientX));
+      if (newDistance === oldDistance && isNodeClientRect(clientRect) && isContentEditableFalse$3(clientRect.node)) {
+        return clientRect;
+      }
+      if (newDistance < oldDistance) {
+        return clientRect;
+      }
+      return oldClientRect;
+    });
+
+    const getNodeClientRects = node => {
+      const toArrayWithNode = clientRects => {
+        return map$3(clientRects, rect => {
+          const clientRect = clone$1(rect);
+          clientRect.node = node;
+          return clientRect;
+        });
+      };
+      if (isElement$6(node)) {
+        return toArrayWithNode(node.getClientRects());
+      } else if (isText$8(node)) {
+        const rng = node.ownerDocument.createRange();
+        rng.setStart(node, 0);
+        rng.setEnd(node, node.data.length);
+        return toArrayWithNode(rng.getClientRects());
+      } else {
+        return [];
+      }
+    };
+    const getClientRects = nodes => bind$3(nodes, getNodeClientRects);
+
+    var VDirection;
+    (function (VDirection) {
+      VDirection[VDirection['Up'] = -1] = 'Up';
+      VDirection[VDirection['Down'] = 1] = 'Down';
+    }(VDirection || (VDirection = {})));
+    const findUntil = (direction, root, predicateFn, node) => {
+      while (node = findNode(node, direction, isEditableCaretCandidate$1, root)) {
+        if (predicateFn(node)) {
+          return;
+        }
+      }
+    };
+    const walkUntil = (direction, isAboveFn, isBeflowFn, root, predicateFn, caretPosition) => {
+      let line = 0;
+      const result = [];
+      const add = node => {
+        let clientRects = getClientRects([node]);
+        if (direction === -1) {
+          clientRects = clientRects.reverse();
+        }
+        for (let i = 0; i < clientRects.length; i++) {
+          const clientRect = clientRects[i];
+          if (isBeflowFn(clientRect, targetClientRect)) {
+            continue;
+          }
+          if (result.length > 0 && isAboveFn(clientRect, last$2(result))) {
+            line++;
+          }
+          clientRect.line = line;
+          if (predicateFn(clientRect)) {
+            return true;
+          }
+          result.push(clientRect);
+        }
+      };
+      const targetClientRect = last$2(caretPosition.getClientRects());
+      if (!targetClientRect) {
+        return result;
+      }
+      const node = caretPosition.getNode();
+      add(node);
+      findUntil(direction, root, add, node);
+      return result;
+    };
+    const aboveLineNumber = (lineNumber, clientRect) => clientRect.line > lineNumber;
+    const isLineNumber = (lineNumber, clientRect) => clientRect.line === lineNumber;
+    const upUntil = curry(walkUntil, VDirection.Up, isAbove$1, isBelow$1);
+    const downUntil = curry(walkUntil, VDirection.Down, isBelow$1, isAbove$1);
+    const positionsUntil = (direction, root, predicateFn, node) => {
+      const caretWalker = CaretWalker(root);
+      let walkFn;
+      let isBelowFn;
+      let isAboveFn;
+      let caretPosition;
+      const result = [];
+      let line = 0;
+      const getClientRect = caretPosition => {
+        if (direction === 1) {
+          return last$2(caretPosition.getClientRects());
+        }
+        return last$2(caretPosition.getClientRects());
+      };
+      if (direction === 1) {
+        walkFn = caretWalker.next;
+        isBelowFn = isBelow$1;
+        isAboveFn = isAbove$1;
+        caretPosition = CaretPosition.after(node);
+      } else {
+        walkFn = caretWalker.prev;
+        isBelowFn = isAbove$1;
+        isAboveFn = isBelow$1;
+        caretPosition = CaretPosition.before(node);
+      }
+      const targetClientRect = getClientRect(caretPosition);
+      do {
+        if (!caretPosition.isVisible()) {
+          continue;
+        }
+        const rect = getClientRect(caretPosition);
+        if (isAboveFn(rect, targetClientRect)) {
+          continue;
+        }
+        if (result.length > 0 && isBelowFn(rect, last$2(result))) {
+          line++;
+        }
+        const clientRect = clone$1(rect);
+        clientRect.position = caretPosition;
+        clientRect.line = line;
+        if (predicateFn(clientRect)) {
+          return result;
+        }
+        result.push(clientRect);
+      } while (caretPosition = walkFn(caretPosition));
+      return result;
+    };
+    const isAboveLine = lineNumber => clientRect => aboveLineNumber(lineNumber, clientRect);
+    const isLine = lineNumber => clientRect => isLineNumber(lineNumber, clientRect);
+
+    const moveToRange = (editor, rng) => {
+      editor.selection.setRng(rng);
+      scrollRangeIntoView(editor, editor.selection.getRng());
+    };
+    const renderRangeCaretOpt = (editor, range, scrollIntoView) => Optional.some(renderRangeCaret(editor, range, scrollIntoView));
+    const moveHorizontally = (editor, direction, range, isBefore, isAfter, isElement) => {
+      const forwards = direction === HDirection.Forwards;
+      const caretWalker = CaretWalker(editor.getBody());
+      const getNextPosFn = curry(getVisualCaretPosition, forwards ? caretWalker.next : caretWalker.prev);
+      const isBeforeFn = forwards ? isBefore : isAfter;
+      if (!range.collapsed) {
+        const node = getSelectedNode(range);
+        if (isElement(node)) {
+          return showCaret(direction, editor, node, direction === HDirection.Backwards, false);
+        }
+      }
+      const caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);
+      if (isBeforeFn(caretPosition)) {
+        return selectNode(editor, caretPosition.getNode(!forwards));
+      }
+      const nextCaretPosition = normalizePosition(forwards, getNextPosFn(caretPosition));
+      const rangeIsInContainerBlock = isRangeInCaretContainerBlock(range);
+      if (!nextCaretPosition) {
+        return rangeIsInContainerBlock ? Optional.some(range) : Optional.none();
+      }
+      if (isBeforeFn(nextCaretPosition)) {
+        return showCaret(direction, editor, nextCaretPosition.getNode(!forwards), forwards, false);
+      }
+      const peekCaretPosition = getNextPosFn(nextCaretPosition);
+      if (peekCaretPosition && isBeforeFn(peekCaretPosition)) {
+        if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {
+          return showCaret(direction, editor, peekCaretPosition.getNode(!forwards), forwards, false);
+        }
+      }
+      if (rangeIsInContainerBlock) {
+        return renderRangeCaretOpt(editor, nextCaretPosition.toRange(), false);
+      }
+      return Optional.none();
+    };
+    const moveVertically = (editor, direction, range, isBefore, isAfter, isElement) => {
+      const caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);
+      const caretClientRect = last$2(caretPosition.getClientRects());
+      const forwards = direction === VDirection.Down;
+      if (!caretClientRect) {
+        return Optional.none();
+      }
+      const walkerFn = forwards ? downUntil : upUntil;
+      const linePositions = walkerFn(editor.getBody(), isAboveLine(1), caretPosition);
+      const nextLinePositions = filter$6(linePositions, isLine(1));
+      const clientX = caretClientRect.left;
+      const nextLineRect = findClosestClientRect(nextLinePositions, clientX);
+      if (nextLineRect && isElement(nextLineRect.node)) {
+        const dist1 = Math.abs(clientX - nextLineRect.left);
+        const dist2 = Math.abs(clientX - nextLineRect.right);
+        return showCaret(direction, editor, nextLineRect.node, dist1 < dist2, false);
+      }
+      let currentNode;
+      if (isBefore(caretPosition)) {
+        currentNode = caretPosition.getNode();
+      } else if (isAfter(caretPosition)) {
+        currentNode = caretPosition.getNode(true);
+      } else {
+        currentNode = getSelectedNode(range);
+      }
+      if (currentNode) {
+        const caretPositions = positionsUntil(direction, editor.getBody(), isAboveLine(1), currentNode);
+        let closestNextLineRect = findClosestClientRect(filter$6(caretPositions, isLine(1)), clientX);
+        if (closestNextLineRect) {
+          return renderRangeCaretOpt(editor, closestNextLineRect.position.toRange(), false);
+        }
+        closestNextLineRect = last$2(filter$6(caretPositions, isLine(0)));
+        if (closestNextLineRect) {
+          return renderRangeCaretOpt(editor, closestNextLineRect.position.toRange(), false);
+        }
+      }
+      if (nextLinePositions.length === 0) {
+        return getLineEndPoint(editor, forwards).filter(forwards ? isAfter : isBefore).map(pos => renderRangeCaret(editor, pos.toRange(), false));
+      }
+      return Optional.none();
+    };
+    const getLineEndPoint = (editor, forward) => {
+      const rng = editor.selection.getRng();
+      const from = forward ? CaretPosition.fromRangeEnd(rng) : CaretPosition.fromRangeStart(rng);
+      const host = getEditingHost(from.container(), editor.getBody());
+      if (forward) {
+        const lineInfo = getPositionsUntilNextLine(host, from);
+        return last$3(lineInfo.positions);
+      } else {
+        const lineInfo = getPositionsUntilPreviousLine(host, from);
+        return head(lineInfo.positions);
+      }
+    };
+    const moveToLineEndPoint$3 = (editor, forward, isElementPosition) => getLineEndPoint(editor, forward).filter(isElementPosition).exists(pos => {
+      editor.selection.setRng(pos.toRange());
+      return true;
+    });
+
+    const setCaretPosition = (editor, pos) => {
+      const rng = editor.dom.createRng();
+      rng.setStart(pos.container(), pos.offset());
+      rng.setEnd(pos.container(), pos.offset());
+      editor.selection.setRng(rng);
+    };
+    const setSelected = (state, elm) => {
+      if (state) {
+        elm.setAttribute('data-mce-selected', 'inline-boundary');
+      } else {
+        elm.removeAttribute('data-mce-selected');
+      }
+    };
+    const renderCaretLocation = (editor, caret, location) => renderCaret(caret, location).map(pos => {
+      setCaretPosition(editor, pos);
+      return location;
+    });
+    const findLocation = (editor, caret, forward) => {
+      const rootNode = editor.getBody();
+      const from = CaretPosition.fromRangeStart(editor.selection.getRng());
+      const isInlineTarget$1 = curry(isInlineTarget, editor);
+      const location = findLocation$1(forward, isInlineTarget$1, rootNode, from);
+      return location.bind(location => renderCaretLocation(editor, caret, location));
+    };
+    const toggleInlines = (isInlineTarget, dom, elms) => {
+      const inlineBoundaries = map$3(descendants(SugarElement.fromDom(dom.getRoot()), '*[data-mce-selected="inline-boundary"]'), e => e.dom);
+      const selectedInlines = filter$6(inlineBoundaries, isInlineTarget);
+      const targetInlines = filter$6(elms, isInlineTarget);
+      each$g(difference(selectedInlines, targetInlines), curry(setSelected, false));
+      each$g(difference(targetInlines, selectedInlines), curry(setSelected, true));
+    };
+    const safeRemoveCaretContainer = (editor, caret) => {
+      if (editor.selection.isCollapsed() && editor.composing !== true && caret.get()) {
+        const pos = CaretPosition.fromRangeStart(editor.selection.getRng());
+        if (CaretPosition.isTextPosition(pos) && isAtZwsp(pos) === false) {
+          setCaretPosition(editor, removeAndReposition(caret.get(), pos));
+          caret.set(null);
+        }
+      }
+    };
+    const renderInsideInlineCaret = (isInlineTarget, editor, caret, elms) => {
+      if (editor.selection.isCollapsed()) {
+        const inlines = filter$6(elms, isInlineTarget);
+        each$g(inlines, _inline => {
+          const pos = CaretPosition.fromRangeStart(editor.selection.getRng());
+          readLocation(isInlineTarget, editor.getBody(), pos).bind(location => renderCaretLocation(editor, caret, location));
+        });
+      }
+    };
+    const move$2 = (editor, caret, forward) => isInlineBoundariesEnabled(editor) ? findLocation(editor, caret, forward).isSome() : false;
+    const moveWord = (forward, editor, _caret) => isInlineBoundariesEnabled(editor) ? moveByWord(forward, editor) : false;
+    const setupSelectedState = editor => {
+      const caret = Cell(null);
+      const isInlineTarget$1 = curry(isInlineTarget, editor);
+      editor.on('NodeChange', e => {
+        if (isInlineBoundariesEnabled(editor)) {
+          toggleInlines(isInlineTarget$1, editor.dom, e.parents);
+          safeRemoveCaretContainer(editor, caret);
+          renderInsideInlineCaret(isInlineTarget$1, editor, caret, e.parents);
+        }
+      });
+      return caret;
+    };
+    const moveNextWord = curry(moveWord, true);
+    const movePrevWord = curry(moveWord, false);
+    const moveToLineEndPoint$2 = (editor, forward, caret) => {
+      if (isInlineBoundariesEnabled(editor)) {
+        const linePoint = getLineEndPoint(editor, forward).getOrThunk(() => {
+          const rng = editor.selection.getRng();
+          return forward ? CaretPosition.fromRangeEnd(rng) : CaretPosition.fromRangeStart(rng);
+        });
+        return readLocation(curry(isInlineTarget, editor), editor.getBody(), linePoint).exists(loc => {
+          const outsideLoc = outside(loc);
+          return renderCaret(caret, outsideLoc).exists(pos => {
+            setCaretPosition(editor, pos);
+            return true;
+          });
+        });
+      } else {
+        return false;
+      }
+    };
+
+    const rangeFromPositions = (from, to) => {
+      const range = document.createRange();
+      range.setStart(from.container(), from.offset());
+      range.setEnd(to.container(), to.offset());
+      return range;
+    };
+    const hasOnlyTwoOrLessPositionsLeft = elm => lift2(firstPositionIn(elm), lastPositionIn(elm), (firstPos, lastPos) => {
+      const normalizedFirstPos = normalizePosition(true, firstPos);
+      const normalizedLastPos = normalizePosition(false, lastPos);
+      return nextPosition(elm, normalizedFirstPos).forall(pos => pos.isEqual(normalizedLastPos));
+    }).getOr(true);
+    const setCaretLocation = (editor, caret) => location => renderCaret(caret, location).map(pos => () => setCaretPosition(editor, pos));
+    const deleteFromTo = (editor, caret, from, to) => {
+      const rootNode = editor.getBody();
+      const isInlineTarget$1 = curry(isInlineTarget, editor);
+      editor.undoManager.ignore(() => {
+        editor.selection.setRng(rangeFromPositions(from, to));
+        execDeleteCommand(editor);
+        readLocation(isInlineTarget$1, rootNode, CaretPosition.fromRangeStart(editor.selection.getRng())).map(inside).bind(setCaretLocation(editor, caret)).each(call);
+      });
+      editor.nodeChanged();
+    };
+    const rescope = (rootNode, node) => {
+      const parentBlock = getParentBlock$3(node, rootNode);
+      return parentBlock ? parentBlock : rootNode;
+    };
+    const backspaceDeleteCollapsed = (editor, caret, forward, from) => {
+      const rootNode = rescope(editor.getBody(), from.container());
+      const isInlineTarget$1 = curry(isInlineTarget, editor);
+      const fromLocation = readLocation(isInlineTarget$1, rootNode, from);
+      const location = fromLocation.bind(location => {
+        if (forward) {
+          return location.fold(constant(Optional.some(inside(location))), Optional.none, constant(Optional.some(outside(location))), Optional.none);
+        } else {
+          return location.fold(Optional.none, constant(Optional.some(outside(location))), Optional.none, constant(Optional.some(inside(location))));
+        }
+      });
+      return location.map(setCaretLocation(editor, caret)).getOrThunk(() => {
+        const toPosition = navigate(forward, rootNode, from);
+        const toLocation = toPosition.bind(pos => readLocation(isInlineTarget$1, rootNode, pos));
+        return lift2(fromLocation, toLocation, () => findRootInline(isInlineTarget$1, rootNode, from).bind(elm => {
+          if (hasOnlyTwoOrLessPositionsLeft(elm)) {
+            return Optional.some(() => {
+              deleteElement$2(editor, forward, SugarElement.fromDom(elm));
+            });
+          } else {
+            return Optional.none();
+          }
+        })).getOrThunk(() => toLocation.bind(() => toPosition.map(to => {
+          return () => {
+            if (forward) {
+              deleteFromTo(editor, caret, from, to);
+            } else {
+              deleteFromTo(editor, caret, to, from);
+            }
+          };
+        })));
+      });
+    };
+    const backspaceDelete$3 = (editor, caret, forward) => {
+      if (editor.selection.isCollapsed() && isInlineBoundariesEnabled(editor)) {
+        const from = CaretPosition.fromRangeStart(editor.selection.getRng());
+        return backspaceDeleteCollapsed(editor, caret, forward, from);
+      }
+      return Optional.none();
+    };
+
+    const getParentInlines = (rootElm, startElm) => {
+      const parents = parentsAndSelf(startElm, rootElm);
+      return findIndex$2(parents, isBlock$2).fold(constant(parents), index => parents.slice(0, index));
+    };
+    const hasOnlyOneChild = elm => childNodesCount(elm) === 1;
+    const deleteLastPosition = (forward, editor, target, parentInlines) => {
+      const isFormatElement$1 = curry(isFormatElement, editor);
+      const formatNodes = map$3(filter$6(parentInlines, isFormatElement$1), elm => elm.dom);
+      if (formatNodes.length === 0) {
+        deleteElement$2(editor, forward, target);
+      } else {
+        const pos = replaceWithCaretFormat(target.dom, formatNodes);
+        editor.selection.setRng(pos.toRange());
+      }
+    };
+    const deleteCaret$1 = (editor, forward) => {
+      const rootElm = SugarElement.fromDom(editor.getBody());
+      const startElm = SugarElement.fromDom(editor.selection.getStart());
+      const parentInlines = filter$6(getParentInlines(rootElm, startElm), hasOnlyOneChild);
+      return last$3(parentInlines).bind(target => {
+        const fromPos = CaretPosition.fromRangeStart(editor.selection.getRng());
+        if (willDeleteLastPositionInElement(forward, fromPos, target.dom) && !isEmptyCaretFormatElement(target)) {
+          return Optional.some(() => deleteLastPosition(forward, editor, target, parentInlines));
+        } else {
+          return Optional.none();
+        }
+      });
+    };
+    const backspaceDelete$2 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret$1(editor, forward) : Optional.none();
+
+    const deleteElement = (editor, forward, element) => {
+      return Optional.some(() => {
+        editor._selectionOverrides.hideFakeCaret();
+        deleteElement$2(editor, forward, SugarElement.fromDom(element));
+      });
+    };
+    const deleteCaret = (editor, forward) => {
+      const isNearMedia = forward ? isBeforeMedia : isAfterMedia;
+      const direction = forward ? HDirection.Forwards : HDirection.Backwards;
+      const fromPos = getNormalizedRangeEndPoint(direction, editor.getBody(), editor.selection.getRng());
+      if (isNearMedia(fromPos)) {
+        return deleteElement(editor, forward, fromPos.getNode(!forward));
+      } else {
+        return Optional.from(normalizePosition(forward, fromPos)).filter(pos => isNearMedia(pos) && isMoveInsideSameBlock(fromPos, pos)).map(pos => () => deleteElement(editor, forward, pos.getNode(!forward)));
+      }
+    };
+    const deleteRange = (editor, forward) => {
+      const selectedNode = editor.selection.getNode();
+      return isMedia$2(selectedNode) ? deleteElement(editor, forward, selectedNode) : Optional.none();
+    };
+    const backspaceDelete$1 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret(editor, forward) : deleteRange(editor, forward);
+
+    const isEditable$1 = target => closest$4(target, elm => isContentEditableTrue$4(elm.dom) || isContentEditableFalse$a(elm.dom)).exists(elm => isContentEditableTrue$4(elm.dom));
+    const parseIndentValue = value => {
+      const number = parseInt(value, 10);
+      return isNaN(number) ? 0 : number;
+    };
+    const getIndentStyleName = (useMargin, element) => {
+      const indentStyleName = useMargin || isTable$2(element) ? 'margin' : 'padding';
+      const suffix = get$7(element, 'direction') === 'rtl' ? '-right' : '-left';
+      return indentStyleName + suffix;
+    };
+    const indentElement = (dom, command, useMargin, value, unit, element) => {
+      const indentStyleName = getIndentStyleName(useMargin, SugarElement.fromDom(element));
+      if (command === 'outdent') {
+        const styleValue = Math.max(0, parseIndentValue(element.style[indentStyleName]) - value);
+        dom.setStyle(element, indentStyleName, styleValue ? styleValue + unit : '');
+      } else {
+        const styleValue = parseIndentValue(element.style[indentStyleName]) + value + unit;
+        dom.setStyle(element, indentStyleName, styleValue);
+      }
+    };
+    const validateBlocks = (editor, blocks) => forall(blocks, block => {
+      const indentStyleName = getIndentStyleName(shouldIndentUseMargin(editor), block);
+      const intentValue = getRaw$1(block, indentStyleName).map(parseIndentValue).getOr(0);
+      const contentEditable = editor.dom.getContentEditable(block.dom);
+      return contentEditable !== 'false' && intentValue > 0;
+    });
+    const canOutdent = editor => {
+      const blocks = getBlocksToIndent(editor);
+      return !editor.mode.isReadOnly() && (blocks.length > 1 || validateBlocks(editor, blocks));
+    };
+    const isListComponent = el => isList(el) || isListItem(el);
+    const parentIsListComponent = el => parent(el).exists(isListComponent);
+    const getBlocksToIndent = editor => filter$6(fromDom$1(editor.selection.getSelectedBlocks()), el => !isListComponent(el) && !parentIsListComponent(el) && isEditable$1(el));
+    const handle = (editor, command) => {
+      const {dom} = editor;
+      const indentation = getIndentation(editor);
+      const indentUnit = /[a-z%]+$/i.exec(indentation)[0];
+      const indentValue = parseInt(indentation, 10);
+      const useMargin = shouldIndentUseMargin(editor);
+      each$g(getBlocksToIndent(editor), block => {
+        indentElement(dom, command, useMargin, indentValue, indentUnit, block.dom);
+      });
+    };
+    const indent = editor => handle(editor, 'indent');
+    const outdent = editor => handle(editor, 'outdent');
+
+    const backspaceDelete = editor => {
+      if (editor.selection.isCollapsed() && canOutdent(editor)) {
+        const dom = editor.dom;
+        const rng = editor.selection.getRng();
+        const pos = CaretPosition.fromRangeStart(rng);
+        const block = dom.getParent(rng.startContainer, dom.isBlock);
+        if (block !== null && isAtStartOfBlock(SugarElement.fromDom(block), pos)) {
+          return Optional.some(() => outdent(editor));
+        }
+      }
+      return Optional.none();
+    };
+
+    const findAction = (editor, caret, forward) => findMap([
+      backspaceDelete,
+      backspaceDelete$5,
+      backspaceDelete$6,
+      (editor, forward) => backspaceDelete$3(editor, caret, forward),
+      backspaceDelete$8,
+      backspaceDelete$9,
+      backspaceDelete$4,
+      backspaceDelete$1,
+      backspaceDelete$7,
+      backspaceDelete$2
+    ], item => item(editor, forward));
+    const deleteCommand = (editor, caret) => {
+      const result = findAction(editor, caret, false);
+      result.fold(() => {
+        execDeleteCommand(editor);
+        paddEmptyBody(editor);
+      }, call);
+    };
+    const forwardDeleteCommand = (editor, caret) => {
+      const result = findAction(editor, caret, true);
+      result.fold(() => execForwardDeleteCommand(editor), call);
+    };
+    const setup$p = (editor, caret) => {
+      editor.addCommand('delete', () => {
+        deleteCommand(editor, caret);
+      });
+      editor.addCommand('forwardDelete', () => {
+        forwardDeleteCommand(editor, caret);
+      });
+    };
+
+    const SIGNIFICANT_MOVE = 5;
+    const LONGPRESS_DELAY = 400;
+    const getTouch = event => {
+      if (event.touches === undefined || event.touches.length !== 1) {
+        return Optional.none();
+      }
+      return Optional.some(event.touches[0]);
+    };
+    const isFarEnough = (touch, data) => {
+      const distX = Math.abs(touch.clientX - data.x);
+      const distY = Math.abs(touch.clientY - data.y);
+      return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE;
+    };
+    const setup$o = editor => {
+      const startData = value$2();
+      const longpressFired = Cell(false);
+      const debounceLongpress = last$1(e => {
+        editor.dispatch('longpress', {
+          ...e,
+          type: 'longpress'
+        });
+        longpressFired.set(true);
+      }, LONGPRESS_DELAY);
+      editor.on('touchstart', e => {
+        getTouch(e).each(touch => {
+          debounceLongpress.cancel();
+          const data = {
+            x: touch.clientX,
+            y: touch.clientY,
+            target: e.target
+          };
+          debounceLongpress.throttle(e);
+          longpressFired.set(false);
+          startData.set(data);
+        });
+      }, true);
+      editor.on('touchmove', e => {
+        debounceLongpress.cancel();
+        getTouch(e).each(touch => {
+          startData.on(data => {
+            if (isFarEnough(touch, data)) {
+              startData.clear();
+              longpressFired.set(false);
+              editor.dispatch('longpresscancel');
+            }
+          });
+        });
+      }, true);
+      editor.on('touchend touchcancel', e => {
+        debounceLongpress.cancel();
+        if (e.type === 'touchcancel') {
+          return;
+        }
+        startData.get().filter(data => data.target.isEqualNode(e.target)).each(() => {
+          if (longpressFired.get()) {
+            e.preventDefault();
+          } else {
+            editor.dispatch('tap', {
+              ...e,
+              type: 'tap'
+            });
+          }
+        });
+      }, true);
+    };
+
+    const isBlockElement = (blockElements, node) => has$2(blockElements, node.nodeName);
+    const isValidTarget = (blockElements, node) => {
+      if (isText$8(node)) {
+        return true;
+      } else if (isElement$6(node)) {
+        return !isBlockElement(blockElements, node) && !isBookmarkNode$1(node);
+      } else {
+        return false;
+      }
+    };
+    const hasBlockParent = (blockElements, root, node) => {
+      return exists(parents(SugarElement.fromDom(node), SugarElement.fromDom(root)), elm => {
+        return isBlockElement(blockElements, elm.dom);
+      });
+    };
+    const shouldRemoveTextNode = (blockElements, node) => {
+      if (isText$8(node)) {
+        if (node.nodeValue.length === 0) {
+          return true;
+        } else if (/^\s+$/.test(node.nodeValue) && (!node.nextSibling || isBlockElement(blockElements, node.nextSibling))) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const addRootBlocks = editor => {
+      const dom = editor.dom, selection = editor.selection;
+      const schema = editor.schema, blockElements = schema.getBlockElements();
+      let node = selection.getStart();
+      const rootNode = editor.getBody();
+      let rootBlockNode, tempNode, wrapped;
+      const forcedRootBlock = getForcedRootBlock(editor);
+      if (!node || !isElement$6(node)) {
+        return;
+      }
+      const rootNodeName = rootNode.nodeName.toLowerCase();
+      if (!schema.isValidChild(rootNodeName, forcedRootBlock.toLowerCase()) || hasBlockParent(blockElements, rootNode, node)) {
+        return;
+      }
+      const rng = selection.getRng();
+      const startContainer = rng.startContainer;
+      const startOffset = rng.startOffset;
+      const endContainer = rng.endContainer;
+      const endOffset = rng.endOffset;
+      const restoreSelection = hasFocus(editor);
+      node = rootNode.firstChild;
+      while (node) {
+        if (isValidTarget(blockElements, node)) {
+          if (shouldRemoveTextNode(blockElements, node)) {
+            tempNode = node;
+            node = node.nextSibling;
+            dom.remove(tempNode);
+            continue;
+          }
+          if (!rootBlockNode) {
+            rootBlockNode = dom.create(forcedRootBlock, getForcedRootBlockAttrs(editor));
+            node.parentNode.insertBefore(rootBlockNode, node);
+            wrapped = true;
+          }
+          tempNode = node;
+          node = node.nextSibling;
+          rootBlockNode.appendChild(tempNode);
+        } else {
+          rootBlockNode = null;
+          node = node.nextSibling;
+        }
+      }
+      if (wrapped && restoreSelection) {
+        rng.setStart(startContainer, startOffset);
+        rng.setEnd(endContainer, endOffset);
+        selection.setRng(rng);
+        editor.nodeChanged();
+      }
+    };
+    const setup$n = editor => {
+      editor.on('NodeChange', curry(addRootBlocks, editor));
+    };
+
+    const hasClass = checkClassName => node => (' ' + node.attr('class') + ' ').indexOf(checkClassName) !== -1;
+    const replaceMatchWithSpan = (editor, content, cls) => {
+      return function (match) {
+        const args = arguments, index = args[args.length - 2];
+        const prevChar = index > 0 ? content.charAt(index - 1) : '';
+        if (prevChar === '"') {
+          return match;
+        }
+        if (prevChar === '>') {
+          const findStartTagIndex = content.lastIndexOf('<', index);
+          if (findStartTagIndex !== -1) {
+            const tagHtml = content.substring(findStartTagIndex, index);
+            if (tagHtml.indexOf('contenteditable="false"') !== -1) {
+              return match;
+            }
+          }
+        }
+        return '<span class="' + cls + '" data-mce-content="' + editor.dom.encode(args[0]) + '">' + editor.dom.encode(typeof args[1] === 'string' ? args[1] : args[0]) + '</span>';
+      };
+    };
+    const convertRegExpsToNonEditable = (editor, nonEditableRegExps, e) => {
+      let i = nonEditableRegExps.length, content = e.content;
+      if (e.format === 'raw') {
+        return;
+      }
+      while (i--) {
+        content = content.replace(nonEditableRegExps[i], replaceMatchWithSpan(editor, content, getNonEditableClass(editor)));
+      }
+      e.content = content;
+    };
+    const setup$m = editor => {
+      const contentEditableAttrName = 'contenteditable';
+      const editClass = ' ' + Tools.trim(getEditableClass(editor)) + ' ';
+      const nonEditClass = ' ' + Tools.trim(getNonEditableClass(editor)) + ' ';
+      const hasEditClass = hasClass(editClass);
+      const hasNonEditClass = hasClass(nonEditClass);
+      const nonEditableRegExps = getNonEditableRegExps(editor);
+      if (nonEditableRegExps.length > 0) {
+        editor.on('BeforeSetContent', e => {
+          convertRegExpsToNonEditable(editor, nonEditableRegExps, e);
+        });
+      }
+      editor.parser.addAttributeFilter('class', nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          if (hasEditClass(node)) {
+            node.attr(contentEditableAttrName, 'true');
+          } else if (hasNonEditClass(node)) {
+            node.attr(contentEditableAttrName, 'false');
+          }
+        }
+      });
+      editor.serializer.addAttributeFilter(contentEditableAttrName, nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          if (!hasEditClass(node) && !hasNonEditClass(node)) {
+            continue;
+          }
+          if (nonEditableRegExps.length > 0 && node.attr('data-mce-content')) {
+            node.name = '#text';
+            node.type = 3;
+            node.raw = true;
+            node.value = node.attr('data-mce-content');
+          } else {
+            node.attr(contentEditableAttrName, null);
+          }
+        }
+      });
+    };
+
+    const findBlockCaretContainer = editor => descendant(SugarElement.fromDom(editor.getBody()), '*[data-mce-caret]').map(elm => elm.dom).getOrNull();
+    const showBlockCaretContainer = (editor, blockCaretContainer) => {
+      if (blockCaretContainer.hasAttribute('data-mce-caret')) {
+        showCaretContainerBlock(blockCaretContainer);
+        editor.selection.setRng(editor.selection.getRng());
+        editor.selection.scrollIntoView(blockCaretContainer);
+      }
+    };
+    const handleBlockContainer = (editor, e) => {
+      const blockCaretContainer = findBlockCaretContainer(editor);
+      if (!blockCaretContainer) {
+        return;
+      }
+      if (e.type === 'compositionstart') {
+        e.preventDefault();
+        e.stopPropagation();
+        showBlockCaretContainer(editor, blockCaretContainer);
+        return;
+      }
+      if (hasContent(blockCaretContainer)) {
+        showBlockCaretContainer(editor, blockCaretContainer);
+        editor.undoManager.add();
+      }
+    };
+    const setup$l = editor => {
+      editor.on('keyup compositionstart', curry(handleBlockContainer, editor));
+    };
+
+    const isContentEditableFalse$2 = isContentEditableFalse$a;
+    const moveToCeFalseHorizontally = (direction, editor, range) => moveHorizontally(editor, direction, range, isBeforeContentEditableFalse, isAfterContentEditableFalse, isContentEditableFalse$2);
+    const moveToCeFalseVertically = (direction, editor, range) => {
+      const isBefore = caretPosition => isBeforeContentEditableFalse(caretPosition) || isBeforeTable(caretPosition);
+      const isAfter = caretPosition => isAfterContentEditableFalse(caretPosition) || isAfterTable(caretPosition);
+      return moveVertically(editor, direction, range, isBefore, isAfter, isContentEditableFalse$2);
+    };
+    const createTextBlock = editor => {
+      const textBlock = editor.dom.create(getForcedRootBlock(editor));
+      textBlock.innerHTML = '<br data-mce-bogus="1">';
+      return textBlock;
+    };
+    const exitPreBlock = (editor, direction, range) => {
+      const caretWalker = CaretWalker(editor.getBody());
+      const getVisualCaretPosition$1 = curry(getVisualCaretPosition, direction === 1 ? caretWalker.next : caretWalker.prev);
+      if (range.collapsed) {
+        const pre = editor.dom.getParent(range.startContainer, 'PRE');
+        if (!pre) {
+          return;
+        }
+        const caretPos = getVisualCaretPosition$1(CaretPosition.fromRangeStart(range));
+        if (!caretPos) {
+          const newBlock = SugarElement.fromDom(createTextBlock(editor));
+          if (direction === 1) {
+            after$4(SugarElement.fromDom(pre), newBlock);
+          } else {
+            before$3(SugarElement.fromDom(pre), newBlock);
+          }
+          editor.selection.select(newBlock.dom, true);
+          editor.selection.collapse();
+        }
+      }
+    };
+    const getHorizontalRange = (editor, forward) => {
+      const direction = forward ? HDirection.Forwards : HDirection.Backwards;
+      const range = editor.selection.getRng();
+      return moveToCeFalseHorizontally(direction, editor, range).orThunk(() => {
+        exitPreBlock(editor, direction, range);
+        return Optional.none();
+      });
+    };
+    const getVerticalRange = (editor, down) => {
+      const direction = down ? 1 : -1;
+      const range = editor.selection.getRng();
+      return moveToCeFalseVertically(direction, editor, range).orThunk(() => {
+        exitPreBlock(editor, direction, range);
+        return Optional.none();
+      });
+    };
+    const moveH$2 = (editor, forward) => getHorizontalRange(editor, forward).exists(newRange => {
+      moveToRange(editor, newRange);
+      return true;
+    });
+    const moveV$3 = (editor, down) => getVerticalRange(editor, down).exists(newRange => {
+      moveToRange(editor, newRange);
+      return true;
+    });
+    const moveToLineEndPoint$1 = (editor, forward) => {
+      const isCefPosition = forward ? isAfterContentEditableFalse : isBeforeContentEditableFalse;
+      return moveToLineEndPoint$3(editor, forward, isCefPosition);
+    };
+
+    const isTarget = node => contains$2(['figcaption'], name(node));
+    const rangeBefore = target => {
+      const rng = document.createRange();
+      rng.setStartBefore(target.dom);
+      rng.setEndBefore(target.dom);
+      return rng;
+    };
+    const insertElement = (root, elm, forward) => {
+      if (forward) {
+        append$1(root, elm);
+      } else {
+        prepend(root, elm);
+      }
+    };
+    const insertEmptyLine = (root, forward, blockName, attrs) => {
+      const block = SugarElement.fromTag(blockName);
+      const br = SugarElement.fromTag('br');
+      setAll$1(block, attrs);
+      append$1(block, br);
+      insertElement(root, block, forward);
+      return rangeBefore(br);
+    };
+    const getClosestTargetBlock = (pos, root) => {
+      const isRoot = curry(eq, root);
+      return closest$4(SugarElement.fromDom(pos.container()), isBlock$2, isRoot).filter(isTarget);
+    };
+    const isAtFirstOrLastLine = (root, forward, pos) => forward ? isAtLastLine(root.dom, pos) : isAtFirstLine(root.dom, pos);
+    const moveCaretToNewEmptyLine = (editor, forward) => {
+      const root = SugarElement.fromDom(editor.getBody());
+      const pos = CaretPosition.fromRangeStart(editor.selection.getRng());
+      const rootBlock = getForcedRootBlock(editor);
+      const rootBlockAttrs = getForcedRootBlockAttrs(editor);
+      return getClosestTargetBlock(pos, root).exists(() => {
+        if (isAtFirstOrLastLine(root, forward, pos)) {
+          const rng = insertEmptyLine(root, forward, rootBlock, rootBlockAttrs);
+          editor.selection.setRng(rng);
+          return true;
+        } else {
+          return false;
+        }
+      });
+    };
+    const moveV$2 = (editor, forward) => {
+      if (editor.selection.isCollapsed()) {
+        return moveCaretToNewEmptyLine(editor, forward);
+      } else {
+        return false;
+      }
+    };
+
+    const baseKeyPattern = {
+      shiftKey: false,
+      altKey: false,
+      ctrlKey: false,
+      metaKey: false,
+      keyCode: 0
+    };
+    const defaultPatterns = patterns => map$3(patterns, pattern => ({
+      ...baseKeyPattern,
+      action: noop,
+      ...pattern
+    }));
+    const defaultDelayedPatterns = patterns => map$3(patterns, pattern => ({
+      ...baseKeyPattern,
+      action: () => Optional.none(),
+      ...pattern
+    }));
+    const matchesEvent = (pattern, evt) => evt.keyCode === pattern.keyCode && evt.shiftKey === pattern.shiftKey && evt.altKey === pattern.altKey && evt.ctrlKey === pattern.ctrlKey && evt.metaKey === pattern.metaKey;
+    const match$1 = (patterns, evt) => bind$3(defaultPatterns(patterns), pattern => matchesEvent(pattern, evt) ? [pattern] : []);
+    const matchDelayed = (patterns, evt) => bind$3(defaultDelayedPatterns(patterns), pattern => matchesEvent(pattern, evt) ? [pattern] : []);
+    const action = (f, ...x) => () => f.apply(null, x);
+    const execute = (patterns, evt) => find$2(match$1(patterns, evt), pattern => pattern.action());
+    const executeWithDelayedAction = (patterns, evt) => findMap(matchDelayed(patterns, evt), pattern => pattern.action());
+
+    const moveH$1 = (editor, forward) => {
+      const direction = forward ? HDirection.Forwards : HDirection.Backwards;
+      const range = editor.selection.getRng();
+      return moveHorizontally(editor, direction, range, isBeforeMedia, isAfterMedia, isMedia$2).exists(newRange => {
+        moveToRange(editor, newRange);
+        return true;
+      });
+    };
+    const moveV$1 = (editor, down) => {
+      const direction = down ? 1 : -1;
+      const range = editor.selection.getRng();
+      return moveVertically(editor, direction, range, isBeforeMedia, isAfterMedia, isMedia$2).exists(newRange => {
+        moveToRange(editor, newRange);
+        return true;
+      });
+    };
+    const moveToLineEndPoint = (editor, forward) => {
+      const isNearMedia = forward ? isAfterMedia : isBeforeMedia;
+      return moveToLineEndPoint$3(editor, forward, isNearMedia);
+    };
+
+    const adt = Adt.generate([
+      { none: ['current'] },
+      { first: ['current'] },
+      {
+        middle: [
+          'current',
+          'target'
+        ]
+      },
+      { last: ['current'] }
+    ]);
+    const none = current => adt.none(current);
+    const CellLocation = {
+      ...adt,
+      none
+    };
+
+    const firstLayer = (scope, selector) => {
+      return filterFirstLayer(scope, selector, always);
+    };
+    const filterFirstLayer = (scope, selector, predicate) => {
+      return bind$3(children(scope), x => {
+        if (is$1(x, selector)) {
+          return predicate(x) ? [x] : [];
+        } else {
+          return filterFirstLayer(x, selector, predicate);
+        }
+      });
+    };
+
+    const lookup$1 = (tags, element, isRoot = never) => {
+      if (isRoot(element)) {
+        return Optional.none();
+      }
+      if (contains$2(tags, name(element))) {
+        return Optional.some(element);
+      }
+      const isRootOrUpperTable = elm => is$1(elm, 'table') || isRoot(elm);
+      return ancestor$2(element, tags.join(','), isRootOrUpperTable);
+    };
+    const cell = (element, isRoot) => lookup$1([
+      'td',
+      'th'
+    ], element, isRoot);
+    const cells = ancestor => firstLayer(ancestor, 'th,td');
+    const table = (element, isRoot) => closest$3(element, 'table', isRoot);
+
+    const walk = (all, current, index, direction, isEligible = always) => {
+      const forwards = direction === 1;
+      if (!forwards && index <= 0) {
+        return CellLocation.first(all[0]);
+      } else if (forwards && index >= all.length - 1) {
+        return CellLocation.last(all[all.length - 1]);
+      } else {
+        const newIndex = index + direction;
+        const elem = all[newIndex];
+        return isEligible(elem) ? CellLocation.middle(current, elem) : walk(all, current, newIndex, direction, isEligible);
+      }
+    };
+    const detect = (current, isRoot) => {
+      return table(current, isRoot).bind(table => {
+        const all = cells(table);
+        const index = findIndex$2(all, x => eq(current, x));
+        return index.map(index => ({
+          index,
+          all
+        }));
+      });
+    };
+    const next = (current, isEligible, isRoot) => {
+      const detection = detect(current, isRoot);
+      return detection.fold(() => {
+        return CellLocation.none(current);
+      }, info => {
+        return walk(info.all, current, info.index, 1, isEligible);
+      });
+    };
+    const prev = (current, isEligible, isRoot) => {
+      const detection = detect(current, isRoot);
+      return detection.fold(() => {
+        return CellLocation.none();
+      }, info => {
+        return walk(info.all, current, info.index, -1, isEligible);
+      });
+    };
+
+    const closest = target => closest$3(target, '[contenteditable]');
+    const isEditable = (element, assumeEditable = false) => {
+      if (inBody(element)) {
+        return element.dom.isContentEditable;
+      } else {
+        return closest(element).fold(constant(assumeEditable), editable => getRaw(editable) === 'true');
+      }
+    };
+    const getRaw = element => element.dom.contentEditable;
+
+    const deflate = (rect, delta) => ({
+      left: rect.left - delta,
+      top: rect.top - delta,
+      right: rect.right + delta * 2,
+      bottom: rect.bottom + delta * 2,
+      width: rect.width + delta,
+      height: rect.height + delta
+    });
+    const getCorners = (getYAxisValue, tds) => bind$3(tds, td => {
+      const rect = deflate(clone$1(td.getBoundingClientRect()), -1);
+      return [
+        {
+          x: rect.left,
+          y: getYAxisValue(rect),
+          cell: td
+        },
+        {
+          x: rect.right,
+          y: getYAxisValue(rect),
+          cell: td
+        }
+      ];
+    });
+    const findClosestCorner = (corners, x, y) => foldl(corners, (acc, newCorner) => acc.fold(() => Optional.some(newCorner), oldCorner => {
+      const oldDist = Math.sqrt(Math.abs(oldCorner.x - x) + Math.abs(oldCorner.y - y));
+      const newDist = Math.sqrt(Math.abs(newCorner.x - x) + Math.abs(newCorner.y - y));
+      return Optional.some(newDist < oldDist ? newCorner : oldCorner);
+    }), Optional.none());
+    const getClosestCell = (getYAxisValue, isTargetCorner, table, x, y) => {
+      const cells = descendants(SugarElement.fromDom(table), 'td,th,caption').map(e => e.dom);
+      const corners = filter$6(getCorners(getYAxisValue, cells), corner => isTargetCorner(corner, y));
+      return findClosestCorner(corners, x, y).map(corner => corner.cell);
+    };
+    const getBottomValue = rect => rect.bottom;
+    const getTopValue = rect => rect.top;
+    const isAbove = (corner, y) => corner.y < y;
+    const isBelow = (corner, y) => corner.y > y;
+    const getClosestCellAbove = curry(getClosestCell, getBottomValue, isAbove);
+    const getClosestCellBelow = curry(getClosestCell, getTopValue, isBelow);
+    const findClosestPositionInAboveCell = (table, pos) => head(pos.getClientRects()).bind(rect => getClosestCellAbove(table, rect.left, rect.top)).bind(cell => findClosestHorizontalPosition(getLastLinePositions(cell), pos));
+    const findClosestPositionInBelowCell = (table, pos) => last$3(pos.getClientRects()).bind(rect => getClosestCellBelow(table, rect.left, rect.top)).bind(cell => findClosestHorizontalPosition(getFirstLinePositions(cell), pos));
+
+    const hasNextBreak = (getPositionsUntil, scope, lineInfo) => lineInfo.breakAt.exists(breakPos => getPositionsUntil(scope, breakPos).breakAt.isSome());
+    const startsWithWrapBreak = lineInfo => lineInfo.breakType === BreakType.Wrap && lineInfo.positions.length === 0;
+    const startsWithBrBreak = lineInfo => lineInfo.breakType === BreakType.Br && lineInfo.positions.length === 1;
+    const isAtTableCellLine = (getPositionsUntil, scope, pos) => {
+      const lineInfo = getPositionsUntil(scope, pos);
+      if (startsWithWrapBreak(lineInfo) || !isBr$5(pos.getNode()) && startsWithBrBreak(lineInfo)) {
+        return !hasNextBreak(getPositionsUntil, scope, lineInfo);
+      } else {
+        return lineInfo.breakAt.isNone();
+      }
+    };
+    const isAtFirstTableCellLine = curry(isAtTableCellLine, getPositionsUntilPreviousLine);
+    const isAtLastTableCellLine = curry(isAtTableCellLine, getPositionsUntilNextLine);
+    const isCaretAtStartOrEndOfTable = (forward, rng, table) => {
+      const caretPos = CaretPosition.fromRangeStart(rng);
+      return positionIn(!forward, table).exists(pos => pos.isEqual(caretPos));
+    };
+    const navigateHorizontally = (editor, forward, table, _td) => {
+      const rng = editor.selection.getRng();
+      const direction = forward ? 1 : -1;
+      if (isFakeCaretTableBrowser() && isCaretAtStartOrEndOfTable(forward, rng, table)) {
+        showCaret(direction, editor, table, !forward, false).each(newRng => {
+          moveToRange(editor, newRng);
+        });
+        return true;
+      }
+      return false;
+    };
+    const getClosestAbovePosition = (root, table, start) => findClosestPositionInAboveCell(table, start).orThunk(() => head(start.getClientRects()).bind(rect => findClosestHorizontalPositionFromPoint(getPositionsAbove(root, CaretPosition.before(table)), rect.left))).getOr(CaretPosition.before(table));
+    const getClosestBelowPosition = (root, table, start) => findClosestPositionInBelowCell(table, start).orThunk(() => head(start.getClientRects()).bind(rect => findClosestHorizontalPositionFromPoint(getPositionsBelow(root, CaretPosition.after(table)), rect.left))).getOr(CaretPosition.after(table));
+    const getTable = (previous, pos) => {
+      const node = pos.getNode(previous);
+      return isElement$6(node) && node.nodeName === 'TABLE' ? Optional.some(node) : Optional.none();
+    };
+    const renderBlock = (down, editor, table) => {
+      const forcedRootBlock = getForcedRootBlock(editor);
+      editor.undoManager.transact(() => {
+        const element = SugarElement.fromTag(forcedRootBlock);
+        setAll$1(element, getForcedRootBlockAttrs(editor));
+        append$1(element, SugarElement.fromTag('br'));
+        if (down) {
+          after$4(SugarElement.fromDom(table), element);
+        } else {
+          before$3(SugarElement.fromDom(table), element);
+        }
+        const rng = editor.dom.createRng();
+        rng.setStart(element.dom, 0);
+        rng.setEnd(element.dom, 0);
+        moveToRange(editor, rng);
+      });
+    };
+    const moveCaret = (editor, down, pos) => {
+      const table = down ? getTable(true, pos) : getTable(false, pos);
+      const last = down === false;
+      table.fold(() => moveToRange(editor, pos.toRange()), table => positionIn(last, editor.getBody()).filter(lastPos => lastPos.isEqual(pos)).fold(() => moveToRange(editor, pos.toRange()), _ => renderBlock(down, editor, table)));
+    };
+    const navigateVertically = (editor, down, table, td) => {
+      const rng = editor.selection.getRng();
+      const pos = CaretPosition.fromRangeStart(rng);
+      const root = editor.getBody();
+      if (!down && isAtFirstTableCellLine(td, pos)) {
+        const newPos = getClosestAbovePosition(root, table, pos);
+        moveCaret(editor, down, newPos);
+        return true;
+      } else if (down && isAtLastTableCellLine(td, pos)) {
+        const newPos = getClosestBelowPosition(root, table, pos);
+        moveCaret(editor, down, newPos);
+        return true;
+      } else {
+        return false;
+      }
+    };
+    const move$1 = (editor, forward, mover) => Optional.from(editor.dom.getParent(editor.selection.getNode(), 'td,th')).bind(td => Optional.from(editor.dom.getParent(td, 'table')).map(table => mover(editor, forward, table, td))).getOr(false);
+    const moveH = (editor, forward) => move$1(editor, forward, navigateHorizontally);
+    const moveV = (editor, forward) => move$1(editor, forward, navigateVertically);
+    const getCellFirstCursorPosition = cell => {
+      const selection = SimSelection.exact(cell, 0, cell, 0);
+      return toNative(selection);
+    };
+    const tabGo = (editor, isRoot, cell) => {
+      return cell.fold(Optional.none, Optional.none, (_current, next) => {
+        return first(next).map(cell => {
+          return getCellFirstCursorPosition(cell);
+        });
+      }, current => {
+        editor.execCommand('mceTableInsertRowAfter');
+        return tabForward(editor, isRoot, current);
+      });
+    };
+    const tabForward = (editor, isRoot, cell) => tabGo(editor, isRoot, next(cell, isEditable));
+    const tabBackward = (editor, isRoot, cell) => tabGo(editor, isRoot, prev(cell, isEditable));
+    const handleTab = (editor, forward) => {
+      const rootElements = [
+        'table',
+        'li',
+        'dl'
+      ];
+      const body = SugarElement.fromDom(editor.getBody());
+      const isRoot = element => {
+        const name$1 = name(element);
+        return eq(element, body) || contains$2(rootElements, name$1);
+      };
+      const rng = editor.selection.getRng();
+      const container = SugarElement.fromDom(!forward ? rng.startContainer : rng.endContainer);
+      return cell(container, isRoot).map(cell => {
+        table(cell, isRoot).each(table => {
+          editor.model.table.clearSelectedCells(table.dom);
+        });
+        editor.selection.collapse(!forward);
+        const navigation = !forward ? tabBackward : tabForward;
+        const rng = navigation(editor, isRoot, cell);
+        rng.each(range => {
+          editor.selection.setRng(range);
+        });
+        return true;
+      }).getOr(false);
+    };
+
+    const executeKeydownOverride$4 = (editor, caret, evt) => {
+      const os = detect$2().os;
+      execute([
+        {
+          keyCode: VK.RIGHT,
+          action: action(moveH$2, editor, true)
+        },
+        {
+          keyCode: VK.LEFT,
+          action: action(moveH$2, editor, false)
+        },
+        {
+          keyCode: VK.UP,
+          action: action(moveV$3, editor, false)
+        },
+        {
+          keyCode: VK.DOWN,
+          action: action(moveV$3, editor, true)
+        },
+        {
+          keyCode: VK.RIGHT,
+          action: action(moveH, editor, true)
+        },
+        {
+          keyCode: VK.LEFT,
+          action: action(moveH, editor, false)
+        },
+        {
+          keyCode: VK.UP,
+          action: action(moveV, editor, false)
+        },
+        {
+          keyCode: VK.DOWN,
+          action: action(moveV, editor, true)
+        },
+        {
+          keyCode: VK.RIGHT,
+          action: action(moveH$1, editor, true)
+        },
+        {
+          keyCode: VK.LEFT,
+          action: action(moveH$1, editor, false)
+        },
+        {
+          keyCode: VK.UP,
+          action: action(moveV$1, editor, false)
+        },
+        {
+          keyCode: VK.DOWN,
+          action: action(moveV$1, editor, true)
+        },
+        {
+          keyCode: VK.RIGHT,
+          action: action(move$2, editor, caret, true)
+        },
+        {
+          keyCode: VK.LEFT,
+          action: action(move$2, editor, caret, false)
+        },
+        {
+          keyCode: VK.RIGHT,
+          ctrlKey: !os.isMacOS(),
+          altKey: os.isMacOS(),
+          action: action(moveNextWord, editor, caret)
+        },
+        {
+          keyCode: VK.LEFT,
+          ctrlKey: !os.isMacOS(),
+          altKey: os.isMacOS(),
+          action: action(movePrevWord, editor, caret)
+        },
+        {
+          keyCode: VK.UP,
+          action: action(moveV$2, editor, false)
+        },
+        {
+          keyCode: VK.DOWN,
+          action: action(moveV$2, editor, true)
+        }
+      ], evt).each(_ => {
+        evt.preventDefault();
+      });
+    };
+    const setup$k = (editor, caret) => {
+      editor.on('keydown', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeydownOverride$4(editor, caret, evt);
+        }
+      });
+    };
+
+    const point = (container, offset) => ({
+      container,
+      offset
+    });
+
+    const DOM$7 = DOMUtils.DOM;
+    const alwaysNext = startNode => node => startNode === node ? -1 : 0;
+    const isBoundary = dom => node => dom.isBlock(node) || contains$2([
+      'BR',
+      'IMG',
+      'HR',
+      'INPUT'
+    ], node.nodeName) || dom.getContentEditable(node) === 'false';
+    const textBefore = (node, offset, rootNode) => {
+      if (isText$8(node) && offset >= 0) {
+        return Optional.some(point(node, offset));
+      } else {
+        const textSeeker = TextSeeker(DOM$7);
+        return Optional.from(textSeeker.backwards(node, offset, alwaysNext(node), rootNode)).map(prev => point(prev.container, prev.container.data.length));
+      }
+    };
+    const textAfter = (node, offset, rootNode) => {
+      if (isText$8(node) && offset >= node.length) {
+        return Optional.some(point(node, offset));
+      } else {
+        const textSeeker = TextSeeker(DOM$7);
+        return Optional.from(textSeeker.forwards(node, offset, alwaysNext(node), rootNode)).map(prev => point(prev.container, 0));
+      }
+    };
+    const scanLeft = (node, offset, rootNode) => {
+      if (!isText$8(node)) {
+        return Optional.none();
+      }
+      const text = node.textContent;
+      if (offset >= 0 && offset <= text.length) {
+        return Optional.some(point(node, offset));
+      } else {
+        const textSeeker = TextSeeker(DOM$7);
+        return Optional.from(textSeeker.backwards(node, offset, alwaysNext(node), rootNode)).bind(prev => {
+          const prevText = prev.container.data;
+          return scanLeft(prev.container, offset + prevText.length, rootNode);
+        });
+      }
+    };
+    const scanRight = (node, offset, rootNode) => {
+      if (!isText$8(node)) {
+        return Optional.none();
+      }
+      const text = node.textContent;
+      if (offset <= text.length) {
+        return Optional.some(point(node, offset));
+      } else {
+        const textSeeker = TextSeeker(DOM$7);
+        return Optional.from(textSeeker.forwards(node, offset, alwaysNext(node), rootNode)).bind(next => scanRight(next.container, offset - text.length, rootNode));
+      }
+    };
+    const repeatLeft = (dom, node, offset, process, rootNode) => {
+      const search = TextSeeker(dom, isBoundary(dom));
+      return Optional.from(search.backwards(node, offset, process, rootNode));
+    };
+
+    const isValidTextRange = rng => rng.collapsed && rng.startContainer.nodeType === 3;
+    const getText = rng => rng.toString().replace(/\u00A0/g, ' ').replace(/\uFEFF/g, '');
+    const isWhitespace = chr => chr !== '' && ' \xA0\f\n\r\t\x0B'.indexOf(chr) !== -1;
+
+    const stripTriggerChar = (text, triggerCh) => text.substring(triggerCh.length);
+    const findChar = (text, index, ch) => {
+      let i;
+      for (i = index - 1; i >= 0; i--) {
+        const char = text.charAt(i);
+        if (isWhitespace(char)) {
+          return Optional.none();
+        }
+        if (char === ch) {
+          break;
+        }
+      }
+      return Optional.some(i);
+    };
+    const findStart = (dom, initRange, ch, minChars = 0) => {
+      if (!isValidTextRange(initRange)) {
+        return Optional.none();
+      }
+      const findTriggerChIndex = (element, offset, text) => findChar(text, offset, ch).getOr(offset);
+      const root = dom.getParent(initRange.startContainer, dom.isBlock) || dom.getRoot();
+      return repeatLeft(dom, initRange.startContainer, initRange.startOffset, findTriggerChIndex, root).bind(spot => {
+        const range = initRange.cloneRange();
+        range.setStart(spot.container, spot.offset);
+        range.setEnd(initRange.endContainer, initRange.endOffset);
+        if (range.collapsed) {
+          return Optional.none();
+        }
+        const text = getText(range);
+        const triggerCharIndex = text.lastIndexOf(ch);
+        if (triggerCharIndex !== 0 || stripTriggerChar(text, ch).length < minChars) {
+          return Optional.none();
+        } else {
+          return Optional.some({
+            text: stripTriggerChar(text, ch),
+            range,
+            triggerChar: ch
+          });
+        }
+      });
+    };
+    const getContext = (dom, initRange, ch, minChars = 0) => detect$1(SugarElement.fromDom(initRange.startContainer)).fold(() => findStart(dom, initRange, ch, minChars), elm => {
+      const range = dom.createRng();
+      range.selectNode(elm.dom);
+      const text = getText(range);
+      return Optional.some({
+        range,
+        text: stripTriggerChar(text, ch),
+        triggerChar: ch
+      });
+    });
+
+    const isText = node => node.nodeType === TEXT;
+    const isElement = node => node.nodeType === ELEMENT;
+    const toLast = node => {
+      if (isText(node)) {
+        return point(node, node.data.length);
+      } else {
+        const children = node.childNodes;
+        return children.length > 0 ? toLast(children[children.length - 1]) : point(node, children.length);
+      }
+    };
+    const toLeaf = (node, offset) => {
+      const children = node.childNodes;
+      if (children.length > 0 && offset < children.length) {
+        return toLeaf(children[offset], 0);
+      } else if (children.length > 0 && isElement(node) && children.length === offset) {
+        return toLast(children[children.length - 1]);
+      } else {
+        return point(node, offset);
+      }
+    };
+
+    const isPreviousCharContent = (dom, leaf) => repeatLeft(dom, leaf.container, leaf.offset, (element, offset) => offset === 0 ? -1 : offset, dom.getRoot()).filter(spot => {
+      const char = spot.container.data.charAt(spot.offset - 1);
+      return !isWhitespace(char);
+    }).isSome();
+    const isStartOfWord = dom => rng => {
+      const leaf = toLeaf(rng.startContainer, rng.startOffset);
+      return !isPreviousCharContent(dom, leaf);
+    };
+    const getTriggerContext = (dom, initRange, database) => findMap(database.triggerChars, ch => getContext(dom, initRange, ch));
+    const lookup = (editor, getDatabase) => {
+      const database = getDatabase();
+      const rng = editor.selection.getRng();
+      return getTriggerContext(editor.dom, rng, database).bind(context => lookupWithContext(editor, getDatabase, context));
+    };
+    const lookupWithContext = (editor, getDatabase, context, fetchOptions = {}) => {
+      const database = getDatabase();
+      const rng = editor.selection.getRng();
+      const startText = rng.startContainer.nodeValue;
+      const autocompleters = filter$6(database.lookupByChar(context.triggerChar), autocompleter => context.text.length >= autocompleter.minChars && autocompleter.matches.getOrThunk(() => isStartOfWord(editor.dom))(context.range, startText, context.text));
+      if (autocompleters.length === 0) {
+        return Optional.none();
+      }
+      const lookupData = Promise.all(map$3(autocompleters, ac => {
+        const fetchResult = ac.fetch(context.text, ac.maxResults, fetchOptions);
+        return fetchResult.then(results => ({
+          matchText: context.text,
+          items: results,
+          columns: ac.columns,
+          onAction: ac.onAction,
+          highlightOn: ac.highlightOn
+        }));
+      }));
+      return Optional.some({
+        lookupData,
+        context
+      });
+    };
+
+    var SimpleResultType;
+    (function (SimpleResultType) {
+      SimpleResultType[SimpleResultType['Error'] = 0] = 'Error';
+      SimpleResultType[SimpleResultType['Value'] = 1] = 'Value';
+    }(SimpleResultType || (SimpleResultType = {})));
+    const fold$1 = (res, onError, onValue) => res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue);
+    const partition = results => {
+      const values = [];
+      const errors = [];
+      each$g(results, obj => {
+        fold$1(obj, err => errors.push(err), val => values.push(val));
+      });
+      return {
+        values,
+        errors
+      };
+    };
+    const mapError = (res, f) => {
+      if (res.stype === SimpleResultType.Error) {
+        return {
+          stype: SimpleResultType.Error,
+          serror: f(res.serror)
+        };
+      } else {
+        return res;
+      }
+    };
+    const map = (res, f) => {
+      if (res.stype === SimpleResultType.Value) {
+        return {
+          stype: SimpleResultType.Value,
+          svalue: f(res.svalue)
+        };
+      } else {
+        return res;
+      }
+    };
+    const bind = (res, f) => {
+      if (res.stype === SimpleResultType.Value) {
+        return f(res.svalue);
+      } else {
+        return res;
+      }
+    };
+    const bindError = (res, f) => {
+      if (res.stype === SimpleResultType.Error) {
+        return f(res.serror);
+      } else {
+        return res;
+      }
+    };
+    const svalue = v => ({
+      stype: SimpleResultType.Value,
+      svalue: v
+    });
+    const serror = e => ({
+      stype: SimpleResultType.Error,
+      serror: e
+    });
+    const toResult = res => fold$1(res, Result.error, Result.value);
+    const fromResult = res => res.fold(serror, svalue);
+    const SimpleResult = {
+      fromResult,
+      toResult,
+      svalue,
+      partition,
+      serror,
+      bind,
+      bindError,
+      map,
+      mapError,
+      fold: fold$1
+    };
+
+    const formatObj = input => {
+      return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2);
+    };
+    const formatErrors = errors => {
+      const es = errors.length > 10 ? errors.slice(0, 10).concat([{
+          path: [],
+          getErrorInfo: constant('... (only showing first ten failures)')
+        }]) : errors;
+      return map$3(es, e => {
+        return 'Failed path: (' + e.path.join(' > ') + ')\n' + e.getErrorInfo();
+      });
+    };
+
+    const nu = (path, getErrorInfo) => {
+      return SimpleResult.serror([{
+          path,
+          getErrorInfo
+        }]);
+    };
+    const missingRequired = (path, key, obj) => nu(path, () => 'Could not find valid *required* value for "' + key + '" in ' + formatObj(obj));
+    const missingKey = (path, key) => nu(path, () => 'Choice schema did not contain choice key: "' + key + '"');
+    const missingBranch = (path, branches, branch) => nu(path, () => 'The chosen schema: "' + branch + '" did not exist in branches: ' + formatObj(branches));
+    const custom = (path, err) => nu(path, constant(err));
+
+    const chooseFrom = (path, input, branches, ch) => {
+      const fields = get$a(branches, ch);
+      return fields.fold(() => missingBranch(path, branches, ch), vp => vp.extract(path.concat(['branch: ' + ch]), input));
+    };
+    const choose$1 = (key, branches) => {
+      const extract = (path, input) => {
+        const choice = get$a(input, key);
+        return choice.fold(() => missingKey(path, key), chosen => chooseFrom(path, input, branches, chosen));
+      };
+      const toString = () => 'chooseOn(' + key + '). Possible values: ' + keys(branches);
+      return {
+        extract,
+        toString
+      };
+    };
+
+    const shallow = (old, nu) => {
+      return nu;
+    };
+    const deep = (old, nu) => {
+      const bothObjects = isPlainObject(old) && isPlainObject(nu);
+      return bothObjects ? deepMerge(old, nu) : nu;
+    };
+    const baseMerge = merger => {
+      return (...objects) => {
+        if (objects.length === 0) {
+          throw new Error(`Can't merge zero objects`);
+        }
+        const ret = {};
+        for (let j = 0; j < objects.length; j++) {
+          const curObject = objects[j];
+          for (const key in curObject) {
+            if (has$2(curObject, key)) {
+              ret[key] = merger(ret[key], curObject[key]);
+            }
+          }
+        }
+        return ret;
+      };
+    };
+    const deepMerge = baseMerge(deep);
+    const merge = baseMerge(shallow);
+
+    const required = () => ({
+      tag: 'required',
+      process: {}
+    });
+    const defaultedThunk = fallbackThunk => ({
+      tag: 'defaultedThunk',
+      process: fallbackThunk
+    });
+    const defaulted$1 = fallback => defaultedThunk(constant(fallback));
+    const asOption = () => ({
+      tag: 'option',
+      process: {}
+    });
+
+    const mergeValues = (values, base) => values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge.apply(undefined, values))) : SimpleResult.svalue(base);
+    const mergeErrors = errors => compose(SimpleResult.serror, flatten)(errors);
+    const consolidateObj = (objects, base) => {
+      const partition = SimpleResult.partition(objects);
+      return partition.errors.length > 0 ? mergeErrors(partition.errors) : mergeValues(partition.values, base);
+    };
+    const consolidateArr = objects => {
+      const partitions = SimpleResult.partition(objects);
+      return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : SimpleResult.svalue(partitions.values);
+    };
+    const ResultCombine = {
+      consolidateObj,
+      consolidateArr
+    };
+
+    const field$1 = (key, newKey, presence, prop) => ({
+      tag: 'field',
+      key,
+      newKey,
+      presence,
+      prop
+    });
+    const customField$1 = (newKey, instantiator) => ({
+      tag: 'custom',
+      newKey,
+      instantiator
+    });
+    const fold = (value, ifField, ifCustom) => {
+      switch (value.tag) {
+      case 'field':
+        return ifField(value.key, value.newKey, value.presence, value.prop);
+      case 'custom':
+        return ifCustom(value.newKey, value.instantiator);
+      }
+    };
+
+    const value = validator => {
+      const extract = (path, val) => {
+        return SimpleResult.bindError(validator(val), err => custom(path, err));
+      };
+      const toString = constant('val');
+      return {
+        extract,
+        toString
+      };
+    };
+    const anyValue$1 = value(SimpleResult.svalue);
+
+    const requiredAccess = (path, obj, key, bundle) => get$a(obj, key).fold(() => missingRequired(path, key, obj), bundle);
+    const fallbackAccess = (obj, key, fallback, bundle) => {
+      const v = get$a(obj, key).getOrThunk(() => fallback(obj));
+      return bundle(v);
+    };
+    const optionAccess = (obj, key, bundle) => bundle(get$a(obj, key));
+    const optionDefaultedAccess = (obj, key, fallback, bundle) => {
+      const opt = get$a(obj, key).map(val => val === true ? fallback(obj) : val);
+      return bundle(opt);
+    };
+    const extractField = (field, path, obj, key, prop) => {
+      const bundle = av => prop.extract(path.concat([key]), av);
+      const bundleAsOption = optValue => optValue.fold(() => SimpleResult.svalue(Optional.none()), ov => {
+        const result = prop.extract(path.concat([key]), ov);
+        return SimpleResult.map(result, Optional.some);
+      });
+      switch (field.tag) {
+      case 'required':
+        return requiredAccess(path, obj, key, bundle);
+      case 'defaultedThunk':
+        return fallbackAccess(obj, key, field.process, bundle);
+      case 'option':
+        return optionAccess(obj, key, bundleAsOption);
+      case 'defaultedOptionThunk':
+        return optionDefaultedAccess(obj, key, field.process, bundleAsOption);
+      case 'mergeWithThunk': {
+          return fallbackAccess(obj, key, constant({}), v => {
+            const result = deepMerge(field.process(obj), v);
+            return bundle(result);
+          });
+        }
+      }
+    };
+    const extractFields = (path, obj, fields) => {
+      const success = {};
+      const errors = [];
+      for (const field of fields) {
+        fold(field, (key, newKey, presence, prop) => {
+          const result = extractField(presence, path, obj, key, prop);
+          SimpleResult.fold(result, err => {
+            errors.push(...err);
+          }, res => {
+            success[newKey] = res;
+          });
+        }, (newKey, instantiator) => {
+          success[newKey] = instantiator(obj);
+        });
+      }
+      return errors.length > 0 ? SimpleResult.serror(errors) : SimpleResult.svalue(success);
+    };
+    const objOf = values => {
+      const extract = (path, o) => extractFields(path, o, values);
+      const toString = () => {
+        const fieldStrings = map$3(values, value => fold(value, (key, _okey, _presence, prop) => key + ' -> ' + prop.toString(), (newKey, _instantiator) => 'state(' + newKey + ')'));
+        return 'obj{\n' + fieldStrings.join('\n') + '}';
+      };
+      return {
+        extract,
+        toString
+      };
+    };
+    const arrOf = prop => {
+      const extract = (path, array) => {
+        const results = map$3(array, (a, i) => prop.extract(path.concat(['[' + i + ']']), a));
+        return ResultCombine.consolidateArr(results);
+      };
+      const toString = () => 'array(' + prop.toString() + ')';
+      return {
+        extract,
+        toString
+      };
+    };
+
+    const valueOf = validator => value(v => validator(v).fold(SimpleResult.serror, SimpleResult.svalue));
+    const extractValue = (label, prop, obj) => {
+      const res = prop.extract([label], obj);
+      return SimpleResult.mapError(res, errs => ({
+        input: obj,
+        errors: errs
+      }));
+    };
+    const asRaw = (label, prop, obj) => SimpleResult.toResult(extractValue(label, prop, obj));
+    const formatError = errInfo => {
+      return 'Errors: \n' + formatErrors(errInfo.errors).join('\n') + '\n\nInput object: ' + formatObj(errInfo.input);
+    };
+    const choose = (key, branches) => choose$1(key, map$2(branches, objOf));
+
+    const anyValue = constant(anyValue$1);
+    const typedValue = (validator, expectedType) => value(a => {
+      const actualType = typeof a;
+      return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror(`Expected type: ${ expectedType } but got: ${ actualType }`);
+    });
+    const number = typedValue(isNumber, 'number');
+    const string = typedValue(isString, 'string');
+    const boolean = typedValue(isBoolean, 'boolean');
+    const functionProcessor = typedValue(isFunction, 'function');
+
+    const field = field$1;
+    const customField = customField$1;
+    const validateEnum = values => valueOf(value => contains$2(values, value) ? Result.value(value) : Result.error(`Unsupported value: "${ value }", choose one of "${ values.join(', ') }".`));
+    const requiredOf = (key, schema) => field(key, key, required(), schema);
+    const requiredString = key => requiredOf(key, string);
+    const requiredFunction = key => requiredOf(key, functionProcessor);
+    const requiredArrayOf = (key, schema) => field(key, key, required(), arrOf(schema));
+    const optionOf = (key, schema) => field(key, key, asOption(), schema);
+    const optionString = key => optionOf(key, string);
+    const optionFunction = key => optionOf(key, functionProcessor);
+    const defaulted = (key, fallback) => field(key, key, defaulted$1(fallback), anyValue());
+    const defaultedOf = (key, fallback, schema) => field(key, key, defaulted$1(fallback), schema);
+    const defaultedNumber = (key, fallback) => defaultedOf(key, fallback, number);
+    const defaultedString = (key, fallback) => defaultedOf(key, fallback, string);
+    const defaultedStringEnum = (key, fallback, values) => defaultedOf(key, fallback, validateEnum(values));
+    const defaultedBoolean = (key, fallback) => defaultedOf(key, fallback, boolean);
+    const defaultedFunction = (key, fallback) => defaultedOf(key, fallback, functionProcessor);
+    const defaultedArrayOf = (key, fallback, schema) => defaultedOf(key, fallback, arrOf(schema));
+
+    const type = requiredString('type');
+    const fetch = requiredFunction('fetch');
+    const onAction = requiredFunction('onAction');
+    const onSetup = defaultedFunction('onSetup', () => noop);
+    const optionalText = optionString('text');
+    const optionalIcon = optionString('icon');
+    const optionalTooltip = optionString('tooltip');
+    const optionalLabel = optionString('label');
+    const active = defaultedBoolean('active', false);
+    const enabled = defaultedBoolean('enabled', true);
+    const primary = defaultedBoolean('primary', false);
+    const defaultedColumns = num => defaulted('columns', num);
+    const defaultedType = type => defaultedString('type', type);
+
+    const autocompleterSchema = objOf([
+      type,
+      requiredString('ch'),
+      defaultedNumber('minChars', 1),
+      defaultedColumns(1),
+      defaultedNumber('maxResults', 10),
+      optionFunction('matches'),
+      fetch,
+      onAction,
+      defaultedArrayOf('highlightOn', [], string)
+    ]);
+    const createAutocompleter = spec => asRaw('Autocompleter', autocompleterSchema, spec);
+
+    const baseToolbarButtonFields = [
+      enabled,
+      optionalTooltip,
+      optionalIcon,
+      optionalText,
+      onSetup
+    ];
+
+    const baseToolbarToggleButtonFields = [active].concat(baseToolbarButtonFields);
+
+    const contextBarFields = [
+      defaultedFunction('predicate', never),
+      defaultedStringEnum('scope', 'node', [
+        'node',
+        'editor'
+      ]),
+      defaultedStringEnum('position', 'selection', [
+        'node',
+        'selection',
+        'line'
+      ])
+    ];
+
+    const contextButtonFields = baseToolbarButtonFields.concat([
+      defaultedType('contextformbutton'),
+      primary,
+      onAction,
+      customField('original', identity)
+    ]);
+    const contextToggleButtonFields = baseToolbarToggleButtonFields.concat([
+      defaultedType('contextformbutton'),
+      primary,
+      onAction,
+      customField('original', identity)
+    ]);
+    const launchButtonFields = baseToolbarButtonFields.concat([defaultedType('contextformbutton')]);
+    const launchToggleButtonFields = baseToolbarToggleButtonFields.concat([defaultedType('contextformtogglebutton')]);
+    const toggleOrNormal = choose('type', {
+      contextformbutton: contextButtonFields,
+      contextformtogglebutton: contextToggleButtonFields
+    });
+    objOf([
+      defaultedType('contextform'),
+      defaultedFunction('initValue', constant('')),
+      optionalLabel,
+      requiredArrayOf('commands', toggleOrNormal),
+      optionOf('launch', choose('type', {
+        contextformbutton: launchButtonFields,
+        contextformtogglebutton: launchToggleButtonFields
+      }))
+    ].concat(contextBarFields));
+
+    const register$2 = editor => {
+      const popups = editor.ui.registry.getAll().popups;
+      const dataset = map$2(popups, popup => createAutocompleter(popup).fold(err => {
+        throw new Error(formatError(err));
+      }, identity));
+      const triggerChars = stringArray(mapToArray(dataset, v => v.ch));
+      const datasetValues = values(dataset);
+      const lookupByChar = ch => filter$6(datasetValues, dv => dv.ch === ch);
+      return {
+        dataset,
+        triggerChars,
+        lookupByChar
+      };
+    };
+
+    const setupEditorInput = (editor, api) => {
+      const update = last$1(api.load, 50);
+      editor.on('keypress compositionend', e => {
+        if (e.which === 27) {
+          return;
+        }
+        update.throttle();
+      });
+      editor.on('keydown', e => {
+        const keyCode = e.which;
+        if (keyCode === 8) {
+          update.throttle();
+        } else if (keyCode === 27) {
+          api.cancelIfNecessary();
+        }
+      });
+      editor.on('remove', update.cancel);
+    };
+    const setup$j = editor => {
+      const activeAutocompleter = value$2();
+      const uiActive = Cell(false);
+      const isActive = activeAutocompleter.isSet;
+      const cancelIfNecessary = () => {
+        if (isActive()) {
+          removeAutocompleterDecoration(editor);
+          fireAutocompleterEnd(editor);
+          uiActive.set(false);
+          activeAutocompleter.clear();
+        }
+      };
+      const commenceIfNecessary = context => {
+        if (!isActive()) {
+          addAutocompleterDecoration(editor, context.range);
+          activeAutocompleter.set({
+            triggerChar: context.triggerChar,
+            matchLength: context.text.length
+          });
+        }
+      };
+      const getAutocompleters = cached(() => register$2(editor));
+      const doLookup = fetchOptions => activeAutocompleter.get().map(ac => getContext(editor.dom, editor.selection.getRng(), ac.triggerChar).bind(newContext => lookupWithContext(editor, getAutocompleters, newContext, fetchOptions))).getOrThunk(() => lookup(editor, getAutocompleters));
+      const load = fetchOptions => {
+        doLookup(fetchOptions).fold(cancelIfNecessary, lookupInfo => {
+          commenceIfNecessary(lookupInfo.context);
+          lookupInfo.lookupData.then(lookupData => {
+            activeAutocompleter.get().map(ac => {
+              const context = lookupInfo.context;
+              if (ac.triggerChar === context.triggerChar) {
+                if (context.text.length - ac.matchLength >= 10) {
+                  cancelIfNecessary();
+                } else {
+                  activeAutocompleter.set({
+                    ...ac,
+                    matchLength: context.text.length
+                  });
+                  if (uiActive.get()) {
+                    fireAutocompleterUpdate(editor, { lookupData });
+                  } else {
+                    uiActive.set(true);
+                    fireAutocompleterStart(editor, { lookupData });
+                  }
+                }
+              }
+            });
+          });
+        });
+      };
+      editor.addCommand('mceAutocompleterReload', (_ui, value) => {
+        const fetchOptions = isObject(value) ? value.fetchOptions : {};
+        load(fetchOptions);
+      });
+      editor.addCommand('mceAutocompleterClose', cancelIfNecessary);
+      setupEditorInput(editor, {
+        cancelIfNecessary,
+        load
+      });
+    };
+
+    const createAndFireInputEvent = eventType => (editor, inputType, specifics = {}) => {
+      const target = editor.getBody();
+      const overrides = {
+        bubbles: true,
+        composed: true,
+        data: null,
+        isComposing: false,
+        detail: 0,
+        view: null,
+        target,
+        currentTarget: target,
+        eventPhase: Event.AT_TARGET,
+        originalTarget: target,
+        explicitOriginalTarget: target,
+        isTrusted: false,
+        srcElement: target,
+        cancelable: false,
+        preventDefault: noop,
+        inputType
+      };
+      const input = clone$3(new InputEvent(eventType));
+      return editor.dispatch(eventType, {
+        ...input,
+        ...overrides,
+        ...specifics
+      });
+    };
+    const fireFakeInputEvent = createAndFireInputEvent('input');
+    const fireFakeBeforeInputEvent = createAndFireInputEvent('beforeinput');
+
+    const executeKeydownOverride$3 = (editor, caret, evt) => {
+      const inputType = evt.keyCode === VK.BACKSPACE ? 'deleteContentBackward' : 'deleteContentForward';
+      executeWithDelayedAction([
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete, editor)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$5, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$5, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$6, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$6, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$3, editor, caret, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$3, editor, caret, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$9, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$9, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$4, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$4, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$1, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$1, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$7, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$7, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$8, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$8, editor, true)
+        },
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(backspaceDelete$2, editor, false)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(backspaceDelete$2, editor, true)
+        }
+      ], evt).each(applyAction => {
+        evt.preventDefault();
+        const beforeInput = fireFakeBeforeInputEvent(editor, inputType);
+        if (!beforeInput.isDefaultPrevented()) {
+          applyAction();
+          fireFakeInputEvent(editor, inputType);
+        }
+      });
+    };
+    const executeKeyupOverride = (editor, evt) => {
+      execute([
+        {
+          keyCode: VK.BACKSPACE,
+          action: action(paddEmptyElement, editor)
+        },
+        {
+          keyCode: VK.DELETE,
+          action: action(paddEmptyElement, editor)
+        }
+      ], evt);
+    };
+    const setup$i = (editor, caret) => {
+      editor.on('keydown', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeydownOverride$3(editor, caret, evt);
+        }
+      });
+      editor.on('keyup', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeyupOverride(editor, evt);
+        }
+      });
+    };
+
+    const firstNonWhiteSpaceNodeSibling = node => {
+      while (node) {
+        if (node.nodeType === 1 || node.nodeType === 3 && node.data && /[\r\n\s]/.test(node.data)) {
+          return node;
+        }
+        node = node.nextSibling;
+      }
+    };
+    const moveToCaretPosition = (editor, root) => {
+      let node, lastNode = root;
+      const dom = editor.dom;
+      const moveCaretBeforeOnEnterElementsMap = editor.schema.getMoveCaretBeforeOnEnterElements();
+      if (!root) {
+        return;
+      }
+      if (/^(LI|DT|DD)$/.test(root.nodeName)) {
+        const firstChild = firstNonWhiteSpaceNodeSibling(root.firstChild);
+        if (firstChild && /^(UL|OL|DL)$/.test(firstChild.nodeName)) {
+          root.insertBefore(dom.doc.createTextNode(nbsp), root.firstChild);
+        }
+      }
+      const rng = dom.createRng();
+      root.normalize();
+      if (root.hasChildNodes()) {
+        const walker = new DomTreeWalker(root, root);
+        while (node = walker.current()) {
+          if (isText$8(node)) {
+            rng.setStart(node, 0);
+            rng.setEnd(node, 0);
+            break;
+          }
+          if (moveCaretBeforeOnEnterElementsMap[node.nodeName.toLowerCase()]) {
+            rng.setStartBefore(node);
+            rng.setEndBefore(node);
+            break;
+          }
+          lastNode = node;
+          node = walker.next();
+        }
+        if (!node) {
+          rng.setStart(lastNode, 0);
+          rng.setEnd(lastNode, 0);
+        }
+      } else {
+        if (isBr$5(root)) {
+          if (root.nextSibling && dom.isBlock(root.nextSibling)) {
+            rng.setStartBefore(root);
+            rng.setEndBefore(root);
+          } else {
+            rng.setStartAfter(root);
+            rng.setEndAfter(root);
+          }
+        } else {
+          rng.setStart(root, 0);
+          rng.setEnd(root, 0);
+        }
+      }
+      editor.selection.setRng(rng);
+      scrollRangeIntoView(editor, rng);
+    };
+    const getEditableRoot$1 = (dom, node) => {
+      const root = dom.getRoot();
+      let parent, editableRoot;
+      parent = node;
+      while (parent !== root && dom.getContentEditable(parent) !== 'false') {
+        if (dom.getContentEditable(parent) === 'true') {
+          editableRoot = parent;
+        }
+        parent = parent.parentNode;
+      }
+      return parent !== root ? editableRoot : root;
+    };
+    const getParentBlock$1 = editor => {
+      return Optional.from(editor.dom.getParent(editor.selection.getStart(true), editor.dom.isBlock));
+    };
+    const getParentBlockName = editor => {
+      return getParentBlock$1(editor).fold(constant(''), parentBlock => {
+        return parentBlock.nodeName.toUpperCase();
+      });
+    };
+    const isListItemParentBlock = editor => {
+      return getParentBlock$1(editor).filter(elm => {
+        return isListItem(SugarElement.fromDom(elm));
+      }).isSome();
+    };
+
+    const hasFirstChild = (elm, name) => {
+      return elm.firstChild && elm.firstChild.nodeName === name;
+    };
+    const isFirstChild = elm => {
+      var _a;
+      return ((_a = elm.parentNode) === null || _a === void 0 ? void 0 : _a.firstChild) === elm;
+    };
+    const hasParent = (elm, parentName) => {
+      return elm && elm.parentNode && elm.parentNode.nodeName === parentName;
+    };
+    const isListBlock = elm => {
+      return elm && /^(OL|UL|LI)$/.test(elm.nodeName);
+    };
+    const isNestedList = elm => {
+      return isListBlock(elm) && isListBlock(elm.parentNode);
+    };
+    const getContainerBlock = containerBlock => {
+      const containerBlockParent = containerBlock.parentNode;
+      if (/^(LI|DT|DD)$/.test(containerBlockParent.nodeName)) {
+        return containerBlockParent;
+      }
+      return containerBlock;
+    };
+    const isFirstOrLastLi = (containerBlock, parentBlock, first) => {
+      let node = containerBlock[first ? 'firstChild' : 'lastChild'];
+      while (node) {
+        if (isElement$6(node)) {
+          break;
+        }
+        node = node[first ? 'nextSibling' : 'previousSibling'];
+      }
+      return node === parentBlock;
+    };
+    const insert$3 = (editor, createNewBlock, containerBlock, parentBlock, newBlockName) => {
+      const dom = editor.dom;
+      const rng = editor.selection.getRng();
+      if (containerBlock === editor.getBody()) {
+        return;
+      }
+      if (isNestedList(containerBlock)) {
+        newBlockName = 'LI';
+      }
+      let newBlock = createNewBlock(newBlockName);
+      if (isFirstOrLastLi(containerBlock, parentBlock, true) && isFirstOrLastLi(containerBlock, parentBlock, false)) {
+        if (hasParent(containerBlock, 'LI')) {
+          const containerBlockParent = getContainerBlock(containerBlock);
+          dom.insertAfter(newBlock, containerBlockParent);
+          if (isFirstChild(containerBlock)) {
+            dom.remove(containerBlockParent);
+          } else {
+            dom.remove(containerBlock);
+          }
+        } else {
+          dom.replace(newBlock, containerBlock);
+        }
+      } else if (isFirstOrLastLi(containerBlock, parentBlock, true)) {
+        if (hasParent(containerBlock, 'LI')) {
+          dom.insertAfter(newBlock, getContainerBlock(containerBlock));
+          newBlock.appendChild(dom.doc.createTextNode(' '));
+          newBlock.appendChild(containerBlock);
+        } else {
+          containerBlock.parentNode.insertBefore(newBlock, containerBlock);
+        }
+        dom.remove(parentBlock);
+      } else if (isFirstOrLastLi(containerBlock, parentBlock, false)) {
+        dom.insertAfter(newBlock, getContainerBlock(containerBlock));
+        dom.remove(parentBlock);
+      } else {
+        containerBlock = getContainerBlock(containerBlock);
+        const tmpRng = rng.cloneRange();
+        tmpRng.setStartAfter(parentBlock);
+        tmpRng.setEndAfter(containerBlock);
+        const fragment = tmpRng.extractContents();
+        if (newBlockName === 'LI' && hasFirstChild(fragment, 'LI')) {
+          newBlock = fragment.firstChild;
+          dom.insertAfter(fragment, containerBlock);
+        } else {
+          dom.insertAfter(fragment, containerBlock);
+          dom.insertAfter(newBlock, containerBlock);
+        }
+        dom.remove(parentBlock);
+      }
+      moveToCaretPosition(editor, newBlock);
+    };
+
+    const trimZwsp = fragment => {
+      each$g(descendants$1(SugarElement.fromDom(fragment), isText$9), text => {
+        const rawNode = text.dom;
+        rawNode.nodeValue = trim$1(rawNode.nodeValue);
+      });
+    };
+    const isEmptyAnchor = (dom, elm) => {
+      return elm && elm.nodeName === 'A' && dom.isEmpty(elm);
+    };
+    const isTableCell = node => {
+      return node && /^(TD|TH|CAPTION)$/.test(node.nodeName);
+    };
+    const emptyBlock = elm => {
+      elm.innerHTML = '<br data-mce-bogus="1">';
+    };
+    const containerAndSiblingName = (container, nodeName) => {
+      return container.nodeName === nodeName || container.previousSibling && container.previousSibling.nodeName === nodeName;
+    };
+    const canSplitBlock = (dom, node) => {
+      return node && dom.isBlock(node) && !/^(TD|TH|CAPTION|FORM)$/.test(node.nodeName) && !/^(fixed|absolute)/i.test(node.style.position) && dom.getContentEditable(node) !== 'true';
+    };
+    const trimInlineElementsOnLeftSideOfBlock = (dom, nonEmptyElementsMap, block) => {
+      let node = block;
+      const firstChilds = [];
+      let i;
+      if (!node) {
+        return;
+      }
+      while (node = node.firstChild) {
+        if (dom.isBlock(node)) {
+          return;
+        }
+        if (isElement$6(node) && !nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
+          firstChilds.push(node);
+        }
+      }
+      i = firstChilds.length;
+      while (i--) {
+        node = firstChilds[i];
+        if (!node.hasChildNodes() || node.firstChild === node.lastChild && node.firstChild.nodeValue === '') {
+          dom.remove(node);
+        } else {
+          if (isEmptyAnchor(dom, node)) {
+            dom.remove(node);
+          }
+        }
+      }
+    };
+    const normalizeZwspOffset = (start, container, offset) => {
+      if (isText$8(container) === false) {
+        return offset;
+      } else if (start) {
+        return offset === 1 && container.data.charAt(offset - 1) === ZWSP$1 ? 0 : offset;
+      } else {
+        return offset === container.data.length - 1 && container.data.charAt(offset) === ZWSP$1 ? container.data.length : offset;
+      }
+    };
+    const includeZwspInRange = rng => {
+      const newRng = rng.cloneRange();
+      newRng.setStart(rng.startContainer, normalizeZwspOffset(true, rng.startContainer, rng.startOffset));
+      newRng.setEnd(rng.endContainer, normalizeZwspOffset(false, rng.endContainer, rng.endOffset));
+      return newRng;
+    };
+    const trimLeadingLineBreaks = node => {
+      do {
+        if (isText$8(node)) {
+          node.nodeValue = node.nodeValue.replace(/^[\r\n]+/, '');
+        }
+        node = node.firstChild;
+      } while (node);
+    };
+    const getEditableRoot = (dom, node) => {
+      const root = dom.getRoot();
+      let parent, editableRoot;
+      parent = node;
+      while (parent !== root && dom.getContentEditable(parent) !== 'false') {
+        if (dom.getContentEditable(parent) === 'true') {
+          editableRoot = parent;
+        }
+        parent = parent.parentNode;
+      }
+      return parent !== root ? editableRoot : root;
+    };
+    const applyAttributes = (editor, node, forcedRootBlockAttrs) => {
+      const dom = editor.dom;
+      Optional.from(forcedRootBlockAttrs.style).map(dom.parseStyle).each(attrStyles => {
+        const currentStyles = getAllRaw(SugarElement.fromDom(node));
+        const newStyles = {
+          ...currentStyles,
+          ...attrStyles
+        };
+        dom.setStyles(node, newStyles);
+      });
+      const attrClassesOpt = Optional.from(forcedRootBlockAttrs.class).map(attrClasses => attrClasses.split(/\s+/));
+      const currentClassesOpt = Optional.from(node.className).map(currentClasses => filter$6(currentClasses.split(/\s+/), clazz => clazz !== ''));
+      lift2(attrClassesOpt, currentClassesOpt, (attrClasses, currentClasses) => {
+        const filteredClasses = filter$6(currentClasses, clazz => !contains$2(attrClasses, clazz));
+        const newClasses = [
+          ...attrClasses,
+          ...filteredClasses
+        ];
+        dom.setAttrib(node, 'class', newClasses.join(' '));
+      });
+      const appliedAttrs = [
+        'style',
+        'class'
+      ];
+      const remainingAttrs = filter$5(forcedRootBlockAttrs, (_, attrs) => !contains$2(appliedAttrs, attrs));
+      dom.setAttribs(node, remainingAttrs);
+    };
+    const setForcedBlockAttrs = (editor, node) => {
+      const forcedRootBlockName = getForcedRootBlock(editor);
+      if (forcedRootBlockName.toLowerCase() === node.tagName.toLowerCase()) {
+        const forcedRootBlockAttrs = getForcedRootBlockAttrs(editor);
+        applyAttributes(editor, node, forcedRootBlockAttrs);
+      }
+    };
+    const wrapSelfAndSiblingsInDefaultBlock = (editor, newBlockName, rng, container, offset) => {
+      let newBlock, parentBlock, startNode, node, next, rootBlockName;
+      const dom = editor.dom, editableRoot = getEditableRoot(dom, container);
+      parentBlock = dom.getParent(container, dom.isBlock);
+      if (!parentBlock || !canSplitBlock(dom, parentBlock)) {
+        parentBlock = parentBlock || editableRoot;
+        if (parentBlock === editor.getBody() || isTableCell(parentBlock)) {
+          rootBlockName = parentBlock.nodeName.toLowerCase();
+        } else {
+          rootBlockName = parentBlock.parentNode.nodeName.toLowerCase();
+        }
+        if (!parentBlock.hasChildNodes()) {
+          newBlock = dom.create(newBlockName);
+          setForcedBlockAttrs(editor, newBlock);
+          parentBlock.appendChild(newBlock);
+          rng.setStart(newBlock, 0);
+          rng.setEnd(newBlock, 0);
+          return newBlock;
+        }
+        node = container;
+        while (node.parentNode !== parentBlock) {
+          node = node.parentNode;
+        }
+        while (node && !dom.isBlock(node)) {
+          startNode = node;
+          node = node.previousSibling;
+        }
+        if (startNode && editor.schema.isValidChild(rootBlockName, newBlockName.toLowerCase())) {
+          newBlock = dom.create(newBlockName);
+          setForcedBlockAttrs(editor, newBlock);
+          startNode.parentNode.insertBefore(newBlock, startNode);
+          node = startNode;
+          while (node && !dom.isBlock(node)) {
+            next = node.nextSibling;
+            newBlock.appendChild(node);
+            node = next;
+          }
+          rng.setStart(container, offset);
+          rng.setEnd(container, offset);
+        }
+      }
+      return container;
+    };
+    const addBrToBlockIfNeeded = (dom, block) => {
+      block.normalize();
+      const lastChild = block.lastChild;
+      if (!lastChild || /^(left|right)$/gi.test(dom.getStyle(lastChild, 'float', true))) {
+        dom.add(block, 'br');
+      }
+    };
+    const insert$2 = (editor, evt) => {
+      let tmpRng, container, offset, parentBlock;
+      let newBlock, fragment, containerBlock, parentBlockName, isAfterLastNodeInContainer;
+      const dom = editor.dom;
+      const schema = editor.schema, nonEmptyElementsMap = schema.getNonEmptyElements();
+      const rng = editor.selection.getRng();
+      const newBlockName = getForcedRootBlock(editor);
+      const createNewBlock = name => {
+        let node = container, block, clonedNode, caretNode;
+        const textInlineElements = schema.getTextInlineElements();
+        if (name || parentBlockName === 'TABLE' || parentBlockName === 'HR') {
+          block = dom.create(name || newBlockName);
+        } else {
+          block = parentBlock.cloneNode(false);
+        }
+        caretNode = block;
+        if (shouldKeepStyles(editor) === false) {
+          dom.setAttrib(block, 'style', null);
+          dom.setAttrib(block, 'class', null);
+        } else {
+          do {
+            if (textInlineElements[node.nodeName]) {
+              if (isCaretNode(node) || isBookmarkNode$1(node)) {
+                continue;
+              }
+              clonedNode = node.cloneNode(false);
+              dom.setAttrib(clonedNode, 'id', '');
+              if (block.hasChildNodes()) {
+                clonedNode.appendChild(block.firstChild);
+                block.appendChild(clonedNode);
+              } else {
+                caretNode = clonedNode;
+                block.appendChild(clonedNode);
+              }
+            }
+          } while ((node = node.parentNode) && node !== editableRoot);
+        }
+        setForcedBlockAttrs(editor, block);
+        emptyBlock(caretNode);
+        return block;
+      };
+      const isCaretAtStartOrEndOfBlock = start => {
+        let node, name;
+        const normalizedOffset = normalizeZwspOffset(start, container, offset);
+        if (isText$8(container) && (start ? normalizedOffset > 0 : normalizedOffset < container.nodeValue.length)) {
+          return false;
+        }
+        if (container.parentNode === parentBlock && isAfterLastNodeInContainer && !start) {
+          return true;
+        }
+        if (start && isElement$6(container) && container === parentBlock.firstChild) {
+          return true;
+        }
+        if (containerAndSiblingName(container, 'TABLE') || containerAndSiblingName(container, 'HR')) {
+          return isAfterLastNodeInContainer && !start || !isAfterLastNodeInContainer && start;
+        }
+        const walker = new DomTreeWalker(container, parentBlock);
+        if (isText$8(container)) {
+          if (start && normalizedOffset === 0) {
+            walker.prev();
+          } else if (!start && normalizedOffset === container.nodeValue.length) {
+            walker.next();
+          }
+        }
+        while (node = walker.current()) {
+          if (isElement$6(node)) {
+            if (!node.getAttribute('data-mce-bogus')) {
+              name = node.nodeName.toLowerCase();
+              if (nonEmptyElementsMap[name] && name !== 'br') {
+                return false;
+              }
+            }
+          } else if (isText$8(node) && !isWhitespaceText(node.nodeValue)) {
+            return false;
+          }
+          if (start) {
+            walker.prev();
+          } else {
+            walker.next();
+          }
+        }
+        return true;
+      };
+      const insertNewBlockAfter = () => {
+        if (/^(H[1-6]|PRE|FIGURE)$/.test(parentBlockName) && containerBlockName !== 'HGROUP') {
+          newBlock = createNewBlock(newBlockName);
+        } else {
+          newBlock = createNewBlock();
+        }
+        if (shouldEndContainerOnEmptyBlock(editor) && canSplitBlock(dom, containerBlock) && dom.isEmpty(parentBlock)) {
+          newBlock = dom.split(containerBlock, parentBlock);
+        } else {
+          dom.insertAfter(newBlock, parentBlock);
+        }
+        moveToCaretPosition(editor, newBlock);
+      };
+      normalize$2(dom, rng).each(normRng => {
+        rng.setStart(normRng.startContainer, normRng.startOffset);
+        rng.setEnd(normRng.endContainer, normRng.endOffset);
+      });
+      container = rng.startContainer;
+      offset = rng.startOffset;
+      const shiftKey = !!(evt && evt.shiftKey);
+      const ctrlKey = !!(evt && evt.ctrlKey);
+      if (isElement$6(container) && container.hasChildNodes()) {
+        isAfterLastNodeInContainer = offset > container.childNodes.length - 1;
+        container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
+        if (isAfterLastNodeInContainer && isText$8(container)) {
+          offset = container.nodeValue.length;
+        } else {
+          offset = 0;
+        }
+      }
+      const editableRoot = getEditableRoot(dom, container);
+      if (!editableRoot) {
+        return;
+      }
+      if (!shiftKey) {
+        container = wrapSelfAndSiblingsInDefaultBlock(editor, newBlockName, rng, container, offset);
+      }
+      parentBlock = dom.getParent(container, dom.isBlock);
+      containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;
+      parentBlockName = parentBlock ? parentBlock.nodeName.toUpperCase() : '';
+      const containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : '';
+      if (containerBlockName === 'LI' && !ctrlKey) {
+        parentBlock = containerBlock;
+        containerBlock = containerBlock.parentNode;
+        parentBlockName = containerBlockName;
+      }
+      if (/^(LI|DT|DD)$/.test(parentBlockName)) {
+        if (dom.isEmpty(parentBlock)) {
+          insert$3(editor, createNewBlock, containerBlock, parentBlock, newBlockName);
+          return;
+        }
+      }
+      if (parentBlock === editor.getBody()) {
+        return;
+      }
+      if (isCaretContainerBlock$1(parentBlock)) {
+        newBlock = showCaretContainerBlock(parentBlock);
+        if (dom.isEmpty(parentBlock)) {
+          emptyBlock(parentBlock);
+        }
+        setForcedBlockAttrs(editor, newBlock);
+        moveToCaretPosition(editor, newBlock);
+      } else if (isCaretAtStartOrEndOfBlock()) {
+        insertNewBlockAfter();
+      } else if (isCaretAtStartOrEndOfBlock(true)) {
+        newBlock = parentBlock.parentNode.insertBefore(createNewBlock(), parentBlock);
+        moveToCaretPosition(editor, containerAndSiblingName(parentBlock, 'HR') ? newBlock : parentBlock);
+      } else {
+        tmpRng = includeZwspInRange(rng).cloneRange();
+        tmpRng.setEndAfter(parentBlock);
+        fragment = tmpRng.extractContents();
+        trimZwsp(fragment);
+        trimLeadingLineBreaks(fragment);
+        newBlock = fragment.firstChild;
+        dom.insertAfter(fragment, parentBlock);
+        trimInlineElementsOnLeftSideOfBlock(dom, nonEmptyElementsMap, newBlock);
+        addBrToBlockIfNeeded(dom, parentBlock);
+        if (dom.isEmpty(parentBlock)) {
+          emptyBlock(parentBlock);
+        }
+        newBlock.normalize();
+        if (dom.isEmpty(newBlock)) {
+          dom.remove(newBlock);
+          insertNewBlockAfter();
+        } else {
+          setForcedBlockAttrs(editor, newBlock);
+          moveToCaretPosition(editor, newBlock);
+        }
+      }
+      dom.setAttrib(newBlock, 'id', '');
+      editor.dispatch('NewBlock', { newBlock });
+    };
+
+    const hasRightSideContent = (schema, container, parentBlock) => {
+      const walker = new DomTreeWalker(container, parentBlock);
+      let node;
+      const nonEmptyElementsMap = schema.getNonEmptyElements();
+      while (node = walker.next()) {
+        if (nonEmptyElementsMap[node.nodeName.toLowerCase()] || node.length > 0) {
+          return true;
+        }
+      }
+    };
+    const moveSelectionToBr = (editor, brElm, extraBr) => {
+      const rng = editor.dom.createRng();
+      if (!extraBr) {
+        rng.setStartAfter(brElm);
+        rng.setEndAfter(brElm);
+      } else {
+        rng.setStartBefore(brElm);
+        rng.setEndBefore(brElm);
+      }
+      editor.selection.setRng(rng);
+      scrollRangeIntoView(editor, rng);
+    };
+    const insertBrAtCaret = (editor, evt) => {
+      const selection = editor.selection;
+      const dom = editor.dom;
+      const rng = selection.getRng();
+      let brElm;
+      let extraBr;
+      normalize$2(dom, rng).each(normRng => {
+        rng.setStart(normRng.startContainer, normRng.startOffset);
+        rng.setEnd(normRng.endContainer, normRng.endOffset);
+      });
+      let offset = rng.startOffset;
+      let container = rng.startContainer;
+      if (container.nodeType === 1 && container.hasChildNodes()) {
+        const isAfterLastNodeInContainer = offset > container.childNodes.length - 1;
+        container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
+        if (isAfterLastNodeInContainer && container.nodeType === 3) {
+          offset = container.nodeValue.length;
+        } else {
+          offset = 0;
+        }
+      }
+      let parentBlock = dom.getParent(container, dom.isBlock);
+      const containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;
+      const containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : '';
+      const isControlKey = !!(evt && evt.ctrlKey);
+      if (containerBlockName === 'LI' && !isControlKey) {
+        parentBlock = containerBlock;
+      }
+      if (container && container.nodeType === 3 && offset >= container.nodeValue.length) {
+        if (!hasRightSideContent(editor.schema, container, parentBlock)) {
+          brElm = dom.create('br');
+          rng.insertNode(brElm);
+          rng.setStartAfter(brElm);
+          rng.setEndAfter(brElm);
+          extraBr = true;
+        }
+      }
+      brElm = dom.create('br');
+      rangeInsertNode(dom, rng, brElm);
+      moveSelectionToBr(editor, brElm, extraBr);
+      editor.undoManager.add();
+    };
+    const insertBrBefore = (editor, inline) => {
+      const br = SugarElement.fromTag('br');
+      before$3(SugarElement.fromDom(inline), br);
+      editor.undoManager.add();
+    };
+    const insertBrAfter = (editor, inline) => {
+      if (!hasBrAfter(editor.getBody(), inline)) {
+        after$4(SugarElement.fromDom(inline), SugarElement.fromTag('br'));
+      }
+      const br = SugarElement.fromTag('br');
+      after$4(SugarElement.fromDom(inline), br);
+      moveSelectionToBr(editor, br.dom, false);
+      editor.undoManager.add();
+    };
+    const isBeforeBr = pos => {
+      return isBr$5(pos.getNode());
+    };
+    const hasBrAfter = (rootNode, startNode) => {
+      if (isBeforeBr(CaretPosition.after(startNode))) {
+        return true;
+      } else {
+        return nextPosition(rootNode, CaretPosition.after(startNode)).map(pos => {
+          return isBr$5(pos.getNode());
+        }).getOr(false);
+      }
+    };
+    const isAnchorLink = elm => {
+      return elm && elm.nodeName === 'A' && 'href' in elm;
+    };
+    const isInsideAnchor = location => {
+      return location.fold(never, isAnchorLink, isAnchorLink, never);
+    };
+    const readInlineAnchorLocation = editor => {
+      const isInlineTarget$1 = curry(isInlineTarget, editor);
+      const position = CaretPosition.fromRangeStart(editor.selection.getRng());
+      return readLocation(isInlineTarget$1, editor.getBody(), position).filter(isInsideAnchor);
+    };
+    const insertBrOutsideAnchor = (editor, location) => {
+      location.fold(noop, curry(insertBrBefore, editor), curry(insertBrAfter, editor), noop);
+    };
+    const insert$1 = (editor, evt) => {
+      const anchorLocation = readInlineAnchorLocation(editor);
+      if (anchorLocation.isSome()) {
+        anchorLocation.each(curry(insertBrOutsideAnchor, editor));
+      } else {
+        insertBrAtCaret(editor, evt);
+      }
+    };
+
+    const matchesSelector = (editor, selector) => {
+      return getParentBlock$1(editor).filter(parentBlock => {
+        return selector.length > 0 && is$1(SugarElement.fromDom(parentBlock), selector);
+      }).isSome();
+    };
+    const shouldInsertBr = editor => {
+      return matchesSelector(editor, getBrNewLineSelector(editor));
+    };
+    const shouldBlockNewLine$1 = editor => {
+      return matchesSelector(editor, getNoNewLineSelector(editor));
+    };
+
+    const newLineAction = Adt.generate([
+      { br: [] },
+      { block: [] },
+      { none: [] }
+    ]);
+    const shouldBlockNewLine = (editor, _shiftKey) => {
+      return shouldBlockNewLine$1(editor);
+    };
+    const inListBlock = requiredState => {
+      return (editor, _shiftKey) => {
+        return isListItemParentBlock(editor) === requiredState;
+      };
+    };
+    const inBlock = (blockName, requiredState) => (editor, _shiftKey) => {
+      const state = getParentBlockName(editor) === blockName.toUpperCase();
+      return state === requiredState;
+    };
+    const inPreBlock = requiredState => inBlock('pre', requiredState);
+    const inSummaryBlock = () => inBlock('summary', true);
+    const shouldPutBrInPre = requiredState => {
+      return (editor, _shiftKey) => {
+        return shouldPutBrInPre$1(editor) === requiredState;
+      };
+    };
+    const inBrContext = (editor, _shiftKey) => {
+      return shouldInsertBr(editor);
+    };
+    const hasShiftKey = (_editor, shiftKey) => {
+      return shiftKey;
+    };
+    const canInsertIntoEditableRoot = editor => {
+      const forcedRootBlock = getForcedRootBlock(editor);
+      const rootEditable = getEditableRoot$1(editor.dom, editor.selection.getStart());
+      return rootEditable && editor.schema.isValidChild(rootEditable.nodeName, forcedRootBlock);
+    };
+    const match = (predicates, action) => {
+      return (editor, shiftKey) => {
+        const isMatch = foldl(predicates, (res, p) => {
+          return res && p(editor, shiftKey);
+        }, true);
+        return isMatch ? Optional.some(action) : Optional.none();
+      };
+    };
+    const getAction = (editor, evt) => {
+      return evaluateUntil([
+        match([shouldBlockNewLine], newLineAction.none()),
+        match([inSummaryBlock()], newLineAction.br()),
+        match([
+          inPreBlock(true),
+          shouldPutBrInPre(false),
+          hasShiftKey
+        ], newLineAction.br()),
+        match([
+          inPreBlock(true),
+          shouldPutBrInPre(false)
+        ], newLineAction.block()),
+        match([
+          inPreBlock(true),
+          shouldPutBrInPre(true),
+          hasShiftKey
+        ], newLineAction.block()),
+        match([
+          inPreBlock(true),
+          shouldPutBrInPre(true)
+        ], newLineAction.br()),
+        match([
+          inListBlock(true),
+          hasShiftKey
+        ], newLineAction.br()),
+        match([inListBlock(true)], newLineAction.block()),
+        match([inBrContext], newLineAction.br()),
+        match([hasShiftKey], newLineAction.br()),
+        match([canInsertIntoEditableRoot], newLineAction.block())
+      ], [
+        editor,
+        !!(evt && evt.shiftKey)
+      ]).getOr(newLineAction.none());
+    };
+
+    const insert = (editor, evt) => {
+      getAction(editor, evt).fold(() => {
+        if (isNonNullable(evt)) {
+          const event = fireFakeBeforeInputEvent(editor, 'insertLineBreak');
+          if (event.isDefaultPrevented()) {
+            return;
+          }
+        }
+        insert$1(editor, evt);
+        if (isNonNullable(evt)) {
+          fireFakeInputEvent(editor, 'insertLineBreak');
+        }
+      }, () => {
+        if (isNonNullable(evt)) {
+          const event = fireFakeBeforeInputEvent(editor, 'insertParagraph');
+          if (event.isDefaultPrevented()) {
+            return;
+          }
+        }
+        insert$2(editor, evt);
+        if (isNonNullable(evt)) {
+          fireFakeInputEvent(editor, 'insertParagraph');
+        }
+      }, noop);
+    };
+
+    const handleEnterKeyEvent = (editor, event) => {
+      if (event.isDefaultPrevented()) {
+        return;
+      }
+      event.preventDefault();
+      endTypingLevelIgnoreLocks(editor.undoManager);
+      editor.undoManager.transact(() => {
+        if (editor.selection.isCollapsed() === false) {
+          execDeleteCommand(editor);
+        }
+        insert(editor, event);
+      });
+    };
+    const setup$h = editor => {
+      editor.on('keydown', event => {
+        if (event.keyCode === VK.ENTER) {
+          handleEnterKeyEvent(editor, event);
+        }
+      });
+    };
+
+    const executeKeydownOverride$2 = (editor, caret, evt) => {
+      execute([
+        {
+          keyCode: VK.END,
+          action: action(moveToLineEndPoint$1, editor, true)
+        },
+        {
+          keyCode: VK.HOME,
+          action: action(moveToLineEndPoint$1, editor, false)
+        },
+        {
+          keyCode: VK.END,
+          action: action(moveToLineEndPoint, editor, true)
+        },
+        {
+          keyCode: VK.HOME,
+          action: action(moveToLineEndPoint, editor, false)
+        },
+        {
+          keyCode: VK.END,
+          action: action(moveToLineEndPoint$2, editor, true, caret)
+        },
+        {
+          keyCode: VK.HOME,
+          action: action(moveToLineEndPoint$2, editor, false, caret)
+        }
+      ], evt).each(_ => {
+        evt.preventDefault();
+      });
+    };
+    const setup$g = (editor, caret) => {
+      editor.on('keydown', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeydownOverride$2(editor, caret, evt);
+        }
+      });
+    };
+
+    const setup$f = editor => {
+      editor.on('input', e => {
+        if (e.isComposing === false) {
+          normalizeNbspsInEditor(editor);
+        }
+      });
+    };
+
+    const platform = detect$2();
+    const executeKeyupAction = (editor, caret, evt) => {
+      execute([
+        {
+          keyCode: VK.PAGE_UP,
+          action: action(moveToLineEndPoint$2, editor, false, caret)
+        },
+        {
+          keyCode: VK.PAGE_DOWN,
+          action: action(moveToLineEndPoint$2, editor, true, caret)
+        }
+      ], evt);
+    };
+    const stopImmediatePropagation = e => e.stopImmediatePropagation();
+    const isPageUpDown = evt => evt.keyCode === VK.PAGE_UP || evt.keyCode === VK.PAGE_DOWN;
+    const setNodeChangeBlocker = (blocked, editor, block) => {
+      if (block && !blocked.get()) {
+        editor.on('NodeChange', stopImmediatePropagation, true);
+      } else if (!block && blocked.get()) {
+        editor.off('NodeChange', stopImmediatePropagation);
+      }
+      blocked.set(block);
+    };
+    const setup$e = (editor, caret) => {
+      if (platform.os.isMacOS()) {
+        return;
+      }
+      const blocked = Cell(false);
+      editor.on('keydown', evt => {
+        if (isPageUpDown(evt)) {
+          setNodeChangeBlocker(blocked, editor, true);
+        }
+      });
+      editor.on('keyup', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeyupAction(editor, caret, evt);
+        }
+        if (isPageUpDown(evt) && blocked.get()) {
+          setNodeChangeBlocker(blocked, editor, false);
+          editor.nodeChanged();
+        }
+      });
+    };
+
+    const insertTextAtPosition = (text, pos) => {
+      const container = pos.container();
+      const offset = pos.offset();
+      if (isText$8(container)) {
+        container.insertData(offset, text);
+        return Optional.some(CaretPosition(container, offset + text.length));
+      } else {
+        return getElementFromPosition(pos).map(elm => {
+          const textNode = SugarElement.fromText(text);
+          if (pos.isAtEnd()) {
+            after$4(elm, textNode);
+          } else {
+            before$3(elm, textNode);
+          }
+          return CaretPosition(textNode.dom, text.length);
+        });
+      }
+    };
+    const insertNbspAtPosition = curry(insertTextAtPosition, nbsp);
+    const insertSpaceAtPosition = curry(insertTextAtPosition, ' ');
+
+    const locationToCaretPosition = root => location => location.fold(element => prevPosition(root.dom, CaretPosition.before(element)), element => firstPositionIn(element), element => lastPositionIn(element), element => nextPosition(root.dom, CaretPosition.after(element)));
+    const insertInlineBoundarySpaceOrNbsp = (root, pos) => checkPos => needsToHaveNbsp(root, checkPos) ? insertNbspAtPosition(pos) : insertSpaceAtPosition(pos);
+    const setSelection = editor => pos => {
+      editor.selection.setRng(pos.toRange());
+      editor.nodeChanged();
+      return true;
+    };
+    const insertSpaceOrNbspAtSelection = editor => {
+      const pos = CaretPosition.fromRangeStart(editor.selection.getRng());
+      const root = SugarElement.fromDom(editor.getBody());
+      if (editor.selection.isCollapsed()) {
+        const isInlineTarget$1 = curry(isInlineTarget, editor);
+        const caretPosition = CaretPosition.fromRangeStart(editor.selection.getRng());
+        return readLocation(isInlineTarget$1, editor.getBody(), caretPosition).bind(locationToCaretPosition(root)).map(checkPos => () => insertInlineBoundarySpaceOrNbsp(root, pos)(checkPos).each(setSelection(editor)));
+      } else {
+        return Optional.none();
+      }
+    };
+
+    const executeKeydownOverride$1 = (editor, evt) => {
+      executeWithDelayedAction([{
+          keyCode: VK.SPACEBAR,
+          action: action(insertSpaceOrNbspAtSelection, editor)
+        }], evt).each(applyAction => {
+        evt.preventDefault();
+        const event = fireFakeBeforeInputEvent(editor, 'insertText', { data: ' ' });
+        if (!event.isDefaultPrevented()) {
+          applyAction();
+          fireFakeInputEvent(editor, 'insertText', { data: ' ' });
+        }
+      });
+    };
+    const setup$d = editor => {
+      editor.on('keydown', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeydownOverride$1(editor, evt);
+        }
+      });
+    };
+
+    const tableTabNavigation = editor => {
+      if (hasTableTabNavigation(editor)) {
+        return [
+          {
+            keyCode: VK.TAB,
+            action: action(handleTab, editor, true)
+          },
+          {
+            keyCode: VK.TAB,
+            shiftKey: true,
+            action: action(handleTab, editor, false)
+          }
+        ];
+      } else {
+        return [];
+      }
+    };
+    const executeKeydownOverride = (editor, evt) => {
+      execute([...tableTabNavigation(editor)], evt).each(_ => {
+        evt.preventDefault();
+      });
+    };
+    const setup$c = editor => {
+      editor.on('keydown', evt => {
+        if (evt.isDefaultPrevented() === false) {
+          executeKeydownOverride(editor, evt);
+        }
+      });
+    };
+
+    const setup$b = editor => {
+      editor.addShortcut('Meta+P', '', 'mcePrint');
+      setup$j(editor);
+      if (isRtc(editor)) {
+        return Cell(null);
+      } else {
+        const caret = setupSelectedState(editor);
+        setup$l(editor);
+        setup$k(editor, caret);
+        setup$i(editor, caret);
+        setup$h(editor);
+        setup$d(editor);
+        setup$f(editor);
+        setup$c(editor);
+        setup$g(editor, caret);
+        setup$e(editor, caret);
+        return caret;
+      }
+    };
+
+    class NodeChange {
+      constructor(editor) {
+        this.lastPath = [];
+        this.editor = editor;
+        let lastRng;
+        const self = this;
+        if (!('onselectionchange' in editor.getDoc())) {
+          editor.on('NodeChange click mouseup keyup focus', e => {
+            const nativeRng = editor.selection.getRng();
+            const fakeRng = {
+              startContainer: nativeRng.startContainer,
+              startOffset: nativeRng.startOffset,
+              endContainer: nativeRng.endContainer,
+              endOffset: nativeRng.endOffset
+            };
+            if (e.type === 'nodechange' || !isEq$4(fakeRng, lastRng)) {
+              editor.dispatch('SelectionChange');
+            }
+            lastRng = fakeRng;
+          });
+        }
+        editor.on('contextmenu', () => {
+          editor.dispatch('SelectionChange');
+        });
+        editor.on('SelectionChange', () => {
+          const startElm = editor.selection.getStart(true);
+          if (!startElm) {
+            return;
+          }
+          if (hasAnyRanges(editor) && !self.isSameElementPath(startElm) && editor.dom.isChildOf(startElm, editor.getBody())) {
+            editor.nodeChanged({ selectionChange: true });
+          }
+        });
+        editor.on('mouseup', e => {
+          if (!e.isDefaultPrevented() && hasAnyRanges(editor)) {
+            if (editor.selection.getNode().nodeName === 'IMG') {
+              Delay.setEditorTimeout(editor, () => {
+                editor.nodeChanged();
+              });
+            } else {
+              editor.nodeChanged();
+            }
+          }
+        });
+      }
+      nodeChanged(args) {
+        const selection = this.editor.selection;
+        let node, parents, root;
+        if (this.editor.initialized && selection && !shouldDisableNodeChange(this.editor) && !this.editor.mode.isReadOnly()) {
+          root = this.editor.getBody();
+          node = selection.getStart(true) || root;
+          if (node.ownerDocument !== this.editor.getDoc() || !this.editor.dom.isChildOf(node, root)) {
+            node = root;
+          }
+          parents = [];
+          this.editor.dom.getParent(node, node => {
+            if (node === root) {
+              return true;
+            }
+            parents.push(node);
+          });
+          args = args || {};
+          args.element = node;
+          args.parents = parents;
+          this.editor.dispatch('NodeChange', args);
+        }
+      }
+      isSameElementPath(startElm) {
+        let i;
+        const editor = this.editor;
+        const currentPath = reverse(editor.dom.getParents(startElm, always, editor.getBody()));
+        if (currentPath.length === this.lastPath.length) {
+          for (i = currentPath.length; i >= 0; i--) {
+            if (currentPath[i] !== this.lastPath[i]) {
+              break;
+            }
+          }
+          if (i === -1) {
+            this.lastPath = currentPath;
+            return true;
+          }
+        }
+        this.lastPath = currentPath;
+        return false;
+      }
+    }
+
+    const internalMimeType = 'x-tinymce/html';
+    const internalHtmlMime = constant(internalMimeType);
+    const internalMark = '<!-- ' + internalMimeType + ' -->';
+    const mark = html => internalMark + html;
+    const unmark = html => html.replace(internalMark, '');
+    const isMarked = html => html.indexOf(internalMark) !== -1;
+
+    const isPlainText = text => {
+      return !/<(?:\/?(?!(?:div|p|br|span)>)\w+|(?:(?!(?:span style="white-space:\s?pre;?">)|br\s?\/>))\w+\s[^>]+)>/i.test(text);
+    };
+    const openContainer = (rootTag, rootAttrs) => {
+      let tag = '<' + rootTag;
+      const attrs = mapToArray(rootAttrs, (value, key) => key + '="' + Entities.encodeAllRaw(value) + '"');
+      if (attrs.length) {
+        tag += ' ' + attrs.join(' ');
+      }
+      return tag + '>';
+    };
+    const toBlockElements = (text, rootTag, rootAttrs) => {
+      const blocks = text.split(/\n\n/);
+      const tagOpen = openContainer(rootTag, rootAttrs);
+      const tagClose = '</' + rootTag + '>';
+      const paragraphs = map$3(blocks, p => {
+        return p.split(/\n/).join('<br />');
+      });
+      const stitch = p => {
+        return tagOpen + p + tagClose;
+      };
+      return paragraphs.length === 1 ? paragraphs[0] : map$3(paragraphs, stitch).join('');
+    };
+
+    const pasteBinDefaultContent = '%MCEPASTEBIN%';
+    const create$6 = (editor, lastRngCell) => {
+      const {dom, selection} = editor;
+      const body = editor.getBody();
+      lastRngCell.set(selection.getRng());
+      const pasteBinElm = dom.add(editor.getBody(), 'div', {
+        'id': 'mcepastebin',
+        'class': 'mce-pastebin',
+        'contentEditable': true,
+        'data-mce-bogus': 'all',
+        'style': 'position: fixed; top: 50%; width: 10px; height: 10px; overflow: hidden; opacity: 0'
+      }, pasteBinDefaultContent);
+      if (Env.browser.isFirefox()) {
+        dom.setStyle(pasteBinElm, 'left', dom.getStyle(body, 'direction', true) === 'rtl' ? 65535 : -65535);
+      }
+      dom.bind(pasteBinElm, 'beforedeactivate focusin focusout', e => {
+        e.stopPropagation();
+      });
+      pasteBinElm.focus();
+      selection.select(pasteBinElm, true);
+    };
+    const remove = (editor, lastRngCell) => {
+      const dom = editor.dom;
+      if (getEl(editor)) {
+        let pasteBinClone;
+        const lastRng = lastRngCell.get();
+        while (pasteBinClone = getEl(editor)) {
+          dom.remove(pasteBinClone);
+          dom.unbind(pasteBinClone);
+        }
+        if (lastRng) {
+          editor.selection.setRng(lastRng);
+        }
+      }
+      lastRngCell.set(null);
+    };
+    const getEl = editor => editor.dom.get('mcepastebin');
+    const isPasteBin = elm => elm && elm.id === 'mcepastebin';
+    const getHtml = editor => {
+      const dom = editor.dom;
+      const copyAndRemove = (toElm, fromElm) => {
+        toElm.appendChild(fromElm);
+        dom.remove(fromElm, true);
+      };
+      const [pasteBinElm, ...pasteBinClones] = filter$6(editor.getBody().childNodes, isPasteBin);
+      each$g(pasteBinClones, pasteBinClone => {
+        copyAndRemove(pasteBinElm, pasteBinClone);
+      });
+      const dirtyWrappers = dom.select('div[id=mcepastebin]', pasteBinElm);
+      for (let i = dirtyWrappers.length - 1; i >= 0; i--) {
+        const cleanWrapper = dom.create('div');
+        pasteBinElm.insertBefore(cleanWrapper, dirtyWrappers[i]);
+        copyAndRemove(cleanWrapper, dirtyWrappers[i]);
+      }
+      return pasteBinElm ? pasteBinElm.innerHTML : '';
+    };
+    const isDefaultPasteBinContent = content => content === pasteBinDefaultContent;
+    const PasteBin = editor => {
+      const lastRng = Cell(null);
+      return {
+        create: () => create$6(editor, lastRng),
+        remove: () => remove(editor, lastRng),
+        getEl: () => getEl(editor),
+        getHtml: () => getHtml(editor),
+        getLastRng: lastRng.get
+      };
+    };
+
+    const filter = (content, items) => {
+      Tools.each(items, v => {
+        if (is$4(v, RegExp)) {
+          content = content.replace(v, '');
+        } else {
+          content = content.replace(v[0], v[1]);
+        }
+      });
+      return content;
+    };
+    const innerText = html => {
+      const schema = Schema();
+      const domParser = DomParser({}, schema);
+      let text = '';
+      const voidElements = schema.getVoidElements();
+      const ignoreElements = Tools.makeMap('script noscript style textarea video audio iframe object', ' ');
+      const blockElements = schema.getBlockElements();
+      const walk = node => {
+        const name = node.name, currentNode = node;
+        if (name === 'br') {
+          text += '\n';
+          return;
+        }
+        if (name === 'wbr') {
+          return;
+        }
+        if (voidElements[name]) {
+          text += ' ';
+        }
+        if (ignoreElements[name]) {
+          text += ' ';
+          return;
+        }
+        if (node.type === 3) {
+          text += node.value;
+        }
+        if (!(node.name in schema.getVoidElements())) {
+          if (node = node.firstChild) {
+            do {
+              walk(node);
+            } while (node = node.next);
+          }
+        }
+        if (blockElements[name] && currentNode.next) {
+          text += '\n';
+          if (name === 'p') {
+            text += '\n';
+          }
+        }
+      };
+      html = filter(html, [/<!\[[^\]]+\]>/g]);
+      walk(domParser.parse(html));
+      return text;
+    };
+    const trimHtml = html => {
+      const trimSpaces = (all, s1, s2) => {
+        if (!s1 && !s2) {
+          return ' ';
+        }
+        return nbsp;
+      };
+      html = filter(html, [
+        /^[\s\S]*<body[^>]*>\s*|\s*<\/body[^>]*>[\s\S]*$/ig,
+        /<!--StartFragment-->|<!--EndFragment-->/g,
+        [
+          /( ?)<span class="Apple-converted-space">\u00a0<\/span>( ?)/g,
+          trimSpaces
+        ],
+        /<br class="Apple-interchange-newline">/g,
+        /<br>$/i
+      ]);
+      return html;
+    };
+    const createIdGenerator = prefix => {
+      let count = 0;
+      return () => {
+        return prefix + count++;
+      };
+    };
+    const getImageMimeType = ext => {
+      const lowerExt = ext.toLowerCase();
+      const mimeOverrides = {
+        jpg: 'jpeg',
+        jpe: 'jpeg',
+        jfi: 'jpeg',
+        jif: 'jpeg',
+        jfif: 'jpeg',
+        pjpeg: 'jpeg',
+        pjp: 'jpeg',
+        svg: 'svg+xml'
+      };
+      return Tools.hasOwn(mimeOverrides, lowerExt) ? 'image/' + mimeOverrides[lowerExt] : 'image/' + lowerExt;
+    };
+
+    const preProcess = (editor, html) => {
+      const parser = DomParser({}, editor.schema);
+      parser.addNodeFilter('meta', nodes => {
+        Tools.each(nodes, node => {
+          node.remove();
+        });
+      });
+      const fragment = parser.parse(html, {
+        forced_root_block: false,
+        isRootContent: true
+      });
+      return HtmlSerializer({ validate: true }, editor.schema).serialize(fragment);
+    };
+    const processResult = (content, cancelled) => ({
+      content,
+      cancelled
+    });
+    const postProcessFilter = (editor, html, internal) => {
+      const tempBody = editor.dom.create('div', { style: 'display:none' }, html);
+      const postProcessArgs = firePastePostProcess(editor, tempBody, internal);
+      return processResult(postProcessArgs.node.innerHTML, postProcessArgs.isDefaultPrevented());
+    };
+    const filterContent = (editor, content, internal) => {
+      const preProcessArgs = firePastePreProcess(editor, content, internal);
+      const filteredContent = preProcess(editor, preProcessArgs.content);
+      if (editor.hasEventListeners('PastePostProcess') && !preProcessArgs.isDefaultPrevented()) {
+        return postProcessFilter(editor, filteredContent, internal);
+      } else {
+        return processResult(filteredContent, preProcessArgs.isDefaultPrevented());
+      }
+    };
+    const process = (editor, html, internal) => {
+      return filterContent(editor, html, internal);
+    };
+
+    const pasteHtml$1 = (editor, html) => {
+      editor.insertContent(html, {
+        merge: shouldPasteMergeFormats(editor),
+        paste: true
+      });
+      return true;
+    };
+    const isAbsoluteUrl = url => /^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(url);
+    const isImageUrl = (editor, url) => {
+      return isAbsoluteUrl(url) && exists(getAllowedImageFileTypes(editor), type => endsWith(url.toLowerCase(), `.${ type.toLowerCase() }`));
+    };
+    const createImage = (editor, url, pasteHtmlFn) => {
+      editor.undoManager.extra(() => {
+        pasteHtmlFn(editor, url);
+      }, () => {
+        editor.insertContent('<img src="' + url + '">');
+      });
+      return true;
+    };
+    const createLink = (editor, url, pasteHtmlFn) => {
+      editor.undoManager.extra(() => {
+        pasteHtmlFn(editor, url);
+      }, () => {
+        editor.execCommand('mceInsertLink', false, url);
+      });
+      return true;
+    };
+    const linkSelection = (editor, html, pasteHtmlFn) => !editor.selection.isCollapsed() && isAbsoluteUrl(html) ? createLink(editor, html, pasteHtmlFn) : false;
+    const insertImage = (editor, html, pasteHtmlFn) => isImageUrl(editor, html) ? createImage(editor, html, pasteHtmlFn) : false;
+    const smartInsertContent = (editor, html) => {
+      Tools.each([
+        linkSelection,
+        insertImage,
+        pasteHtml$1
+      ], action => {
+        return action(editor, html, pasteHtml$1) !== true;
+      });
+    };
+    const insertContent = (editor, html, pasteAsText) => {
+      if (pasteAsText || !isSmartPasteEnabled(editor)) {
+        pasteHtml$1(editor, html);
+      } else {
+        smartInsertContent(editor, html);
+      }
+    };
+
+    const uniqueId = createIdGenerator('mceclip');
+    const doPaste = (editor, content, internal, pasteAsText) => {
+      const args = process(editor, content, internal);
+      if (args.cancelled === false) {
+        insertContent(editor, args.content, pasteAsText);
+      }
+    };
+    const pasteHtml = (editor, html, internalFlag) => {
+      const internal = internalFlag ? internalFlag : isMarked(html);
+      doPaste(editor, unmark(html), internal, false);
+    };
+    const pasteText = (editor, text) => {
+      const encodedText = editor.dom.encode(text).replace(/\r\n/g, '\n');
+      const normalizedText = normalize$4(encodedText, getPasteTabSpaces(editor));
+      const html = toBlockElements(normalizedText, getForcedRootBlock(editor), getForcedRootBlockAttrs(editor));
+      doPaste(editor, html, false, true);
+    };
+    const getDataTransferItems = dataTransfer => {
+      const items = {};
+      if (dataTransfer && dataTransfer.types) {
+        for (let i = 0; i < dataTransfer.types.length; i++) {
+          const contentType = dataTransfer.types[i];
+          try {
+            items[contentType] = dataTransfer.getData(contentType);
+          } catch (ex) {
+            items[contentType] = '';
+          }
+        }
+      }
+      return items;
+    };
+    const hasContentType = (clipboardContent, mimeType) => mimeType in clipboardContent && clipboardContent[mimeType].length > 0;
+    const hasHtmlOrText = content => hasContentType(content, 'text/html') || hasContentType(content, 'text/plain');
+    const extractFilename = (editor, str) => {
+      const m = str.match(/([\s\S]+?)(?:\.[a-z0-9.]+)$/i);
+      return isNonNullable(m) ? editor.dom.encode(m[1]) : null;
+    };
+    const createBlobInfo = (editor, blobCache, file, base64) => {
+      const id = uniqueId();
+      const useFileName = shouldReuseFileName(editor) && isNonNullable(file.name);
+      const name = useFileName ? extractFilename(editor, file.name) : id;
+      const filename = useFileName ? file.name : undefined;
+      const blobInfo = blobCache.create(id, file, base64, name, filename);
+      blobCache.add(blobInfo);
+      return blobInfo;
+    };
+    const pasteImage = (editor, imageItem) => {
+      const {
+        data: base64,
+        type
+      } = parseDataUri$1(imageItem.uri);
+      const file = imageItem.file;
+      const blobCache = editor.editorUpload.blobCache;
+      const existingBlobInfo = blobCache.getByData(base64, type);
+      const blobInfo = existingBlobInfo !== null && existingBlobInfo !== void 0 ? existingBlobInfo : createBlobInfo(editor, blobCache, file, base64);
+      pasteHtml(editor, `<img src="${ blobInfo.blobUri() }">`, false);
+    };
+    const isClipboardEvent = event => event.type === 'paste';
+    const readFilesAsDataUris = items => Promise.all(map$3(items, file => {
+      return blobToDataUri(file).then(uri => ({
+        file,
+        uri
+      }));
+    }));
+    const isImage = editor => {
+      const allowedExtensions = getAllowedImageFileTypes(editor);
+      return file => startsWith(file.type, 'image/') && exists(allowedExtensions, extension => {
+        return getImageMimeType(extension) === file.type;
+      });
+    };
+    const getImagesFromDataTransfer = (editor, dataTransfer) => {
+      const items = dataTransfer.items ? bind$3(from(dataTransfer.items), item => {
+        return item.kind === 'file' ? [item.getAsFile()] : [];
+      }) : [];
+      const files = dataTransfer.files ? from(dataTransfer.files) : [];
+      return filter$6(items.length > 0 ? items : files, isImage(editor));
+    };
+    const pasteImageData = (editor, e, rng) => {
+      const dataTransfer = isClipboardEvent(e) ? e.clipboardData : e.dataTransfer;
+      if (shouldPasteDataImages(editor) && dataTransfer) {
+        const images = getImagesFromDataTransfer(editor, dataTransfer);
+        if (images.length > 0) {
+          e.preventDefault();
+          readFilesAsDataUris(images).then(fileResults => {
+            if (rng) {
+              editor.selection.setRng(rng);
+            }
+            each$g(fileResults, result => {
+              pasteImage(editor, result);
+            });
+          });
+          return true;
+        }
+      }
+      return false;
+    };
+    const isBrokenAndroidClipboardEvent = e => {
+      var _a, _b;
+      return Env.os.isAndroid() && ((_b = (_a = e.clipboardData) === null || _a === void 0 ? void 0 : _a.items) === null || _b === void 0 ? void 0 : _b.length) === 0;
+    };
+    const isKeyboardPasteEvent = e => VK.metaKeyPressed(e) && e.keyCode === 86 || e.shiftKey && e.keyCode === 45;
+    const insertClipboardContent = (editor, clipboardContent, html, plainTextMode) => {
+      let content = trimHtml(html);
+      const isInternal = hasContentType(clipboardContent, internalHtmlMime()) || isMarked(html);
+      const isPlainTextHtml = !isInternal && isPlainText(content);
+      const isAbsoluteUrl$1 = isAbsoluteUrl(content);
+      if (isDefaultPasteBinContent(content) || !content.length || isPlainTextHtml && !isAbsoluteUrl$1) {
+        plainTextMode = true;
+      }
+      if (plainTextMode || isAbsoluteUrl$1) {
+        if (hasContentType(clipboardContent, 'text/plain') && isPlainTextHtml) {
+          content = clipboardContent['text/plain'];
+        } else {
+          content = innerText(content);
+        }
+      }
+      if (isDefaultPasteBinContent(content)) {
+        return;
+      }
+      if (plainTextMode) {
+        pasteText(editor, content);
+      } else {
+        pasteHtml(editor, content, isInternal);
+      }
+    };
+    const registerEventHandlers = (editor, pasteBin, pasteFormat) => {
+      let keyboardPastePlainTextState;
+      const getLastRng = () => pasteBin.getLastRng() || editor.selection.getRng();
+      editor.on('keydown', e => {
+        if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) {
+          keyboardPastePlainTextState = e.shiftKey && e.keyCode === 86;
+        }
+      });
+      editor.on('paste', e => {
+        if (e.isDefaultPrevented() || isBrokenAndroidClipboardEvent(e)) {
+          return;
+        }
+        const plainTextMode = pasteFormat.get() === 'text' || keyboardPastePlainTextState;
+        keyboardPastePlainTextState = false;
+        const clipboardContent = getDataTransferItems(e.clipboardData);
+        if (!hasHtmlOrText(clipboardContent) && pasteImageData(editor, e, getLastRng())) {
+          return;
+        }
+        if (hasContentType(clipboardContent, 'text/html')) {
+          e.preventDefault();
+          insertClipboardContent(editor, clipboardContent, clipboardContent['text/html'], plainTextMode);
+        } else {
+          pasteBin.create();
+          Delay.setEditorTimeout(editor, () => {
+            const html = pasteBin.getHtml();
+            pasteBin.remove();
+            insertClipboardContent(editor, clipboardContent, html, plainTextMode);
+          }, 0);
+        }
+      });
+    };
+    const registerDataImageFilter = editor => {
+      const isWebKitFakeUrl = src => startsWith(src, 'webkit-fake-url');
+      const isDataUri = src => startsWith(src, 'data:');
+      const isPasteInsert = args => {
+        var _a;
+        return ((_a = args.data) === null || _a === void 0 ? void 0 : _a.paste) === true;
+      };
+      editor.parser.addNodeFilter('img', (nodes, name, args) => {
+        if (!shouldPasteDataImages(editor) && isPasteInsert(args)) {
+          for (const node of nodes) {
+            const src = node.attr('src');
+            if (isString(src) && !node.attr('data-mce-object') && src !== Env.transparentSrc) {
+              if (isWebKitFakeUrl(src)) {
+                node.remove();
+              } else if (!shouldAllowHtmlDataUrls(editor) && isDataUri(src)) {
+                node.remove();
+              }
+            }
+          }
+        }
+      });
+    };
+    const registerEventsAndFilters = (editor, pasteBin, pasteFormat) => {
+      registerEventHandlers(editor, pasteBin, pasteFormat);
+      registerDataImageFilter(editor);
+    };
+
+    const togglePlainTextPaste = (editor, pasteFormat) => {
+      if (pasteFormat.get() === 'text') {
+        pasteFormat.set('html');
+        firePastePlainTextToggle(editor, false);
+      } else {
+        pasteFormat.set('text');
+        firePastePlainTextToggle(editor, true);
+      }
+      editor.focus();
+    };
+    const register$1 = (editor, pasteFormat) => {
+      editor.addCommand('mceTogglePlainTextPaste', () => {
+        togglePlainTextPaste(editor, pasteFormat);
+      });
+      editor.addCommand('mceInsertClipboardContent', (ui, value) => {
+        if (value.html) {
+          pasteHtml(editor, value.html, value.internal);
+        }
+        if (value.text) {
+          pasteText(editor, value.text);
+        }
+      });
+    };
+
+    const setHtml5Clipboard = (clipboardData, html, text) => {
+      try {
+        clipboardData.clearData();
+        clipboardData.setData('text/html', html);
+        clipboardData.setData('text/plain', text);
+        clipboardData.setData(internalHtmlMime(), html);
+        return true;
+      } catch (e) {
+        return false;
+      }
+    };
+    const setClipboardData = (evt, data, fallback, done) => {
+      if (setHtml5Clipboard(evt.clipboardData, data.html, data.text)) {
+        evt.preventDefault();
+        done();
+      } else {
+        fallback(data.html, done);
+      }
+    };
+    const fallback = editor => (html, done) => {
+      const {dom, selection} = editor;
+      const outer = dom.create('div', {
+        'contenteditable': 'false',
+        'data-mce-bogus': 'all'
+      });
+      const inner = dom.create('div', { contenteditable: 'true' }, html);
+      dom.setStyles(outer, {
+        position: 'fixed',
+        top: '0',
+        left: '-3000px',
+        width: '1000px',
+        overflow: 'hidden'
+      });
+      outer.appendChild(inner);
+      dom.add(editor.getBody(), outer);
+      const range = selection.getRng();
+      inner.focus();
+      const offscreenRange = dom.createRng();
+      offscreenRange.selectNodeContents(inner);
+      selection.setRng(offscreenRange);
+      Delay.setEditorTimeout(editor, () => {
+        selection.setRng(range);
+        dom.remove(outer);
+        done();
+      }, 0);
+    };
+    const getData = editor => ({
+      html: mark(editor.selection.getContent({ contextual: true })),
+      text: editor.selection.getContent({ format: 'text' })
+    });
+    const isTableSelection = editor => !!editor.dom.getParent(editor.selection.getStart(), 'td[data-mce-selected],th[data-mce-selected]', editor.getBody());
+    const hasSelectedContent = editor => !editor.selection.isCollapsed() || isTableSelection(editor);
+    const cut = editor => evt => {
+      if (!evt.isDefaultPrevented() && hasSelectedContent(editor)) {
+        setClipboardData(evt, getData(editor), fallback(editor), () => {
+          if (Env.browser.isChromium() || Env.browser.isFirefox()) {
+            const rng = editor.selection.getRng();
+            Delay.setEditorTimeout(editor, () => {
+              editor.selection.setRng(rng);
+              editor.execCommand('Delete');
+            }, 0);
+          } else {
+            editor.execCommand('Delete');
+          }
+        });
+      }
+    };
+    const copy = editor => evt => {
+      if (!evt.isDefaultPrevented() && hasSelectedContent(editor)) {
+        setClipboardData(evt, getData(editor), fallback(editor), noop);
+      }
+    };
+    const register = editor => {
+      editor.on('cut', cut(editor));
+      editor.on('copy', copy(editor));
+    };
+
+    const getCaretRangeFromEvent = (editor, e) => {
+      var _a, _b;
+      return RangeUtils.getCaretRangeFromPoint((_a = e.clientX) !== null && _a !== void 0 ? _a : 0, (_b = e.clientY) !== null && _b !== void 0 ? _b : 0, editor.getDoc());
+    };
+    const isPlainTextFileUrl = content => {
+      const plainTextContent = content['text/plain'];
+      return plainTextContent ? plainTextContent.indexOf('file://') === 0 : false;
+    };
+    const setFocusedRange = (editor, rng) => {
+      editor.focus();
+      if (rng) {
+        editor.selection.setRng(rng);
+      }
+    };
+    const hasImage = dataTransfer => exists(dataTransfer.files, file => /^image\//.test(file.type));
+    const setup$a = (editor, draggingInternallyState) => {
+      if (shouldPasteBlockDrop(editor)) {
+        editor.on('dragend dragover draggesture dragdrop drop drag', e => {
+          e.preventDefault();
+          e.stopPropagation();
+        });
+      }
+      if (!shouldPasteDataImages(editor)) {
+        editor.on('drop', e => {
+          const dataTransfer = e.dataTransfer;
+          if (dataTransfer && hasImage(dataTransfer)) {
+            e.preventDefault();
+          }
+        });
+      }
+      editor.on('drop', e => {
+        if (e.isDefaultPrevented() || draggingInternallyState.get()) {
+          return;
+        }
+        const rng = getCaretRangeFromEvent(editor, e);
+        if (isNullable(rng)) {
+          return;
+        }
+        const dropContent = getDataTransferItems(e.dataTransfer);
+        const internal = hasContentType(dropContent, internalHtmlMime());
+        if ((!hasHtmlOrText(dropContent) || isPlainTextFileUrl(dropContent)) && pasteImageData(editor, e, rng)) {
+          return;
+        }
+        const internalContent = dropContent[internalHtmlMime()];
+        const content = internalContent || dropContent['text/html'] || dropContent['text/plain'];
+        if (content) {
+          e.preventDefault();
+          Delay.setEditorTimeout(editor, () => {
+            editor.undoManager.transact(() => {
+              if (internalContent) {
+                editor.execCommand('Delete');
+              }
+              setFocusedRange(editor, rng);
+              const trimmedContent = trimHtml(content);
+              if (dropContent['text/html']) {
+                pasteHtml(editor, trimmedContent, internal);
+              } else {
+                pasteText(editor, trimmedContent);
+              }
+            });
+          });
+        }
+      });
+      editor.on('dragstart', _e => {
+        draggingInternallyState.set(true);
+      });
+      editor.on('dragover dragend', e => {
+        if (shouldPasteDataImages(editor) && draggingInternallyState.get() === false) {
+          e.preventDefault();
+          setFocusedRange(editor, getCaretRangeFromEvent(editor, e));
+        }
+        if (e.type === 'dragend') {
+          draggingInternallyState.set(false);
+        }
+      });
+    };
+
+    const setup$9 = editor => {
+      const processEvent = f => e => {
+        f(editor, e);
+      };
+      const preProcess = getPastePreProcess(editor);
+      if (isFunction(preProcess)) {
+        editor.on('PastePreProcess', processEvent(preProcess));
+      }
+      const postProcess = getPastePostProcess(editor);
+      if (isFunction(postProcess)) {
+        editor.on('PastePostProcess', processEvent(postProcess));
+      }
+    };
+
+    const addPreProcessFilter = (editor, filterFunc) => {
+      editor.on('PastePreProcess', e => {
+        e.content = filterFunc(editor, e.content, e.internal);
+      });
+    };
+    const rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi;
+    const rgbToHex = value => Tools.trim(value).replace(rgbRegExp, rgbaToHexString).toLowerCase();
+    const removeWebKitStyles = (editor, content, internal) => {
+      const webKitStylesOption = getPasteWebkitStyles(editor);
+      if (internal || webKitStylesOption === 'all' || !shouldPasteRemoveWebKitStyles(editor)) {
+        return content;
+      }
+      const webKitStyles = webKitStylesOption ? webKitStylesOption.split(/[, ]/) : [];
+      if (webKitStyles && webKitStylesOption !== 'none') {
+        const dom = editor.dom, node = editor.selection.getNode();
+        content = content.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi, (all, before, value, after) => {
+          const inputStyles = dom.parseStyle(dom.decode(value));
+          const outputStyles = {};
+          for (let i = 0; i < webKitStyles.length; i++) {
+            const inputValue = inputStyles[webKitStyles[i]];
+            let compareInput = inputValue;
+            let currentValue = dom.getStyle(node, webKitStyles[i], true);
+            if (/color/.test(webKitStyles[i])) {
+              compareInput = rgbToHex(compareInput);
+              currentValue = rgbToHex(currentValue);
+            }
+            if (currentValue !== compareInput) {
+              outputStyles[webKitStyles[i]] = inputValue;
+            }
+          }
+          const outputStyle = dom.serializeStyle(outputStyles, 'span');
+          if (outputStyle) {
+            return before + ' style="' + outputStyle + '"' + after;
+          }
+          return before + after;
+        });
+      } else {
+        content = content.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi, '$1$3');
+      }
+      content = content.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi, (all, before, value, after) => {
+        return before + ' style="' + value + '"' + after;
+      });
+      return content;
+    };
+    const setup$8 = editor => {
+      if (Env.browser.isChromium() || Env.browser.isSafari()) {
+        addPreProcessFilter(editor, removeWebKitStyles);
+      }
+    };
+
+    const setup$7 = editor => {
+      const draggingInternallyState = Cell(false);
+      const pasteFormat = Cell(isPasteAsTextEnabled(editor) ? 'text' : 'html');
+      const pasteBin = PasteBin(editor);
+      setup$8(editor);
+      register$1(editor, pasteFormat);
+      setup$9(editor);
+      editor.on('PreInit', () => {
+        register(editor);
+        setup$a(editor, draggingInternallyState);
+        registerEventsAndFilters(editor, pasteBin, pasteFormat);
+      });
+    };
+
+    const preventSummaryToggle = editor => {
+      editor.on('click', e => {
+        if (editor.dom.getParent(e.target, 'details')) {
+          e.preventDefault();
+        }
+      });
+    };
+    const filterDetails = editor => {
+      editor.parser.addNodeFilter('details', elms => {
+        each$g(elms, details => {
+          details.attr('data-mce-open', details.attr('open'));
+          details.attr('open', 'open');
+        });
+      });
+      editor.serializer.addNodeFilter('details', elms => {
+        each$g(elms, details => {
+          const open = details.attr('data-mce-open');
+          details.attr('open', isString(open) ? open : null);
+          details.attr('data-mce-open', null);
+        });
+      });
+    };
+    const setup$6 = editor => {
+      preventSummaryToggle(editor);
+      filterDetails(editor);
+    };
+
+    const isTextBlockNode = node => isElement$6(node) && isTextBlock$2(SugarElement.fromDom(node));
+    const normalizeSelection = editor => {
+      const rng = editor.selection.getRng();
+      const startPos = CaretPosition.fromRangeStart(rng);
+      const endPos = CaretPosition.fromRangeEnd(rng);
+      if (CaretPosition.isElementPosition(startPos)) {
+        const container = startPos.container();
+        if (isTextBlockNode(container)) {
+          firstPositionIn(container).each(pos => rng.setStart(pos.container(), pos.offset()));
+        }
+      }
+      if (CaretPosition.isElementPosition(endPos)) {
+        const container = startPos.container();
+        if (isTextBlockNode(container)) {
+          lastPositionIn(container).each(pos => rng.setEnd(pos.container(), pos.offset()));
+        }
+      }
+      editor.selection.setRng(normalize(rng));
+    };
+    const setup$5 = editor => {
+      editor.on('click', e => {
+        if (e.detail >= 3) {
+          normalizeSelection(editor);
+        }
+      });
+    };
+
+    var FakeCaretPosition;
+    (function (FakeCaretPosition) {
+      FakeCaretPosition['Before'] = 'before';
+      FakeCaretPosition['After'] = 'after';
+    }(FakeCaretPosition || (FakeCaretPosition = {})));
+    const distanceToRectLeft = (clientRect, clientX) => Math.abs(clientRect.left - clientX);
+    const distanceToRectRight = (clientRect, clientX) => Math.abs(clientRect.right - clientX);
+    const isInsideY = (clientY, clientRect) => clientY >= clientRect.top && clientY <= clientRect.bottom;
+    const collidesY = (r1, r2) => r1.top < r2.bottom && r1.bottom > r2.top;
+    const isOverlapping = (r1, r2) => {
+      const overlap = overlapY(r1, r2) / Math.min(r1.height, r2.height);
+      return collidesY(r1, r2) && overlap > 0.5;
+    };
+    const splitRectsPerAxis = (rects, y) => {
+      const intersectingRects = filter$6(rects, rect => isInsideY(y, rect));
+      return boundingClientRectFromRects(intersectingRects).fold(() => [
+        [],
+        rects
+      ], boundingRect => {
+        const {
+          pass: horizontal,
+          fail: vertical
+        } = partition$2(rects, rect => isOverlapping(rect, boundingRect));
+        return [
+          horizontal,
+          vertical
+        ];
+      });
+    };
+    const clientInfo = (rect, clientX) => {
+      return {
+        node: rect.node,
+        position: distanceToRectLeft(rect, clientX) < distanceToRectRight(rect, clientX) ? FakeCaretPosition.Before : FakeCaretPosition.After
+      };
+    };
+    const horizontalDistance = (rect, x, _y) => x > rect.left && x < rect.right ? 0 : Math.min(Math.abs(rect.left - x), Math.abs(rect.right - x));
+    const closestChildCaretCandidateNodeRect = (children, clientX, clientY) => {
+      const caretCandidateRect = rect => {
+        if (isCaretCandidate$3(rect.node)) {
+          return Optional.some(rect);
+        } else if (isElement$6(rect.node)) {
+          return closestChildCaretCandidateNodeRect(from(rect.node.childNodes), clientX, clientY);
+        } else {
+          return Optional.none();
+        }
+      };
+      const getClosestTextNode = (rects, distance) => {
+        if (rects.length >= 2) {
+          const r1 = caretCandidateRect(rects[0]).getOr(rects[0]);
+          const r2 = caretCandidateRect(rects[1]).getOr(rects[1]);
+          const deltaDistance = Math.abs(distance(r1, clientX, clientY) - distance(r2, clientX, clientY));
+          if (deltaDistance < 2) {
+            if (isText$8(r1.node)) {
+              return Optional.some(r1);
+            } else if (isText$8(r2.node)) {
+              return Optional.some(r2);
+            }
+          }
+        }
+        return Optional.none();
+      };
+      const findClosestCaretCandidateNodeRect = (rects, distance) => {
+        const sortedRects = sort(rects, (r1, r2) => distance(r1, clientX, clientY) - distance(r2, clientX, clientY));
+        return getClosestTextNode(sortedRects, distance).orThunk(() => findMap(sortedRects, caretCandidateRect));
+      };
+      const [horizontalRects, verticalRects] = splitRectsPerAxis(getClientRects(children), clientY);
+      const {
+        pass: above,
+        fail: below
+      } = partition$2(verticalRects, rect => rect.top < clientY);
+      return findClosestCaretCandidateNodeRect(horizontalRects, horizontalDistance).orThunk(() => findClosestCaretCandidateNodeRect(below, distanceToRectEdgeFromXY)).orThunk(() => findClosestCaretCandidateNodeRect(above, distanceToRectEdgeFromXY));
+    };
+    const traverseUp = (rootElm, scope, clientX, clientY) => {
+      const helper = (scope, prevScope) => {
+        return prevScope.fold(() => closestChildCaretCandidateNodeRect(from(scope.dom.childNodes), clientX, clientY), prevScope => {
+          const uncheckedChildren = filter$6(from(scope.dom.childNodes), node => node !== prevScope.dom);
+          return closestChildCaretCandidateNodeRect(uncheckedChildren, clientX, clientY);
+        }).orThunk(() => {
+          const parent = eq(scope, rootElm) ? Optional.none() : parentElement(scope);
+          return parent.bind(newScope => helper(newScope, Optional.some(scope)));
+        });
+      };
+      return helper(scope, Optional.none());
+    };
+    const closestCaretCandidateNodeRect = (root, clientX, clientY) => {
+      const rootElm = SugarElement.fromDom(root);
+      const ownerDoc = documentOrOwner(rootElm);
+      const elementAtPoint = SugarElement.fromPoint(ownerDoc, clientX, clientY).filter(elm => contains(rootElm, elm));
+      const element = elementAtPoint.getOr(rootElm);
+      return traverseUp(rootElm, element, clientX, clientY);
+    };
+    const closestFakeCaretCandidate = (root, clientX, clientY) => closestCaretCandidateNodeRect(root, clientX, clientY).filter(rect => isFakeCaretTarget(rect.node)).map(rect => clientInfo(rect, clientX));
+
+    const getAbsolutePosition = elm => {
+      const clientRect = elm.getBoundingClientRect();
+      const doc = elm.ownerDocument;
+      const docElem = doc.documentElement;
+      const win = doc.defaultView;
+      return {
+        top: clientRect.top + win.pageYOffset - docElem.clientTop,
+        left: clientRect.left + win.pageXOffset - docElem.clientLeft
+      };
+    };
+    const getBodyPosition = editor => editor.inline ? getAbsolutePosition(editor.getBody()) : {
+      left: 0,
+      top: 0
+    };
+    const getScrollPosition = editor => {
+      const body = editor.getBody();
+      return editor.inline ? {
+        left: body.scrollLeft,
+        top: body.scrollTop
+      } : {
+        left: 0,
+        top: 0
+      };
+    };
+    const getBodyScroll = editor => {
+      const body = editor.getBody(), docElm = editor.getDoc().documentElement;
+      const inlineScroll = {
+        left: body.scrollLeft,
+        top: body.scrollTop
+      };
+      const iframeScroll = {
+        left: body.scrollLeft || docElm.scrollLeft,
+        top: body.scrollTop || docElm.scrollTop
+      };
+      return editor.inline ? inlineScroll : iframeScroll;
+    };
+    const getMousePosition = (editor, event) => {
+      if (event.target.ownerDocument !== editor.getDoc()) {
+        const iframePosition = getAbsolutePosition(editor.getContentAreaContainer());
+        const scrollPosition = getBodyScroll(editor);
+        return {
+          left: event.pageX - iframePosition.left + scrollPosition.left,
+          top: event.pageY - iframePosition.top + scrollPosition.top
+        };
+      }
+      return {
+        left: event.pageX,
+        top: event.pageY
+      };
+    };
+    const calculatePosition = (bodyPosition, scrollPosition, mousePosition) => ({
+      pageX: mousePosition.left - bodyPosition.left + scrollPosition.left,
+      pageY: mousePosition.top - bodyPosition.top + scrollPosition.top
+    });
+    const calc = (editor, event) => calculatePosition(getBodyPosition(editor), getScrollPosition(editor), getMousePosition(editor, event));
+
+    const isContentEditableFalse$1 = isContentEditableFalse$a, isContentEditableTrue = isContentEditableTrue$4;
+    const isDraggable = (rootElm, elm) => isContentEditableFalse$1(elm) && elm !== rootElm;
+    const isValidDropTarget = (editor, targetElement, dragElement) => {
+      if (targetElement === dragElement || editor.dom.isChildOf(targetElement, dragElement)) {
+        return false;
+      }
+      return !isContentEditableFalse$1(targetElement);
+    };
+    const cloneElement = elm => {
+      const cloneElm = elm.cloneNode(true);
+      cloneElm.removeAttribute('data-mce-selected');
+      return cloneElm;
+    };
+    const createGhost = (editor, elm, width, height) => {
+      const dom = editor.dom;
+      const clonedElm = elm.cloneNode(true);
+      dom.setStyles(clonedElm, {
+        width,
+        height
+      });
+      dom.setAttrib(clonedElm, 'data-mce-selected', null);
+      const ghostElm = dom.create('div', {
+        'class': 'mce-drag-container',
+        'data-mce-bogus': 'all',
+        'unselectable': 'on',
+        'contenteditable': 'false'
+      });
+      dom.setStyles(ghostElm, {
+        position: 'absolute',
+        opacity: 0.5,
+        overflow: 'hidden',
+        border: 0,
+        padding: 0,
+        margin: 0,
+        width,
+        height
+      });
+      dom.setStyles(clonedElm, {
+        margin: 0,
+        boxSizing: 'border-box'
+      });
+      ghostElm.appendChild(clonedElm);
+      return ghostElm;
+    };
+    const appendGhostToBody = (ghostElm, bodyElm) => {
+      if (ghostElm.parentNode !== bodyElm) {
+        bodyElm.appendChild(ghostElm);
+      }
+    };
+    const moveGhost = (ghostElm, position, width, height, maxX, maxY) => {
+      let overflowX = 0, overflowY = 0;
+      ghostElm.style.left = position.pageX + 'px';
+      ghostElm.style.top = position.pageY + 'px';
+      if (position.pageX + width > maxX) {
+        overflowX = position.pageX + width - maxX;
+      }
+      if (position.pageY + height > maxY) {
+        overflowY = position.pageY + height - maxY;
+      }
+      ghostElm.style.width = width - overflowX + 'px';
+      ghostElm.style.height = height - overflowY + 'px';
+    };
+    const removeElement = elm => {
+      if (elm && elm.parentNode) {
+        elm.parentNode.removeChild(elm);
+      }
+    };
+    const isLeftMouseButtonPressed = e => e.button === 0;
+    const applyRelPos = (state, position) => ({
+      pageX: position.pageX - state.relX,
+      pageY: position.pageY + 5
+    });
+    const start = (state, editor) => e => {
+      if (isLeftMouseButtonPressed(e)) {
+        const ceElm = find$2(editor.dom.getParents(e.target), or(isContentEditableFalse$1, isContentEditableTrue)).getOr(null);
+        if (isDraggable(editor.getBody(), ceElm)) {
+          const elmPos = editor.dom.getPos(ceElm);
+          const bodyElm = editor.getBody();
+          const docElm = editor.getDoc().documentElement;
+          state.set({
+            element: ceElm,
+            dragging: false,
+            screenX: e.screenX,
+            screenY: e.screenY,
+            maxX: (editor.inline ? bodyElm.scrollWidth : docElm.offsetWidth) - 2,
+            maxY: (editor.inline ? bodyElm.scrollHeight : docElm.offsetHeight) - 2,
+            relX: e.pageX - elmPos.x,
+            relY: e.pageY - elmPos.y,
+            width: ceElm.offsetWidth,
+            height: ceElm.offsetHeight,
+            ghost: createGhost(editor, ceElm, ceElm.offsetWidth, ceElm.offsetHeight)
+          });
+        }
+      }
+    };
+    const move = (state, editor) => {
+      const throttledPlaceCaretAt = first$1((clientX, clientY) => {
+        editor._selectionOverrides.hideFakeCaret();
+        editor.selection.placeCaretAt(clientX, clientY);
+      }, 0);
+      editor.on('remove', throttledPlaceCaretAt.cancel);
+      return e => state.on(state => {
+        const movement = Math.max(Math.abs(e.screenX - state.screenX), Math.abs(e.screenY - state.screenY));
+        if (!state.dragging && movement > 10) {
+          const args = editor.dispatch('dragstart', { target: state.element });
+          if (args.isDefaultPrevented()) {
+            return;
+          }
+          state.dragging = true;
+          editor.focus();
+        }
+        if (state.dragging) {
+          const targetPos = applyRelPos(state, calc(editor, e));
+          appendGhostToBody(state.ghost, editor.getBody());
+          moveGhost(state.ghost, targetPos, state.width, state.height, state.maxX, state.maxY);
+          throttledPlaceCaretAt.throttle(e.clientX, e.clientY);
+        }
+      });
+    };
+    const getRawTarget = selection => {
+      const rng = selection.getSel().getRangeAt(0);
+      const startContainer = rng.startContainer;
+      return startContainer.nodeType === 3 ? startContainer.parentNode : startContainer;
+    };
+    const drop = (state, editor) => e => {
+      state.on(state => {
+        if (state.dragging) {
+          if (isValidDropTarget(editor, getRawTarget(editor.selection), state.element)) {
+            const targetClone = cloneElement(state.element);
+            const args = editor.dispatch('drop', {
+              clientX: e.clientX,
+              clientY: e.clientY
+            });
+            if (!args.isDefaultPrevented()) {
+              editor.undoManager.transact(() => {
+                removeElement(state.element);
+                editor.insertContent(editor.dom.getOuterHTML(targetClone));
+                editor._selectionOverrides.hideFakeCaret();
+              });
+            }
+          }
+          editor.dispatch('dragend');
+        }
+      });
+      removeDragState(state);
+    };
+    const stop = (state, editor) => () => {
+      state.on(state => {
+        if (state.dragging) {
+          editor.dispatch('dragend');
+        }
+      });
+      removeDragState(state);
+    };
+    const removeDragState = state => {
+      state.on(state => {
+        removeElement(state.ghost);
+      });
+      state.clear();
+    };
+    const bindFakeDragEvents = editor => {
+      const state = value$2();
+      const pageDom = DOMUtils.DOM;
+      const rootDocument = document;
+      const dragStartHandler = start(state, editor);
+      const dragHandler = move(state, editor);
+      const dropHandler = drop(state, editor);
+      const dragEndHandler = stop(state, editor);
+      editor.on('mousedown', dragStartHandler);
+      editor.on('mousemove', dragHandler);
+      editor.on('mouseup', dropHandler);
+      pageDom.bind(rootDocument, 'mousemove', dragHandler);
+      pageDom.bind(rootDocument, 'mouseup', dragEndHandler);
+      editor.on('remove', () => {
+        pageDom.unbind(rootDocument, 'mousemove', dragHandler);
+        pageDom.unbind(rootDocument, 'mouseup', dragEndHandler);
+      });
+      editor.on('keydown', e => {
+        if (e.keyCode === VK.ESC) {
+          dragEndHandler();
+        }
+      });
+    };
+    const blockUnsupportedFileDrop = editor => {
+      const preventFileDrop = e => {
+        if (!e.isDefaultPrevented()) {
+          const dataTransfer = e.dataTransfer;
+          if (dataTransfer && (contains$2(dataTransfer.types, 'Files') || dataTransfer.files.length > 0)) {
+            e.preventDefault();
+            if (e.type === 'drop') {
+              displayError(editor, 'Dropped file type is not supported');
+            }
+          }
+        }
+      };
+      const preventFileDropIfUIElement = e => {
+        if (isUIElement(editor, e.target)) {
+          preventFileDrop(e);
+        }
+      };
+      const setup = () => {
+        const pageDom = DOMUtils.DOM;
+        const dom = editor.dom;
+        const doc = document;
+        const editorRoot = editor.inline ? editor.getBody() : editor.getDoc();
+        const eventNames = [
+          'drop',
+          'dragover'
+        ];
+        each$g(eventNames, name => {
+          pageDom.bind(doc, name, preventFileDropIfUIElement);
+          dom.bind(editorRoot, name, preventFileDrop);
+        });
+        editor.on('remove', () => {
+          each$g(eventNames, name => {
+            pageDom.unbind(doc, name, preventFileDropIfUIElement);
+            dom.unbind(editorRoot, name, preventFileDrop);
+          });
+        });
+      };
+      editor.on('init', () => {
+        Delay.setEditorTimeout(editor, setup, 0);
+      });
+    };
+    const init$2 = editor => {
+      bindFakeDragEvents(editor);
+      if (shouldBlockUnsupportedDrop(editor)) {
+        blockUnsupportedFileDrop(editor);
+      }
+    };
+
+    const setup$4 = editor => {
+      const renderFocusCaret = first$1(() => {
+        if (!editor.removed && editor.getBody().contains(document.activeElement)) {
+          const rng = editor.selection.getRng();
+          if (rng.collapsed) {
+            const caretRange = renderRangeCaret(editor, rng, false);
+            editor.selection.setRng(caretRange);
+          }
+        }
+      }, 0);
+      editor.on('focus', () => {
+        renderFocusCaret.throttle();
+      });
+      editor.on('blur', () => {
+        renderFocusCaret.cancel();
+      });
+    };
+
+    const setup$3 = editor => {
+      editor.on('init', () => {
+        editor.on('focusin', e => {
+          const target = e.target;
+          if (isMedia$2(target)) {
+            const ceRoot = getContentEditableRoot$1(editor.getBody(), target);
+            const node = isContentEditableFalse$a(ceRoot) ? ceRoot : target;
+            if (editor.selection.getNode() !== node) {
+              selectNode(editor, node).each(rng => editor.selection.setRng(rng));
+            }
+          }
+        });
+      });
+    };
+
+    const isContentEditableFalse = isContentEditableFalse$a;
+    const getContentEditableRoot = (editor, node) => getContentEditableRoot$1(editor.getBody(), node);
+    const SelectionOverrides = editor => {
+      const selection = editor.selection, dom = editor.dom;
+      const isBlock = dom.isBlock;
+      const rootNode = editor.getBody();
+      const fakeCaret = FakeCaret(editor, rootNode, isBlock, () => hasFocus(editor));
+      const realSelectionId = 'sel-' + dom.uniqueId();
+      const elementSelectionAttr = 'data-mce-selected';
+      let selectedElement;
+      const isFakeSelectionElement = node => dom.hasClass(node, 'mce-offscreen-selection');
+      const isFakeSelectionTargetElement = node => node !== rootNode && (isContentEditableFalse(node) || isMedia$2(node)) && dom.isChildOf(node, rootNode);
+      const setRange = range => {
+        if (range) {
+          selection.setRng(range);
+        }
+      };
+      const showCaret = (direction, node, before, scrollIntoView = true) => {
+        const e = editor.dispatch('ShowCaret', {
+          target: node,
+          direction,
+          before
+        });
+        if (e.isDefaultPrevented()) {
+          return null;
+        }
+        if (scrollIntoView) {
+          selection.scrollIntoView(node, direction === -1);
+        }
+        return fakeCaret.show(before, node);
+      };
+      const showBlockCaretContainer = blockCaretContainer => {
+        if (blockCaretContainer.hasAttribute('data-mce-caret')) {
+          showCaretContainerBlock(blockCaretContainer);
+          selection.scrollIntoView(blockCaretContainer);
+        }
+      };
+      const registerEvents = () => {
+        editor.on('click', e => {
+          const contentEditableRoot = getContentEditableRoot(editor, e.target);
+          if (contentEditableRoot) {
+            if (isContentEditableFalse(contentEditableRoot)) {
+              e.preventDefault();
+              editor.focus();
+            }
+          }
+        });
+        editor.on('blur NewBlock', removeElementSelection);
+        editor.on('ResizeWindow FullscreenStateChanged', fakeCaret.reposition);
+        editor.on('tap', e => {
+          const targetElm = e.target;
+          const contentEditableRoot = getContentEditableRoot(editor, targetElm);
+          if (isContentEditableFalse(contentEditableRoot)) {
+            e.preventDefault();
+            selectNode(editor, contentEditableRoot).each(setElementSelection);
+          } else if (isFakeSelectionTargetElement(targetElm)) {
+            selectNode(editor, targetElm).each(setElementSelection);
+          }
+        }, true);
+        editor.on('mousedown', e => {
+          const targetElm = e.target;
+          if (targetElm !== rootNode && targetElm.nodeName !== 'HTML' && !dom.isChildOf(targetElm, rootNode)) {
+            return;
+          }
+          if (isXYInContentArea(editor, e.clientX, e.clientY) === false) {
+            return;
+          }
+          removeElementSelection();
+          hideFakeCaret();
+          const closestContentEditable = getContentEditableRoot(editor, targetElm);
+          if (isContentEditableFalse(closestContentEditable)) {
+            e.preventDefault();
+            selectNode(editor, closestContentEditable).each(setElementSelection);
+          } else {
+            closestFakeCaretCandidate(rootNode, e.clientX, e.clientY).each(caretInfo => {
+              e.preventDefault();
+              const range = showCaret(1, caretInfo.node, caretInfo.position === FakeCaretPosition.Before, false);
+              setRange(range);
+              if (isElement$6(closestContentEditable)) {
+                closestContentEditable.focus();
+              } else {
+                editor.getBody().focus();
+              }
+            });
+          }
+        });
+        editor.on('keypress', e => {
+          if (VK.modifierPressed(e)) {
+            return;
+          }
+          if (isContentEditableFalse(selection.getNode())) {
+            e.preventDefault();
+          }
+        });
+        editor.on('GetSelectionRange', e => {
+          let rng = e.range;
+          if (selectedElement) {
+            if (!selectedElement.parentNode) {
+              selectedElement = null;
+              return;
+            }
+            rng = rng.cloneRange();
+            rng.selectNode(selectedElement);
+            e.range = rng;
+          }
+        });
+        editor.on('SetSelectionRange', e => {
+          e.range = normalizeVoidElementSelection(e.range);
+          const rng = setElementSelection(e.range, e.forward);
+          if (rng) {
+            e.range = rng;
+          }
+        });
+        const isPasteBin = node => node.id === 'mcepastebin';
+        editor.on('AfterSetSelectionRange', e => {
+          const rng = e.range;
+          const parentNode = rng.startContainer.parentNode;
+          if (!isRangeInCaretContainer(rng) && !isPasteBin(parentNode)) {
+            hideFakeCaret();
+          }
+          if (!isFakeSelectionElement(parentNode)) {
+            removeElementSelection();
+          }
+        });
+        init$2(editor);
+        setup$4(editor);
+        setup$3(editor);
+      };
+      const isWithinCaretContainer = node => isCaretContainer$2(node) || startsWithCaretContainer$1(node) || endsWithCaretContainer$1(node);
+      const isRangeInCaretContainer = rng => isWithinCaretContainer(rng.startContainer) || isWithinCaretContainer(rng.endContainer);
+      const normalizeVoidElementSelection = rng => {
+        const voidElements = editor.schema.getVoidElements();
+        const newRng = dom.createRng();
+        const startContainer = rng.startContainer;
+        const startOffset = rng.startOffset;
+        const endContainer = rng.endContainer;
+        const endOffset = rng.endOffset;
+        if (has$2(voidElements, startContainer.nodeName.toLowerCase())) {
+          if (startOffset === 0) {
+            newRng.setStartBefore(startContainer);
+          } else {
+            newRng.setStartAfter(startContainer);
+          }
+        } else {
+          newRng.setStart(startContainer, startOffset);
+        }
+        if (has$2(voidElements, endContainer.nodeName.toLowerCase())) {
+          if (endOffset === 0) {
+            newRng.setEndBefore(endContainer);
+          } else {
+            newRng.setEndAfter(endContainer);
+          }
+        } else {
+          newRng.setEnd(endContainer, endOffset);
+        }
+        return newRng;
+      };
+      const setupOffscreenSelection = (node, targetClone) => {
+        const body = SugarElement.fromDom(editor.getBody());
+        const doc = editor.getDoc();
+        const realSelectionContainer = descendant(body, '#' + realSelectionId).getOrThunk(() => {
+          const newContainer = SugarElement.fromHtml('<div data-mce-bogus="all" class="mce-offscreen-selection"></div>', doc);
+          set$2(newContainer, 'id', realSelectionId);
+          append$1(body, newContainer);
+          return newContainer;
+        });
+        const newRange = dom.createRng();
+        empty(realSelectionContainer);
+        append(realSelectionContainer, [
+          SugarElement.fromText(nbsp, doc),
+          SugarElement.fromDom(targetClone),
+          SugarElement.fromText(nbsp, doc)
+        ]);
+        newRange.setStart(realSelectionContainer.dom.firstChild, 1);
+        newRange.setEnd(realSelectionContainer.dom.lastChild, 0);
+        setAll(realSelectionContainer, { top: dom.getPos(node, editor.getBody()).y + 'px' });
+        focus$1(realSelectionContainer);
+        const sel = selection.getSel();
+        sel.removeAllRanges();
+        sel.addRange(newRange);
+        return newRange;
+      };
+      const selectElement = elm => {
+        const targetClone = elm.cloneNode(true);
+        const e = editor.dispatch('ObjectSelected', {
+          target: elm,
+          targetClone
+        });
+        if (e.isDefaultPrevented()) {
+          return null;
+        }
+        const range = setupOffscreenSelection(elm, e.targetClone);
+        const nodeElm = SugarElement.fromDom(elm);
+        each$g(descendants(SugarElement.fromDom(editor.getBody()), '*[data-mce-selected]'), elm => {
+          if (!eq(nodeElm, elm)) {
+            remove$a(elm, elementSelectionAttr);
+          }
+        });
+        if (!dom.getAttrib(elm, elementSelectionAttr)) {
+          elm.setAttribute(elementSelectionAttr, '1');
+        }
+        selectedElement = elm;
+        hideFakeCaret();
+        return range;
+      };
+      const setElementSelection = (range, forward) => {
+        if (!range) {
+          return null;
+        }
+        if (range.collapsed) {
+          if (!isRangeInCaretContainer(range)) {
+            const dir = forward ? 1 : -1;
+            const caretPosition = getNormalizedRangeEndPoint(dir, rootNode, range);
+            const beforeNode = caretPosition.getNode(!forward);
+            if (isFakeCaretTarget(beforeNode)) {
+              return showCaret(dir, beforeNode, forward ? !caretPosition.isAtEnd() : false, false);
+            }
+            const afterNode = caretPosition.getNode(forward);
+            if (isFakeCaretTarget(afterNode)) {
+              return showCaret(dir, afterNode, forward ? false : !caretPosition.isAtEnd(), false);
+            }
+          }
+          return null;
+        }
+        let startContainer = range.startContainer;
+        let startOffset = range.startOffset;
+        const endOffset = range.endOffset;
+        if (startContainer.nodeType === 3 && startOffset === 0 && isContentEditableFalse(startContainer.parentNode)) {
+          startContainer = startContainer.parentNode;
+          startOffset = dom.nodeIndex(startContainer);
+          startContainer = startContainer.parentNode;
+        }
+        if (startContainer.nodeType !== 1) {
+          return null;
+        }
+        if (endOffset === startOffset + 1 && startContainer === range.endContainer) {
+          const node = startContainer.childNodes[startOffset];
+          if (isFakeSelectionTargetElement(node)) {
+            return selectElement(node);
+          }
+        }
+        return null;
+      };
+      const removeElementSelection = () => {
+        if (selectedElement) {
+          selectedElement.removeAttribute(elementSelectionAttr);
+        }
+        descendant(SugarElement.fromDom(editor.getBody()), '#' + realSelectionId).each(remove$5);
+        selectedElement = null;
+      };
+      const destroy = () => {
+        fakeCaret.destroy();
+        selectedElement = null;
+      };
+      const hideFakeCaret = () => {
+        fakeCaret.hide();
+      };
+      if (!isRtc(editor)) {
+        registerEvents();
+      }
+      return {
+        showCaret,
+        showBlockCaretContainer,
+        hideFakeCaret,
+        destroy
+      };
+    };
+
+    const generatePath = (root, node, offset) => {
+      if (isText$8(node) && (offset < 0 || offset > node.data.length)) {
+        return [];
+      }
+      const p = [offset];
+      let current = node;
+      while (current !== root && current.parentNode) {
+        const parent = current.parentNode;
+        for (let i = 0; i < parent.childNodes.length; i++) {
+          if (parent.childNodes[i] === current) {
+            p.push(i);
+            break;
+          }
+        }
+        current = parent;
+      }
+      return current === root ? p.reverse() : [];
+    };
+    const generatePathRange = (root, startNode, startOffset, endNode, endOffset) => {
+      const start = generatePath(root, startNode, startOffset);
+      const end = generatePath(root, endNode, endOffset);
+      return {
+        start,
+        end
+      };
+    };
+    const resolvePath = (root, path) => {
+      const nodePath = path.slice();
+      const offset = nodePath.pop();
+      const resolvedNode = foldl(nodePath, (optNode, index) => optNode.bind(node => Optional.from(node.childNodes[index])), Optional.some(root));
+      return resolvedNode.bind(node => {
+        if (isText$8(node) && (offset < 0 || offset > node.data.length)) {
+          return Optional.none();
+        } else {
+          return Optional.some({
+            node,
+            offset
+          });
+        }
+      });
+    };
+    const resolvePathRange = (root, range) => resolvePath(root, range.start).bind(({
+      node: startNode,
+      offset: startOffset
+    }) => resolvePath(root, range.end).map(({
+      node: endNode,
+      offset: endOffset
+    }) => {
+      const rng = document.createRange();
+      rng.setStart(startNode, startOffset);
+      rng.setEnd(endNode, endOffset);
+      return rng;
+    }));
+    const generatePathRangeFromRange = (root, range) => generatePathRange(root, range.startContainer, range.startOffset, range.endContainer, range.endOffset);
+
+    const cleanEmptyNodes = (dom, node, isRoot) => {
+      if (node && dom.isEmpty(node) && !isRoot(node)) {
+        const parent = node.parentNode;
+        dom.remove(node);
+        cleanEmptyNodes(dom, parent, isRoot);
+      }
+    };
+    const deleteRng = (dom, rng, isRoot, clean = true) => {
+      const startParent = rng.startContainer.parentNode;
+      const endParent = rng.endContainer.parentNode;
+      rng.deleteContents();
+      if (clean && !isRoot(rng.startContainer)) {
+        if (isText$8(rng.startContainer) && rng.startContainer.data.length === 0) {
+          dom.remove(rng.startContainer);
+        }
+        if (isText$8(rng.endContainer) && rng.endContainer.data.length === 0) {
+          dom.remove(rng.endContainer);
+        }
+        cleanEmptyNodes(dom, startParent, isRoot);
+        if (startParent !== endParent) {
+          cleanEmptyNodes(dom, endParent, isRoot);
+        }
+      }
+    };
+    const getParentBlock = (editor, rng) => Optional.from(editor.dom.getParent(rng.startContainer, editor.dom.isBlock));
+
+    const stripPattern = (dom, block, pattern) => {
+      const firstTextNode = textAfter(block, 0, block);
+      firstTextNode.each(spot => {
+        const node = spot.container;
+        scanRight(node, pattern.start.length, block).each(end => {
+          const rng = dom.createRng();
+          rng.setStart(node, 0);
+          rng.setEnd(end.container, end.offset);
+          deleteRng(dom, rng, e => e === block);
+        });
+      });
+    };
+    const applyPattern$1 = (editor, match) => {
+      const dom = editor.dom;
+      const pattern = match.pattern;
+      const rng = resolvePathRange(dom.getRoot(), match.range).getOrDie('Unable to resolve path range');
+      const isBlockFormatName = (name, formatter) => {
+        const formatSet = formatter.get(name);
+        return isArray$1(formatSet) && head(formatSet).exists(format => has$2(format, 'block'));
+      };
+      getParentBlock(editor, rng).each(block => {
+        if (pattern.type === 'block-format') {
+          if (isBlockFormatName(pattern.format, editor.formatter)) {
+            editor.undoManager.transact(() => {
+              stripPattern(editor.dom, block, pattern);
+              editor.formatter.apply(pattern.format);
+            });
+          }
+        } else if (pattern.type === 'block-command') {
+          editor.undoManager.transact(() => {
+            stripPattern(editor.dom, block, pattern);
+            editor.execCommand(pattern.cmd, false, pattern.value);
+          });
+        }
+      });
+      return true;
+    };
+    const findPattern$1 = (patterns, text) => {
+      const nuText = text.replace(nbsp, ' ');
+      return find$2(patterns, pattern => text.indexOf(pattern.start) === 0 || nuText.indexOf(pattern.start) === 0);
+    };
+    const findPatterns$1 = (editor, patterns) => {
+      const dom = editor.dom;
+      const rng = editor.selection.getRng();
+      return getParentBlock(editor, rng).filter(block => {
+        const forcedRootBlock = getForcedRootBlock(editor);
+        const matchesForcedRootBlock = dom.is(block, forcedRootBlock);
+        return block !== null && matchesForcedRootBlock;
+      }).bind(block => {
+        const blockText = block.textContent;
+        const matchedPattern = findPattern$1(patterns, blockText);
+        return matchedPattern.map(pattern => {
+          if (Tools.trim(blockText).length === pattern.start.length) {
+            return [];
+          }
+          return [{
+              pattern,
+              range: generatePathRange(dom.getRoot(), block, 0, block, 0)
+            }];
+        });
+      }).getOr([]);
+    };
+    const applyMatches$1 = (editor, matches) => {
+      if (matches.length === 0) {
+        return;
+      }
+      const bookmark = editor.selection.getBookmark();
+      each$g(matches, match => applyPattern$1(editor, match));
+      editor.selection.moveToBookmark(bookmark);
+    };
+
+    const newMarker = (dom, id) => dom.create('span', {
+      'data-mce-type': 'bookmark',
+      id
+    });
+    const rangeFromMarker = (dom, marker) => {
+      const rng = dom.createRng();
+      rng.setStartAfter(marker.start);
+      rng.setEndBefore(marker.end);
+      return rng;
+    };
+    const createMarker = (dom, markerPrefix, pathRange) => {
+      const rng = resolvePathRange(dom.getRoot(), pathRange).getOrDie('Unable to resolve path range');
+      const startNode = rng.startContainer;
+      const endNode = rng.endContainer;
+      const textEnd = rng.endOffset === 0 ? endNode : endNode.splitText(rng.endOffset);
+      const textStart = rng.startOffset === 0 ? startNode : startNode.splitText(rng.startOffset);
+      return {
+        prefix: markerPrefix,
+        end: textEnd.parentNode.insertBefore(newMarker(dom, markerPrefix + '-end'), textEnd),
+        start: textStart.parentNode.insertBefore(newMarker(dom, markerPrefix + '-start'), textStart)
+      };
+    };
+    const removeMarker = (dom, marker, isRoot) => {
+      cleanEmptyNodes(dom, dom.get(marker.prefix + '-end'), isRoot);
+      cleanEmptyNodes(dom, dom.get(marker.prefix + '-start'), isRoot);
+    };
+
+    const isReplacementPattern = pattern => pattern.start.length === 0;
+    const matchesPattern = patternContent => (element, offset) => {
+      const text = element.data;
+      const searchText = text.substring(0, offset);
+      const startEndIndex = searchText.lastIndexOf(patternContent.charAt(patternContent.length - 1));
+      const startIndex = searchText.lastIndexOf(patternContent);
+      if (startIndex !== -1) {
+        return startIndex + patternContent.length;
+      } else if (startEndIndex !== -1) {
+        return startEndIndex + 1;
+      } else {
+        return -1;
+      }
+    };
+    const findPatternStartFromSpot = (dom, pattern, block, spot) => {
+      const startPattern = pattern.start;
+      const startSpot = repeatLeft(dom, spot.container, spot.offset, matchesPattern(startPattern), block);
+      return startSpot.bind(spot => {
+        if (spot.offset >= startPattern.length) {
+          const rng = dom.createRng();
+          rng.setStart(spot.container, spot.offset - startPattern.length);
+          rng.setEnd(spot.container, spot.offset);
+          return Optional.some(rng);
+        } else {
+          const offset = spot.offset - startPattern.length;
+          return scanLeft(spot.container, offset, block).map(nextSpot => {
+            const rng = dom.createRng();
+            rng.setStart(nextSpot.container, nextSpot.offset);
+            rng.setEnd(spot.container, spot.offset);
+            return rng;
+          }).filter(rng => rng.toString() === startPattern).orThunk(() => findPatternStartFromSpot(dom, pattern, block, point(spot.container, 0)));
+        }
+      });
+    };
+    const findPatternStart = (dom, pattern, node, offset, block, requireGap = false) => {
+      if (pattern.start.length === 0 && !requireGap) {
+        const rng = dom.createRng();
+        rng.setStart(node, offset);
+        rng.setEnd(node, offset);
+        return Optional.some(rng);
+      }
+      return textBefore(node, offset, block).bind(spot => {
+        const start = findPatternStartFromSpot(dom, pattern, block, spot);
+        return start.bind(startRange => {
+          if (requireGap) {
+            if (startRange.endContainer === spot.container && startRange.endOffset === spot.offset) {
+              return Optional.none();
+            } else if (spot.offset === 0 && startRange.endContainer.textContent.length === startRange.endOffset) {
+              return Optional.none();
+            }
+          }
+          return Optional.some(startRange);
+        });
+      });
+    };
+    const findPattern = (editor, block, details) => {
+      const dom = editor.dom;
+      const root = dom.getRoot();
+      const pattern = details.pattern;
+      const endNode = details.position.container;
+      const endOffset = details.position.offset;
+      return scanLeft(endNode, endOffset - details.pattern.end.length, block).bind(spot => {
+        const endPathRng = generatePathRange(root, spot.container, spot.offset, endNode, endOffset);
+        if (isReplacementPattern(pattern)) {
+          return Optional.some({
+            matches: [{
+                pattern,
+                startRng: endPathRng,
+                endRng: endPathRng
+              }],
+            position: spot
+          });
+        } else {
+          const resultsOpt = findPatternsRec(editor, details.remainingPatterns, spot.container, spot.offset, block);
+          const results = resultsOpt.getOr({
+            matches: [],
+            position: spot
+          });
+          const pos = results.position;
+          const start = findPatternStart(dom, pattern, pos.container, pos.offset, block, resultsOpt.isNone());
+          return start.map(startRng => {
+            const startPathRng = generatePathRangeFromRange(root, startRng);
+            return {
+              matches: results.matches.concat([{
+                  pattern,
+                  startRng: startPathRng,
+                  endRng: endPathRng
+                }]),
+              position: point(startRng.startContainer, startRng.startOffset)
+            };
+          });
+        }
+      });
+    };
+    const findPatternsRec = (editor, patterns, node, offset, block) => {
+      const dom = editor.dom;
+      return textBefore(node, offset, dom.getRoot()).bind(endSpot => {
+        const rng = dom.createRng();
+        rng.setStart(block, 0);
+        rng.setEnd(node, offset);
+        const text = rng.toString();
+        for (let i = 0; i < patterns.length; i++) {
+          const pattern = patterns[i];
+          if (!endsWith(text, pattern.end)) {
+            continue;
+          }
+          const patternsWithoutCurrent = patterns.slice();
+          patternsWithoutCurrent.splice(i, 1);
+          const result = findPattern(editor, block, {
+            pattern,
+            remainingPatterns: patternsWithoutCurrent,
+            position: endSpot
+          });
+          if (result.isSome()) {
+            return result;
+          }
+        }
+        return Optional.none();
+      });
+    };
+    const applyPattern = (editor, pattern, patternRange) => {
+      editor.selection.setRng(patternRange);
+      if (pattern.type === 'inline-format') {
+        each$g(pattern.format, format => {
+          editor.formatter.apply(format);
+        });
+      } else {
+        editor.execCommand(pattern.cmd, false, pattern.value);
+      }
+    };
+    const applyReplacementPattern = (editor, pattern, marker, isRoot) => {
+      const markerRange = rangeFromMarker(editor.dom, marker);
+      deleteRng(editor.dom, markerRange, isRoot);
+      applyPattern(editor, pattern, markerRange);
+    };
+    const applyPatternWithContent = (editor, pattern, startMarker, endMarker, isRoot) => {
+      const dom = editor.dom;
+      const markerEndRange = rangeFromMarker(dom, endMarker);
+      const markerStartRange = rangeFromMarker(dom, startMarker);
+      deleteRng(dom, markerStartRange, isRoot);
+      deleteRng(dom, markerEndRange, isRoot);
+      const patternMarker = {
+        prefix: startMarker.prefix,
+        start: startMarker.end,
+        end: endMarker.start
+      };
+      const patternRange = rangeFromMarker(dom, patternMarker);
+      applyPattern(editor, pattern, patternRange);
+    };
+    const addMarkers = (dom, matches) => {
+      const markerPrefix = generate$1('mce_textpattern');
+      const matchesWithEnds = foldr(matches, (acc, match) => {
+        const endMarker = createMarker(dom, markerPrefix + `_end${ acc.length }`, match.endRng);
+        return acc.concat([{
+            ...match,
+            endMarker
+          }]);
+      }, []);
+      return foldr(matchesWithEnds, (acc, match) => {
+        const idx = matchesWithEnds.length - acc.length - 1;
+        const startMarker = isReplacementPattern(match.pattern) ? match.endMarker : createMarker(dom, markerPrefix + `_start${ idx }`, match.startRng);
+        return acc.concat([{
+            ...match,
+            startMarker
+          }]);
+      }, []);
+    };
+    const findPatterns = (editor, patterns, space) => {
+      const rng = editor.selection.getRng();
+      if (rng.collapsed === false) {
+        return [];
+      }
+      return getParentBlock(editor, rng).bind(block => {
+        const offset = Math.max(0, rng.startOffset - (space ? 1 : 0));
+        return findPatternsRec(editor, patterns, rng.startContainer, offset, block);
+      }).fold(() => [], result => result.matches);
+    };
+    const applyMatches = (editor, matches) => {
+      if (matches.length === 0) {
+        return;
+      }
+      const dom = editor.dom;
+      const bookmark = editor.selection.getBookmark();
+      const matchesWithMarkers = addMarkers(dom, matches);
+      each$g(matchesWithMarkers, match => {
+        const block = dom.getParent(match.startMarker.start, dom.isBlock);
+        const isRoot = node => node === block;
+        if (isReplacementPattern(match.pattern)) {
+          applyReplacementPattern(editor, match.pattern, match.endMarker, isRoot);
+        } else {
+          applyPatternWithContent(editor, match.pattern, match.startMarker, match.endMarker, isRoot);
+        }
+        removeMarker(dom, match.endMarker, isRoot);
+        removeMarker(dom, match.startMarker, isRoot);
+      });
+      editor.selection.moveToBookmark(bookmark);
+    };
+
+    const hasPatterns = patternSet => patternSet.inlinePatterns.length > 0 || patternSet.blockPatterns.length > 0;
+    const handleEnter = (editor, patternSet) => {
+      if (!editor.selection.isCollapsed() || !hasPatterns(patternSet)) {
+        return false;
+      }
+      const inlineMatches = findPatterns(editor, patternSet.inlinePatterns, false);
+      const blockMatches = findPatterns$1(editor, patternSet.blockPatterns);
+      if (blockMatches.length > 0 || inlineMatches.length > 0) {
+        editor.undoManager.add();
+        editor.undoManager.extra(() => {
+          editor.execCommand('mceInsertNewLine');
+        }, () => {
+          editor.insertContent(zeroWidth);
+          applyMatches(editor, inlineMatches);
+          applyMatches$1(editor, blockMatches);
+          const range = editor.selection.getRng();
+          const spot = textBefore(range.startContainer, range.startOffset, editor.dom.getRoot());
+          editor.execCommand('mceInsertNewLine');
+          spot.each(s => {
+            const node = s.container;
+            if (node.data.charAt(s.offset - 1) === zeroWidth) {
+              node.deleteData(s.offset - 1, 1);
+              cleanEmptyNodes(editor.dom, node.parentNode, e => e === editor.dom.getRoot());
+            }
+          });
+        });
+        return true;
+      }
+      return false;
+    };
+    const handleInlineKey = (editor, inlinePatterns) => {
+      if (inlinePatterns.length > 0) {
+        const inlineMatches = findPatterns(editor, inlinePatterns, true);
+        if (inlineMatches.length > 0) {
+          editor.undoManager.transact(() => {
+            applyMatches(editor, inlineMatches);
+          });
+        }
+      }
+    };
+    const checkKeyEvent = (codes, event, predicate) => {
+      for (let i = 0; i < codes.length; i++) {
+        if (predicate(codes[i], event)) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const checkKeyCode = (codes, event) => checkKeyEvent(codes, event, (code, event) => {
+      return code === event.keyCode && VK.modifierPressed(event) === false;
+    });
+    const checkCharCode = (chars, event) => checkKeyEvent(chars, event, (chr, event) => {
+      return chr.charCodeAt(0) === event.charCode;
+    });
+
+    const setup$2 = editor => {
+      const charCodes = [
+        ',',
+        '.',
+        ';',
+        ':',
+        '!',
+        '?'
+      ];
+      const keyCodes = [32];
+      const getPatternSet = () => createPatternSet(getTextPatterns(editor));
+      const getInlinePatterns$1 = () => getInlinePatterns(getTextPatterns(editor));
+      editor.on('keydown', e => {
+        if (e.keyCode === 13 && !VK.modifierPressed(e)) {
+          if (handleEnter(editor, getPatternSet())) {
+            e.preventDefault();
+          }
+        }
+      }, true);
+      editor.on('keyup', e => {
+        if (checkKeyCode(keyCodes, e)) {
+          handleInlineKey(editor, getInlinePatterns$1());
+        }
+      });
+      editor.on('keypress', e => {
+        if (checkCharCode(charCodes, e)) {
+          Delay.setEditorTimeout(editor, () => {
+            handleInlineKey(editor, getInlinePatterns$1());
+          });
+        }
+      });
+    };
+
+    const setup$1 = editor => {
+      setup$2(editor);
+    };
+
+    const Quirks = editor => {
+      const each = Tools.each;
+      const BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE, dom = editor.dom, selection = editor.selection, parser = editor.parser;
+      const browser = Env.browser;
+      const isGecko = browser.isFirefox();
+      const isWebKit = browser.isChromium() || browser.isSafari();
+      const isiOS = Env.deviceType.isiPhone() || Env.deviceType.isiPad();
+      const isMac = Env.os.isMacOS() || Env.os.isiOS();
+      const setEditorCommandState = (cmd, state) => {
+        try {
+          editor.getDoc().execCommand(cmd, false, state);
+        } catch (ex) {
+        }
+      };
+      const isDefaultPrevented = e => {
+        return e.isDefaultPrevented();
+      };
+      const emptyEditorWhenDeleting = () => {
+        const serializeRng = rng => {
+          const body = dom.create('body');
+          const contents = rng.cloneContents();
+          body.appendChild(contents);
+          return selection.serializer.serialize(body, { format: 'html' });
+        };
+        const allContentsSelected = rng => {
+          const selection = serializeRng(rng);
+          const allRng = dom.createRng();
+          allRng.selectNode(editor.getBody());
+          const allSelection = serializeRng(allRng);
+          return selection === allSelection;
+        };
+        editor.on('keydown', e => {
+          const keyCode = e.keyCode;
+          let isCollapsed, body;
+          if (!isDefaultPrevented(e) && (keyCode === DELETE || keyCode === BACKSPACE)) {
+            isCollapsed = editor.selection.isCollapsed();
+            body = editor.getBody();
+            if (isCollapsed && !dom.isEmpty(body)) {
+              return;
+            }
+            if (!isCollapsed && !allContentsSelected(editor.selection.getRng())) {
+              return;
+            }
+            e.preventDefault();
+            editor.setContent('');
+            if (body.firstChild && dom.isBlock(body.firstChild)) {
+              editor.selection.setCursorLocation(body.firstChild, 0);
+            } else {
+              editor.selection.setCursorLocation(body, 0);
+            }
+            editor.nodeChanged();
+          }
+        });
+      };
+      const selectAll = () => {
+        editor.shortcuts.add('meta+a', null, 'SelectAll');
+      };
+      const documentElementEditingFocus = () => {
+        if (!editor.inline) {
+          dom.bind(editor.getDoc(), 'mousedown mouseup', e => {
+            let rng;
+            if (e.target === editor.getDoc().documentElement) {
+              rng = selection.getRng();
+              editor.getBody().focus();
+              if (e.type === 'mousedown') {
+                if (isCaretContainer$2(rng.startContainer)) {
+                  return;
+                }
+                selection.placeCaretAt(e.clientX, e.clientY);
+              } else {
+                selection.setRng(rng);
+              }
+            }
+          });
+        }
+      };
+      const removeHrOnBackspace = () => {
+        editor.on('keydown', e => {
+          if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
+            if (!editor.getBody().getElementsByTagName('hr').length) {
+              return;
+            }
+            if (selection.isCollapsed() && selection.getRng().startOffset === 0) {
+              const node = selection.getNode();
+              const previousSibling = node.previousSibling;
+              if (node.nodeName === 'HR') {
+                dom.remove(node);
+                e.preventDefault();
+                return;
+              }
+              if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === 'hr') {
+                dom.remove(previousSibling);
+                e.preventDefault();
+              }
+            }
+          }
+        });
+      };
+      const focusBody = () => {
+        if (!Range.prototype.getClientRects) {
+          editor.on('mousedown', e => {
+            if (!isDefaultPrevented(e) && e.target.nodeName === 'HTML') {
+              const body = editor.getBody();
+              body.blur();
+              Delay.setEditorTimeout(editor, () => {
+                body.focus();
+              });
+            }
+          });
+        }
+      };
+      const selectControlElements = () => {
+        const visualAidsAnchorClass = getVisualAidsAnchorClass(editor);
+        editor.on('click', e => {
+          const target = e.target;
+          if (/^(IMG|HR)$/.test(target.nodeName) && dom.getContentEditableParent(target) !== 'false') {
+            e.preventDefault();
+            editor.selection.select(target);
+            editor.nodeChanged();
+          }
+          if (target.nodeName === 'A' && dom.hasClass(target, visualAidsAnchorClass) && target.childNodes.length === 0) {
+            e.preventDefault();
+            selection.select(target);
+          }
+        });
+      };
+      const removeStylesWhenDeletingAcrossBlockElements = () => {
+        const getAttributeApplyFunction = () => {
+          const template = dom.getAttribs(selection.getStart().cloneNode(false));
+          return () => {
+            const target = selection.getStart();
+            if (target !== editor.getBody()) {
+              dom.setAttrib(target, 'style', null);
+              each(template, attr => {
+                target.setAttributeNode(attr.cloneNode(true));
+              });
+            }
+          };
+        };
+        const isSelectionAcrossElements = () => {
+          return !selection.isCollapsed() && dom.getParent(selection.getStart(), dom.isBlock) !== dom.getParent(selection.getEnd(), dom.isBlock);
+        };
+        editor.on('keypress', e => {
+          let applyAttributes;
+          if (!isDefaultPrevented(e) && (e.keyCode === 8 || e.keyCode === 46) && isSelectionAcrossElements()) {
+            applyAttributes = getAttributeApplyFunction();
+            editor.getDoc().execCommand('delete', false, null);
+            applyAttributes();
+            e.preventDefault();
+            return false;
+          }
+        });
+        dom.bind(editor.getDoc(), 'cut', e => {
+          let applyAttributes;
+          if (!isDefaultPrevented(e) && isSelectionAcrossElements()) {
+            applyAttributes = getAttributeApplyFunction();
+            Delay.setEditorTimeout(editor, () => {
+              applyAttributes();
+            });
+          }
+        });
+      };
+      const disableBackspaceIntoATable = () => {
+        editor.on('keydown', e => {
+          if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
+            if (selection.isCollapsed() && selection.getRng().startOffset === 0) {
+              const previousSibling = selection.getNode().previousSibling;
+              if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === 'table') {
+                e.preventDefault();
+                return false;
+              }
+            }
+          }
+        });
+      };
+      const removeBlockQuoteOnBackSpace = () => {
+        editor.on('keydown', e => {
+          let rng, parent;
+          if (isDefaultPrevented(e) || e.keyCode !== VK.BACKSPACE) {
+            return;
+          }
+          rng = selection.getRng();
+          const container = rng.startContainer;
+          const offset = rng.startOffset;
+          const root = dom.getRoot();
+          parent = container;
+          if (!rng.collapsed || offset !== 0) {
+            return;
+          }
+          while (parent && parent.parentNode && parent.parentNode.firstChild === parent && parent.parentNode !== root) {
+            parent = parent.parentNode;
+          }
+          if (parent.tagName === 'BLOCKQUOTE') {
+            editor.formatter.toggle('blockquote', null, parent);
+            rng = dom.createRng();
+            rng.setStart(container, 0);
+            rng.setEnd(container, 0);
+            selection.setRng(rng);
+          }
+        });
+      };
+      const setGeckoEditingOptions = () => {
+        const setOpts = () => {
+          setEditorCommandState('StyleWithCSS', false);
+          setEditorCommandState('enableInlineTableEditing', false);
+          if (!getObjectResizing(editor)) {
+            setEditorCommandState('enableObjectResizing', false);
+          }
+        };
+        if (!isReadOnly$1(editor)) {
+          editor.on('BeforeExecCommand mousedown', setOpts);
+        }
+      };
+      const addBrAfterLastLinks = () => {
+        const fixLinks = () => {
+          each(dom.select('a'), node => {
+            let parentNode = node.parentNode;
+            const root = dom.getRoot();
+            if (parentNode.lastChild === node) {
+              while (parentNode && !dom.isBlock(parentNode)) {
+                if (parentNode.parentNode.lastChild !== parentNode || parentNode === root) {
+                  return;
+                }
+                parentNode = parentNode.parentNode;
+              }
+              dom.add(parentNode, 'br', { 'data-mce-bogus': 1 });
+            }
+          });
+        };
+        editor.on('SetContent ExecCommand', e => {
+          if (e.type === 'setcontent' || e.command === 'mceInsertLink') {
+            fixLinks();
+          }
+        });
+      };
+      const setDefaultBlockType = () => {
+        editor.on('init', () => {
+          setEditorCommandState('DefaultParagraphSeparator', getForcedRootBlock(editor));
+        });
+      };
+      const normalizeSelection = () => {
+        editor.on('keyup focusin mouseup', e => {
+          if (!VK.modifierPressed(e)) {
+            selection.normalize();
+          }
+        }, true);
+      };
+      const showBrokenImageIcon = () => {
+        editor.contentStyles.push('img:-moz-broken {' + '-moz-force-broken-image-icon:1;' + 'min-width:24px;' + 'min-height:24px' + '}');
+      };
+      const restoreFocusOnKeyDown = () => {
+        if (!editor.inline) {
+          editor.on('keydown', () => {
+            if (document.activeElement === document.body) {
+              editor.getWin().focus();
+            }
+          });
+        }
+      };
+      const bodyHeight = () => {
+        if (!editor.inline) {
+          editor.contentStyles.push('body {min-height: 150px}');
+          editor.on('click', e => {
+            let rng;
+            if (e.target.nodeName === 'HTML') {
+              rng = editor.selection.getRng();
+              editor.getBody().focus();
+              editor.selection.setRng(rng);
+              editor.selection.normalize();
+              editor.nodeChanged();
+            }
+          });
+        }
+      };
+      const blockCmdArrowNavigation = () => {
+        if (isMac) {
+          editor.on('keydown', e => {
+            if (VK.metaKeyPressed(e) && !e.shiftKey && (e.keyCode === 37 || e.keyCode === 39)) {
+              e.preventDefault();
+              const selection = editor.selection.getSel();
+              selection.modify('move', e.keyCode === 37 ? 'backward' : 'forward', 'lineboundary');
+            }
+          });
+        }
+      };
+      const tapLinksAndImages = () => {
+        editor.on('click', e => {
+          let elm = e.target;
+          do {
+            if (elm.tagName === 'A') {
+              e.preventDefault();
+              return;
+            }
+          } while (elm = elm.parentNode);
+        });
+        editor.contentStyles.push('.mce-content-body {-webkit-touch-callout: none}');
+      };
+      const blockFormSubmitInsideEditor = () => {
+        editor.on('init', () => {
+          editor.dom.bind(editor.getBody(), 'submit', e => {
+            e.preventDefault();
+          });
+        });
+      };
+      const removeAppleInterchangeBrs = () => {
+        parser.addNodeFilter('br', nodes => {
+          let i = nodes.length;
+          while (i--) {
+            if (nodes[i].attr('class') === 'Apple-interchange-newline') {
+              nodes[i].remove();
+            }
+          }
+        });
+      };
+      const refreshContentEditable = noop;
+      const isHidden = () => {
+        if (!isGecko || editor.removed) {
+          return false;
+        }
+        const sel = editor.selection.getSel();
+        return !sel || !sel.rangeCount || sel.rangeCount === 0;
+      };
+      const setupRtc = () => {
+        if (isWebKit) {
+          documentElementEditingFocus();
+          selectControlElements();
+          blockFormSubmitInsideEditor();
+          selectAll();
+          if (isiOS) {
+            restoreFocusOnKeyDown();
+            bodyHeight();
+            tapLinksAndImages();
+          }
+        }
+        if (isGecko) {
+          focusBody();
+          setGeckoEditingOptions();
+          showBrokenImageIcon();
+          blockCmdArrowNavigation();
+        }
+      };
+      const setup = () => {
+        removeBlockQuoteOnBackSpace();
+        emptyEditorWhenDeleting();
+        if (!Env.windowsPhone) {
+          normalizeSelection();
+        }
+        if (isWebKit) {
+          documentElementEditingFocus();
+          selectControlElements();
+          setDefaultBlockType();
+          blockFormSubmitInsideEditor();
+          disableBackspaceIntoATable();
+          removeAppleInterchangeBrs();
+          if (isiOS) {
+            restoreFocusOnKeyDown();
+            bodyHeight();
+            tapLinksAndImages();
+          } else {
+            selectAll();
+          }
+        }
+        if (isGecko) {
+          removeHrOnBackspace();
+          focusBody();
+          removeStylesWhenDeletingAcrossBlockElements();
+          setGeckoEditingOptions();
+          addBrAfterLastLinks();
+          showBrokenImageIcon();
+          blockCmdArrowNavigation();
+          disableBackspaceIntoATable();
+        }
+      };
+      if (isRtc(editor)) {
+        setupRtc();
+      } else {
+        setup();
+      }
+      return {
+        refreshContentEditable,
+        isHidden
+      };
+    };
+
+    const DOM$6 = DOMUtils.DOM;
+    const appendStyle = (editor, text) => {
+      const body = SugarElement.fromDom(editor.getBody());
+      const container = getStyleContainer(getRootNode(body));
+      const style = SugarElement.fromTag('style');
+      set$2(style, 'type', 'text/css');
+      append$1(style, SugarElement.fromText(text));
+      append$1(container, style);
+      editor.on('remove', () => {
+        remove$5(style);
+      });
+    };
+    const getRootName = editor => editor.inline ? editor.getElement().nodeName.toLowerCase() : undefined;
+    const removeUndefined = obj => filter$5(obj, v => isUndefined(v) === false);
+    const mkParserSettings = editor => {
+      const getOption = editor.options.get;
+      const blobCache = editor.editorUpload.blobCache;
+      return removeUndefined({
+        allow_conditional_comments: getOption('allow_conditional_comments'),
+        allow_html_data_urls: getOption('allow_html_data_urls'),
+        allow_svg_data_urls: getOption('allow_svg_data_urls'),
+        allow_html_in_named_anchor: getOption('allow_html_in_named_anchor'),
+        allow_script_urls: getOption('allow_script_urls'),
+        allow_unsafe_link_target: getOption('allow_unsafe_link_target'),
+        convert_fonts_to_spans: getOption('convert_fonts_to_spans'),
+        fix_list_elements: getOption('fix_list_elements'),
+        font_size_legacy_values: getOption('font_size_legacy_values'),
+        forced_root_block: getOption('forced_root_block'),
+        forced_root_block_attrs: getOption('forced_root_block_attrs'),
+        preserve_cdata: getOption('preserve_cdata'),
+        remove_trailing_brs: getOption('remove_trailing_brs'),
+        inline_styles: getOption('inline_styles'),
+        root_name: getRootName(editor),
+        validate: true,
+        blob_cache: blobCache,
+        document: editor.getDoc()
+      });
+    };
+    const mkSchemaSettings = editor => {
+      const getOption = editor.options.get;
+      return removeUndefined({
+        custom_elements: getOption('custom_elements'),
+        extended_valid_elements: getOption('extended_valid_elements'),
+        invalid_elements: getOption('invalid_elements'),
+        invalid_styles: getOption('invalid_styles'),
+        schema: getOption('schema'),
+        valid_children: getOption('valid_children'),
+        valid_classes: getOption('valid_classes'),
+        valid_elements: getOption('valid_elements'),
+        valid_styles: getOption('valid_styles'),
+        verify_html: getOption('verify_html'),
+        padd_empty_block_inline_children: getOption('format_empty_lines')
+      });
+    };
+    const mkSerializerSettings = editor => {
+      const getOption = editor.options.get;
+      return {
+        ...mkParserSettings(editor),
+        ...mkSchemaSettings(editor),
+        ...removeUndefined({
+          url_converter: getOption('url_converter'),
+          url_converter_scope: getOption('url_converter_scope'),
+          element_format: getOption('element_format'),
+          entities: getOption('entities'),
+          entity_encoding: getOption('entity_encoding'),
+          indent: getOption('indent'),
+          indent_after: getOption('indent_after'),
+          indent_before: getOption('indent_before')
+        })
+      };
+    };
+    const createParser = editor => {
+      const parser = DomParser(mkParserSettings(editor), editor.schema);
+      parser.addAttributeFilter('src,href,style,tabindex', (nodes, name) => {
+        let i = nodes.length, node, value;
+        const dom = editor.dom;
+        const internalName = 'data-mce-' + name;
+        while (i--) {
+          node = nodes[i];
+          value = node.attr(name);
+          if (value && !node.attr(internalName)) {
+            if (value.indexOf('data:') === 0 || value.indexOf('blob:') === 0) {
+              continue;
+            }
+            if (name === 'style') {
+              value = dom.serializeStyle(dom.parseStyle(value), node.name);
+              if (!value.length) {
+                value = null;
+              }
+              node.attr(internalName, value);
+              node.attr(name, value);
+            } else if (name === 'tabindex') {
+              node.attr(internalName, value);
+              node.attr(name, null);
+            } else {
+              node.attr(internalName, editor.convertURL(value, name, node.name));
+            }
+          }
+        }
+      });
+      parser.addNodeFilter('script', nodes => {
+        let i = nodes.length;
+        while (i--) {
+          const node = nodes[i];
+          const type = node.attr('type') || 'no/type';
+          if (type.indexOf('mce-') !== 0) {
+            node.attr('type', 'mce-' + type);
+          }
+        }
+      });
+      if (editor.options.get('preserve_cdata')) {
+        parser.addNodeFilter('#cdata', nodes => {
+          let i = nodes.length;
+          while (i--) {
+            const node = nodes[i];
+            node.type = 8;
+            node.name = '#comment';
+            node.value = '[CDATA[' + editor.dom.encode(node.value) + ']]';
+          }
+        });
+      }
+      parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', nodes => {
+        let i = nodes.length;
+        const nonEmptyElements = editor.schema.getNonEmptyElements();
+        while (i--) {
+          const node = nodes[i];
+          if (node.isEmpty(nonEmptyElements) && node.getAll('br').length === 0) {
+            node.append(new AstNode('br', 1));
+          }
+        }
+      });
+      return parser;
+    };
+    const autoFocus = editor => {
+      const autoFocus = getAutoFocus(editor);
+      if (autoFocus) {
+        Delay.setEditorTimeout(editor, () => {
+          let focusEditor;
+          if (autoFocus === true) {
+            focusEditor = editor;
+          } else {
+            focusEditor = editor.editorManager.get(autoFocus);
+          }
+          if (!focusEditor.destroyed) {
+            focusEditor.focus();
+          }
+        }, 100);
+      }
+    };
+    const moveSelectionToFirstCaretPosition = editor => {
+      const root = editor.dom.getRoot();
+      if (!editor.inline && (!hasAnyRanges(editor) || editor.selection.getStart(true) === root)) {
+        firstPositionIn(root).each(pos => {
+          const node = pos.getNode();
+          const caretPos = isTable$3(node) ? firstPositionIn(node).getOr(pos) : pos;
+          editor.selection.setRng(caretPos.toRange());
+        });
+      }
+    };
+    const initEditor = editor => {
+      editor.bindPendingEventDelegates();
+      editor.initialized = true;
+      fireInit(editor);
+      editor.focus(true);
+      moveSelectionToFirstCaretPosition(editor);
+      editor.nodeChanged({ initial: true });
+      const initInstanceCallback = getInitInstanceCallback(editor);
+      if (isFunction(initInstanceCallback)) {
+        initInstanceCallback.call(editor, editor);
+      }
+      autoFocus(editor);
+    };
+    const getStyleSheetLoader$1 = editor => editor.inline ? editor.ui.styleSheetLoader : editor.dom.styleSheetLoader;
+    const makeStylesheetLoadingPromises = (editor, css, framedFonts) => {
+      const promises = [getStyleSheetLoader$1(editor).loadAll(css)];
+      if (editor.inline) {
+        return promises;
+      } else {
+        return promises.concat([editor.ui.styleSheetLoader.loadAll(framedFonts)]);
+      }
+    };
+    const loadContentCss = editor => {
+      const styleSheetLoader = getStyleSheetLoader$1(editor);
+      const fontCss = getFontCss(editor);
+      const css = editor.contentCSS;
+      const removeCss = () => {
+        styleSheetLoader.unloadAll(css);
+        if (!editor.inline) {
+          editor.ui.styleSheetLoader.unloadAll(fontCss);
+        }
+      };
+      const loaded = () => {
+        if (editor.removed) {
+          removeCss();
+        } else {
+          editor.on('remove', removeCss);
+        }
+      };
+      if (editor.contentStyles.length > 0) {
+        let contentCssText = '';
+        Tools.each(editor.contentStyles, style => {
+          contentCssText += style + '\r\n';
+        });
+        editor.dom.addStyle(contentCssText);
+      }
+      const allStylesheets = Promise.all(makeStylesheetLoadingPromises(editor, css, fontCss)).then(loaded).catch(loaded);
+      const contentStyle = getContentStyle(editor);
+      if (contentStyle) {
+        appendStyle(editor, contentStyle);
+      }
+      return allStylesheets;
+    };
+    const preInit = editor => {
+      const doc = editor.getDoc(), body = editor.getBody();
+      firePreInit(editor);
+      if (!shouldBrowserSpellcheck(editor)) {
+        doc.body.spellcheck = false;
+        DOM$6.setAttrib(body, 'spellcheck', 'false');
+      }
+      editor.quirks = Quirks(editor);
+      firePostRender(editor);
+      const directionality = getDirectionality(editor);
+      if (directionality !== undefined) {
+        body.dir = directionality;
+      }
+      const protect = getProtect(editor);
+      if (protect) {
+        editor.on('BeforeSetContent', e => {
+          Tools.each(protect, pattern => {
+            e.content = e.content.replace(pattern, str => {
+              return '<!--mce:protected ' + escape(str) + '-->';
+            });
+          });
+        });
+      }
+      editor.on('SetContent', () => {
+        editor.addVisual(editor.getBody());
+      });
+      editor.on('compositionstart compositionend', e => {
+        editor.composing = e.type === 'compositionstart';
+      });
+    };
+    const loadInitialContent = editor => {
+      if (!isRtc(editor)) {
+        editor.load({
+          initial: true,
+          format: 'html'
+        });
+      }
+      editor.startContent = editor.getContent({ format: 'raw' });
+    };
+    const initEditorWithInitialContent = editor => {
+      if (editor.removed !== true) {
+        loadInitialContent(editor);
+        initEditor(editor);
+      }
+    };
+    const contentBodyLoaded = editor => {
+      const targetElm = editor.getElement();
+      let doc = editor.getDoc();
+      if (editor.inline) {
+        DOM$6.addClass(targetElm, 'mce-content-body');
+        editor.contentDocument = doc = document;
+        editor.contentWindow = window;
+        editor.bodyElement = targetElm;
+        editor.contentAreaContainer = targetElm;
+      }
+      const body = editor.getBody();
+      body.disabled = true;
+      editor.readonly = isReadOnly$1(editor);
+      if (!editor.readonly) {
+        if (editor.inline && DOM$6.getStyle(body, 'position', true) === 'static') {
+          body.style.position = 'relative';
+        }
+        body.contentEditable = 'true';
+      }
+      body.disabled = false;
+      editor.editorUpload = EditorUpload(editor);
+      editor.schema = Schema(mkSchemaSettings(editor));
+      editor.dom = DOMUtils(doc, {
+        keep_values: true,
+        url_converter: editor.convertURL,
+        url_converter_scope: editor,
+        update_styles: true,
+        root_element: editor.inline ? editor.getBody() : null,
+        collect: () => editor.inline,
+        schema: editor.schema,
+        contentCssCors: shouldUseContentCssCors(editor),
+        referrerPolicy: getReferrerPolicy(editor),
+        onSetAttrib: e => {
+          editor.dispatch('SetAttrib', e);
+        }
+      });
+      editor.parser = createParser(editor);
+      editor.serializer = DomSerializer(mkSerializerSettings(editor), editor);
+      editor.selection = EditorSelection(editor.dom, editor.getWin(), editor.serializer, editor);
+      editor.annotator = Annotator(editor);
+      editor.formatter = Formatter(editor);
+      editor.undoManager = UndoManager(editor);
+      editor._nodeChangeDispatcher = new NodeChange(editor);
+      editor._selectionOverrides = SelectionOverrides(editor);
+      setup$o(editor);
+      setup$6(editor);
+      setup$m(editor);
+      if (!isRtc(editor)) {
+        setup$5(editor);
+        setup$1(editor);
+      }
+      const caret = setup$b(editor);
+      setup$p(editor, caret);
+      setup$n(editor);
+      setup$q(editor);
+      setup$7(editor);
+      const setupRtcThunk = setup$s(editor);
+      preInit(editor);
+      setupRtcThunk.fold(() => {
+        loadContentCss(editor).then(() => initEditorWithInitialContent(editor));
+      }, setupRtc => {
+        editor.setProgressState(true);
+        loadContentCss(editor).then(() => {
+          setupRtc().then(_rtcMode => {
+            editor.setProgressState(false);
+            initEditorWithInitialContent(editor);
+            bindEvents(editor);
+          }, err => {
+            editor.notificationManager.open({
+              type: 'error',
+              text: String(err)
+            });
+            initEditorWithInitialContent(editor);
+            bindEvents(editor);
+          });
+        });
+      });
+    };
+    const initContentBody = (editor, skipWrite) => {
+      if (!editor.inline) {
+        editor.getElement().style.visibility = editor.orgVisibility;
+      }
+      if (!skipWrite && !editor.inline) {
+        const iframe = editor.iframeElement;
+        const binder = bind$1(SugarElement.fromDom(iframe), 'load', () => {
+          binder.unbind();
+          editor.contentDocument = iframe.contentDocument;
+          contentBodyLoaded(editor);
+        });
+        iframe.srcdoc = editor.iframeHTML;
+      } else {
+        contentBodyLoaded(editor);
+      }
+    };
+
+    const DOM$5 = DOMUtils.DOM;
+    const createIframeElement = (id, title, customAttrs, tabindex) => {
+      const iframe = SugarElement.fromTag('iframe');
+      tabindex.each(t => set$2(iframe, 'tabindex', t));
+      setAll$1(iframe, customAttrs);
+      setAll$1(iframe, {
+        id: id + '_ifr',
+        frameBorder: '0',
+        allowTransparency: 'true',
+        title
+      });
+      add$2(iframe, 'tox-edit-area__iframe');
+      return iframe;
+    };
+    const getIframeHtml = editor => {
+      let iframeHTML = getDocType(editor) + '<html><head>';
+      if (getDocumentBaseUrl(editor) !== editor.documentBaseUrl) {
+        iframeHTML += '<base href="' + editor.documentBaseURI.getURI() + '" />';
+      }
+      iframeHTML += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
+      const bodyId = getBodyId(editor);
+      const bodyClass = getBodyClass(editor);
+      const translatedAriaText = editor.translate(getIframeAriaText(editor));
+      if (getContentSecurityPolicy(editor)) {
+        iframeHTML += '<meta http-equiv="Content-Security-Policy" content="' + getContentSecurityPolicy(editor) + '" />';
+      }
+      iframeHTML += '</head>' + `<body id="${ bodyId }" class="mce-content-body ${ bodyClass }" data-id="${ editor.id }" aria-label="${ translatedAriaText }">` + '<br>' + '</body></html>';
+      return iframeHTML;
+    };
+    const createIframe = (editor, boxInfo) => {
+      const iframeTitle = editor.translate('Rich Text Area');
+      const tabindex = getOpt(SugarElement.fromDom(editor.getElement()), 'tabindex').bind(toInt);
+      const ifr = createIframeElement(editor.id, iframeTitle, getIframeAttrs(editor), tabindex).dom;
+      ifr.onload = () => {
+        ifr.onload = null;
+        editor.dispatch('load');
+      };
+      editor.contentAreaContainer = boxInfo.iframeContainer;
+      editor.iframeElement = ifr;
+      editor.iframeHTML = getIframeHtml(editor);
+      DOM$5.add(boxInfo.iframeContainer, ifr);
+    };
+    const init$1 = (editor, boxInfo) => {
+      createIframe(editor, boxInfo);
+      if (boxInfo.editorContainer) {
+        DOM$5.get(boxInfo.editorContainer).style.display = editor.orgDisplay;
+        editor.hidden = DOM$5.isHidden(boxInfo.editorContainer);
+      }
+      editor.getElement().style.display = 'none';
+      DOM$5.setAttrib(editor.id, 'aria-hidden', 'true');
+      initContentBody(editor);
+    };
+
+    const DOM$4 = DOMUtils.DOM;
+    const initPlugin = (editor, initializedPlugins, plugin) => {
+      const Plugin = PluginManager.get(plugin);
+      const pluginUrl = PluginManager.urls[plugin] || editor.documentBaseUrl.replace(/\/$/, '');
+      plugin = Tools.trim(plugin);
+      if (Plugin && Tools.inArray(initializedPlugins, plugin) === -1) {
+        if (editor.plugins[plugin]) {
+          return;
+        }
+        try {
+          const pluginInstance = Plugin(editor, pluginUrl) || {};
+          editor.plugins[plugin] = pluginInstance;
+          if (isFunction(pluginInstance.init)) {
+            pluginInstance.init(editor, pluginUrl);
+            initializedPlugins.push(plugin);
+          }
+        } catch (e) {
+          pluginInitError(editor, plugin, e);
+        }
+      }
+    };
+    const trimLegacyPrefix = name => {
+      return name.replace(/^\-/, '');
+    };
+    const initPlugins = editor => {
+      const initializedPlugins = [];
+      each$g(getPlugins(editor), name => {
+        initPlugin(editor, initializedPlugins, trimLegacyPrefix(name));
+      });
+    };
+    const initIcons = editor => {
+      const iconPackName = Tools.trim(getIconPackName(editor));
+      const currentIcons = editor.ui.registry.getAll().icons;
+      const loadIcons = {
+        ...IconManager.get('default').icons,
+        ...IconManager.get(iconPackName).icons
+      };
+      each$f(loadIcons, (svgData, icon) => {
+        if (!has$2(currentIcons, icon)) {
+          editor.ui.registry.addIcon(icon, svgData);
+        }
+      });
+    };
+    const initTheme = editor => {
+      const theme = getTheme(editor);
+      if (isString(theme)) {
+        const Theme = ThemeManager.get(theme);
+        editor.theme = Theme(editor, ThemeManager.urls[theme]) || {};
+        if (isFunction(editor.theme.init)) {
+          editor.theme.init(editor, ThemeManager.urls[theme] || editor.documentBaseUrl.replace(/\/$/, ''));
+        }
+      } else {
+        editor.theme = {};
+      }
+    };
+    const initModel = editor => {
+      const model = getModel(editor);
+      const Model = ModelManager.get(model);
+      editor.model = Model(editor, ModelManager.urls[model]);
+    };
+    const renderFromLoadedTheme = editor => {
+      return editor.theme.renderUI();
+    };
+    const renderFromThemeFunc = editor => {
+      const elm = editor.getElement();
+      const theme = getTheme(editor);
+      const info = theme(editor, elm);
+      if (info.editorContainer.nodeType) {
+        info.editorContainer.id = info.editorContainer.id || editor.id + '_parent';
+      }
+      if (info.iframeContainer && info.iframeContainer.nodeType) {
+        info.iframeContainer.id = info.iframeContainer.id || editor.id + '_iframecontainer';
+      }
+      info.height = info.iframeHeight ? info.iframeHeight : elm.offsetHeight;
+      return info;
+    };
+    const createThemeFalseResult = element => {
+      return {
+        editorContainer: element,
+        iframeContainer: element,
+        api: {}
+      };
+    };
+    const renderThemeFalseIframe = targetElement => {
+      const iframeContainer = DOM$4.create('div');
+      DOM$4.insertAfter(iframeContainer, targetElement);
+      return createThemeFalseResult(iframeContainer);
+    };
+    const renderThemeFalse = editor => {
+      const targetElement = editor.getElement();
+      return editor.inline ? createThemeFalseResult(null) : renderThemeFalseIframe(targetElement);
+    };
+    const renderThemeUi = editor => {
+      const elm = editor.getElement();
+      editor.orgDisplay = elm.style.display;
+      if (isString(getTheme(editor))) {
+        return renderFromLoadedTheme(editor);
+      } else if (isFunction(getTheme(editor))) {
+        return renderFromThemeFunc(editor);
+      } else {
+        return renderThemeFalse(editor);
+      }
+    };
+    const augmentEditorUiApi = (editor, api) => {
+      const uiApiFacade = {
+        show: Optional.from(api.show).getOr(noop),
+        hide: Optional.from(api.hide).getOr(noop),
+        isEnabled: Optional.from(api.isEnabled).getOr(always),
+        setEnabled: state => {
+          if (!editor.mode.isReadOnly()) {
+            Optional.from(api.setEnabled).each(f => f(state));
+          }
+        }
+      };
+      editor.ui = {
+        ...editor.ui,
+        ...uiApiFacade
+      };
+    };
+    const init = editor => {
+      editor.dispatch('ScriptsLoaded');
+      initIcons(editor);
+      initTheme(editor);
+      initModel(editor);
+      initPlugins(editor);
+      const renderInfo = renderThemeUi(editor);
+      augmentEditorUiApi(editor, Optional.from(renderInfo.api).getOr({}));
+      const boxInfo = {
+        editorContainer: renderInfo.editorContainer,
+        iframeContainer: renderInfo.iframeContainer
+      };
+      editor.editorContainer = boxInfo.editorContainer ? boxInfo.editorContainer : null;
+      appendContentCssFromSettings(editor);
+      if (editor.inline) {
+        return initContentBody(editor);
+      } else {
+        return init$1(editor, boxInfo);
+      }
+    };
+
+    const DOM$3 = DOMUtils.DOM;
+    const hasSkipLoadPrefix = name => name.charAt(0) === '-';
+    const loadLanguage = (scriptLoader, editor) => {
+      const languageCode = getLanguageCode(editor);
+      const languageUrl = getLanguageUrl(editor);
+      if (I18n.hasCode(languageCode) === false && languageCode !== 'en') {
+        const url = isNotEmpty(languageUrl) ? languageUrl : `${ editor.editorManager.baseURL }/langs/${ languageCode }.js`;
+        scriptLoader.add(url).catch(() => {
+          languageLoadError(editor, url, languageCode);
+        });
+      }
+    };
+    const loadTheme = (editor, suffix) => {
+      const theme = getTheme(editor);
+      if (isString(theme) && !hasSkipLoadPrefix(theme) && !has$2(ThemeManager.urls, theme)) {
+        const themeUrl = getThemeUrl(editor);
+        const url = themeUrl ? editor.documentBaseURI.toAbsolute(themeUrl) : `themes/${ theme }/theme${ suffix }.js`;
+        ThemeManager.load(theme, url).catch(() => {
+          themeLoadError(editor, url, theme);
+        });
+      }
+    };
+    const loadModel = (editor, suffix) => {
+      const model = getModel(editor);
+      if (model !== 'plugin' && !has$2(ModelManager.urls, model)) {
+        const modelUrl = getModelUrl(editor);
+        const url = isString(modelUrl) ? editor.documentBaseURI.toAbsolute(modelUrl) : `models/${ model }/model${ suffix }.js`;
+        ModelManager.load(model, url).catch(() => {
+          modelLoadError(editor, url, model);
+        });
+      }
+    };
+    const getIconsUrlMetaFromUrl = editor => Optional.from(getIconsUrl(editor)).filter(isNotEmpty).map(url => ({
+      url,
+      name: Optional.none()
+    }));
+    const getIconsUrlMetaFromName = (editor, name, suffix) => Optional.from(name).filter(name => isNotEmpty(name) && !IconManager.has(name)).map(name => ({
+      url: `${ editor.editorManager.baseURL }/icons/${ name }/icons${ suffix }.js`,
+      name: Optional.some(name)
+    }));
+    const loadIcons = (scriptLoader, editor, suffix) => {
+      const defaultIconsUrl = getIconsUrlMetaFromName(editor, 'default', suffix);
+      const customIconsUrl = getIconsUrlMetaFromUrl(editor).orThunk(() => getIconsUrlMetaFromName(editor, getIconPackName(editor), ''));
+      each$g(cat([
+        defaultIconsUrl,
+        customIconsUrl
+      ]), urlMeta => {
+        scriptLoader.add(urlMeta.url).catch(() => {
+          iconsLoadError(editor, urlMeta.url, urlMeta.name.getOrUndefined());
+        });
+      });
+    };
+    const loadPlugins = (editor, suffix) => {
+      const loadPlugin = (name, url) => {
+        PluginManager.load(name, url).catch(() => {
+          pluginLoadError(editor, url, name);
+        });
+      };
+      each$f(getExternalPlugins$1(editor), (url, name) => {
+        loadPlugin(name, url);
+        editor.options.set('plugins', getPlugins(editor).concat(name));
+      });
+      each$g(getPlugins(editor), plugin => {
+        plugin = Tools.trim(plugin);
+        if (plugin && !PluginManager.urls[plugin] && !hasSkipLoadPrefix(plugin)) {
+          loadPlugin(plugin, `plugins/${ plugin }/plugin${ suffix }.js`);
+        }
+      });
+    };
+    const isThemeLoaded = editor => {
+      const theme = getTheme(editor);
+      return !isString(theme) || isNonNullable(ThemeManager.get(theme));
+    };
+    const isModelLoaded = editor => {
+      const model = getModel(editor);
+      return isNonNullable(ModelManager.get(model));
+    };
+    const loadScripts = (editor, suffix) => {
+      const scriptLoader = ScriptLoader.ScriptLoader;
+      const initEditor = () => {
+        if (!editor.removed && isThemeLoaded(editor) && isModelLoaded(editor)) {
+          init(editor);
+        }
+      };
+      loadTheme(editor, suffix);
+      loadModel(editor, suffix);
+      loadLanguage(scriptLoader, editor);
+      loadIcons(scriptLoader, editor, suffix);
+      loadPlugins(editor, suffix);
+      scriptLoader.loadQueue().then(initEditor, initEditor);
+    };
+    const getStyleSheetLoader = (element, editor) => instance.forElement(element, {
+      contentCssCors: hasContentCssCors(editor),
+      referrerPolicy: getReferrerPolicy(editor)
+    });
+    const render = editor => {
+      const id = editor.id;
+      I18n.setCode(getLanguageCode(editor));
+      const readyHandler = () => {
+        DOM$3.unbind(window, 'ready', readyHandler);
+        editor.render();
+      };
+      if (!EventUtils.Event.domLoaded) {
+        DOM$3.bind(window, 'ready', readyHandler);
+        return;
+      }
+      if (!editor.getElement()) {
+        return;
+      }
+      const element = SugarElement.fromDom(editor.getElement());
+      const snapshot = clone$4(element);
+      editor.on('remove', () => {
+        eachr(element.dom.attributes, attr => remove$a(element, attr.name));
+        setAll$1(element, snapshot);
+      });
+      editor.ui.styleSheetLoader = getStyleSheetLoader(element, editor);
+      if (!isInline(editor)) {
+        editor.orgVisibility = editor.getElement().style.visibility;
+        editor.getElement().style.visibility = 'hidden';
+      } else {
+        editor.inline = true;
+      }
+      const form = editor.getElement().form || DOM$3.getParent(id, 'form');
+      if (form) {
+        editor.formElement = form;
+        if (hasHiddenInput(editor) && !isTextareaOrInput(editor.getElement())) {
+          DOM$3.insertAfter(DOM$3.create('input', {
+            type: 'hidden',
+            name: id
+          }), id);
+          editor.hasHiddenInput = true;
+        }
+        editor.formEventDelegate = e => {
+          editor.dispatch(e.type, e);
+        };
+        DOM$3.bind(form, 'submit reset', editor.formEventDelegate);
+        editor.on('reset', () => {
+          editor.resetContent();
+        });
+        if (shouldPatchSubmit(editor) && !form.submit.nodeType && !form.submit.length && !form._mceOldSubmit) {
+          form._mceOldSubmit = form.submit;
+          form.submit = () => {
+            editor.editorManager.triggerSave();
+            editor.setDirty(false);
+            return form._mceOldSubmit(form);
+          };
+        }
+      }
+      editor.windowManager = WindowManager(editor);
+      editor.notificationManager = NotificationManager(editor);
+      if (isEncodingXml(editor)) {
+        editor.on('GetContent', e => {
+          if (e.save) {
+            e.content = DOM$3.encode(e.content);
+          }
+        });
+      }
+      if (shouldAddFormSubmitTrigger(editor)) {
+        editor.on('submit', () => {
+          if (editor.initialized) {
+            editor.save();
+          }
+        });
+      }
+      if (shouldAddUnloadTrigger(editor)) {
+        editor._beforeUnload = () => {
+          if (editor.initialized && !editor.destroyed && !editor.isHidden()) {
+            editor.save({
+              format: 'raw',
+              no_events: true,
+              set_dirty: false
+            });
+          }
+        };
+        editor.editorManager.on('BeforeUnload', editor._beforeUnload);
+      }
+      editor.editorManager.add(editor);
+      loadScripts(editor, editor.suffix);
+    };
+
+    const sectionResult = (sections, settings) => ({
+      sections: constant(sections),
+      options: constant(settings)
+    });
+    const deviceDetection = detect$2().deviceType;
+    const isPhone = deviceDetection.isPhone();
+    const isTablet = deviceDetection.isTablet();
+    const normalizePlugins = plugins => {
+      if (isNullable(plugins)) {
+        return [];
+      } else {
+        const pluginNames = isArray$1(plugins) ? plugins : plugins.split(/[ ,]/);
+        const trimmedPlugins = map$3(pluginNames, trim$3);
+        return filter$6(trimmedPlugins, isNotEmpty);
+      }
+    };
+    const extractSections = (keys, options) => {
+      const result = bifilter(options, (value, key) => {
+        return contains$2(keys, key);
+      });
+      return sectionResult(result.t, result.f);
+    };
+    const getSection = (sectionResult, name, defaults = {}) => {
+      const sections = sectionResult.sections();
+      const sectionOptions = get$a(sections, name).getOr({});
+      return Tools.extend({}, defaults, sectionOptions);
+    };
+    const hasSection = (sectionResult, name) => {
+      return has$2(sectionResult.sections(), name);
+    };
+    const getSectionConfig = (sectionResult, name) => {
+      return hasSection(sectionResult, name) ? sectionResult.sections()[name] : {};
+    };
+    const getMobileOverrideOptions = (mobileOptions, isPhone) => {
+      const defaultMobileOptions = {
+        table_grid: false,
+        object_resizing: false,
+        resize: false,
+        toolbar_mode: get$a(mobileOptions, 'toolbar_mode').getOr('scrolling'),
+        toolbar_sticky: false
+      };
+      const defaultPhoneOptions = { menubar: false };
+      return {
+        ...defaultMobileOptions,
+        ...isPhone ? defaultPhoneOptions : {}
+      };
+    };
+    const getExternalPlugins = (overrideOptions, options) => {
+      var _a;
+      const userDefinedExternalPlugins = (_a = options.external_plugins) !== null && _a !== void 0 ? _a : {};
+      if (overrideOptions && overrideOptions.external_plugins) {
+        return Tools.extend({}, overrideOptions.external_plugins, userDefinedExternalPlugins);
+      } else {
+        return userDefinedExternalPlugins;
+      }
+    };
+    const combinePlugins = (forcedPlugins, plugins) => {
+      return [].concat(normalizePlugins(forcedPlugins)).concat(normalizePlugins(plugins));
+    };
+    const getPlatformPlugins = (isMobileDevice, sectionResult, desktopPlugins, mobilePlugins) => {
+      if (isMobileDevice && hasSection(sectionResult, 'mobile')) {
+        return mobilePlugins;
+      } else {
+        return desktopPlugins;
+      }
+    };
+    const processPlugins = (isMobileDevice, sectionResult, defaultOverrideOptions, options) => {
+      const forcedPlugins = normalizePlugins(defaultOverrideOptions.forced_plugins);
+      const desktopPlugins = normalizePlugins(options.plugins);
+      const mobileConfig = getSectionConfig(sectionResult, 'mobile');
+      const mobilePlugins = mobileConfig.plugins ? normalizePlugins(mobileConfig.plugins) : desktopPlugins;
+      const platformPlugins = getPlatformPlugins(isMobileDevice, sectionResult, desktopPlugins, mobilePlugins);
+      const combinedPlugins = combinePlugins(forcedPlugins, platformPlugins);
+      return Tools.extend(options, {
+        forced_plugins: forcedPlugins,
+        plugins: combinedPlugins
+      });
+    };
+    const isOnMobile = (isMobileDevice, sectionResult) => {
+      return isMobileDevice && hasSection(sectionResult, 'mobile');
+    };
+    const combineOptions = (isMobileDevice, isPhone, defaultOptions, defaultOverrideOptions, options) => {
+      var _a;
+      const deviceOverrideOptions = isMobileDevice ? { mobile: getMobileOverrideOptions((_a = options.mobile) !== null && _a !== void 0 ? _a : {}, isPhone) } : {};
+      const sectionResult = extractSections(['mobile'], deepMerge(deviceOverrideOptions, options));
+      const extendedOptions = Tools.extend(defaultOptions, defaultOverrideOptions, sectionResult.options(), isOnMobile(isMobileDevice, sectionResult) ? getSection(sectionResult, 'mobile') : {}, { external_plugins: getExternalPlugins(defaultOverrideOptions, sectionResult.options()) });
+      return processPlugins(isMobileDevice, sectionResult, defaultOverrideOptions, extendedOptions);
+    };
+    const normalizeOptions = (defaultOverrideOptions, options) => combineOptions(isPhone || isTablet, isPhone, options, defaultOverrideOptions, options);
+
+    const addVisual = (editor, elm) => addVisual$1(editor, elm);
+
+    const registerExecCommands$3 = editor => {
+      const toggleFormat = (name, value) => {
+        editor.formatter.toggle(name, value);
+        editor.nodeChanged();
+      };
+      const toggleAlign = align => () => {
+        each$g('left,center,right,justify'.split(','), name => {
+          if (align !== name) {
+            editor.formatter.remove('align' + name);
+          }
+        });
+        if (align !== 'none') {
+          toggleFormat('align' + align);
+        }
+      };
+      editor.editorCommands.addCommands({
+        JustifyLeft: toggleAlign('left'),
+        JustifyCenter: toggleAlign('center'),
+        JustifyRight: toggleAlign('right'),
+        JustifyFull: toggleAlign('justify'),
+        JustifyNone: toggleAlign('none')
+      });
+    };
+    const registerQueryStateCommands$1 = editor => {
+      const alignStates = name => () => {
+        const selection = editor.selection;
+        const nodes = selection.isCollapsed() ? [editor.dom.getParent(selection.getNode(), editor.dom.isBlock)] : selection.getSelectedBlocks();
+        return exists(nodes, node => isNonNullable(editor.formatter.matchNode(node, name)));
+      };
+      editor.editorCommands.addCommands({
+        JustifyLeft: alignStates('alignleft'),
+        JustifyCenter: alignStates('aligncenter'),
+        JustifyRight: alignStates('alignright'),
+        JustifyFull: alignStates('alignjustify')
+      }, 'state');
+    };
+    const registerCommands$a = editor => {
+      registerExecCommands$3(editor);
+      registerQueryStateCommands$1(editor);
+    };
+
+    const registerCommands$9 = editor => {
+      editor.editorCommands.addCommands({
+        'Cut,Copy,Paste': command => {
+          const doc = editor.getDoc();
+          let failed;
+          try {
+            doc.execCommand(command);
+          } catch (ex) {
+            failed = true;
+          }
+          if (command === 'paste' && !doc.queryCommandEnabled(command)) {
+            failed = true;
+          }
+          if (failed || !doc.queryCommandSupported(command)) {
+            let msg = editor.translate(`Your browser doesn't support direct access to the clipboard. ` + 'Please use the Ctrl+X/C/V keyboard shortcuts instead.');
+            if (Env.os.isMacOS() || Env.os.isiOS()) {
+              msg = msg.replace(/Ctrl\+/g, '\u2318+');
+            }
+            editor.notificationManager.open({
+              text: msg,
+              type: 'error'
+            });
+          }
+        }
+      });
+    };
+
+    const trimOrPadLeftRight = (dom, rng, html) => {
+      const root = SugarElement.fromDom(dom.getRoot());
+      if (needsToBeNbspLeft(root, CaretPosition.fromRangeStart(rng))) {
+        html = html.replace(/^ /, '&nbsp;');
+      } else {
+        html = html.replace(/^&nbsp;/, ' ');
+      }
+      if (needsToBeNbspRight(root, CaretPosition.fromRangeEnd(rng))) {
+        html = html.replace(/(&nbsp;| )(<br( \/)>)?$/, '&nbsp;');
+      } else {
+        html = html.replace(/&nbsp;(<br( \/)?>)?$/, ' ');
+      }
+      return html;
+    };
+
+    const processValue$1 = value => {
+      if (typeof value !== 'string') {
+        const details = Tools.extend({
+          paste: value.paste,
+          data: { paste: value.paste }
+        }, value);
+        return {
+          content: value.content,
+          details
+        };
+      }
+      return {
+        content: value,
+        details: {}
+      };
+    };
+    const trimOrPad = (editor, value) => {
+      const selection = editor.selection;
+      const dom = editor.dom;
+      if (/^ | $/.test(value)) {
+        return trimOrPadLeftRight(dom, selection.getRng(), value);
+      } else {
+        return value;
+      }
+    };
+    const insertAtCaret = (editor, value) => {
+      const {content, details} = processValue$1(value);
+      preProcessSetContent(editor, {
+        content: trimOrPad(editor, content),
+        format: 'html',
+        set: false,
+        selection: true,
+        paste: details.paste
+      }).each(args => {
+        const insertedContent = insertContent$1(editor, args.content, details);
+        postProcessSetContent(editor, insertedContent, args);
+        editor.addVisual();
+      });
+    };
+
+    const registerCommands$8 = editor => {
+      editor.editorCommands.addCommands({
+        mceCleanup: () => {
+          const bm = editor.selection.getBookmark();
+          editor.setContent(editor.getContent());
+          editor.selection.moveToBookmark(bm);
+        },
+        insertImage: (_command, _ui, value) => {
+          insertAtCaret(editor, editor.dom.createHTML('img', { src: value }));
+        },
+        insertHorizontalRule: () => {
+          editor.execCommand('mceInsertContent', false, '<hr>');
+        },
+        insertText: (_command, _ui, value) => {
+          insertAtCaret(editor, editor.dom.encode(value));
+        },
+        insertHTML: (_command, _ui, value) => {
+          insertAtCaret(editor, value);
+        },
+        mceInsertContent: (_command, _ui, value) => {
+          insertAtCaret(editor, value);
+        },
+        mceSetContent: (_command, _ui, value) => {
+          editor.setContent(value);
+        },
+        mceReplaceContent: (_command, _ui, value) => {
+          editor.execCommand('mceInsertContent', false, value.replace(/\{\$selection\}/g, editor.selection.getContent({ format: 'text' })));
+        },
+        mceNewDocument: () => {
+          editor.setContent('');
+        }
+      });
+    };
+
+    const legacyPropNames = {
+      'font-size': 'size',
+      'font-family': 'face'
+    };
+    const getSpecifiedFontProp = (propName, rootElm, elm) => {
+      const getProperty = elm => getRaw$1(elm, propName).orThunk(() => {
+        if (name(elm) === 'font') {
+          return get$a(legacyPropNames, propName).bind(legacyPropName => getOpt(elm, legacyPropName));
+        } else {
+          return Optional.none();
+        }
+      });
+      const isRoot = elm => eq(SugarElement.fromDom(rootElm), elm);
+      return closest$2(SugarElement.fromDom(elm), elm => getProperty(elm), isRoot);
+    };
+    const normalizeFontFamily = fontFamily => fontFamily.replace(/[\'\"\\]/g, '').replace(/,\s+/g, ',');
+    const getComputedFontProp = (propName, elm) => Optional.from(DOMUtils.DOM.getStyle(elm, propName, true));
+    const getFontProp = propName => (rootElm, elm) => Optional.from(elm).map(SugarElement.fromDom).filter(isElement$7).bind(element => getSpecifiedFontProp(propName, rootElm, element.dom).or(getComputedFontProp(propName, element.dom))).getOr('');
+    const getFontSize = getFontProp('font-size');
+    const getFontFamily = compose(normalizeFontFamily, getFontProp('font-family'));
+
+    const findFirstCaretElement = editor => firstPositionIn(editor.getBody()).map(caret => {
+      const container = caret.container();
+      return isText$8(container) ? container.parentNode : container;
+    });
+    const getCaretElement = editor => Optional.from(editor.selection.getRng()).bind(rng => {
+      const root = editor.getBody();
+      const atStartOfNode = rng.startContainer === root && rng.startOffset === 0;
+      return atStartOfNode ? Optional.none() : Optional.from(editor.selection.getStart(true));
+    });
+    const bindRange = (editor, binder) => getCaretElement(editor).orThunk(curry(findFirstCaretElement, editor)).map(SugarElement.fromDom).filter(isElement$7).bind(binder);
+    const mapRange = (editor, mapper) => bindRange(editor, compose1(Optional.some, mapper));
+
+    const fromFontSizeNumber = (editor, value) => {
+      if (/^[0-9.]+$/.test(value)) {
+        const fontSizeNumber = parseInt(value, 10);
+        if (fontSizeNumber >= 1 && fontSizeNumber <= 7) {
+          const fontSizes = getFontStyleValues(editor);
+          const fontClasses = getFontSizeClasses(editor);
+          if (fontClasses) {
+            return fontClasses[fontSizeNumber - 1] || value;
+          } else {
+            return fontSizes[fontSizeNumber - 1] || value;
+          }
+        } else {
+          return value;
+        }
+      } else {
+        return value;
+      }
+    };
+    const normalizeFontNames = font => {
+      const fonts = font.split(/\s*,\s*/);
+      return map$3(fonts, font => {
+        if (font.indexOf(' ') !== -1 && !(startsWith(font, '"') || startsWith(font, `'`))) {
+          return `'${ font }'`;
+        } else {
+          return font;
+        }
+      }).join(',');
+    };
+    const fontNameAction = (editor, value) => {
+      const font = fromFontSizeNumber(editor, value);
+      editor.formatter.toggle('fontname', { value: normalizeFontNames(font) });
+      editor.nodeChanged();
+    };
+    const fontNameQuery = editor => mapRange(editor, elm => getFontFamily(editor.getBody(), elm.dom)).getOr('');
+    const fontSizeAction = (editor, value) => {
+      editor.formatter.toggle('fontsize', { value: fromFontSizeNumber(editor, value) });
+      editor.nodeChanged();
+    };
+    const fontSizeQuery = editor => mapRange(editor, elm => getFontSize(editor.getBody(), elm.dom)).getOr('');
+
+    const lineHeightQuery = editor => mapRange(editor, elm => {
+      const root = SugarElement.fromDom(editor.getBody());
+      const specifiedStyle = closest$2(elm, elm => getRaw$1(elm, 'line-height'), curry(eq, root));
+      const computedStyle = () => {
+        const lineHeight = parseFloat(get$7(elm, 'line-height'));
+        const fontSize = parseFloat(get$7(elm, 'font-size'));
+        return String(lineHeight / fontSize);
+      };
+      return specifiedStyle.getOrThunk(computedStyle);
+    }).getOr('');
+    const lineHeightAction = (editor, lineHeight) => {
+      editor.formatter.toggle('lineheight', { value: String(lineHeight) });
+      editor.nodeChanged();
+    };
+
+    const registerExecCommands$2 = editor => {
+      const toggleFormat = (name, value) => {
+        editor.formatter.toggle(name, value);
+        editor.nodeChanged();
+      };
+      editor.editorCommands.addCommands({
+        'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': command => {
+          toggleFormat(command);
+        },
+        'ForeColor,HiliteColor': (command, _ui, value) => {
+          toggleFormat(command, { value });
+        },
+        'BackColor': (_command, _ui, value) => {
+          toggleFormat('hilitecolor', { value });
+        },
+        'FontName': (_command, _ui, value) => {
+          fontNameAction(editor, value);
+        },
+        'FontSize': (_command, _ui, value) => {
+          fontSizeAction(editor, value);
+        },
+        'LineHeight': (_command, _ui, value) => {
+          lineHeightAction(editor, value);
+        },
+        'Lang': (command, _ui, lang) => {
+          toggleFormat(command, {
+            value: lang.code,
+            customValue: lang.customCode
+          });
+        },
+        'RemoveFormat': command => {
+          editor.formatter.remove(command);
+        },
+        'mceBlockQuote': () => {
+          toggleFormat('blockquote');
+        },
+        'FormatBlock': (_command, _ui, value) => {
+          toggleFormat(isString(value) ? value : 'p');
+        },
+        'mceToggleFormat': (_command, _ui, value) => {
+          toggleFormat(value);
+        }
+      });
+    };
+    const registerQueryValueCommands = editor => {
+      const isFormatMatch = name => editor.formatter.match(name);
+      editor.editorCommands.addCommands({
+        'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': command => isFormatMatch(command),
+        'mceBlockQuote': () => isFormatMatch('blockquote')
+      }, 'state');
+      editor.editorCommands.addQueryValueHandler('FontName', () => fontNameQuery(editor));
+      editor.editorCommands.addQueryValueHandler('FontSize', () => fontSizeQuery(editor));
+      editor.editorCommands.addQueryValueHandler('LineHeight', () => lineHeightQuery(editor));
+    };
+    const registerCommands$7 = editor => {
+      registerExecCommands$2(editor);
+      registerQueryValueCommands(editor);
+    };
+
+    const registerCommands$6 = editor => {
+      editor.editorCommands.addCommands({
+        mceAddUndoLevel: () => {
+          editor.undoManager.add();
+        },
+        mceEndUndoLevel: () => {
+          editor.undoManager.add();
+        },
+        Undo: () => {
+          editor.undoManager.undo();
+        },
+        Redo: () => {
+          editor.undoManager.redo();
+        }
+      });
+    };
+
+    const registerCommands$5 = editor => {
+      editor.editorCommands.addCommands({
+        Indent: () => {
+          indent(editor);
+        },
+        Outdent: () => {
+          outdent(editor);
+        }
+      });
+      editor.editorCommands.addCommands({ Outdent: () => canOutdent(editor) }, 'state');
+    };
+
+    const registerCommands$4 = editor => {
+      const applyLinkToSelection = (_command, _ui, value) => {
+        const linkDetails = isString(value) ? { href: value } : value;
+        const anchor = editor.dom.getParent(editor.selection.getNode(), 'a');
+        if (isObject(linkDetails) && isString(linkDetails.href)) {
+          linkDetails.href = linkDetails.href.replace(/ /g, '%20');
+          if (!anchor || !linkDetails.href) {
+            editor.formatter.remove('link');
+          }
+          if (linkDetails.href) {
+            editor.formatter.apply('link', linkDetails, anchor);
+          }
+        }
+      };
+      editor.editorCommands.addCommands({
+        unlink: () => {
+          if (editor.selection.isCollapsed()) {
+            const elm = editor.dom.getParent(editor.selection.getStart(), 'a');
+            if (elm) {
+              editor.dom.remove(elm, true);
+            }
+            return;
+          }
+          editor.formatter.remove('link');
+        },
+        mceInsertLink: applyLinkToSelection,
+        createLink: applyLinkToSelection
+      });
+    };
+
+    const registerExecCommands$1 = editor => {
+      editor.editorCommands.addCommands({
+        'InsertUnorderedList,InsertOrderedList': command => {
+          editor.getDoc().execCommand(command);
+          const listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul');
+          if (listElm) {
+            const listParent = listElm.parentNode;
+            if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) {
+              const bm = editor.selection.getBookmark();
+              editor.dom.split(listParent, listElm);
+              editor.selection.moveToBookmark(bm);
+            }
+          }
+        }
+      });
+    };
+    const registerQueryStateCommands = editor => {
+      editor.editorCommands.addCommands({
+        'InsertUnorderedList,InsertOrderedList': command => {
+          const list = editor.dom.getParent(editor.selection.getNode(), 'ul,ol');
+          return list && (command === 'insertunorderedlist' && list.tagName === 'UL' || command === 'insertorderedlist' && list.tagName === 'OL');
+        }
+      }, 'state');
+    };
+    const registerCommands$3 = editor => {
+      registerExecCommands$1(editor);
+      registerQueryStateCommands(editor);
+    };
+
+    const registerCommands$2 = editor => {
+      editor.editorCommands.addCommands({
+        insertParagraph: () => {
+          insert(editor);
+        },
+        mceInsertNewLine: (_command, _ui, value) => {
+          insert(editor, value);
+        },
+        InsertLineBreak: (_command, _ui, value) => {
+          insert$1(editor, value);
+        }
+      });
+    };
+
+    const registerCommands$1 = editor => {
+      editor.editorCommands.addCommands({
+        mceSelectNodeDepth: (_command, _ui, value) => {
+          let counter = 0;
+          editor.dom.getParent(editor.selection.getNode(), node => {
+            if (node.nodeType === 1 && counter++ === value) {
+              editor.selection.select(node);
+              return false;
+            }
+          }, editor.getBody());
+        },
+        mceSelectNode: (_command, _ui, value) => {
+          editor.selection.select(value);
+        },
+        selectAll: () => {
+          const editingHost = editor.dom.getParent(editor.selection.getStart(), isContentEditableTrue$4);
+          if (editingHost) {
+            const rng = editor.dom.createRng();
+            rng.selectNodeContents(editingHost);
+            editor.selection.setRng(rng);
+          }
+        }
+      });
+    };
+
+    const registerExecCommands = editor => {
+      editor.editorCommands.addCommands({
+        mceRemoveNode: (_command, _ui, value) => {
+          const node = value !== null && value !== void 0 ? value : editor.selection.getNode();
+          if (node !== editor.getBody()) {
+            const bm = editor.selection.getBookmark();
+            editor.dom.remove(node, true);
+            editor.selection.moveToBookmark(bm);
+          }
+        },
+        mcePrint: () => {
+          editor.getWin().print();
+        },
+        mceFocus: (_command, _ui, value) => {
+          focus(editor, value);
+        },
+        mceToggleVisualAid: () => {
+          editor.hasVisual = !editor.hasVisual;
+          editor.addVisual();
+        }
+      });
+    };
+    const registerCommands = editor => {
+      registerCommands$a(editor);
+      registerCommands$9(editor);
+      registerCommands$6(editor);
+      registerCommands$1(editor);
+      registerCommands$8(editor);
+      registerCommands$4(editor);
+      registerCommands$5(editor);
+      registerCommands$2(editor);
+      registerCommands$3(editor);
+      registerCommands$7(editor);
+      registerExecCommands(editor);
+    };
+
+    class EditorCommands {
+      constructor(editor) {
+        this.commands = {
+          state: {},
+          exec: {},
+          value: {}
+        };
+        this.editor = editor;
+      }
+      execCommand(command, ui, value, args) {
+        const editor = this.editor;
+        const lowerCaseCommand = command.toLowerCase();
+        const skipFocus = args === null || args === void 0 ? void 0 : args.skip_focus;
+        if (editor.removed) {
+          return false;
+        }
+        if (lowerCaseCommand !== 'mcefocus') {
+          if (!/^(mceAddUndoLevel|mceEndUndoLevel)$/i.test(lowerCaseCommand) && !skipFocus) {
+            editor.focus();
+          } else {
+            restore(editor);
+          }
+        }
+        const eventArgs = editor.dispatch('BeforeExecCommand', {
+          command,
+          ui,
+          value
+        });
+        if (eventArgs.isDefaultPrevented()) {
+          return false;
+        }
+        const func = this.commands.exec[lowerCaseCommand];
+        if (isFunction(func)) {
+          func(lowerCaseCommand, ui, value);
+          editor.dispatch('ExecCommand', {
+            command,
+            ui,
+            value
+          });
+          return true;
+        }
+        return false;
+      }
+      queryCommandState(command) {
+        if (this.editor.quirks.isHidden() || this.editor.removed) {
+          return false;
+        }
+        const lowerCaseCommand = command.toLowerCase();
+        const func = this.commands.state[lowerCaseCommand];
+        if (isFunction(func)) {
+          return func(lowerCaseCommand);
+        }
+        return false;
+      }
+      queryCommandValue(command) {
+        if (this.editor.quirks.isHidden() || this.editor.removed) {
+          return '';
+        }
+        const lowerCaseCommand = command.toLowerCase();
+        const func = this.commands.value[lowerCaseCommand];
+        if (isFunction(func)) {
+          return func(lowerCaseCommand);
+        }
+        return '';
+      }
+      addCommands(commandList, type = 'exec') {
+        const commands = this.commands;
+        each$f(commandList, (callback, command) => {
+          each$g(command.toLowerCase().split(','), command => {
+            commands[type][command] = callback;
+          });
+        });
+      }
+      addCommand(command, callback, scope) {
+        const lowerCaseCommand = command.toLowerCase();
+        this.commands.exec[lowerCaseCommand] = (_command, ui, value) => callback.call(scope !== null && scope !== void 0 ? scope : this.editor, ui, value);
+      }
+      queryCommandSupported(command) {
+        const lowerCaseCommand = command.toLowerCase();
+        if (this.commands.exec[lowerCaseCommand]) {
+          return true;
+        }
+        return false;
+      }
+      addQueryStateHandler(command, callback, scope) {
+        this.commands.state[command.toLowerCase()] = () => callback.call(scope !== null && scope !== void 0 ? scope : this.editor);
+      }
+      addQueryValueHandler(command, callback, scope) {
+        this.commands.value[command.toLowerCase()] = () => callback.call(scope !== null && scope !== void 0 ? scope : this.editor);
+      }
+    }
+
+    const internalContentEditableAttr = 'data-mce-contenteditable';
+    const toggleClass = (elm, cls, state) => {
+      if (has(elm, cls) && state === false) {
+        remove$7(elm, cls);
+      } else if (state) {
+        add$2(elm, cls);
+      }
+    };
+    const setEditorCommandState = (editor, cmd, state) => {
+      try {
+        editor.getDoc().execCommand(cmd, false, String(state));
+      } catch (ex) {
+      }
+    };
+    const setContentEditable = (elm, state) => {
+      elm.dom.contentEditable = state ? 'true' : 'false';
+    };
+    const switchOffContentEditableTrue = elm => {
+      each$g(descendants(elm, '*[contenteditable="true"]'), elm => {
+        set$2(elm, internalContentEditableAttr, 'true');
+        setContentEditable(elm, false);
+      });
+    };
+    const switchOnContentEditableTrue = elm => {
+      each$g(descendants(elm, `*[${ internalContentEditableAttr }="true"]`), elm => {
+        remove$a(elm, internalContentEditableAttr);
+        setContentEditable(elm, true);
+      });
+    };
+    const removeFakeSelection = editor => {
+      Optional.from(editor.selection.getNode()).each(elm => {
+        elm.removeAttribute('data-mce-selected');
+      });
+    };
+    const restoreFakeSelection = editor => {
+      editor.selection.setRng(editor.selection.getRng());
+    };
+    const toggleReadOnly = (editor, state) => {
+      const body = SugarElement.fromDom(editor.getBody());
+      toggleClass(body, 'mce-content-readonly', state);
+      if (state) {
+        editor.selection.controlSelection.hideResizeRect();
+        editor._selectionOverrides.hideFakeCaret();
+        removeFakeSelection(editor);
+        editor.readonly = true;
+        setContentEditable(body, false);
+        switchOffContentEditableTrue(body);
+      } else {
+        editor.readonly = false;
+        setContentEditable(body, true);
+        switchOnContentEditableTrue(body);
+        setEditorCommandState(editor, 'StyleWithCSS', false);
+        setEditorCommandState(editor, 'enableInlineTableEditing', false);
+        setEditorCommandState(editor, 'enableObjectResizing', false);
+        if (hasEditorOrUiFocus(editor)) {
+          editor.focus();
+        }
+        restoreFakeSelection(editor);
+        editor.nodeChanged();
+      }
+    };
+    const isReadOnly = editor => editor.readonly;
+    const registerFilters = editor => {
+      editor.parser.addAttributeFilter('contenteditable', nodes => {
+        if (isReadOnly(editor)) {
+          each$g(nodes, node => {
+            node.attr(internalContentEditableAttr, node.attr('contenteditable'));
+            node.attr('contenteditable', 'false');
+          });
+        }
+      });
+      editor.serializer.addAttributeFilter(internalContentEditableAttr, nodes => {
+        if (isReadOnly(editor)) {
+          each$g(nodes, node => {
+            node.attr('contenteditable', node.attr(internalContentEditableAttr));
+          });
+        }
+      });
+      editor.serializer.addTempAttr(internalContentEditableAttr);
+    };
+    const registerReadOnlyContentFilters = editor => {
+      if (editor.serializer) {
+        registerFilters(editor);
+      } else {
+        editor.on('PreInit', () => {
+          registerFilters(editor);
+        });
+      }
+    };
+    const isClickEvent = e => e.type === 'click';
+    const getAnchorHrefOpt = (editor, elm) => {
+      const isRoot = elm => eq(elm, SugarElement.fromDom(editor.getBody()));
+      return closest$3(elm, 'a', isRoot).bind(a => getOpt(a, 'href'));
+    };
+    const processReadonlyEvents = (editor, e) => {
+      if (isClickEvent(e) && !VK.metaKeyPressed(e)) {
+        const elm = SugarElement.fromDom(e.target);
+        getAnchorHrefOpt(editor, elm).each(href => {
+          e.preventDefault();
+          if (/^#/.test(href)) {
+            const targetEl = editor.dom.select(`${ href },[name="${ removeLeading(href, '#') }"]`);
+            if (targetEl.length) {
+              editor.selection.scrollIntoView(targetEl[0], true);
+            }
+          } else {
+            window.open(href, '_blank', 'rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes');
+          }
+        });
+      }
+    };
+    const registerReadOnlySelectionBlockers = editor => {
+      editor.on('ShowCaret', e => {
+        if (isReadOnly(editor)) {
+          e.preventDefault();
+        }
+      });
+      editor.on('ObjectSelected', e => {
+        if (isReadOnly(editor)) {
+          e.preventDefault();
+        }
+      });
+    };
+
+    const nativeEvents = Tools.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', ' ');
+    class EventDispatcher {
+      constructor(settings) {
+        this.bindings = {};
+        this.settings = settings || {};
+        this.scope = this.settings.scope || this;
+        this.toggleEvent = this.settings.toggleEvent || never;
+      }
+      static isNative(name) {
+        return !!nativeEvents[name.toLowerCase()];
+      }
+      fire(name, args) {
+        return this.dispatch(name, args);
+      }
+      dispatch(name, args) {
+        const lcName = name.toLowerCase();
+        const event = normalize$3(lcName, args !== null && args !== void 0 ? args : {}, this.scope);
+        if (this.settings.beforeFire) {
+          this.settings.beforeFire(event);
+        }
+        const handlers = this.bindings[lcName];
+        if (handlers) {
+          for (let i = 0, l = handlers.length; i < l; i++) {
+            const callback = handlers[i];
+            if (callback.removed) {
+              continue;
+            }
+            if (callback.once) {
+              this.off(lcName, callback.func);
+            }
+            if (event.isImmediatePropagationStopped()) {
+              return event;
+            }
+            if (callback.func.call(this.scope, event) === false) {
+              event.preventDefault();
+              return event;
+            }
+          }
+        }
+        return event;
+      }
+      on(name, callback, prepend, extra) {
+        if (callback === false) {
+          callback = never;
+        }
+        if (callback) {
+          const wrappedCallback = {
+            func: callback,
+            removed: false
+          };
+          if (extra) {
+            Tools.extend(wrappedCallback, extra);
+          }
+          const names = name.toLowerCase().split(' ');
+          let i = names.length;
+          while (i--) {
+            const currentName = names[i];
+            let handlers = this.bindings[currentName];
+            if (!handlers) {
+              handlers = [];
+              this.toggleEvent(currentName, true);
+            }
+            if (prepend) {
+              handlers = [
+                wrappedCallback,
+                ...handlers
+              ];
+            } else {
+              handlers = [
+                ...handlers,
+                wrappedCallback
+              ];
+            }
+            this.bindings[currentName] = handlers;
+          }
+        }
+        return this;
+      }
+      off(name, callback) {
+        if (name) {
+          const names = name.toLowerCase().split(' ');
+          let i = names.length;
+          while (i--) {
+            const currentName = names[i];
+            let handlers = this.bindings[currentName];
+            if (!currentName) {
+              each$f(this.bindings, (_value, bindingName) => {
+                this.toggleEvent(bindingName, false);
+                delete this.bindings[bindingName];
+              });
+              return this;
+            }
+            if (handlers) {
+              if (!callback) {
+                handlers.length = 0;
+              } else {
+                const filteredHandlers = partition$2(handlers, handler => handler.func === callback);
+                handlers = filteredHandlers.fail;
+                this.bindings[currentName] = handlers;
+                each$g(filteredHandlers.pass, handler => {
+                  handler.removed = true;
+                });
+              }
+              if (!handlers.length) {
+                this.toggleEvent(name, false);
+                delete this.bindings[currentName];
+              }
+            }
+          }
+        } else {
+          each$f(this.bindings, (_value, name) => {
+            this.toggleEvent(name, false);
+          });
+          this.bindings = {};
+        }
+        return this;
+      }
+      once(name, callback, prepend) {
+        return this.on(name, callback, prepend, { once: true });
+      }
+      has(name) {
+        name = name.toLowerCase();
+        return !(!this.bindings[name] || this.bindings[name].length === 0);
+      }
+    }
+
+    const getEventDispatcher = obj => {
+      if (!obj._eventDispatcher) {
+        obj._eventDispatcher = new EventDispatcher({
+          scope: obj,
+          toggleEvent: (name, state) => {
+            if (EventDispatcher.isNative(name) && obj.toggleNativeEvent) {
+              obj.toggleNativeEvent(name, state);
+            }
+          }
+        });
+      }
+      return obj._eventDispatcher;
+    };
+    const Observable = {
+      fire(name, args, bubble) {
+        return this.dispatch(name, args, bubble);
+      },
+      dispatch(name, args, bubble) {
+        const self = this;
+        if (self.removed && name !== 'remove' && name !== 'detach') {
+          return normalize$3(name.toLowerCase(), args !== null && args !== void 0 ? args : {}, self);
+        }
+        const dispatcherArgs = getEventDispatcher(self).dispatch(name, args);
+        if (bubble !== false && self.parent) {
+          let parent = self.parent();
+          while (parent && !dispatcherArgs.isPropagationStopped()) {
+            parent.dispatch(name, dispatcherArgs, false);
+            parent = parent.parent();
+          }
+        }
+        return dispatcherArgs;
+      },
+      on(name, callback, prepend) {
+        return getEventDispatcher(this).on(name, callback, prepend);
+      },
+      off(name, callback) {
+        return getEventDispatcher(this).off(name, callback);
+      },
+      once(name, callback) {
+        return getEventDispatcher(this).once(name, callback);
+      },
+      hasEventListeners(name) {
+        return getEventDispatcher(this).has(name);
+      }
+    };
+
+    const DOM$2 = DOMUtils.DOM;
+    let customEventRootDelegates;
+    const getEventTarget = (editor, eventName) => {
+      if (eventName === 'selectionchange') {
+        return editor.getDoc();
+      }
+      if (!editor.inline && /^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(eventName)) {
+        return editor.getDoc().documentElement;
+      }
+      const eventRoot = getEventRoot(editor);
+      if (eventRoot) {
+        if (!editor.eventRoot) {
+          editor.eventRoot = DOM$2.select(eventRoot)[0];
+        }
+        return editor.eventRoot;
+      }
+      return editor.getBody();
+    };
+    const isListening = editor => !editor.hidden && !isReadOnly(editor);
+    const fireEvent = (editor, eventName, e) => {
+      if (isListening(editor)) {
+        editor.dispatch(eventName, e);
+      } else if (isReadOnly(editor)) {
+        processReadonlyEvents(editor, e);
+      }
+    };
+    const bindEventDelegate = (editor, eventName) => {
+      let delegate;
+      if (!editor.delegates) {
+        editor.delegates = {};
+      }
+      if (editor.delegates[eventName] || editor.removed) {
+        return;
+      }
+      const eventRootElm = getEventTarget(editor, eventName);
+      if (getEventRoot(editor)) {
+        if (!customEventRootDelegates) {
+          customEventRootDelegates = {};
+          editor.editorManager.on('removeEditor', () => {
+            if (!editor.editorManager.activeEditor) {
+              if (customEventRootDelegates) {
+                each$f(customEventRootDelegates, (_value, name) => {
+                  editor.dom.unbind(getEventTarget(editor, name));
+                });
+                customEventRootDelegates = null;
+              }
+            }
+          });
+        }
+        if (customEventRootDelegates[eventName]) {
+          return;
+        }
+        delegate = e => {
+          const target = e.target;
+          const editors = editor.editorManager.get();
+          let i = editors.length;
+          while (i--) {
+            const body = editors[i].getBody();
+            if (body === target || DOM$2.isChildOf(target, body)) {
+              fireEvent(editors[i], eventName, e);
+            }
+          }
+        };
+        customEventRootDelegates[eventName] = delegate;
+        DOM$2.bind(eventRootElm, eventName, delegate);
+      } else {
+        delegate = e => {
+          fireEvent(editor, eventName, e);
+        };
+        DOM$2.bind(eventRootElm, eventName, delegate);
+        editor.delegates[eventName] = delegate;
+      }
+    };
+    const EditorObservable = {
+      ...Observable,
+      bindPendingEventDelegates() {
+        const self = this;
+        Tools.each(self._pendingNativeEvents, name => {
+          bindEventDelegate(self, name);
+        });
+      },
+      toggleNativeEvent(name, state) {
+        const self = this;
+        if (name === 'focus' || name === 'blur') {
+          return;
+        }
+        if (self.removed) {
+          return;
+        }
+        if (state) {
+          if (self.initialized) {
+            bindEventDelegate(self, name);
+          } else {
+            if (!self._pendingNativeEvents) {
+              self._pendingNativeEvents = [name];
+            } else {
+              self._pendingNativeEvents.push(name);
+            }
+          }
+        } else if (self.initialized) {
+          self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);
+          delete self.delegates[name];
+        }
+      },
+      unbindAllNativeEvents() {
+        const self = this;
+        const body = self.getBody();
+        const dom = self.dom;
+        if (self.delegates) {
+          each$f(self.delegates, (value, name) => {
+            self.dom.unbind(getEventTarget(self, name), name, value);
+          });
+          delete self.delegates;
+        }
+        if (!self.inline && body && dom) {
+          body.onload = null;
+          dom.unbind(self.getWin());
+          dom.unbind(self.getDoc());
+        }
+        if (dom) {
+          dom.unbind(body);
+          dom.unbind(self.getContainer());
+        }
+      }
+    };
+
+    const stringListProcessor = value => {
+      if (isString(value)) {
+        return {
+          value: value.split(/[ ,]/),
+          valid: true
+        };
+      } else if (isArrayOf(value, isString)) {
+        return {
+          value,
+          valid: true
+        };
+      } else {
+        return {
+          valid: false,
+          message: `The value must be a string[] or a comma/space separated string.`
+        };
+      }
+    };
+    const getBuiltInProcessor = type => {
+      const validator = (() => {
+        switch (type) {
+        case 'array':
+          return isArray$1;
+        case 'boolean':
+          return isBoolean;
+        case 'function':
+          return isFunction;
+        case 'number':
+          return isNumber;
+        case 'object':
+          return isObject;
+        case 'string':
+          return isString;
+        case 'string[]':
+          return stringListProcessor;
+        case 'object[]':
+          return val => isArrayOf(val, isObject);
+        case 'regexp':
+          return val => is$4(val, RegExp);
+        }
+      })();
+      return value => processValue(value, validator, `The value must be a ${ type }.`);
+    };
+    const isBuiltInSpec = spec => isString(spec.processor);
+    const getErrorMessage = (message, result) => {
+      const additionalText = isEmpty$3(result.message) ? '' : `. ${ result.message }`;
+      return message + additionalText;
+    };
+    const isValidResult = result => result.valid;
+    const processValue = (value, processor, message = '') => {
+      const result = processor(value);
+      if (isBoolean(result)) {
+        return result ? {
+          value: value,
+          valid: true
+        } : {
+          valid: false,
+          message
+        };
+      } else {
+        return result;
+      }
+    };
+    const processDefaultValue = (name, defaultValue, processor) => {
+      if (!isUndefined(defaultValue)) {
+        const result = processValue(defaultValue, processor);
+        if (isValidResult(result)) {
+          return result.value;
+        } else {
+          console.error(getErrorMessage(`Invalid default value passed for the "${ name }" option`, result));
+        }
+      }
+      return undefined;
+    };
+    const create$5 = (editor, initialOptions) => {
+      const registry = {};
+      const values = {};
+      const setValue = (name, value, processor) => {
+        const result = processValue(value, processor);
+        if (isValidResult(result)) {
+          values[name] = result.value;
+          return true;
+        } else {
+          console.warn(getErrorMessage(`Invalid value passed for the ${ name } option`, result));
+          return false;
+        }
+      };
+      const register = (name, spec) => {
+        const processor = isBuiltInSpec(spec) ? getBuiltInProcessor(spec.processor) : spec.processor;
+        const defaultValue = processDefaultValue(name, spec.default, processor);
+        registry[name] = {
+          ...spec,
+          default: defaultValue,
+          processor
+        };
+        const initValue = get$a(values, name).orThunk(() => get$a(initialOptions, name));
+        initValue.each(value => setValue(name, value, processor));
+      };
+      const isRegistered = name => has$2(registry, name);
+      const get = name => get$a(values, name).orThunk(() => get$a(registry, name).map(spec => spec.default)).getOrUndefined();
+      const set = (name, value) => {
+        if (!isRegistered(name)) {
+          console.warn(`"${ name }" is not a registered option. Ensure the option has been registered before setting a value.`);
+          return false;
+        } else {
+          const spec = registry[name];
+          if (spec.immutable) {
+            console.error(`"${ name }" is an immutable option and cannot be updated`);
+            return false;
+          } else {
+            return setValue(name, value, spec.processor);
+          }
+        }
+      };
+      const unset = name => {
+        const registered = isRegistered(name);
+        if (registered) {
+          delete values[name];
+        }
+        return registered;
+      };
+      const isSet = name => has$2(values, name);
+      return {
+        register,
+        isRegistered,
+        get,
+        set,
+        unset,
+        isSet
+      };
+    };
+
+    const defaultModes = [
+      'design',
+      'readonly'
+    ];
+    const switchToMode = (editor, activeMode, availableModes, mode) => {
+      const oldMode = availableModes[activeMode.get()];
+      const newMode = availableModes[mode];
+      try {
+        newMode.activate();
+      } catch (e) {
+        console.error(`problem while activating editor mode ${ mode }:`, e);
+        return;
+      }
+      oldMode.deactivate();
+      if (oldMode.editorReadOnly !== newMode.editorReadOnly) {
+        toggleReadOnly(editor, newMode.editorReadOnly);
+      }
+      activeMode.set(mode);
+      fireSwitchMode(editor, mode);
+    };
+    const setMode = (editor, availableModes, activeMode, mode) => {
+      if (mode === activeMode.get()) {
+        return;
+      } else if (!has$2(availableModes, mode)) {
+        throw new Error(`Editor mode '${ mode }' is invalid`);
+      }
+      if (editor.initialized) {
+        switchToMode(editor, activeMode, availableModes, mode);
+      } else {
+        editor.on('init', () => switchToMode(editor, activeMode, availableModes, mode));
+      }
+    };
+    const registerMode = (availableModes, mode, api) => {
+      if (contains$2(defaultModes, mode)) {
+        throw new Error(`Cannot override default mode ${ mode }`);
+      }
+      return {
+        ...availableModes,
+        [mode]: {
+          ...api,
+          deactivate: () => {
+            try {
+              api.deactivate();
+            } catch (e) {
+              console.error(`problem while deactivating editor mode ${ mode }:`, e);
+            }
+          }
+        }
+      };
+    };
+
+    const create$4 = editor => {
+      const activeMode = Cell('design');
+      const availableModes = Cell({
+        design: {
+          activate: noop,
+          deactivate: noop,
+          editorReadOnly: false
+        },
+        readonly: {
+          activate: noop,
+          deactivate: noop,
+          editorReadOnly: true
+        }
+      });
+      registerReadOnlyContentFilters(editor);
+      registerReadOnlySelectionBlockers(editor);
+      return {
+        isReadOnly: () => isReadOnly(editor),
+        set: mode => setMode(editor, availableModes.get(), activeMode, mode),
+        get: () => activeMode.get(),
+        register: (mode, api) => {
+          availableModes.set(registerMode(availableModes.get(), mode, api));
+        }
+      };
+    };
+
+    const each$2 = Tools.each, explode = Tools.explode;
+    const keyCodeLookup = {
+      f1: 112,
+      f2: 113,
+      f3: 114,
+      f4: 115,
+      f5: 116,
+      f6: 117,
+      f7: 118,
+      f8: 119,
+      f9: 120,
+      f10: 121,
+      f11: 122,
+      f12: 123
+    };
+    const modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access');
+    const parseShortcut = pattern => {
+      let key;
+      const shortcut = {};
+      const isMac = Env.os.isMacOS() || Env.os.isiOS();
+      each$2(explode(pattern.toLowerCase(), '+'), value => {
+        if (value in modifierNames) {
+          shortcut[value] = true;
+        } else {
+          if (/^[0-9]{2,}$/.test(value)) {
+            shortcut.keyCode = parseInt(value, 10);
+          } else {
+            shortcut.charCode = value.charCodeAt(0);
+            shortcut.keyCode = keyCodeLookup[value] || value.toUpperCase().charCodeAt(0);
+          }
+        }
+      });
+      const id = [shortcut.keyCode];
+      for (key in modifierNames) {
+        if (shortcut[key]) {
+          id.push(key);
+        } else {
+          shortcut[key] = false;
+        }
+      }
+      shortcut.id = id.join(',');
+      if (shortcut.access) {
+        shortcut.alt = true;
+        if (isMac) {
+          shortcut.ctrl = true;
+        } else {
+          shortcut.shift = true;
+        }
+      }
+      if (shortcut.meta) {
+        if (isMac) {
+          shortcut.meta = true;
+        } else {
+          shortcut.ctrl = true;
+          shortcut.meta = false;
+        }
+      }
+      return shortcut;
+    };
+    class Shortcuts {
+      constructor(editor) {
+        this.shortcuts = {};
+        this.pendingPatterns = [];
+        this.editor = editor;
+        const self = this;
+        editor.on('keyup keypress keydown', e => {
+          if ((self.hasModifier(e) || self.isFunctionKey(e)) && !e.isDefaultPrevented()) {
+            each$2(self.shortcuts, shortcut => {
+              if (self.matchShortcut(e, shortcut)) {
+                self.pendingPatterns = shortcut.subpatterns.slice(0);
+                if (e.type === 'keydown') {
+                  self.executeShortcutAction(shortcut);
+                }
+                return true;
+              }
+            });
+            if (self.matchShortcut(e, self.pendingPatterns[0])) {
+              if (self.pendingPatterns.length === 1) {
+                if (e.type === 'keydown') {
+                  self.executeShortcutAction(self.pendingPatterns[0]);
+                }
+              }
+              self.pendingPatterns.shift();
+            }
+          }
+        });
+      }
+      add(pattern, desc, cmdFunc, scope) {
+        const self = this;
+        const func = self.normalizeCommandFunc(cmdFunc);
+        each$2(explode(Tools.trim(pattern)), pattern => {
+          const shortcut = self.createShortcut(pattern, desc, func, scope);
+          self.shortcuts[shortcut.id] = shortcut;
+        });
+        return true;
+      }
+      remove(pattern) {
+        const shortcut = this.createShortcut(pattern);
+        if (this.shortcuts[shortcut.id]) {
+          delete this.shortcuts[shortcut.id];
+          return true;
+        }
+        return false;
+      }
+      normalizeCommandFunc(cmdFunc) {
+        const self = this;
+        const cmd = cmdFunc;
+        if (typeof cmd === 'string') {
+          return () => {
+            self.editor.execCommand(cmd, false, null);
+          };
+        } else if (Tools.isArray(cmd)) {
+          return () => {
+            self.editor.execCommand(cmd[0], cmd[1], cmd[2]);
+          };
+        } else {
+          return cmd;
+        }
+      }
+      createShortcut(pattern, desc, cmdFunc, scope) {
+        const shortcuts = Tools.map(explode(pattern, '>'), parseShortcut);
+        shortcuts[shortcuts.length - 1] = Tools.extend(shortcuts[shortcuts.length - 1], {
+          func: cmdFunc,
+          scope: scope || this.editor
+        });
+        return Tools.extend(shortcuts[0], {
+          desc: this.editor.translate(desc),
+          subpatterns: shortcuts.slice(1)
+        });
+      }
+      hasModifier(e) {
+        return e.altKey || e.ctrlKey || e.metaKey;
+      }
+      isFunctionKey(e) {
+        return e.type === 'keydown' && e.keyCode >= 112 && e.keyCode <= 123;
+      }
+      matchShortcut(e, shortcut) {
+        if (!shortcut) {
+          return false;
+        }
+        if (shortcut.ctrl !== e.ctrlKey || shortcut.meta !== e.metaKey) {
+          return false;
+        }
+        if (shortcut.alt !== e.altKey || shortcut.shift !== e.shiftKey) {
+          return false;
+        }
+        if (e.keyCode === shortcut.keyCode || e.charCode && e.charCode === shortcut.charCode) {
+          e.preventDefault();
+          return true;
+        }
+        return false;
+      }
+      executeShortcutAction(shortcut) {
+        return shortcut.func ? shortcut.func.call(shortcut.scope) : null;
+      }
+    }
+
+    const create$3 = () => {
+      const buttons = {};
+      const menuItems = {};
+      const popups = {};
+      const icons = {};
+      const contextMenus = {};
+      const contextToolbars = {};
+      const sidebars = {};
+      const add = (collection, type) => (name, spec) => collection[name.toLowerCase()] = {
+        ...spec,
+        type
+      };
+      const addIcon = (name, svgData) => icons[name.toLowerCase()] = svgData;
+      return {
+        addButton: add(buttons, 'button'),
+        addGroupToolbarButton: add(buttons, 'grouptoolbarbutton'),
+        addToggleButton: add(buttons, 'togglebutton'),
+        addMenuButton: add(buttons, 'menubutton'),
+        addSplitButton: add(buttons, 'splitbutton'),
+        addMenuItem: add(menuItems, 'menuitem'),
+        addNestedMenuItem: add(menuItems, 'nestedmenuitem'),
+        addToggleMenuItem: add(menuItems, 'togglemenuitem'),
+        addAutocompleter: add(popups, 'autocompleter'),
+        addContextMenu: add(contextMenus, 'contextmenu'),
+        addContextToolbar: add(contextToolbars, 'contexttoolbar'),
+        addContextForm: add(contextToolbars, 'contextform'),
+        addSidebar: add(sidebars, 'sidebar'),
+        addIcon,
+        getAll: () => ({
+          buttons,
+          menuItems,
+          icons,
+          popups,
+          contextMenus,
+          contextToolbars,
+          sidebars
+        })
+      };
+    };
+
+    const registry = () => {
+      const bridge = create$3();
+      return {
+        addAutocompleter: bridge.addAutocompleter,
+        addButton: bridge.addButton,
+        addContextForm: bridge.addContextForm,
+        addContextMenu: bridge.addContextMenu,
+        addContextToolbar: bridge.addContextToolbar,
+        addIcon: bridge.addIcon,
+        addMenuButton: bridge.addMenuButton,
+        addMenuItem: bridge.addMenuItem,
+        addNestedMenuItem: bridge.addNestedMenuItem,
+        addSidebar: bridge.addSidebar,
+        addSplitButton: bridge.addSplitButton,
+        addToggleButton: bridge.addToggleButton,
+        addGroupToolbarButton: bridge.addGroupToolbarButton,
+        addToggleMenuItem: bridge.addToggleMenuItem,
+        getAll: bridge.getAll
+      };
+    };
+
+    const DOM$1 = DOMUtils.DOM;
+    const extend = Tools.extend, each$1 = Tools.each;
+    class Editor {
+      constructor(id, options, editorManager) {
+        this.plugins = {};
+        this.contentCSS = [];
+        this.contentStyles = [];
+        this.loadedCSS = {};
+        this.isNotDirty = false;
+        this.editorManager = editorManager;
+        this.documentBaseUrl = editorManager.documentBaseURL;
+        extend(this, EditorObservable);
+        const self = this;
+        this.id = id;
+        this.hidden = false;
+        const normalizedOptions = normalizeOptions(editorManager.defaultOptions, options);
+        this.options = create$5(self, normalizedOptions);
+        register$7(self);
+        const getOption = this.options.get;
+        if (getOption('deprecation_warnings')) {
+          logWarnings(options, normalizedOptions);
+        }
+        const suffix = getOption('suffix');
+        if (suffix) {
+          editorManager.suffix = suffix;
+        }
+        this.suffix = editorManager.suffix;
+        const baseUrl = getOption('base_url');
+        if (baseUrl) {
+          editorManager._setBaseUrl(baseUrl);
+        }
+        this.baseUri = editorManager.baseURI;
+        const referrerPolicy = getReferrerPolicy(self);
+        if (referrerPolicy) {
+          ScriptLoader.ScriptLoader._setReferrerPolicy(referrerPolicy);
+          DOMUtils.DOM.styleSheetLoader._setReferrerPolicy(referrerPolicy);
+        }
+        AddOnManager.languageLoad = getOption('language_load');
+        AddOnManager.baseURL = editorManager.baseURL;
+        this.setDirty(false);
+        this.documentBaseURI = new URI(getDocumentBaseUrl(self), { base_uri: this.baseUri });
+        this.baseURI = this.baseUri;
+        this.inline = isInline(self);
+        this.shortcuts = new Shortcuts(this);
+        this.editorCommands = new EditorCommands(this);
+        registerCommands(this);
+        const cacheSuffix = getOption('cache_suffix');
+        if (cacheSuffix) {
+          Env.cacheSuffix = cacheSuffix.replace(/^[\?\&]+/, '');
+        }
+        this.ui = {
+          registry: registry(),
+          styleSheetLoader: undefined,
+          show: noop,
+          hide: noop,
+          setEnabled: noop,
+          isEnabled: always
+        };
+        this.mode = create$4(self);
+        editorManager.dispatch('SetupEditor', { editor: this });
+        const setupCallback = getSetupCallback(self);
+        if (isFunction(setupCallback)) {
+          setupCallback.call(self, self);
+        }
+      }
+      render() {
+        render(this);
+      }
+      focus(skipFocus) {
+        this.execCommand('mceFocus', false, skipFocus);
+      }
+      hasFocus() {
+        return hasFocus(this);
+      }
+      translate(text) {
+        return I18n.translate(text);
+      }
+      getParam(name, defaultVal, type) {
+        const options = this.options;
+        if (!options.isRegistered(name)) {
+          if (isNonNullable(type)) {
+            options.register(name, {
+              processor: type,
+              default: defaultVal
+            });
+          } else {
+            options.register(name, {
+              processor: always,
+              default: defaultVal
+            });
+          }
+        }
+        return !options.isSet(name) && !isUndefined(defaultVal) ? defaultVal : options.get(name);
+      }
+      hasPlugin(name, loaded) {
+        const hasPlugin = contains$2(getPlugins(this), name);
+        if (hasPlugin) {
+          return loaded ? PluginManager.get(name) !== undefined : true;
+        } else {
+          return false;
+        }
+      }
+      nodeChanged(args) {
+        this._nodeChangeDispatcher.nodeChanged(args);
+      }
+      addCommand(name, callback, scope) {
+        this.editorCommands.addCommand(name, callback, scope);
+      }
+      addQueryStateHandler(name, callback, scope) {
+        this.editorCommands.addQueryStateHandler(name, callback, scope);
+      }
+      addQueryValueHandler(name, callback, scope) {
+        this.editorCommands.addQueryValueHandler(name, callback, scope);
+      }
+      addShortcut(pattern, desc, cmdFunc, scope) {
+        this.shortcuts.add(pattern, desc, cmdFunc, scope);
+      }
+      execCommand(cmd, ui, value, args) {
+        return this.editorCommands.execCommand(cmd, ui, value, args);
+      }
+      queryCommandState(cmd) {
+        return this.editorCommands.queryCommandState(cmd);
+      }
+      queryCommandValue(cmd) {
+        return this.editorCommands.queryCommandValue(cmd);
+      }
+      queryCommandSupported(cmd) {
+        return this.editorCommands.queryCommandSupported(cmd);
+      }
+      show() {
+        const self = this;
+        if (self.hidden) {
+          self.hidden = false;
+          if (self.inline) {
+            self.getBody().contentEditable = 'true';
+          } else {
+            DOM$1.show(self.getContainer());
+            DOM$1.hide(self.id);
+          }
+          self.load();
+          self.dispatch('show');
+        }
+      }
+      hide() {
+        const self = this;
+        if (!self.hidden) {
+          self.save();
+          if (self.inline) {
+            self.getBody().contentEditable = 'false';
+            if (self === self.editorManager.focusedEditor) {
+              self.editorManager.focusedEditor = null;
+            }
+          } else {
+            DOM$1.hide(self.getContainer());
+            DOM$1.setStyle(self.id, 'display', self.orgDisplay);
+          }
+          self.hidden = true;
+          self.dispatch('hide');
+        }
+      }
+      isHidden() {
+        return this.hidden;
+      }
+      setProgressState(state, time) {
+        this.dispatch('ProgressState', {
+          state,
+          time
+        });
+      }
+      load(args) {
+        const self = this;
+        let elm = self.getElement(), html;
+        if (self.removed) {
+          return '';
+        }
+        if (elm) {
+          args = args || {};
+          args.load = true;
+          const value = isTextareaOrInput(elm) ? elm.value : elm.innerHTML;
+          html = self.setContent(value, args);
+          args.element = elm;
+          if (!args.no_events) {
+            self.dispatch('LoadContent', args);
+          }
+          args.element = elm = null;
+          return html;
+        }
+      }
+      save(args) {
+        const self = this;
+        let elm = self.getElement(), html, form;
+        if (!elm || !self.initialized || self.removed) {
+          return;
+        }
+        args = args || {};
+        args.save = true;
+        args.element = elm;
+        html = args.content = self.getContent(args);
+        if (!args.no_events) {
+          self.dispatch('SaveContent', args);
+        }
+        if (args.format === 'raw') {
+          self.dispatch('RawSaveContent', args);
+        }
+        html = args.content;
+        if (!isTextareaOrInput(elm)) {
+          if (args.is_removing || !self.inline) {
+            elm.innerHTML = html;
+          }
+          if (form = DOM$1.getParent(self.id, 'form')) {
+            each$1(form.elements, elm => {
+              if (elm.name === self.id) {
+                elm.value = html;
+                return false;
+              }
+            });
+          }
+        } else {
+          elm.value = html;
+        }
+        args.element = elm = null;
+        if (args.set_dirty !== false) {
+          self.setDirty(false);
+        }
+        return html;
+      }
+      setContent(content, args) {
+        return setContent(this, content, args);
+      }
+      getContent(args) {
+        return getContent(this, args);
+      }
+      insertContent(content, args) {
+        if (args) {
+          content = extend({ content }, args);
+        }
+        this.execCommand('mceInsertContent', false, content);
+      }
+      resetContent(initialContent) {
+        if (initialContent === undefined) {
+          setContent(this, this.startContent, { format: 'raw' });
+        } else {
+          setContent(this, initialContent);
+        }
+        this.undoManager.reset();
+        this.setDirty(false);
+        this.nodeChanged();
+      }
+      isDirty() {
+        return !this.isNotDirty;
+      }
+      setDirty(state) {
+        const oldState = !this.isNotDirty;
+        this.isNotDirty = !state;
+        if (state && state !== oldState) {
+          this.dispatch('dirty');
+        }
+      }
+      getContainer() {
+        const self = this;
+        if (!self.container) {
+          self.container = DOM$1.get(self.editorContainer || self.id + '_parent');
+        }
+        return self.container;
+      }
+      getContentAreaContainer() {
+        return this.contentAreaContainer;
+      }
+      getElement() {
+        if (!this.targetElm) {
+          this.targetElm = DOM$1.get(this.id);
+        }
+        return this.targetElm;
+      }
+      getWin() {
+        const self = this;
+        let elm;
+        if (!self.contentWindow) {
+          elm = self.iframeElement;
+          if (elm) {
+            self.contentWindow = elm.contentWindow;
+          }
+        }
+        return self.contentWindow;
+      }
+      getDoc() {
+        const self = this;
+        let win;
+        if (!self.contentDocument) {
+          win = self.getWin();
+          if (win) {
+            self.contentDocument = win.document;
+          }
+        }
+        return self.contentDocument;
+      }
+      getBody() {
+        const doc = this.getDoc();
+        return this.bodyElement || (doc ? doc.body : null);
+      }
+      convertURL(url, name, elm) {
+        const self = this, getOption = self.options.get;
+        const urlConverterCallback = getUrlConverterCallback(self);
+        if (isFunction(urlConverterCallback)) {
+          return urlConverterCallback.call(self, url, elm, true, name);
+        }
+        if (!getOption('convert_urls') || elm && elm.nodeName === 'LINK' || url.indexOf('file:') === 0 || url.length === 0) {
+          return url;
+        }
+        if (getOption('relative_urls')) {
+          return self.documentBaseURI.toRelative(url);
+        }
+        url = self.documentBaseURI.toAbsolute(url, getOption('remove_script_host'));
+        return url;
+      }
+      addVisual(elm) {
+        addVisual(this, elm);
+      }
+      remove() {
+        remove$1(this);
+      }
+      destroy(automatic) {
+        destroy(this, automatic);
+      }
+      uploadImages() {
+        return this.editorUpload.uploadImages();
+      }
+      _scanForImages() {
+        return this.editorUpload.scanForImages();
+      }
+    }
+
+    const DOM = DOMUtils.DOM;
+    const each = Tools.each;
+    let boundGlobalEvents = false;
+    let beforeUnloadDelegate;
+    let editors = [];
+    const globalEventDelegate = e => {
+      const type = e.type;
+      each(EditorManager.get(), editor => {
+        switch (type) {
+        case 'scroll':
+          editor.dispatch('ScrollWindow', e);
+          break;
+        case 'resize':
+          editor.dispatch('ResizeWindow', e);
+          break;
+        }
+      });
+    };
+    const toggleGlobalEvents = state => {
+      if (state !== boundGlobalEvents) {
+        const DOM = DOMUtils.DOM;
+        if (state) {
+          DOM.bind(window, 'resize', globalEventDelegate);
+          DOM.bind(window, 'scroll', globalEventDelegate);
+        } else {
+          DOM.unbind(window, 'resize', globalEventDelegate);
+          DOM.unbind(window, 'scroll', globalEventDelegate);
+        }
+        boundGlobalEvents = state;
+      }
+    };
+    const removeEditorFromList = targetEditor => {
+      const oldEditors = editors;
+      editors = filter$6(editors, editor => {
+        return targetEditor !== editor;
+      });
+      if (EditorManager.activeEditor === targetEditor) {
+        EditorManager.activeEditor = editors.length > 0 ? editors[0] : null;
+      }
+      if (EditorManager.focusedEditor === targetEditor) {
+        EditorManager.focusedEditor = null;
+      }
+      return oldEditors.length !== editors.length;
+    };
+    const purgeDestroyedEditor = editor => {
+      if (editor && editor.initialized && !(editor.getContainer() || editor.getBody()).parentNode) {
+        removeEditorFromList(editor);
+        editor.unbindAllNativeEvents();
+        editor.destroy(true);
+        editor.removed = true;
+        editor = null;
+      }
+      return editor;
+    };
+    const isQuirksMode = document.compatMode !== 'CSS1Compat';
+    const EditorManager = {
+      ...Observable,
+      baseURI: null,
+      baseURL: null,
+      defaultOptions: {},
+      documentBaseURL: null,
+      suffix: null,
+      majorVersion: '6',
+      minorVersion: '0.3',
+      releaseDate: '2022-05-25',
+      i18n: I18n,
+      activeEditor: null,
+      focusedEditor: null,
+      setup() {
+        const self = this;
+        let baseURL, documentBaseURL, suffix = '';
+        documentBaseURL = URI.getDocumentBaseUrl(document.location);
+        if (/^[^:]+:\/\/\/?[^\/]+\//.test(documentBaseURL)) {
+          documentBaseURL = documentBaseURL.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
+          if (!/[\/\\]$/.test(documentBaseURL)) {
+            documentBaseURL += '/';
+          }
+        }
+        const preInit = window.tinymce || window.tinyMCEPreInit;
+        if (preInit) {
+          baseURL = preInit.base || preInit.baseURL;
+          suffix = preInit.suffix;
+        } else {
+          const scripts = document.getElementsByTagName('script');
+          for (let i = 0; i < scripts.length; i++) {
+            const src = scripts[i].src || '';
+            if (src === '') {
+              continue;
+            }
+            const srcScript = src.substring(src.lastIndexOf('/'));
+            if (/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(src)) {
+              if (srcScript.indexOf('.min') !== -1) {
+                suffix = '.min';
+              }
+              baseURL = src.substring(0, src.lastIndexOf('/'));
+              break;
+            }
+          }
+          if (!baseURL && document.currentScript) {
+            const src = document.currentScript.src;
+            if (src.indexOf('.min') !== -1) {
+              suffix = '.min';
+            }
+            baseURL = src.substring(0, src.lastIndexOf('/'));
+          }
+        }
+        self.baseURL = new URI(documentBaseURL).toAbsolute(baseURL);
+        self.documentBaseURL = documentBaseURL;
+        self.baseURI = new URI(self.baseURL);
+        self.suffix = suffix;
+        setup$v(self);
+      },
+      overrideDefaults(defaultOptions) {
+        const baseUrl = defaultOptions.base_url;
+        if (baseUrl) {
+          this._setBaseUrl(baseUrl);
+        }
+        const suffix = defaultOptions.suffix;
+        if (defaultOptions.suffix) {
+          this.suffix = suffix;
+        }
+        this.defaultOptions = defaultOptions;
+        const pluginBaseUrls = defaultOptions.plugin_base_urls;
+        if (pluginBaseUrls !== undefined) {
+          each$f(pluginBaseUrls, (pluginBaseUrl, pluginName) => {
+            AddOnManager.PluginManager.urls[pluginName] = pluginBaseUrl;
+          });
+        }
+      },
+      init(options) {
+        const self = this;
+        let result;
+        const invalidInlineTargets = Tools.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', ' ');
+        const isInvalidInlineTarget = (options, elm) => options.inline && elm.tagName.toLowerCase() in invalidInlineTargets;
+        const createId = elm => {
+          let id = elm.id;
+          if (!id) {
+            id = get$a(elm, 'name').filter(name => !DOM.get(name)).getOrThunk(DOM.uniqueId);
+            elm.setAttribute('id', id);
+          }
+          return id;
+        };
+        const execCallback = name => {
+          const callback = options[name];
+          if (!callback) {
+            return;
+          }
+          return callback.apply(self, []);
+        };
+        const findTargets = options => {
+          if (Env.browser.isIE() || Env.browser.isEdge()) {
+            initError('TinyMCE does not support the browser you are using. For a list of supported' + ' browsers please see: https://www.tiny.cloud/docs/tinymce/6/support/#supportedwebbrowsers');
+            return [];
+          } else if (isQuirksMode) {
+            initError('Failed to initialize the editor as the document is not in standards mode. ' + 'TinyMCE requires standards mode.');
+            return [];
+          } else if (isString(options.selector)) {
+            return DOM.select(options.selector);
+          } else if (isNonNullable(options.target)) {
+            return [options.target];
+          } else {
+            return [];
+          }
+        };
+        let provideResults = editors => {
+          result = editors;
+        };
+        const initEditors = () => {
+          let initCount = 0;
+          const editors = [];
+          let targets;
+          const createEditor = (id, options, targetElm) => {
+            const editor = new Editor(id, options, self);
+            editors.push(editor);
+            editor.on('init', () => {
+              if (++initCount === targets.length) {
+                provideResults(editors);
+              }
+            });
+            editor.targetElm = editor.targetElm || targetElm;
+            editor.render();
+          };
+          DOM.unbind(window, 'ready', initEditors);
+          execCallback('onpageload');
+          targets = unique$1(findTargets(options));
+          Tools.each(targets, elm => {
+            purgeDestroyedEditor(self.get(elm.id));
+          });
+          targets = Tools.grep(targets, elm => {
+            return !self.get(elm.id);
+          });
+          if (targets.length === 0) {
+            provideResults([]);
+          } else {
+            each(targets, elm => {
+              if (isInvalidInlineTarget(options, elm)) {
+                initError('Could not initialize inline editor on invalid inline target element', elm);
+              } else {
+                createEditor(createId(elm), options, elm);
+              }
+            });
+          }
+        };
+        DOM.bind(window, 'ready', initEditors);
+        return new Promise(resolve => {
+          if (result) {
+            resolve(result);
+          } else {
+            provideResults = editors => {
+              resolve(editors);
+            };
+          }
+        });
+      },
+      get(id) {
+        if (arguments.length === 0) {
+          return editors.slice(0);
+        } else if (isString(id)) {
+          return find$2(editors, editor => {
+            return editor.id === id;
+          }).getOr(null);
+        } else if (isNumber(id)) {
+          return editors[id] ? editors[id] : null;
+        } else {
+          return null;
+        }
+      },
+      add(editor) {
+        const self = this;
+        const existingEditor = self.get(editor.id);
+        if (existingEditor === editor) {
+          return editor;
+        }
+        if (existingEditor === null) {
+          editors.push(editor);
+        }
+        toggleGlobalEvents(true);
+        self.activeEditor = editor;
+        self.dispatch('AddEditor', { editor });
+        if (!beforeUnloadDelegate) {
+          beforeUnloadDelegate = e => {
+            const event = self.dispatch('BeforeUnload');
+            if (event.returnValue) {
+              e.preventDefault();
+              e.returnValue = event.returnValue;
+              return event.returnValue;
+            }
+          };
+          window.addEventListener('beforeunload', beforeUnloadDelegate);
+        }
+        return editor;
+      },
+      createEditor(id, options) {
+        return this.add(new Editor(id, options, this));
+      },
+      remove(selector) {
+        const self = this;
+        let i, editor;
+        if (!selector) {
+          for (i = editors.length - 1; i >= 0; i--) {
+            self.remove(editors[i]);
+          }
+          return;
+        }
+        if (isString(selector)) {
+          each(DOM.select(selector), elm => {
+            editor = self.get(elm.id);
+            if (editor) {
+              self.remove(editor);
+            }
+          });
+          return;
+        }
+        editor = selector;
+        if (isNull(self.get(editor.id))) {
+          return null;
+        }
+        if (removeEditorFromList(editor)) {
+          self.dispatch('RemoveEditor', { editor });
+        }
+        if (editors.length === 0) {
+          window.removeEventListener('beforeunload', beforeUnloadDelegate);
+        }
+        editor.remove();
+        toggleGlobalEvents(editors.length > 0);
+        return editor;
+      },
+      execCommand(cmd, ui, value) {
+        var _a;
+        const self = this;
+        const editorId = isObject(value) ? (_a = value.id) !== null && _a !== void 0 ? _a : value.index : value;
+        switch (cmd) {
+        case 'mceAddEditor': {
+            if (!self.get(editorId)) {
+              const editorOptions = value.options;
+              new Editor(editorId, editorOptions, self).render();
+            }
+            return true;
+          }
+        case 'mceRemoveEditor': {
+            const editor = self.get(editorId);
+            if (editor) {
+              editor.remove();
+            }
+            return true;
+          }
+        case 'mceToggleEditor': {
+            const editor = self.get(editorId);
+            if (!editor) {
+              self.execCommand('mceAddEditor', false, value);
+              return true;
+            }
+            if (editor.isHidden()) {
+              editor.show();
+            } else {
+              editor.hide();
+            }
+            return true;
+          }
+        }
+        if (self.activeEditor) {
+          return self.activeEditor.execCommand(cmd, ui, value);
+        }
+        return false;
+      },
+      triggerSave: () => {
+        each(editors, editor => {
+          editor.save();
+        });
+      },
+      addI18n: (code, items) => {
+        I18n.add(code, items);
+      },
+      translate: text => {
+        return I18n.translate(text);
+      },
+      setActive(editor) {
+        const activeEditor = this.activeEditor;
+        if (this.activeEditor !== editor) {
+          if (activeEditor) {
+            activeEditor.dispatch('deactivate', { relatedTarget: editor });
+          }
+          editor.dispatch('activate', { relatedTarget: activeEditor });
+        }
+        this.activeEditor = editor;
+      },
+      _setBaseUrl(baseUrl) {
+        this.baseURL = new URI(this.documentBaseURL).toAbsolute(baseUrl.replace(/\/+$/, ''));
+        this.baseURI = new URI(this.baseURL);
+      }
+    };
+    EditorManager.setup();
+
+    const setup = () => {
+      const dataValue = value$2();
+      const FakeClipboardItem = items => ({
+        items,
+        types: keys(items),
+        getType: type => get$a(items, type).getOrUndefined()
+      });
+      const write = data => {
+        dataValue.set(data);
+      };
+      const read = () => dataValue.get().getOrUndefined();
+      const clear = dataValue.clear;
+      return {
+        FakeClipboardItem,
+        write,
+        read,
+        clear
+      };
+    };
+    const FakeClipboard = setup();
+
+    const min = Math.min, max = Math.max, round = Math.round;
+    const relativePosition = (rect, targetRect, rel) => {
+      let x = targetRect.x;
+      let y = targetRect.y;
+      const w = rect.w;
+      const h = rect.h;
+      const targetW = targetRect.w;
+      const targetH = targetRect.h;
+      const relChars = (rel || '').split('');
+      if (relChars[0] === 'b') {
+        y += targetH;
+      }
+      if (relChars[1] === 'r') {
+        x += targetW;
+      }
+      if (relChars[0] === 'c') {
+        y += round(targetH / 2);
+      }
+      if (relChars[1] === 'c') {
+        x += round(targetW / 2);
+      }
+      if (relChars[3] === 'b') {
+        y -= h;
+      }
+      if (relChars[4] === 'r') {
+        x -= w;
+      }
+      if (relChars[3] === 'c') {
+        y -= round(h / 2);
+      }
+      if (relChars[4] === 'c') {
+        x -= round(w / 2);
+      }
+      return create$2(x, y, w, h);
+    };
+    const findBestRelativePosition = (rect, targetRect, constrainRect, rels) => {
+      let pos, i;
+      for (i = 0; i < rels.length; i++) {
+        pos = relativePosition(rect, targetRect, rels[i]);
+        if (pos.x >= constrainRect.x && pos.x + pos.w <= constrainRect.w + constrainRect.x && pos.y >= constrainRect.y && pos.y + pos.h <= constrainRect.h + constrainRect.y) {
+          return rels[i];
+        }
+      }
+      return null;
+    };
+    const inflate = (rect, w, h) => {
+      return create$2(rect.x - w, rect.y - h, rect.w + w * 2, rect.h + h * 2);
+    };
+    const intersect = (rect, cropRect) => {
+      const x1 = max(rect.x, cropRect.x);
+      const y1 = max(rect.y, cropRect.y);
+      const x2 = min(rect.x + rect.w, cropRect.x + cropRect.w);
+      const y2 = min(rect.y + rect.h, cropRect.y + cropRect.h);
+      if (x2 - x1 < 0 || y2 - y1 < 0) {
+        return null;
+      }
+      return create$2(x1, y1, x2 - x1, y2 - y1);
+    };
+    const clamp = (rect, clampRect, fixedSize) => {
+      let x1 = rect.x;
+      let y1 = rect.y;
+      let x2 = rect.x + rect.w;
+      let y2 = rect.y + rect.h;
+      const cx2 = clampRect.x + clampRect.w;
+      const cy2 = clampRect.y + clampRect.h;
+      const underflowX1 = max(0, clampRect.x - x1);
+      const underflowY1 = max(0, clampRect.y - y1);
+      const overflowX2 = max(0, x2 - cx2);
+      const overflowY2 = max(0, y2 - cy2);
+      x1 += underflowX1;
+      y1 += underflowY1;
+      if (fixedSize) {
+        x2 += underflowX1;
+        y2 += underflowY1;
+        x1 -= overflowX2;
+        y1 -= overflowY2;
+      }
+      x2 -= overflowX2;
+      y2 -= overflowY2;
+      return create$2(x1, y1, x2 - x1, y2 - y1);
+    };
+    const create$2 = (x, y, w, h) => {
+      return {
+        x,
+        y,
+        w,
+        h
+      };
+    };
+    const fromClientRect = clientRect => {
+      return create$2(clientRect.left, clientRect.top, clientRect.width, clientRect.height);
+    };
+    const Rect = {
+      inflate,
+      relativePosition,
+      findBestRelativePosition,
+      intersect,
+      clamp,
+      create: create$2,
+      fromClientRect
+    };
+
+    const awaiter = (resolveCb, rejectCb, timeout = 1000) => {
+      let done = false;
+      let timer = null;
+      const complete = completer => (...args) => {
+        if (!done) {
+          done = true;
+          if (timer !== null) {
+            clearTimeout(timer);
+            timer = null;
+          }
+          completer.apply(null, args);
+        }
+      };
+      const resolve = complete(resolveCb);
+      const reject = complete(rejectCb);
+      const start = (...args) => {
+        if (!done && timer === null) {
+          timer = setTimeout(() => reject.apply(null, args), timeout);
+        }
+      };
+      return {
+        start,
+        resolve,
+        reject
+      };
+    };
+    const create$1 = () => {
+      const tasks = {};
+      const resultFns = {};
+      const load = (id, url) => {
+        const loadErrMsg = `Script at URL "${ url }" failed to load`;
+        const runErrMsg = `Script at URL "${ url }" did not call \`tinymce.Resource.add('${ id }', data)\` within 1 second`;
+        if (tasks[id] !== undefined) {
+          return tasks[id];
+        } else {
+          const task = new Promise((resolve, reject) => {
+            const waiter = awaiter(resolve, reject);
+            resultFns[id] = waiter.resolve;
+            ScriptLoader.ScriptLoader.loadScript(url).then(() => waiter.start(runErrMsg), () => waiter.reject(loadErrMsg));
+          });
+          tasks[id] = task;
+          return task;
+        }
+      };
+      const add = (id, data) => {
+        if (resultFns[id] !== undefined) {
+          resultFns[id](data);
+          delete resultFns[id];
+        }
+        tasks[id] = Promise.resolve(data);
+      };
+      const unload = id => {
+        delete tasks[id];
+      };
+      return {
+        load,
+        add,
+        unload
+      };
+    };
+    const Resource = create$1();
+
+    const create = () => (() => {
+      let data = {};
+      let keys = [];
+      const storage = {
+        getItem: key => {
+          const item = data[key];
+          return item ? item : null;
+        },
+        setItem: (key, value) => {
+          keys.push(key);
+          data[key] = String(value);
+        },
+        key: index => {
+          return keys[index];
+        },
+        removeItem: key => {
+          keys = keys.filter(k => k === key);
+          delete data[key];
+        },
+        clear: () => {
+          keys = [];
+          data = {};
+        },
+        length: 0
+      };
+      Object.defineProperty(storage, 'length', {
+        get: () => keys.length,
+        configurable: false,
+        enumerable: false
+      });
+      return storage;
+    })();
+
+    let localStorage;
+    try {
+      const test = '__storage_test__';
+      localStorage = window.localStorage;
+      localStorage.setItem(test, test);
+      localStorage.removeItem(test);
+    } catch (e) {
+      localStorage = create();
+    }
+    var LocalStorage = localStorage;
+
+    const publicApi = {
+      geom: { Rect },
+      util: {
+        Delay,
+        Tools,
+        VK,
+        URI,
+        EventDispatcher,
+        Observable,
+        I18n,
+        LocalStorage,
+        ImageUploader
+      },
+      dom: {
+        EventUtils,
+        TreeWalker: DomTreeWalker,
+        TextSeeker,
+        DOMUtils,
+        ScriptLoader,
+        RangeUtils,
+        Serializer: DomSerializer,
+        StyleSheetLoader,
+        ControlSelection,
+        BookmarkManager,
+        Selection: EditorSelection,
+        Event: EventUtils.Event
+      },
+      html: {
+        Styles,
+        Entities,
+        Node: AstNode,
+        Schema,
+        DomParser,
+        Writer,
+        Serializer: HtmlSerializer
+      },
+      Env,
+      AddOnManager,
+      Annotator,
+      Formatter,
+      UndoManager,
+      EditorCommands,
+      WindowManager,
+      NotificationManager,
+      EditorObservable,
+      Shortcuts,
+      Editor,
+      FocusManager,
+      EditorManager,
+      DOM: DOMUtils.DOM,
+      ScriptLoader: ScriptLoader.ScriptLoader,
+      PluginManager,
+      ThemeManager,
+      ModelManager,
+      IconManager,
+      Resource,
+      FakeClipboard,
+      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,
+      walk: Tools.walk,
+      resolve: Tools.resolve,
+      explode: Tools.explode,
+      _addCacheSuffix: Tools._addCacheSuffix
+    };
+    const tinymce = Tools.extend(EditorManager, publicApi);
+
+    const exportToModuleLoaders = tinymce => {
+      if (typeof module === 'object') {
+        try {
+          module.exports = tinymce;
+        } catch (_) {
+        }
+      }
+    };
+    const exportToWindowGlobal = tinymce => {
+      window.tinymce = tinymce;
+      window.tinyMCE = tinymce;
+    };
+    exportToWindowGlobal(tinymce);
+    exportToModuleLoaders(tinymce);
+
+})();
+
+
+
diff --git a/public/assets/tinymce-34d3e364e1001c7d181c7a0576664e91f6f69aed7cc29209cde56a622bec6841.js.gz b/public/assets/tinymce-34d3e364e1001c7d181c7a0576664e91f6f69aed7cc29209cde56a622bec6841.js.gz
new file mode 100644
index 0000000000000000000000000000000000000000..17e01ee60c4de9e610003e45f4bf0c4dfce97c18
Binary files /dev/null and b/public/assets/tinymce-34d3e364e1001c7d181c7a0576664e91f6f69aed7cc29209cde56a622bec6841.js.gz differ
diff --git a/public/assets/tinymce/models/dom/model.js b/public/assets/tinymce/models/dom/model.js
index f8c541cb7794dd57bf1a0fc9ac6a8a65383c359c..e4ce02ba3af9b8c5b67a09eb55deb01a8571d7c1 100644
--- a/public/assets/tinymce/models/dom/model.js
+++ b/public/assets/tinymce/models/dom/model.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.ModelManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=n=e,(r=String).prototype.isPrototypeOf(o)||(null===(s=n.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var o,n,r,s})(t)===e,o=e=>t=>typeof t===e,n=t("string"),r=t("object"),s=t("array"),l=(null,e=>null===e);const a=o("boolean"),c=e=>!(e=>null==e)(e),i=o("function"),m=o("number"),d=()=>{},u=e=>()=>e,f=e=>e,g=(e,t)=>e===t;function h(e,...t){return(...o)=>{const n=t.concat(o);return e.apply(null,n)}}const p=e=>t=>!e(t),w=e=>e(),b=u(!1),v=u(!0);class y{constructor(e,t){this.tag=e,this.value=t}static some(e){return new y(!0,e)}static none(){return y.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?y.some(e(this.value)):y.none()}bind(e){return this.tag?e(this.value):y.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:y.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return c(e)?y.some(e):y.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}y.singletonNone=new y(!1);const x=Array.prototype.slice,C=Array.prototype.indexOf,S=Array.prototype.push,T=(e,t)=>((e,t)=>C.call(e,t))(e,t)>-1,R=(e,t)=>{for(let o=0,n=e.length;o<n;o++)if(t(e[o],o))return!0;return!1},D=(e,t)=>{const o=[];for(let n=0;n<e;n++)o.push(t(n));return o},O=(e,t)=>{const o=e.length,n=new Array(o);for(let r=0;r<o;r++){const o=e[r];n[r]=t(o,r)}return n},k=(e,t)=>{for(let o=0,n=e.length;o<n;o++)t(e[o],o)},E=(e,t)=>{const o=[],n=[];for(let r=0,s=e.length;r<s;r++){const s=e[r];(t(s,r)?o:n).push(s)}return{pass:o,fail:n}},N=(e,t)=>{const o=[];for(let n=0,r=e.length;n<r;n++){const r=e[n];t(r,n)&&o.push(r)}return o},B=(e,t,o)=>(((e,t)=>{for(let o=e.length-1;o>=0;o--)t(e[o],o)})(e,((e,n)=>{o=t(o,e,n)})),o),z=(e,t,o)=>(k(e,((e,n)=>{o=t(o,e,n)})),o),A=(e,t)=>((e,t,o)=>{for(let n=0,r=e.length;n<r;n++){const r=e[n];if(t(r,n))return y.some(r);if(o(r,n))break}return y.none()})(e,t,b),W=(e,t)=>{for(let o=0,n=e.length;o<n;o++)if(t(e[o],o))return y.some(o);return y.none()},L=e=>{const t=[];for(let o=0,n=e.length;o<n;++o){if(!s(e[o]))throw new Error("Arr.flatten item "+o+" was not an array, input: "+e);S.apply(t,e[o])}return t},M=(e,t)=>L(O(e,t)),j=(e,t)=>{for(let o=0,n=e.length;o<n;++o)if(!0!==t(e[o],o))return!1;return!0},_=(e,t)=>{const o={};for(let n=0,r=e.length;n<r;n++){const r=e[n];o[String(r)]=t(r,n)}return o},I=(e,t)=>t>=0&&t<e.length?y.some(e[t]):y.none(),P=e=>I(e,0),F=e=>I(e,e.length-1),H=(e,t)=>{for(let o=0;o<e.length;o++){const n=t(e[o],o);if(n.isSome())return n}return y.none()},q=Object.keys,V=Object.hasOwnProperty,$=(e,t)=>{const o=q(e);for(let n=0,r=o.length;n<r;n++){const r=o[n];t(e[r],r)}},U=(e,t)=>G(e,((e,o)=>({k:o,v:t(e,o)}))),G=(e,t)=>{const o={};return $(e,((e,n)=>{const r=t(e,n);o[r.k]=r.v})),o},K=(e,t)=>{const o={};return((e,t,o,n)=>{$(e,((e,r)=>{(t(e,r)?o:n)(e,r)}))})(e,t,(e=>(t,o)=>{e[o]=t})(o),d),o},Y=(e,t)=>{const o=[];return $(e,((e,n)=>{o.push(t(e,n))})),o},J=e=>Y(e,f),Q=(e,t)=>V.call(e,t);"undefined"!=typeof window?window:Function("return this;")();const X=e=>e.dom.nodeName.toLowerCase(),Z=e=>e.dom.nodeType,ee=e=>t=>Z(t)===e,te=e=>8===Z(e)||"#comment"===X(e),oe=ee(1),ne=ee(3),re=ee(9),se=ee(11),le=e=>t=>oe(t)&&X(t)===e,ae=(e,t,o)=>{if(!(n(o)||a(o)||m(o)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",o,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,o+"")},ce=(e,t,o)=>{ae(e.dom,t,o)},ie=(e,t)=>{const o=e.dom;$(t,((e,t)=>{ae(o,t,e)}))},me=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},de=(e,t)=>y.from(me(e,t)),ue=(e,t)=>{e.dom.removeAttribute(t)},fe=e=>z(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}),ge=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},he={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return ge(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return ge(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return ge(o)},fromDom:ge,fromPoint:(e,t,o)=>y.from(e.dom.elementFromPoint(t,o)).map(ge)},pe=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},we=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,be=(e,t)=>{const o=void 0===t?document:t.dom;return we(o)?y.none():y.from(o.querySelector(e)).map(he.fromDom)},ve=(e,t)=>e.dom===t.dom,ye=(e,t)=>{const o=e.dom,n=t.dom;return o!==n&&o.contains(n)},xe=pe,Ce=e=>he.fromDom(e.dom.ownerDocument),Se=e=>re(e)?e:Ce(e),Te=e=>y.from(e.dom.parentNode).map(he.fromDom),Re=(e,t)=>{const o=i(t)?t:b;let n=e.dom;const r=[];for(;null!==n.parentNode&&void 0!==n.parentNode;){const e=n.parentNode,t=he.fromDom(e);if(r.push(t),!0===o(t))break;n=e}return r},De=e=>y.from(e.dom.previousSibling).map(he.fromDom),Oe=e=>y.from(e.dom.nextSibling).map(he.fromDom),ke=e=>O(e.dom.childNodes,he.fromDom),Ee=(e,t)=>{const o=e.dom.childNodes;return y.from(o[t]).map(he.fromDom)},Ne=(e,t)=>{Te(e).each((o=>{o.dom.insertBefore(t.dom,e.dom)}))},Be=(e,t)=>{Oe(e).fold((()=>{Te(e).each((e=>{Ae(e,t)}))}),(e=>{Ne(e,t)}))},ze=(e,t)=>{const o=(e=>Ee(e,0))(e);o.fold((()=>{Ae(e,t)}),(o=>{e.dom.insertBefore(t.dom,o.dom)}))},Ae=(e,t)=>{e.dom.appendChild(t.dom)},We=(e,t)=>{Ne(e,t),Ae(t,e)},Le=(e,t)=>{k(t,((o,n)=>{const r=0===n?e:t[n-1];Be(r,o)}))},Me=(e,t)=>{k(t,(t=>{Ae(e,t)}))},je=e=>{e.dom.textContent="",k(ke(e),(e=>{_e(e)}))},_e=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},Ie=e=>{const t=ke(e);t.length>0&&Le(e,t),_e(e)},Pe=(e,t)=>he.fromDom(e.dom.cloneNode(t)),Fe=e=>Pe(e,!1),He=e=>Pe(e,!0),qe=(e,t)=>{const o=he.fromTag(t),n=fe(e);return ie(o,n),o},Ve=["tfoot","thead","tbody","colgroup"],$e=(e,t,o)=>({element:e,rowspan:t,colspan:o}),Ue=(e,t,o)=>({element:e,cells:t,section:o}),Ge=(e,t,o)=>({element:e,isNew:t,isLocked:o}),Ke=(e,t,o,n)=>({element:e,cells:t,section:o,isNew:n}),Ye=i(Element.prototype.attachShadow)&&i(Node.prototype.getRootNode),Je=u(Ye),Qe=Ye?e=>he.fromDom(e.dom.getRootNode()):Se,Xe=e=>he.fromDom(e.dom.host),Ze=e=>{const t=ne(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=Qe(e);return se(o=t)&&c(o.dom.host)?y.some(t):y.none();var o})(he.fromDom(t)).fold((()=>o.body.contains(t)),(n=Ze,r=Xe,e=>n(r(e))));var n,r},et=e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return he.fromDom(t)},tt=(e,t)=>{let o=[];return k(ke(e),(e=>{t(e)&&(o=o.concat([e])),o=o.concat(tt(e,t))})),o},ot=(e,t,o)=>((e,o,n)=>N(Re(e,n),(e=>pe(e,t))))(e,0,o),nt=(e,t)=>((e,o)=>N(ke(e),(e=>pe(e,t))))(e),rt=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return we(o)?[]:O(o.querySelectorAll(e),he.fromDom)})(t,e);var st=(e,t,o,n,r)=>e(o,n)?y.some(o):i(r)&&r(o)?y.none():t(o,n,r);const lt=(e,t,o)=>{let n=e.dom;const r=i(o)?o:b;for(;n.parentNode;){n=n.parentNode;const e=he.fromDom(n);if(t(e))return y.some(e);if(r(e))break}return y.none()},at=(e,t,o)=>lt(e,(e=>pe(e,t)),o),ct=(e,t)=>((e,o)=>A(e.dom.childNodes,(e=>{return o=he.fromDom(e),pe(o,t);var o})).map(he.fromDom))(e),it=(e,t)=>be(t,e),mt=(e,t,o)=>st(((e,t)=>pe(e,t)),at,e,t,o),dt=(e,t,o=g)=>e.exists((e=>o(e,t))),ut=e=>{const t=[],o=e=>{t.push(e)};for(let t=0;t<e.length;t++)e[t].each(o);return t},ft=(e,t)=>e?y.some(t):y.none(),gt=(e,t,o)=>""===t||e.length>=t.length&&e.substr(o,o+t.length)===t,ht=(e,t)=>-1!==e.indexOf(t),pt=(e,t)=>gt(e,t,0),wt=(e,t)=>gt(e,t,e.length-t.length),bt=(e=>t=>t.replace(e,""))(/^\s+|\s+$/g),vt=e=>e.length>0,yt=e=>void 0!==e.style&&i(e.style.getPropertyValue),xt=(e,t,o)=>{if(!n(o))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",o,":: Element ",e),new Error("CSS value must be a string: "+o);yt(e)&&e.style.setProperty(t,o)},Ct=(e,t,o)=>{const n=e.dom;xt(n,t,o)},St=(e,t)=>{const o=e.dom;$(t,((e,t)=>{xt(o,t,e)}))},Tt=(e,t)=>{const o=e.dom,n=window.getComputedStyle(o).getPropertyValue(t);return""!==n||Ze(e)?n:Rt(o,t)},Rt=(e,t)=>yt(e)?e.style.getPropertyValue(t):"",Dt=(e,t)=>{const o=e.dom,n=Rt(o,t);return y.from(n).filter((e=>e.length>0))},Ot=(e,t)=>{((e,t)=>{yt(e)&&e.style.removeProperty(t)})(e.dom,t),dt(de(e,"style").map(bt),"")&&ue(e,"style")},kt=(e,t,o=0)=>de(e,t).map((e=>parseInt(e,10))).getOr(o),Et=(e,t)=>kt(e,t,1),Nt=e=>le("col")(e)?kt(e,"span",1)>1:Et(e,"colspan")>1,Bt=e=>Et(e,"rowspan")>1,zt=(e,t)=>parseInt(Tt(e,t),10),At=u(10),Wt=u(10),Lt=(e,t)=>Mt(e,t,v),Mt=(e,t,o)=>M(ke(e),(e=>pe(e,t)?o(e)?[e]:[]:Mt(e,t,o))),jt=(e,t)=>((e,t,o=b)=>o(t)?y.none():T(e,X(t))?y.some(t):at(t,e.join(","),(e=>pe(e,"table")||o(e))))(["td","th"],e,t),_t=e=>Lt(e,"th,td"),It=e=>pe(e,"colgroup")?nt(e,"col"):M(Ht(e),(e=>nt(e,"col"))),Pt=(e,t)=>mt(e,"table",t),Ft=e=>Lt(e,"tr"),Ht=e=>Pt(e).fold(u([]),(e=>nt(e,"colgroup"))),qt=(e,t)=>O(e,(e=>{if("colgroup"===X(e)){const t=O(It(e),(e=>{const t=kt(e,"span",1);return $e(e,1,t)}));return Ue(e,t,"colgroup")}{const o=O(_t(e),(e=>{const t=kt(e,"rowspan",1),o=kt(e,"colspan",1);return $e(e,t,o)}));return Ue(e,o,t(e))}})),Vt=e=>Te(e).map((e=>{const t=X(e);return(e=>T(Ve,e))(t)?t:"tbody"})).getOr("tbody"),$t=e=>{const t=Ft(e),o=[...Ht(e),...t];return qt(o,Vt)},Ut=e=>{let t,o=!1;return(...n)=>(o||(o=!0,t=e.apply(null,n)),t)},Gt=()=>Kt(0,0),Kt=(e,t)=>({major:e,minor:t}),Yt={nu:Kt,detect:(e,t)=>{const o=String(t).toLowerCase();return 0===e.length?Gt():((e,t)=>{const o=((e,t)=>{for(let o=0;o<e.length;o++){const n=e[o];if(n.test(t))return n}})(e,t);if(!o)return{major:0,minor:0};const n=e=>Number(t.replace(o,"$"+e));return Kt(n(1),n(2))})(e,o)},unknown:Gt},Jt=(e,t)=>{const o=String(t).toLowerCase();return A(e,(e=>e.search(o)))},Qt=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,Xt=e=>t=>ht(t,e),Zt=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>ht(e,"edge/")&&ht(e,"chrome")&&ht(e,"safari")&&ht(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,Qt],search:e=>ht(e,"chrome")&&!ht(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>ht(e,"msie")||ht(e,"trident")},{name:"Opera",versionRegexes:[Qt,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Xt("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Xt("firefox")},{name:"Safari",versionRegexes:[Qt,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(ht(e,"safari")||ht(e,"mobile/"))&&ht(e,"applewebkit")}],eo=[{name:"Windows",search:Xt("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>ht(e,"iphone")||ht(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Xt("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:Xt("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Xt("linux"),versionRegexes:[]},{name:"Solaris",search:Xt("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Xt("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:Xt("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],to={browsers:u(Zt),oses:u(eo)},oo="Edge",no="Chromium",ro="Opera",so="Firefox",lo="Safari",ao=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isEdge:n(oo),isChromium:n(no),isIE:n("IE"),isOpera:n(ro),isFirefox:n(so),isSafari:n(lo)}},co=()=>ao({current:void 0,version:Yt.unknown()}),io=ao,mo=(u(oo),u(no),u("IE"),u(ro),u(so),u(lo),"Windows"),uo="Android",fo="Linux",go="macOS",ho="Solaris",po="FreeBSD",wo="ChromeOS",bo=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isWindows:n(mo),isiOS:n("iOS"),isAndroid:n(uo),isMacOS:n(go),isLinux:n(fo),isSolaris:n(ho),isFreeBSD:n(po),isChromeOS:n(wo)}},vo=()=>bo({current:void 0,version:Yt.unknown()}),yo=bo,xo=(u(mo),u("iOS"),u(uo),u(fo),u(go),u(ho),u(po),u(wo),e=>window.matchMedia(e).matches);let Co=Ut((()=>((e,t,o)=>{const n=to.browsers(),r=to.oses(),s=t.bind((e=>((e,t)=>H(t.brands,(t=>{const o=t.brand.toLowerCase();return A(e,(e=>{var t;return o===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:Yt.nu(parseInt(t.version,10),0)})))})))(n,e))).orThunk((()=>((e,t)=>Jt(e,t).map((e=>{const o=Yt.detect(e.versionRegexes,t);return{current:e.name,version:o}})))(n,e))).fold(co,io),l=((e,t)=>Jt(e,t).map((e=>{const o=Yt.detect(e.versionRegexes,t);return{current:e.name,version:o}})))(r,e).fold(vo,yo),a=((e,t,o,n)=>{const r=e.isiOS()&&!0===/ipad/i.test(o),s=e.isiOS()&&!r,l=e.isiOS()||e.isAndroid(),a=l||n("(pointer:coarse)"),c=r||!s&&l&&n("(min-device-width:768px)"),i=s||l&&!c,m=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(o),d=!i&&!c&&!m;return{isiPad:u(r),isiPhone:u(s),isTablet:u(c),isPhone:u(i),isTouch:u(a),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:u(m),isDesktop:u(d)}})(l,s,e,o);return{browser:s,os:l,deviceType:a}})(navigator.userAgent,y.from(navigator.userAgentData),xo)));const So=()=>Co(),To=(e,t)=>{const o=o=>{const n=t(o);if(n<=0||null===n){const t=Tt(o,e);return parseFloat(t)||0}return n},n=(e,t)=>z(t,((t,o)=>{const n=Tt(e,o),r=void 0===n?0:parseInt(n,10);return isNaN(r)?t:t+r}),0);return{set:(t,o)=>{if(!m(o)&&!o.match(/^[0-9]+$/))throw new Error(e+".set accepts only positive integer values. Value was "+o);const n=t.dom;yt(n)&&(n.style[e]=o+"px")},get:o,getOuter:o,aggregate:n,max:(e,t,o)=>{const r=n(e,o);return t>r?t-r:0}}},Ro=(e,t,o)=>((e,t)=>(e=>{const t=parseFloat(e);return isNaN(t)?y.none():y.some(t)})(e).getOr(t))(Tt(e,t),o),Do=To("width",(e=>e.dom.offsetWidth)),Oo=e=>Do.get(e),ko=e=>Do.getOuter(e),Eo=e=>((e,t)=>{const o=e.dom,n=o.getBoundingClientRect().width||o.offsetWidth;return"border-box"===t?n:((e,t,o,n)=>t-Ro(e,"padding-left",0)-Ro(e,"padding-right",0)-Ro(e,"border-left-width",0)-Ro(e,"border-right-width",0))(e,n)})(e,"content-box"),No=(e,t,o)=>{const n=e.cells,r=n.slice(0,t),s=n.slice(t),l=r.concat(o).concat(s);return Ao(e,l)},Bo=(e,t,o)=>No(e,t,[o]),zo=(e,t,o)=>{e.cells[t]=o},Ao=(e,t)=>Ke(e.element,t,e.section,e.isNew),Wo=(e,t)=>e.cells[t],Lo=(e,t)=>Wo(e,t).element,Mo=e=>e.cells.length,jo=e=>{const t=E(e,(e=>"colgroup"===e.section));return{rows:t.fail,cols:t.pass}},_o=(e,t,o)=>{const n=O(e.cells,o);return Ke(t(e.element),n,e.section,!0)},Io="data-snooker-locked-cols",Po=e=>de(e,Io).bind((e=>y.from(e.match(/\d+/g)))).map((e=>_(e,v))),Fo=e=>{const t=z(jo(e).rows,((e,t)=>(k(t.cells,((t,o)=>{t.isLocked&&(e[o]=!0)})),e)),{}),o=Y(t,((e,t)=>parseInt(t,10)));return((e,t)=>{const o=x.call(e,0);return o.sort(void 0),o})(o)},Ho=(e,t)=>e+","+t,qo=(e,t)=>{const o=M(e.all,(e=>e.cells));return N(o,t)},Vo=e=>{const t={},o=[],n=P(e).map((e=>e.element)).bind(Pt).bind(Po).getOr({});let r=0,s=0,l=0;const{pass:a,fail:c}=E(e,(e=>"colgroup"===e.section));k(c,(e=>{const a=[];k(e.cells,(e=>{let o=0;for(;void 0!==t[Ho(l,o)];)o++;const r=((e,t)=>Q(e,t)&&void 0!==e[t]&&null!==e[t])(n,o.toString()),c=((e,t,o,n,r,s)=>({element:e,rowspan:t,colspan:o,row:n,column:r,isLocked:s}))(e.element,e.rowspan,e.colspan,l,o,r);for(let n=0;n<e.colspan;n++)for(let r=0;r<e.rowspan;r++){const e=o+n,a=Ho(l+r,e);t[a]=c,s=Math.max(s,e+1)}a.push(c)})),r++,o.push(Ue(e.element,a,e.section)),l++}));const{columns:i,colgroups:m}=F(a).map((e=>{const t=(e=>{const t={};let o=0;return k(e.cells,(e=>{const n=e.colspan;D(n,(r=>{const s=o+r;t[s]=((e,t,o)=>({element:e,colspan:t,column:o}))(e.element,n,s)})),o+=n})),t})(e),o=((e,t)=>({element:e,columns:t}))(e.element,J(t));return{colgroups:[o],columns:t}})).getOrThunk((()=>({colgroups:[],columns:{}}))),d=((e,t)=>({rows:e,columns:t}))(r,s);return{grid:d,access:t,all:o,columns:i,colgroups:m}},$o=e=>{const t=$t(e);return Vo(t)},Uo=Vo,Go=(e,t,o)=>y.from(e.access[Ho(t,o)]),Ko=(e,t,o)=>{const n=qo(e,(e=>o(t,e.element)));return n.length>0?y.some(n[0]):y.none()},Yo=qo,Jo=e=>M(e.all,(e=>e.cells)),Qo=e=>J(e.columns),Xo=e=>q(e.columns).length>0,Zo=(e,t)=>y.from(e.columns[t]),en=(e,t=v)=>{const o=e.grid,n=D(o.columns,f),r=D(o.rows,f);return O(n,(o=>tn((()=>M(r,(t=>Go(e,t,o).filter((e=>e.column===o)).toArray()))),(e=>1===e.colspan&&t(e.element)),(()=>Go(e,0,o)))))},tn=(e,t,o)=>{const n=e();return A(n,t).orThunk((()=>y.from(n[0]).orThunk(o))).map((e=>e.element))},on=e=>{const t=e.grid,o=D(t.rows,f),n=D(t.columns,f);return O(o,(t=>tn((()=>M(n,(o=>Go(e,t,o).filter((e=>e.row===t)).fold(u([]),(e=>[e]))))),(e=>1===e.rowspan),(()=>Go(e,t,0)))))},nn=(e,t)=>o=>"rtl"===rn(o)?t:e,rn=e=>"rtl"===Tt(e,"direction")?"rtl":"ltr",sn=To("height",(e=>{const t=e.dom;return Ze(e)?t.getBoundingClientRect().height:t.offsetHeight})),ln=e=>sn.get(e),an=e=>sn.getOuter(e),cn=(e,t)=>({left:e,top:t,translate:(o,n)=>cn(e+o,t+n)}),mn=cn,dn=(e,t)=>void 0!==e?e:void 0!==t?t:0,un=e=>{const t=e.dom.ownerDocument,o=t.body,n=t.defaultView,r=t.documentElement;if(o===e.dom)return mn(o.offsetLeft,o.offsetTop);const s=dn(null==n?void 0:n.pageYOffset,r.scrollTop),l=dn(null==n?void 0:n.pageXOffset,r.scrollLeft),a=dn(r.clientTop,o.clientTop),c=dn(r.clientLeft,o.clientLeft);return fn(e).translate(l-c,s-a)},fn=e=>{const t=e.dom,o=t.ownerDocument.body;return o===t?mn(o.offsetLeft,o.offsetTop):Ze(e)?(e=>{const t=e.getBoundingClientRect();return mn(t.left,t.top)})(t):mn(0,0)},gn=(e,t)=>({row:e,y:t}),hn=(e,t)=>({col:e,x:t}),pn=e=>un(e).left+ko(e),wn=e=>un(e).left,bn=(e,t)=>hn(e,wn(t)),vn=(e,t)=>hn(e,pn(t)),yn=e=>un(e).top,xn=(e,t)=>gn(e,yn(t)),Cn=(e,t)=>gn(e,yn(t)+an(t)),Sn=(e,t,o)=>{if(0===o.length)return[];const n=O(o.slice(1),((t,o)=>t.map((t=>e(o,t))))),r=o[o.length-1].map((e=>t(o.length-1,e)));return n.concat([r])},Tn={delta:f,positions:e=>Sn(xn,Cn,e),edge:yn},Rn=nn({delta:f,edge:wn,positions:e=>Sn(bn,vn,e)},{delta:e=>-e,edge:pn,positions:e=>Sn(vn,bn,e)}),Dn={delta:(e,t)=>Rn(t).delta(e,t),positions:(e,t)=>Rn(t).positions(e,t),edge:e=>Rn(e).edge(e)},On={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:[""]},kn=(()=>{const e="[0-9]+",t="[eE][+-]?[0-9]+",o=e=>`(?:${e})?`,n=["Infinity","[0-9]+\\."+o(e)+o(t),"\\.[0-9]+"+o(t),e+o(t)].join("|");return new RegExp(`^([+-]?(?:${n}))(.*)$`)})(),En=/(\d+(\.\d+)?)%/,Nn=/(\d+(\.\d+)?)px|em/,Bn=le("col"),zn=(e,t,o)=>{const n=(r=e,y.from(r.dom.parentElement).map(he.fromDom)).getOrThunk((()=>et(Ce(e))));var r;return t(e)/o(n)*100},An=(e,t)=>{Ct(e,"width",t+"px")},Wn=(e,t)=>{Ct(e,"width",t+"%")},Ln=(e,t)=>{Ct(e,"height",t+"px")},Mn=e=>{const t=(e=>{return Ro(t=e,"height",t.dom.offsetHeight)+"px";var t})(e);return t?((e,t,o,n)=>{const r=parseFloat(e);return wt(e,"%")&&"table"!==X(t)?((e,t,o,n)=>{const r=Pt(e).map((e=>{const n=o(e);return Math.floor(t/100*n)})).getOr(t);return n(e,r),r})(t,r,o,n):r})(t,e,ln,Ln):ln(e)},jn=(e,t)=>Dt(e,t).orThunk((()=>de(e,t).map((e=>e+"px")))),_n=e=>jn(e,"width"),In=e=>zn(e,Oo,Eo),Pn=e=>{return Bn(e)?Oo(e):Ro(t=e,"width",t.dom.offsetWidth);var t},Fn=e=>((e,t,o)=>o(e)/Et(e,"rowspan"))(e,0,Mn),Hn=(e,t,o)=>{Ct(e,"width",t+o)},qn=e=>zn(e,Oo,Eo)+"%",Vn=u(En),$n=le("col"),Un=e=>_n(e).getOrThunk((()=>Pn(e)+"px")),Gn=e=>{return(t=e,jn(t,"height")).getOrThunk((()=>Fn(e)+"px"));var t},Kn=(e,t,o,n,r,s)=>e.filter(n).fold((()=>s(((e,t)=>{if(t<0||t>=e.length-1)return y.none();const o=e[t].fold((()=>{const o=(e=>{const t=x.call(e,0);return t.reverse(),t})(e.slice(0,t));return H(o,((e,t)=>e.map((e=>({value:e,delta:t+1})))))}),(e=>y.some({value:e,delta:0}))),n=e[t+1].fold((()=>{const o=e.slice(t+1);return H(o,((e,t)=>e.map((e=>({value:e,delta:t+1})))))}),(e=>y.some({value:e,delta:1})));return o.bind((e=>n.map((t=>{const o=t.delta+e.delta;return Math.abs(t.value-e.value)/o}))))})(o,t))),(e=>r(e))),Yn=(e,t,o,n)=>{const r=en(e),s=Xo(e)?(e=>O(Qo(e),(e=>y.from(e.element))))(e):r,l=[y.some(Dn.edge(t))].concat(O(Dn.positions(r,t),(e=>e.map((e=>e.x))))),a=p(Nt);return O(s,((e,t)=>Kn(e,t,l,a,(e=>{if((e=>{const t=So().browser,o=t.isChromium()||t.isFirefox();return!$n(e)||o})(e))return o(e);{const e=null!=(s=r[t])?f(s):y.none();return Kn(e,t,l,a,(e=>n(y.some(Oo(e)))),n)}var s}),n)))},Jn=e=>e.map((e=>e+"px")).getOr(""),Qn=(e,t,o)=>Yn(e,t,Pn,(e=>e.getOrThunk(o.minCellWidth))),Xn=(e,t,o,n,r)=>{const s=on(e),l=[y.some(o.edge(t))].concat(O(o.positions(s,t),(e=>e.map((e=>e.y)))));return O(s,((e,t)=>Kn(e,t,l,p(Bt),n,r)))},Zn=(e,t)=>()=>Ze(e)?t(e):parseFloat(Dt(e,"width").getOr("0")),er=e=>{const t=Zn(e,(e=>parseFloat(qn(e)))),o=Zn(e,Oo);return{width:t,pixelWidth:o,getWidths:(t,o)=>((e,t,o)=>Yn(e,t,In,(e=>e.fold((()=>o.minCellWidth()),(e=>e/o.pixelWidth()*100)))))(t,e,o),getCellDelta:e=>e/o()*100,singleColumnWidth:(e,t)=>[100-e],minCellWidth:()=>At()/o()*100,setElementWidth:Wn,adjustTableWidth:o=>{const n=t();Wn(e,n+o/100*n)},isRelative:!0,label:"percent"}},tr=e=>{const t=Zn(e,Oo);return{width:t,pixelWidth:t,getWidths:(t,o)=>Qn(t,e,o),getCellDelta:f,singleColumnWidth:(e,t)=>[Math.max(At(),e+t)-e],minCellWidth:At,setElementWidth:An,adjustTableWidth:o=>{const n=t()+o;An(e,n)},isRelative:!1,label:"pixel"}},or=e=>_n(e).fold((()=>(e=>{const t=Zn(e,Oo),o=u(0);return{width:t,pixelWidth:t,getWidths:(t,o)=>Qn(t,e,o),getCellDelta:o,singleColumnWidth:u([0]),minCellWidth:o,setElementWidth:d,adjustTableWidth:d,isRelative:!0,label:"none"}})(e)),(t=>((e,t)=>null!==Vn().exec(t)?er(e):tr(e))(e,t))),nr=tr,rr=er,sr=(e,t,o)=>{const n=e[o].element,r=he.fromTag("td");Ae(r,he.fromTag("br")),(t?Ae:ze)(n,r)},lr=((e,t)=>{const o=t=>e(t)?y.from(t.dom.nodeValue):y.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return o(t).getOr("")},getOption:o,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(ne),ar=e=>lr.get(e),cr=e=>lr.getOption(e),ir=(e,t)=>lr.set(e,t),mr=e=>"img"===X(e)?1:cr(e).fold((()=>ke(e).length),(e=>e.length)),dr=["img","br"],ur=e=>cr(e).filter((e=>0!==e.trim().length||e.indexOf("\xa0")>-1)).isSome()||T(dr,X(e)),fr=e=>((e,t)=>{const o=e=>{for(let n=0;n<e.childNodes.length;n++){const r=he.fromDom(e.childNodes[n]);if(t(r))return y.some(r);const s=o(e.childNodes[n]);if(s.isSome())return s}return y.none()};return o(e.dom)})(e,ur),gr=e=>hr(e,ur),hr=(e,t)=>{const o=e=>{const n=ke(e);for(let e=n.length-1;e>=0;e--){const r=n[e];if(t(r))return y.some(r);const s=o(r);if(s.isSome())return s}return y.none()};return o(e)},pr={scope:["row","col"]},wr=e=>()=>{const t=he.fromTag("td",e.dom);return Ae(t,he.fromTag("br",e.dom)),t},br=e=>()=>he.fromTag("col",e.dom),vr=e=>()=>he.fromTag("colgroup",e.dom),yr=e=>()=>he.fromTag("tr",e.dom),xr=(e,t,o)=>{const n=((e,t)=>{const o=qe(e,t),n=ke(He(e));return Me(o,n),o})(e,t);return $(o,((e,t)=>{null===e?ue(n,t):ce(n,t,e)})),n},Cr=e=>e,Sr=(e,t,o)=>{const n=(e,t)=>{((e,t)=>{const o=e.dom,n=t.dom;yt(o)&&yt(n)&&(n.style.cssText=o.style.cssText)})(e.element,t),Ot(t,"height"),1!==e.colspan&&Ot(t,"width")};return{col:o=>{const r=he.fromTag(X(o.element),t.dom);return n(o,r),e(o.element,r),r},colgroup:vr(t),row:yr(t),cell:r=>{const s=he.fromTag(X(r.element),t.dom),l=o.getOr(["strong","em","b","i","span","font","h1","h2","h3","h4","h5","h6","p","div"]),a=l.length>0?((e,t,o)=>fr(e).map((n=>{const r=o.join(","),s=ot(n,r,(t=>ve(t,e)));return B(s,((e,t)=>{const o=Fe(t);return ue(o,"contenteditable"),Ae(e,o),o}),t)})).getOr(t))(r.element,s,l):s;return Ae(a,he.fromTag("br")),n(r,s),((e,t)=>{$(pr,((o,n)=>de(e,n).filter((e=>T(o,e))).each((e=>ce(t,n,e)))))})(r.element,s),e(r.element,s),s},replace:xr,colGap:br(t),gap:wr(t)}},Tr=e=>({col:br(e),colgroup:vr(e),row:yr(e),cell:wr(e),replace:Cr,colGap:br(e),gap:wr(e)}),Rr=e=>he.fromDom(e.getBody()),Dr=e=>t=>ve(t,Rr(e)),Or=e=>{ue(e,"data-mce-style");const t=e=>ue(e,"data-mce-style");k(_t(e),t),k(It(e),t),k(Ft(e),t)},kr=e=>he.fromDom(e.selection.getStart()),Er=e=>e.getBoundingClientRect().width,Nr=e=>e.getBoundingClientRect().height,Br=(e,t)=>{const o=t.column,n=t.column+t.colspan-1,r=t.row,s=t.row+t.rowspan-1;return o<=e.finishCol&&n>=e.startCol&&r<=e.finishRow&&s>=e.startRow},zr=(e,t)=>t.column>=e.startCol&&t.column+t.colspan-1<=e.finishCol&&t.row>=e.startRow&&t.row+t.rowspan-1<=e.finishRow,Ar=(e,t,o)=>{const n=Ko(e,t,ve),r=Ko(e,o,ve);return n.bind((e=>r.map((t=>{return o=e,n=t,{startRow:Math.min(o.row,n.row),startCol:Math.min(o.column,n.column),finishRow:Math.max(o.row+o.rowspan-1,n.row+n.rowspan-1),finishCol:Math.max(o.column+o.colspan-1,n.column+n.colspan-1)};var o,n}))))},Wr=(e,t,o)=>Ar(e,t,o).map((t=>{const o=Yo(e,h(Br,t));return O(o,(e=>e.element))})),Lr=(e,t)=>Ko(e,t,((e,t)=>ye(t,e))).map((e=>e.element)),Mr=(e,t,o)=>{const n=_r(e);return Wr(n,t,o)},jr=(e,t,o,n,r)=>{const s=_r(e),l=ve(e,o)?y.some(t):Lr(s,t),a=ve(e,r)?y.some(n):Lr(s,n);return l.bind((e=>a.bind((t=>Wr(s,e,t)))))},_r=$o;var Ir=["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"],Pr=()=>({up:u({selector:at,closest:mt,predicate:lt,all:Re}),down:u({selector:rt,predicate:tt}),styles:u({get:Tt,getRaw:Dt,set:Ct,remove:Ot}),attrs:u({get:me,set:ce,remove:ue,copyTo:(e,t)=>{const o=fe(e);ie(t,o)}}),insert:u({before:Ne,after:Be,afterAll:Le,append:Ae,appendAll:Me,prepend:ze,wrap:We}),remove:u({unwrap:Ie,remove:_e}),create:u({nu:he.fromTag,clone:e=>he.fromDom(e.dom.cloneNode(!1)),text:he.fromText}),query:u({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:De,nextSibling:Oe}),property:u({children:ke,name:X,parent:Te,document:e=>Se(e).dom,isText:ne,isComment:te,isElement:oe,isSpecial:e=>{const t=X(e);return T(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>oe(e)?de(e,"lang"):y.none(),getText:ar,setText:ir,isBoundary:e=>!!oe(e)&&("body"===X(e)||T(Ir,X(e))),isEmptyTag:e=>!!oe(e)&&T(["br","img","hr","input"],X(e)),isNonEditable:e=>oe(e)&&"false"===me(e,"contenteditable")}),eq:ve,is:xe});const Fr=(e,t,o,n)=>{const r=t(e,o);return B(n,((o,n)=>{const r=t(e,n);return Hr(e,o,r)}),r)},Hr=(e,t,o)=>t.bind((t=>o.filter(h(e.eq,t)))),qr=Pr(),Vr=(e,t)=>((e,t,o)=>o.length>0?((e,t,o,n)=>n(e,t,o[0],o.slice(1)))(e,t,o,Fr):y.none())(qr,((t,o)=>e(o)),t),$r=e=>at(e,"table"),Ur=(e,t,o)=>{const n=e=>t=>void 0!==o&&o(t)||ve(t,e);return ve(e,t)?y.some({boxes:y.some([e]),start:e,finish:t}):$r(e).bind((r=>$r(t).bind((s=>{if(ve(r,s))return y.some({boxes:Mr(r,e,t),start:e,finish:t});if(ye(r,s)){const o=ot(t,"td,th",n(r)),l=o.length>0?o[o.length-1]:t;return y.some({boxes:jr(r,e,r,t,s),start:e,finish:l})}if(ye(s,r)){const o=ot(e,"td,th",n(s)),l=o.length>0?o[o.length-1]:e;return y.some({boxes:jr(s,e,r,t,s),start:e,finish:l})}return((e,t,o)=>((e,t,o,n=b)=>{const r=[t].concat(e.up().all(t)),s=[o].concat(e.up().all(o)),l=e=>W(e,n).fold((()=>e),(t=>e.slice(0,t+1))),a=l(r),c=l(s),i=A(a,(t=>R(c,((e,t)=>h(e.eq,t))(e,t))));return{firstpath:a,secondpath:c,shared:i}})(qr,e,t,void 0))(e,t).shared.bind((l=>mt(l,"table",o).bind((o=>{const l=ot(t,"td,th",n(o)),a=l.length>0?l[l.length-1]:t,c=ot(e,"td,th",n(o)),i=c.length>0?c[c.length-1]:e;return y.some({boxes:jr(o,e,r,t,s),start:i,finish:a})}))))}))))},Gr=(e,t)=>{const o=rt(e,t);return o.length>0?y.some(o):y.none()},Kr=(e,t,o)=>it(e,t).bind((t=>it(e,o).bind((e=>Vr($r,[t,e]).map((o=>({first:t,last:e,table:o}))))))),Yr=(e,t,o,n,r)=>((e,t)=>A(e,(e=>pe(e,t))))(e,r).bind((e=>((e,t,o)=>Pt(e).bind((n=>((e,t,o,n)=>Ko(e,t,ve).bind((t=>{const r=o>0?t.row+t.rowspan-1:t.row,s=n>0?t.column+t.colspan-1:t.column;return Go(e,r+o,s+n).map((e=>e.element))})))(_r(n),e,t,o))))(e,t,o).bind((e=>((e,t)=>at(e,"table").bind((o=>it(o,t).bind((t=>Ur(t,e).bind((e=>e.boxes.map((t=>({boxes:t,start:e.start,finish:e.finish}))))))))))(e,n))))),Jr=(e,t)=>Gr(e,t),Qr=(e,t,o)=>Kr(e,t,o).bind((t=>{const o=t=>ve(e,t),n="thead,tfoot,tbody,table",r=at(t.first,n,o),s=at(t.last,n,o);return r.bind((e=>s.bind((o=>ve(e,o)?((e,t,o)=>((e,t,o)=>Ar(e,t,o).bind((t=>((e,t)=>{let o=!0;const n=h(zr,t);for(let r=t.startRow;r<=t.finishRow;r++)for(let s=t.startCol;s<=t.finishCol;s++)o=o&&Go(e,r,s).exists(n);return o?y.some(t):y.none()})(e,t))))(_r(e),t,o))(t.table,t.first,t.last):y.none()))))})),Xr=f,Zr=e=>{const t=(e,t)=>de(e,t).exists((e=>parseInt(e,10)>1));return e.length>0&&j(e,(e=>t(e,"rowspan")||t(e,"colspan")))?y.some(e):y.none()},es=(e,t,o)=>t.length<=1?y.none():Qr(e,o.firstSelectedSelector,o.lastSelectedSelector).map((e=>({bounds:e,cells:t}))),ts={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]"},os=(e,t,o)=>({element:o,mergable:es(t,e,ts),unmergable:Zr(e),selection:Xr(e)}),ns=e=>(t,o)=>{const n=X(t),r="col"===n||"colgroup"===n?Pt(s=t).bind((e=>Jr(e,ts.firstSelectedSelector))).fold(u(s),(e=>e[0])):t;var s;return mt(r,e,o)},rs=ns("th,td,caption"),ss=ns("th,td"),ls=e=>{return t=e.model.table.getSelectedCells(),O(t,he.fromDom);var t},as=(e,t)=>{e.on("BeforeGetContent",(t=>{const o=o=>{t.preventDefault(),(e=>Pt(e[0]).map((e=>{const t=((e,t)=>{const o=e=>pe(e.element,t),n=He(e),r=$t(n),s=or(e),l=Uo(r),a=((e,t)=>{const o=e.grid.columns;let n=e.grid.rows,r=o,s=0,l=0;const a=[],c=[];return $(e.access,(e=>{if(a.push(e),t(e)){c.push(e);const t=e.row,o=t+e.rowspan-1,a=e.column,i=a+e.colspan-1;t<n?n=t:o>s&&(s=o),a<r?r=a:i>l&&(l=i)}})),((e,t,o,n,r,s)=>({minRow:e,minCol:t,maxRow:o,maxCol:n,allCells:r,selectedCells:s}))(n,r,s,l,a,c)})(l,o),c="th:not("+t+"),td:not("+t+")",i=Mt(n,"th,td",(e=>pe(e,c)));k(i,_e),((e,t,o,n)=>{const r=N(e,(e=>"colgroup"!==e.section)),s=t.grid.columns,l=t.grid.rows;for(let e=0;e<l;e++){let l=!1;for(let a=0;a<s;a++)e<o.minRow||e>o.maxRow||a<o.minCol||a>o.maxCol||(Go(t,e,a).filter(n).isNone()?sr(r,l,e):l=!0)}})(r,l,a,o);const m=((e,t,o,n)=>{if(0===n.minCol&&t.grid.columns===n.maxCol+1)return 0;const r=Qn(t,e,o),s=z(r,((e,t)=>e+t),0),l=z(r.slice(n.minCol,n.maxCol+1),((e,t)=>e+t),0),a=l/s*o.pixelWidth()-o.pixelWidth();return o.getCellDelta(a)})(e,$o(e),s,a);return((e,t,o,n)=>{$(o.columns,(e=>{(e.column<t.minCol||e.column>t.maxCol)&&_e(e.element)}));const r=N(Lt(e,"tr"),(e=>0===e.dom.childElementCount));k(r,_e),t.minCol!==t.maxCol&&t.minRow!==t.maxRow||k(Lt(e,"th,td"),(e=>{ue(e,"rowspan"),ue(e,"colspan")})),ue(e,Io),ue(e,"data-snooker-col-series"),or(e).adjustTableWidth(n)})(n,a,l,m),n})(e,"[data-mce-selected]");return Or(t),[t]})))(o).each((o=>{t.content="text"===t.format?(e=>O(e,(e=>e.dom.innerText)).join(""))(o):((e,t)=>O(t,(t=>e.selection.serializer.serialize(t.dom,{}))).join(""))(e,o)}))};if(!0===t.selection){const t=(e=>N(ls(e),(e=>pe(e,ts.selectedSelector))))(e);t.length>=1&&o(t)}})),e.on("BeforeSetContent",(o=>{if(!0===o.selection&&!0===o.paste){const n=ls(e);P(n).each((n=>{Pt(n).each((r=>{const s=N(((e,t)=>{const o=document.createElement("div");return o.innerHTML=e,ke(he.fromDom(o))})(o.content),(e=>"meta"!==X(e))),l=le("table");if(1===s.length&&l(s[0])){o.preventDefault();const l=he.fromDom(e.getDoc()),a=Tr(l),c=((e,t,o)=>({element:e,clipboard:t,generators:o}))(n,s[0],a);t.pasteCells(r,c).each((()=>{e.focus()}))}}))}))}}))},cs=(e,t)=>({element:e,offset:t}),is=(e,t,o)=>e.property().isText(t)&&0===e.property().getText(t).trim().length||e.property().isComment(t)?o(t).bind((t=>is(e,t,o).orThunk((()=>y.some(t))))):y.none(),ms=(e,t)=>e.property().isText(t)?e.property().getText(t).length:e.property().children(t).length,ds=(e,t)=>{const o=is(e,t,e.query().prevSibling).getOr(t);if(e.property().isText(o))return cs(o,ms(e,o));const n=e.property().children(o);return n.length>0?ds(e,n[n.length-1]):cs(o,ms(e,o))},us=ds,fs=Pr(),gs=(e,t)=>{if(!Nt(e)){const o=(e=>_n(e).bind((e=>{return t=e,o=["fixed","relative","empty"],y.from(kn.exec(t)).bind((e=>{const t=Number(e[1]),n=e[2];return((e,t)=>R(t,(t=>R(On[t],(t=>e===t)))))(n,o)?y.some({value:t,unit:n}):y.none()}));var t,o})))(e);o.each((o=>{const n=o.value/2;Hn(e,n,o.unit),Hn(t,n,o.unit)}))}},hs=e=>O(e,u(0)),ps=(e,t,o,n,r)=>r(e.slice(0,t)).concat(n).concat(r(e.slice(o))),ws=e=>(t,o,n,r)=>{if(e(n)){const e=Math.max(r,t[o]-Math.abs(n)),s=Math.abs(e-t[o]);return n>=0?s:-s}return n},bs=ws((e=>e<0)),vs=ws(v),ys=()=>{const e=(e,t,o,n)=>{const r=(100+o)/100,s=Math.max(n,(e[t]+o)/r);return O(e,((e,o)=>(o===t?s:e/r)-e))},t=(t,o,n,r,s,l)=>l?e(t,o,r,s):((e,t,o,n,r)=>{const s=bs(e,t,n,r);return ps(e,t,o+1,[s,0],hs)})(t,o,n,r,s);return{resizeTable:(e,t)=>e(t),clampTableDelta:bs,calcLeftEdgeDeltas:t,calcMiddleDeltas:(e,o,n,r,s,l,a)=>t(e,n,r,s,l,a),calcRightEdgeDeltas:(t,o,n,r,s,l)=>{if(l)return e(t,n,r,s);{const e=bs(t,n,r,s);return hs(t.slice(0,n)).concat([e])}},calcRedestributedWidths:(e,t,o,n)=>{if(n){const n=(t+o)/t,r=O(e,(e=>e/n));return{delta:100*n-100,newSizes:r}}return{delta:o,newSizes:e}}}},xs=()=>{const e=(e,t,o,n,r)=>{const s=vs(e,n>=0?o:t,n,r);return ps(e,t,o+1,[s,-s],hs)};return{resizeTable:(e,t,o)=>{o&&e(t)},clampTableDelta:(e,t,o,n,r)=>{if(r){if(o>=0)return o;{const t=z(e,((e,t)=>e+t-n),0);return Math.max(-t,o)}}return bs(e,t,o,n)},calcLeftEdgeDeltas:e,calcMiddleDeltas:(t,o,n,r,s,l)=>e(t,n,r,s,l),calcRightEdgeDeltas:(e,t,o,n,r,s)=>{if(s)return hs(e);{const t=n/e.length;return O(e,u(t))}},calcRedestributedWidths:(e,t,o,n)=>({delta:0,newSizes:e})}},Cs=e=>$o(e).grid,Ss=le("th"),Ts=e=>j(e,(e=>Ss(e.element))),Rs=(e,t)=>e&&t?"sectionCells":e?"section":"cells",Ds=e=>{const t="thead"===e.section,o=dt(Os(e.cells),"th");return"tfoot"===e.section?{type:"footer"}:t||o?{type:"header",subType:Rs(t,o)}:{type:"body"}},Os=e=>{const t=N(e,(e=>Ss(e.element)));return 0===t.length?y.some("td"):t.length===e.length?y.some("th"):y.none()},ks=(e,t,o)=>Ge(o(e.element,t),!0,e.isLocked),Es=(e,t)=>e.section!==t?Ke(e.element,e.cells,t,e.isNew):e,Ns=()=>({transformRow:Es,transformCell:(e,t,o)=>{const n=o(e.element,t),r="td"!==X(n)?((e,t)=>{const o=qe(e,"td");Be(e,o);const n=ke(e);return Me(o,n),_e(e),o})(n):n;return Ge(r,e.isNew,e.isLocked)}}),Bs=()=>({transformRow:Es,transformCell:ks}),zs=()=>({transformRow:(e,t)=>Es(e,"thead"===t?"tbody":t),transformCell:ks}),As=Ns,Ws=Bs,Ls=zs,Ms=()=>({transformRow:f,transformCell:ks}),js=e=>mt(e,"[contenteditable]"),_s=(e,t=!1)=>Ze(e)?e.dom.isContentEditable:js(e).fold(u(t),(e=>"true"===Is(e))),Is=e=>e.dom.contentEditable,Ps=(e,t,o,n)=>{o===n?ue(e,t):ce(e,t,o)},Fs=(e,t,o)=>{F(nt(e,t)).fold((()=>ze(e,o)),(e=>Be(e,o)))},Hs=(e,t)=>{const o=[],n=[],r=e=>O(e,(e=>{e.isNew&&o.push(e.element);const t=e.element;return je(t),k(e.cells,(e=>{e.isNew&&n.push(e.element),Ps(e.element,"colspan",e.colspan,1),Ps(e.element,"rowspan",e.rowspan,1),Ae(t,e.element)})),t})),s=e=>M(e,(e=>O(e.cells,(e=>(Ps(e.element,"span",e.colspan,1),e.element))))),l=(t,o)=>{const n=((e,t)=>{const o=ct(e,t).getOrThunk((()=>{const o=he.fromTag(t,Ce(e).dom);return"thead"===t?Fs(e,"caption,colgroup",o):"colgroup"===t?Fs(e,"caption",o):Ae(e,o),o}));return je(o),o})(e,o),l=("colgroup"===o?s:r)(t);Me(n,l)},a=(t,o)=>{t.length>0?l(t,o):(t=>{ct(e,t).each(_e)})(o)},c=[],i=[],m=[],d=[];return k(t,(e=>{switch(e.section){case"thead":c.push(e);break;case"tbody":i.push(e);break;case"tfoot":m.push(e);break;case"colgroup":d.push(e)}})),a(d,"colgroup"),a(c,"thead"),a(i,"tbody"),a(m,"tfoot"),{newRows:o,newCells:n}},qs=(e,t)=>{if(0===e.length)return 0;const o=e[0];return W(e,(e=>!t(o.element,e.element))).getOr(e.length)},Vs=(e,t)=>{const o=O(e,(e=>O(e.cells,b)));return O(e,((n,r)=>{const s=M(n.cells,((n,s)=>{if(!1===o[r][s]){const m=((e,t,o,n)=>{const r=((e,t)=>e[t])(e,t),s="colgroup"===r.section,l=qs(r.cells.slice(o),n),a=s?1:qs(((e,t)=>O(e,(e=>Wo(e,t))))(e.slice(t),o),n);return{colspan:l,rowspan:a}})(e,r,s,t);return((e,t,n,r)=>{for(let s=e;s<e+n;s++)for(let e=t;e<t+r;e++)o[s][e]=!0})(r,s,m.rowspan,m.colspan),[(l=n.element,a=m.rowspan,c=m.colspan,i=n.isNew,{element:l,rowspan:a,colspan:c,isNew:i})]}return[];var l,a,c,i}));return((e,t,o,n)=>({element:e,cells:t,section:o,isNew:n}))(n.element,s,n.section,n.isNew)}))},$s=(e,t,o)=>{const n=[];k(e.colgroups,(r=>{const s=[];for(let n=0;n<e.grid.columns;n++){const r=Zo(e,n).map((e=>Ge(e.element,o,!1))).getOrThunk((()=>Ge(t.colGap(),!0,!1)));s.push(r)}n.push(Ke(r.element,s,"colgroup",o))}));for(let r=0;r<e.grid.rows;r++){const s=[];for(let n=0;n<e.grid.columns;n++){const l=Go(e,r,n).map((e=>Ge(e.element,o,e.isLocked))).getOrThunk((()=>Ge(t.gap(),!0,!1)));s.push(l)}const l=e.all[r],a=Ke(l.element,s,l.section,o);n.push(a)}return n},Us=e=>Vs(e,ve),Gs=(e,t)=>H(e.all,(e=>A(e.cells,(e=>ve(t,e.element))))),Ks=(e,t,o)=>{const n=O(t.selection,(t=>jt(t).bind((t=>Gs(e,t))).filter(o))),r=ut(n);return ft(r.length>0,r)},Ys=(e,t,o,n,r)=>(s,l,a,c)=>{const i=$o(s),m=y.from(null==c?void 0:c.section).getOrThunk(Ms);return t(i,l).map((t=>{const o=((e,t)=>$s(e,t,!1))(i,a),n=e(o,t,ve,r(a),m),s=Fo(n.grid);return{info:t,grid:Us(n.grid),cursor:n.cursor,lockedColumns:s}})).bind((e=>{const t=Hs(s,e.grid),r=y.from(null==c?void 0:c.sizing).getOrThunk((()=>or(s))),l=y.from(null==c?void 0:c.resize).getOrThunk(xs);return o(s,e.grid,e.info,{sizing:r,resize:l,section:m}),n(s),ue(s,Io),e.lockedColumns.length>0&&ce(s,Io,e.lockedColumns.join(",")),y.some({cursor:e.cursor,newRows:t.newRows,newCells:t.newCells})}))},Js=(e,t)=>Ks(e,t,v).map((e=>({cells:e,generators:t.generators,clipboard:t.clipboard}))),Qs=(e,t)=>Ks(e,t,v),Xs=(e,t)=>Ks(e,t,(e=>!e.isLocked)),Zs=(e,t)=>j(t,(t=>((e,t)=>Gs(e,t).exists((e=>!e.isLocked)))(e,t))),el=(e,t,o,n)=>{const r=jo(e).rows;let s=!0;for(let e=0;e<r.length;e++)for(let l=0;l<Mo(r[0]);l++){const a=r[e],c=Wo(a,l),i=o(c.element,t);i&&!s?zo(a,l,Ge(n(),!0,c.isLocked)):i&&(s=!1)}return e},tl=e=>{const t=t=>t(e),o=u(e),n=()=>r,r={tag:!0,inner:e,fold:(t,o)=>o(e),isValue:v,isError:b,map:t=>nl.value(t(e)),mapError:n,bind:t,exists:t,forall:t,getOr:o,or:n,getOrThunk:o,orThunk:n,getOrDie:o,each:t=>{t(e)},toOptional:()=>y.some(e)};return r},ol=e=>{const t=()=>o,o={tag:!1,inner:e,fold:(t,o)=>t(e),isValue:b,isError:v,map:t,mapError:t=>nl.error(t(e)),bind:t,exists:b,forall:v,getOr:f,or:f,getOrThunk:w,orThunk:w,getOrDie:(n=String(e),()=>{throw new Error(n)}),each:d,toOptional:y.none};var n;return o},nl={value:tl,error:ol,fromOption:(e,t)=>e.fold((()=>ol(t)),tl)},rl=(e,t)=>({rowDelta:0,colDelta:Mo(e[0])-Mo(t[0])}),sl=(e,t)=>({rowDelta:e.length-t.length,colDelta:0}),ll=(e,t,o,n)=>{const r="colgroup"===t.section?o.col:o.cell;return D(e,(e=>Ge(r(),!0,n(e))))},al=(e,t,o,n)=>{const r=e[e.length-1];return e.concat(D(t,(()=>{const e="colgroup"===r.section?o.colgroup:o.row,t=_o(r,e,f),s=ll(t.cells.length,t,o,(e=>Q(n,e.toString())));return Ao(t,s)})))},cl=(e,t,o,n)=>O(e,(e=>{const r=ll(t,e,o,b);return No(e,n,r)})),il=(e,t,o)=>{const n=t.colDelta<0?cl:f,r=t.rowDelta<0?al:f,s=Fo(e),l=Mo(e[0]),a=R(s,(e=>e===l-1)),c=n(e,Math.abs(t.colDelta),o,a?l-1:l),i=Fo(c);return r(c,Math.abs(t.rowDelta),o,_(i,v))},ml=(e,t,o,n)=>{const r=h(n,Wo(e[t],o).element),s=e[t];return e.length>1&&Mo(s)>1&&(o>0&&r(Lo(s,o-1))||o<s.cells.length-1&&r(Lo(s,o+1))||t>0&&r(Lo(e[t-1],o))||t<e.length-1&&r(Lo(e[t+1],o)))},dl=(e,t,o)=>N(o,(o=>o>=e.column&&o<=Mo(t[0])+e.column)),ul=(e,t,o,n,r)=>{((e,t,o,n)=>{t>0&&t<e[0].cells.length&&k(e,(e=>{const r=e.cells[t-1],s=e.cells[t];o(s.element,r.element)&&zo(e,t,Ge(n(),!0,s.isLocked))}))})(t,e,r,n.cell);const s=sl(o,t),l=il(o,s,n),a=sl(t,l),c=il(t,a,n);return O(c,((t,o)=>No(t,e,l[o].cells)))},fl=(e,t,o,n,r)=>{((e,t,o,n)=>{const r=jo(e).rows;if(t>0&&t<r.length){const e=((e,t)=>z(e,((e,o)=>R(e,(e=>t(e.element,o.element)))?e:e.concat([o])),[]))(r[t-1].cells,o);k(e,(e=>{let s=y.none();for(let l=t;l<r.length;l++)for(let t=0;t<Mo(r[0]);t++){const a=r[l],c=Wo(a,t);o(c.element,e.element)&&(s.isNone()&&(s=y.some(n())),s.each((e=>{zo(a,t,Ge(e,!0,c.isLocked))})))}}))}})(t,e,r,n.cell);const s=Fo(t),l=rl(t,o),a={...l,colDelta:l.colDelta-s.length},c=il(t,a,n),{cols:i,rows:m}=jo(c),d=Fo(c),u=rl(o,t),f={...u,colDelta:u.colDelta+d.length},g=(p=n,w=d,O(o,(e=>z(w,((t,o)=>{const n=ll(1,e,p,v)[0];return Bo(t,o,n)}),e)))),h=il(g,f,n);var p,w;return[...i,...m.slice(0,e),...h,...m.slice(e,m.length)]},gl=(e,t,o,n,r)=>{const{rows:s,cols:l}=jo(e),a=s.slice(0,t),c=s.slice(t);return[...l,...a,((e,t,o,n)=>_o(e,(e=>n(e,o)),t))(s[o],((e,o)=>t>0&&t<s.length&&n(Lo(s[t-1],o),Lo(s[t],o))?Wo(s[t],o):Ge(r(e.element,n),!0,e.isLocked)),n,r),...c]},hl=(e,t,o,n,r)=>O(e,(e=>{const s=t>0&&t<Mo(e)&&n(Lo(e,t-1),Lo(e,t)),l=((e,t,o,n,r,s,l)=>{if("colgroup"!==o&&n)return Wo(e,t);{const t=Wo(e,r);return Ge(l(t.element,s),!0,!1)}})(e,t,e.section,s,o,n,r);return Bo(e,t,l)})),pl=(e,t,o,n)=>((e,t,o,n)=>void 0!==Lo(e[t],o)&&t>0&&n(Lo(e[t-1],o),Lo(e[t],o)))(e,t,o,n)||((e,t,o)=>t>0&&o(Lo(e,t-1),Lo(e,t)))(e[t],o,n),wl=(e,t,o,n)=>{const r=e=>(e=>"row"===e?Bt(t):Nt(t))(e)?`${e}group`:e;return e?Ss(t)?r(o):null:n&&Ss(t)?r("row"===o?"col":"row"):null},bl=(e,t,o)=>Ge(o(e.element,t),!0,e.isLocked),vl=(e,t,o,n,r,s,l)=>O(e,((e,a)=>((e,c)=>{const i=e.cells,m=O(i,((e,c)=>{if((e=>R(t,(t=>o(e.element,t.element))))(e)){const t=l(e,a,c)?r(e,o,n):e;return s(t,a,c).each((e=>{var o,n;o=t.element,n={scope:y.from(e)},$(n,((e,t)=>{e.fold((()=>{ue(o,t)}),(e=>{ae(o.dom,t,e)}))}))})),t}return e}));return Ke(e.element,m,e.section,e.isNew)})(e))),yl=(e,t,o)=>M(e,((n,r)=>pl(e,r,t,o)?[]:[Wo(n,t)])),xl=(e,t,o,n,r)=>{const s=jo(e).rows,l=M(t,(e=>yl(s,e,n))),a=O(s,(e=>Ts(e.cells))),c=((e,t)=>j(t,f)&&Ts(e)?v:(e,o,n)=>!("th"===X(e.element)&&t[o]))(l,a),i=((e,t)=>(o,n)=>y.some(wl(e,o.element,"row",t[n])))(o,a);return vl(e,l,n,r,bl,i,c)},Cl=(e,t,o,n)=>{const r=jo(e).rows,s=O(t,(e=>Wo(r[e.row],e.column)));return vl(e,s,o,n,bl,y.none,v)},Sl=e=>{if(!s(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],o={};return k(e,((n,r)=>{const l=q(n);if(1!==l.length)throw new Error("one and only one name per case");const a=l[0],c=n[a];if(void 0!==o[a])throw new Error("duplicate key detected:"+a);if("cata"===a)throw new Error("cannot have a case named cata (sorry)");if(!s(c))throw new Error("case arguments must be an array");t.push(a),o[a]=(...o)=>{const n=o.length;if(n!==c.length)throw new Error("Wrong number of arguments to case "+a+". Expected "+c.length+" ("+c+"), got "+n);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[r].apply(null,o)},match:e=>{const n=q(e);if(t.length!==n.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+n.join(","));if(!j(t,(e=>T(n,e))))throw new Error("Not all branches were specified when using match. Specified: "+n.join(", ")+"\nRequired: "+t.join(", "));return e[a].apply(null,o)},log:e=>{console.log(e,{constructors:t,constructor:a,params:o})}}}})),o},Tl={...Sl([{none:[]},{only:["index"]},{left:["index","next"]},{middle:["prev","index","next"]},{right:["prev","index"]}])},Rl=(e,t,o)=>{let n=0;for(let r=e;r<t;r++)n+=void 0!==o[r]?o[r]:0;return n},Dl=(e,t)=>{const o=Jo(e);return O(o,(e=>{const o=Rl(e.row,e.row+e.rowspan,t);return{element:e.element,height:o,rowspan:e.rowspan}}))},Ol=(e,t,o)=>{const n=((e,t)=>Xo(e)?((e,t)=>{const o=Qo(e);return O(o,((e,o)=>({element:e.element,width:t[o],colspan:e.colspan})))})(e,t):((e,t)=>{const o=Jo(e);return O(o,(e=>{const o=Rl(e.column,e.column+e.colspan,t);return{element:e.element,width:o,colspan:e.colspan}}))})(e,t))(e,t);k(n,(e=>{o.setElementWidth(e.element,e.width)}))},kl=(e,t,o,n,r)=>{const s=$o(e),l=r.getCellDelta(t),a=r.getWidths(s,r),c=o===s.grid.columns-1,i=n.clampTableDelta(a,o,l,r.minCellWidth(),c),m=((e,t,o,n,r)=>{const s=e.slice(0),l=((e,t)=>0===e.length?Tl.none():1===e.length?Tl.only(0):0===t?Tl.left(0,1):t===e.length-1?Tl.right(t-1,t):t>0&&t<e.length-1?Tl.middle(t-1,t,t+1):Tl.none())(e,t),a=u(O(s,u(0)));return l.fold(a,(e=>n.singleColumnWidth(s[e],o)),((e,t)=>r.calcLeftEdgeDeltas(s,e,t,o,n.minCellWidth(),n.isRelative)),((e,t,l)=>r.calcMiddleDeltas(s,e,t,l,o,n.minCellWidth(),n.isRelative)),((e,t)=>r.calcRightEdgeDeltas(s,e,t,o,n.minCellWidth(),n.isRelative)))})(a,o,i,r,n),d=O(m,((e,t)=>e+a[t]));Ol(s,d,r),n.resizeTable(r.adjustTableWidth,i,c)},El=e=>z(e,((e,t)=>R(e,(e=>e.column===t.column))?e:e.concat([t])),[]).sort(((e,t)=>e.column-t.column)),Nl=le("col"),Bl=le("colgroup"),zl=e=>"tr"===X(e)||Bl(e),Al=e=>({element:e,colspan:kt(e,"colspan",1),rowspan:kt(e,"rowspan",1)}),Wl=e=>de(e,"scope").map((e=>e.substr(0,3))),Ll=(e,t=Al)=>{const o=o=>{if(zl(o))return Bl((r={element:o}).element)?e.colgroup(r):e.row(r);{const r=o,s=(t=>Nl(t.element)?e.col(t):e.cell(t))(t(r));return n=y.some({item:r,replacement:s}),s}var r};let n=y.none();return{getOrInit:(e,t)=>n.fold((()=>o(e)),(n=>t(e,n.item)?n.replacement:o(e)))}},Ml=e=>t=>{const o=[],n=n=>{const r="td"===e?{scope:null}:{},s=t.replace(n,e,r);return o.push({item:n,sub:s}),s};return{replaceOrInit:(e,t)=>{if(zl(e)||Nl(e))return e;{const r=e;return((e,t)=>A(o,(o=>t(o.item,e))))(r,t).fold((()=>n(r)),(o=>t(e,o.item)?o.sub:n(r)))}}}},jl=e=>({unmerge:t=>{const o=Wl(t);return o.each((e=>ce(t,"scope",e))),()=>{const n=e.cell({element:t,colspan:1,rowspan:1});return Ot(n,"width"),Ot(t,"width"),o.each((e=>ce(n,"scope",e))),n}},merge:e=>(Ot(e[0],"width"),(()=>{const t=ut(O(e,Wl));if(0===t.length)return y.none();{const e=t[0],o=["row","col"];return R(t,(t=>t!==e&&T(o,t)))?y.none():y.from(e)}})().fold((()=>ue(e[0],"scope")),(t=>ce(e[0],"scope",t+"group"))),u(e[0]))}),_l=["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"],Il=Pr(),Pl=e=>((e,t)=>{const o=e.property().name(t);return T(_l,o)})(Il,e),Fl=e=>((e,t)=>{const o=e.property().name(t);return T(["ol","ul"],o)})(Il,e),Hl=e=>{const t=le("br"),o=e=>gr(e).bind((o=>{const n=Oe(o).map((e=>!!Pl(e)||!!((e,t)=>T(["br","img","hr","input"],e.property().name(t)))(Il,e)&&"img"!==X(e))).getOr(!1);return Te(o).map((r=>{return!0===n||("li"===X(s=r)||lt(s,Fl).isSome())||t(o)||Pl(r)&&!ve(e,r)?[]:[he.fromTag("br")];var s}))})).getOr([]),n=(()=>{const n=M(e,(e=>{const n=ke(e);return(e=>j(e,(e=>t(e)||ne(e)&&0===ar(e).trim().length)))(n)?[]:n.concat(o(e))}));return 0===n.length?[he.fromTag("br")]:n})();je(e[0]),Me(e[0],n)},ql=e=>_s(e,!0),Vl=e=>{0===_t(e).length&&_e(e)},$l=(e,t)=>({grid:e,cursor:t}),Ul=(e,t,o)=>{const n=((e,t,o)=>{var n,r;const s=jo(e).rows;return y.from(null===(r=null===(n=s[t])||void 0===n?void 0:n.cells[o])||void 0===r?void 0:r.element).filter(ql).orThunk((()=>(e=>H(e,(e=>H(e.cells,(e=>{const t=e.element;return ft(ql(t),t)})))))(s)))})(e,t,o);return $l(e,n)},Gl=e=>z(e,((e,t)=>R(e,(e=>e.row===t.row))?e:e.concat([t])),[]).sort(((e,t)=>e.row-t.row)),Kl=(e,t)=>(o,n,r,s,l)=>{const a=Gl(n),c=O(a,(e=>e.row)),i=((e,t,o,n,r,s,l)=>{const{cols:a,rows:c}=jo(e),i=c[t[0]],m=M(t,(e=>((e,t,o)=>{const n=e[t];return M(n.cells,((n,r)=>pl(e,t,r,o)?[]:[n]))})(c,e,r))),d=O(i.cells,((e,t)=>Ts(yl(c,t,r)))),u=[...c];k(t,(e=>{u[e]=l.transformRow(c[e],o)}));const g=[...a,...u],h=((e,t)=>j(t,f)&&Ts(e.cells)?v:(e,o,n)=>!("th"===X(e.element)&&t[n]))(i,d),p=((e,t)=>(o,n,r)=>y.some(wl(e,o.element,"col",t[r])))(n,d);return vl(g,m,r,s,l.transformCell,p,h)})(o,c,e,t,r,s.replaceOrInit,l);return Ul(i,n[0].row,n[0].column)},Yl=Kl("thead",!0),Jl=Kl("tbody",!1),Ql=Kl("tfoot",!1),Xl=(e,t,o)=>{const n=((e,t)=>qt(e,(()=>t)))(e,o.section),r=Uo(n);return $s(r,t,!0)},Zl=(e,t,o,n)=>((e,t,o,n)=>{const r=Uo(t),s=n.getWidths(r,n);Ol(r,s,n)})(0,t,0,n.sizing),ea=(e,t,o,n)=>((e,t,o,n,r)=>{const s=Uo(t),l=n.getWidths(s,n),a=n.pixelWidth(),{newSizes:c,delta:i}=r.calcRedestributedWidths(l,a,o.pixelDelta,n.isRelative);Ol(s,c,n),n.adjustTableWidth(i)})(0,t,o,n.sizing,n.resize),ta=(e,t)=>R(t,(e=>0===e.column&&e.isLocked)),oa=(e,t)=>R(t,(t=>t.column+t.colspan>=e.grid.columns&&t.isLocked)),na=(e,t)=>{const o=en(e),n=El(t);return z(n,((e,t)=>e+o[t.column].map(ko).getOr(0)),0)},ra=e=>(t,o)=>Qs(t,o).filter((o=>!(e?ta:oa)(t,o))).map((e=>({details:e,pixelDelta:na(t,e)}))),sa=e=>(t,o)=>Js(t,o).filter((o=>!(e?ta:oa)(t,o.cells))),la=Ml("th"),aa=Ml("td"),ca=Ys(((e,t,o,n)=>{const r=t[0].row,s=Gl(t),l=B(s,((e,t)=>({grid:gl(e.grid,r,t.row+e.delta,o,n.getOrInit),delta:e.delta+1})),{grid:e,delta:0}).grid;return Ul(l,r,t[0].column)}),Qs,d,d,Ll),ia=Ys(((e,t,o,n)=>{const r=Gl(t),s=r[r.length-1],l=s.row+s.rowspan,a=B(r,((e,t)=>gl(e,l,t.row,o,n.getOrInit)),e);return Ul(a,l,t[0].column)}),Qs,d,d,Ll),ma=Ys(((e,t,o,n)=>{const r=t.details,s=El(r),l=s[0].column,a=B(s,((e,t)=>({grid:hl(e.grid,l,t.column+e.delta,o,n.getOrInit),delta:e.delta+1})),{grid:e,delta:0}).grid;return Ul(a,r[0].row,l)}),ra(!0),ea,d,Ll),da=Ys(((e,t,o,n)=>{const r=t.details,s=r[r.length-1],l=s.column+s.colspan,a=El(r),c=B(a,((e,t)=>hl(e,l,t.column,o,n.getOrInit)),e);return Ul(c,r[0].row,l)}),ra(!1),ea,d,Ll),ua=Ys(((e,t,o,n)=>{const r=El(t.details),s=((e,t)=>M(e,(e=>{const o=e.cells,n=B(t,((e,t)=>t>=0&&t<e.length?e.slice(0,t).concat(e.slice(t+1)):e),o);return n.length>0?[Ke(e.element,n,e.section,e.isNew)]:[]})))(e,O(r,(e=>e.column))),l=s.length>0?s[0].cells.length-1:0;return Ul(s,r[0].row,Math.min(r[0].column,l))}),((e,t)=>Xs(e,t).map((t=>({details:t,pixelDelta:-na(e,t)})))),ea,Vl,Ll),fa=Ys(((e,t,o,n)=>{const r=Gl(t),s=((e,t,o)=>{const{rows:n,cols:r}=jo(e);return[...r,...n.slice(0,t),...n.slice(o+1)]})(e,r[0].row,r[r.length-1].row),l=s.length>0?s.length-1:0;return Ul(s,Math.min(t[0].row,l),t[0].column)}),Qs,d,Vl,Ll),ga=Ys(((e,t,o,n)=>{const r=El(t),s=O(r,(e=>e.column)),l=xl(e,s,!0,o,n.replaceOrInit);return Ul(l,t[0].row,t[0].column)}),Xs,d,d,la),ha=Ys(((e,t,o,n)=>{const r=El(t),s=O(r,(e=>e.column)),l=xl(e,s,!1,o,n.replaceOrInit);return Ul(l,t[0].row,t[0].column)}),Xs,d,d,aa),pa=Ys(Yl,Xs,d,d,la),wa=Ys(Jl,Xs,d,d,aa),ba=Ys(Ql,Xs,d,d,aa),va=Ys(((e,t,o,n)=>{const r=Cl(e,t,o,n.replaceOrInit);return Ul(r,t[0].row,t[0].column)}),Xs,d,d,la),ya=Ys(((e,t,o,n)=>{const r=Cl(e,t,o,n.replaceOrInit);return Ul(r,t[0].row,t[0].column)}),Xs,d,d,aa),xa=Ys(((e,t,o,n)=>{const r=t.cells;Hl(r);const s=((e,t,o,n)=>{const r=jo(e).rows;if(0===r.length)return e;for(let e=t.startRow;e<=t.finishRow;e++)for(let o=t.startCol;o<=t.finishCol;o++){const t=r[e],s=Wo(t,o).isLocked;zo(t,o,Ge(n(),!1,s))}return e})(e,t.bounds,0,n.merge(r));return $l(s,y.from(r[0]))}),((e,t)=>((e,t)=>t.mergable)(0,t).filter((t=>Zs(e,t.cells)))),Zl,d,jl),Ca=Ys(((e,t,o,n)=>{const r=B(t,((e,t)=>el(e,t,o,n.unmerge(t))),e);return $l(r,y.from(t[0]))}),((e,t)=>((e,t)=>t.unmergable)(0,t).filter((t=>Zs(e,t)))),Zl,d,jl),Sa=Ys(((e,t,o,n)=>{const r=((e,t)=>{const o=$o(e);return $s(o,t,!0)})(t.clipboard,t.generators);var s,l;return((e,t,o,n,r)=>{const s=Fo(t),l=((e,t,o)=>{const n=Mo(t[0]),r=jo(t).cols.length+e.row,s=D(n-e.column,(t=>t+e.column));return{row:r,column:A(s,(e=>j(o,(t=>t!==e)))).getOr(n-1)}})(e,t,s),a=jo(o).rows,c=dl(l,a,s),i=((e,t,o)=>{if(e.row>=t.length||e.column>Mo(t[0]))return nl.error("invalid start address out of table bounds, row: "+e.row+", column: "+e.column);const n=t.slice(e.row),r=n[0].cells.slice(e.column),s=Mo(o[0]),l=o.length;return nl.value({rowDelta:n.length-l,colDelta:r.length-s})})(l,t,a);return i.map((e=>{const o={...e,colDelta:e.colDelta-c.length},s=il(t,o,n),i=Fo(s),m=dl(l,a,i);return((e,t,o,n,r,s)=>{const l=e.row,a=e.column,c=l+o.length,i=a+Mo(o[0])+s.length,m=_(s,v);for(let e=l;e<c;e++){let s=0;for(let c=a;c<i;c++){if(m[c]){s++;continue}ml(t,e,c,r)&&el(t,Lo(t[e],c),r,n.cell);const i=c-a-s,d=Wo(o[e-l],i),u=d.element,f=n.replace(u);zo(t[e],c,Ge(f,!0,d.isLocked))}}return t})(l,s,a,n,r,m)}))})((s=t.row,l=t.column,{row:s,column:l}),e,r,t.generators,o).fold((()=>$l(e,y.some(t.element))),(e=>Ul(e,t.row,t.column)))}),((e,t)=>jt(t.element).bind((o=>Gs(e,o).map((e=>({...e,generators:t.generators,clipboard:t.clipboard})))))),Zl,d,Ll),Ta=Ys(((e,t,o,n)=>{const r=jo(e).rows,s=t.cells[0].column,l=r[t.cells[0].row],a=Xl(t.clipboard,t.generators,l),c=ul(s,e,a,t.generators,o);return Ul(c,t.cells[0].row,t.cells[0].column)}),sa(!0),d,d,Ll),Ra=Ys(((e,t,o,n)=>{const r=jo(e).rows,s=t.cells[t.cells.length-1].column+t.cells[t.cells.length-1].colspan,l=r[t.cells[0].row],a=Xl(t.clipboard,t.generators,l),c=ul(s,e,a,t.generators,o);return Ul(c,t.cells[0].row,t.cells[0].column)}),sa(!1),d,d,Ll),Da=Ys(((e,t,o,n)=>{const r=jo(e).rows,s=t.cells[0].row,l=r[s],a=Xl(t.clipboard,t.generators,l),c=fl(s,e,a,t.generators,o);return Ul(c,t.cells[0].row,t.cells[0].column)}),Js,d,d,Ll),Oa=Ys(((e,t,o,n)=>{const r=jo(e).rows,s=t.cells[t.cells.length-1].row+t.cells[t.cells.length-1].rowspan,l=r[t.cells[0].row],a=Xl(t.clipboard,t.generators,l),c=fl(s,e,a,t.generators,o);return Ul(c,t.cells[0].row,t.cells[0].column)}),Js,d,d,Ll),ka=(e,t)=>{const o=$o(e);return Qs(o,t).bind((e=>{const t=e[e.length-1],n=e[0].column,r=t.column+t.colspan,s=L(O(o.all,(e=>N(e.cells,(e=>e.column>=n&&e.column<r)))));return Os(s)})).getOr("")},Ea=(e,t)=>{const o=$o(e);return Qs(o,t).bind(Os).getOr("")},Na=(e,t)=>{const o=$o(e);return Qs(o,t).bind((e=>{const t=e[e.length-1],n=e[0].row,r=t.row+t.rowspan;return(e=>{const t=O(e,(e=>Ds(e).type)),o=T(t,"header"),n=T(t,"footer");if(o||n){const e=T(t,"body");return!o||e||n?o||e||!n?y.none():y.some("footer"):y.some("header")}return y.some("body")})(o.all.slice(n,r))})).getOr("")},Ba=(e,t)=>e.dispatch("NewRow",{node:t}),za=(e,t)=>e.dispatch("NewCell",{node:t}),Aa=(e,t,o)=>{e.dispatch("TableModified",{...o,table:t})},Wa={structure:!1,style:!0},La={structure:!0,style:!1},Ma={structure:!0,style:!0},ja=e=>t=>t.options.get(e),_a=e=>y.from(e.options.get("table_clone_elements")),Ia=ja("table_header_type"),Pa=ja("table_column_resizing"),Fa=e=>"preservetable"===Pa(e),Ha=e=>"resizetable"===Pa(e),qa=ja("table_sizing_mode"),Va=e=>"relative"===qa(e),$a=e=>"fixed"===qa(e),Ua=e=>"responsive"===qa(e),Ga=ja("table_resize_bars"),Ka=ja("table_default_attributes"),Ya=ja("table_use_colgroups"),Ja=(e,t)=>Va(e)?rr(t):$a(e)?nr(t):or(t),Qa=(e,t,o)=>{const n=e=>"table"===X(Rr(e)),r=_a(e),s=Ha(e)?d:gs,l=t=>{switch(Ia(e)){case"section":return As();case"sectionCells":return Ws();case"cells":return Ls();default:return((e,t)=>{var o;switch((o=$o(e),H(o.all,(e=>{const t=Ds(e);return"header"===t.type?y.from(t.subType):y.none()}))).getOr(t)){case"section":return Ns();case"sectionCells":return Bs();case"cells":return zs()}})(t,"section")}},a=(n,s,a,c)=>(i,m,d=!1)=>{Or(i);const u=he.fromDom(e.getDoc()),f=Sr(a,u,r),g={sizing:Ja(e,i),resize:Ha(e)?ys():xs(),section:l(i)};return s(i)?n(i,m,f,g).bind((n=>{t.refresh(i.dom),k(n.newRows,(t=>{Ba(e,t.dom)})),k(n.newCells,(t=>{za(e,t.dom)}));const r=((t,n)=>n.cursor.fold((()=>{const n=_t(t);return P(n).filter(Ze).map((n=>{o.clearSelectedCells(t.dom);const r=e.dom.createRng();return r.selectNode(n.dom),e.selection.setRng(r),ce(n,"data-mce-selected","1"),r}))}),(n=>{const r=us(fs,n),s=e.dom.createRng();return s.setStart(r.element.dom,r.offset),s.setEnd(r.element.dom,r.offset),e.selection.setRng(s),o.clearSelectedCells(t.dom),y.some(s)})))(i,n);return Ze(i)&&(Or(i),d||Aa(e,i.dom,c)),r.map((e=>({rng:e,effect:c})))})):y.none()},c=a(fa,(t=>!1===n(e)||Cs(t).rows>1),d,La),i=a(ua,(t=>!1===n(e)||Cs(t).columns>1),d,La);return{deleteRow:c,deleteColumn:i,insertRowsBefore:a(ca,v,d,La),insertRowsAfter:a(ia,v,d,La),insertColumnsBefore:a(ma,v,s,La),insertColumnsAfter:a(da,v,s,La),mergeCells:a(xa,v,d,La),unmergeCells:a(Ca,v,d,La),pasteColsBefore:a(Ta,v,d,La),pasteColsAfter:a(Ra,v,d,La),pasteRowsBefore:a(Da,v,d,La),pasteRowsAfter:a(Oa,v,d,La),pasteCells:a(Sa,v,d,Ma),makeCellsHeader:a(va,v,d,La),unmakeCellsHeader:a(ya,v,d,La),makeColumnsHeader:a(ga,v,d,La),unmakeColumnsHeader:a(ha,v,d,La),makeRowsHeader:a(pa,v,d,La),makeRowsBody:a(wa,v,d,La),makeRowsFooter:a(ba,v,d,La),getTableRowType:Na,getTableCellType:Ea,getTableColType:ka}},Xa=(e,t,o)=>{const n=kt(e,t,1);1===o||n<=1?ue(e,t):ce(e,t,Math.min(o,n))},Za=Sl([{invalid:["raw"]},{pixels:["value"]},{percent:["value"]}]),ec=(e,t,o)=>{const n=o.substring(0,o.length-e.length),r=parseFloat(n);return n===r.toString()?t(r):Za.invalid(o)},tc={...Za,from:e=>wt(e,"%")?ec("%",Za.percent,e):wt(e,"px")?ec("px",Za.pixels,e):Za.invalid(e)},oc=(e,t,o)=>{const n=tc.from(o),r=j(e,(e=>"0px"===e))?((e,t)=>{const o=e.fold((()=>u("")),(e=>u(e/t+"px")),(()=>u(100/t+"%")));return D(t,o)})(n,e.length):((e,t,o)=>e.fold((()=>t),(e=>((e,t,o)=>{const n=o/t;return O(e,(e=>tc.from(e).fold((()=>e),(e=>e*n+"px"),(e=>e/100*o+"px"))))})(t,o,e)),(e=>((e,t)=>O(e,(e=>tc.from(e).fold((()=>e),(e=>e/t*100+"%"),(e=>e+"%")))))(t,o))))(n,e,t);return sc(r)},nc=(e,t)=>0===e.length?t:B(e,((e,t)=>tc.from(t).fold(u(0),f,f)+e),0),rc=(e,t)=>tc.from(e).fold(u(e),(e=>e+t+"px"),(e=>e+t+"%")),sc=e=>{if(0===e.length)return e;const t=B(e,((e,t)=>{const o=tc.from(t).fold((()=>({value:t,remainder:0})),(e=>((e,t)=>{const o=Math.floor(e);return{value:o+"px",remainder:e-o}})(e)),(e=>({value:e+"%",remainder:0})));return{output:[o.value].concat(e.output),remainder:e.remainder+o.remainder}}),{output:[],remainder:0}),o=t.output;return o.slice(0,o.length-1).concat([rc(o[o.length-1],Math.round(t.remainder))])},lc=tc.from,ac=e=>lc(e).fold(u("px"),u("px"),u("%")),cc=(e,t,o)=>{const n=$o(e),r=n.all,s=Jo(n),l=Qo(n);t.each((t=>{const o=ac(t),r=Oo(e),a=((e,t)=>Yn(e,t,Un,Jn))(n,e),c=oc(a,r,t);Xo(n)?((e,t,o)=>{k(t,((t,n)=>{const r=nc([e[n]],At());Ct(t.element,"width",r+o)}))})(c,l,o):((e,t,o)=>{k(t,(t=>{const n=e.slice(t.column,t.colspan+t.column),r=nc(n,At());Ct(t.element,"width",r+o)}))})(c,s,o),Ct(e,"width",t)})),o.each((t=>{const o=ac(t),l=ln(e),a=((e,t,o)=>Xn(e,t,o,Gn,Jn))(n,e,Tn);((e,t,o,n)=>{k(o,(t=>{const o=e.slice(t.row,t.rowspan+t.row),r=nc(o,Wt());Ct(t.element,"height",r+n)})),k(t,((t,o)=>{Ct(t.element,"height",e[o])}))})(oc(a,l,t),r,s,o),Ct(e,"height",t)}))},ic=e=>_n(e).exists((e=>En.test(e))),mc=e=>_n(e).exists((e=>Nn.test(e))),dc=e=>_n(e).isNone(),uc=e=>{ue(e,"width")},fc=e=>{const t=qn(e);cc(e,y.some(t),y.none()),uc(e)},gc=e=>{const t=(e=>Oo(e)+"px")(e);cc(e,y.some(t),y.none()),uc(e)},hc=e=>{Ot(e,"width");const t=It(e),o=t.length>0?t:_t(e);k(o,(e=>{Ot(e,"width"),uc(e)})),uc(e)},pc={styles:{"border-collapse":"collapse",width:"100%"},attributes:{border:"1"},colGroups:!1},wc=(e,t,o,n)=>D(e,(e=>((e,t,o,n)=>{const r=he.fromTag("tr");for(let s=0;s<e;s++){const e=he.fromTag(n<t||s<o?"th":"td");s<o&&ce(e,"scope","row"),n<t&&ce(e,"scope","col"),Ae(e,he.fromTag("br")),Ae(r,e)}return r})(t,o,n,e))),bc=(e,t)=>{e.selection.select(t.dom,!0),e.selection.collapse(!0)},vc=(e,t,o,r,s)=>{const l=(e=>{const t=e.options,o=t.get("table_default_styles");return t.isSet("table_default_styles")?o:((e,t)=>{var o;if($a(e)){const n=e.dom,r=null!==(o=n.getParent(e.selection.getStart(),n.isBlock))&&void 0!==o?o:e.getBody(),s=Eo(he.fromDom(r));return{...t,width:s+"px"}}return Ua(e)?K(t,((e,t)=>"width"!==t)):t})(e,o)})(e),a={styles:l,attributes:Ka(e),colGroups:Ya(e)};return e.undoManager.ignore((()=>{const n=((e,t,o,n,r,s=pc)=>{const l=he.fromTag("table"),a="cells"!==r;St(l,s.styles),ie(l,s.attributes),s.colGroups&&Ae(l,(e=>{const t=he.fromTag("colgroup");return D(e,(()=>Ae(t,he.fromTag("col")))),t})(t));const c=Math.min(e,o);if(a&&o>0){const e=he.fromTag("thead");Ae(l,e);const s=wc(o,t,"sectionCells"===r?c:0,n);Me(e,s)}const i=he.fromTag("tbody");Ae(l,i);const m=wc(a?e-c:e,t,a?0:o,n);return Me(i,m),l})(o,t,s,r,Ia(e),a);ce(n,"data-mce-id","__mce");const l=(e=>{const t=he.fromTag("div"),o=he.fromDom(e.dom.cloneNode(!0));return Ae(t,o),(e=>e.dom.innerHTML)(t)})(n);e.insertContent(l),e.addVisual()})),it(Rr(e),'table[data-mce-id="__mce"]').map((t=>($a(e)?gc(t):Ua(e)?hc(t):(Va(e)||(e=>n(e)&&-1!==e.indexOf("%"))(l.width))&&fc(t),Or(t),ue(t,"data-mce-id"),((e,t)=>{k(rt(t,"tr"),(t=>{Ba(e,t.dom),k(rt(t,"th,td"),(t=>{za(e,t.dom)}))}))})(e,t),((e,t)=>{it(t,"td,th").each(h(bc,e))})(e,t),t.dom))).getOr(null)};var yc=tinymce.util.Tools.resolve("tinymce.FakeClipboard");const xc="x-tinymce/dom-table-",Cc=xc+"rows",Sc=xc+"columns",Tc=e=>{const t=yc.FakeClipboardItem(e);yc.write([t])},Rc=e=>{var t;const o=null!==(t=yc.read())&&void 0!==t?t:[];return H(o,(t=>y.from(t.getType(e))))},Dc=e=>{Rc(e).isSome()&&yc.clear()},Oc=e=>{e.fold(Ec,(e=>Tc({[Cc]:e})))},kc=()=>Rc(Cc),Ec=()=>Dc(Cc),Nc=e=>{e.fold(zc,(e=>Tc({[Sc]:e})))},Bc=()=>Rc(Sc),zc=()=>Dc(Sc),Ac=e=>rs(kr(e),Dr(e)),Wc=(e,t)=>{const o=Dr(e),s=e=>Pt(e,o),l=t=>(e=>ss(kr(e),Dr(e)))(e).bind((e=>s(e).map((o=>t(o,e))))),a=t=>{e.focus()},c=(t,o=!1)=>l(((n,r)=>{const s=os(ls(e),n,r);t(n,s,o).each(a)})),i=()=>l(((t,o)=>((e,t,o)=>{const n=$o(e);return Qs(n,t).bind((e=>{const t=$s(n,o,!1),r=jo(t).rows.slice(e[0].row,e[e.length-1].row+e[e.length-1].rowspan),s=M(r,(e=>{const t=N(e.cells,(e=>!e.isLocked));return t.length>0?[{...e,cells:t}]:[]})),l=Us(s);return ft(l.length>0,l)})).map((e=>O(e,(e=>{const t=Fe(e.element);return k(e.cells,(e=>{const o=He(e.element);Ps(o,"colspan",e.colspan,1),Ps(o,"rowspan",e.rowspan,1),Ae(t,o)})),t}))))})(t,os(ls(e),t,o),Sr(d,he.fromDom(e.getDoc()),y.none())))),u=()=>l(((t,o)=>((e,t)=>{const o=$o(e);return Xs(o,t).map((e=>{const t=e[e.length-1],n=e[0].column,r=t.column+t.colspan,s=((e,t,o)=>{if(Xo(e)){const n=N(Qo(e),(e=>e.column>=t&&e.column<o)),r=O(n,(e=>{const n=He(e.element);return Xa(n,"span",o-t),n})),s=he.fromTag("colgroup");return Me(s,r),[s]}return[]})(o,n,r),l=((e,t,o)=>O(e.all,(e=>{const n=N(e.cells,(e=>e.column>=t&&e.column<o)),r=O(n,(e=>{const n=He(e.element);return Xa(n,"colspan",o-t),n})),s=he.fromTag("tr");return Me(s,r),s})))(o,n,r);return[...s,...l]}))})(t,os(ls(e),t,o)))),f=(t,o)=>o().each((o=>{const n=O(o,(e=>He(e)));l(((o,r)=>{const s=Tr(he.fromDom(e.getDoc())),l=((e,t,o,n)=>({selection:Xr(e),clipboard:o,generators:n}))(ls(e),0,n,s);t(o,l).each(a)}))})),g=e=>(t,o)=>((e,t)=>Q(e,t)?y.from(e.type):y.none())(o,"type").each((t=>{c(e(t),o.no_events)}));$({mceTableSplitCells:()=>c(t.unmergeCells),mceTableMergeCells:()=>c(t.mergeCells),mceTableInsertRowBefore:()=>c(t.insertRowsBefore),mceTableInsertRowAfter:()=>c(t.insertRowsAfter),mceTableInsertColBefore:()=>c(t.insertColumnsBefore),mceTableInsertColAfter:()=>c(t.insertColumnsAfter),mceTableDeleteCol:()=>c(t.deleteColumn),mceTableDeleteRow:()=>c(t.deleteRow),mceTableCutCol:()=>u().each((e=>{Nc(e),c(t.deleteColumn)})),mceTableCutRow:()=>i().each((e=>{Oc(e),c(t.deleteRow)})),mceTableCopyCol:()=>u().each((e=>Nc(e))),mceTableCopyRow:()=>i().each((e=>Oc(e))),mceTablePasteColBefore:()=>f(t.pasteColsBefore,Bc),mceTablePasteColAfter:()=>f(t.pasteColsAfter,Bc),mceTablePasteRowBefore:()=>f(t.pasteRowsBefore,kc),mceTablePasteRowAfter:()=>f(t.pasteRowsAfter,kc),mceTableDelete:()=>Ac(e).each((t=>{Pt(t,o).filter(p(o)).each((t=>{const o=he.fromText("");if(Be(t,o),_e(t),e.dom.isEmpty(e.getBody()))e.setContent(""),e.selection.setCursorLocation();else{const t=e.dom.createRng();t.setStart(o.dom,0),t.setEnd(o.dom,0),e.selection.setRng(t),e.nodeChanged()}}))})),mceTableCellToggleClass:(t,o)=>{l((t=>{const n=ls(e),r=j(n,(t=>e.formatter.match("tablecellclass",{value:o},t.dom))),s=r?e.formatter.remove:e.formatter.apply;k(n,(e=>s("tablecellclass",{value:o},e.dom))),Aa(e,t.dom,Wa)}))},mceTableToggleClass:(t,o)=>{l((t=>{e.formatter.toggle("tableclass",{value:o},t.dom),Aa(e,t.dom,Wa)}))},mceTableToggleCaption:()=>{Ac(e).each((t=>{Pt(t,o).each((o=>{ct(o,"caption").fold((()=>{const t=he.fromTag("caption");Ae(t,he.fromText("Caption")),((e,t,o)=>{Ee(e,0).fold((()=>{Ae(e,t)}),(e=>{Ne(e,t)}))})(o,t),e.selection.setCursorLocation(t.dom,0)}),(n=>{le("caption")(t)&&be("td",o).each((t=>e.selection.setCursorLocation(t.dom,0))),_e(n)})),Aa(e,o.dom,La)}))}))},mceTableSizingMode:(t,n)=>(t=>Ac(e).each((n=>{Ua(e)||$a(e)||Va(e)||Pt(n,o).each((o=>{"relative"!==t||ic(o)?"fixed"!==t||mc(o)?"responsive"!==t||dc(o)||hc(o):gc(o):fc(o),Or(o),Aa(e,o.dom,La)}))})))(n),mceTableCellType:g((e=>"th"===e?t.makeCellsHeader:t.unmakeCellsHeader)),mceTableColType:g((e=>"th"===e?t.makeColumnsHeader:t.unmakeColumnsHeader)),mceTableRowType:g((e=>{switch(e){case"header":return t.makeRowsHeader;case"footer":return t.makeRowsFooter;default:return t.makeRowsBody}}))},((t,o)=>e.addCommand(o,t))),e.addCommand("mceInsertTable",((t,o)=>{((e,t,o,n={})=>{const r=e=>m(e)&&e>0;if(r(t)&&r(o)){const r=n.headerRows||0,s=n.headerColumns||0;return vc(e,o,t,s,r)}console.error("Invalid values for mceInsertTable - rows and columns values are required to insert a table.")})(e,o.rows,o.columns,o.options)})),e.addCommand("mceTableApplyCellStyle",((t,o)=>{const l=e=>"tablecell"+e.toLowerCase().replace("-","");if(!r(o))return;const a=ls(e);if(0===a.length)return;const c=K(o,((t,o)=>e.formatter.has(l(o))&&n(t)));(e=>{for(const t in e)if(V.call(e,t))return!1;return!0})(c)||($(c,((t,o)=>{const n=l(o);k(a,(o=>{""===t?e.formatter.remove(n,{value:null},o.dom,!0):e.formatter.apply(n,{value:t},o.dom)}))})),s(a[0]).each((t=>Aa(e,t.dom,Wa))))}))},Lc=Sl([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Mc={before:Lc.before,on:Lc.on,after:Lc.after,cata:(e,t,o,n)=>e.fold(t,o,n),getStart:e=>e.fold(f,f,f)},jc=(e,t)=>({selection:e,kill:t}),_c=(e,t)=>{const o=e.document.createRange();return o.selectNode(t.dom),o},Ic=(e,t)=>{const o=e.document.createRange();return Pc(o,t),o},Pc=(e,t)=>e.selectNodeContents(t.dom),Fc=(e,t,o)=>{const n=e.document.createRange();var r;return r=n,t.fold((e=>{r.setStartBefore(e.dom)}),((e,t)=>{r.setStart(e.dom,t)}),(e=>{r.setStartAfter(e.dom)})),((e,t)=>{t.fold((t=>{e.setEndBefore(t.dom)}),((t,o)=>{e.setEnd(t.dom,o)}),(t=>{e.setEndAfter(t.dom)}))})(n,o),n},Hc=(e,t,o,n,r)=>{const s=e.document.createRange();return s.setStart(t.dom,o),s.setEnd(n.dom,r),s},qc=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom,width:e.width,height:e.height}),Vc=Sl([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]),$c=(e,t,o)=>t(he.fromDom(o.startContainer),o.startOffset,he.fromDom(o.endContainer),o.endOffset),Uc=(e,t)=>{const o=((e,t)=>t.match({domRange:e=>({ltr:u(e),rtl:y.none}),relative:(t,o)=>({ltr:Ut((()=>Fc(e,t,o))),rtl:Ut((()=>y.some(Fc(e,o,t))))}),exact:(t,o,n,r)=>({ltr:Ut((()=>Hc(e,t,o,n,r))),rtl:Ut((()=>y.some(Hc(e,n,r,t,o))))})}))(e,t);return((e,t)=>{const o=t.ltr();return o.collapsed?t.rtl().filter((e=>!1===e.collapsed)).map((e=>Vc.rtl(he.fromDom(e.endContainer),e.endOffset,he.fromDom(e.startContainer),e.startOffset))).getOrThunk((()=>$c(0,Vc.ltr,o))):$c(0,Vc.ltr,o)})(0,o)},Gc=(e,t)=>Uc(e,t).match({ltr:(t,o,n,r)=>{const s=e.document.createRange();return s.setStart(t.dom,o),s.setEnd(n.dom,r),s},rtl:(t,o,n,r)=>{const s=e.document.createRange();return s.setStart(n.dom,r),s.setEnd(t.dom,o),s}});Vc.ltr,Vc.rtl;const Kc=(e,t,o,n)=>({start:e,soffset:t,finish:o,foffset:n}),Yc=(e,t,o,n)=>({start:Mc.on(e,t),finish:Mc.on(o,n)}),Jc=(e,t)=>{const o=Gc(e,t);return Kc(he.fromDom(o.startContainer),o.startOffset,he.fromDom(o.endContainer),o.endOffset)},Qc=Yc,Xc=(e,t,o,n,r)=>ve(o,n)?y.none():Ur(o,n,t).bind((t=>{const n=t.boxes.getOr([]);return n.length>1?(r(e,n,t.start,t.finish),y.some(jc(y.some(Qc(o,0,o,mr(o))),!0))):y.none()})),Zc=(e,t)=>({item:e,mode:t}),ei=(e,t,o,n=ti)=>e.property().parent(t).map((e=>Zc(e,n))),ti=(e,t,o,n=oi)=>o.sibling(e,t).map((e=>Zc(e,n))),oi=(e,t,o,n=oi)=>{const r=e.property().children(t);return o.first(r).map((e=>Zc(e,n)))},ni=[{current:ei,next:ti,fallback:y.none()},{current:ti,next:oi,fallback:y.some(ei)},{current:oi,next:oi,fallback:y.some(ti)}],ri=(e,t,o,n,r=ni)=>A(r,(e=>e.current===o)).bind((o=>o.current(e,t,n,o.next).orThunk((()=>o.fallback.bind((o=>ri(e,t,o,n))))))),si=(e,t,o,n,r,s)=>ri(e,t,n,r).bind((t=>s(t.item)?y.none():o(t.item)?y.some(t.item):si(e,t.item,o,t.mode,r,s))),li=e=>t=>0===e.property().children(t).length,ai=(e,t,o,n)=>si(e,t,o,ti,{sibling:(e,t)=>e.query().prevSibling(t),first:e=>e.length>0?y.some(e[e.length-1]):y.none()},n),ci=(e,t,o,n)=>si(e,t,o,ti,{sibling:(e,t)=>e.query().nextSibling(t),first:e=>e.length>0?y.some(e[0]):y.none()},n),ii=Pr(),mi=(e,t)=>((e,t,o)=>ai(e,t,li(e),o))(ii,e,t),di=(e,t)=>((e,t,o)=>ci(e,t,li(e),o))(ii,e,t),ui=Sl([{none:["message"]},{success:[]},{failedUp:["cell"]},{failedDown:["cell"]}]),fi=e=>mt(e,"tr"),gi={...ui,verify:(e,t,o,n,r,s,l)=>mt(n,"td,th",l).bind((o=>mt(t,"td,th",l).map((t=>ve(o,t)?ve(n,o)&&mr(o)===r?s(t):ui.none("in same cell"):Vr(fi,[o,t]).fold((()=>((e,t,o)=>{const n=e.getRect(t),r=e.getRect(o);return r.right>n.left&&r.left<n.right})(e,t,o)?ui.success():s(t)),(e=>s(t))))))).getOr(ui.none("default")),cata:(e,t,o,n,r)=>e.fold(t,o,n,r)},hi=le("br"),pi=(e,t,o)=>t(e,o).bind((e=>ne(e)&&0===ar(e).trim().length?pi(e,t,o):y.some(e))),wi=(e,t,o,n)=>((e,t)=>Ee(e,t).filter(hi).orThunk((()=>Ee(e,t-1).filter(hi))))(t,o).bind((t=>n.traverse(t).fold((()=>pi(t,n.gather,e).map(n.relative)),(e=>(e=>Te(e).bind((t=>{const o=ke(t);return((e,t)=>W(e,h(ve,t)))(o,e).map((n=>((e,t,o,n)=>({parent:e,children:t,element:o,index:n}))(t,o,e,n)))})))(e).map((e=>Mc.on(e.parent,e.index))))))),bi=(e,t)=>({left:e.left,top:e.top+t,right:e.right,bottom:e.bottom+t}),vi=(e,t)=>({left:e.left,top:e.top-t,right:e.right,bottom:e.bottom-t}),yi=(e,t,o)=>({left:e.left+t,top:e.top+o,right:e.right+t,bottom:e.bottom+o}),xi=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom}),Ci=(e,t)=>y.some(e.getRect(t)),Si=(e,t,o)=>oe(t)?Ci(e,t).map(xi):ne(t)?((e,t,o)=>o>=0&&o<mr(t)?e.getRangedRect(t,o,t,o+1):o>0?e.getRangedRect(t,o-1,t,o):y.none())(e,t,o).map(xi):y.none(),Ti=(e,t)=>oe(t)?Ci(e,t).map(xi):ne(t)?e.getRangedRect(t,0,t,mr(t)).map(xi):y.none(),Ri=Sl([{none:[]},{retry:["caret"]}]),Di=(e,t,o)=>{return(n=t,r=Pl,st(((e,t)=>t(e)),lt,n,r,undefined)).fold(b,(t=>Ti(e,t).exists((e=>((e,t)=>e.left<t.left||Math.abs(t.right-e.left)<1||e.left>t.right)(o,e)))));var n,r},Oi={point:e=>e.bottom,adjuster:(e,t,o,n,r)=>{const s=bi(r,5);return Math.abs(o.bottom-n.bottom)<1||o.top>r.bottom?Ri.retry(s):o.top===r.bottom?Ri.retry(bi(r,1)):Di(e,t,r)?Ri.retry(yi(s,5,0)):Ri.none()},move:bi,gather:di},ki=(e,t,o,n,r)=>0===r?y.some(n):((e,t,o)=>e.elementFromPoint(t,o).filter((e=>"table"===X(e))).isSome())(e,n.left,t.point(n))?((e,t,o,n,r)=>ki(e,t,o,t.move(n,5),r))(e,t,o,n,r-1):e.situsFromPoint(n.left,t.point(n)).bind((s=>s.start.fold(y.none,(s=>Ti(e,s).bind((l=>t.adjuster(e,s,l,o,n).fold(y.none,(n=>ki(e,t,o,n,r-1))))).orThunk((()=>y.some(n)))),y.none))),Ei=(e,t,o)=>{const n=e.move(o,5),r=ki(t,e,o,n,100).getOr(n);return((e,t,o)=>e.point(t)>o.getInnerHeight()?y.some(e.point(t)-o.getInnerHeight()):e.point(t)<0?y.some(-e.point(t)):y.none())(e,r,t).fold((()=>t.situsFromPoint(r.left,e.point(r))),(o=>(t.scrollBy(0,o),t.situsFromPoint(r.left,e.point(r)-o))))},Ni={tryUp:h(Ei,{point:e=>e.top,adjuster:(e,t,o,n,r)=>{const s=vi(r,5);return Math.abs(o.top-n.top)<1||o.bottom<r.top?Ri.retry(s):o.bottom===r.top?Ri.retry(vi(r,1)):Di(e,t,r)?Ri.retry(yi(s,5,0)):Ri.none()},move:vi,gather:mi}),tryDown:h(Ei,Oi),getJumpSize:u(5)},Bi=(e,t,o)=>e.getSelection().bind((n=>((e,t,o,n)=>{const r=hi(t)?((e,t,o)=>o.traverse(t).orThunk((()=>pi(t,o.gather,e))).map(o.relative))(e,t,n):wi(e,t,o,n);return r.map((e=>({start:e,finish:e})))})(t,n.finish,n.foffset,o).fold((()=>y.some(cs(n.finish,n.foffset))),(r=>{const s=e.fromSitus(r);return l=gi.verify(e,n.finish,n.foffset,s.finish,s.foffset,o.failure,t),gi.cata(l,(e=>y.none()),(()=>y.none()),(e=>y.some(cs(e,0))),(e=>y.some(cs(e,mr(e)))));var l})))),zi=(e,t,o,n,r,s)=>0===s?y.none():Li(e,t,o,n,r).bind((l=>{const a=e.fromSitus(l),c=gi.verify(e,o,n,a.finish,a.foffset,r.failure,t);return gi.cata(c,(()=>y.none()),(()=>y.some(l)),(l=>ve(o,l)&&0===n?Ai(e,o,n,vi,r):zi(e,t,l,0,r,s-1)),(l=>ve(o,l)&&n===mr(l)?Ai(e,o,n,bi,r):zi(e,t,l,mr(l),r,s-1)))})),Ai=(e,t,o,n,r)=>Si(e,t,o).bind((t=>Wi(e,r,n(t,Ni.getJumpSize())))),Wi=(e,t,o)=>{const n=So().browser;return n.isChromium()||n.isSafari()||n.isFirefox()?t.retry(e,o):y.none()},Li=(e,t,o,n,r)=>Si(e,o,n).bind((t=>Wi(e,r,t))),Mi=(e,t,o,n,r)=>mt(n,"td,th",t).bind((n=>mt(n,"table",t).bind((s=>((e,t)=>lt(e,(e=>Te(e).exists((e=>ve(e,t)))),void 0).isSome())(r,s)?((e,t,o)=>Bi(e,t,o).bind((n=>zi(e,t,n.element,n.offset,o,20).map(e.fromSitus))))(e,t,o).bind((e=>mt(e.finish,"td,th",t).map((t=>({start:n,finish:t,range:e}))))):y.none())))),ji=(e,t,o,n,r,s)=>s(n,t).orThunk((()=>Mi(e,t,o,n,r).map((e=>{const t=e.range;return jc(y.some(Qc(t.start,t.soffset,t.finish,t.foffset)),!0)})))),_i=(e,t)=>mt(e,"tr",t).bind((e=>mt(e,"table",t).bind((o=>{const n=rt(o,"tr");return ve(e,n[0])?((e,t,o)=>ai(ii,e,(e=>gr(e).isSome()),o))(o,0,t).map((e=>{const t=mr(e);return jc(y.some(Qc(e,t,e,t)),!0)})):y.none()})))),Ii=(e,t)=>mt(e,"tr",t).bind((e=>mt(e,"table",t).bind((o=>{const n=rt(o,"tr");return ve(e,n[n.length-1])?((e,t,o)=>ci(ii,e,(e=>fr(e).isSome()),o))(o,0,t).map((e=>jc(y.some(Qc(e,0,e,0)),!0))):y.none()})))),Pi=(e,t,o,n,r,s,l)=>Mi(e,o,n,r,s).bind((e=>Xc(t,o,e.start,e.finish,l))),Fi=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},Hi=()=>{const e=(e=>{const t=Fi(y.none()),o=()=>t.get().each(e);return{clear:()=>{o(),t.set(y.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{o(),t.set(y.some(e))}}})(d);return{...e,on:t=>e.get().each(t)}},qi=(e,t)=>mt(e,"td,th",t),Vi={traverse:Oe,gather:di,relative:Mc.before,retry:Ni.tryDown,failure:gi.failedDown},$i={traverse:De,gather:mi,relative:Mc.before,retry:Ni.tryUp,failure:gi.failedUp},Ui=e=>t=>t===e,Gi=Ui(38),Ki=Ui(40),Yi=e=>e>=37&&e<=40,Ji={isBackward:Ui(37),isForward:Ui(39)},Qi={isBackward:Ui(39),isForward:Ui(37)},Xi=Sl([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Zi={domRange:Xi.domRange,relative:Xi.relative,exact:Xi.exact,exactFromRange:e=>Xi.exact(e.start,e.soffset,e.finish,e.foffset),getWin:e=>{const t=(e=>e.match({domRange:e=>he.fromDom(e.startContainer),relative:(e,t)=>Mc.getStart(e),exact:(e,t,o,n)=>e}))(e);return he.fromDom(Se(t).dom.defaultView)},range:Kc},em=document.caretPositionFromPoint?(e,t,o)=>{var n,r;return y.from(null===(r=(n=e.dom).caretPositionFromPoint)||void 0===r?void 0:r.call(n,t,o)).bind((t=>{if(null===t.offsetNode)return y.none();const o=e.dom.createRange();return o.setStart(t.offsetNode,t.offset),o.collapse(),y.some(o)}))}:document.caretRangeFromPoint?(e,t,o)=>{var n,r;return y.from(null===(r=(n=e.dom).caretRangeFromPoint)||void 0===r?void 0:r.call(n,t,o))}:y.none,tm=(e,t)=>{const o=X(e);return"input"===o?Mc.after(e):T(["br","img"],o)?0===t?Mc.before(e):Mc.after(e):Mc.on(e,t)},om=e=>y.from(e.getSelection()),nm=(e,t)=>{om(e).each((e=>{e.removeAllRanges(),e.addRange(t)}))},rm=(e,t,o,n,r)=>{const s=Hc(e,t,o,n,r);nm(e,s)},sm=(e,t)=>Uc(e,t).match({ltr:(t,o,n,r)=>{rm(e,t,o,n,r)},rtl:(t,o,n,r)=>{om(e).each((s=>{if(s.setBaseAndExtent)s.setBaseAndExtent(t.dom,o,n.dom,r);else if(s.extend)try{((e,t,o,n,r,s)=>{t.collapse(o.dom,n),t.extend(r.dom,s)})(0,s,t,o,n,r)}catch(s){rm(e,n,r,t,o)}else rm(e,n,r,t,o)}))}}),lm=(e,t,o,n,r)=>{const s=((e,t,o,n)=>{const r=tm(e,t),s=tm(o,n);return Zi.relative(r,s)})(t,o,n,r);sm(e,s)},am=(e,t,o)=>{const n=((e,t)=>{const o=e.fold(Mc.before,tm,Mc.after),n=t.fold(Mc.before,tm,Mc.after);return Zi.relative(o,n)})(t,o);sm(e,n)},cm=e=>{if(e.rangeCount>0){const t=e.getRangeAt(0),o=e.getRangeAt(e.rangeCount-1);return y.some(Kc(he.fromDom(t.startContainer),t.startOffset,he.fromDom(o.endContainer),o.endOffset))}return y.none()},im=e=>{if(null===e.anchorNode||null===e.focusNode)return cm(e);{const t=he.fromDom(e.anchorNode),o=he.fromDom(e.focusNode);return((e,t,o,n)=>{const r=((e,t,o,n)=>{const r=Ce(e).dom.createRange();return r.setStart(e.dom,t),r.setEnd(o.dom,n),r})(e,t,o,n),s=ve(e,o)&&t===n;return r.collapsed&&!s})(t,e.anchorOffset,o,e.focusOffset)?y.some(Kc(t,e.anchorOffset,o,e.focusOffset)):cm(e)}},mm=(e,t,o=!0)=>{const n=(o?Ic:_c)(e,t);nm(e,n)},dm=e=>(e=>om(e).filter((e=>e.rangeCount>0)).bind(im))(e).map((e=>Zi.exact(e.start,e.soffset,e.finish,e.foffset))),um=e=>({elementFromPoint:(t,o)=>he.fromPoint(he.fromDom(e.document),t,o),getRect:e=>e.dom.getBoundingClientRect(),getRangedRect:(t,o,n,r)=>{const s=Zi.exact(t,o,n,r);return((e,t)=>(e=>{const t=e.getClientRects(),o=t.length>0?t[0]:e.getBoundingClientRect();return o.width>0||o.height>0?y.some(o).map(qc):y.none()})(Gc(e,t)))(e,s)},getSelection:()=>dm(e).map((t=>Jc(e,t))),fromSitus:t=>{const o=Zi.relative(t.start,t.finish);return Jc(e,o)},situsFromPoint:(t,o)=>((e,t,o)=>((e,t,o)=>{const n=he.fromDom(e.document);return em(n,t,o).map((e=>Kc(he.fromDom(e.startContainer),e.startOffset,he.fromDom(e.endContainer),e.endOffset)))})(e,t,o))(e,t,o).map((e=>Yc(e.start,e.soffset,e.finish,e.foffset))),clearSelection:()=>{(e=>{om(e).each((e=>e.removeAllRanges()))})(e)},collapseSelection:(t=!1)=>{dm(e).each((o=>o.fold((e=>e.collapse(t)),((o,n)=>{const r=t?o:n;am(e,r,r)}),((o,n,r,s)=>{const l=t?o:r,a=t?n:s;lm(e,l,a,l,a)}))))},setSelection:t=>{lm(e,t.start,t.soffset,t.finish,t.foffset)},setRelativeSelection:(t,o)=>{am(e,t,o)},selectNode:t=>{mm(e,t,!1)},selectContents:t=>{mm(e,t)},getInnerHeight:()=>e.innerHeight,getScrollY:()=>(e=>{const t=void 0!==e?e.dom:document,o=t.body.scrollLeft||t.documentElement.scrollLeft,n=t.body.scrollTop||t.documentElement.scrollTop;return mn(o,n)})(he.fromDom(e.document)).top,scrollBy:(t,o)=>{((e,t,o)=>{const n=(void 0!==o?o.dom:document).defaultView;n&&n.scrollBy(e,t)})(t,o,he.fromDom(e.document))}}),fm=(e,t)=>({rows:e,cols:t}),gm=e=>void 0!==e.dom.classList,hm=(e,t)=>((e,t,o)=>{const n=((e,t)=>{const o=me(e,t);return void 0===o||""===o?[]:o.split(" ")})(e,t).concat([o]);return ce(e,t,n.join(" ")),!0})(e,"class",t),pm=(e,t)=>{gm(e)?e.dom.classList.add(t):hm(e,t)},wm=(e,t)=>gm(e)&&e.dom.classList.contains(t),bm=()=>({tag:"none"}),vm=e=>({tag:"multiple",elements:e}),ym=e=>({tag:"single",element:e}),xm=e=>{const t=he.fromDom((e=>{if(Je()&&c(e.target)){const t=he.fromDom(e.target);if(oe(t)&&c(t.dom.shadowRoot)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return P(t)}}return y.from(e.target)})(e).getOr(e.target)),o=()=>e.stopPropagation(),n=()=>e.preventDefault(),r=(s=n,l=o,(...e)=>s(l.apply(null,e)));var s,l;return((e,t,o,n,r,s,l)=>({target:e,x:t,y:o,stop:n,prevent:r,kill:s,raw:l}))(t,e.clientX,e.clientY,o,n,r,e)},Cm=(e,t,o,n)=>{e.dom.removeEventListener(t,o,n)},Sm=v,Tm=(e,t,o)=>((e,t,o,n)=>((e,t,o,n,r)=>{const s=((e,t)=>o=>{e(o)&&t(xm(o))})(o,n);return e.dom.addEventListener(t,s,r),{unbind:h(Cm,e,t,s,r)}})(e,t,o,n,!1))(e,t,Sm,o),Rm=xm,Dm=e=>!1===wm(he.fromDom(e.target),"ephox-snooker-resizer-bar"),Om=(e,t)=>{const o=(r=ts.selectedSelector,{get:()=>Jr(he.fromDom(e.getBody()),r).fold((()=>ss(kr(e),Dr(e)).fold(bm,ym)),vm)}),n=((e,t,o)=>{const n=t=>{ue(t,e.selected),ue(t,e.firstSelected),ue(t,e.lastSelected)},r=t=>{ce(t,e.selected,"1")},s=e=>{l(e),o()},l=t=>{const o=rt(t,`${e.selectedSelector},${e.firstSelectedSelector},${e.lastSelectedSelector}`);k(o,n)};return{clearBeforeUpdate:l,clear:s,selectRange:(o,n,l,a)=>{s(o),k(n,r),ce(l,e.firstSelected,"1"),ce(a,e.lastSelected,"1"),t(n,l,a)},selectedSelector:e.selectedSelector,firstSelectedSelector:e.firstSelectedSelector,lastSelectedSelector:e.lastSelectedSelector}})(ts,((t,o,n)=>{Pt(o).each((r=>{const s=_a(e),l=Sr(d,he.fromDom(e.getDoc()),s),a=((e,t,o)=>{const n=$o(e);return Qs(n,t).map((e=>{const t=$s(n,o,!1),{rows:r}=jo(t),s=((e,t)=>{const o=e.slice(0,t[t.length-1].row+1),n=Us(o);return M(n,(e=>{const o=e.cells.slice(0,t[t.length-1].column+1);return O(o,(e=>e.element))}))})(r,e),l=((e,t)=>{const o=e.slice(t[0].row+t[0].rowspan-1,e.length),n=Us(o);return M(n,(e=>{const o=e.cells.slice(t[0].column+t[0].colspan-1,e.cells.length);return O(o,(e=>e.element))}))})(r,e);return{upOrLeftCells:s,downOrRightCells:l}}))})(r,{selection:ls(e)},l);((e,t,o,n,r)=>{e.dispatch("TableSelectionChange",{cells:t,start:o,finish:n,otherCells:r})})(e,t,o,n,a)}))}),(()=>(e=>{e.dispatch("TableSelectionClear")})(e)));var r;return e.on("init",(o=>{const r=e.getWin(),s=Rr(e),l=Dr(e),a=((e,t,o,n)=>{const r=((e,t,o,n)=>{const r=Hi(),s=r.clear,l=s=>{r.on((r=>{n.clearBeforeUpdate(t),qi(s.target,o).each((l=>{Ur(r,l,o).each((o=>{const r=o.boxes.getOr([]);if(1===r.length){const o=r[0],l="false"===Is(o),a=dt(js(s.target),o,ve);l&&a&&(n.selectRange(t,r,o,o),e.selectContents(o))}else r.length>1&&(n.selectRange(t,r,o.start,o.finish),e.selectContents(l))}))}))}))};return{clearstate:s,mousedown:e=>{n.clear(t),qi(e.target,o).each(r.set)},mouseover:e=>{l(e)},mouseup:e=>{l(e),s()}}})(um(e),t,o,n);return{clearstate:r.clearstate,mousedown:r.mousedown,mouseover:r.mouseover,mouseup:r.mouseup}})(r,s,l,n),c=((e,t,o,n)=>{const r=um(e),s=()=>(n.clear(t),y.none());return{keydown:(e,l,a,c,i,m)=>{const d=e.raw,u=d.which,f=!0===d.shiftKey,g=Gr(t,n.selectedSelector).fold((()=>(Yi(u)&&!f&&n.clearBeforeUpdate(t),Ki(u)&&f?h(Pi,r,t,o,Vi,c,l,n.selectRange):Gi(u)&&f?h(Pi,r,t,o,$i,c,l,n.selectRange):Ki(u)?h(ji,r,o,Vi,c,l,Ii):Gi(u)?h(ji,r,o,$i,c,l,_i):y.none)),(e=>{const o=o=>()=>{const s=H(o,(o=>((e,t,o,n,r)=>Yr(n,e,t,r.firstSelectedSelector,r.lastSelectedSelector).map((e=>(r.clearBeforeUpdate(o),r.selectRange(o,e.boxes,e.start,e.finish),e.boxes))))(o.rows,o.cols,t,e,n)));return s.fold((()=>Kr(t,n.firstSelectedSelector,n.lastSelectedSelector).map((e=>{const o=Ki(u)||m.isForward(u)?Mc.after:Mc.before;return r.setRelativeSelection(Mc.on(e.first,0),o(e.table)),n.clear(t),jc(y.none(),!0)}))),(e=>y.some(jc(y.none(),!0))))};return Ki(u)&&f?o([fm(1,0)]):Gi(u)&&f?o([fm(-1,0)]):m.isBackward(u)&&f?o([fm(0,-1),fm(-1,0)]):m.isForward(u)&&f?o([fm(0,1),fm(1,0)]):Yi(u)&&!f?s:y.none}));return g()},keyup:(e,r,s,l,a)=>Gr(t,n.selectedSelector).fold((()=>{const c=e.raw,i=c.which;return!0===c.shiftKey&&Yi(i)?((e,t,o,n,r,s,l)=>ve(o,r)&&n===s?y.none():mt(o,"td,th",t).bind((o=>mt(r,"td,th",t).bind((n=>Xc(e,t,o,n,l))))))(t,o,r,s,l,a,n.selectRange):y.none()}),y.none)}})(r,s,l,n),i=((e,t,o,n)=>{const r=um(e);return(e,s)=>{n.clearBeforeUpdate(t),Ur(e,s,o).each((e=>{const o=e.boxes.getOr([]);n.selectRange(t,o,e.start,e.finish),r.selectContents(s),r.collapseSelection()}))}})(r,s,l,n);e.on("TableSelectorChange",(e=>i(e.start,e.finish)));const m=(t,o)=>{(e=>!0===e.raw.shiftKey)(t)&&(o.kill&&t.kill(),o.selection.each((t=>{const o=Zi.relative(t.start,t.finish),n=Gc(r,o);e.selection.setRng(n)})))},u=e=>0===e.button,f=(()=>{const e=Fi(he.fromDom(s)),t=Fi(0);return{touchEnd:o=>{const n=he.fromDom(o.target);if(le("td")(n)||le("th")(n)){const r=e.get(),s=t.get();ve(r,n)&&o.timeStamp-s<300&&(o.preventDefault(),i(n,n))}e.set(n),t.set(o.timeStamp)}}})();e.on("dragstart",(e=>{a.clearstate()})),e.on("mousedown",(e=>{u(e)&&Dm(e)&&a.mousedown(Rm(e))})),e.on("mouseover",(e=>{var t;void 0!==(t=e).buttons&&0==(1&t.buttons)||!Dm(e)||a.mouseover(Rm(e))})),e.on("mouseup",(e=>{u(e)&&Dm(e)&&a.mouseup(Rm(e))})),e.on("touchend",f.touchEnd),e.on("keyup",(t=>{const o=Rm(t);if(o.raw.shiftKey&&Yi(o.raw.which)){const t=e.selection.getRng(),n=he.fromDom(t.startContainer),r=he.fromDom(t.endContainer);c.keyup(o,n,t.startOffset,r,t.endOffset).each((e=>{m(o,e)}))}})),e.on("keydown",(o=>{const n=Rm(o);t.hide();const r=e.selection.getRng(),s=he.fromDom(r.startContainer),l=he.fromDom(r.endContainer),a=nn(Ji,Qi)(he.fromDom(e.selection.getStart()));c.keydown(n,s,r.startOffset,l,r.endOffset,a).each((e=>{m(n,e)})),t.show()})),e.on("NodeChange",(()=>{const t=e.selection,o=he.fromDom(t.getStart()),r=he.fromDom(t.getEnd());Vr(Pt,[o,r]).fold((()=>n.clear(s)),d)}))})),e.on("PreInit",(()=>{e.serializer.addTempAttr(ts.firstSelected),e.serializer.addTempAttr(ts.lastSelected)})),{getSelectedCells:()=>((e,t,o,n)=>{switch(e.tag){case"none":return t();case"single":return(e=>[e.dom])(e.element);case"multiple":return(e=>O(e,(e=>e.dom)))(e.elements)}})(o.get(),u([])),clearSelectedCells:e=>n.clear(he.fromDom(e))}},km=e=>{let t=[];return{bind:e=>{if(void 0===e)throw new Error("Event bind error: undefined handler");t.push(e)},unbind:e=>{t=N(t,(t=>t!==e))},trigger:(...o)=>{const n={};k(e,((e,t)=>{n[e]=o[t]})),k(t,(e=>{e(n)}))}}},Em=e=>({registry:U(e,(e=>({bind:e.bind,unbind:e.unbind}))),trigger:U(e,(e=>e.trigger))}),Nm=e=>e.slice(0).sort(),Bm=(e,t)=>{const o=N(t,(t=>!T(e,t)));o.length>0&&(e=>{throw new Error("Unsupported keys for object: "+Nm(e).join(", "))})(o)},zm=e=>((e,t)=>((e,t,o)=>{if(0===t.length)throw new Error("You must specify at least one required field.");return((e,t)=>{if(!s(t))throw new Error("The required fields must be an array. Was: "+t+".");k(t,(t=>{if(!n(t))throw new Error("The value "+t+" in the "+e+" fields was not a string.")}))})("required",t),(e=>{const t=Nm(e);A(t,((e,o)=>o<t.length-1&&e===t[o+1])).each((e=>{throw new Error("The field: "+e+" occurs more than once in the combined fields: ["+t.join(", ")+"].")}))})(t),n=>{const r=q(n);j(t,(e=>T(r,e)))||((e,t)=>{throw new Error("All required keys ("+Nm(e).join(", ")+") were not specified. Specified keys were: "+Nm(t).join(", ")+".")})(t,r),e(t,r);const s=N(t,(e=>!o.validate(n[e],e)));return s.length>0&&((e,t)=>{throw new Error("All values need to be of type: "+t+". Keys ("+Nm(e).join(", ")+") were not.")})(s,o.label),n}})(e,t,{validate:i,label:"function"}))(Bm,e),Am=zm(["compare","extract","mutate","sink"]),Wm=zm(["element","start","stop","destroy"]),Lm=zm(["forceDrop","drop","move","delayDrop"]),Mm=()=>{const e=(()=>{const e=Em({move:km(["info"])});return{onEvent:d,reset:d,events:e.registry}})(),t=(()=>{let e=y.none();const t=Em({move:km(["info"])});return{onEvent:(o,n)=>{n.extract(o).each((o=>{const r=((t,o)=>{const n=e.map((e=>t.compare(e,o)));return e=y.some(o),n})(n,o);r.each((e=>{t.trigger.move(e)}))}))},reset:()=>{e=y.none()},events:t.registry}})();let o=e;return{on:()=>{o.reset(),o=t},off:()=>{o.reset(),o=e},isOn:()=>o===t,onEvent:(e,t)=>{o.onEvent(e,t)},events:t.events}},jm=e=>{const t=e.replace(/\./g,"-");return{resolve:e=>t+"-"+e}},_m=jm("ephox-dragster").resolve;var Im=Am({compare:(e,t)=>mn(t.left-e.left,t.top-e.top),extract:e=>y.some(mn(e.x,e.y)),sink:(e,t)=>{const o=(e=>{const t={layerClass:_m("blocker"),...e},o=he.fromTag("div");return ce(o,"role","presentation"),St(o,{position:"fixed",left:"0px",top:"0px",width:"100%",height:"100%"}),pm(o,_m("blocker")),pm(o,t.layerClass),{element:u(o),destroy:()=>{_e(o)}}})(t),n=Tm(o.element(),"mousedown",e.forceDrop),r=Tm(o.element(),"mouseup",e.drop),s=Tm(o.element(),"mousemove",e.move),l=Tm(o.element(),"mouseout",e.delayDrop);return Wm({element:o.element,start:e=>{Ae(e,o.element())},stop:()=>{_e(o.element())},destroy:()=>{o.destroy(),r.unbind(),s.unbind(),l.unbind(),n.unbind()}})},mutate:(e,t)=>{e.mutate(t.left,t.top)}});const Pm=jm("ephox-snooker").resolve,Fm=Pm("resizer-bar"),Hm=Pm("resizer-rows"),qm=Pm("resizer-cols"),Vm=e=>{const t=rt(e.parent(),"."+Fm);k(t,_e)},$m=(e,t,o)=>{const n=e.origin();k(t,(t=>{t.each((t=>{const r=o(n,t);pm(r,Fm),Ae(e.parent(),r)}))}))},Um=(e,t,o,n,r)=>{const s=un(o),l=t.isResizable,a=n.length>0?Tn.positions(n,o):[],c=a.length>0?((e,t)=>M(e.all,((e,o)=>t(e.element)?[o]:[])))(e,l):[];((e,t,o,n)=>{$m(e,t,((e,t)=>{const r=((e,t,o,n,r)=>{const s=he.fromTag("div");return St(s,{position:"absolute",left:t+"px",top:o-3.5+"px",height:"7px",width:n+"px"}),ie(s,{"data-row":e,role:"presentation"}),s})(t.row,o.left-e.left,t.y-e.top,n);return pm(r,Hm),r}))})(t,N(a,((e,t)=>R(c,(e=>t===e)))),s,ko(o));const i=r.length>0?Dn.positions(r,o):[],m=i.length>0?((e,t)=>{const o=[];return D(e.grid.columns,(n=>{Zo(e,n).map((e=>e.element)).forall(t)&&o.push(n)})),N(o,(o=>{const n=Yo(e,(e=>e.column===o));return j(n,(e=>t(e.element)))}))})(e,l):[];((e,t,o,n)=>{$m(e,t,((e,t)=>{const r=((e,t,o,n,r)=>{const s=he.fromTag("div");return St(s,{position:"absolute",left:t-3.5+"px",top:o+"px",height:r+"px",width:"7px"}),ie(s,{"data-column":e,role:"presentation"}),s})(t.col,t.x-e.left,o.top-e.top,0,n);return pm(r,qm),r}))})(t,N(i,((e,t)=>R(m,(e=>t===e)))),s,an(o))},Gm=(e,t)=>{if(Vm(e),e.isResizable(t)){const o=$o(t),n=on(o),r=en(o);Um(o,e,t,n,r)}},Km=(e,t)=>{const o=rt(e.parent(),"."+Fm);k(o,t)},Ym=e=>{Km(e,(e=>{Ct(e,"display","none")}))},Jm=e=>{Km(e,(e=>{Ct(e,"display","block")}))},Qm=Pm("resizer-bar-dragging"),Xm=e=>{const t=(()=>{const e=Em({drag:km(["xDelta","yDelta","target"])});let t=y.none();const o=(()=>{const e=Em({drag:km(["xDelta","yDelta"])});return{mutate:(t,o)=>{e.trigger.drag(t,o)},events:e.registry}})();return o.events.drag.bind((o=>{t.each((t=>{e.trigger.drag(o.xDelta,o.yDelta,t)}))})),{assign:e=>{t=y.some(e)},get:()=>t,mutate:o.mutate,events:e.registry}})(),o=((e,t={})=>{var o;return((e,t,o)=>{let n=!1;const r=Em({start:km([]),stop:km([])}),s=Mm(),a=()=>{m.stop(),s.isOn()&&(s.off(),r.trigger.stop())},c=((e,t)=>{let o=null;const n=()=>{l(o)||(clearTimeout(o),o=null)};return{cancel:n,throttle:(...t)=>{n(),o=setTimeout((()=>{o=null,e.apply(null,t)}),200)}}})(a);s.events.move.bind((o=>{t.mutate(e,o.info)}));const i=e=>(...t)=>{n&&e.apply(null,t)},m=t.sink(Lm({forceDrop:a,drop:i(a),move:i((e=>{c.cancel(),s.onEvent(e,t)})),delayDrop:i(c.throttle)}),o);return{element:m.element,go:e=>{m.start(e),s.on(),r.trigger.start()},on:()=>{n=!0},off:()=>{n=!1},destroy:()=>{m.destroy()},events:r.registry}})(e,null!==(o=t.mode)&&void 0!==o?o:Im,t)})(t,{});let n=y.none();const r=(e,t)=>y.from(me(e,t));t.events.drag.bind((e=>{r(e.target,"data-row").each((t=>{const o=zt(e.target,"top");Ct(e.target,"top",o+e.yDelta+"px")})),r(e.target,"data-column").each((t=>{const o=zt(e.target,"left");Ct(e.target,"left",o+e.xDelta+"px")}))}));const s=(e,t)=>zt(e,t)-kt(e,"data-initial-"+t,0);o.events.stop.bind((()=>{t.get().each((t=>{n.each((o=>{r(t,"data-row").each((e=>{const n=s(t,"top");ue(t,"data-initial-top"),d.trigger.adjustHeight(o,n,parseInt(e,10))})),r(t,"data-column").each((e=>{const n=s(t,"left");ue(t,"data-initial-left"),d.trigger.adjustWidth(o,n,parseInt(e,10))})),Gm(e,o)}))}))}));const a=(n,r)=>{d.trigger.startAdjust(),t.assign(n),ce(n,"data-initial-"+r,zt(n,r)),pm(n,Qm),Ct(n,"opacity","0.2"),o.go(e.parent())},c=Tm(e.parent(),"mousedown",(e=>{var t;t=e.target,wm(t,Hm)&&a(e.target,"top"),(e=>wm(e,qm))(e.target)&&a(e.target,"left")})),i=t=>ve(t,e.view()),m=Tm(e.view(),"mouseover",(t=>{var o;(o=t.target,mt(o,"table",i).filter(_s)).fold((()=>{Ze(t.target)&&Vm(e)}),(t=>{n=y.some(t),Gm(e,t)}))})),d=Em({adjustHeight:km(["table","delta","row"]),adjustWidth:km(["table","delta","column"]),startAdjust:km([])});return{destroy:()=>{c.unbind(),m.unbind(),o.destroy(),Vm(e)},refresh:t=>{Gm(e,t)},on:o.on,off:o.off,hideBars:h(Ym,e),showBars:h(Jm,e),events:d.registry}},Zm=(e,t,o)=>{const n=Tn,r=Dn,s=Xm(e),l=Em({beforeResize:km(["table","type"]),afterResize:km(["table","type"]),startDrag:km([])});return s.events.adjustHeight.bind((e=>{const t=e.table;l.trigger.beforeResize(t,"row");((e,t,o,n)=>{const r=$o(e),s=((e,t,o)=>Xn(e,t,o,Fn,(e=>e.getOrThunk(Wt))))(r,e,n),l=O(s,((e,n)=>o===n?Math.max(t+e,Wt()):e)),a=Dl(r,l),c=((e,t)=>O(e.all,((e,o)=>({element:e.element,height:t[o]}))))(r,l);k(c,(e=>{Ln(e.element,e.height)})),k(a,(e=>{Ln(e.element,e.height)}));const i=B(l,((e,t)=>e+t),0);Ln(e,i)})(t,n.delta(e.delta,t),e.row,n),l.trigger.afterResize(t,"row")})),s.events.startAdjust.bind((e=>{l.trigger.startDrag()})),s.events.adjustWidth.bind((e=>{const n=e.table;l.trigger.beforeResize(n,"col");const s=r.delta(e.delta,n),a=o(n);kl(n,s,e.column,t,a),l.trigger.afterResize(n,"col")})),{on:s.on,off:s.off,refreshBars:s.refresh,hideBars:s.hideBars,showBars:s.showBars,destroy:s.destroy,events:l.registry}},ed=e=>c(e)&&"TABLE"===e.tagName,td="bar-",od=e=>"false"!==me(e,"data-mce-resize"),nd=e=>{const t=Hi(),o=Hi(),n=Hi();let r,s;const l=t=>Ja(e,t),a=()=>Fa(e)?xs():ys();return e.on("init",(()=>{const r=((e,t)=>e.inline?((e,t,o)=>({parent:u(t),view:u(e),origin:u(mn(0,0)),isResizable:o}))(he.fromDom(e.getBody()),(()=>{const e=he.fromTag("div");return St(e,{position:"static",height:"0",width:"0",padding:"0",margin:"0",border:"0"}),Ae(et(he.fromDom(document)),e),e})(),t):((e,t)=>{const o=re(e)?(e=>he.fromDom(Se(e).dom.documentElement))(e):e;return{parent:u(o),view:u(e),origin:u(mn(0,0)),isResizable:t}})(he.fromDom(e.getDoc()),t))(e,od);if(n.set(r),(e=>{const t=e.options.get("object_resizing");return T(t.split(","),"table")})(e)&&Ga(e)){const n=a(),s=Zm(r,n,l);s.on(),s.events.startDrag.bind((o=>{t.set(e.selection.getRng())})),s.events.beforeResize.bind((t=>{const o=t.table.dom;((e,t,o,n,r)=>{e.dispatch("ObjectResizeStart",{target:t,width:o,height:n,origin:r})})(e,o,Er(o),Nr(o),td+t.type)})),s.events.afterResize.bind((o=>{const n=o.table,r=n.dom;Or(n),t.on((t=>{e.selection.setRng(t),e.focus()})),((e,t,o,n,r)=>{e.dispatch("ObjectResized",{target:t,width:o,height:n,origin:r})})(e,r,Er(r),Nr(r),td+o.type),e.undoManager.add()})),o.set(s)}})),e.on("ObjectResizeStart",(t=>{const o=t.target;if(ed(o)){const n=he.fromDom(o);k(e.dom.select(".mce-clonedresizable"),(t=>{e.dom.addClass(t,"mce-"+Pa(e)+"-columns")})),!mc(n)&&$a(e)?gc(n):!ic(n)&&Va(e)&&fc(n),dc(n)&&pt(t.origin,td)&&fc(n),r=t.width,s=Ua(e)?"":((e,t)=>{const o=e.dom.getStyle(t,"width")||e.dom.getAttrib(t,"width");return y.from(o).filter(vt)})(e,o).getOr("")}})),e.on("ObjectResized",(t=>{const o=t.target;if(ed(o)){const n=he.fromDom(o),c=t.origin;pt(c,"corner-")&&((t,o,n)=>{const c=wt(o,"e");if(""===s&&fc(t),n!==r&&""!==s){Ct(t,"width",s);const o=a(),i=l(t),m=Fa(e)||c?(e=>Cs(e).columns)(t)-1:0;kl(t,n-r,m,o,i)}else if((e=>/^(\d+(\.\d+)?)%$/.test(e))(s)){const e=parseFloat(s.replace("%",""));Ct(t,"width",n*e/r+"%")}(e=>/^(\d+(\.\d+)?)px$/.test(e))(s)&&(e=>{const t=$o(e);Xo(t)||k(_t(e),(e=>{const t=Tt(e,"width");Ct(e,"width",t),ue(e,"width")}))})(t)})(n,c,t.width),Or(n),Aa(e,n.dom,Wa)}})),e.on("SwitchMode",(()=>{o.on((t=>{e.mode.isReadOnly()?t.hideBars():t.showBars()}))})),e.on("remove",(()=>{o.on((e=>{e.destroy()})),n.on((t=>{((e,t)=>{e.inline&&_e(t.parent())})(e,t)}))})),{refresh:e=>{o.on((t=>t.refreshBars(he.fromDom(e))))},hide:()=>{o.on((e=>e.hideBars()))},show:()=>{o.on((e=>e.showBars()))}}},rd=e=>{(e=>{const t=e.options.register;t("table_clone_elements",{processor:"string[]"}),t("table_use_colgroups",{processor:"boolean",default:!0}),t("table_header_type",{processor:e=>{const t=T(["section","cells","sectionCells","auto"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: section, cells, sectionCells or auto."}},default:"section"}),t("table_sizing_mode",{processor:"string",default:"auto"}),t("table_default_attributes",{processor:"object",default:{border:"1"}}),t("table_default_styles",{processor:"object",default:{"border-collapse":"collapse",width:"100%"}}),t("table_column_resizing",{processor:e=>{const t=T(["preservetable","resizetable"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be preservetable, or resizetable."}},default:"preservetable"}),t("table_resize_bars",{processor:"boolean",default:!0})})(e);const t=nd(e),o=Om(e,t),n=Qa(e,t,o);return Wc(e,n),((e,t)=>{const o=Dr(e),n=t=>ss(kr(e)).bind((n=>Pt(n,o).map((o=>{const r=os(ls(e),o,n);return t(o,r)})))).getOr("");$({mceTableRowType:()=>n(t.getTableRowType),mceTableCellType:()=>n(t.getTableCellType),mceTableColType:()=>n(t.getTableColType)},((t,o)=>e.addQueryValueHandler(o,t)))})(e,n),as(e,n),{getSelectedCells:o.getSelectedCells,clearSelectedCells:o.clearSelectedCells}};e.add("dom",(e=>({table:rd(e)})))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/advlist/plugin.js b/public/assets/tinymce/plugins/advlist/plugin.js
index a9be593988ac020a0b9851c2ae23ffc98ec78dcf..c69ebb9ecf73326176866581e75ae309661cd79f 100644
--- a/public/assets/tinymce/plugins/advlist/plugin.js
+++ b/public/assets/tinymce/plugins/advlist/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=(t,e,r)=>{const s="UL"===e?"InsertUnorderedList":"InsertOrderedList";t.execCommand(s,!1,!1===r?null:{"list-style-type":r})},r=t=>e=>e.options.get(t),s=r("advlist_number_styles"),n=r("advlist_bullet_styles");var i=tinymce.util.Tools.resolve("tinymce.util.Tools");class l{constructor(t,e){this.tag=t,this.value=e}static some(t){return new l(!0,t)}static none(){return l.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?l.some(t(this.value)):l.none()}bind(t){return this.tag?t(this.value):l.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:l.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return null==t?l.none():l.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}l.singletonNone=new l(!1);const o=t=>t&&/^(TH|TD)$/.test(t.nodeName),a=(t,e)=>r=>{const s=s=>{r.setActive(((t,e,r)=>{const s=((t,e)=>{for(let r=0;r<t.length;r++)if(e(t[r]))return r;return-1})(e.parents,o),n=-1!==s?e.parents.slice(0,s):e.parents,l=i.grep(n,(t=>e=>e&&/^(OL|UL|DL)$/.test(e.nodeName)&&((t,e)=>t.dom.isChildOf(e,t.getBody()))(t,e))(t));return l.length>0&&l[0].nodeName===r})(t,s,e))};return t.on("NodeChange",s),()=>t.off("NodeChange",s)},u=(t,r,s,n,o,u)=>{u.length>1?((t,r,s,n,o,u)=>{t.ui.registry.addSplitButton(r,{tooltip:s,icon:"OL"===o?"ordered-list":"unordered-list",presets:"listpreview",columns:3,fetch:t=>{t(i.map(u,(t=>{const e="OL"===o?"num":"bull",r="disc"===t||"decimal"===t?"default":t,s="default"===t?"":t,n=(t=>t.replace(/\-/g," ").replace(/\b\w/g,(t=>t.toUpperCase())))(t);return{type:"choiceitem",value:s,icon:"list-"+e+"-"+r,text:n}})))},onAction:()=>t.execCommand(n),onItemAction:(r,s)=>{e(t,o,s)},select:e=>{const r=(t=>{const e=t.dom.getParent(t.selection.getNode(),"ol,ul"),r=t.dom.getStyle(e,"listStyleType");return l.from(r)})(t);return r.map((t=>e===t)).getOr(!1)},onSetup:a(t,o)})})(t,r,s,n,o,u):((t,e,r,s,n,i)=>{t.ui.registry.addToggleButton(e,{active:!1,tooltip:r,icon:"OL"===n?"ordered-list":"unordered-list",onSetup:a(t,n),onAction:()=>t.execCommand(s)})})(t,r,s,n,o)};t.add("advlist",(t=>{t.hasPlugin("lists")?((t=>{const e=t.options.register;e("advlist_number_styles",{processor:"string[]",default:"default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman".split(",")}),e("advlist_bullet_styles",{processor:"string[]",default:"default,circle,square".split(",")})})(t),(t=>{u(t,"numlist","Numbered list","InsertOrderedList","OL",s(t)),u(t,"bullist","Bullet list","InsertUnorderedList","UL",n(t))})(t),(t=>{t.addCommand("ApplyUnorderedListStyle",((r,s)=>{e(t,"UL",s["list-style-type"])})),t.addCommand("ApplyOrderedListStyle",((r,s)=>{e(t,"OL",s["list-style-type"])}))})(t)):console.error("Please use the Lists plugin together with the Advanced List plugin.")}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/anchor/plugin.js b/public/assets/tinymce/plugins/anchor/plugin.js
index 119ac545f56dd82a05be45ad124be6ce564ae2d7..ca8edec370b25f4fbc8f0e626d343daa5c651a6e 100644
--- a/public/assets/tinymce/plugins/anchor/plugin.js
+++ b/public/assets/tinymce/plugins/anchor/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),n=tinymce.util.Tools.resolve("tinymce.util.Tools");const o=("allow_html_in_named_anchor",e=>e.options.get("allow_html_in_named_anchor"));const a="a:not([href])",r=e=>!e,i=e=>e.getAttribute("id")||e.getAttribute("name")||"",l=e=>(e=>e&&"a"===e.nodeName.toLowerCase())(e)&&!e.getAttribute("href")&&""!==i(e),s=e=>e.dom.getParent(e.selection.getStart(),a),c=(e,a)=>{const r=s(e);r?((e,t,n)=>{n.removeAttribute("name"),n.id=t,e.addVisual(),e.undoManager.add()})(e,a,r):((e,a)=>{e.undoManager.transact((()=>{o(e)||e.selection.collapse(!0),e.selection.isCollapsed()?e.insertContent(e.dom.createHTML("a",{id:a})):((e=>{const o=e.dom;t(o).walk(e.selection.getRng(),(e=>{n.each(e,(e=>{var t;l(t=e)&&!t.firstChild&&o.remove(e,!1)}))}))})(e),e.formatter.remove("namedAnchor",null,null,!0),e.formatter.apply("namedAnchor",{value:a}),e.addVisual())}))})(e,a),e.focus()},d=e=>(e=>e&&r(e.attr("href"))&&!r(e.attr("id")||e.attr("name")))(e)&&!e.firstChild,m=e=>t=>{for(let n=0;n<t.length;n++){const o=t[n];d(o)&&o.attr("contenteditable",e)}};e.add("anchor",(e=>{(e=>{(0,e.options.register)("allow_html_in_named_anchor",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreInit",(()=>{e.parser.addNodeFilter("a",m("false")),e.serializer.addNodeFilter("a",m(null))}))})(e),(e=>{e.addCommand("mceAnchor",(()=>{(e=>{const t=(e=>{const t=s(e);return t?i(t):""})(e);e.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:t=>{((e,t)=>/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(t)?(c(e,t),!0):(e.windowManager.alert("ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),!1))(e,t.getData().id)&&t.close()}})})(e)}))})(e),(e=>{e.ui.registry.addToggleButton("anchor",{icon:"bookmark",tooltip:"Anchor",onAction:()=>e.execCommand("mceAnchor"),onSetup:t=>e.selection.selectorChangedWithUnbind("a:not([href])",t.setActive).unbind}),e.ui.registry.addMenuItem("anchor",{icon:"bookmark",text:"Anchor...",onAction:()=>e.execCommand("mceAnchor")})})(e),e.on("PreInit",(()=>{(e=>{e.formatter.register("namedAnchor",{inline:"a",selector:a,remove:"all",split:!0,deep:!0,attributes:{id:"%value"},onmatch:(e,t,n)=>l(e)})})(e)}))}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/autolink/plugin.js b/public/assets/tinymce/plugins/autolink/plugin.js
index fe1418b675915912dee55cf4423f4daa67ac6dea..698a209a7bf11c6f6afa133fbe5234e87889741b 100644
--- a/public/assets/tinymce/plugins/autolink/plugin.js
+++ b/public/assets/tinymce/plugins/autolink/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>e.options.get(t),n=e("autolink_pattern"),o=e("link_default_target"),r=e("link_default_protocol"),i=("string",t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(n=o=t,(r=String).prototype.isPrototypeOf(n)||(null===(i=o.constructor)||void 0===i?void 0:i.name)===r.name)?"string":e;var n,o,r,i})(t));const s=t=>/^[(\[{ \u00a0]$/.test(t),a=t=>3===t.nodeType,l=t=>1===t.nodeType,d=(t,e)=>{if(e<0&&(e=0),a(t)){const n=t.data.length;e>n&&(e=n)}return e},f=(t,e,n)=>{!l(e)||e.hasChildNodes()?t.setStart(e,d(e,n)):t.setStartBefore(e)},g=(t,e,n)=>{!l(e)||e.hasChildNodes()?t.setEnd(e,d(e,n)):t.setEndAfter(e)},c=(t,e)=>{let l,d,c,u,h,p,k;const C=n(t),y=o(t);if(null!==t.dom.getParent(t.selection.getNode(),"a[href]"))return;const m=t.selection.getRng().cloneRange();if(m.startOffset<5){if(h=m.endContainer.previousSibling,!h){if(!m.endContainer.firstChild||!m.endContainer.firstChild.nextSibling)return;h=m.endContainer.firstChild.nextSibling}if(p=h.length,f(m,h,p),g(m,h,p),m.endOffset<5)return;l=m.endOffset,d=h}else{if(d=m.endContainer,!a(d)&&d.firstChild){for(;!a(d)&&d.firstChild;)d=d.firstChild;a(d)&&(f(m,d,0),g(m,d,d.nodeValue.length))}l=1===m.endOffset?2:m.endOffset-1-e}const w=l;do{f(m,d,l>=2?l-2:0),g(m,d,l>=1?l-1:0),l-=1,k=m.toString()}while(!s(k)&&l-2>=0);var A;s(m.toString())?(f(m,d,l),g(m,d,w),l+=1):0===m.startOffset?(f(m,d,0),g(m,d,w)):(f(m,d,l),g(m,d,w)),u=m.toString(),A=u.charAt(u.length-1),/[?!,.;:]/.test(A)&&g(m,d,w-1),u=m.toString().trim();const S=u.match(C),_=r(t);if(S){let e=S[0];O="www.",(v=e).length>=O.length&&v.substr(0,0+O.length)===O?e=_+"://"+e:((t,e)=>-1!==t.indexOf("@"))(e)&&!(t=>/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(t))(e)&&(e="mailto:"+e),c=t.selection.getBookmark(),t.selection.setRng(m),t.getDoc().execCommand("createlink",!1,e),i(y)&&t.dom.setAttrib(t.selection.getNode(),"target",y),t.selection.moveToBookmark(c),t.nodeChanged()}var v,O};t.add("autolink",(t=>{(t=>{const e=t.options.register;e("autolink_pattern",{processor:"regexp",default: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("link_default_target",{processor:"string"}),e("link_default_protocol",{processor:"string",default:"https"})})(t),(t=>{t.on("keydown",(e=>{if(13===e.keyCode)return(t=>c(t,-1))(t)})),t.on("keypress",(e=>{if(41===e.keyCode||93===e.keyCode||125===e.keyCode)return(t=>c(t,-1))(t)})),t.on("keyup",(e=>{if(32===e.keyCode)return(t=>c(t,0))(t)}))})(t)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/autoresize/plugin.js b/public/assets/tinymce/plugins/autoresize/plugin.js
index 4def645f37b39750b9055cb65f8247078a28cf15..3ea53cedadabbd524d3a27e10b1d471694784ed8 100644
--- a/public/assets/tinymce/plugins/autoresize/plugin.js
+++ b/public/assets/tinymce/plugins/autoresize/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env");const o=e=>t=>t.options.get(e),n=o("min_height"),s=o("max_height"),i=o("autoresize_overflow_padding"),r=o("autoresize_bottom_margin"),l=(e,t)=>{const o=e.getBody();o&&(o.style.overflowY=t?"":"hidden",t||(o.scrollTop=0))},a=(e,t,o,n)=>{const s=parseInt(e.getStyle(t,o,n),10);return isNaN(s)?0:s},g=(e,o,i)=>{var c;const u=e.dom,d=e.getDoc();if(!d)return;if((e=>e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen())(e))return void l(e,!0);const f=d.documentElement,m=r(e),p=null!==(c=n(e))&&void 0!==c?c:e.getElement().offsetHeight;let h=p;const y=a(u,f,"margin-top",!0),v=a(u,f,"margin-bottom",!0);let C=f.offsetHeight+y+v+m;C<0&&(C=0);const S=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;C+S>p&&(h=C+S);const z=s(e);if(z&&h>z?(h=z,l(e,!0)):l(e,!1),h!==o.get()){const n=h-o.get();if(u.setStyle(e.getContainer(),"height",h+"px"),o.set(h),(e=>{e.dispatch("ResizeEditor")})(e),t.browser.isSafari()&&(t.os.isMacOS()||t.os.isiOS())){const t=e.getWin();t.scrollTo(t.pageXOffset,t.pageYOffset)}e.hasFocus()&&(e=>{if("setcontent"===(null==e?void 0:e.type.toLowerCase())){const t=e;return!0===t.selection||!0===t.paste}return!1})(i)&&e.selection.scrollIntoView(),(t.browser.isSafari()||t.browser.isChromium())&&n<0&&g(e,o,i)}};e.add("autoresize",(e=>{if((e=>{const t=e.options.register;t("autoresize_overflow_padding",{processor:"number",default:1}),t("autoresize_bottom_margin",{processor:"number",default:50})})(e),e.options.isSet("resize")||e.options.set("resize",!1),!e.inline){const t=(e=>{let t=0;return{get:()=>t,set:e=>{t=e}}})();((e,t)=>{e.addCommand("mceAutoResize",(()=>{g(e,t)}))})(e,t),((e,t)=>{e.on("init",(()=>{const t=i(e),o=e.dom;o.setStyles(e.getDoc().documentElement,{height:"auto"}),o.setStyles(e.getBody(),{paddingLeft:t,paddingRight:t,"min-height":0})})),e.on("NodeChange SetContent keyup FullscreenStateChanged ResizeContent",(o=>{g(e,t,o)}))})(e,t)}}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/autosave/plugin.js b/public/assets/tinymce/plugins/autosave/plugin.js
index d19bd65dba291c465eecf4b14f342dc5f0c8be22..68370a18a170bfcba0b98679f3444e8e4f61b0d8 100644
--- a/public/assets/tinymce/plugins/autosave/plugin.js
+++ b/public/assets/tinymce/plugins/autosave/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=("string",t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(r=o=t,(a=String).prototype.isPrototypeOf(r)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===a.name)?"string":e;var r,o,a,s})(t));const r=(void 0,t=>undefined===t);var o=tinymce.util.Tools.resolve("tinymce.util.Delay"),a=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),s=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=t=>{const e=/^(\d+)([ms]?)$/.exec(t);return(e[2]?{s:1e3,m:6e4}[e[2]]:1)*parseInt(t,10)},i=t=>e=>e.options.get(t),u=i("autosave_ask_before_unload"),l=i("autosave_restore_when_empty"),c=i("autosave_interval"),m=i("autosave_retention"),d=t=>{const e=document.location;return t.options.get("autosave_prefix").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},f=(t,e)=>{if(r(e))return t.dom.isEmpty(t.getBody());{const r=s.trim(e);if(""===r)return!0;{const e=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(e)}}},v=t=>{const e=parseInt(a.getItem(d(t)+"time"),10)||0;return!((new Date).getTime()-e>m(t)&&(p(t,!1),1))},p=(t,e)=>{const r=d(t);a.removeItem(r+"draft"),a.removeItem(r+"time"),!1!==e&&(t=>{t.dispatch("RemoveDraft")})(t)},g=t=>{const e=d(t);!f(t)&&t.isDirty()&&(a.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),a.setItem(e+"time",(new Date).getTime().toString()),(t=>{t.dispatch("StoreDraft")})(t))},y=t=>{const e=d(t);v(t)&&(t.setContent(a.getItem(e+"draft"),{format:"raw"}),(t=>{t.dispatch("RestoreDraft")})(t))},D=t=>{t.undoManager.transact((()=>{y(t),p(t)})),t.focus()};var h=tinymce.util.Tools.resolve("tinymce.EditorManager");const _=t=>e=>{e.setEnabled(v(t));const r=()=>e.setEnabled(v(t));return t.on("StoreDraft RestoreDraft RemoveDraft",r),()=>t.off("StoreDraft RestoreDraft RemoveDraft",r)};t.add("autosave",(t=>((t=>{const r=t.options.register,o=t=>{const r=e(t);return r?{value:n(t),valid:r}:{valid:!1,message:"Must be a string."}};r("autosave_ask_before_unload",{processor:"boolean",default:!0}),r("autosave_prefix",{processor:"string",default:"tinymce-autosave-{path}{query}{hash}-{id}-"}),r("autosave_restore_when_empty",{processor:"boolean",default:!1}),r("autosave_interval",{processor:o,default:"30s"}),r("autosave_retention",{processor:o,default:"20m"})})(t),(t=>{t.editorManager.on("BeforeUnload",(t=>{let e;s.each(h.get(),(t=>{t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&u(t)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))})),e&&(t.preventDefault(),t.returnValue=e)}))})(t),(t=>{(t=>{const e=c(t);o.setEditorInterval(t,(()=>{g(t)}),e)})(t),t.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:()=>{D(t)},onSetup:_(t)}),t.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:()=>{D(t)},onSetup:_(t)})})(t),t.on("init",(()=>{l(t)&&t.dom.isEmpty(t.getBody())&&y(t)})),(t=>({hasDraft:()=>v(t),storeDraft:()=>g(t),restoreDraft:()=>y(t),removeDraft:e=>p(t,e),isEmpty:e=>f(t,e)}))(t))))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/charmap/plugin.js b/public/assets/tinymce/plugins/charmap/plugin.js
index 967f85f867a0f2a913c15345a709944363e2f4e8..cb234db1d6c5a8fac3e2f35b7ee226d232027a7c 100644
--- a/public/assets/tinymce/plugins/charmap/plugin.js
+++ b/public/assets/tinymce/plugins/charmap/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=(e,t)=>{const a=((e,t)=>e.dispatch("insertCustomChar",{chr:t}))(e,t).chr;e.execCommand("mceInsertContent",!1,a)},a=("array",e=>"array"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(a=r=e,(n=String).prototype.isPrototypeOf(a)||(null===(i=r.constructor)||void 0===i?void 0:i.name)===n.name)?"string":t;var a,r,n,i})(e));const r=(null,e=>null===e);const n=e=>"function"==typeof e,i=(!1,()=>false);class o{constructor(e,t){this.tag=e,this.value=t}static some(e){return new o(!0,e)}static none(){return o.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?o.some(e(this.value)):o.none()}bind(e){return this.tag?e(this.value):o.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:o.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?o.none():o.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}o.singletonNone=new o(!1);const s=Array.prototype.push,l=(e,t)=>{const a=e.length,r=new Array(a);for(let n=0;n<a;n++){const a=e[n];r[n]=t(a,n)}return r};var c=tinymce.util.Tools.resolve("tinymce.util.Tools");const u=e=>t=>t.options.get(e),g=u("charmap"),h=u("charmap_append"),m=c.isArray,p="User Defined",d=e=>{return m(e)?(t=e,c.grep(t,(e=>m(e)&&2===e.length))):"function"==typeof e?e():[];var t},f=e=>{const t=((e,t)=>{const a=g(e);a&&(t=[{name:p,characters:d(a)}]);const r=h(e);if(r){const e=c.grep(t,(e=>e.name===p));return e.length?(e[0].characters=[].concat(e[0].characters).concat(d(r)),t):t.concat({name:p,characters:d(r)})}return t})(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 t.length>1?[{name:"All",characters:(r=t,n=e=>e.characters,(e=>{const t=[];for(let r=0,n=e.length;r<n;++r){if(!a(e[r]))throw new Error("Arr.flatten item "+r+" was not an array, input: "+e);s.apply(t,e[r])}return t})(l(r,n)))}].concat(t):t;var r,n},y=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},w=(e,t)=>-1!==e.indexOf(t),b=String.fromCodePoint,v=(e,t)=>{const a=[],r=t.toLowerCase();return((e,t)=>{for(let t=0,i=e.length;t<i;t++)((e,t,a)=>!!w(b(e).toLowerCase(),a)||w(t.toLowerCase(),a)||w(t.toLowerCase().replace(/\s+/g,""),a))((n=e[t])[0],n[1],r)&&a.push(n);var n})(e.characters),l(a,(e=>({text:e[1],value:b(e[0]),icon:b(e[0])})))},k="pattern",C=(e,a)=>{const n=()=>[{label:"Search",type:"input",name:k},{type:"collection",name:"results"}],s=1===a.length?y(p):y("All"),c=((e,t)=>{let a=null;const n=()=>{r(a)||(clearTimeout(a),a=null)};return{cancel:n,throttle:(...t)=>{n(),a=setTimeout((()=>{a=null,e.apply(null,t)}),40)}}})((e=>{const t=e.getData().pattern;((e,t)=>{var r,n;(r=a,n=e=>e.name===s.get(),((e,t,a)=>{for(let r=0,n=e.length;r<n;r++){const n=e[r];if(t(n,r))return o.some(n);if(a(n,r))break}return o.none()})(r,n,i)).each((a=>{const r=v(a,t);e.setData({results:r})}))})(e,t)})),u={title:"Special Character",size:"normal",body:1===a.length?{type:"panel",items:n()}:{type:"tabpanel",tabs:l(a,(e=>({title:e.name,name:e.name,items:n()})))},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{pattern:"",results:v(a[0],"")},onAction:(a,r)=>{"results"===r.name&&(t(e,r.value),a.close())},onTabChange:(e,t)=>{s.set(t.newTabName),c.throttle(e)},onChange:(e,t)=>{t.name===k&&c.throttle(e)}};e.windowManager.open(u).focus(k)};e.add("charmap",(e=>{(e=>{const t=e.options.register,r=e=>n(e)||a(e);t("charmap",{processor:r}),t("charmap_append",{processor:r})})(e);const r=f(e);return((e,t)=>{e.addCommand("mceShowCharmap",(()=>{C(e,t)}))})(e,r),(e=>{e.ui.registry.addButton("charmap",{icon:"insert-character",tooltip:"Special character",onAction:()=>e.execCommand("mceShowCharmap")}),e.ui.registry.addMenuItem("charmap",{icon:"insert-character",text:"Special character...",onAction:()=>e.execCommand("mceShowCharmap")})})(e),((e,t)=>{e.ui.registry.addAutocompleter("charmap",{ch:":",columns:"auto",minChars:2,fetch:(e,a)=>new Promise(((a,r)=>{a(v(t,e))})),onAction:(t,a,r)=>{e.selection.setRng(a),e.insertContent(r),t.hide()}})})(e,r[0]),(e=>({getCharMap:()=>f(e),insertChar:a=>{t(e,a)}}))(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/code/plugin.js b/public/assets/tinymce/plugins/code/plugin.js
index 2bd4515cb4d0f14070c6dbe46ffcf6a4a9c09b95..362cf34ae122498f43bbe822c4f132c007555c32 100644
--- a/public/assets/tinymce/plugins/code/plugin.js
+++ b/public/assets/tinymce/plugins/code/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("code",(e=>((e=>{e.addCommand("mceCodeEditor",(()=>{(e=>{const o=(e=>e.getContent({source_view:!0}))(e);e.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:o},onSubmit:o=>{((e,o)=>{e.focus(),e.undoManager.transact((()=>{e.setContent(o)})),e.selection.setCursorLocation(),e.nodeChanged()})(e,o.getData().code),o.close()}})})(e)}))})(e),(e=>{const o=()=>e.execCommand("mceCodeEditor");e.ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:o}),e.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:o})})(e),{})))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/codesample/plugin.js b/public/assets/tinymce/plugins/codesample/plugin.js
index 4885850599d4624c5877326b88d02d58648c1730..8f2f7126bc693d8a6ab12fbd728b6481806b17fc 100644
--- a/public/assets/tinymce/plugins/codesample/plugin.js
+++ b/public/assets/tinymce/plugins/codesample/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>()=>e;class n{constructor(e,t){this.tag=e,this.value=t}static some(e){return new n(!0,e)}static none(){return n.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?n.some(e(this.value)):n.none()}bind(e){return this.tag?e(this.value):n.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:n.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?n.none():n.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}n.singletonNone=new n(!1);var a=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");const s="undefined"!=typeof window?window:Function("return this;")(),r=function(e,t,n){const a=window.Prism;window.Prism={manual:!0};var s=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,a={},s={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.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 e(t,n){var a,r;switch(n=n||{},s.util.type(t)){case"Object":if(r=s.util.objId(t),n[r])return n[r];for(var i in a={},n[r]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":return r=s.util.objId(t),n[r]?n[r]:(a=[],n[r]=a,t.forEach((function(t,s){a[s]=e(t,n)})),a);default:return t}},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(a){var e=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(a.stack)||[])[1];if(e){var t=document.getElementsByTagName("script");for(var n in t)if(t[n].src==e)return t[n]}return null}},isActive:function(e,t,n){for(var a="no-"+t;e;){var s=e.classList;if(s.contains(t))return!0;if(s.contains(a))return!1;e=e.parentElement}return!!n}},languages:{plain:a,plaintext:a,text:a,txt:a,extend:function(e,t){var n=s.util.clone(s.languages[e]);for(var a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var r=(a=a||s.languages)[e],i={};for(var o in r)if(r.hasOwnProperty(o)){if(o==t)for(var l in n)n.hasOwnProperty(l)&&(i[l]=n[l]);n.hasOwnProperty(o)||(i[o]=r[o])}var u=a[e];return a[e]=i,s.languages.DFS(s.languages,(function(t,n){n===u&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,a,r){r=r||{};var i=s.util.objId;for(var o in t)if(t.hasOwnProperty(o)){n.call(t,o,t[o],a||o);var l=t[o],u=s.util.type(l);"Object"!==u||r[i(l)]?"Array"!==u||r[i(l)]||(r[i(l)]=!0,e(l,n,o,r)):(r[i(l)]=!0,e(l,n,null,r))}}},plugins:{},highlightAll:function(e,t){s.highlightAllUnder(document,e,t)},highlightAllUnder:function(e,t,n){var a={callback:n,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};s.hooks.run("before-highlightall",a),a.elements=Array.prototype.slice.apply(a.container.querySelectorAll(a.selector)),s.hooks.run("before-all-elements-highlight",a);for(var r,i=0;r=a.elements[i++];)s.highlightElement(r,!0===t,a.callback)},highlightElement:function(t,n,a){var r=s.util.getLanguage(t),i=s.languages[r];s.util.setLanguage(t,r);var o=t.parentElement;o&&"pre"===o.nodeName.toLowerCase()&&s.util.setLanguage(o,r);var l={element:t,language:r,grammar:i,code:t.textContent};function u(e){l.highlightedCode=e,s.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,s.hooks.run("after-highlight",l),s.hooks.run("complete",l),a&&a.call(l.element)}if(s.hooks.run("before-sanity-check",l),(o=l.element.parentElement)&&"pre"===o.nodeName.toLowerCase()&&!o.hasAttribute("tabindex")&&o.setAttribute("tabindex","0"),!l.code)return s.hooks.run("complete",l),void(a&&a.call(l.element));if(s.hooks.run("before-highlight",l),l.grammar)if(n&&e.Worker){var c=new Worker(s.filename);c.onmessage=function(e){u(e.data)},c.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else u(s.highlight(l.code,l.grammar,l.language));else u(s.util.encode(l.code))},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};if(s.hooks.run("before-tokenize",a),!a.grammar)throw new Error('The language "'+a.language+'" has no grammar.');return a.tokens=s.tokenize(a.code,a.grammar),s.hooks.run("after-tokenize",a),r.stringify(s.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var a in n)t[a]=n[a];delete t.rest}var s=new l;return u(s,s.head,e),o(e,s,t,s.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(s)},hooks:{all:{},add:function(e,t){var n=s.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=s.hooks.all[e];if(n&&n.length)for(var a,r=0;a=n[r++];)a(t)}},Token:r};function r(e,t,n,a){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length}function i(e,t,n,a){e.lastIndex=t;var s=e.exec(n);if(s&&a&&s[1]){var r=s[1].length;s.index+=r,s[0]=s[0].slice(r)}return s}function o(e,t,n,a,l,d){for(var g in n)if(n.hasOwnProperty(g)&&n[g]){var p=n[g];p=Array.isArray(p)?p:[p];for(var b=0;b<p.length;++b){if(d&&d.cause==g+","+b)return;var h=p[b],f=h.inside,m=!!h.lookbehind,y=!!h.greedy,w=h.alias;if(y&&!h.pattern.global){var k=h.pattern.toString().match(/[imsuy]*$/)[0];h.pattern=RegExp(h.pattern.source,k+"g")}for(var v=h.pattern||h,_=a.next,x=l;_!==t.tail&&!(d&&x>=d.reach);x+=_.value.length,_=_.next){var F=_.value;if(t.length>e.length)return;if(!(F instanceof r)){var S,A=1;if(y){if(!(S=i(v,x,e,m))||S.index>=e.length)break;var $=S.index,z=S.index+S[0].length,E=x;for(E+=_.value.length;$>=E;)E+=(_=_.next).value.length;if(x=E-=_.value.length,_.value instanceof r)continue;for(var C=_;C!==t.tail&&(E<z||"string"==typeof C.value);C=C.next)A++,E+=C.value.length;A--,F=e.slice(x,E),S.index-=x}else if(!(S=i(v,0,F,m)))continue;$=S.index;var j=S[0],B=F.slice(0,$),T=F.slice($+j.length),N=x+F.length;d&&N>d.reach&&(d.reach=N);var P=_.prev;if(B&&(P=u(t,P,B),x+=B.length),c(t,P,A),_=u(t,P,new r(g,f?s.tokenize(j,f):j,w,j)),T&&u(t,_,T),A>1){var O={cause:g+","+b,reach:N};o(e,t,n,_.prev,x,O),d&&O.reach>d.reach&&(d.reach=O.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function u(e,t,n){var a=t.next,s={value:n,prev:t,next:a};return t.next=s,a.prev=s,e.length++,s}function c(e,t,n){for(var a=t.next,s=0;s<n&&a!==e.tail;s++)a=a.next;t.next=a,a.prev=t,e.length-=s}if(e.Prism=s,r.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach((function(t){a+=e(t,n)})),a}var r={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(r.classes,i):r.classes.push(i)),s.hooks.run("wrap",r);var o="";for(var l in r.attributes)o+=" "+l+'="'+(r.attributes[l]||"").replace(/"/g,"&quot;")+'"';return"<"+r.tag+' class="'+r.classes.join(" ")+'"'+o+">"+r.content+"</"+r.tag+">"},!e.document)return e.addEventListener?(s.disableWorkerMessageHandler||e.addEventListener("message",(function(t){var n=JSON.parse(t.data),a=n.language,r=n.code,i=n.immediateClose;e.postMessage(s.highlight(r,s.languages[a],a)),i&&e.close()}),!1),s):s;var d=s.util.currentScript();function g(){s.manual||s.highlightAll()}if(d&&(s.filename=d.src,d.hasAttribute("data-manual")&&(s.manual=!0)),!s.manual){var p=document.readyState;"loading"===p||"interactive"===p&&d&&d.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return s}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});return s.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:/[{}[\];(),.:]/},function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,s,r){if(n.language===a){var i=n.tokenStack=[];n.code=n.code.replace(s,(function(e){if("function"==typeof r&&!r(e))return e;for(var s,o=i.length;-1!==n.code.indexOf(s=t(a,o));)++o;return i[o]=e,s})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var s=0,r=Object.keys(n.tokenStack);!function i(o){for(var l=0;l<o.length&&!(s>=r.length);l++){var u=o[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=r[s],d=n.tokenStack[c],g="string"==typeof u?u:u.content,p=t(a,c),b=g.indexOf(p);if(b>-1){++s;var h=g.substring(0,b),f=new e.Token(a,e.tokenize(d,n.grammar),"language-"+a,d),m=g.substring(b+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(f),m&&y.push.apply(y,i([m])),"string"==typeof u?o.splice.apply(o,[l,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return o}(n.tokens)}}}})}(s),s.languages.c=s.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|[?:~]|[-+*/%&|^!=<>]=?/}),s.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),s.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},s.languages.c.string],char:s.languages.c.char,comment:s.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:s.languages.c}}}}),s.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 s.languages.c.boolean,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/.source.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+/.source.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+)/.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 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"])}(s),function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return"(?:"+t[+n]+")"}))}function n(e,n,a){return RegExp(t(e,n),a||"")}function a(e,t){for(var n=0;n<t;n++)e=e.replace(/<<self>>/g,(function(){return"(?:"+e+")"}));return e.replace(/<<self>>/g,"[^\\s\\S]")}var s="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 u=l(r),c=RegExp(l(s+" "+r+" "+i+" "+o)),d=l(r+" "+i+" "+o),g=l(s+" "+r+" "+o),p=a(/<(?:[^<>;=+\-*/%&|^]|<<self>>)*>/.source,2),b=a(/\((?:[^()]|<<self>>)*\)/.source,2),h=/@?\b[A-Za-z_]\w*\b/.source,f=t(/<<0>>(?:\s*<<1>>)?/.source,[h,p]),m=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,f]),y=/\[\s*(?:,\s*)*\]/.source,w=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[m,y]),k=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[p,b,y]),v=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,m,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,S=/"(?:\\.|[^\\"\r\n])*"/.source,A=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[A]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[S]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[m]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[h,_]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[h]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[u,f]),lookbehind:!0,inside:x},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[m]),lookbehind:!0,inside:x},{pattern:n(/(\bwhere\s+)<<0>>/.source,[h]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,g,h]),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+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,m]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[h,p]),inside:{function:n(/^<<0>>/.source,[h]),generic:{pattern:RegExp(p),alias:"class-name",inside:x}}},"type-list":{pattern:n(/\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,h,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[f,b]),lookbehind:!0,greedy:!0,inside:e.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 $=S+"|"+F,z=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[$]),E=a(t(/[^"'/()]|<<0>>|\(<<self>>*\)/.source,[z]),2),C=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,j=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[m,E]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[C,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[C]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[E]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var B=/:[^}\r\n]+/.source,T=a(t(/[^"'/()]|<<0>>|\(<<self>>*\)/.source,[z]),2),N=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[T,B]),P=a(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<<self>>*\)/.source,[$]),2),O=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[P,B]);function q(t,a){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[a,B]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:q(N,T)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[O]),lookbehind:!0,greedy:!0,inside:q(O,P)}],char:{pattern:RegExp(F),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(s),function(e){var t=/(?:"(?:\\(?:\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\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,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 n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(s),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*)*/.source,a={pattern:RegExp(n+/[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:/\./}};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*[;,=()])/.source),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*)*\.?/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(s),s.languages.javascript=s.languages.extend("clike",{"class-name":[s.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$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),s.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,s.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:s.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:s.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:s.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:s.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:s.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),s.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:s.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"}}),s.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),s.languages.markup&&(s.languages.markup.tag.addInlined("script","javascript"),s.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")),s.languages.js=s.languages.javascript,s.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]},s.languages.markup.tag.inside["attr-value"].inside.entity=s.languages.markup.entity,s.languages.markup.doctype.inside["internal-subset"].inside=s.languages.markup,s.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&amp;/,"&"))})),Object.defineProperty(s.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:s.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var a={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:s.languages[t]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},s.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(s.languages.markup.tag,"addAttribute",{value:function(e,t){s.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:[t,"language-"+t],inside:s.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),s.languages.html=s.languages.markup,s.languages.mathml=s.languages.markup,s.languages.svg=s.languages.markup,s.languages.xml=s.languages.extend("markup",{}),s.languages.ssml=s.languages.xml,s.languages.atom=s.languages.xml,s.languages.rss=s.languages.xml,function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{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,s=/<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,r=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,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:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:s,punctuation:r};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.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}}];e.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:t,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:n,number:a,operator:s,punctuation:r}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(s),s.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:/[{}[\];(),.:]/},s.languages.python["string-interpolation"].inside.interpolation.inside.rest=s.languages.python,s.languages.py=s.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|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",a=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+a),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+a+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(s),window.Prism=a,s}(),i=e=>t=>t.options.get(e),o=i("codesample_languages"),l=i("codesample_global_prismjs"),u=e=>s.Prism&&l(e)?s.Prism:r,c=e=>e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-"),d=e=>{const t=e.selection?e.selection.getNode():null;return a=t,c(t)?n.some(a):n.none();var a},g=e=>{const s=(e=>o(e)||[{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"}])(e),r=(c=s,((e,t)=>0<e.length?n.some(e[0]):n.none())(c)).fold(t(""),(e=>e.value)),i=((e,t)=>d(e).fold((()=>t),(e=>{const n=e.className.match(/language-(\w+)/);return n?n[1]:t})))(e,r),l=(e=>d(e).fold(t(""),(e=>e.textContent)))(e);var c;e.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:s},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:i,code:l},onSubmit:t=>{const n=t.getData();((e,t,n)=>{const s=e.dom;e.undoManager.transact((()=>{const r=d(e);return n=a.DOM.encode(n),r.fold((()=>{e.insertContent('<pre id="__new" class="language-'+t+'">'+n+"</pre>");const a=s.select("#__new")[0];s.setAttrib(a,"id",null),e.selection.select(a)}),(a=>{s.setAttrib(a,"class","language-"+t),a.innerHTML=n,u(e).highlightElement(a),e.selection.select(a)}))}))})(e,n.language,n.code),t.close()}})},p=(b=/^\s+|\s+$/g,e=>e.replace(b,""));var b,h=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("codesample",(e=>{(e=>{const t=e.options.register;t("codesample_languages",{processor:"object[]"}),t("codesample_global_prismjs",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreProcess",(t=>{const n=e.dom,a=n.select("pre[contenteditable=false]",t.node);h.each(h.grep(a,c),(e=>{const t=e.textContent;let a;for(n.setAttrib(e,"class",p(n.getAttrib(e,"class"))),n.setAttrib(e,"contentEditable",null);a=e.firstChild;)e.removeChild(a);n.add(e,"code").textContent=t}))})),e.on("SetContent",(()=>{const t=e.dom,n=h.grep(t.select("pre"),(e=>c(e)&&"false"!==e.contentEditable));n.length&&e.undoManager.transact((()=>{h.each(n,(n=>{h.each(t.select("br",n),(t=>{t.parentNode.replaceChild(e.getDoc().createTextNode("\n"),t)})),n.contentEditable="false",n.innerHTML=t.encode(n.textContent),u(e).highlightElement(n),n.className=p(n.className)}))}))}))})(e),(e=>{const t=()=>e.execCommand("codesample");e.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:t,onSetup:t=>{const n=()=>{t.setActive((e=>{const t=e.selection.getStart();return e.dom.is(t,'pre[class*="language-"]')})(e))};return e.on("NodeChange",n),()=>e.off("NodeChange",n)}}),e.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:t})})(e),(e=>{e.addCommand("codesample",(()=>{const t=e.selection.getNode();e.selection.isCollapsed()||c(t)?g(e):e.formatter.toggle("code")}))})(e),e.on("dblclick",(t=>{c(t.target)&&g(e)}))}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/directionality/plugin.js b/public/assets/tinymce/plugins/directionality/plugin.js
index b9cdeb35e5ccc33eeb24cd7c0bf7e985dbf9f12f..ae460eead05d431b260e7629272e5ae87f0e3fe7 100644
--- a/public/assets/tinymce/plugins/directionality/plugin.js
+++ b/public/assets/tinymce/plugins/directionality/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>typeof e===t,o=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(o=r=t,(n=String).prototype.isPrototypeOf(o)||(null===(i=r.constructor)||void 0===i?void 0:i.name)===n.name)?"string":e;var o,r,n,i})(t),r=e("boolean"),n=t=>!(t=>null==t)(t),i=e("function"),s=e("number"),l=(!1,()=>false);class a{constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return n(t)?a.some(t):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);const u=(t,e)=>{for(let o=0,r=t.length;o<r;o++)e(t[o],o)},c=t=>{if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}},d=c,h=(t,e)=>{const o=t.dom;if(1!==o.nodeType)return!1;{const t=o;if(void 0!==t.matches)return t.matches(e);if(void 0!==t.msMatchesSelector)return t.msMatchesSelector(e);if(void 0!==t.webkitMatchesSelector)return t.webkitMatchesSelector(e);if(void 0!==t.mozMatchesSelector)return t.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}};"undefined"!=typeof window?window:Function("return this;")();const m=t=>e=>(t=>t.dom.nodeType)(e)===t,g=m(1),f=m(3),v=m(9),p=m(11),y=(t,e)=>{t.dom.removeAttribute(e)},w=i(Element.prototype.attachShadow)&&i(Node.prototype.getRootNode)?t=>d(t.dom.getRootNode()):t=>v(t)?t:d(t.dom.ownerDocument),N=t=>d(t.dom.host),b=t=>{const e=f(t)?t.dom.parentNode:t.dom;if(null==e||null===e.ownerDocument)return!1;const o=e.ownerDocument;return(t=>{const e=w(t);return p(o=e)&&n(o.dom.host)?a.some(e):a.none();var o})(d(e)).fold((()=>o.body.contains(e)),(r=b,i=N,t=>r(i(t))));var r,i},S=t=>"rtl"===((t,e)=>{const o=t.dom,r=window.getComputedStyle(o).getPropertyValue(e);return""!==r||b(t)?r:((t,e)=>(t=>void 0!==t.style&&i(t.style.getPropertyValue))(t)?t.style.getPropertyValue(e):"")(o,e)})(t,"direction")?"rtl":"ltr",A=(t,e)=>((t,o)=>((t,e)=>{const o=[];for(let r=0,n=t.length;r<n;r++){const n=t[r];e(n,r)&&o.push(n)}return o})(((t,e)=>{const o=t.length,r=new Array(o);for(let n=0;n<o;n++){const o=t[n];r[n]=e(o,n)}return r})(t.dom.childNodes,d),(t=>h(t,e))))(t),T=("li",t=>g(t)&&"li"===t.dom.nodeName.toLowerCase());const C=(t,e)=>{const n=t.selection.getSelectedBlocks();n.length>0&&(u(n,(t=>{const n=d(t),c=T(n),m=((t,e)=>{return(e?(o=t,r="ol,ul",((t,e,o)=>{let n=t.dom;const s=i(o)?o:l;for(;n.parentNode;){n=n.parentNode;const t=d(n);if(h(t,r))return a.some(t);if(s(t))break}return a.none()})(o,0,n)):a.some(t)).getOr(t);var o,r,n})(n,c);var f;(f=m,(t=>a.from(t.dom.parentNode).map(d))(f).filter(g)).each((t=>{if(S(t)!==e?((t,e,n)=>{((t,e,n)=>{if(!(o(n)||r(n)||s(n)))throw console.error("Invalid call to Attribute.set. Key ",e,":: Value ",n,":: Element ",t),new Error("Attribute value was not simple");t.setAttribute(e,n+"")})(t.dom,e,n)})(m,"dir",e):S(m)!==e&&y(m,"dir"),c){const t=A(m,"li[dir]");u(t,(t=>y(t,"dir")))}}))})),t.nodeChanged())},D=(t,e)=>o=>{const r=t=>{const r=d(t.element);o.setActive(S(r)===e)};return t.on("NodeChange",r),()=>t.off("NodeChange",r)};t.add("directionality",(t=>{(t=>{t.addCommand("mceDirectionLTR",(()=>{C(t,"ltr")})),t.addCommand("mceDirectionRTL",(()=>{C(t,"rtl")}))})(t),(t=>{t.ui.registry.addToggleButton("ltr",{tooltip:"Left to right",icon:"ltr",onAction:()=>t.execCommand("mceDirectionLTR"),onSetup:D(t,"ltr")}),t.ui.registry.addToggleButton("rtl",{tooltip:"Right to left",icon:"rtl",onAction:()=>t.execCommand("mceDirectionRTL"),onSetup:D(t,"rtl")})})(t)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/emoticons/plugin.js b/public/assets/tinymce/plugins/emoticons/plugin.js
index 209425959333e281c1450372f9ef440913fdd234..8040838a2ae1d48626a67ed43c708411f05a9266 100644
--- a/public/assets/tinymce/plugins/emoticons/plugin.js
+++ b/public/assets/tinymce/plugins/emoticons/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=(null,t=>null===t);const o=()=>{},n=()=>!1;class s{constructor(t,e){this.tag=t,this.value=e}static some(t){return new s(!0,t)}static none(){return s.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?s.some(t(this.value)):s.none()}bind(t){return this.tag?t(this.value):s.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:s.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return null==t?s.none():s.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}s.singletonNone=new s(!1);const r=(t,e)=>{const o=t.length,n=new Array(o);for(let s=0;s<o;s++){const o=t[s];n[s]=e(o,s)}return n},a=t=>{let e=t;return{get:()=>e,set:t=>{e=t}}},i=Object.keys,l=Object.hasOwnProperty,c=(t,e)=>{const o=i(t);for(let n=0,s=o.length;n<s;n++){const s=o[n];e(t[s],s)}},u=(t,e)=>l.call(t,e),g=(m=(t,e)=>e,(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const e={};for(let o=0;o<t.length;o++){const n=t[o];for(const t in n)u(n,t)&&(e[t]=m(e[t],n[t]))}return e});var m;const h=()=>{const t=(t=>{const e=a(s.none()),o=()=>e.get().each(t);return{clear:()=>{o(),e.set(s.none())},isSet:()=>e.get().isSome(),get:()=>e.get(),set:t=>{o(),e.set(s.some(t))}}})(o);return{...t,on:e=>t.get().each(e)}},d=(t,e)=>-1!==t.indexOf(e);var p=tinymce.util.Tools.resolve("tinymce.Resource");const y=t=>e=>e.options.get(t),v=y("emoticons_database"),f=y("emoticons_database_url"),b=y("emoticons_database_id"),w=y("emoticons_append"),_=y("emoticons_images_url"),j="All",C={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"},k=(t,e)=>u(t,e)?t[e]:e,A=t=>{const e=w(t);return o=t=>({keywords:[],category:"user",...t}),((t,e)=>{const o={};return c(t,((t,n)=>{const s=e(t,n);o[s.k]=s.v})),o})(e,((t,e)=>({k:e,v:o(t)})));var o},O=(t,e)=>d(t.title.toLowerCase(),e)||((t,o)=>{for(let o=0,s=t.length;o<s;o++)if(n=t[o],d(n.toLowerCase(),e))return!0;var n;return!1})(t.keywords),x=(t,e,o)=>{const s=[],r=e.toLowerCase(),a=o.fold((()=>n),(t=>e=>e>=t));for(let o=0;o<t.length&&(0!==e.length&&!O(t[o],r)||(s.push({value:t[o].char,text:t[o].title,icon:t[o].char}),!a(s.length)));o++);return s},L="pattern",T=(t,o)=>{const n={pattern:"",results:x(o.listAll(),"",s.some(300))},i=a(j),l=((t,o)=>{let n=null;const s=()=>{e(n)||(clearTimeout(n),n=null)};return{cancel:s,throttle:(...e)=>{s(),n=setTimeout((()=>{n=null,t.apply(null,e)}),200)}}})((t=>{(t=>{const e=t.getData(),n=i.get(),r=o.listCategory(n),a=x(r,e.pattern,n===j?s.some(300):s.none());t.setData({results:a})})(t)})),c={label:"Search",type:"input",name:L},u={type:"collection",name:"results"},g=()=>({title:"Emojis",size:"normal",body:{type:"tabpanel",tabs:r(o.listCategories(),(t=>({title:t,name:t,items:[c,u]})))},initialData:n,onTabChange:(t,e)=>{i.set(e.newTabName),l.throttle(t)},onChange:l.throttle,onAction:(e,o)=>{"results"===o.name&&(((t,e)=>{t.insertContent(e)})(t,o.value),e.close())},buttons:[{type:"cancel",text:"Close",primary:!0}]}),m=t.windowManager.open(g());m.focus(L),o.hasLoaded()||(m.block("Loading emojis..."),o.waitForLoad().then((()=>{m.redial(g()),l.throttle(m),m.focus(L),m.unblock()})).catch((t=>{m.redial({title:"Emojis",body:{type:"panel",items:[{type:"alertbanner",level:"error",icon:"warning",text:"Could not load emojis"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),m.focus(L),m.unblock()})))};t.add("emoticons",((t,e)=>{((t,e)=>{const o=t.options.register;o("emoticons_database",{processor:"string",default:"emojis"}),o("emoticons_database_url",{processor:"string",default:`${e}/js/${v(t)}${t.suffix}.js`}),o("emoticons_database_id",{processor:"string",default:"tinymce.plugins.emoticons"}),o("emoticons_append",{processor:"object",default:{}}),o("emoticons_images_url",{processor:"string",default:"https://twemoji.maxcdn.com/v/13.0.1/72x72/"})})(t,e);const o=((t,e,o)=>{const n=h(),r=h(),a=_(t),l=t=>{return o="<img",(e=t.char).length>=o.length&&e.substr(0,0+o.length)===o?t.char.replace(/src="([^"]+)"/,((t,e)=>`src="${a}${e}"`)):t.char;var e,o};t.on("init",(()=>{p.load(o,e).then((e=>{const o=A(t);(t=>{const e={},o=[];c(t,((t,n)=>{const s={title:n,keywords:t.keywords,char:l(t),category:k(C,t.category)},r=void 0!==e[s.category]?e[s.category]:[];e[s.category]=r.concat([s]),o.push(s)})),n.set(e),r.set(o)})(g(e,o))}),(t=>{console.log(`Failed to load emojis: ${t}`),n.set({}),r.set([])}))}));const u=()=>r.get().getOr([]),m=()=>n.isSet()&&r.isSet();return{listCategories:()=>[j].concat(i(n.get().getOr({}))),hasLoaded:m,waitForLoad:()=>m()?Promise.resolve(!0):new Promise(((t,o)=>{let n=15;const s=setInterval((()=>{m()?(clearInterval(s),t(!0)):(n--,n<0&&(console.log("Could not load emojis from url: "+e),clearInterval(s),o(!1)))}),100)})),listAll:u,listCategory:t=>t===j?u():n.get().bind((e=>s.from(e[t]))).getOr([])}})(t,f(t),b(t));((t,e)=>{t.addCommand("mceEmoticons",(()=>T(t,e)))})(t,o),(t=>{const e=()=>t.execCommand("mceEmoticons");t.ui.registry.addButton("emoticons",{tooltip:"Emojis",icon:"emoji",onAction:e}),t.ui.registry.addMenuItem("emoticons",{text:"Emojis...",icon:"emoji",onAction:e})})(t),((t,e)=>{t.ui.registry.addAutocompleter("emoticons",{ch:":",columns:"auto",minChars:2,fetch:(t,o)=>e.waitForLoad().then((()=>{const n=e.listAll();return x(n,t,s.some(o))})),onAction:(e,o,n)=>{t.selection.setRng(o),t.insertContent(n),e.hide()}})})(t,o),(t=>{t.on("PreInit",(()=>{t.parser.addAttributeFilter("data-emoticon",(t=>{((t,e)=>{for(let e=0,n=t.length;e<n;e++)(o=t[e]).attr("data-mce-resize","false"),o.attr("data-mce-placeholder","1");var o})(t)}))}))})(t)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/fullscreen/plugin.js b/public/assets/tinymce/plugins/fullscreen/plugin.js
index 25d6f463d0122fd344381be281ef7ef391412cc6..21500d27628d43e0e5d1bcb11771d2c6e3b0c42c 100644
--- a/public/assets/tinymce/plugins/fullscreen/plugin.js
+++ b/public/assets/tinymce/plugins/fullscreen/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";const e=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}};var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const n=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=r=e,(o=String).prototype.isPrototypeOf(n)||(null===(s=r.constructor)||void 0===s?void 0:s.name)===o.name)?"string":t;var n,r,o,s})(t)===e,r=e=>t=>typeof t===e,o=n("string"),s=n("array"),i=(null,e=>null===e);const l=r("boolean"),a=e=>!(e=>null==e)(e),c=r("function"),u=r("number"),d=()=>{},m=e=>()=>e;function h(e,...t){return(...n)=>{const r=t.concat(n);return e.apply(null,r)}}const g=m(!1),p=m(!0);class f{constructor(e,t){this.tag=e,this.value=t}static some(e){return new f(!0,e)}static none(){return f.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?f.some(e(this.value)):f.none()}bind(e){return this.tag?e(this.value):f.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:f.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return a(e)?f.some(e):f.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}f.singletonNone=new f(!1);const v=t=>{const n=e(f.none()),r=()=>n.get().each(t);return{clear:()=>{r(),n.set(f.none())},isSet:()=>n.get().isSome(),get:()=>n.get(),set:e=>{r(),n.set(f.some(e))}}},w=()=>v((e=>e.unbind())),y=Array.prototype.push,b=(e,t)=>{const n=e.length,r=new Array(n);for(let o=0;o<n;o++){const n=e[o];r[o]=t(n,o)}return r},S=(e,t)=>{for(let n=0,r=e.length;n<r;n++)t(e[n],n)},x=(e,t)=>{const n=[];for(let r=0,o=e.length;r<o;r++){const o=e[r];t(o,r)&&n.push(o)}return n},E=(e,t)=>((e,t,n)=>{for(let r=0,o=e.length;r<o;r++){const o=e[r];if(t(o,r))return f.some(o);if(n(o,r))break}return f.none()})(e,t,g),F=Object.keys,O=(e,t)=>-1!==e.indexOf(t),T=e=>void 0!==e.style&&c(e.style.getPropertyValue),k=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},C=k;"undefined"!=typeof window?window:Function("return this;")();const A=e=>t=>(e=>e.dom.nodeType)(t)===e,R=A(1),L=A(3),M=A(9),N=A(11),P=(e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},D=e=>C(e.dom.ownerDocument),W=e=>b(e.dom.childNodes,C),q=c(Element.prototype.attachShadow)&&c(Node.prototype.getRootNode),H=m(q),I=q?e=>C(e.dom.getRootNode()):e=>M(e)?e:D(e),B=e=>{const t=I(e);return N(n=t)&&a(n.dom.host)?f.some(t):f.none();var n},V=e=>C(e.dom.host),_=e=>{const t=L(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const n=t.ownerDocument;return B(C(t)).fold((()=>n.body.contains(t)),(r=_,o=V,e=>r(o(e))));var r,o},j=(e,t)=>{const n=e.dom.getAttribute(t);return null===n?void 0:n},z=(e,t)=>{e.dom.removeAttribute(t)},$=(e,t)=>{const n=e.dom;((e,t)=>{const n=F(e);for(let r=0,o=n.length;r<o;r++){const o=n[r];t(e[o],o)}})(t,((e,t)=>{((e,t,n)=>{if(!o(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);T(e)&&e.style.setProperty(t,n)})(n,t,e)}))},U=e=>{const t=C((e=>{if(H()&&a(e.target)){const t=C(e.target);if(R(t)&&a(t.dom.shadowRoot)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return((e,t)=>0<e.length?f.some(e[0]):f.none())(t)}}return f.from(e.target)})(e).getOr(e.target)),n=()=>e.stopPropagation(),r=()=>e.preventDefault(),o=(s=r,i=n,(...e)=>s(i.apply(null,e)));var s,i;return((e,t,n,r,o,s,i)=>({target:e,x:t,y:n,stop:r,prevent:o,kill:s,raw:i}))(t,e.clientX,e.clientY,n,r,o,e)},K=(e,t,n,r)=>{e.dom.removeEventListener(t,n,r)},X=p,Y=(e,t,n)=>((e,t,n,r)=>((e,t,n,r,o)=>{const s=((e,t)=>n=>{e(n)&&t(U(n))})(n,r);return e.dom.addEventListener(t,s,o),{unbind:h(K,e,t,s,o)}})(e,t,n,r,!1))(e,t,X,n),G=()=>J(0,0),J=(e,t)=>({major:e,minor:t}),Q={nu:J,detect:(e,t)=>{const n=String(t).toLowerCase();return 0===e.length?G():((e,t)=>{const n=((e,t)=>{for(let n=0;n<e.length;n++){const r=e[n];if(r.test(t))return r}})(e,t);if(!n)return{major:0,minor:0};const r=e=>Number(t.replace(n,"$"+e));return J(r(1),r(2))})(e,n)},unknown:G},Z=(e,t)=>{const n=String(t).toLowerCase();return E(e,(e=>e.search(n)))},ee=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,te=e=>t=>O(t,e),ne=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>O(e,"edge/")&&O(e,"chrome")&&O(e,"safari")&&O(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,ee],search:e=>O(e,"chrome")&&!O(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>O(e,"msie")||O(e,"trident")},{name:"Opera",versionRegexes:[ee,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:te("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:te("firefox")},{name:"Safari",versionRegexes:[ee,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(O(e,"safari")||O(e,"mobile/"))&&O(e,"applewebkit")}],re=[{name:"Windows",search:te("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>O(e,"iphone")||O(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:"macOS",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]+).*/]}],oe={browsers:m(ne),oses:m(re)},se="Edge",ie="Chromium",le="Opera",ae="Firefox",ce="Safari",ue=e=>{const t=e.current,n=e.version,r=e=>()=>t===e;return{current:t,version:n,isEdge:r(se),isChromium:r(ie),isIE:r("IE"),isOpera:r(le),isFirefox:r(ae),isSafari:r(ce)}},de=()=>ue({current:void 0,version:Q.unknown()}),me=ue,he=(m(se),m(ie),m("IE"),m(le),m(ae),m(ce),"Windows"),ge="Android",pe="Linux",fe="macOS",ve="Solaris",we="FreeBSD",ye="ChromeOS",be=e=>{const t=e.current,n=e.version,r=e=>()=>t===e;return{current:t,version:n,isWindows:r(he),isiOS:r("iOS"),isAndroid:r(ge),isMacOS:r(fe),isLinux:r(pe),isSolaris:r(ve),isFreeBSD:r(we),isChromeOS:r(ye)}},Se=()=>be({current:void 0,version:Q.unknown()}),xe=be,Ee=(m(he),m("iOS"),m(ge),m(pe),m(fe),m(ve),m(we),m(ye),(e,t,n)=>{const r=oe.browsers(),o=oe.oses(),s=t.bind((e=>((e,t)=>((e,t)=>{for(let n=0;n<e.length;n++){const r=t(e[n]);if(r.isSome())return r}return f.none()})(t.brands,(t=>{const n=t.brand.toLowerCase();return E(e,(e=>{var t;return n===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:Q.nu(parseInt(t.version,10),0)})))})))(r,e))).orThunk((()=>((e,t)=>Z(e,t).map((e=>{const n=Q.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(r,e))).fold(de,me),i=((e,t)=>Z(e,t).map((e=>{const n=Q.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(o,e).fold(Se,xe),l=((e,t,n,r)=>{const o=e.isiOS()&&!0===/ipad/i.test(n),s=e.isiOS()&&!o,i=e.isiOS()||e.isAndroid(),l=i||r("(pointer:coarse)"),a=o||!s&&i&&r("(min-device-width:768px)"),c=s||i&&!a,u=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(n),d=!c&&!a&&!u;return{isiPad:m(o),isiPhone:m(s),isTablet:m(a),isPhone:m(c),isTouch:m(l),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:m(u),isDesktop:m(d)}})(i,s,e,n);return{browser:s,os:i,deviceType:l}}),Fe=e=>window.matchMedia(e).matches;let Oe=(e=>{let t,n=!1;return(...r)=>(n||(n=!0,t=e.apply(null,r)),t)})((()=>Ee(navigator.userAgent,f.from(navigator.userAgentData),Fe)));const Te=(e,t)=>({left:e,top:t,translate:(n,r)=>Te(e+n,t+r)}),ke=Te,Ce=e=>{const t=void 0===e?window:e;return Oe().browser.isFirefox()?f.none():f.from(t.visualViewport)},Ae=(e,t,n,r)=>({x:e,y:t,width:n,height:r,right:e+n,bottom:t+r}),Re=e=>{const t=void 0===e?window:e,n=t.document,r=(e=>{const t=void 0!==e?e.dom:document,n=t.body.scrollLeft||t.documentElement.scrollLeft,r=t.body.scrollTop||t.documentElement.scrollTop;return ke(n,r)})(C(n));return Ce(t).fold((()=>{const e=t.document.documentElement,n=e.clientWidth,o=e.clientHeight;return Ae(r.left,r.top,n,o)}),(e=>Ae(Math.max(e.pageLeft,r.left),Math.max(e.pageTop,r.top),e.width,e.height)))},Le=(e,t,n)=>Ce(n).map((n=>{const r=e=>t(U(e));return n.addEventListener(e,r),{unbind:()=>n.removeEventListener(e,r)}})).getOrThunk((()=>({unbind:d})));var Me=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),Ne=tinymce.util.Tools.resolve("tinymce.Env");const Pe=(e,t)=>{e.dispatch("FullscreenStateChanged",{state:t})},De=("fullscreen_native",e=>e.options.get("fullscreen_native"));const We=e=>{return e.dom===(void 0!==(t=D(e).dom).fullscreenElement?t.fullscreenElement:void 0!==t.msFullscreenElement?t.msFullscreenElement:void 0!==t.webkitFullscreenElement?t.webkitFullscreenElement:null);var t},qe=(e,t,n)=>((e,t,n)=>x(((e,t)=>{const n=c(t)?t:g;let r=e.dom;const o=[];for(;null!==r.parentNode&&void 0!==r.parentNode;){const e=r.parentNode,t=C(e);if(o.push(t),!0===n(t))break;r=e}return o})(e,n),t))(e,(e=>P(e,t)),n),He=(e,t)=>((e,n)=>{return x((e=>f.from(e.dom.parentNode).map(C))(r=e).map(W).map((e=>x(e,(e=>{return t=e,!(r.dom===t.dom);var t})))).getOr([]),(e=>P(e,t)));var r})(e),Ie="data-ephox-mobile-fullscreen-style",Be="position:absolute!important;",Ve="top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;",_e=Ne.os.isAndroid(),je=e=>{const t=((e,t)=>{const n=e.dom,r=window.getComputedStyle(n).getPropertyValue(t);return""!==r||_(e)?r:((e,t)=>T(e)?e.style.getPropertyValue(t):"")(n,t)})(e,"background-color");return void 0!==t&&""!==t?"background-color:"+t+"!important":"background-color:rgb(255,255,255)!important;"},ze=Me.DOM,$e=Ce().fold((()=>({bind:d,unbind:d})),(e=>{const t=(()=>{const e=v(d);return{...e,on:t=>e.get().each(t)}})(),n=w(),r=w(),o=((e,t)=>{let n=null;return{cancel:()=>{i(n)||(clearTimeout(n),n=null)},throttle:(...t)=>{i(n)&&(n=setTimeout((()=>{n=null,e.apply(null,t)}),50))}}})((()=>{document.body.scrollTop=0,document.documentElement.scrollTop=0,window.requestAnimationFrame((()=>{t.on((t=>$(t,{top:e.offsetTop+"px",left:e.offsetLeft+"px",height:e.height+"px",width:e.width+"px"})))}))}));return{bind:e=>{t.set(e),o.throttle(),n.set(Le("resize",o.throttle)),r.set(Le("scroll",o.throttle))},unbind:()=>{t.on((()=>{n.clear(),r.clear()})),t.clear()}}})),Ue=(e,t)=>{const n=document.body,r=document.documentElement,i=e.getContainer(),a=C(i),c=(e=>{const t=C(e.getElement());return B(t).map(V).getOrThunk((()=>(e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return C(t)})(D(t))))})(e),d=t.get(),m=C(e.getBody()),h=Ne.deviceType.isTouch(),g=i.style,p=e.iframeElement.style,v=e=>{e(n,"tox-fullscreen"),e(r,"tox-fullscreen"),e(i,"tox-fullscreen"),B(a).map((e=>V(e).dom)).each((t=>{e(t,"tox-fullscreen"),e(t,"tox-shadowhost")}))},w=()=>{h&&(e=>{const t=((e,t)=>{const n=document;return 1!==(r=n).nodeType&&9!==r.nodeType&&11!==r.nodeType||0===r.childElementCount?[]:b(n.querySelectorAll(e),C);var r})("["+Ie+"]");S(t,(t=>{const n=j(t,Ie);"no-styles"!==n?$(t,e.parseStyle(n)):z(t,"style"),z(t,Ie)}))})(e.dom),v(ze.removeClass),$e.unbind(),f.from(t.get()).each((e=>e.fullscreenChangeHandler.unbind()))};if(d)d.fullscreenChangeHandler.unbind(),De(e)&&We(c)&&(e=>{const t=e.dom;t.exitFullscreen?t.exitFullscreen():t.msExitFullscreen?t.msExitFullscreen():t.webkitCancelFullScreen&&t.webkitCancelFullScreen()})(D(c)),p.width=d.iframeWidth,p.height=d.iframeHeight,g.width=d.containerWidth,g.height=d.containerHeight,g.top=d.containerTop,g.left=d.containerLeft,w(),x=d.scrollPos,window.scrollTo(x.x,x.y),t.set(null),Pe(e,!1),e.off("remove",w);else{const n=Y(D(c),void 0!==document.fullscreenElement?"fullscreenchange":void 0!==document.msFullscreenElement?"MSFullscreenChange":void 0!==document.webkitFullscreenElement?"webkitfullscreenchange":"fullscreenchange",(n=>{De(e)&&(We(c)||null===t.get()||Ue(e,t))})),r={scrollPos:Re(window),containerWidth:g.width,containerHeight:g.height,containerTop:g.top,containerLeft:g.left,iframeWidth:p.width,iframeHeight:p.height,fullscreenChangeHandler:n};h&&((e,t,n)=>{const r=t=>n=>{const r=j(n,"style"),s=void 0===r?"no-styles":r.trim();s!==t&&(((e,t,n)=>{((e,t,n)=>{if(!(o(n)||l(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)})(n,Ie,s),$(n,e.parseStyle(t)))},i=qe(t,"*"),a=(e=>{const t=[];for(let 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);y.apply(t,e[n])}return t})(b(i,(e=>He(e,"*:not(.tox-silver-sink)")))),c=je(n);S(a,r("display:none!important;")),S(i,r(Be+Ve+c)),r((!0===_e?"":Be)+Ve+c)(t)})(e.dom,a,m),p.width=p.height="100%",g.width=g.height="",v(ze.addClass),$e.bind(a),e.on("remove",w),t.set(r),De(e)&&(e=>{const t=e.dom;t.requestFullscreen?t.requestFullscreen():t.msRequestFullscreen?t.msRequestFullscreen():t.webkitRequestFullScreen&&t.webkitRequestFullScreen()})(c),Pe(e,!0)}var x},Ke=(e,t)=>n=>{n.setActive(null!==t.get());const r=e=>n.setActive(e.state);return e.on("FullscreenStateChanged",r),()=>e.off("FullscreenStateChanged",r)};t.add("fullscreen",(t=>{const n=e(null);return t.inline||((e=>{(0,e.options.register)("fullscreen_native",{processor:"boolean",default:!1})})(t),((e,t)=>{e.addCommand("mceFullScreen",(()=>{Ue(e,t)}))})(t,n),((e,t)=>{const n=()=>e.execCommand("mceFullScreen");e.ui.registry.addToggleMenuItem("fullscreen",{text:"Fullscreen",icon:"fullscreen",shortcut:"Meta+Shift+F",onAction:n,onSetup:Ke(e,t)}),e.ui.registry.addToggleButton("fullscreen",{tooltip:"Fullscreen",icon:"fullscreen",onAction:n,onSetup:Ke(e,t)})})(t,n),t.addShortcut("Meta+Shift+F","","mceFullScreen")),(e=>({isFullscreen:()=>null!==e.get()}))(n)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/help/plugin.js b/public/assets/tinymce/plugins/help/plugin.js
index 97336bf3ad12887e6fceeb5f39354a9684a23dd3..a8bdc10b5e7dd9272a7d4f8a60dae531b9658087 100644
--- a/public/assets/tinymce/plugins/help/plugin.js
+++ b/public/assets/tinymce/plugins/help/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),n=t("help_tabs"),a=t("forced_plugins"),o=(void 0,e=>undefined===e);const i=(!1,()=>false);class s{constructor(e,t){this.tag=e,this.value=t}static some(e){return new s(!0,e)}static none(){return s.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?s.some(e(this.value)):s.none()}bind(e){return this.tag?e(this.value):s.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:s.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?s.none():s.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}s.singletonNone=new s(!1);const r=Array.prototype.indexOf,l=(e,t)=>{const n=e.length,a=new Array(n);for(let o=0;o<n;o++){const n=e[o];a[o]=t(n,o)}return a},c=(e,t)=>{const n=[];for(let a=0,o=e.length;a<o;a++){const o=e[a];t(o,a)&&n.push(o)}return n},u=Object.keys,h=Object.hasOwnProperty,m=(e,t)=>h.call(e,t);var p=tinymce.util.Tools.resolve("tinymce.Env");const d=e=>{const t=p.os.isMacOS()||p.os.isiOS(),n=t?{alt:"&#x2325;",ctrl:"&#x2303;",shift:"&#x21E7;",meta:"&#x2318;",access:"&#x2303;&#x2325;"}:{meta:"Ctrl ",access:"Shift + Alt "},a=e.split("+"),o=l(a,(e=>{const t=e.toLowerCase().trim();return m(n,t)?n[t]:e}));return t?o.join("").replace(/\s/,""):o.join("+")},g=[{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"}],y=()=>({name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:l(g,(e=>{const t=l(e.shortcuts,d).join(" or ");return[e.action,t]}))}]});var b=tinymce.util.Tools.resolve("tinymce.util.I18n");const k=l([{key:"advlist",name:"Advanced List"},{key:"anchor",name:"Anchor"},{key:"autolink",name:"Autolink"},{key:"autoresize",name:"Autoresize"},{key:"autosave",name:"Autosave"},{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:"fullscreen",name:"Full Screen"},{key:"help",name:"Help"},{key:"image",name:"Image"},{key:"importcss",name:"Import CSS"},{key:"insertdatetime",name:"Insert Date/Time"},{key:"link",name:"Link"},{key:"lists",name:"Lists"},{key:"media",name:"Media"},{key:"nonbreaking",name:"Nonbreaking"},{key:"pagebreak",name:"Page Break"},{key:"preview",name:"Preview"},{key:"quickbars",name:"Quick Toolbars"},{key:"save",name:"Save"},{key:"searchreplace",name:"Search and Replace"},{key:"table",name:"Table"},{key:"template",name:"Template"},{key:"textcolor",name:"Text Color"},{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:"editimage",name:"Enhanced Image Editing",type:"premium"},{key:"mediaembed",name:"Enhanced Media Embed",type:"premium",slug:"introduction-to-mediaembed"},{key:"export",name:"Export",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",slug:"introduction-to-powerpaste"},{key:"rtc",name:"Real-Time Collaboration",type:"premium",slug:"rtc-introduction"},{key:"tinymcespellchecker",name:"Spell Checker Pro",type:"premium",slug:"introduction-to-tiny-spellchecker"},{key:"tinycomments",name:"Tiny Comments",type:"premium",slug:"introduction-to-tiny-comments"},{key:"tinydrive",name:"Tiny Drive",type:"premium",slug:"tinydrive-introduction"},{key:"tableofcontents",name:"Table of Contents",type:"premium"}],(e=>({...e,type:e.type||"opensource",slug:e.slug||e.key}))),v=e=>{const t=e=>`<a href="${e.url}" target="_blank" rel="noopener">${e.name}</a>`,n=e=>{const n=(e=>{const t=u(e.plugins),n=a(e);return o(n)?t:c(t,(e=>!(((e,t)=>r.call(e,t))(n,e)>-1)))})(e),h=l(n,(n=>"<li>"+((e,n)=>{return(a=k,o=e=>e.key===n,((e,t,n)=>{for(let a=0,o=e.length;a<o;a++){const o=e[a];if(t(o,a))return s.some(o);if(n(o,a))break}return s.none()})(a,o,i)).fold((()=>{const a=e.plugins[n].getMetadata;return"function"==typeof a?t(a()):n}),(e=>{const n="premium"===e.type?`${e.name}*`:e.name;return t({name:n,url:`https://www.tiny.cloud/docs/tinymce/6/${e.slug}/`})}));var a,o})(e,n)+"</li>")),m=h.length,p=h.join("");return"<p><b>"+b.translate(["Plugins installed ({0}):",m])+"</b></p><ul>"+p+"</ul>"},h={type:"htmlpanel",presets:"document",html:[(e=>null==e?"":'<div data-mce-tabstop="1" tabindex="-1">'+n(e)+"</div>")(e),(()=>{const e=c(k,(({key:e,type:t})=>"autocorrect"!==e&&"premium"===t)),t=l(e,(e=>"<li>"+b.translate(e.name)+"</li>")).join("");return'<div data-mce-tabstop="1" tabindex="-1"><p><b>'+b.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">'+b.translate("Learn more...")+"</a></li></ul></div>"})()].join("")};return{name:"plugins",title:"Plugins",items:[h]}};var f=tinymce.util.Tools.resolve("tinymce.EditorManager");const w=(e,t)=>()=>{const{tabs:a,names:o}=((e,t)=>{const a=y(),o={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>"}]},i=v(e),r=(()=>{var e,t;const n='<a href="https://www.tiny.cloud/docs/tinymce/6/changelog/?utm_campaign=editor_referral&utm_medium=help_dialog&utm_source=tinymce" target="_blank">TinyMCE '+(e=f.majorVersion,t=f.minorVersion,(0===e.indexOf("@")?"X.X.X":e+"."+t)+"</a>");return{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"<p>"+b.translate(["You are using {0}",n])+"</p>",presets:"document"}]}})(),c={[a.name]:a,[o.name]:o,[i.name]:i,[r.name]:r,...t.get()};return s.from(n(e)).fold((()=>(e=>{const t=u(e),n=t.indexOf("versions");return-1!==n&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t}})(c)),(e=>((e,t)=>{const n={},a=l(e,(e=>"string"==typeof e?(m(t,e)&&(n[e]=t[e]),e):(n[e.name]=e,e.name)));return{tabs:n,names:a}})(e,c)))})(e,t),i={type:"tabpanel",tabs:(e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t<e.length;t++)e[t].each(n);return t})(l(o,(e=>{return m(t=a,n=e)?s.from(t[n]):s.none();var t,n})))};e.windowManager.open({title:"Help",size:"medium",body:i,buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{}})};e.add("help",(e=>{const t=(e=>{let t={};return{get:()=>t,set:e=>{t=e}}})(),n=(e=>({addTab:t=>{const n=e.get();n[t.name]=t,e.set(n)}}))(t);(e=>{(0,e.options.register)("help_tabs",{processor:"array"})})(e);const a=w(e,t);return((e,t)=>{e.ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:t}),e.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:t})})(e,a),((e,t)=>{e.addCommand("mceHelp",t)})(e,a),e.shortcuts.add("Alt+0","Open help dialog","mceHelp"),n}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/image/plugin.js b/public/assets/tinymce/plugins/image/plugin.js
index 96a08116ef7c4c26801988ed9968d18a190ecd66..857571de8234f9e126d1419b6cdf0e71d67d3c9b 100644
--- a/public/assets/tinymce/plugins/image/plugin.js
+++ b/public/assets/tinymce/plugins/image/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=Object.getPrototypeOf,a=(e,t,a)=>{var i;return!!a(e,t.prototype)||(null===(i=e.constructor)||void 0===i?void 0:i.name)===t.name},i=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&a(e,String,((e,t)=>t.isPrototypeOf(e)))?"string":t})(t)===e,s=e=>t=>typeof t===e,r=i("string"),o=i("object"),n=e=>((e,i)=>o(e)&&a(e,i,((e,a)=>t(e)===a)))(e,Object),l=i("array"),c=(null,e=>null===e);const m=s("boolean"),d=e=>!(e=>null==e)(e),g=s("function"),p=s("number"),u=()=>{};class h{constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return d(e)?h.some(e):h.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}h.singletonNone=new h(!1);const b=Object.keys,y=Object.hasOwnProperty,v=(e,t)=>y.call(e,t),f=Array.prototype.push,w=e=>{const t=[];for(let a=0,i=e.length;a<i;++a){if(!l(e[a]))throw new Error("Arr.flatten item "+a+" was not an array, input: "+e);f.apply(t,e[a])}return t};"undefined"!=typeof window?window:Function("return this;")();const A=(e,t,a)=>{((e,t,a)=>{if(!(r(a)||m(a)||p(a)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",a,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,a+"")})(e.dom,t,a)},D=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},_=D;var C=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),I=tinymce.util.Tools.resolve("tinymce.util.URI");const U=e=>e.length>0,x=e=>t=>t.options.get(e),S=x("image_dimensions"),N=x("image_advtab"),T=x("image_uploadtab"),O=x("image_prepend_url"),L=x("image_class_list"),E=x("image_description"),j=x("image_title"),M=x("image_caption"),R=x("image_list"),k=x("a11y_advanced_options"),z=x("automatic_uploads"),P=(e,t)=>Math.max(parseInt(e,10),parseInt(t,10)),B=e=>(e&&(e=e.replace(/px$/,"")),e),F=e=>(e.length>0&&/^[0-9]+$/.test(e)&&(e+="px"),e),H=e=>"IMG"===e.nodeName&&(e.hasAttribute("data-mce-object")||e.hasAttribute("data-mce-placeholder")),G=(e,t)=>{const a=e.options.get;return I.isDomSafe(t,"img",{allow_html_data_urls:a("allow_html_data_urls"),allow_script_urls:a("allow_script_urls"),allow_svg_data_urls:a("allow_svg_data_urls")})},W=C.DOM,$=e=>e.style.marginLeft&&e.style.marginRight&&e.style.marginLeft===e.style.marginRight?B(e.style.marginLeft):"",V=e=>e.style.marginTop&&e.style.marginBottom&&e.style.marginTop===e.style.marginBottom?B(e.style.marginTop):"",K=e=>e.style.borderWidth?B(e.style.borderWidth):"",Z=(e,t)=>e.hasAttribute(t)?e.getAttribute(t):"",q=(e,t)=>e.style[t]?e.style[t]:"",J=e=>null!==e.parentNode&&"FIGURE"===e.parentNode.nodeName,Q=(e,t,a)=>{""===a?e.removeAttribute(t):e.setAttribute(t,a)},X=(e,t)=>{const a=e.getAttribute("style"),i=t(null!==a?a:"");i.length>0?(e.setAttribute("style",i),e.setAttribute("data-mce-style",i)):e.removeAttribute("style")},Y=(e,t)=>(e,a,i)=>{e.style[a]?(e.style[a]=F(i),X(e,t)):Q(e,a,i)},ee=(e,t)=>e.style[t]?B(e.style[t]):Z(e,t),te=(e,t)=>{const a=F(t);e.style.marginLeft=a,e.style.marginRight=a},ae=(e,t)=>{const a=F(t);e.style.marginTop=a,e.style.marginBottom=a},ie=(e,t)=>{const a=F(t);e.style.borderWidth=a},se=(e,t)=>{e.style.borderStyle=t},re=e=>"FIGURE"===e.nodeName,oe=e=>0===W.getAttrib(e,"alt").length&&"presentation"===W.getAttrib(e,"role"),ne=e=>oe(e)?"":Z(e,"alt"),le=(e,t)=>{const a=document.createElement("img");return Q(a,"style",t.style),($(a)||""!==t.hspace)&&te(a,t.hspace),(V(a)||""!==t.vspace)&&ae(a,t.vspace),(K(a)||""!==t.border)&&ie(a,t.border),((e=>q(e,"borderStyle"))(a)||""!==t.borderStyle)&&se(a,t.borderStyle),e(a.getAttribute("style"))},ce=(e,t)=>({src:Z(t,"src"),alt:ne(t),title:Z(t,"title"),width:ee(t,"width"),height:ee(t,"height"),class:Z(t,"class"),style:e(Z(t,"style")),caption:J(t),hspace:$(t),vspace:V(t),border:K(t),borderStyle:q(t,"borderStyle"),isDecorative:oe(t)}),me=(e,t,a,i,s)=>{a[i]!==t[i]&&s(e,i,a[i])},de=(e,t,a)=>{if(a){W.setAttrib(e,"role","presentation");const t=_(e);A(t,"alt","")}else{if(c(t)){"alt",_(e).dom.removeAttribute("alt")}else{const a=_(e);A(a,"alt",t)}"presentation"===W.getAttrib(e,"role")&&W.setAttrib(e,"role","")}},ge=(e,t)=>(a,i,s)=>{e(a,s),X(a,t)},pe=(e,t,a)=>{const i=ce(e,a);me(a,i,t,"caption",((e,t,a)=>(e=>{J(e)?(e=>{const t=e.parentNode;W.insertAfter(e,t),W.remove(t)})(e):(e=>{const t=W.create("figure",{class:"image"});W.insertAfter(t,e),t.appendChild(e),t.appendChild(W.create("figcaption",{contentEditable:"true"},"Caption")),t.contentEditable="false"})(e)})(e))),me(a,i,t,"src",Q),me(a,i,t,"title",Q),me(a,i,t,"width",Y(0,e)),me(a,i,t,"height",Y(0,e)),me(a,i,t,"class",Q),me(a,i,t,"style",ge(((e,t)=>Q(e,"style",t)),e)),me(a,i,t,"hspace",ge(te,e)),me(a,i,t,"vspace",ge(ae,e)),me(a,i,t,"border",ge(ie,e)),me(a,i,t,"borderStyle",ge(se,e)),((e,t,a)=>{a.alt===t.alt&&a.isDecorative===t.isDecorative||de(e,a.alt,a.isDecorative)})(a,i,t)},ue=(e,t)=>{const a=(e=>{if(e.margin){const 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})(e.dom.styles.parse(t)),i=e.dom.styles.parse(e.dom.styles.serialize(a));return e.dom.styles.serialize(i)},he=e=>{const t=e.selection.getNode(),a=e.dom.getParent(t,"figure.image");return a?e.dom.select("img",a)[0]:t&&("IMG"!==t.nodeName||H(t))?null:t},be=(e,t)=>{const a=e.dom,i=((t,a)=>{const i={};var s;return((e,t,a,i)=>{((e,t)=>{const a=b(e);for(let i=0,s=a.length;i<s;i++){const s=a[i];t(e[s],s)}})(e,((e,s)=>{(t(e,s)?a:i)(e,s)}))})(t,((t,a)=>!e.schema.isValidChild(a,"figure")),(s=i,(e,t)=>{s[t]=e}),u),i})(e.schema.getTextBlockElements()),s=a.getParent(t.parentNode,(e=>{return t=i,a=e.nodeName,v(t,a)&&void 0!==t[a]&&null!==t[a];var t,a}),e.getBody());return s?a.split(s,t):t},ye=(e,t)=>{const a=((t,a)=>{const i=document.createElement("img");if(pe((t=>ue(e,t)),{...a,caption:!1},i),de(i,a.alt,a.isDecorative),a.caption){const e=W.create("figure",{class:"image"});return e.appendChild(i),e.appendChild(W.create("figcaption",{contentEditable:"true"},"Caption")),e.contentEditable="false",e}return i})(0,t);e.dom.setAttrib(a,"data-mce-id","__mcenew"),e.focus(),e.selection.setContent(a.outerHTML);const i=e.dom.select('*[data-mce-id="__mcenew"]')[0];if(e.dom.setAttrib(i,"data-mce-id",null),re(i)){const t=be(e,i);e.selection.select(t)}else e.selection.select(i)},ve=(e,t)=>{const a=he(e);if(a){const i={...ce((t=>ue(e,t)),a),...t},s=((e,t)=>{const a=t.src;return{...t,src:G(e,a)?a:""}})(e,i);i.src?((e,t)=>{const a=he(e);if(pe((t=>ue(e,t)),t,a),((e,t)=>{e.dom.setAttrib(t,"src",t.getAttribute("src"))})(e,a),re(a.parentNode)){const t=a.parentNode;be(e,t),e.selection.select(a.parentNode)}else e.selection.select(a),((e,t,a)=>{const i=()=>{a.onload=a.onerror=null,e.selection&&(e.selection.select(a),e.nodeChanged())};a.onload=()=>{t.width||t.height||!S(e)||e.dom.setAttribs(a,{width:String(a.clientWidth),height:String(a.clientHeight)}),i()},a.onerror=i})(e,t,a)})(e,s):((e,t)=>{if(t){const a=e.dom.is(t.parentNode,"figure.image")?t.parentNode:t;e.dom.remove(a),e.focus(),e.nodeChanged(),e.dom.isEmpty(e.getBody())&&(e.setContent(""),e.selection.setCursorLocation())}})(e,a)}else t.src&&ye(e,{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1,...t})},fe=(we=(e,t)=>n(e)&&n(t)?fe(e,t):t,(...e)=>{if(0===e.length)throw new Error("Can't merge zero objects");const t={};for(let a=0;a<e.length;a++){const i=e[a];for(const e in i)v(i,e)&&(t[e]=we(t[e],i[e]))}return t});var we,Ae=tinymce.util.Tools.resolve("tinymce.util.ImageUploader"),De=tinymce.util.Tools.resolve("tinymce.util.Tools");const _e=e=>r(e.value)?e.value:"",Ce=(e,t)=>{const a=[];return De.each(e,(e=>{const i=(e=>r(e.text)?e.text:r(e.title)?e.title:"")(e);if(void 0!==e.menu){const s=Ce(e.menu,t);a.push({text:i,items:s})}else{const s=t(e);a.push({text:i,value:s})}})),a},Ie=(e=_e)=>t=>t?h.from(t).map((t=>Ce(t,e))):h.none(),Ue=(e,t)=>((e,a)=>{for(let a=0;a<e.length;a++){const s=(e=>v(e,"items"))(i=e[a])?Ue(i.items,t):i.value===t?h.some(i):h.none();if(s.isSome())return s}var i;return h.none()})(e),xe=Ie,Se=(e,t)=>e.bind((e=>Ue(e,t))),Ne=e=>{const t=xe((t=>e.convertURL(t.value||t.url,"src"))),a=new Promise((a=>{((e,t)=>{const a=R(e);r(a)?fetch(a).then((e=>{e.ok&&e.json().then(t)})):g(a)?a(t):t(a)})(e,(e=>{a(t(e).map((e=>w([[{text:"None",value:""}],e]))))}))})),i=(A=L(e),Ie(_e)(A)),s=N(e),o=T(e),n=(e=>U(e.options.get("images_upload_url")))(e),l=(e=>d(e.options.get("images_upload_handler")))(e),c=(e=>{const t=he(e);return t?ce((t=>ue(e,t)),t):{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1}})(e),m=E(e),p=j(e),u=S(e),b=M(e),y=k(e),v=z(e),f=h.some(O(e)).filter((e=>r(e)&&e.length>0));var A;return a.then((e=>({image:c,imageList:e,classList:i,hasAdvTab:s,hasUploadTab:o,hasUploadUrl:n,hasUploadHandler:l,hasDescription:m,hasImageTitle:p,hasDimensions:u,hasImageCaption:b,prependURL:f,hasAccessibilityOptions:y,automaticUploads:v})))},Te=e=>{const t=e.imageList.map((e=>({name:"images",type:"listbox",label:"Image list",items:e}))),a={name:"alt",type:"input",label:"Alternative description",enabled:!(e.hasAccessibilityOptions&&e.image.isDecorative)},i=e.classList.map((e=>({name:"classes",type:"listbox",label:"Class",items:e})));return w([[{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?[a]:[],e.hasImageTitle?[{name:"title",type:"input",label:"Image title"}]:[],e.hasDimensions?[{name:"dimensions",type:"sizeinput"}]:[],[{...(s=e.classList.isSome()&&e.hasImageCaption,s?{type:"grid",columns:2}:{type:"panel"}),items:w([i.toArray(),e.hasImageCaption?[{type:"label",label:"Caption",items:[{type:"checkbox",name:"caption",label:"Show caption"}]}]:[]])}]]);var s},Oe=e=>({title:"General",name:"general",items:Te(e)}),Le=Te,Ee=e=>({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}),je=(e,t)=>({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}),Me=(e,t,a,i)=>{((e,t)=>{const a=t.getData();((e,t)=>/^(?:[a-zA-Z]+:)?\/\//.test(t)?h.none():e.prependURL.bind((e=>t.substring(0,e.length)!==e?h.some(e+t):h.none())))(e,a.src.value).each((e=>{t.setData({src:{value:e,meta:a.src.meta}})}))})(t,i),((e,t)=>{const a=t.getData(),i=a.src.meta;if(void 0!==i){const s=fe({},a);((e,t,a)=>{e.hasDescription&&r(a.alt)&&(t.alt=a.alt),e.hasAccessibilityOptions&&(t.isDecorative=a.isDecorative||t.isDecorative||!1),e.hasImageTitle&&r(a.title)&&(t.title=a.title),e.hasDimensions&&(r(a.width)&&(t.dimensions.width=a.width),r(a.height)&&(t.dimensions.height=a.height)),r(a.class)&&Se(e.classList,a.class).each((e=>{t.classes=e.value})),e.hasImageCaption&&m(a.caption)&&(t.caption=a.caption),e.hasAdvTab&&(r(a.style)&&(t.style=a.style),r(a.vspace)&&(t.vspace=a.vspace),r(a.border)&&(t.border=a.border),r(a.hspace)&&(t.hspace=a.hspace),r(a.borderstyle)&&(t.borderstyle=a.borderstyle))})(e,s,i),t.setData(s)}})(t,i),((e,t,a,i)=>{const s=i.getData(),r=s.src.value,o=s.src.meta||{};o.width||o.height||!t.hasDimensions||(U(r)?e.imageSize(r).then((e=>{a.open&&i.setData({dimensions:e})})).catch((e=>console.error(e))):i.setData({dimensions:{width:"",height:""}}))})(e,t,a,i),((e,t,a)=>{const i=a.getData(),s=Se(e.imageList,i.src.value);t.prevImage=s,a.setData({images:s.map((e=>e.value)).getOr("")})})(t,a,i)},Re=(e,t,a,i)=>{const s=i.getData();var r;i.block("Uploading image"),(r=s.fileinput,((e,t)=>0<e.length?h.some(e[0]):h.none())(r)).fold((()=>{i.unblock()}),(s=>{const r=URL.createObjectURL(s),o=()=>{i.unblock(),URL.revokeObjectURL(r)},n=s=>{i.setData({src:{value:s,meta:{}}}),i.showTab("general"),Me(e,t,a,i)};var l;(l=s,new Promise(((e,t)=>{const a=new FileReader;a.onload=()=>{e(a.result)},a.onerror=()=>{t(a.error.message)},a.readAsDataURL(l)}))).then((a=>{const l=e.createBlobCache(s,r,a);t.automaticUploads?e.uploadImage(l).then((e=>{n(e.url),o()})).catch((t=>{o(),e.alertErr(t)})):(e.addToBlobCache(l),n(l.blobUri()),i.unblock())}))}))},ke=(e,t,a)=>(i,s)=>{"src"===s.name?Me(e,t,a,i):"images"===s.name?((e,t,a,i)=>{const s=i.getData(),r=Se(t.imageList,s.images);r.each((e=>{const t=""===s.alt||a.prevImage.map((e=>e.text===s.alt)).getOr(!1);t?""===e.value?i.setData({src:e,alt:a.prevAlt}):i.setData({src:e,alt:e.text}):i.setData({src:e})})),a.prevImage=r,Me(e,t,a,i)})(e,t,a,i):"alt"===s.name?a.prevAlt=i.getData().alt:"fileinput"===s.name?Re(e,t,a,i):"isDecorative"===s.name&&i.setEnabled("alt",!i.getData().isDecorative)},ze=e=>()=>{e.open=!1},Pe=e=>e.hasAdvTab||e.hasUploadUrl||e.hasUploadHandler?{type:"tabpanel",tabs:w([[Oe(e)],e.hasAdvTab?[{title:"Advanced",name:"advanced",items:[{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"}]}]}]}]:[],e.hasUploadTab&&(e.hasUploadUrl||e.hasUploadHandler)?[{title:"Upload",name:"upload",items:[{type:"dropzone",name:"fileinput"}]}]:[]])}:{type:"panel",items:Le(e)},Be=(e,t,a)=>i=>{const s=fe(Ee(t.image),i.getData()),r={...s,style:le(a.normalizeCss,je(s,!1))};e.execCommand("mceUpdateImage",!1,je(r,t.hasAccessibilityOptions)),e.editorUpload.uploadImagesAuto(),i.close()},Fe=e=>t=>G(e,t)?(e=>new Promise((t=>{const a=document.createElement("img"),i=e=>{a.onload=a.onerror=null,a.parentNode&&a.parentNode.removeChild(a),t(e)};a.onload=()=>{const e={width:P(a.width,a.clientWidth),height:P(a.height,a.clientHeight)};i(Promise.resolve(e))},a.onerror=()=>{i(Promise.reject(`Failed to get image dimensions for: ${e}`))};const s=a.style;s.visibility="hidden",s.position="fixed",s.bottom=s.left="0px",s.width=s.height="auto",document.body.appendChild(a),a.src=e})))(e.documentBaseURI.toAbsolute(t)).then((e=>({width:String(e.width),height:String(e.height)}))):Promise.resolve({width:"",height:""}),He=e=>(t,a,i)=>e.editorUpload.blobCache.create({blob:t,blobUri:a,name:t.name?t.name.replace(/\.[^\.]+$/,""):null,filename:t.name,base64:i.split(",")[1]}),Ge=e=>t=>{e.editorUpload.blobCache.add(t)},We=e=>t=>{e.windowManager.alert(t)},$e=e=>t=>ue(e,t),Ve=e=>t=>e.dom.parseStyle(t),Ke=e=>(t,a)=>e.dom.serializeStyle(t,a),Ze=e=>t=>Ae(e).upload([t],!1).then((e=>0===e.length?Promise.reject("Failed to upload image"):!1===e[0].status?Promise.reject(e[0].error.message):e[0])),qe=e=>{const t={imageSize:Fe(e),addToBlobCache:Ge(e),createBlobCache:He(e),alertErr:We(e),normalizeCss:$e(e),parseStyle:Ve(e),serializeStyle:Ke(e),uploadImage:Ze(e)};return{open:()=>{Ne(e).then((a=>{const i=(e=>({prevImage:Se(e.imageList,e.image.src),prevAlt:e.image.alt,open:!0}))(a);return{title:"Insert/Edit Image",size:"normal",body:Pe(a),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:Ee(a.image),onSubmit:Be(e,a,t),onChange:ke(t,a,i),onClose:ze(i)}})).then(e.windowManager.open)}}},Je=e=>{const t=e.attr("class");return t&&/\bimage\b/.test(t)},Qe=e=>t=>{let a=t.length;const i=t=>{t.attr("contenteditable",e?"true":null)};for(;a--;){const s=t[a];Je(s)&&(s.attr("contenteditable",e?"false":null),De.each(s.getAll("figcaption"),i))}};e.add("image",(e=>{(e=>{const t=e.options.register;t("image_dimensions",{processor:"boolean",default:!0}),t("image_advtab",{processor:"boolean",default:!1}),t("image_uploadtab",{processor:"boolean",default:!0}),t("image_prepend_url",{processor:"string",default:""}),t("image_class_list",{processor:"object[]"}),t("image_description",{processor:"boolean",default:!0}),t("image_title",{processor:"boolean",default:!1}),t("image_caption",{processor:"boolean",default:!1}),t("image_list",{processor:e=>{const t=!1===e||r(e)||((e,t)=>{if(l(e)){for(let a=0,i=e.length;a<i;++a)if(!t(e[a]))return!1;return!0}return!1})(e,o)||g(e);return t?{value:e,valid:t}:{valid:!1,message:"Must be false, a string, an array or a function."}},default:!1})})(e),(e=>{e.on("PreInit",(()=>{e.parser.addNodeFilter("figure",Qe(!0)),e.serializer.addNodeFilter("figure",Qe(!1))}))})(e),(e=>{e.ui.registry.addToggleButton("image",{icon:"image",tooltip:"Insert/edit image",onAction:qe(e).open,onSetup:t=>(t.setActive(d(he(e))),e.selection.selectorChangedWithUnbind("img:not([data-mce-object]):not([data-mce-placeholder]),figure.image",t.setActive).unbind)}),e.ui.registry.addMenuItem("image",{icon:"image",text:"Image...",onAction:qe(e).open}),e.ui.registry.addContextMenu("image",{update:e=>re(e)||"IMG"===e.nodeName&&!H(e)?["image"]:[]})})(e),(e=>{e.addCommand("mceImage",qe(e).open),e.addCommand("mceUpdateImage",((t,a)=>{e.undoManager.transact((()=>ve(e,a)))}))})(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/importcss/plugin.js b/public/assets/tinymce/plugins/importcss/plugin.js
index 4e2ed0c71add130079cb52b042a873ecd2d1edcd..d29b33720683dbdeae707ff0ba1db056d9a7f937 100644
--- a/public/assets/tinymce/plugins/importcss/plugin.js
+++ b/public/assets/tinymce/plugins/importcss/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(s=r=e,(o=String).prototype.isPrototypeOf(s)||(null===(n=r.constructor)||void 0===n?void 0:n.name)===o.name)?"string":t;var s,r,o,n})(t)===e,s=t("string"),r=t("object"),o=t("array"),n=("function",e=>"function"==typeof e);var c=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),i=tinymce.util.Tools.resolve("tinymce.EditorManager"),l=tinymce.util.Tools.resolve("tinymce.Env"),a=tinymce.util.Tools.resolve("tinymce.util.Tools");const p=e=>t=>t.options.get(e),u=p("importcss_merge_classes"),m=p("importcss_exclusive"),f=p("importcss_selector_converter"),y=p("importcss_selector_filter"),d=p("importcss_groups"),h=p("importcss_append"),_=p("importcss_file_filter"),g=p("skin"),v=p("skin_url"),b=Array.prototype.push,x=/^\.(?:ephox|tiny-pageembed|mce)(?:[.-]+\w+)+$/,T=e=>s(e)?t=>-1!==t.indexOf(e):e instanceof RegExp?t=>e.test(t):e,S=(e,t)=>{let s;const r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(!r)return;const o=r[1],n=r[2].substr(1).split(".").join(" "),c=a.makeMap("a,img");return r[1]?(s={title:t},e.schema.getTextBlockElements()[o]?s.block=o:e.schema.getBlockElements()[o]||c[o.toLowerCase()]?s.selector=o:s.inline=o):r[2]&&(s={inline:"span",title:t.substr(1),classes:n}),u(e)?s.classes=n:s.attributes={class:n},s},k=(e,t)=>null===t||m(e),w=e=>{e.on("init",(()=>{const t=(()=>{const e=[],t=[],s={};return{addItemToGroup:(e,r)=>{s[e]?s[e].push(r):(t.push(e),s[e]=[r])},addItem:t=>{e.push(t)},toFormats:()=>{return(r=t,n=e=>{const t=s[e];return 0===t.length?[]:[{title:e,items:t}]},(e=>{const t=[];for(let s=0,r=e.length;s<r;++s){if(!o(e[s]))throw new Error("Arr.flatten item "+s+" was not an array, input: "+e);b.apply(t,e[s])}return t})(((e,t)=>{const s=e.length,r=new Array(s);for(let o=0;o<s;o++){const s=e[o];r[o]=t(s,o)}return r})(r,n))).concat(e);var r,n}}})(),r={},n=T(y(e)),p=(e=>a.map(e,(e=>a.extend({},e,{original:e,selectors:{},filter:T(e.filter)}))))(d(e)),u=(t,s)=>{if(((e,t,s,r)=>!(k(e,s)?t in r:t in s.selectors))(e,t,s,r)){((e,t,s,r)=>{k(e,s)?r[t]=!0:s.selectors[t]=!0})(e,t,s,r);const o=((e,t,s,r)=>{let o;return o=r&&r.selector_converter?r.selector_converter:f(e)?f(e):()=>S(e,s),o.call(t,s,r)})(e,e.plugins.importcss,t,s);if(o){const t=o.name||c.DOM.uniqueId();return e.formatter.register(t,o),{title:o.title,format:t}}}return null};a.each(((e,t,r)=>{const o=[],n={},c=(t,n)=>{let p,u=t.href;if(u=(e=>{const t=l.cacheSuffix;return s(e)&&(e=e.replace("?"+t,"").replace("&"+t,"")),e})(u),u&&r(u,n)&&!((e,t)=>{const s=g(e);if(s){const r=v(e),o=r?e.documentBaseURI.toAbsolute(r):i.baseURL+"/skins/ui/"+s,n=i.baseURL+"/skins/content/";return t===o+"/content"+(e.inline?".inline":"")+".min.css"||-1!==t.indexOf(n)}return!1})(e,u)){a.each(t.imports,(e=>{c(e,!0)}));try{p=t.cssRules||t.rules}catch(e){}a.each(p,(e=>{e.styleSheet?c(e.styleSheet,!0):e.selectorText&&a.each(e.selectorText.split(","),(e=>{o.push(a.trim(e))}))}))}};a.each(e.contentCSS,(e=>{n[e]=!0})),r||(r=(e,t)=>t||n[e]);try{a.each(t.styleSheets,(e=>{c(e)}))}catch(e){}return o})(e,e.getDoc(),T(_(e))),(e=>{if(!x.test(e)&&(!n||n(e))){const s=((e,t)=>a.grep(e,(e=>!e.filter||e.filter(t))))(p,e);if(s.length>0)a.each(s,(s=>{const r=u(e,s);r&&t.addItemToGroup(s.title,r)}));else{const s=u(e,null);s&&t.addItem(s)}}}));const m=t.toFormats();e.dispatch("addStyleModifications",{items:m,replace:!h(e)})}))};e.add("importcss",(e=>((e=>{const t=e.options.register,o=e=>s(e)||n(e)||r(e);t("importcss_merge_classes",{processor:"boolean",default:!0}),t("importcss_exclusive",{processor:"boolean",default:!0}),t("importcss_selector_converter",{processor:"function"}),t("importcss_selector_filter",{processor:o}),t("importcss_file_filter",{processor:o}),t("importcss_groups",{processor:"object[]"}),t("importcss_append",{processor:"boolean",default:!1})})(e),w(e),(e=>({convertSelectorToFormat:t=>S(e,t)}))(e))))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/insertdatetime/plugin.js b/public/assets/tinymce/plugins/insertdatetime/plugin.js
index b89c345540e3a4810278a229e6ac245fe7521b7f..414e42f7c956d85759da8a78abdd01e18527024a 100644
--- a/public/assets/tinymce/plugins/insertdatetime/plugin.js
+++ b/public/assets/tinymce/plugins/insertdatetime/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),r=t("insertdatetime_dateformat"),a=t("insertdatetime_timeformat"),n=t("insertdatetime_formats"),s=t("insertdatetime_element"),i="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),o="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),l="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),m="January February March April May June July August September October November December".split(" "),c=(e,t)=>{if((e=""+e).length<t)for(let r=0;r<t-e.length;r++)e="0"+e;return e},d=(e,t,r=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",""+r.getFullYear())).replace("%y",""+r.getYear())).replace("%m",c(r.getMonth()+1,2))).replace("%d",c(r.getDate(),2))).replace("%H",""+c(r.getHours(),2))).replace("%M",""+c(r.getMinutes(),2))).replace("%S",""+c(r.getSeconds(),2))).replace("%I",""+((r.getHours()+11)%12+1))).replace("%p",r.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(m[r.getMonth()]))).replace("%b",""+e.translate(l[r.getMonth()]))).replace("%A",""+e.translate(o[r.getDay()]))).replace("%a",""+e.translate(i[r.getDay()]))).replace("%%","%"),u=(e,t)=>{if(s(e)){const r=d(e,t);let a;a=/%[HMSIp]/.test(t)?d(e,"%Y-%m-%dT%H:%M"):d(e,"%Y-%m-%d");const n=e.dom.getParent(e.selection.getStart(),"time");n?((e,t,r,a)=>{const n=e.dom.create("time",{datetime:r},a);t.parentNode.insertBefore(n,t),e.dom.remove(t),e.selection.select(n,!0),e.selection.collapse(!1)})(e,n,a,r):e.insertContent('<time datetime="'+a+'">'+r+"</time>")}else e.insertContent(d(e,t))};var p=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("insertdatetime",(e=>{(e=>{const t=e.options.register;t("insertdatetime_dateformat",{processor:"string",default:e.translate("%Y-%m-%d")}),t("insertdatetime_timeformat",{processor:"string",default:e.translate("%H:%M:%S")}),t("insertdatetime_formats",{processor:"string[]",default:["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"]}),t("insertdatetime_element",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mceInsertDate",((t,a)=>{u(e,null!=a?a:r(e))})),e.addCommand("mceInsertTime",((t,r)=>{u(e,null!=r?r:a(e))}))})(e),(e=>{const t=n(e),r=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})((e=>{const t=n(e);return t.length>0?t[0]:a(e)})(e)),s=t=>e.execCommand("mceInsertDate",!1,t);e.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:e=>e===r.get(),fetch:r=>{r(p.map(t,(t=>({type:"choiceitem",text:d(e,t),value:t}))))},onAction:e=>{s(r.get())},onItemAction:(e,t)=>{r.set(t),s(t)}});const i=e=>()=>{r.set(e),s(e)};e.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:()=>p.map(t,(t=>({type:"menuitem",text:d(e,t),onAction:i(t)})))})})(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/link/plugin.js b/public/assets/tinymce/plugins/link/plugin.js
index 3b80199eab56bc9d281e06c685d174676b26dc88..a0a747768599862ce4ee786c14e83397d7b21c9c 100644
--- a/public/assets/tinymce/plugins/link/plugin.js
+++ b/public/assets/tinymce/plugins/link/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.util.VK");const n=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(l=o.constructor)||void 0===l?void 0:l.name)===r.name)?"string":t;var n,o,r,l})(t)===e,o=e=>t=>typeof t===e,r=n("string"),l=n("object"),a=n("array"),s=(null,e=>null===e);const i=o("boolean"),c=o("function"),u=(e,t)=>{if(a(e)){for(let n=0,o=e.length;n<o;++n)if(!t(e[n]))return!1;return!0}return!1},g=()=>{},m=(e,t)=>e===t;class h{constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?h.none():h.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}h.singletonNone=new h(!1);const d=Array.prototype.indexOf,p=Array.prototype.push,f=e=>{const t=[];for(let n=0,o=e.length;n<o;++n){if(!a(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);p.apply(t,e[n])}return t},k=(e,t)=>{for(let n=0;n<e.length;n++){const o=t(e[n],n);if(o.isSome())return o}return h.none()},v=(e,t,n=m)=>e.exists((e=>n(e,t))),y=e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t<e.length;t++)e[t].each(n);return t},x=(e,t)=>e?h.some(t):h.none(),_=e=>t=>t.options.get(e),b=_("link_assume_external_targets"),w=_("link_context_toolbar"),C=_("link_list"),O=_("link_default_target"),N=_("link_default_protocol"),A=_("link_target_list"),T=_("link_rel_list"),S=_("link_class_list"),E=_("link_title"),R=_("allow_unsafe_link_target"),P=_("link_quicklink");var L=tinymce.util.Tools.resolve("tinymce.util.Tools");const M=e=>r(e.value)?e.value:"",D=(e,t)=>{const n=[];return L.each(e,(e=>{const o=(e=>r(e.text)?e.text:r(e.title)?e.title:"")(e);if(void 0!==e.menu){const r=D(e.menu,t);n.push({text:o,items:r})}else{const r=t(e);n.push({text:o,value:r})}})),n},B=(e=M)=>t=>h.from(t).map((t=>D(t,e))),I=e=>B(M)(e),j=B,K=(e,t)=>n=>({name:e,type:"listbox",label:t,items:n}),U=M,q=Object.keys,F=Object.hasOwnProperty,V=(e,t)=>F.call(e,t);var $=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),z=tinymce.util.Tools.resolve("tinymce.util.URI");const G=e=>e&&"a"===e.nodeName.toLowerCase(),H=e=>G(e)&&!!Q(e),J=(e,t)=>{if(e.collapsed)return[];{const n=e.cloneContents(),o=new $(n.firstChild,n),r=[];let l=n.firstChild;do{t(l)&&r.push(l)}while(l=o.next());return r}},W=e=>/^\w+:/i.test(e),Q=e=>e.getAttribute("data-mce-href")||e.getAttribute("href"),X=(e,t)=>{const n=["noopener"],o=e?e.split(/\s+/):[],r=e=>e.filter((e=>-1===L.inArray(n,e))),l=t?(e=>(e=r(e)).length>0?e.concat(n):n)(o):r(o);return l.length>0?(e=>L.trim(e.sort().join(" ")))(l):""},Y=(e,t)=>(t=t||e.selection.getNode(),ne(t)?e.dom.select("a[href]",t)[0]:e.dom.getParent(t,"a[href]")),Z=(e,t)=>(t?t.innerText||t.textContent:e.getContent({format:"text"})).replace(/\uFEFF/g,""),ee=e=>L.grep(e,H).length>0,te=e=>{const t=e.schema.getTextInlineElements();return 0===J(e.selection.getRng(),(e=>1===e.nodeType&&!G(e)&&!V(t,e.nodeName.toLowerCase()))).length},ne=e=>e&&"FIGURE"===e.nodeName&&/\bimage\b/i.test(e.className),oe=(e,t,n)=>{const o=e.selection.getNode(),r=Y(e,o),l=((e,t)=>{const n={...t};if(0===T(e).length&&!R(e)){const e=X(n.rel,"_blank"===n.target);n.rel=e||null}return h.from(n.target).isNone()&&!1===A(e)&&(n.target=O(e)),n.href=((e,t)=>"http"!==t&&"https"!==t||W(e)?e:t+"://"+e)(n.href,b(e)),n})(e,(e=>{return t=["title","rel","class","target"],n=(t,n)=>(e[n].each((e=>{t[n]=e.length>0?e:null})),t),o={href:e.href},((e,t)=>{for(let n=0,o=e.length;n<o;n++)t(e[n],n)})(t,((e,t)=>{o=n(o,e)})),o;var t,n,o})(n));e.undoManager.transact((()=>{n.href===t.href&&t.attach(),r?(e.focus(),((e,t,n,o)=>{n.each((e=>{V(t,"innerText")?t.innerText=e:t.textContent=e})),e.dom.setAttribs(t,o),e.selection.select(t)})(e,r,n.text,l)):((e,t,n,o)=>{ne(t)?ie(e,t,o):n.fold((()=>{e.execCommand("mceInsertLink",!1,o)}),(t=>{e.insertContent(e.dom.createHTML("a",o,e.dom.encode(t)))}))})(e,o,n.text,l)}))},re=e=>{const{class:t,href:n,rel:o,target:r,text:l,title:a}=e;return((e,t)=>{const n={};var o;return((e,t,n,o)=>{((e,t)=>{const n=q(e);for(let o=0,r=n.length;o<r;o++){const r=n[o];t(e[r],r)}})(e,((e,r)=>{(t(e,r)?n:o)(e,r)}))})(e,((e,t)=>!1===s(e)),(o=n,(e,t)=>{o[t]=e}),g),n})({class:t.getOrNull(),href:n,rel:o.getOrNull(),target:r.getOrNull(),text:l.getOrNull(),title:a.getOrNull()})},le=(e,t,n)=>{const o=((e,t)=>{const n=e.options.get,o={allow_html_data_urls:n("allow_html_data_urls"),allow_script_urls:n("allow_script_urls"),allow_svg_data_urls:n("allow_svg_data_urls")},r=t.href;return{...t,href:z.isDomSafe(r,"a",o)?r:""}})(e,n);e.hasPlugin("rtc",!0)?e.execCommand("createlink",!1,re(o)):oe(e,t,o)},ae=e=>{e.hasPlugin("rtc",!0)?e.execCommand("unlink"):(e=>{e.undoManager.transact((()=>{const t=e.selection.getNode();ne(t)?se(e,t):(e=>{const t=e.dom,n=e.selection,o=n.getBookmark(),r=n.getRng().cloneRange(),l=t.getParent(r.startContainer,"a[href]",e.getBody()),a=t.getParent(r.endContainer,"a[href]",e.getBody());l&&r.setStartBefore(l),a&&r.setEndAfter(a),n.setRng(r),e.execCommand("unlink"),n.moveToBookmark(o)})(e),e.focus()}))})(e)},se=(e,t)=>{const n=e.dom.select("img",t)[0];if(n){const o=e.dom.getParents(n,"a[href]",t)[0];o&&(o.parentNode.insertBefore(n,o),e.dom.remove(o))}},ie=(e,t,n)=>{const o=e.dom.select("img",t)[0];if(o){const t=e.dom.create("a",n);o.parentNode.insertBefore(t,o),t.appendChild(o)}},ce=(e,t)=>k(t,(t=>(e=>{return V(t=e,n="items")&&void 0!==t[n]&&null!==t[n];var t,n})(t)?ce(e,t.items):x(t.value===e,t))),ue=(e,t)=>{const n={text:e.text,title:e.title},o=(e,o)=>{const r=(l=t,a=o.name,"link"===a?l.link:"anchor"===a?l.anchor:h.none()).getOr([]);var l,a;return((e,t,n,o)=>{const r=o[t],l=e.length>0;return void 0!==r?ce(r,n).map((t=>({url:{value:t.value,meta:{text:l?e:t.text,attach:g}},text:l?e:t.text}))):h.none()})(n.text,o.name,r,e)};return{onChange:(e,t)=>{const r=t.name;return"url"===r?(e=>{const t=(o=e.url,x(n.text.length<=0,h.from(o.meta.text).getOr(o.value)));var o;const r=(e=>x(n.title.length<=0,h.from(e.meta.title).getOr("")))(e.url);return t.isSome()||r.isSome()?h.some({...t.map((e=>({text:e}))).getOr({}),...r.map((e=>({title:e}))).getOr({})}):h.none()})(e()):((e,t)=>d.call(e,t))(["anchor","link"],r)>-1?o(e(),t):"text"===r||"title"===r?(n[r]=e()[r],h.none()):h.none()}}};var ge=tinymce.util.Tools.resolve("tinymce.util.Delay");const me=e=>{const t=e.href;return t.indexOf("@")>0&&-1===t.indexOf("/")&&-1===t.indexOf("mailto:")?h.some({message:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",preprocess:e=>({...e,href:"mailto:"+t})}):h.none()},he=(e,t)=>n=>{const o=n.href;return 1===e&&!W(o)||0===e&&/^\s*www(\.|\d\.)/i.test(o)?h.some({message:`The URL you entered seems to be an external link. Do you want to add the required ${t}:// prefix?`,preprocess:e=>({...e,href:t+"://"+o})}):h.none()},de=e=>{const t=e.dom.select("a:not([href])"),n=f(((e,t)=>{const n=e.length,o=new Array(n);for(let r=0;r<n;r++){const n=e[r];o[r]=t(n,r)}return o})(t,(e=>{const t=e.name||e.id;return t?[{text:t,value:"#"+t}]:[]})));return n.length>0?h.some([{text:"None",value:""}].concat(n)):h.none()},pe=e=>{const t=S(e);return t.length>0?I(t):h.none()},fe=e=>{try{return h.some(JSON.parse(e))}catch(e){return h.none()}},ke=(e,t)=>{const n=T(e);if(n.length>0){const o=v(t,"_blank"),r=e=>X(U(e),o);return(!1===R(e)?j(r):I)(n)}return h.none()},ve=[{text:"Current window",value:""},{text:"New window",value:"_blank"}],ye=e=>{const t=A(e);return a(t)?I(t).orThunk((()=>h.some(ve))):!1===t?h.none():h.some(ve)},xe=(e,t,n)=>{const o=e.getAttrib(t,n);return null!==o&&o.length>0?h.some(o):h.none()},_e=(e,t)=>(e=>{const t=t=>e.convertURL(t.value||t.url,"href"),n=C(e);return new Promise((e=>{r(n)?fetch(n).then((e=>e.ok?e.text().then(fe):Promise.reject())).then(e,(()=>e(h.none()))):c(n)?n((t=>e(h.some(t)))):e(h.from(n))})).then((e=>e.bind(j(t)).map((e=>e.length>0?[{text:"None",value:""}].concat(e):e))))})(e).then((n=>{const o=((e,t)=>{const n=e.dom,o=te(e)?h.some(Z(e.selection,t)):h.none(),r=t?h.some(n.getAttrib(t,"href")):h.none(),l=t?h.from(n.getAttrib(t,"target")):h.none(),a=xe(n,t,"rel"),s=xe(n,t,"class");return{url:r,text:o,title:xe(n,t,"title"),target:l,rel:a,linkClass:s}})(e,t);return{anchor:o,catalogs:{targets:ye(e),rels:ke(e,o.target),classes:pe(e),anchor:de(e),link:n},optNode:h.from(t),flags:{titleEnabled:E(e)}}})),be=e=>{const t=(e=>{const t=Y(e);return _e(e,t)})(e);t.then((t=>{const n=((e,t)=>n=>{const o=n.getData();if(!o.url.value)return ae(e),void n.close();const r=e=>h.from(o[e]).filter((n=>!v(t.anchor[e],n))),l={href:o.url.value,text:r("text"),target:r("target"),rel:r("rel"),class:r("linkClass"),title:r("title")},a={href:o.url.value,attach:void 0!==o.url.meta&&o.url.meta.attach?o.url.meta.attach:g};((e,t)=>k([me,he(b(e),N(e))],(e=>e(t))).fold((()=>Promise.resolve(t)),(n=>new Promise((o=>{((e,t,n)=>{const o=e.selection.getRng();ge.setEditorTimeout(e,(()=>{e.windowManager.confirm(t,(t=>{e.selection.setRng(o),n(t)}))}))})(e,n.message,(e=>{o(e?n.preprocess(t):t)}))})))))(e,l).then((t=>{le(e,a,t)})),n.close()})(e,t);return((e,t,n)=>{const o=e.anchor.text.map((()=>({name:"text",type:"input",label:"Text to display"}))).toArray(),r=e.flags.titleEnabled?[{name:"title",type:"input",label:"Title"}]:[],l=((e,t)=>{const n=e.anchor,o=n.url.getOr("");return{url:{value:o,meta:{original:{value:o}}},text:n.text.getOr(""),title:n.title.getOr(""),anchor:o,link:o,rel:n.rel.getOr(""),target:n.target.or(t).getOr(""),linkClass:n.linkClass.getOr("")}})(e,h.from(O(n))),a=e.catalogs,s=ue(l,a);return{title:"Insert/Edit Link",size:"normal",body:{type:"panel",items:f([[{name:"url",type:"urlinput",filetype:"file",label:"URL"}],o,r,y([a.anchor.map(K("anchor","Anchors")),a.rels.map(K("rel","Rel")),a.targets.map(K("target","Open link in...")),a.link.map(K("link","Link list")),a.classes.map(K("linkClass","Class"))])])},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:l,onChange:(e,{name:t})=>{s.onChange(e.getData,{name:t}).each((t=>{e.setData(t)}))},onSubmit:t}})(t,n,e)})).then((t=>{e.windowManager.open(t)}))},we=(e,t)=>e.dom.getParent(t,"a[href]"),Ce=e=>we(e,e.selection.getStart()),Oe=(e,t)=>{if(t){const n=Q(t);if(/^#/.test(n)){const t=e.dom.select(n);t.length&&e.selection.scrollIntoView(t[0],!0)}else(e=>{const t=document.createElement("a");t.target="_blank",t.href=e,t.rel="noreferrer noopener";const n=document.createEvent("MouseEvents");n.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),((e,t)=>{document.body.appendChild(e),e.dispatchEvent(t),document.body.removeChild(e)})(t,n)})(t.href)}},Ne=e=>()=>{be(e)},Ae=e=>()=>{Oe(e,Ce(e))},Te=(e,t)=>(e.on("NodeChange",t),()=>e.off("NodeChange",t)),Se=e=>t=>{const n=()=>t.setActive(!e.mode.isReadOnly()&&null!==Y(e,e.selection.getNode()));return n(),Te(e,n)},Ee=e=>t=>{const n=()=>t.setEnabled(null!==Y(e,e.selection.getNode()));return n(),Te(e,n)},Re=e=>t=>{const n=t=>{return ee(t)||(n=e.selection.getRng(),J(n,H).length>0);var n},o=e.dom.getParents(e.selection.getStart());return t.setEnabled(n(o)),Te(e,(e=>t.setEnabled(n(e.parents))))};e.add("link",(e=>{(e=>{const t=e.options.register;t("link_assume_external_targets",{processor:e=>{const t=r(e)||i(e);return t?!0===e?{value:1,valid:t}:"http"===e||"https"===e?{value:e,valid:t}:{value:0,valid:t}:{valid:!1,message:"Must be a string or a boolean."}},default:!1}),t("link_context_toolbar",{processor:"boolean",default:!1}),t("link_list",{processor:e=>r(e)||c(e)||u(e,l)}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"}),t("link_target_list",{processor:e=>i(e)||u(e,l),default:!0}),t("link_rel_list",{processor:"object[]",default:[]}),t("link_class_list",{processor:"object[]",default:[]}),t("link_title",{processor:"boolean",default:!0}),t("allow_unsafe_link_target",{processor:"boolean",default:!1}),t("link_quicklink",{processor:"boolean",default:!1})})(e),(e=>{e.ui.registry.addToggleButton("link",{icon:"link",tooltip:"Insert/edit link",onAction:Ne(e),onSetup:Se(e)}),e.ui.registry.addButton("openlink",{icon:"new-tab",tooltip:"Open link",onAction:Ae(e),onSetup:Ee(e)}),e.ui.registry.addButton("unlink",{icon:"unlink",tooltip:"Remove link",onAction:()=>ae(e),onSetup:Re(e)})})(e),(e=>{e.ui.registry.addMenuItem("openlink",{text:"Open link",icon:"new-tab",onAction:Ae(e),onSetup:Ee(e)}),e.ui.registry.addMenuItem("link",{icon:"link",text:"Link...",shortcut:"Meta+K",onAction:Ne(e)}),e.ui.registry.addMenuItem("unlink",{icon:"unlink",text:"Remove link",onAction:()=>ae(e),onSetup:Re(e)})})(e),(e=>{e.ui.registry.addContextMenu("link",{update:t=>ee(e.dom.getParents(t,"a"))?"link unlink openlink":"link"})})(e),(e=>{const t=t=>{const n=e.selection.getNode();return t.setEnabled(null!==Y(e,n)),g};e.ui.registry.addContextForm("quicklink",{launch:{type:"contextformtogglebutton",icon:"link",tooltip:"Link",onSetup:Se(e)},label:"Link",predicate:t=>!!Y(e,t)&&w(e),initValue:()=>{const t=Y(e);return t?Q(t):""},commands:[{type:"contextformtogglebutton",icon:"link",tooltip:"Link",primary:!0,onSetup:t=>{const n=e.selection.getNode();return t.setActive(!!Y(e,n)),Se(e)(t)},onAction:t=>{const n=t.getValue(),o=(t=>{const n=Y(e),o=te(e);if(!n&&o){const o=Z(e.selection,n);return h.some(o.length>0?o:t)}return h.none()})(n);le(e,{href:n,attach:g},{href:n,text:o,title:h.none(),rel:h.none(),target:h.none(),class:h.none()}),(e=>{e.selection.collapse(!1)})(e),t.hide()}},{type:"contextformbutton",icon:"unlink",tooltip:"Remove link",onSetup:t,onAction:t=>{ae(e),t.hide()}},{type:"contextformbutton",icon:"new-tab",tooltip:"Open link",onSetup:t,onAction:t=>{Ae(e)(),t.hide()}}]})})(e),(e=>{e.on("click",(n=>{const o=we(e,n.target);o&&t.metaKeyPressed(n)&&(n.preventDefault(),Oe(e,o))})),e.on("keydown",(t=>{const n=Ce(e);n&&13===t.keyCode&&(e=>!0===e.altKey&&!1===e.shiftKey&&!1===e.ctrlKey&&!1===e.metaKey)(t)&&(t.preventDefault(),Oe(e,n))}))})(e),(e=>{e.addCommand("mceLink",(()=>{P(e)?e.dispatch("contexttoolbar-show",{toolbarKey:"quicklink"}):Ne(e)()}))})(e),(e=>{e.addShortcut("Meta+K","",(()=>{e.execCommand("mceLink")}))})(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/lists/plugin.js b/public/assets/tinymce/plugins/lists/plugin.js
index 2217f0b524a071fceebb9ea3aa903966528f9600..547dd8dc9d64d34f24aae2f6a6965d0500d5e75c 100644
--- a/public/assets/tinymce/plugins/lists/plugin.js
+++ b/public/assets/tinymce/plugins/lists/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(n=r=t,(o=String).prototype.isPrototypeOf(n)||(null===(s=r.constructor)||void 0===s?void 0:s.name)===o.name)?"string":e;var n,r,o,s})(e)===t,n=t=>e=>typeof e===t,r=e("string"),o=e("object"),s=e("array"),i=n("boolean"),a=n("function"),l=n("number"),d=()=>{},c=(t,e)=>t===e,u=t=>e=>!t(e),m=(!1,()=>false);class p{constructor(t,e){this.tag=t,this.value=e}static some(t){return new p(!0,t)}static none(){return p.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?p.some(t(this.value)):p.none()}bind(t){return this.tag?t(this.value):p.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:p.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return null==t?p.none():p.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}p.singletonNone=new p(!1);const g=Array.prototype.slice,h=Array.prototype.indexOf,f=Array.prototype.push,y=(t,e)=>{const n=t.length,r=new Array(n);for(let o=0;o<n;o++){const n=t[o];r[o]=e(n,o)}return r},C=(t,e)=>{for(let n=0,r=t.length;n<r;n++)e(t[n],n)},v=(t,e)=>{const n=[];for(let r=0,o=t.length;r<o;r++){const o=t[r];e(o,r)&&n.push(o)}return n},b=(t,e,n)=>(C(t,((t,r)=>{n=e(n,t,r)})),n),S=(t,e,n)=>{for(let r=0,o=t.length;r<o;r++){const o=t[r];if(e(o,r))return p.some(o);if(n(o,r))break}return p.none()},N=(t,e)=>S(t,e,m),L=(t,e)=>(t=>{const e=[];for(let n=0,r=t.length;n<r;++n){if(!s(t[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+t);f.apply(e,t[n])}return e})(y(t,e)),T=t=>{const e=g.call(t,0);return e.reverse(),e},O=(t,e)=>e>=0&&e<t.length?p.some(t[e]):p.none(),A=t=>O(t,0),k=t=>O(t,t.length-1),D=(t,e)=>{const n=[],r=a(e)?t=>((t,e)=>{for(let n=0,r=t.length;n<r;n++)if(e(t[n]))return!0;return!1})(n,(n=>e(n,t))):t=>((t,e)=>{return n=t,r=e,h.call(n,r)>-1;var n,r})(n,t);for(let e=0,o=t.length;e<o;e++){const o=t[e];r(o)||n.push(o)}return n},w=t=>{if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}},x=(t,e)=>{const n=(e||document).createElement(t);return w(n)},B=w,E=(t,e)=>t.dom===e.dom;"undefined"!=typeof window?window:Function("return this;")();const I=t=>t.dom.nodeName.toLowerCase(),M=(1,t=>1===(t=>t.dom.nodeType)(t));const P=t=>e=>M(e)&&I(e)===t,R=t=>p.from(t.dom.parentNode).map(B),U=t=>y(t.dom.childNodes,B),$=(t,e)=>{const n=t.dom.childNodes;return p.from(n[e]).map(B)},_=t=>$(t,0),H=t=>$(t,t.dom.childNodes.length-1),F=(t,e)=>{R(t).each((n=>{n.dom.insertBefore(e.dom,t.dom)}))},K=(t,e)=>{t.dom.appendChild(e.dom)},j=(t,e)=>{C(e,(e=>{K(t,e)}))},V=t=>{t.dom.textContent="",C(U(t),(t=>{z(t)}))},z=t=>{const e=t.dom;null!==e.parentNode&&e.parentNode.removeChild(e)};var Q=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),q=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),W=tinymce.util.Tools.resolve("tinymce.util.VK");const Z=Object.keys,G=(t,e)=>{const n=Z(t);for(let r=0,o=n.length;r<o;r++){const o=n[r];e(t[o],o)}},J=(t,e)=>{const n=t.dom;G(e,((t,e)=>{((t,e,n)=>{if(!(r(n)||i(n)||l(n)))throw console.error("Invalid call to Attribute.set. Key ",e,":: Value ",n,":: Element ",t),new Error("Attribute value was not simple");t.setAttribute(e,n+"")})(n,e,t)}))},X=t=>b(t.dom.attributes,((t,e)=>(t[e.name]=e.value,t)),{}),Y=t=>((t,e)=>B(t.dom.cloneNode(!0)))(t),tt=(t,e)=>{const n=((t,e)=>{const n=x(e),r=X(t);return J(n,r),n})(t,e);((t,e)=>{const n=(t=>p.from(t.dom.nextSibling).map(B))(t);n.fold((()=>{R(t).each((t=>{K(t,e)}))}),(t=>{F(t,e)}))})(t,n);const r=U(t);return j(n,r),z(t),n};var et=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),nt=tinymce.util.Tools.resolve("tinymce.util.Tools");const rt=t=>e=>e&&e.nodeName.toLowerCase()===t,ot=t=>e=>e&&t.test(e.nodeName),st=t=>t&&3===t.nodeType,it=ot(/^(OL|UL|DL)$/),at=ot(/^(OL|UL)$/),lt=rt("ol"),dt=ot(/^(LI|DT|DD)$/),ct=ot(/^(DT|DD)$/),ut=ot(/^(TH|TD)$/),mt=rt("br"),pt=(t,e)=>e&&!!t.schema.getTextBlockElements()[e.nodeName],gt=(t,e)=>t&&t.nodeName in e,ht=(t,e,n)=>{const r=t.isEmpty(e);return!(n&&t.select("span[data-mce-type=bookmark]",e).length>0)&&r},ft=(t,e)=>t.isChildOf(e,t.getRoot()),yt=t=>e=>e.options.get(t),Ct=yt("lists_indent_on_tab"),vt=yt("forced_root_block"),bt=yt("forced_root_block_attrs"),St=(t,e)=>{const n=t.dom,r=t.schema.getBlockElements(),o=n.createFragment(),s=vt(t),i=bt(t);let a,l,d;for(l=n.create(s,i),gt(e.firstChild,r)||o.appendChild(l);a=e.firstChild;){const t=a.nodeName;d||"SPAN"===t&&"bookmark"===a.getAttribute("data-mce-type")||(d=!0),gt(a,r)?(o.appendChild(a),l=null):(l||(l=n.create(s,i),o.appendChild(l)),l.appendChild(a))}return d||l.appendChild(n.create("br",{"data-mce-bogus":"1"})),o},Nt=et.DOM,Lt=P("dd"),Tt=P("dt"),Ot=t=>{Tt(t)&&tt(t,"dd")},At=(t,e,n)=>{C(n,"Indent"===e?Ot:e=>((t,e)=>{Lt(e)?tt(e,"dt"):Tt(e)&&R(e).each((n=>((t,e,n)=>{const r=Nt.select('span[data-mce-type="bookmark"]',e),o=St(t,n),s=Nt.createRng();s.setStartAfter(n),s.setEndAfter(e);const i=s.extractContents();for(let e=i.firstChild;e;e=e.firstChild)if("LI"===e.nodeName&&t.dom.isEmpty(e)){Nt.remove(e);break}var a;t.dom.isEmpty(i)||Nt.insertAfter(i,e),Nt.insertAfter(o,e),ht(t.dom,n.parentNode)&&(a=n.parentNode,nt.each(r,(t=>{a.parentNode.insertBefore(t,n.parentNode)})),Nt.remove(a)),Nt.remove(n),ht(t.dom,e)&&Nt.remove(e)})(t,n.dom,e.dom)))})(t,e))},kt=(t,e)=>{if(st(t))return{container:t,offset:e};const n=Q.getNode(t,e);return st(n)?{container:n,offset:e>=t.childNodes.length?n.data.length:0}:n.previousSibling&&st(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&st(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:t,offset:e}},Dt=t=>{const e=t.cloneRange(),n=kt(t.startContainer,t.startOffset);e.setStart(n.container,n.offset);const r=kt(t.endContainer,t.endOffset);return e.setEnd(r.container,r.offset),e},wt=(t,e)=>{const n=e||t.selection.getStart(!0);return t.dom.getParent(n,"OL,UL,DL",Bt(t,n))},xt=t=>{const e=t.selection.getSelectedBlocks();return v(((t,e)=>{const n=nt.map(e,(e=>t.dom.getParent(e,"li,dd,dt",Bt(t,e))||e));return D(n)})(t,e),dt)},Bt=(t,e)=>{const n=t.dom.getParents(e,"TD,TH");return n.length>0?n[0]:t.getBody()},Et=(t,e)=>{const n=t.dom.getParents(e,"ol,ul",Bt(t,e));return k(n)},It=(t,e)=>{const n=y(e,(e=>Et(t,e).getOr(e)));return D(n)},Mt=(t,e,n=c)=>t.exists((t=>n(t,e))),Pt=(t,e,n)=>t.isSome()&&e.isSome()?p.some(n(t.getOrDie(),e.getOrDie())):p.none(),Rt=(t,e,n)=>t.dispatch("ListMutation",{action:e,element:n}),Ut=($t=/^\s+|\s+$/g,t=>t.replace($t,""));var $t;const _t=(t,e,n)=>{((t,e,n)=>{if(!r(n))throw console.error("Invalid call to CSS.set. Property ",e,":: Value ",n,":: Element ",t),new Error("CSS value must be a string: "+n);(t=>void 0!==t.style&&a(t.style.getPropertyValue))(t)&&t.style.setProperty(e,n)})(t.dom,e,n)},Ht=(t,e)=>{K(t.item,e.list)},Ft=(t,e)=>{const n={list:x(e,t),item:x("li",t)};return K(n.list,n.item),n},Kt=t=>((t,e)=>{const n=t.dom;if(1!==n.nodeType)return!1;{const t=n;if(void 0!==t.matches)return t.matches(e);if(void 0!==t.msMatchesSelector)return t.msMatchesSelector(e);if(void 0!==t.webkitMatchesSelector)return t.webkitMatchesSelector(e);if(void 0!==t.mozMatchesSelector)return t.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}})(t,"OL,UL"),jt=t=>_(t).exists(Kt),Vt=t=>t.depth>0,zt=t=>t.isSelected,Qt=t=>{const e=U(t),n=H(t).exists(Kt)?e.slice(0,-1):e;return y(n,Y)},qt=t=>(C(t,((e,n)=>{((t,e)=>{const n=t[e].depth,r=t=>t.depth===n&&!t.dirty,o=t=>t.depth<n;return S(T(t.slice(0,e)),r,o).orThunk((()=>S(t.slice(e+1),r,o)))})(t,n).fold((()=>{e.dirty&&(t=>{t.listAttributes=((t,e)=>{const n={};var r;return((t,e,n,r)=>{G(t,((t,o)=>{(e(t,o)?n:r)(t,o)}))})(t,e,(r=n,(t,e)=>{r[e]=t}),d),n})(t.listAttributes,((t,e)=>"start"!==e))})(e)}),(t=>{return r=t,(n=e).listType=r.listType,void(n.listAttributes={...r.listAttributes});var n,r}))})),t),Wt=(t,e,n,r)=>_(r).filter(Kt).fold((()=>{e.each((t=>{E(t.start,r)&&n.set(!0)}));const o=((t,e,n)=>R(t).filter(M).map((r=>({depth:e,dirty:!1,isSelected:n,content:Qt(t),itemAttributes:X(t),listAttributes:X(r),listType:I(r)}))))(r,t,n.get());e.each((t=>{E(t.end,r)&&n.set(!1)}));const s=H(r).filter(Kt).map((r=>Zt(t,e,n,r))).getOr([]);return o.toArray().concat(s)}),(r=>Zt(t,e,n,r))),Zt=(t,e,n,r)=>L(U(r),(r=>(Kt(r)?Zt:Wt)(t+1,e,n,r))),Gt=(t,e)=>{const n=qt(e);return((t,e)=>{const n=b(e,((e,n)=>n.depth>e.length?((t,e,n)=>{const r=((t,e,n)=>{const r=[];for(let o=0;o<n;o++)r.push(Ft(t,e.listType));return r})(t,n,n.depth-e.length);var o;return(t=>{for(let e=1;e<t.length;e++)Ht(t[e-1],t[e])})(r),((t,e)=>{for(let e=0;e<t.length-1;e++)_t(t[e].item,"list-style-type","none");k(t).each((t=>{J(t.list,e.listAttributes),J(t.item,e.itemAttributes),j(t.item,e.content)}))})(r,n),o=r,Pt(k(e),A(o),Ht),e.concat(r)})(t,e,n):((t,e,n)=>{const r=e.slice(0,n.depth);return k(r).each((e=>{const r=((t,e,n)=>{const r=x("li",t);return J(r,e),j(r,n),r})(t,n.itemAttributes,n.content);((t,e)=>{K(t.list,e),t.item=e})(e,r),((t,e)=>{I(t.list)!==e.listType&&(t.list=tt(t.list,e.listType)),J(t.list,e.listAttributes)})(e,n)})),r})(t,e,n)),[]);return A(n).map((t=>t.list))})(t.contentDocument,n).toArray()},Jt=(t,e,n)=>{const r=((t,e)=>{const n=(t=>{let e=!1;return{get:()=>e,set:t=>{e=t}}})();return y(t,(t=>({sourceList:t,entries:Zt(0,e,n,t)})))})(e,(t=>{const e=y(xt(t),B);return Pt(N(e,u(jt)),N(T(e),u(jt)),((t,e)=>({start:t,end:e})))})(t));C(r,(e=>{((t,e)=>{C(v(t,zt),(t=>((t,e)=>{switch(t){case"Indent":e.depth++;break;case"Outdent":e.depth--;break;case"Flatten":e.depth=0}e.dirty=!0})(e,t)))})(e.entries,n);const r=((t,e)=>L(((t,e)=>{if(0===t.length)return[];{let n=e(t[0]);const r=[];let o=[];for(let s=0,i=t.length;s<i;s++){const i=t[s],a=e(i);a!==n&&(r.push(o),o=[]),n=a,o.push(i)}return 0!==o.length&&r.push(o),r}})(e,Vt),(e=>A(e).exists(Vt)?Gt(t,e):((t,e)=>{const n=qt(e);return y(n,(e=>{const n=((t,e)=>{const n=document.createDocumentFragment();return C(t,(t=>{n.appendChild(t.dom)})),B(n)})(e.content);return B(St(t,n.dom))}))})(t,e))))(t,e.entries);var o;C(r,(e=>{Rt(t,"Indent"===n?"IndentList":"OutdentList",e.dom)})),o=e.sourceList,C(r,(t=>{F(o,t)})),z(e.sourceList)}))},Xt=(t,e)=>{const n=y((t=>{const e=(t=>{const e=Et(t,t.selection.getStart()),n=v(t.selection.getSelectedBlocks(),at);return e.toArray().concat(n)})(t);return It(t,e)})(t),B),r=y((t=>v(xt(t),ct))(t),B);let o=!1;if(n.length||r.length){const s=t.selection.getBookmark();Jt(t,n,e),At(t,e,r),t.selection.moveToBookmark(s),t.selection.setRng(Dt(t.selection.getRng())),t.nodeChanged(),o=!0}return o},Yt=t=>Xt(t,"Indent"),te=t=>Xt(t,"Outdent"),ee=t=>Xt(t,"Flatten");var ne=tinymce.util.Tools.resolve("tinymce.dom.BookmarkManager");const re=et.DOM,oe=t=>{const e={},n=n=>{let r=t[n?"startContainer":"endContainer"],o=t[n?"startOffset":"endOffset"];if(1===r.nodeType){const t=re.create("span",{"data-mce-type":"bookmark"});r.hasChildNodes()?(o=Math.min(o,r.childNodes.length-1),n?r.insertBefore(t,r.childNodes[o]):re.insertAfter(t,r.childNodes[o])):r.appendChild(t),r=t,o=0}e[n?"startContainer":"endContainer"]=r,e[n?"startOffset":"endOffset"]=o};return n(!0),t.collapsed||n(),e},se=t=>{const e=e=>{let n,r=n=t[e?"startContainer":"endContainer"],o=t[e?"startOffset":"endOffset"];r&&(1===r.nodeType&&(o=(t=>{let e=t.parentNode.firstChild,n=0;for(;e;){if(e===t)return n;1===e.nodeType&&"bookmark"===e.getAttribute("data-mce-type")||n++,e=e.nextSibling}return-1})(r),r=r.parentNode,re.remove(n),!r.hasChildNodes()&&re.isBlock(r)&&r.appendChild(re.create("br"))),t[e?"startContainer":"endContainer"]=r,t[e?"startOffset":"endOffset"]=o)};e(!0),e();const n=re.createRng();return n.setStart(t.startContainer,t.startOffset),t.endContainer&&n.setEnd(t.endContainer,t.endOffset),Dt(n)},ie=t=>{switch(t){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}},ae=t=>/\btox\-/.test(t.className),le=(t,e,n)=>{const r=t=>{const r=S(t.parents,it,ut).filter((t=>t.nodeName===e&&!ae(t))).isSome();n(r)},o=t.dom.getParents(t.selection.getNode());return r({parents:o}),t.on("NodeChange",r),()=>t.off("NodeChange",r)},de=(t,e)=>{nt.each(e,((e,n)=>{t.setAttribute(n,e)}))},ce=(t,e,n)=>{((t,e,n)=>{const r=n["list-style-type"]?n["list-style-type"]:null;t.setStyle(e,"list-style-type",r)})(t,e,n),((t,e,n)=>{de(e,n["list-attributes"]),nt.each(t.select("li",e),(t=>{de(t,n["list-item-attributes"])}))})(t,e,n)},ue=(t,e,n,r)=>{let o=e[n?"startContainer":"endContainer"];const s=e[n?"startOffset":"endOffset"];for(1===o.nodeType&&(o=o.childNodes[Math.min(s,o.childNodes.length-1)]||o),!n&&mt(o.nextSibling)&&(o=o.nextSibling);o.parentNode!==r;){if(pt(t,o))return o;if(/^(TD|TH)$/.test(o.parentNode.nodeName))return o;o=o.parentNode}return o},me=(t,e,n)=>{const r=t.selection.getRng();let o="LI";const s=Bt(t,t.selection.getStart(!0)),i=t.dom;if("false"===i.getContentEditable(t.selection.getNode()))return;"DL"===(e=e.toUpperCase())&&(o="DT");const a=oe(r),l=((t,e,n)=>{const r=[],o=t.dom,s=ue(t,e,!0,n),i=ue(t,e,!1,n);let a;const l=[];for(let t=s;t&&(l.push(t),t!==i);t=t.nextSibling);return nt.each(l,(e=>{if(pt(t,e))return r.push(e),void(a=null);if(o.isBlock(e)||mt(e))return mt(e)&&o.remove(e),void(a=null);const s=e.nextSibling;ne.isBookmarkNode(e)&&(it(s)||pt(t,s)||!s&&e.parentNode===n)?a=null:(a||(a=o.create("p"),e.parentNode.insertBefore(a,e),r.push(a)),a.appendChild(e))})),r})(t,r,s);nt.each(l,(r=>{let s;const a=r.previousSibling,l=r.parentNode;dt(l)||(a&&it(a)&&a.nodeName===e&&((t,e,n)=>{const r=t.getStyle(e,"list-style-type");let o=n?n["list-style-type"]:"";return o=null===o?"":o,r===o})(i,a,n)?(s=a,r=i.rename(r,o),a.appendChild(r)):(s=i.create(e),r.parentNode.insertBefore(s,r),s.appendChild(r),r=i.rename(r,o)),((t,e,n)=>{nt.each(["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"],(n=>t.setStyle(e,n,"")))})(i,r),ce(i,s,n),ge(t.dom,s))})),t.selection.setRng(se(a))},pe=(t,e,n)=>{return((t,e)=>t&&e&&it(t)&&t.nodeName===e.nodeName)(e,n)&&((t,e,n)=>t.getStyle(e,"list-style-type",!0)===t.getStyle(n,"list-style-type",!0))(t,e,n)&&(r=n,e.className===r.className);var r},ge=(t,e)=>{let n,r;if(n=e.nextSibling,pe(t,e,n)){for(;r=n.firstChild;)e.appendChild(r);t.remove(n)}if(n=e.previousSibling,pe(t,e,n)){for(;r=n.lastChild;)e.insertBefore(r,e.firstChild);t.remove(n)}},he=t=>"list-style-type"in t,fe=(t,e,n)=>{const r=wt(t),s=(t=>{const e=wt(t),n=t.selection.getSelectedBlocks();return((t,e)=>t&&1===e.length&&e[0]===t)(e,n)?(t=>v(t.querySelectorAll("ol,ul,dl"),it))(e):v(n,(t=>it(t)&&e!==t))})(t),i=o(n)?n:{};s.length>0?((t,e,n,r,o)=>{const s=it(e);if(s&&e.nodeName===r&&!he(o))ee(t);else{me(t,r,o);const i=oe(t.selection.getRng()),a=s?[e,...n]:n;nt.each(a,(e=>{((t,e,n,r)=>{if(e.nodeName!==n){const o=t.dom.rename(e,n);ce(t.dom,o,r),Rt(t,ie(n),o)}else ce(t.dom,e,r),Rt(t,ie(n),e)})(t,e,r,o)})),t.selection.setRng(se(i))}})(t,r,s,e,i):((t,e,n,r)=>{if(e!==t.getBody())if(e)if(e.nodeName!==n||he(r)||ae(e)){const o=oe(t.selection.getRng());ce(t.dom,e,r);const s=t.dom.rename(e,n);ge(t.dom,s),t.selection.setRng(se(o)),me(t,n,r),Rt(t,ie(n),s)}else ee(t);else me(t,n,r),Rt(t,ie(n),e)})(t,r,e,i)},ye=et.DOM,Ce=(t,e,n,r)=>{let o=e.startContainer;const s=e.startOffset;if(st(o)&&(n?s<o.data.length:s>0))return o;const i=t.schema.getNonEmptyElements();1===o.nodeType&&(o=Q.getNode(o,s));const a=new q(o,r);for(n&&((t,e)=>!!mt(e)&&t.isBlock(e.nextSibling)&&!mt(e.previousSibling))(t.dom,o)&&a.next();o=a[n?"next":"prev2"]();){if("LI"===o.nodeName&&!o.hasChildNodes())return o;if(i[o.nodeName])return o;if(st(o)&&o.data.length>0)return o}},ve=(t,e)=>{const n=e.childNodes;return 1===n.length&&!it(n[0])&&t.isBlock(n[0])},be=(t,e,n)=>{let r;const o=e.parentNode;if(!ft(t,e)||!ft(t,n))return;it(n.lastChild)&&(r=n.lastChild),o===n.lastChild&&mt(o.previousSibling)&&t.remove(o.previousSibling);const s=n.lastChild;s&&mt(s)&&e.hasChildNodes()&&t.remove(s),ht(t,n,!0)&&V(B(n)),((t,e,n)=>{let r;const o=ve(t,n)?n.firstChild:n;if(((t,e)=>{ve(t,e)&&t.remove(e.firstChild,!0)})(t,e),!ht(t,e,!0))for(;r=e.firstChild;)o.appendChild(r)})(t,e,n),r&&n.appendChild(r);const i=((t,e)=>{const n=t.dom,r=e.dom;return n!==r&&n.contains(r)})(B(n),B(e))?t.getParents(e,it,n):[];t.remove(e),C(i,(e=>{ht(t,e)&&e!==t.getRoot()&&t.remove(e)}))},Se=(t,e)=>{const n=t.dom,r=t.selection,o=r.getStart(),s=Bt(t,o),i=n.getParent(r.getStart(),"LI",s);if(i){const o=i.parentNode;if(o===t.getBody()&&ht(n,o))return!0;const a=Dt(r.getRng()),l=n.getParent(Ce(t,a,e,s),"LI",s);if(l&&l!==i)return t.undoManager.transact((()=>{var n;e?((t,e,n,r)=>{const o=t.dom;if(o.isEmpty(r))((t,e,n)=>{V(B(n)),be(t.dom,e,n),t.selection.setCursorLocation(n,0)})(t,n,r);else{const s=oe(e);be(o,n,r),t.selection.setRng(se(s))}})(t,a,l,i):(n=i).parentNode.firstChild===n?te(t):((t,e,n,r)=>{const o=oe(e);be(t.dom,n,r);const s=se(o);t.selection.setRng(s)})(t,a,i,l)})),!0;if(!l&&!e&&0===a.startOffset&&0===a.endOffset)return t.undoManager.transact((()=>{ee(t)})),!0}return!1},Ne=(t,e)=>t.selection.isCollapsed()?((t,e)=>Se(t,e)||((t,e)=>{const n=t.dom,r=t.selection.getStart(),o=Bt(t,r),s=n.getParent(r,n.isBlock,o);if(s&&n.isEmpty(s)){const r=Dt(t.selection.getRng()),i=n.getParent(Ce(t,r,e,o),"LI",o);if(i)return t.undoManager.transact((()=>{((t,e,n)=>{const r=t.getParent(e.parentNode,t.isBlock,n);t.remove(e),r&&t.isEmpty(r)&&t.remove(r)})(n,s,o),ge(n,i.parentNode),t.selection.select(i,!0),t.selection.collapse(e)})),!0}return!1})(t,e))(t,e):(t=>{const e=t.selection.getStart(),n=Bt(t,e);return!!(t.dom.getParent(e,"LI,DT,DD",n)||xt(t).length>0)&&(t.undoManager.transact((()=>{t.execCommand("Delete"),((t,e)=>{const n=nt.grep(t.select("ol,ul",e));nt.each(n,(e=>{((t,e)=>{const n=e.parentNode;if("LI"===n.nodeName&&n.firstChild===e){const r=n.previousSibling;r&&"LI"===r.nodeName?(r.appendChild(e),ht(t,n)&&ye.remove(n)):ye.setStyle(n,"listStyleType","none")}if(it(n)){const t=n.previousSibling;t&&"LI"===t.nodeName&&t.appendChild(e)}})(t,e)}))})(t.dom,t.getBody())})),!0)})(t),Le=t=>{const e=T(Ut(t).split("")),n=y(e,((t,e)=>{const n=t.toUpperCase().charCodeAt(0)-"A".charCodeAt(0)+1;return Math.pow(26,e)*n}));return b(n,((t,e)=>t+e),0)},Te=t=>{if(--t<0)return"";{const e=t%26,n=Math.floor(t/26);return Te(n)+String.fromCharCode("A".charCodeAt(0)+e)}},Oe=t=>{const e=parseInt(t.start,10);return Mt(t.listStyleType,"upper-alpha")?Te(e):Mt(t.listStyleType,"lower-alpha")?Te(e).toLowerCase():t.start},Ae=(t,e)=>()=>{const n=wt(t);return n&&n.nodeName===e},ke=t=>{t.addCommand("mceListProps",(()=>{(t=>{const e=wt(t);lt(e)&&t.windowManager.open({title:"List Properties",body:{type:"panel",items:[{type:"input",name:"start",label:"Start list at number",inputMode:"numeric"}]},initialData:{start:Oe({start:t.dom.getAttrib(e,"start","1"),listStyleType:p.some(t.dom.getStyle(e,"list-style-type"))})},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:e=>{(t=>{switch((t=>/^[0-9]+$/.test(t)?2:/^[A-Z]+$/.test(t)?0:/^[a-z]+$/.test(t)?1:t.length>0?4:3)(t)){case 2:return p.some({listStyleType:p.none(),start:t});case 0:return p.some({listStyleType:p.some("upper-alpha"),start:Le(t).toString()});case 1:return p.some({listStyleType:p.some("lower-alpha"),start:Le(t).toString()});case 3:return p.some({listStyleType:p.none(),start:""});case 4:return p.none()}})(e.getData().start).each((e=>{t.execCommand("mceListUpdate",!1,{attrs:{start:"1"===e.start?"":e.start},styles:{"list-style-type":e.listStyleType.getOr("")}})})),e.close()}})})(t)}))};t.add("lists",(t=>((t=>{(0,t.options.register)("lists_indent_on_tab",{processor:"boolean",default:!0})})(t),!1===t.hasPlugin("rtc",!0)?((t=>{Ct(t)&&(t=>{t.on("keydown",(e=>{e.keyCode!==W.TAB||W.metaKeyPressed(e)||t.undoManager.transact((()=>{(e.shiftKey?te(t):Yt(t))&&e.preventDefault()}))}))})(t),(t=>{t.on("keydown",(e=>{e.keyCode===W.BACKSPACE?Ne(t,!1)&&e.preventDefault():e.keyCode===W.DELETE&&Ne(t,!0)&&e.preventDefault()}))})(t)})(t),(t=>{t.on("BeforeExecCommand",(e=>{const n=e.command.toLowerCase();"indent"===n?Yt(t):"outdent"===n&&te(t)})),t.addCommand("InsertUnorderedList",((e,n)=>{fe(t,"UL",n)})),t.addCommand("InsertOrderedList",((e,n)=>{fe(t,"OL",n)})),t.addCommand("InsertDefinitionList",((e,n)=>{fe(t,"DL",n)})),t.addCommand("RemoveList",(()=>{ee(t)})),ke(t),t.addCommand("mceListUpdate",((e,n)=>{o(n)&&((t,e)=>{const n=wt(t);t.undoManager.transact((()=>{o(e.styles)&&t.dom.setStyles(n,e.styles),o(e.attrs)&&G(e.attrs,((e,r)=>t.dom.setAttrib(n,r,e)))}))})(t,n)})),t.addQueryStateHandler("InsertUnorderedList",Ae(t,"UL")),t.addQueryStateHandler("InsertOrderedList",Ae(t,"OL")),t.addQueryStateHandler("InsertDefinitionList",Ae(t,"DL"))})(t)):ke(t),(t=>{const e=e=>()=>t.execCommand(e);t.hasPlugin("advlist")||(t.ui.registry.addToggleButton("numlist",{icon:"ordered-list",active:!1,tooltip:"Numbered list",onAction:e("InsertOrderedList"),onSetup:e=>le(t,"OL",e.setActive)}),t.ui.registry.addToggleButton("bullist",{icon:"unordered-list",active:!1,tooltip:"Bullet list",onAction:e("InsertUnorderedList"),onSetup:e=>le(t,"UL",e.setActive)}))})(t),(t=>{const e={text:"List properties...",icon:"ordered-list",onAction:()=>t.execCommand("mceListProps"),onSetup:e=>le(t,"OL",e.setEnabled)};t.ui.registry.addMenuItem("listprops",e),t.ui.registry.addContextMenu("lists",{update:e=>{const n=wt(t,e);return lt(n)?["listprops"]:[]}})})(t),(t=>({backspaceDelete:e=>{Ne(t,e)}}))(t))))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/media/plugin.js b/public/assets/tinymce/plugins/media/plugin.js
index 6c28b1d7f7cd4bb5debb3f23ab8e719c158e45b3..81e4100bded1aac584a78d755b34780f077c8752 100644
--- a/public/assets/tinymce/plugins/media/plugin.js
+++ b/public/assets/tinymce/plugins/media/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(r=a=e,(o=String).prototype.isPrototypeOf(r)||(null===(s=a.constructor)||void 0===s?void 0:s.name)===o.name)?"string":t;var r,a,o,s})(t)===e,r=t("string"),a=t("object"),o=t("array"),s=e=>!(e=>null==e)(e);class i{constructor(e,t){this.tag=e,this.value=t}static some(e){return new i(!0,e)}static none(){return i.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?i.some(e(this.value)):i.none()}bind(e){return this.tag?e(this.value):i.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:i.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return s(e)?i.some(e):i.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}i.singletonNone=new i(!1);const c=Array.prototype.push,n=(e,t)=>{for(let r=0,a=e.length;r<a;r++)t(e[r],r)},l=e=>{const t=[];for(let r=0,a=e.length;r<a;++r){if(!o(e[r]))throw new Error("Arr.flatten item "+r+" was not an array, input: "+e);c.apply(t,e[r])}return t},m=Object.keys,u=Object.hasOwnProperty,d=(e,t)=>h(e,t)?i.from(e[t]):i.none(),h=(e,t)=>u.call(e,t),p=e=>t=>t.options.get(e),g=p("audio_template_callback"),b=p("video_template_callback"),w=p("media_live_embeds"),y=p("media_filter_html"),f=p("media_url_resolver"),v=p("media_alt_source"),x=p("media_poster"),_=p("media_dimensions");var j=tinymce.util.Tools.resolve("tinymce.util.Tools"),k=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),O=tinymce.util.Tools.resolve("tinymce.html.DomParser");const A=k.DOM,S=e=>e.replace(/px$/,""),D=e=>{const t=e.attr("style"),r=t?A.parseStyle(t):{};return{type:"ephox-embed-iri",source:e.attr("data-ephox-embed-iri"),altsource:"",poster:"",width:d(r,"max-width").map(S).getOr(""),height:d(r,"max-height").map(S).getOr("")}},T=(e,t)=>{let r={};for(let a=O({validate:!1,forced_root_block:!1},t).parse(e);a;a=a.walk())if(1===a.type){const e=a.name;if(a.attr("data-ephox-embed-iri")){r=D(a);break}r.source||"param"!==e||(r.source=a.attr("movie")),"iframe"!==e&&"object"!==e&&"embed"!==e&&"video"!==e&&"audio"!==e||(r.type||(r.type=e),r=j.extend(a.attributes.map,r)),"script"===e&&(r={type:"script",source:a.attr("src")}),"source"===e&&(r.source?r.altsource||(r.altsource=a.attr("src")):r.source=a.attr("src")),"img"!==e||r.poster||(r.poster=a.attr("src"))}return r.source=r.source||r.src||r.data,r.altsource=r.altsource||"",r.poster=r.poster||"",r},C=e=>({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()]||"");var $=tinymce.util.Tools.resolve("tinymce.html.Node"),z=tinymce.util.Tools.resolve("tinymce.html.Serializer");const M=(e,t={})=>O({forced_root_block:!1,validate:!1,allow_conditional_comments:!0,...t},e),F=k.DOM,N=e=>/^[0-9.]+$/.test(e)?e+"px":e,R=(e,t)=>{const r=t.attr("style"),a=r?F.parseStyle(r):{};a["max-width"]=N(e.width),a["max-height"]=N(e.height),t.attr("style",F.serializeStyle(a))},U=["source","altsource"],P=(e,t,r,a)=>{let o=0,s=0;const i=M(a);i.addNodeFilter("source",(e=>o=e.length));const c=i.parse(e);for(let e=c;e;e=e.walk())if(1===e.type){const a=e.name;if(e.attr("data-ephox-embed-iri")){R(t,e);break}switch(a){case"video":case"object":case"embed":case"img":case"iframe":void 0!==t.height&&void 0!==t.width&&(e.attr("width",t.width),e.attr("height",t.height))}if(r)switch(a){case"video":e.attr("poster",t.poster),e.attr("src",null);for(let r=o;r<2;r++)if(t[U[r]]){const a=new $("source",1);a.attr("src",t[U[r]]),a.attr("type",t[U[r]+"mime"]||null),e.append(a)}break;case"iframe":e.attr("src",t.source);break;case"object":const r=e.getAll("img").length>0;if(t.poster&&!r){e.attr("src",t.poster);const r=new $("img",1);r.attr("src",t.poster),r.attr("width",t.width),r.attr("height",t.height),e.append(r)}break;case"source":if(s<2&&(e.attr("src",t[U[s]]),e.attr("type",t[U[s]+"mime"]||null),!t[U[s]])){e.remove();continue}s++;break;case"img":t.poster||e.remove()}}return z({},a).serialize(c)},E=[{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}],L=(e,t)=>{const r=(e=>{const t=e.match(/^(https?:\/\/|www\.)(.+)$/i);return t&&t.length>1?"www."===t[1]?"https://":t[1]:"https://"})(t),a=e.regex.exec(t);let o=r+e.url;for(let e=0;e<a.length;e++)o=o.replace("$"+e,(()=>a[e]?a[e]:""));return o.replace(/\?$/,"")},I=(e,t)=>{const r=j.extend({},t);if(!r.source&&(j.extend(r,T(r.embed,e.schema)),!r.source))return"";r.altsource||(r.altsource=""),r.poster||(r.poster=""),r.source=e.convertURL(r.source,"source"),r.altsource=e.convertURL(r.altsource,"source"),r.sourcemime=C(r.source),r.altsourcemime=C(r.altsource),r.poster=e.convertURL(r.poster,"poster");const a=(e=>{const t=E.filter((t=>t.regex.test(e)));return t.length>0?j.extend({},t[0],{url:L(t[0],e)}):null})(r.source);if(a&&(r.source=a.url,r.type=a.type,r.allowfullscreen=a.allowFullscreen,r.width=r.width||String(a.w),r.height=r.height||String(a.h)),r.embed)return P(r.embed,r,!0,e.schema);{const t=g(e),a=b(e);return r.width=r.width||"300",r.height=r.height||"150",j.each(r,((t,a)=>{r[a]=e.dom.encode(""+t)})),"iframe"===r.type?(e=>{const t=e.allowfullscreen?' allowFullscreen="1"':"";return'<iframe src="'+e.source+'" width="'+e.width+'" height="'+e.height+'"'+t+"></iframe>"})(r):"application/x-shockwave-flash"===r.sourcemime?(e=>{let t='<object data="'+e.source+'" width="'+e.width+'" height="'+e.height+'" type="application/x-shockwave-flash">';return e.poster&&(t+='<img src="'+e.poster+'" width="'+e.width+'" height="'+e.height+'" />'),t+="</object>",t})(r):-1!==r.sourcemime.indexOf("audio")?((e,t)=>t?t(e):'<audio controls="controls" src="'+e.source+'">'+(e.altsource?'\n<source src="'+e.altsource+'"'+(e.altsourcemime?' type="'+e.altsourcemime+'"':"")+" />\n":"")+"</audio>")(r,t):"script"===r.type?(e=>'<script src="'+e.source+'"><\/script>')(r):((e,t)=>t?t(e):'<video width="'+e.width+'" height="'+e.height+'"'+(e.poster?' poster="'+e.poster+'"':"")+' controls="controls">\n<source src="'+e.source+'"'+(e.sourcemime?' type="'+e.sourcemime+'"':"")+" />\n"+(e.altsource?'<source src="'+e.altsource+'"'+(e.altsourcemime?' type="'+e.altsourcemime+'"':"")+" />\n":"")+"</video>")(r,a)}},B=e=>e.hasAttribute("data-mce-object")||e.hasAttribute("data-ephox-embed-iri"),G={},W=e=>t=>I(e,t),q=(e,t)=>{const r=f(e);return r?((e,t,r)=>new Promise(((a,o)=>{const s=r=>(r.html&&(G[e.source]=r),a({url:e.source,html:r.html?r.html:t(e)}));G[e.source]?s(G[e.source]):r({url:e.source},s,o)})))(t,W(e),r):((e,t)=>Promise.resolve({html:t(e),url:e.source}))(t,W(e))},H=(e,t)=>{const r={};return d(e,"dimensions").each((e=>{n(["width","height"],(a=>{d(t,a).orThunk((()=>d(e,a))).each((e=>r[a]=e))}))})),r},J=(e,t)=>{const r=t?((e,t)=>d(t,e).bind((e=>d(e,"meta"))))(t,e).getOr({}):{},o=((e,t,r)=>o=>{const s=()=>d(e,o),c=()=>d(t,o),n=e=>d(e,"value").bind((e=>e.length>0?i.some(e):i.none()));return{[o]:(o===r?s().bind((e=>a(e)?n(e).orThunk(c):c().orThunk((()=>i.from(e))))):c().orThunk((()=>s().bind((e=>a(e)?n(e):i.from(e)))))).getOr("")}})(e,r,t);return{...o("source"),...o("altsource"),...o("poster"),...o("embed"),...H(e,r)}},K=e=>{const t={...e,source:{value:d(e,"source").getOr("")},altsource:{value:d(e,"altsource").getOr("")},poster:{value:d(e,"poster").getOr("")}};return n(["width","height"],(r=>{d(e,r).each((e=>{const a=t.dimensions||{};a[r]=e,t.dimensions=a}))})),t},Q=e=>t=>{const r=t&&t.msg?"Media embed handler error: "+t.msg:"Media embed handler threw unknown error.";e.notificationManager.open({type:"error",text:r})},V=(e,t)=>a=>{if(r(a.url)&&a.url.trim().length>0){const r=a.html,o={...T(r,t.schema),source:a.url,embed:r};e.setData(K(o))}},X=(e,t)=>{const r=e.dom.select("*[data-mce-object]");e.insertContent(t),((e,t)=>{const r=e.dom.select("*[data-mce-object]");for(let e=0;e<t.length;e++)for(let a=r.length-1;a>=0;a--)t[e]===r[a]&&r.splice(a,1);e.selection.select(r[0])})(e,r),e.nodeChanged()},Y=e=>{const t=(e=>{const t=e.selection.getNode(),r=B(t)?e.serializer.serialize(t,{selection:!0}):"";return{embed:r,...T(r,e.schema)}})(e),r=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})(t),a=K(t),o=_(e)?[{type:"sizeinput",name:"dimensions",label:"Constrain proportions",constrain:!0}]:[],s={title:"General",name:"general",items:l([[{name:"source",type:"urlinput",filetype:"media",label:"Source"}],o])},i=[];v(e)&&i.push({name:"altsource",type:"urlinput",filetype:"media",label:"Alternative source URL"}),x(e)&&i.push({name:"poster",type:"urlinput",filetype:"image",label:"Media poster (Image URL)"});const c={title:"Advanced",name:"advanced",items:i},n=[s,{title:"Embed",items:[{type:"textarea",name:"embed",label:"Paste your embed code below:"}]}];i.length>0&&n.push(c);const m={type:"tabpanel",tabs:n},u=e.windowManager.open({title:"Insert/Edit Media",size:"normal",body:m,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:t=>{const a=J(t.getData());((e,t,r)=>{var a;t.embed=P(t.embed,t,!1,r.schema),t.embed&&(e.source===t.source||(a=t.source,h(G,a)))?X(r,t.embed):q(r,t).then((e=>{X(r,e.html)})).catch(Q(r))})(r.get(),a,e),t.close()},onChange:(t,a)=>{switch(a.name){case"source":((t,r)=>{const a=J(r.getData(),"source");t.source!==a.source&&(V(u,e)({url:a.source,html:""}),q(e,a).then(V(u,e)).catch(Q(e)))})(r.get(),t);break;case"embed":(t=>{const r=J(t.getData()),a=T(r.embed,e.schema);t.setData(K(a))})(t);break;case"dimensions":case"altsource":case"poster":((t,r)=>{const a=J(t.getData(),r),o=I(e,a);t.setData(K({...a,embed:o}))})(t,a.name)}r.set(J(t.getData()))},initialData:a})};var Z=tinymce.util.Tools.resolve("tinymce.Env");const ee=e=>{const t=e.name;return"iframe"===t||"video"===t||"audio"===t},te=(e,t,r,a=null)=>{const o=e.attr(r);return s(o)?o:h(t,r)?null:a},re=(e,t,r)=>{const a="img"===t.name||"video"===e.name,o=a?"300":null,s="audio"===e.name?"30":"150",i=a?s:null;t.attr({width:te(e,r,"width",o),height:te(e,r,"height",i)})},ae=(e,t)=>{const r=t.name,a=new $("img",1);return se(e,t,a),re(t,a,{}),a.attr({style:t.attr("style"),src:Z.transparentSrc,"data-mce-object":r,class:"mce-object mce-object-"+r}),a},oe=(e,t)=>{const r=t.name,a=new $("span",1);a.attr({contentEditable:"false",style:t.attr("style"),"data-mce-object":r,class:"mce-preview-object mce-object-"+r}),se(e,t,a);const o=e.dom.parseStyle(t.attr("style")),i=new $(r,1);if(re(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"});else{n(["controls","crossorigin","currentTime","loop","muted","poster","preload"],(e=>{i.attr(e,t.attr(e))}));const o=a.attr("data-mce-html");s(o)&&((e,t,r,a)=>{const o=M(e.schema).parse(a,{context:t});for(;o.firstChild;)r.append(o.firstChild)})(e,r,i,unescape(o))}const c=new $("span",1);return c.attr("class","mce-shim"),a.append(i),a.append(c),a},se=(e,t,r)=>{const a=t.attributes;let o=a.length;for(;o--;){const t=a[o].name;let c=a[o].value;"width"===t||"height"===t||"style"===t||(i="data-mce-",(s=t).length>=i.length&&s.substr(0,0+i.length)===i)||("data"!==t&&"src"!==t||(c=e.convertURL(c,t)),r.attr("data-mce-p-"+t,c))}var s,i;const c=z({inner:!0},e.schema),l=new $("div",1);n(t.children(),(e=>l.append(e)));const m=c.serialize(l);m&&(r.attr("data-mce-html",escape(m)),r.empty())},ie=e=>{const t=e.attr("class");return t&&/\btiny-pageembed\b/.test(t)},ce=e=>{for(;e=e.parent;)if(e.attr("data-ephox-embed-iri")||ie(e))return!0;return!1},ne=(e,t,r)=>{const a=y(e);return M(e.schema,{validate:a}).parse(r,{context:t})};e.add("media",(e=>((e=>{const t=e.options.register;t("audio_template_callback",{processor:"function"}),t("video_template_callback",{processor:"function"}),t("media_live_embeds",{processor:"boolean",default:!0}),t("media_filter_html",{processor:"boolean",default:!0}),t("media_url_resolver",{processor:"function"}),t("media_alt_source",{processor:"boolean",default:!0}),t("media_poster",{processor:"boolean",default:!0}),t("media_dimensions",{processor:"boolean",default:!0})})(e),(e=>{e.addCommand("mceMedia",(()=>{Y(e)}))})(e),(e=>{const t=()=>e.execCommand("mceMedia");e.ui.registry.addToggleButton("media",{tooltip:"Insert/edit media",icon:"embed",onAction:t,onSetup:t=>{const r=e.selection;return t.setActive(B(r.getNode())),r.selectorChangedWithUnbind("img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]",t.setActive).unbind}}),e.ui.registry.addMenuItem("media",{icon:"embed",text:"Media...",onAction:t})})(e),(e=>{e.on("ResolveName",(e=>{let t;1===e.target.nodeType&&(t=e.target.getAttribute("data-mce-object"))&&(e.name=t)}))})(e),(e=>{e.on("PreInit",(()=>{const{schema:t,serializer:r,parser:a}=e,o=t.getBoolAttrs();n("webkitallowfullscreen mozallowfullscreen".split(" "),(e=>{o[e]={}})),((e,t)=>{const r=m(e);for(let a=0,o=r.length;a<o;a++){const o=r[a];t(e[o],o)}})({embed:["wmode"]},((e,r)=>{const a=t.getElementRule(r);n(e,(e=>{a.attributes[e]={},a.attributesOrder.push(e)}))})),a.addNodeFilter("iframe,video,audio,object,embed,script",(e=>t=>{let r,a=t.length;for(;a--;)r=t[a],r.parent&&(r.parent.attr("data-mce-object")||(ee(r)&&w(e)?ce(r)||r.replace(oe(e,r)):ce(r)||r.replace(ae(e,r))))})(e)),r.addAttributeFilter("data-mce-object",((t,r)=>{let a=t.length;for(;a--;){const o=t[a];if(!o.parent)continue;const s=o.attr(r),i=new $(s,1);if("audio"!==s&&"script"!==s){const e=o.attr("class");e&&-1!==e.indexOf("mce-preview-object")?i.attr({width:o.firstChild.attr("width"),height:o.firstChild.attr("height")}):i.attr({width:o.attr("width"),height:o.attr("height")})}i.attr({style:o.attr("style")});const c=o.attributes;let l=c.length;for(;l--;){const e=c[l].name;0===e.indexOf("data-mce-p-")&&i.attr(e.substr(11),c[l].value)}"script"===s&&i.attr("type","text/javascript");const m=o.attr("data-mce-html");if(m){const t=ne(e,s,unescape(m));n(t.children(),(e=>i.append(e)))}o.replace(i)}}))})),e.on("SetContent",(()=>{const t=e.dom;n(t.select("span.mce-preview-object"),(e=>{0===t.select("span.mce-shim",e).length&&t.add(e,"span",{class:"mce-shim"})}))}))})(e),(e=>{e.on("click keyup touchend",(()=>{const t=e.selection.getNode();t&&e.dom.hasClass(t,"mce-preview-object")&&e.dom.getAttrib(t,"data-mce-selected")&&t.setAttribute("data-mce-selected","2")})),e.on("ObjectSelected",(e=>{"script"===e.target.getAttribute("data-mce-object")&&e.preventDefault()})),e.on("ObjectResized",(t=>{const r=t.target;if(r.getAttribute("data-mce-object")){let a=r.getAttribute("data-mce-html");a&&(a=unescape(a),r.setAttribute("data-mce-html",escape(P(a,{width:String(t.width),height:String(t.height)},!1,e.schema))))}}))})(e),(e=>({showDialog:()=>{Y(e)}}))(e))))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/nonbreaking/plugin.js b/public/assets/tinymce/plugins/nonbreaking/plugin.js
index b02e03c95f375bf933802100cb7b32b9a0937a78..d3bb58b9ac23d467856dc4351a2200596f885d68 100644
--- a/public/assets/tinymce/plugins/nonbreaking/plugin.js
+++ b/public/assets/tinymce/plugins/nonbreaking/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=n=>e=>typeof e===n,a=e("boolean"),o=e("number"),t=n=>e=>e.options.get(n),i=t("nonbreaking_force_tab"),r=t("nonbreaking_wrap"),s=(n,e)=>{let a="";for(let o=0;o<e;o++)a+=n;return a},c=(n,e)=>{const a=r(n)||n.plugins.visualchars?`<span class="${(n=>!!n.plugins.visualchars&&n.plugins.visualchars.isEnabled())(n)?"mce-nbsp-wrap mce-nbsp":"mce-nbsp-wrap"}" contenteditable="false">${s("&nbsp;",e)}</span>`:s("&nbsp;",e);n.undoManager.transact((()=>n.insertContent(a)))};var l=tinymce.util.Tools.resolve("tinymce.util.VK");n.add("nonbreaking",(n=>{(n=>{const e=n.options.register;e("nonbreaking_force_tab",{processor:n=>a(n)?{value:n?3:0,valid:!0}:o(n)?{value:n,valid:!0}:{valid:!1,message:"Must be a boolean or number."},default:!1}),e("nonbreaking_wrap",{processor:"boolean",default:!0})})(n),(n=>{n.addCommand("mceNonBreaking",(()=>{c(n,1)}))})(n),(n=>{const e=()=>n.execCommand("mceNonBreaking");n.ui.registry.addButton("nonbreaking",{icon:"non-breaking",tooltip:"Nonbreaking space",onAction:e}),n.ui.registry.addMenuItem("nonbreaking",{icon:"non-breaking",text:"Nonbreaking space",onAction:e})})(n),(n=>{const e=i(n);e>0&&n.on("keydown",(a=>{if(a.keyCode===l.TAB&&!a.isDefaultPrevented()){if(a.shiftKey)return;a.preventDefault(),a.stopImmediatePropagation(),c(n,e)}}))})(n)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/pagebreak/plugin.js b/public/assets/tinymce/plugins/pagebreak/plugin.js
index 60937f8f49ed38f4610750052c3970c4e32284e1..f5257f57305eb163cdcb397ad1d883630d4598b0 100644
--- a/public/assets/tinymce/plugins/pagebreak/plugin.js
+++ b/public/assets/tinymce/plugins/pagebreak/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.Env");const t=e=>a=>a.options.get(e),r=t("pagebreak_separator"),n=t("pagebreak_split_block"),o="mce-pagebreak",s=e=>{const t=`<img src="${a.transparentSrc}" class="mce-pagebreak" data-mce-resize="false" data-mce-placeholder />`;return e?`<p>${t}</p>`:t};e.add("pagebreak",(e=>{(e=>{const a=e.options.register;a("pagebreak_separator",{processor:"string",default:"\x3c!-- pagebreak --\x3e"}),a("pagebreak_split_block",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mcePageBreak",(()=>{e.insertContent(s(n(e)))}))})(e),(e=>{const a=()=>e.execCommand("mcePageBreak");e.ui.registry.addButton("pagebreak",{icon:"page-break",tooltip:"Page break",onAction:a}),e.ui.registry.addMenuItem("pagebreak",{text:"Page break",icon:"page-break",onAction:a})})(e),(e=>{const a=r(e),t=()=>n(e),c=new RegExp(a.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,(e=>"\\"+e)),"gi");e.on("BeforeSetContent",(e=>{e.content=e.content.replace(c,s(t()))})),e.on("PreInit",(()=>{e.serializer.addNodeFilter("img",(r=>{let n,s,c=r.length;for(;c--;)if(n=r[c],s=n.attr("class"),s&&-1!==s.indexOf(o)){const r=n.parent;if(e.schema.getBlockElements()[r.name]&&t()){r.type=3,r.value=a,r.raw=!0,n.remove();continue}n.type=3,n.value=a,n.raw=!0}}))}))})(e),(e=>{e.on("ResolveName",(a=>{"IMG"===a.target.nodeName&&e.dom.hasClass(a.target,o)&&(a.name="pagebreak")}))})(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/preview/plugin.js b/public/assets/tinymce/plugins/preview/plugin.js
index 85c2785a1119875815a5e1bd6b21d1b63c01a6de..aecc3fdc26bc6e73202201e6661a5984f8a17b83 100644
--- a/public/assets/tinymce/plugins/preview/plugin.js
+++ b/public/assets/tinymce/plugins/preview/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env"),o=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=e=>t=>t.options.get(e),i=n("content_style"),s=n("content_css_cors"),c=n("body_class"),r=n("body_id");e.add("preview",(e=>{(e=>{e.addCommand("mcePreview",(()=>{(e=>{const n=(e=>{var n;let l="";const a=e.dom.encode,d=null!==(n=i(e))&&void 0!==n?n:"";l+='<base href="'+a(e.documentBaseURI.getURI())+'">';const m=s(e)?' crossorigin="anonymous"':"";o.each(e.contentCSS,(t=>{l+='<link type="text/css" rel="stylesheet" href="'+a(e.documentBaseURI.toAbsolute(t))+'"'+m+">"})),d&&(l+='<style type="text/css">'+d+"</style>");const y=r(e),u=c(e),v='<script>document.addEventListener && document.addEventListener("click", function(e) {for (var elm = e.target; elm; elm = elm.parentNode) {if (elm.nodeName === "A" && !('+(t.os.isMacOS()||t.os.isiOS()?"e.metaKey":"e.ctrlKey && !e.altKey")+")) {e.preventDefault();}}}, false);<\/script> ",p=e.getBody().dir,w=p?' dir="'+a(p)+'"':"";return"<!DOCTYPE html><html><head>"+l+'</head><body id="'+a(y)+'" class="mce-content-body '+a(u)+'"'+w+">"+e.getContent()+v+"</body></html>"})(e);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:n}}).focus("close")})(e)}))})(e),(e=>{const t=()=>e.execCommand("mcePreview");e.ui.registry.addButton("preview",{icon:"preview",tooltip:"Preview",onAction:t}),e.ui.registry.addMenuItem("preview",{icon:"preview",text:"Preview",onAction:t})})(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/quickbars/plugin.js b/public/assets/tinymce/plugins/quickbars/plugin.js
index e7c95df335a17284740e93e2058a525b2cffb547..0d433c54f61bd6012966d4b4bc1007d5b95b1fdc 100644
--- a/public/assets/tinymce/plugins/quickbars/plugin.js
+++ b/public/assets/tinymce/plugins/quickbars/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>typeof t===e,o=("string",e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=n=e,(r=String).prototype.isPrototypeOf(o)||(null===(i=n.constructor)||void 0===i?void 0:i.name)===r.name)?"string":t;var o,n,r,i})(e));const n=t("boolean"),r=t("function"),i=e=>t=>t.options.get(e),s=i("quickbars_selection_toolbar"),a=i("quickbars_insert_toolbar"),l=i("quickbars_image_toolbar");let c=0;var u=tinymce.util.Tools.resolve("tinymce.Env"),d=tinymce.util.Tools.resolve("tinymce.util.Delay");const m=e=>{e.ui.registry.addButton("quickimage",{icon:"image",tooltip:"Insert image",onAction:()=>{(e=>new Promise((t=>{const o=document.createElement("input");o.type="file",o.accept="image/*",o.style.position="fixed",o.style.left="0",o.style.top="0",o.style.opacity="0.001",document.body.appendChild(o),o.addEventListener("change",(e=>{t(Array.prototype.slice.call(e.target.files))}));const n=r=>{const i=()=>{t([]),o.parentNode.removeChild(o)};u.os.isAndroid()&&"remove"!==r.type?d.setEditorTimeout(e,i,0):i(),e.off("focusin remove",n)};e.on("focusin remove",n),o.click()})))(e).then((t=>{if(t.length>0){const o=t[0];(e=>new Promise((t=>{const o=new FileReader;o.onloadend=()=>{t(o.result.split(",")[1])},o.readAsDataURL(e)})))(o).then((t=>{((e,t,o)=>{const n=e.editorUpload.blobCache,r=n.create((e=>{const t=(new Date).getTime(),o=Math.floor(1e9*Math.random());return c++,"mceu_"+o+c+String(t)})(),o,t);n.add(r),e.insertContent(e.dom.createHTML("img",{src:r.blobUri()}))})(e,t,o)}))}}))}}),e.ui.registry.addButton("quicktable",{icon:"table",tooltip:"Insert table",onAction:()=>{((e,t,o)=>{e.execCommand("mceInsertTable",!1,{rows:2,columns:2})})(e)}})},g=(!1,()=>false);class h{constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?h.none():h.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}h.singletonNone=new h(!1);var b=(e,t,o,n,i)=>e(o,n)?h.some(o):r(i)&&i(o)?h.none():t(o,n,i);const p=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},f=p,v=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}};"undefined"!=typeof window?window:Function("return this;")();const y=(e,t,o)=>{let n=e.dom;const i=r(o)?o:g;for(;n.parentNode;){n=n.parentNode;const e=f(n);if(t(e))return h.some(e);if(i(e))break}return h.none()},k=(e,t,o)=>y(e,(e=>v(e,t)),o),w=e=>{const t=a(e);t.length>0&&e.ui.registry.addContextToolbar("quickblock",{predicate:t=>{const o=f(t),n=e.schema.getTextBlockElements(),r=t=>t.dom===e.getBody();return((e,t,o)=>b(((e,t)=>v(e,t)),k,e,"table",o))(o,0,r).fold((()=>((t,o,r)=>b(((e,t)=>t(e)),y,t,(t=>t.dom.nodeName.toLowerCase()in n&&e.dom.isEmpty(t.dom)),r))(o,0,r).isSome()),g)},items:t,position:"line",scope:"editor"})};e.add("quickbars",(e=>{(e=>{const t=e.options.register,r=e=>t=>{const r=n(t)||o(t);return r?n(t)?{value:t?e:"",valid:r}:{value:t.trim(),valid:r}:{valid:!1,message:"Must be a boolean or string."}},i="bold italic | quicklink h2 h3 blockquote";t("quickbars_selection_toolbar",{processor:r(i),default:i});const s="quickimage quicktable";t("quickbars_insert_toolbar",{processor:r(s),default:s});const a="alignleft aligncenter alignright";t("quickbars_image_toolbar",{processor:r(a),default:a})})(e),m(e),w(e),(e=>{const t=e=>"IMG"===e.nodeName||"FIGURE"===e.nodeName&&/image/i.test(e.className),o=l(e);o.length>0&&e.ui.registry.addContextToolbar("imageselection",{predicate:t,items:o,position:"node"});const n=s(e);n.length>0&&e.ui.registry.addContextToolbar("textselection",{predicate:o=>!t(o)&&!e.selection.isCollapsed()&&(t=>"false"!==e.dom.getContentEditableParent(t))(o),items:n,position:"selection",scope:"editor"})})(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/save/plugin.js b/public/assets/tinymce/plugins/save/plugin.js
index 2f99cb0f6928fa76fbcf9553f722d0362559a743..3e24a0225b33fb14f56186a697a385cfb399c6d3 100644
--- a/public/assets/tinymce/plugins/save/plugin.js
+++ b/public/assets/tinymce/plugins/save/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const n=("function",e=>"function"==typeof e);var o=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),t=tinymce.util.Tools.resolve("tinymce.util.Tools");const a=e=>n=>n.options.get(e),c=a("save_enablewhendirty"),i=a("save_onsavecallback"),s=a("save_oncancelcallback"),r=(e,n)=>{e.notificationManager.open({text:n,type:"error"})},l=e=>n=>{const o=()=>{n.setEnabled(!c(e)||e.isDirty())};return o(),e.on("NodeChange dirty",o),()=>e.off("NodeChange dirty",o)};e.add("save",(e=>{(e=>{const n=e.options.register;n("save_enablewhendirty",{processor:"boolean",default:!0}),n("save_onsavecallback",{processor:"function"}),n("save_oncancelcallback",{processor:"function"})})(e),(e=>{e.ui.registry.addButton("save",{icon:"save",tooltip:"Save",enabled:!1,onAction:()=>e.execCommand("mceSave"),onSetup:l(e)}),e.ui.registry.addButton("cancel",{icon:"cancel",tooltip:"Cancel",enabled:!1,onAction:()=>e.execCommand("mceCancel"),onSetup:l(e)}),e.addShortcut("Meta+S","","mceSave")})(e),(e=>{e.addCommand("mceSave",(()=>{(e=>{const t=o.DOM.getParent(e.id,"form");if(c(e)&&!e.isDirty())return;e.save();const a=i(e);if(n(a))return a.call(e,e),void e.nodeChanged();t?(e.setDirty(!1),t.onsubmit&&!t.onsubmit()||("function"==typeof t.submit?t.submit():r(e,"Error: Form submit field collision.")),e.nodeChanged()):r(e,"Error: No form element found.")})(e)})),e.addCommand("mceCancel",(()=>{(e=>{const o=t.trim(e.startContent),a=s(e);n(a)?a.call(e,e):e.resetContent(o)})(e)}))})(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/searchreplace/plugin.js b/public/assets/tinymce/plugins/searchreplace/plugin.js
index 1694713cbd877a2d9ba05ee6eba77e82a192e374..762910b81e4b9690db702bb54c0e0690e684e1af 100644
--- a/public/assets/tinymce/plugins/searchreplace/plugin.js
+++ b/public/assets/tinymce/plugins/searchreplace/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";const e=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}};var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const n=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var n,o,r,s})(t)===e,o=e=>t=>typeof t===e,r=n("string"),s=n("array"),a=o("boolean"),l=o("number"),i=()=>{},c=e=>()=>e,d=c(!0),u=c("[!-#%-*,-\\/:;?@\\[-\\]_{}\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]");class m{constructor(e,t){this.tag=e,this.value=t}static some(e){return new m(!0,e)}static none(){return m.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?m.some(e(this.value)):m.none()}bind(e){return this.tag?e(this.value):m.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:m.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?m.none():m.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}m.singletonNone=new m(!1);const h=u;var g=tinymce.util.Tools.resolve("tinymce.Env"),f=tinymce.util.Tools.resolve("tinymce.util.Tools");const p=Array.prototype.slice,x=Array.prototype.push,y=(e,t)=>{const n=e.length,o=new Array(n);for(let r=0;r<n;r++){const n=e[r];o[r]=t(n,r)}return o},w=(e,t)=>{for(let n=0,o=e.length;n<o;n++)t(e[n],n)},b=(e,t)=>{for(let n=e.length-1;n>=0;n--)t(e[n],n)},v=(e,t)=>(e=>{const t=[];for(let n=0,o=e.length;n<o;++n){if(!s(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);x.apply(t,e[n])}return t})(y(e,t)),C=Object.hasOwnProperty,E=(e,t)=>C.call(e,t);"undefined"!=typeof window?window:Function("return this;")();const O=(3,e=>3===(e=>e.dom.nodeType)(e));const N=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},k=N,T=(e,t)=>({element:e,offset:t}),A=(e,t)=>{((e,t)=>{const n=(e=>m.from(e.dom.parentNode).map(k))(e);n.each((n=>{n.dom.insertBefore(t.dom,e.dom)}))})(e,t),((e,t)=>{e.dom.appendChild(t.dom)})(t,e)},S=((e,t)=>{const n=t=>e(t)?m.from(t.dom.nodeValue):m.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return n(t).getOr("")},getOption:n,set:(t,n)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=n}}})(O),B=e=>S.get(e);var F=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker");const I=(e,t)=>e.isBlock(t)||E(e.schema.getVoidElements(),t.nodeName),M=(e,t)=>"false"===e.getContentEditable(t),R=(e,t)=>!e.isBlock(t)&&E(e.schema.getWhitespaceElements(),t.nodeName),P=(e,t)=>((e,t)=>{const n=(e=>y(e.dom.childNodes,k))(e);return n.length>0&&t<n.length?T(n[t],0):T(e,t)})(k(e),t),D=(e,t,n,o,r,s=!0)=>{let a=s?t(!1):n;for(;a;){const n=M(e,a);if(n||R(e,a)){if(n?o.cef(a):o.boundary(a))break;a=t(!0)}else{if(I(e,a)){if(o.boundary(a))break}else 3===a.nodeType&&o.text(a);if(a===r)break;a=t(!1)}}},W=(e,t,n,o,r)=>{if(((e,t)=>I(e,t)||M(e,t)||R(e,t)||((e,t)=>"true"===e.getContentEditable(t)&&"false"===e.getContentEditableParent(t.parentNode))(e,t))(e,n))return;const s=e.getParent(o,e.isBlock),a=new F(n,s),l=r?a.next.bind(a):a.prev.bind(a);D(e,l,n,{boundary:d,cef:d,text:e=>{r?t.fOffset+=e.length:t.sOffset+=e.length,t.elements.push(k(e))}})},V=(e,t,n,o,r,s=!0)=>{const a=new F(n,t),l=[];let i={sOffset:0,fOffset:0,elements:[]};W(e,i,n,t,!1);const c=()=>(i.elements.length>0&&(l.push(i),i={sOffset:0,fOffset:0,elements:[]}),!1);return D(e,a.next.bind(a),n,{boundary:c,cef:e=>(c(),r&&l.push(...r.cef(e)),!1),text:e=>{i.elements.push(k(e)),r&&r.text(e,i)}},o,s),o&&W(e,i,o,t,!0),c(),l},$=(e,t)=>{const n=P(t.startContainer,t.startOffset),o=n.element.dom,r=P(t.endContainer,t.endOffset),s=r.element.dom;return V(e,t.commonAncestorContainer,o,s,{text:(e,t)=>{e===s?t.fOffset+=e.length-r.offset:e===o&&(t.sOffset+=n.offset)},cef:t=>{return((e,t)=>{const n=p.call(e,0);return n.sort(((e,t)=>((e,t)=>((e,t,n)=>0!=(e.compareDocumentPosition(t)&n))(e,t,Node.DOCUMENT_POSITION_PRECEDING))(e.elements[0].dom,t.elements[0].dom)?1:-1)),n})(v((n=k(t),((e,t)=>{const n=void 0===t?document:t.dom;return 1!==(o=n).nodeType&&9!==o.nodeType&&11!==o.nodeType||0===o.childElementCount?[]:y(n.querySelectorAll(e),k);var o})("*[contenteditable=true]",n)),(t=>{const n=t.dom;return V(e,n,n)})));var n}},!1)},j=(e,t)=>t.collapsed?[]:$(e,t),_=(e,t)=>{const n=e.createRng();return n.selectNode(t),j(e,n)},z=(e,t)=>v(t,(t=>{const n=t.elements,o=y(n,B).join(""),r=((e,t,n=0,o=e.length)=>{const r=t.regex;r.lastIndex=n;const s=[];let a;for(;a=r.exec(e);){const e=a[t.matchIndex],n=a.index+a[0].indexOf(e),l=n+e.length;if(l>o)break;s.push({start:n,finish:l}),r.lastIndex=l}return s})(o,e,t.sOffset,o.length-t.fOffset);return((e,t)=>{const n=(o=e,r=(e,n)=>{const o=B(n),r=e.last,s=r+o.length,a=v(t,((e,t)=>e.start<s&&e.finish>r?[{element:n,start:Math.max(r,e.start)-r,finish:Math.min(s,e.finish)-r,matchId:t}]:[]));return{results:e.results.concat(a),last:s}},s={results:[],last:0},w(o,((e,t)=>{s=r(s,e)})),s).results;var o,r,s;return((e,t)=>{if(0===e.length)return[];{let n=t(e[0]);const o=[];let r=[];for(let s=0,a=e.length;s<a;s++){const a=e[s],l=t(a);l!==n&&(o.push(r),r=[]),n=l,r.push(a)}return 0!==r.length&&o.push(r),o}})(n,(e=>e.matchId))})(n,r)})),U=(e,t)=>{b(e,((e,n)=>{b(e,(e=>{const o=k(t.cloneNode(!1));((e,t,n)=>{((e,t,n)=>{if(!(r(n)||a(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)})(o,"data-mce-index",n);const s=e.element.dom;if(s.length===e.finish&&0===e.start)A(e.element,o);else{s.length!==e.finish&&s.splitText(e.finish);const t=s.splitText(e.start);A(k(t),o)}}))}))},q=e=>{const t=e.getAttribute("data-mce-index");return"number"==typeof t?""+t:t},G=(e,t,n,o)=>{const r=e.dom.create("span",{"data-mce-bogus":1});r.className="mce-match-marker";const s=e.getBody();return te(e,t,!1),o?((e,t,n,o)=>{const r=n.getBookmark(),s=e.select("td[data-mce-selected],th[data-mce-selected]"),a=s.length>0?((e,t)=>v(t,(t=>_(e,t))))(e,s):j(e,n.getRng()),l=z(t,a);return U(l,o),n.moveToBookmark(r),l.length})(e.dom,n,e.selection,r):((e,t,n,o)=>{const r=_(e,n),s=z(t,r);return U(s,o),s.length})(e.dom,n,s,r)},K=e=>{const t=e.parentNode;e.firstChild&&t.insertBefore(e.firstChild,e),e.parentNode.removeChild(e)},H=(e,t)=>{const n=[],o=f.toArray(e.getBody().getElementsByTagName("span"));if(o.length)for(let e=0;e<o.length;e++){const r=q(o[e]);null!==r&&r.length&&r===t.toString()&&n.push(o[e])}return n},J=(e,t,n)=>{const o=t.get();let r=o.index;const s=e.dom;(n=!1!==n)?r+1===o.count?r=0:r++:r-1==-1?r=o.count-1:r--,s.removeClass(H(e,o.index),"mce-match-marker-selected");const a=H(e,r);return a.length?(s.addClass(H(e,r),"mce-match-marker-selected"),e.selection.scrollIntoView(a[0]),r):-1},L=(e,t)=>{const n=t.parentNode;e.remove(t),e.isEmpty(n)&&e.remove(n)},Q=(e,t,n,o,r,s)=>{const a=e.selection,l=((e,t)=>{const n="("+e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&").replace(/\s/g,"[^\\S\\r\\n\\uFEFF]")+")";return t?`(?:^|\\s|${h()})`+n+`(?=$|\\s|${h()})`:n})(n,r),i=a.isForward(),c={regex:new RegExp(l,o?"g":"gi"),matchIndex:1},d=G(e,t,c,s);if(g.browser.isSafari()&&a.setRng(a.getRng(),i),d){const a=J(e,t,!0);t.set({index:a,count:d,text:n,matchCase:o,wholeWord:r,inSelection:s})}return d},X=(e,t)=>{const n=J(e,t,!0);t.set({...t.get(),index:n})},Y=(e,t)=>{const n=J(e,t,!1);t.set({...t.get(),index:n})},Z=e=>{const t=q(e);return null!==t&&t.length>0},ee=(e,t,n,o,r)=>{const s=t.get(),a=s.index;let l,i=a;o=!1!==o;const c=e.getBody(),d=f.grep(f.toArray(c.getElementsByTagName("span")),Z);for(let t=0;t<d.length;t++){const c=q(d[t]);let u=l=parseInt(c,10);if(r||u===s.index){for(n.length?(d[t].firstChild.nodeValue=n,K(d[t])):L(e.dom,d[t]);d[++t];){if(u=parseInt(q(d[t]),10),u!==l){t--;break}L(e.dom,d[t])}o&&i--}else l>a&&d[t].setAttribute("data-mce-index",String(l-1))}return t.set({...s,count:r?0:s.count-1,index:i}),o?X(e,t):Y(e,t),!r&&t.get().count>0},te=(e,t,n)=>{let o,r;const s=t.get(),a=f.toArray(e.getBody().getElementsByTagName("span"));for(let e=0;e<a.length;e++){const t=q(a[e]);null!==t&&t.length&&(t===s.index.toString()&&(o||(o=a[e].firstChild),r=a[e].firstChild),K(a[e]))}if(t.set({...s,index:-1,count:0,text:""}),o&&r){const t=e.dom.createRng();return t.setStart(o,0),t.setEnd(r,r.data.length),!1!==n&&e.selection.setRng(t),t}},ne=(t,n)=>{const o=(()=>{const t=(t=>{const n=e(m.none()),o=()=>n.get().each(t);return{clear:()=>{o(),n.set(m.none())},isSet:()=>n.get().isSome(),get:()=>n.get(),set:e=>{o(),n.set(m.some(e))}}})(i);return{...t,on:e=>t.get().each(e)}})();t.undoManager.add();const r=f.trim(t.selection.getContent({format:"text"})),s=e=>{e.setEnabled("next",((e,t)=>t.get().count>1)(0,n)),e.setEnabled("prev",((e,t)=>t.get().count>1)(0,n))},a=(e,t)=>{w(["replace","replaceall","prev","next"],(n=>e.setEnabled(n,!t)))},l=(e,t)=>{g.browser.isSafari()&&g.deviceType.isTouch()&&("find"===t||"replace"===t||"replaceall"===t)&&e.focus(t)},c=e=>{te(t,n,!1),a(e,!0),s(e)},d=e=>{const o=e.getData(),r=n.get();if(o.findtext.length){if(r.text===o.findtext&&r.matchCase===o.matchcase&&r.wholeWord===o.wholewords)X(t,n);else{const r=Q(t,n,o.findtext,o.matchcase,o.wholewords,o.inselection);r<=0&&(e=>{t.windowManager.alert("Could not find the specified string.",(()=>{e.focus("findtext")}))})(e),a(e,0===r)}s(e)}else c(e)},u=n.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",enabled:!1,borderless:!0},{type:"button",name:"next",text:"Next",icon:"action-next",enabled:!1,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",enabled:!1},{type:"custom",name:"replaceall",text:"Replace all",enabled:!1}],initialData:{findtext:r,replacetext:"",wholewords:u.wholeWord,matchcase:u.matchCase,inselection:u.inSelection},onChange:(e,t)=>{"findtext"===t.name&&n.get().count>0&&c(e)},onAction:(e,o)=>{const r=e.getData();switch(o.name){case"find":d(e);break;case"replace":ee(t,n,r.replacetext)?s(e):c(e);break;case"replaceall":ee(t,n,r.replacetext,!0,!0),c(e);break;case"prev":Y(t,n),s(e);break;case"next":X(t,n),s(e);break;case"matchcase":case"wholewords":case"inselection":(e=>{const t=e.getData(),o=n.get();n.set({...o,matchCase:t.matchcase,wholeWord:t.wholewords,inSelection:t.inselection})})(e),c(e)}l(e,o.name)},onSubmit:e=>{d(e),l(e,"find")},onClose:()=>{t.focus(),te(t,n),t.undoManager.add()}};o.set(t.windowManager.open(h,{inline:"toolbar"}))},oe=(e,t)=>()=>{ne(e,t)};t.add("searchreplace",(t=>{const n=e({index:-1,count:0,text:"",matchCase:!1,wholeWord:!1,inSelection:!1});return((e,t)=>{e.addCommand("SearchReplace",(()=>{ne(e,t)}))})(t,n),((e,t)=>{e.ui.registry.addMenuItem("searchreplace",{text:"Find and replace...",shortcut:"Meta+F",onAction:oe(e,t),icon:"search"}),e.ui.registry.addButton("searchreplace",{tooltip:"Find and replace",onAction:oe(e,t),icon:"search"}),e.shortcuts.add("Meta+F","",oe(e,t))})(t,n),((e,t)=>({done:n=>te(e,t,n),find:(n,o,r,s=!1)=>Q(e,t,n,o,r,s),next:()=>X(e,t),prev:()=>Y(e,t),replace:(n,o,r)=>ee(e,t,n,o,r)}))(t,n)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/table/plugin.js b/public/assets/tinymce/plugins/table/plugin.js
index 8a6015302c6441088e3c7c1c440c6cd40315b03f..7b67b192687bc1de554a460c6c53b7c3879e8f75 100644
--- a/public/assets/tinymce/plugins/table/plugin.js
+++ b/public/assets/tinymce/plugins/table/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=l=e,(n=String).prototype.isPrototypeOf(o)||(null===(r=l.constructor)||void 0===r?void 0:r.name)===n.name)?"string":t;var o,l,n,r})(t)===e,o=e=>t=>typeof t===e,l=t("string"),n=t("array"),r=o("boolean"),a=(void 0,e=>undefined===e);const s=e=>!(e=>null==e)(e),c=o("function"),i=o("number"),m=()=>{},d=e=>()=>e,u=e=>e,p=(e,t)=>e===t;function b(e,...t){return(...o)=>{const l=t.concat(o);return e.apply(null,l)}}const g=d(!1),h=d(!0);class f{constructor(e,t){this.tag=e,this.value=t}static some(e){return new f(!0,e)}static none(){return f.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?f.some(e(this.value)):f.none()}bind(e){return this.tag?e(this.value):f.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:f.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return s(e)?f.some(e):f.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}f.singletonNone=new f(!1);const y=Object.keys,w=Object.hasOwnProperty,S=(e,t)=>{const o=y(e);for(let l=0,n=o.length;l<n;l++){const n=o[l];t(e[n],n)}},C=(e,t)=>{const o={};var l;return((e,t,o,l)=>{S(e,((e,n)=>{(t(e,n)?o:l)(e,n)}))})(e,t,(l=o,(e,t)=>{l[t]=e}),m),o},v=e=>y(e).length,T=(e,t)=>x(e,t)?f.from(e[t]):f.none(),x=(e,t)=>w.call(e,t),A=(e,t)=>x(e,t)&&void 0!==e[t]&&null!==e[t],R=Array.prototype.indexOf,_=Array.prototype.push,O=(e,t)=>((e,t)=>R.call(e,t))(e,t)>-1,D=(e,t)=>{for(let o=0,l=e.length;o<l;o++)if(t(e[o],o))return!0;return!1},I=(e,t)=>{const o=[];for(let l=0;l<e;l++)o.push(t(l));return o},M=(e,t)=>{const o=e.length,l=new Array(o);for(let n=0;n<o;n++){const o=e[n];l[n]=t(o,n)}return l},N=(e,t)=>{for(let o=0,l=e.length;o<l;o++)t(e[o],o)},P=(e,t)=>{const o=[];for(let l=0,n=e.length;l<n;l++){const n=e[l];t(n,l)&&o.push(n)}return o},k=(e,t,o)=>(N(e,((e,l)=>{o=t(o,e,l)})),o),B=(e,t)=>((e,t,o)=>{for(let l=0,n=e.length;l<n;l++){const n=e[l];if(t(n,l))return f.some(n);if(o(n,l))break}return f.none()})(e,t,g),E=(e,t)=>(e=>{const t=[];for(let o=0,l=e.length;o<l;++o){if(!n(e[o]))throw new Error("Arr.flatten item "+o+" was not an array, input: "+e);_.apply(t,e[o])}return t})(M(e,t)),F=(e,t)=>{for(let o=0,l=e.length;o<l;++o)if(!0!==t(e[o],o))return!1;return!0},q=(e,t)=>t>=0&&t<e.length?f.some(e[t]):f.none(),L=(e,t)=>{for(let o=0;o<e.length;o++){const l=t(e[o],o);if(l.isSome())return l}return f.none()},H=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},j={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return H(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return H(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return H(o)},fromDom:H,fromPoint:(e,t,o)=>f.from(e.dom.elementFromPoint(t,o)).map(H)};"undefined"!=typeof window?window:Function("return this;")();const V=e=>e.dom.nodeName.toLowerCase(),z=e=>e.dom.nodeType,W=e=>t=>z(t)===e,$=W(1),U=W(3),G=W(9),K=W(11),J=e=>t=>$(t)&&V(t)===e,Q=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},X=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,Y=(e,t)=>e.dom===t.dom,Z=Q,ee=e=>G(e)?e:j.fromDom(e.dom.ownerDocument),te=e=>f.from(e.dom.parentNode).map(j.fromDom),oe=e=>f.from(e.dom.nextSibling).map(j.fromDom),le=e=>M(e.dom.childNodes,j.fromDom),ne=c(Element.prototype.attachShadow)&&c(Node.prototype.getRootNode)?e=>j.fromDom(e.dom.getRootNode()):ee,re=e=>j.fromDom(e.dom.host),ae=e=>{const t=U(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=ne(e);return K(o=t)&&s(o.dom.host)?f.some(t):f.none();var o})(j.fromDom(t)).fold((()=>o.body.contains(t)),(l=ae,n=re,e=>l(n(e))));var l,n},se=(e,t)=>{let o=[];return N(le(e),(e=>{t(e)&&(o=o.concat([e])),o=o.concat(se(e,t))})),o},ce=(e,t)=>((e,o)=>P(le(e),(e=>Q(e,t))))(e),ie=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return X(o)?[]:M(o.querySelectorAll(e),j.fromDom)})(t,e),me=(e,t,o)=>{let l=e.dom;const n=c(o)?o:g;for(;l.parentNode;){l=l.parentNode;const e=j.fromDom(l);if(t(e))return f.some(e);if(n(e))break}return f.none()},de=(e,t,o)=>me(e,(e=>Q(e,t)),o),ue=(e,t)=>((e,o)=>B(e.dom.childNodes,(e=>{return o=j.fromDom(e),Q(o,t);var o})).map(j.fromDom))(e),pe=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return X(o)?f.none():f.from(o.querySelector(e)).map(j.fromDom)})(t,e),be=(e,t,o)=>((e,t,o,l,n)=>((e,t)=>Q(e,t))(o,l)?f.some(o):c(n)&&n(o)?f.none():t(o,l,n))(0,de,e,t,o),ge=(e,t,o)=>{if(!(l(o)||r(o)||i(o)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",o,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,o+"")},he=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},fe=(e,t)=>f.from(he(e,t)),ye=(e,t)=>{e.dom.removeAttribute(t)},we=(e,t,o=p)=>e.exists((e=>o(e,t))),Se=(e,t,o)=>e.isSome()&&t.isSome()?f.some(o(e.getOrDie(),t.getOrDie())):f.none(),Ce=(e,t)=>((e,t,o)=>""===t||e.length>=t.length&&e.substr(0,0+t.length)===t)(e,t),ve=(Te=/^\s+|\s+$/g,e=>e.replace(Te,""));var Te;const xe=e=>e.length>0,Ae=e=>void 0!==e.style&&c(e.style.getPropertyValue),Re=(e,t)=>{const o=e.dom,l=window.getComputedStyle(o).getPropertyValue(t);return""!==l||ae(e)?l:_e(o,t)},_e=(e,t)=>Ae(e)?e.style.getPropertyValue(t):"",Oe=(e,t)=>{const o=e.dom,l=_e(o,t);return f.from(l).filter((e=>e.length>0))},De=(e,t,o=0)=>fe(e,t).map((e=>parseInt(e,10))).getOr(o),Ie=(e,t)=>Me(e,t,h),Me=(e,t,o)=>E(le(e),(e=>Q(e,t)?o(e)?[e]:[]:Me(e,t,o))),Ne=["tfoot","thead","tbody","colgroup"],Pe=(e,t,o)=>({element:e,rowspan:t,colspan:o}),ke=(e,t,o)=>({element:e,cells:t,section:o}),Be=(e,t)=>be(e,"table",t),Ee=e=>Ie(e,"tr"),Fe=e=>Be(e).fold(d([]),(e=>ce(e,"colgroup"))),qe=e=>te(e).map((e=>{const t=V(e);return(e=>O(Ne,e))(t)?t:"tbody"})).getOr("tbody"),Le=e=>fe(e,"data-snooker-locked-cols").bind((e=>f.from(e.match(/\d+/g)))).map((e=>((e,t)=>{const o={};for(let l=0,n=e.length;l<n;l++){const n=e[l];o[String(n)]=t(n,l)}return o})(e,h))),He=(e,t)=>e+","+t,je=e=>{const t={},o=[];var l;const n=(l=e,q(l,0)).map((e=>e.element)).bind(Be).bind(Le).getOr({});let r=0,a=0,s=0;const{pass:c,fail:i}=((e,t)=>{const o=[],l=[];for(let t=0,r=e.length;t<r;t++){const r=e[t];(n=r,"colgroup"===n.section?o:l).push(r)}var n;return{pass:o,fail:l}})(e);N(i,(e=>{const l=[];N(e.cells,(e=>{let o=0;for(;void 0!==t[He(s,o)];)o++;const r=A(n,o.toString()),c=((e,t,o,l,n,r)=>({element:e,rowspan:t,colspan:o,row:l,column:n,isLocked:r}))(e.element,e.rowspan,e.colspan,s,o,r);for(let l=0;l<e.colspan;l++)for(let n=0;n<e.rowspan;n++){const e=o+l,r=He(s+n,e);t[r]=c,a=Math.max(a,e+1)}l.push(c)})),r++,o.push(ke(e.element,l,e.section)),s++}));const{columns:m,colgroups:d}=(e=>q(e,e.length-1))(c).map((e=>{const t=(e=>{const t={};let o=0;return N(e.cells,(e=>{const l=e.colspan;I(l,(n=>{const r=o+n;t[r]=((e,t,o)=>({element:e,colspan:t,column:o}))(e.element,l,r)})),o+=l})),t})(e),o=((e,t)=>({element:e,columns:t}))(e.element,((e,t)=>{const o=[];return S(e,((e,l)=>{o.push(t(e,l))})),o})(t,u));return{colgroups:[o],columns:t}})).getOrThunk((()=>({colgroups:[],columns:{}}))),p=((e,t)=>({rows:e,columns:t}))(r,a);return{grid:p,access:t,all:o,columns:m,colgroups:d}},Ve=e=>{const t=(e=>{const t=Ee(e);return((e,t)=>M(e,(e=>{if("colgroup"===V(e)){const t=M((e=>Q(e,"colgroup")?ce(e,"col"):E(Fe(e),(e=>ce(e,"col"))))(e),(e=>{const t=De(e,"span",1);return Pe(e,1,t)}));return ke(e,t,"colgroup")}{const o=M((e=>Ie(e,"th,td"))(e),(e=>{const t=De(e,"rowspan",1),o=De(e,"colspan",1);return Pe(e,t,o)}));return ke(e,o,t(e))}})))([...Fe(e),...t],qe)})(e);return je(t)},ze=(e,t,o)=>f.from(e.access[He(t,o)]),We=(e,t,o)=>{const l=((e,t)=>{const o=E(e.all,(e=>e.cells));return P(o,t)})(e,(e=>o(t,e.element)));return l.length>0?f.some(l[0]):f.none()},$e=(e,t)=>f.from(e.columns[t]);var Ue=tinymce.util.Tools.resolve("tinymce.util.Tools");const Ge=(e,t,o)=>((t,l)=>{for(let n=0;n<l.length;n++){const r=e.getStyle(l[n],o);if(void 0===t&&(t=r),t!==r)return""}return t})(void 0,e.select("td,th",t)),Ke=(e,t,o)=>{o&&e.formatter.apply("align"+o,{},t)},Je=(e,t)=>{Ue.each("left center right".split(" "),(o=>{e.formatter.remove("align"+o,{},t)}))},Qe=(e,t,o)=>{e.dispatch("TableModified",{...o,table:t})},Xe=(e,t,o)=>((e,t)=>(e=>{const t=parseFloat(e);return isNaN(t)?f.none():f.some(t)})(e).getOr(t))(Re(e,t),o),Ye=e=>((e,t)=>{const o=e.dom,l=o.getBoundingClientRect().width||o.offsetWidth;return"border-box"===t?l:((e,t,o,l)=>t-Xe(e,"padding-left",0)-Xe(e,"padding-right",0)-Xe(e,"border-left-width",0)-Xe(e,"border-right-width",0))(e,l)})(e,"content-box");var Ze=tinymce.util.Tools.resolve("tinymce.Env");const et=I(5,(e=>{const t=`${e+1}px`;return{title:t,value:t}})),tt=M(["Solid","Dotted","Dashed","Double","Groove","Ridge","Inset","Outset","None","Hidden"],(e=>({title:e,value:e.toLowerCase()}))),ot=e=>t=>t.options.get(e),lt=ot("table_sizing_mode"),nt=ot("table_border_widths"),rt=ot("table_border_styles"),at=ot("table_default_attributes"),st=ot("table_cell_advtab"),ct=ot("table_row_advtab"),it=ot("table_advtab"),mt=ot("table_appearance_options"),dt=ot("table_grid"),ut=ot("table_style_by_css"),pt=ot("table_cell_class_list"),bt=ot("table_row_class_list"),gt=ot("table_class_list"),ht=ot("table_toolbar"),ft=ot("table_background_color_map"),yt=ot("table_border_color_map"),wt=e=>{const t=e.options,o=t.get("table_default_styles");return t.isSet("table_default_styles")?o:((e,t)=>{var o;if((e=>"fixed"===lt(e))(e)){const l=e.dom,n=null!==(o=l.getParent(e.selection.getStart(),l.isBlock))&&void 0!==o?o:e.getBody(),r=Ye(j.fromDom(n));return{...t,width:r+"px"}}return(e=>"responsive"===lt(e))(e)?C(t,((e,t)=>"width"!==t)):t})(e,o)},St=e=>t=>Y(t,(e=>j.fromDom(e.getBody()))(e)),Ct=e=>/^\d+(\.\d+)?$/.test(e)?e+"px":e,vt=e=>j.fromDom(e.selection.getStart()),Tt=(e,t)=>t.column>=e.startCol&&t.column+t.colspan-1<=e.finishCol&&t.row>=e.startRow&&t.row+t.rowspan-1<=e.finishRow,xt=(e,t,o)=>((e,t,o)=>{const l=We(e,t,Y),n=We(e,o,Y);return l.bind((e=>n.map((t=>{return o=e,l=t,{startRow:Math.min(o.row,l.row),startCol:Math.min(o.column,l.column),finishRow:Math.max(o.row+o.rowspan-1,l.row+l.rowspan-1),finishCol:Math.max(o.column+o.colspan-1,l.column+l.colspan-1)};var o,l}))))})(e,t,o).bind((t=>((e,t)=>{let o=!0;const l=b(Tt,t);for(let n=t.startRow;n<=t.finishRow;n++)for(let r=t.startCol;r<=t.finishCol;r++)o=o&&ze(e,n,r).exists(l);return o?f.some(t):f.none()})(e,t))),At=Ve,Rt=(e,t)=>{te(e).each((o=>{o.dom.insertBefore(t.dom,e.dom)}))},_t=(e,t)=>{oe(e).fold((()=>{te(e).each((e=>{Ot(e,t)}))}),(e=>{Rt(e,t)}))},Ot=(e,t)=>{e.dom.appendChild(t.dom)},Dt=(e,t)=>{N(t,((o,l)=>{const n=0===l?e:t[l-1];_t(n,o)}))},It=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},Mt=((e,t)=>{const o=t=>e(t)?f.from(t.dom.nodeValue):f.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return o(t).getOr("")},getOption:o,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(U);var Nt=["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"];const Pt=(e,t,o,l)=>{const n=t(e,o);return r=(o,l)=>{const n=t(e,l);return kt(e,o,n)},a=n,((e,t)=>{for(let o=e.length-1;o>=0;o--)t(e[o],o)})(l,((e,t)=>{a=r(a,e)})),a;var r,a},kt=(e,t,o)=>t.bind((t=>o.filter(b(e.eq,t)))),Bt={up:d({selector:de,closest:be,predicate:me,all:(e,t)=>{const o=c(t)?t:g;let l=e.dom;const n=[];for(;null!==l.parentNode&&void 0!==l.parentNode;){const e=l.parentNode,t=j.fromDom(e);if(n.push(t),!0===o(t))break;l=e}return n}}),down:d({selector:ie,predicate:se}),styles:d({get:Re,getRaw:Oe,set:(e,t,o)=>{((e,t,o)=>{if(!l(o))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",o,":: Element ",e),new Error("CSS value must be a string: "+o);Ae(e)&&e.style.setProperty(t,o)})(e.dom,t,o)},remove:(e,t)=>{((e,t)=>{Ae(e)&&e.style.removeProperty(t)})(e.dom,t),we(fe(e,"style").map(ve),"")&&ye(e,"style")}}),attrs:d({get:he,set:(e,t,o)=>{ge(e.dom,t,o)},remove:ye,copyTo:(e,t)=>{((e,t)=>{const o=e.dom;S(t,((e,t)=>{ge(o,t,e)}))})(t,k(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}))}}),insert:d({before:Rt,after:_t,afterAll:Dt,append:Ot,appendAll:(e,t)=>{N(t,(t=>{Ot(e,t)}))},prepend:(e,t)=>{(e=>((e,t)=>{const o=e.dom.childNodes;return f.from(o[0]).map(j.fromDom)})(e))(e).fold((()=>{Ot(e,t)}),(o=>{e.dom.insertBefore(t.dom,o.dom)}))},wrap:(e,t)=>{Rt(e,t),Ot(t,e)}}),remove:d({unwrap:e=>{const t=le(e);t.length>0&&Dt(e,t),It(e)},remove:It}),create:d({nu:j.fromTag,clone:e=>j.fromDom(e.dom.cloneNode(!1)),text:j.fromText}),query:d({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:e=>f.from(e.dom.previousSibling).map(j.fromDom),nextSibling:oe}),property:d({children:le,name:V,parent:te,document:e=>ee(e).dom,isText:U,isComment:e=>8===z(e)||"#comment"===V(e),isElement:$,isSpecial:e=>{const t=V(e);return O(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>$(e)?fe(e,"lang"):f.none(),getText:e=>Mt.get(e),setText:(e,t)=>Mt.set(e,t),isBoundary:e=>!!$(e)&&("body"===V(e)||O(Nt,V(e))),isEmptyTag:e=>!!$(e)&&O(["br","img","hr","input"],V(e)),isNonEditable:e=>$(e)&&"false"===he(e,"contenteditable")}),eq:Y,is:Z},Et=e=>de(e,"table"),Ft=(e,t,o)=>pe(e,t).bind((t=>pe(e,o).bind((e=>{return(o=Et,l=[t,e],((e,t,o)=>o.length>0?((e,t,o,l)=>l(e,t,o[0],o.slice(1)))(e,t,o,Pt):f.none())(Bt,((e,t)=>o(t)),l)).map((o=>({first:t,last:e,table:o})));var o,l})))),qt=e=>M(e,j.fromDom),Lt={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]"},Ht=e=>(t,o)=>{const l=V(t),n="col"===l||"colgroup"===l?Be(r=t).bind((e=>((e,t)=>((e,t)=>{const o=ie(e,t);return o.length>0?f.some(o):f.none()})(e,t))(e,Lt.firstSelectedSelector))).fold(d(r),(e=>e[0])):t;var r;return be(n,e,o)},jt=Ht("th,td,caption"),Vt=Ht("th,td"),zt=e=>qt(e.model.table.getSelectedCells()),Wt=(e,t)=>{const o=Vt(e),l=o.bind((e=>Be(e))).map((e=>Ee(e)));return Se(o,l,((e,o)=>P(o,(o=>D(qt(o.dom.cells),(o=>"1"===he(o,t)||Y(o,e))))))).getOr([])},$t=[{text:"None",value:""},{text:"Top",value:"top"},{text:"Middle",value:"middle"},{text:"Bottom",value:"bottom"}],Ut=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,Gt=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,Kt=e=>{return(t=e,"#",Ce(t,"#")?((e,t)=>e.substring(t))(t,"#".length):t).toUpperCase();var t},Jt=e=>{const t=e.toString(16);return(1===t.length?"0"+t:t).toUpperCase()},Qt=e=>({value:Jt(e.red)+Jt(e.green)+Jt(e.blue)}),Xt=/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/i,Yt=/^\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?(?:\.\d+)?)\s*\)\s*$/i,Zt=(e,t,o,l)=>({red:e,green:t,blue:o,alpha:l}),eo=(e,t,o,l)=>{const n=parseInt(e,10),r=parseInt(t,10),a=parseInt(o,10),s=parseFloat(l);return Zt(n,r,a,s)},to=e=>{if("transparent"===e)return f.some(Zt(0,0,0,0));const t=Xt.exec(e);if(null!==t)return f.some(eo(t[1],t[2],t[3],"1"));const o=Yt.exec(e);return null!==o?f.some(eo(o[1],o[2],o[3],o[4])):f.none()},oo=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},lo=(e,t,o)=>l=>{const n=(e=>{const t=oo(f.none()),o=()=>t.get().each(e);return{clear:()=>{o(),t.set(f.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{o(),t.set(f.some(e))}}})((e=>e.unbind())),r=!xe(o),a=()=>{const a=zt(e),s=l=>e.formatter.match(t,{value:o},l.dom,r);r?(l.setActive(!D(a,s)),n.set(e.formatter.formatChanged(t,(e=>l.setActive(!e)),!0))):(l.setActive(F(a,s)),n.set(e.formatter.formatChanged(t,l.setActive,!1,{value:o})))};return e.initialized?a():e.on("init",a),n.clear},no=e=>A(e,"menu"),ro=e=>M(e,(e=>{const t=e.text||e.title;return no(e)?{text:t,items:ro(e.menu)}:{text:t,value:e.value}})),ao=(e,t,o,l)=>M(t,(t=>{const n=t.text||t.title;return no(t)?{type:"nestedmenuitem",text:n,getSubmenuItems:()=>ao(e,t.menu,o,l)}:{text:n,type:"togglemenuitem",onAction:()=>l(t.value),onSetup:lo(e,o,t.value)}})),so=(e,t)=>o=>{e.execCommand("mceTableApplyCellStyle",!1,{[t]:o})},co=e=>E(e,(e=>no(e)?[{...e,menu:co(e.menu)}]:xe(e.value)?[e]:[])),io=(e,t,o,l)=>n=>n(ao(e,t,o,l)),mo=(e,t,o)=>{const l=M(t,(e=>{return{text:e.title,value:"#"+(o=e.value,(t=o,(e=>Ut.test(e)||Gt.test(e))(t)?f.some({value:Kt(t)}):f.none()).orThunk((()=>to(o).map(Qt))).getOrThunk((()=>{const e=document.createElement("canvas");e.height=1,e.width=1;const t=e.getContext("2d");t.clearRect(0,0,e.width,e.height),t.fillStyle="#FFFFFF",t.fillStyle=o,t.fillRect(0,0,1,1);const l=t.getImageData(0,0,1,1).data,n=l[0],r=l[1],a=l[2],s=l[3];return Qt(Zt(n,r,a,s))}))).value,type:"choiceitem"};var t,o}));return[{type:"fancymenuitem",fancytype:"colorswatch",initData:{colors:l.length>0?l:void 0,allowCustomColors:!1},onAction:t=>{const l="remove"===t.value?"":t.value;e.execCommand("mceTableApplyCellStyle",!1,{[o]:l})}}]},uo=e=>()=>{const t="header"===e.queryCommandValue("mceTableRowType")?"body":"header";e.execCommand("mceTableRowType",!1,{type:t})},po=e=>()=>{const t="th"===e.queryCommandValue("mceTableColType")?"td":"th";e.execCommand("mceTableColType",!1,{type:t})},bo=[{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:$t}],go=e=>bo.concat((e=>{const t=ro(pt(e));return t.length>0?f.some({name:"class",type:"listbox",label:"Class",items:t}):f.none()})(e).toArray()),ho=(e,t)=>{const o=[{name:"borderstyle",type:"listbox",label:"Border style",items:[{text:"Select...",value:""}].concat(ro(rt(e)))},{name:"bordercolor",type:"colorinput",label:"Border color"},{name:"backgroundcolor",type:"colorinput",label:"Background color"}];return{title:"Advanced",name:"advanced",items:"cell"===t?[{name:"borderwidth",type:"input",label:"Border width"}].concat(o):o}},fo=e=>(t,o)=>{const l=t.dom;return{setAttrib:(t,n)=>{e&&!n||l.setAttrib(o,t,n)},setStyle:(t,n)=>{e&&!n||l.setStyle(o,t,n)},setFormat:(l,n)=>{e&&!n||(""===n?t.formatter.remove(l,{value:null},o,!0):t.formatter.apply(l,{value:n},o))}}},yo={normal:fo(!1),ifTruthy:fo(!0)},wo=J("th"),So=(e,t)=>e&&t?"sectionCells":e?"section":"cells",Co=e=>{const t=M(e,(e=>(e=>{const t="thead"===e.section,o=we((e=>{const t=P(e,(e=>wo(e.element)));return 0===t.length?f.some("td"):t.length===e.length?f.some("th"):f.none()})(e.cells),"th");return"tfoot"===e.section?{type:"footer"}:t||o?{type:"header",subType:So(t,o)}:{type:"body"}})(e).type)),o=O(t,"header"),l=O(t,"footer");if(o||l){const e=O(t,"body");return!o||e||l?o||e||!l?f.none():f.some("footer"):f.some("header")}return f.some("body")},vo=(e,t)=>L(e.all,(e=>B(e.cells,(e=>Y(t,e.element))))),To=(e,t,o)=>{const l=(e=>{const t=[],o=e=>{t.push(e)};for(let t=0;t<e.length;t++)e[t].each(o);return t})(M(t.selection,(t=>{return(l=t,((e,t,o=g)=>o(t)?f.none():O(e,V(t))?f.some(t):de(t,e.join(","),(e=>Q(e,"table")||o(e))))(["td","th"],l,n)).bind((t=>vo(e,t))).filter(o);var l,n})));return n=l,l.length>0?f.some(n):f.none();var n},xo=(e,t)=>To(e,t,h),Ao=(e,t)=>F(t,(t=>((e,t)=>vo(e,t).exists((e=>!e.isLocked)))(e,t))),Ro=(e,t)=>((e,t)=>t.mergable)(0,t).filter((t=>Ao(e,t.cells))),_o=(e,t)=>((e,t)=>t.unmergable)(0,t).filter((t=>Ao(e,t))),Oo=((e=>{if(!n(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],o={};N(e,((l,r)=>{const a=y(l);if(1!==a.length)throw new Error("one and only one name per case");const s=a[0],c=l[s];if(void 0!==o[s])throw new Error("duplicate key detected:"+s);if("cata"===s)throw new Error("cannot have a case named cata (sorry)");if(!n(c))throw new Error("case arguments must be an array");t.push(s),o[s]=(...o)=>{const l=o.length;if(l!==c.length)throw new Error("Wrong number of arguments to case "+s+". Expected "+c.length+" ("+c+"), got "+l);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[r].apply(null,o)},match:e=>{const l=y(e);if(t.length!==l.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+l.join(","));if(!F(t,(e=>O(l,e))))throw new Error("Not all branches were specified when using match. Specified: "+l.join(", ")+"\nRequired: "+t.join(", "));return e[s].apply(null,o)},log:e=>{console.log(e,{constructors:t,constructor:s,params:o})}}}}))})([{none:[]},{only:["index"]},{left:["index","next"]},{middle:["prev","index","next"]},{right:["prev","index"]}]),(e,t)=>{const o=Ve(e);return xo(o,t).bind((e=>{const t=e[e.length-1],l=e[0].row,n=t.row+t.rowspan,r=o.all.slice(l,n);return Co(r)})).getOr("")}),Do=e=>{return Ce(e,"rgb")?to(t=e).map(Qt).map((e=>"#"+e.value)).getOr(t):e;var t},Io=e=>{const t=j.fromDom(e);return{borderwidth:Oe(t,"border-width").getOr(""),borderstyle:Oe(t,"border-style").getOr(""),bordercolor:Oe(t,"border-color").map(Do).getOr(""),backgroundcolor:Oe(t,"background-color").map(Do).getOr("")}},Mo=e=>{const t=e[0],o=e.slice(1);return N(o,(e=>{N(y(t),(o=>{S(e,((e,l)=>{const n=t[o];""!==n&&o===l&&n!==e&&(t[o]="")}))}))})),t},No=(e,t,o,l)=>B(e,(e=>!a(o.formatter.matchNode(l,t+e)))).getOr(""),Po=b(No,["left","center","right"],"align"),ko=b(No,["top","middle","bottom"],"valign"),Bo=e=>Be(j.fromDom(e)).map((t=>{const o={selection:qt(e.cells)};return Oo(t,o)})).getOr(""),Eo=(e,t)=>{const o=Ve(e),l=(e=>E(e.all,(e=>e.cells)))(o),n=P(l,(e=>D(t,(t=>Y(e.element,t)))));return M(n,(e=>({element:e.element.dom,column:$e(o,e.column).map((e=>e.element.dom))})))},Fo=(e,t,o,l)=>{const n=l.getData();l.close(),e.undoManager.transact((()=>{((e,t,o,l)=>{const n=C(l,((e,t)=>o[t]!==e));v(n)>0&&t.length>=1&&Be(t[0]).each((o=>{const r=Eo(o,t),a=v(C(n,((e,t)=>"scope"!==t&&"celltype"!==t)))>0,s=x(n,"celltype");(a||x(n,"scope"))&&((e,t,o)=>{const l=1===t.length;N(t,(t=>{const n=t.element,r=l?yo.normal(e,n):yo.ifTruthy(e,n);((e,t,o)=>{e.setAttrib("scope",o.scope),e.setAttrib("class",o.class),e.setStyle("height",Ct(o.height)),t.setStyle("width",Ct(o.width))})(r,t.column.map((t=>l?yo.normal(e,t):yo.ifTruthy(e,t))).getOr(r),o),st(e)&&((e,t)=>{e.setFormat("tablecellbackgroundcolor",t.backgroundcolor),e.setFormat("tablecellbordercolor",t.bordercolor),e.setFormat("tablecellborderstyle",t.borderstyle),e.setFormat("tablecellborderwidth",Ct(t.borderwidth))})(r,o),l&&(Je(e,n),((e,t)=>{Ue.each("top middle bottom".split(" "),(o=>{e.formatter.remove("valign"+o,{},t)}))})(e,n)),o.halign&&Ke(e,n,o.halign),o.valign&&((e,t,o)=>{o&&e.formatter.apply("valign"+o,{},t)})(e,n,o.valign)}))})(e,r,l),s&&((e,t)=>{e.execCommand("mceTableCellType",!1,{type:t.celltype,no_events:!0})})(e,l),Qe(e,o.dom,{structure:s,style:a})}))})(e,t,o,n),e.focus()}))},qo=e=>{const t=zt(e);if(0===t.length)return;const o=((e,t)=>{const o=Be(t[0]).map((o=>M(Eo(o,t),(t=>((e,t,o,l)=>{const n=e.dom,r=(e,t)=>n.getStyle(e,t)||n.getAttrib(e,t);return{width:r(l.getOr(t),"width"),height:r(t,"height"),scope:n.getAttrib(t,"scope"),celltype:(a=t,a.nodeName.toLowerCase()),class:n.getAttrib(t,"class",""),halign:Po(e,t),valign:ko(e,t),...o?Io(t):{}};var a})(e,t.element,st(e),t.column)))));return Mo(o.getOrDie())})(e,t),l={type:"tabpanel",tabs:[{title:"General",name:"general",items:go(e)},ho(e,"cell")]},n={type:"panel",items:[{type:"grid",columns:2,items:go(e)}]};e.windowManager.open({title:"Cell Properties",size:"normal",body:st(e)?l:n,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:o,onSubmit:b(Fo,e,t,o)})},Lo=[{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"}],Ho=e=>Lo.concat((e=>{const t=ro(bt(e));return t.length>0?f.some({name:"class",type:"listbox",label:"Class",items:t}):f.none()})(e).toArray()),jo=(e,t,o,l)=>{const n=l.getData();l.close(),e.undoManager.transact((()=>{((e,t,o,l)=>{const n=C(l,((e,t)=>o[t]!==e));if(v(n)>0){const r=x(n,"type"),a=!r||v(n)>1;a&&((e,t,o,l)=>{const n=1===t.length;N(t,(t=>{const r=n?yo.normal(e,t):yo.ifTruthy(e,t);((e,t)=>{e.setAttrib("class",t.class),e.setStyle("height",Ct(t.height))})(r,o),ct(e)&&((e,t)=>{e.setStyle("background-color",t.backgroundcolor),e.setStyle("border-color",t.bordercolor),e.setStyle("border-style",t.borderstyle)})(r,o),o.align!==l.align&&(Je(e,t),Ke(e,t,o.align))}))})(e,t,l,o),r&&((e,t)=>{e.execCommand("mceTableRowType",!1,{type:t.type,no_events:!0})})(e,l),Be(j.fromDom(t[0])).each((t=>Qe(e,t.dom,{structure:r,style:a})))}})(e,t,o,n),e.focus()}))},Vo=e=>{const t=Wt(vt(e),Lt.selected);if(0===t.length)return;const o=M(t,(t=>((e,t,o)=>{const l=e.dom;return{height:l.getStyle(t,"height")||l.getAttrib(t,"height"),class:l.getAttrib(t,"class",""),type:Bo(t),align:Po(e,t),...o?Io(t):{}}})(e,t.dom,ct(e)))),l=Mo(o),n={type:"tabpanel",tabs:[{title:"General",name:"general",items:Ho(e)},ho(e,"row")]},r={type:"panel",items:[{type:"grid",columns:2,items:Ho(e)}]};e.windowManager.open({title:"Row Properties",size:"normal",body:ct(e)?n:r,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:l,onSubmit:b(jo,e,M(t,(e=>e.dom)),l)})},zo=(e,t,o)=>{const l=o?[{type:"input",name:"cols",label:"Cols",inputMode:"numeric"},{type:"input",name:"rows",label:"Rows",inputMode:"numeric"}]:[],n=mt(e)?[{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"}]}]:[],r=t.length>0?[{type:"listbox",name:"class",label:"Class",items:t}]:[];return l.concat([{type:"input",name:"width",label:"Width"},{type:"input",name:"height",label:"Height"}]).concat(n).concat([{type:"listbox",name:"align",label:"Alignment",items:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]}]).concat(r)},Wo=(e,t,o,n)=>{if("TD"===t.tagName||"TH"===t.tagName)l(o)?e.setStyle(t,o,n):e.setStyles(t,o);else if(t.children)for(let l=0;l<t.children.length;l++)Wo(e,t.children[l],o,n)},$o=(e,t,o,l)=>{const n=e.dom,r=l.getData(),a=C(r,((e,t)=>o[t]!==e));l.close(),""===r.class&&delete r.class,e.undoManager.transact((()=>{if(!t){const o=parseInt(r.cols,10)||1,l=parseInt(r.rows,10)||1;e.execCommand("mceInsertTable",!1,{rows:l,columns:o}),t=Vt(vt(e),St(e)).bind((t=>Be(t,St(e)))).map((e=>e.dom)).getOrUndefined()}if(v(a)>0){((e,t,o)=>{const l=e.dom,n={},r={};if(n.class=o.class,r.height=Ct(o.height),l.getAttrib(t,"width")&&!ut(e)?n.width=(e=>e?e.replace(/px$/,""):"")(o.width):r.width=Ct(o.width),ut(e)?(r["border-width"]=Ct(o.border),r["border-spacing"]=Ct(o.cellspacing)):(n.border=o.border,n.cellpadding=o.cellpadding,n.cellspacing=o.cellspacing),ut(e)&&t.children)for(let n=0;n<t.children.length;n++)Wo(l,t.children[n],{"border-width":Ct(o.border),padding:Ct(o.cellpadding)}),it(e)&&Wo(l,t.children[n],{"border-color":o.bordercolor});it(e)&&(r["background-color"]=o.backgroundcolor,r["border-color"]=o.bordercolor,r["border-style"]=o.borderstyle),n.style=l.serializeStyle({...wt(e),...r}),l.setAttribs(t,{...at(e),...n})})(e,t,r);const o=n.select("caption",t)[0];(o&&!r.caption||!o&&r.caption)&&e.execCommand("mceTableToggleCaption"),""===r.align?Je(e,t):Ke(e,t,r.align)}if(e.focus(),e.addVisual(),v(a)>0){const o=x(a,"caption"),l=!o||v(a)>1;Qe(e,t,{structure:o,style:l})}}))},Uo=(e,t)=>{const o=e.dom;let l,n=((e,t)=>{const o=wt(e),l=at(e),n=t?{borderstyle:T(o,"border-style").getOr(""),bordercolor:Do(T(o,"border-color").getOr("")),backgroundcolor:Do(T(o,"background-color").getOr(""))}:{};return{height:"",width:"100%",cellspacing:"",cellpadding:"",caption:!1,class:"",align:"",border:"",...o,...l,...n,...(()=>{const t=o["border-width"];return ut(e)&&t?{border:t}:T(l,"border").fold((()=>({})),(e=>({border:e})))})(),...{...T(o,"border-spacing").or(T(l,"cellspacing")).fold((()=>({})),(e=>({cellspacing:e}))),...T(o,"border-padding").or(T(l,"cellpadding")).fold((()=>({})),(e=>({cellpadding:e})))}}})(e,it(e));!1===t?(l=o.getParent(e.selection.getStart(),"table",e.getBody()),l?n=((e,t,o)=>{const l=e.dom,n=ut(e)?l.getStyle(t,"border-spacing")||l.getAttrib(t,"cellspacing"):l.getAttrib(t,"cellspacing")||l.getStyle(t,"border-spacing"),r=ut(e)?Ge(l,t,"padding")||l.getAttrib(t,"cellpadding"):l.getAttrib(t,"cellpadding")||Ge(l,t,"padding");return{width:l.getStyle(t,"width")||l.getAttrib(t,"width"),height:l.getStyle(t,"height")||l.getAttrib(t,"height"),cellspacing:n,cellpadding:r,border:((t,o)=>{const l=Oe(j.fromDom(o),"border-width");return ut(e)&&l.isSome()?l.getOr(""):t.getAttrib(o,"border")||Ge(e.dom,o,"border-width")||Ge(e.dom,o,"border")})(l,t),caption:!!l.select("caption",t)[0],class:l.getAttrib(t,"class",""),align:Po(e,t),...o?Io(t):{}}})(e,l,it(e)):it(e)&&(n.borderstyle="",n.bordercolor="",n.backgroundcolor="")):(n.cols="1",n.rows="1",it(e)&&(n.borderstyle="",n.bordercolor="",n.backgroundcolor=""));const r=ro(gt(e));r.length>0&&n.class&&(n.class=n.class.replace(/\s*mce\-item\-table\s*/g,""));const a={type:"grid",columns:2,items:zo(e,r,t)},s=it(e)?{type:"tabpanel",tabs:[{title:"General",name:"general",items:[a]},ho(e,"table")]}:{type:"panel",items:[a]};e.windowManager.open({title:"Table Properties",size:"normal",body:s,onSubmit:b($o,e,l,n),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:n})},Go=u,Ko=e=>{const t=(e,t)=>fe(e,t).exists((e=>parseInt(e,10)>1));return e.length>0&&F(e,(e=>t(e,"rowspan")||t(e,"colspan")))?f.some(e):f.none()},Jo=(e,t,o)=>{return t.length<=1?f.none():(l=e,n=o.firstSelectedSelector,r=o.lastSelectedSelector,Ft(l,n,r).bind((e=>{const t=e=>Y(l,e),o="thead,tfoot,tbody,table",n=de(e.first,o,t),r=de(e.last,o,t);return n.bind((t=>r.bind((o=>Y(t,o)?((e,t,o)=>{const l=At(e);return xt(l,t,o)})(e.table,e.first,e.last):f.none()))))}))).map((e=>({bounds:e,cells:t})));var l,n,r},Qo=e=>{const t=oo(f.none()),o=oo([]);let l=f.none();const n=J("caption"),r=e=>l.forall((t=>!t[e])),a=()=>jt(vt(e),St(e)).bind((t=>{return o=Se(Be(t),jt((e=>j.fromDom(e.selection.getEnd()))(e),St(e)).bind(Be),((o,l)=>Y(o,l)?n(t)?f.some((e=>({element:e,mergable:f.none(),unmergable:f.none(),selection:[e]}))(t)):f.some(((e,t,o)=>({element:o,mergable:Jo(t,e,Lt),unmergable:Ko(e),selection:Go(e)}))(zt(e),o,t)):f.none())),o.bind(u);var o})),s=e=>Be(e.element).map((t=>{const o=Ve(t),l=xo(o,e).getOr([]),n=k(l,((e,t)=>(t.isLocked&&(e.onAny=!0,0===t.column?e.onFirst=!0:t.column+t.colspan>=o.grid.columns&&(e.onLast=!0)),e)),{onAny:!1,onFirst:!1,onLast:!1});return{mergeable:Ro(o,e).isSome(),unmergeable:_o(o,e).isSome(),locked:n}})),c=()=>{t.set((e=>{let t,o=!1;return(...l)=>(o||(o=!0,t=e.apply(null,l)),t)})(a)()),l=t.get().bind(s),N(o.get(),(e=>e()))},i=e=>(e(),o.set(o.get().concat([e])),()=>{o.set(P(o.get(),(t=>t!==e)))}),m=(e,o)=>i((()=>t.get().fold((()=>{e.setEnabled(!1)}),(t=>{e.setEnabled(!o(t))})))),d=(e,o,l)=>i((()=>t.get().fold((()=>{e.setEnabled(!1),e.setActive(!1)}),(t=>{e.setEnabled(!o(t)),e.setActive(l(t))})))),p=e=>l.exists((t=>t.locked[e])),b=(t,o)=>l=>d(l,(e=>n(e.element)),(()=>e.queryCommandValue(t)===o)),h=b("mceTableRowType","header"),y=b("mceTableColType","th");return e.on("NodeChange ExecCommand TableSelectorChange",c),{onSetupTable:e=>m(e,(e=>!1)),onSetupCellOrRow:e=>m(e,(e=>n(e.element))),onSetupColumn:e=>t=>m(t,(t=>n(t.element)||p(e))),onSetupPasteable:e=>t=>m(t,(t=>n(t.element)||e().isNone())),onSetupPasteableColumn:(e,t)=>o=>m(o,(o=>n(o.element)||e().isNone()||p(t))),onSetupMergeable:e=>m(e,(e=>r("mergeable"))),onSetupUnmergeable:e=>m(e,(e=>r("unmergeable"))),resetTargets:c,onSetupTableWithCaption:t=>d(t,g,(t=>Be(t.element,St(e)).exists((e=>ue(e,"caption").isSome())))),onSetupTableRowHeaders:h,onSetupTableColumnHeaders:y,targets:t.get}};var Xo=tinymce.util.Tools.resolve("tinymce.FakeClipboard");const Yo=e=>{var t;const o=null!==(t=Xo.read())&&void 0!==t?t:[];return L(o,(t=>f.from(t.getType(e))))},Zo=()=>Yo("x-tinymce/dom-table-rows"),el=()=>Yo("x-tinymce/dom-table-columns");e.add("table",(e=>{const t=Qo(e);(e=>{const t=e.options.register;t("table_border_widths",{processor:"object[]",default:et}),t("table_border_styles",{processor:"object[]",default:tt}),t("table_cell_advtab",{processor:"boolean",default:!0}),t("table_row_advtab",{processor:"boolean",default:!0}),t("table_advtab",{processor:"boolean",default:!0}),t("table_appearance_options",{processor:"boolean",default:!0}),t("table_grid",{processor:"boolean",default:!Ze.deviceType.isTouch()}),t("table_style_by_css",{processor:"boolean",default:!0}),t("table_cell_class_list",{processor:"object[]",default:[]}),t("table_row_class_list",{processor:"object[]",default:[]}),t("table_class_list",{processor:"object[]",default:[]}),t("table_toolbar",{processor:"string",default:"tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol"}),t("table_background_color_map",{processor:"object[]",default:[]}),t("table_border_color_map",{processor:"object[]",default:[]})})(e),(e=>{S({mceTableProps:b(Uo,e,!1),mceTableRowProps:b(Vo,e),mceTableCellProps:b(qo,e)},((t,o)=>e.addCommand(o,(()=>t())))),e.addCommand("mceInsertTableDialog",(t=>{Uo(e,!0)}))})(e),((e,t)=>{const o=t=>()=>e.execCommand(t),l=(t,l)=>!!e.queryCommandSupported(l.command)&&(e.ui.registry.addMenuItem(t,{...l,onAction:c(l.onAction)?l.onAction:o(l.command)}),!0),n=(t,l)=>{e.queryCommandSupported(l.command)&&e.ui.registry.addToggleMenuItem(t,{...l,onAction:c(l.onAction)?l.onAction:o(l.command)})},r=t=>{e.execCommand("mceInsertTable",!1,{rows:t.numRows,columns:t.numColumns})},a=[l("tableinsertrowbefore",{text:"Insert row before",icon:"table-insert-row-above",command:"mceTableInsertRowBefore",onSetup:t.onSetupCellOrRow}),l("tableinsertrowafter",{text:"Insert row after",icon:"table-insert-row-after",command:"mceTableInsertRowAfter",onSetup:t.onSetupCellOrRow}),l("tabledeleterow",{text:"Delete row",icon:"table-delete-row",command:"mceTableDeleteRow",onSetup:t.onSetupCellOrRow}),l("tablerowprops",{text:"Row properties",icon:"table-row-properties",command:"mceTableRowProps",onSetup:t.onSetupCellOrRow}),l("tablecutrow",{text:"Cut row",icon:"cut-row",command:"mceTableCutRow",onSetup:t.onSetupCellOrRow}),l("tablecopyrow",{text:"Copy row",icon:"duplicate-row",command:"mceTableCopyRow",onSetup:t.onSetupCellOrRow}),l("tablepasterowbefore",{text:"Paste row before",icon:"paste-row-before",command:"mceTablePasteRowBefore",onSetup:t.onSetupPasteable(Zo)}),l("tablepasterowafter",{text:"Paste row after",icon:"paste-row-after",command:"mceTablePasteRowAfter",onSetup:t.onSetupPasteable(Zo)})],s=[l("tableinsertcolumnbefore",{text:"Insert column before",icon:"table-insert-column-before",command:"mceTableInsertColBefore",onSetup:t.onSetupColumn("onFirst")}),l("tableinsertcolumnafter",{text:"Insert column after",icon:"table-insert-column-after",command:"mceTableInsertColAfter",onSetup:t.onSetupColumn("onLast")}),l("tabledeletecolumn",{text:"Delete column",icon:"table-delete-column",command:"mceTableDeleteCol",onSetup:t.onSetupColumn("onAny")}),l("tablecutcolumn",{text:"Cut column",icon:"cut-column",command:"mceTableCutCol",onSetup:t.onSetupColumn("onAny")}),l("tablecopycolumn",{text:"Copy column",icon:"duplicate-column",command:"mceTableCopyCol",onSetup:t.onSetupColumn("onAny")}),l("tablepastecolumnbefore",{text:"Paste column before",icon:"paste-column-before",command:"mceTablePasteColBefore",onSetup:t.onSetupPasteableColumn(el,"onFirst")}),l("tablepastecolumnafter",{text:"Paste column after",icon:"paste-column-after",command:"mceTablePasteColAfter",onSetup:t.onSetupPasteableColumn(el,"onLast")})],i=[l("tablecellprops",{text:"Cell properties",icon:"table-cell-properties",command:"mceTableCellProps",onSetup:t.onSetupCellOrRow}),l("tablemergecells",{text:"Merge cells",icon:"table-merge-cells",command:"mceTableMergeCells",onSetup:t.onSetupMergeable}),l("tablesplitcells",{text:"Split cell",icon:"table-split-cells",command:"mceTableSplitCells",onSetup:t.onSetupUnmergeable})];dt(e)?e.ui.registry.addNestedMenuItem("inserttable",{text:"Table",icon:"table",getSubmenuItems:()=>[{type:"fancymenuitem",fancytype:"inserttable",onAction:r}]}):e.ui.registry.addMenuItem("inserttable",{text:"Table",icon:"table",onAction:o("mceInsertTableDialog")}),e.ui.registry.addMenuItem("inserttabledialog",{text:"Insert table",icon:"table",onAction:o("mceInsertTableDialog")}),l("tableprops",{text:"Table properties",onSetup:t.onSetupTable,command:"mceTableProps"}),l("deletetable",{text:"Delete table",icon:"table-delete-table",onSetup:t.onSetupTable,command:"mceTableDelete"}),O(a,!0)&&e.ui.registry.addNestedMenuItem("row",{type:"nestedmenuitem",text:"Row",getSubmenuItems:d("tableinsertrowbefore tableinsertrowafter tabledeleterow tablerowprops | tablecutrow tablecopyrow tablepasterowbefore tablepasterowafter")}),O(s,!0)&&e.ui.registry.addNestedMenuItem("column",{type:"nestedmenuitem",text:"Column",getSubmenuItems:d("tableinsertcolumnbefore tableinsertcolumnafter tabledeletecolumn | tablecutcolumn tablecopycolumn tablepastecolumnbefore tablepastecolumnafter")}),O(i,!0)&&e.ui.registry.addNestedMenuItem("cell",{type:"nestedmenuitem",text:"Cell",getSubmenuItems:d("tablecellprops tablemergecells tablesplitcells")}),e.ui.registry.addContextMenu("table",{update:()=>(t.resetTargets(),t.targets().fold(d(""),(e=>"caption"===V(e.element)?"tableprops deletetable":"cell row column | advtablesort | tableprops deletetable")))});const m=co(gt(e));0!==m.length&&e.queryCommandSupported("mceTableToggleClass")&&e.ui.registry.addNestedMenuItem("tableclass",{icon:"table-classes",text:"Table styles",getSubmenuItems:()=>ao(e,m,"tableclass",(t=>e.execCommand("mceTableToggleClass",!1,t))),onSetup:t.onSetupTable});const u=co(pt(e));0!==u.length&&e.queryCommandSupported("mceTableCellToggleClass")&&e.ui.registry.addNestedMenuItem("tablecellclass",{icon:"table-cell-classes",text:"Cell styles",getSubmenuItems:()=>ao(e,u,"tablecellclass",(t=>e.execCommand("mceTableCellToggleClass",!1,t))),onSetup:t.onSetupCellOrRow}),e.queryCommandSupported("mceTableApplyCellStyle")&&(e.ui.registry.addNestedMenuItem("tablecellvalign",{icon:"vertical-align",text:"Vertical align",getSubmenuItems:()=>ao(e,$t,"tablecellverticalalign",so(e,"vertical-align")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addNestedMenuItem("tablecellborderwidth",{icon:"border-width",text:"Border width",getSubmenuItems:()=>ao(e,nt(e),"tablecellborderwidth",so(e,"border-width")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addNestedMenuItem("tablecellborderstyle",{icon:"border-style",text:"Border style",getSubmenuItems:()=>ao(e,rt(e),"tablecellborderstyle",so(e,"border-style")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addNestedMenuItem("tablecellbackgroundcolor",{icon:"cell-background-color",text:"Background color",getSubmenuItems:()=>mo(e,ft(e),"background-color"),onSetup:t.onSetupCellOrRow}),e.ui.registry.addNestedMenuItem("tablecellbordercolor",{icon:"cell-border-color",text:"Border color",getSubmenuItems:()=>mo(e,yt(e),"border-color"),onSetup:t.onSetupCellOrRow})),n("tablecaption",{icon:"table-caption",text:"Table caption",command:"mceTableToggleCaption",onSetup:t.onSetupTableWithCaption}),n("tablerowheader",{text:"Row header",icon:"table-top-header",command:"mceTableRowType",onAction:uo(e),onSetup:t.onSetupTableRowHeaders}),n("tablecolheader",{text:"Column header",icon:"table-left-header",command:"mceTableColType",onAction:po(e),onSetup:t.onSetupTableRowHeaders})})(e,t),((e,t)=>{e.ui.registry.addMenuButton("table",{tooltip:"Table",icon:"table",fetch:e=>e("inserttable | cell row column | advtablesort | tableprops deletetable")});const o=t=>()=>e.execCommand(t),l=(t,l)=>{e.queryCommandSupported(l.command)&&e.ui.registry.addButton(t,{...l,onAction:c(l.onAction)?l.onAction:o(l.command)})},n=(t,l)=>{e.queryCommandSupported(l.command)&&e.ui.registry.addToggleButton(t,{...l,onAction:c(l.onAction)?l.onAction:o(l.command)})};l("tableprops",{tooltip:"Table properties",command:"mceTableProps",icon:"table",onSetup:t.onSetupTable}),l("tabledelete",{tooltip:"Delete table",command:"mceTableDelete",icon:"table-delete-table",onSetup:t.onSetupTable}),l("tablecellprops",{tooltip:"Cell properties",command:"mceTableCellProps",icon:"table-cell-properties",onSetup:t.onSetupCellOrRow}),l("tablemergecells",{tooltip:"Merge cells",command:"mceTableMergeCells",icon:"table-merge-cells",onSetup:t.onSetupMergeable}),l("tablesplitcells",{tooltip:"Split cell",command:"mceTableSplitCells",icon:"table-split-cells",onSetup:t.onSetupUnmergeable}),l("tableinsertrowbefore",{tooltip:"Insert row before",command:"mceTableInsertRowBefore",icon:"table-insert-row-above",onSetup:t.onSetupCellOrRow}),l("tableinsertrowafter",{tooltip:"Insert row after",command:"mceTableInsertRowAfter",icon:"table-insert-row-after",onSetup:t.onSetupCellOrRow}),l("tabledeleterow",{tooltip:"Delete row",command:"mceTableDeleteRow",icon:"table-delete-row",onSetup:t.onSetupCellOrRow}),l("tablerowprops",{tooltip:"Row properties",command:"mceTableRowProps",icon:"table-row-properties",onSetup:t.onSetupCellOrRow}),l("tableinsertcolbefore",{tooltip:"Insert column before",command:"mceTableInsertColBefore",icon:"table-insert-column-before",onSetup:t.onSetupColumn("onFirst")}),l("tableinsertcolafter",{tooltip:"Insert column after",command:"mceTableInsertColAfter",icon:"table-insert-column-after",onSetup:t.onSetupColumn("onLast")}),l("tabledeletecol",{tooltip:"Delete column",command:"mceTableDeleteCol",icon:"table-delete-column",onSetup:t.onSetupColumn("onAny")}),l("tablecutrow",{tooltip:"Cut row",command:"mceTableCutRow",icon:"cut-row",onSetup:t.onSetupCellOrRow}),l("tablecopyrow",{tooltip:"Copy row",command:"mceTableCopyRow",icon:"duplicate-row",onSetup:t.onSetupCellOrRow}),l("tablepasterowbefore",{tooltip:"Paste row before",command:"mceTablePasteRowBefore",icon:"paste-row-before",onSetup:t.onSetupPasteable(Zo)}),l("tablepasterowafter",{tooltip:"Paste row after",command:"mceTablePasteRowAfter",icon:"paste-row-after",onSetup:t.onSetupPasteable(Zo)}),l("tablecutcol",{tooltip:"Cut column",command:"mceTableCutCol",icon:"cut-column",onSetup:t.onSetupColumn("onAny")}),l("tablecopycol",{tooltip:"Copy column",command:"mceTableCopyCol",icon:"duplicate-column",onSetup:t.onSetupColumn("onAny")}),l("tablepastecolbefore",{tooltip:"Paste column before",command:"mceTablePasteColBefore",icon:"paste-column-before",onSetup:t.onSetupPasteableColumn(el,"onFirst")}),l("tablepastecolafter",{tooltip:"Paste column after",command:"mceTablePasteColAfter",icon:"paste-column-after",onSetup:t.onSetupPasteableColumn(el,"onLast")}),l("tableinsertdialog",{tooltip:"Insert table",command:"mceInsertTableDialog",icon:"table"});const r=co(gt(e));0!==r.length&&e.queryCommandSupported("mceTableToggleClass")&&e.ui.registry.addMenuButton("tableclass",{icon:"table-classes",tooltip:"Table styles",fetch:io(e,r,"tableclass",(t=>e.execCommand("mceTableToggleClass",!1,t))),onSetup:t.onSetupTable});const a=co(pt(e));0!==a.length&&e.queryCommandSupported("mceTableCellToggleClass")&&e.ui.registry.addMenuButton("tablecellclass",{icon:"table-cell-classes",tooltip:"Cell styles",fetch:io(e,a,"tablecellclass",(t=>e.execCommand("mceTableCellToggleClass",!1,t))),onSetup:t.onSetupCellOrRow}),e.queryCommandSupported("mceTableApplyCellStyle")&&(e.ui.registry.addMenuButton("tablecellvalign",{icon:"vertical-align",tooltip:"Vertical align",fetch:io(e,$t,"tablecellverticalalign",so(e,"vertical-align")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addMenuButton("tablecellborderwidth",{icon:"border-width",tooltip:"Border width",fetch:io(e,nt(e),"tablecellborderwidth",so(e,"border-width")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addMenuButton("tablecellborderstyle",{icon:"border-style",tooltip:"Border style",fetch:io(e,rt(e),"tablecellborderstyle",so(e,"border-style")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addMenuButton("tablecellbackgroundcolor",{icon:"cell-background-color",tooltip:"Background color",fetch:t=>t(mo(e,ft(e),"background-color")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addMenuButton("tablecellbordercolor",{icon:"cell-border-color",tooltip:"Border color",fetch:t=>t(mo(e,yt(e),"border-color")),onSetup:t.onSetupCellOrRow})),n("tablecaption",{tooltip:"Table caption",icon:"table-caption",command:"mceTableToggleCaption",onSetup:t.onSetupTableWithCaption}),n("tablerowheader",{tooltip:"Row header",icon:"table-top-header",command:"mceTableRowType",onAction:uo(e),onSetup:t.onSetupTableRowHeaders}),n("tablecolheader",{tooltip:"Column header",icon:"table-left-header",command:"mceTableColType",onAction:po(e),onSetup:t.onSetupTableColumnHeaders})})(e,t),(e=>{const t=ht(e);t.length>0&&e.ui.registry.addContextToolbar("table",{predicate:t=>e.dom.is(t,"table")&&e.getBody().contains(t),items:t,scope:"node",position:"node"})})(e)}))}();
\ No newline at end of file
+!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=l=e,(n=String).prototype.isPrototypeOf(o)||(null===(r=l.constructor)||void 0===r?void 0:r.name)===n.name)?"string":t;var o,l,n,r})(t)===e,o=e=>t=>typeof t===e,l=t("string"),n=t("array"),r=o("boolean"),a=(void 0,e=>undefined===e);const s=e=>!(e=>null==e)(e),c=o("function"),i=o("number"),m=()=>{},d=e=>()=>e,u=e=>e,p=(e,t)=>e===t;function b(e,...t){return(...o)=>{const l=t.concat(o);return e.apply(null,l)}}const g=d(!1),h=d(!0);class f{constructor(e,t){this.tag=e,this.value=t}static some(e){return new f(!0,e)}static none(){return f.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?f.some(e(this.value)):f.none()}bind(e){return this.tag?e(this.value):f.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:f.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return s(e)?f.some(e):f.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}f.singletonNone=new f(!1);const y=Object.keys,w=Object.hasOwnProperty,S=(e,t)=>{const o=y(e);for(let l=0,n=o.length;l<n;l++){const n=o[l];t(e[n],n)}},C=(e,t)=>{const o={};var l;return((e,t,o,l)=>{S(e,((e,n)=>{(t(e,n)?o:l)(e,n)}))})(e,t,(l=o,(e,t)=>{l[t]=e}),m),o},v=e=>y(e).length,T=(e,t)=>x(e,t)?f.from(e[t]):f.none(),x=(e,t)=>w.call(e,t),A=(e,t)=>x(e,t)&&void 0!==e[t]&&null!==e[t],R=Array.prototype.indexOf,_=Array.prototype.push,O=(e,t)=>((e,t)=>R.call(e,t))(e,t)>-1,D=(e,t)=>{for(let o=0,l=e.length;o<l;o++)if(t(e[o],o))return!0;return!1},I=(e,t)=>{const o=[];for(let l=0;l<e;l++)o.push(t(l));return o},M=(e,t)=>{const o=e.length,l=new Array(o);for(let n=0;n<o;n++){const o=e[n];l[n]=t(o,n)}return l},N=(e,t)=>{for(let o=0,l=e.length;o<l;o++)t(e[o],o)},P=(e,t)=>{const o=[];for(let l=0,n=e.length;l<n;l++){const n=e[l];t(n,l)&&o.push(n)}return o},k=(e,t,o)=>(N(e,((e,l)=>{o=t(o,e,l)})),o),B=(e,t)=>((e,t,o)=>{for(let l=0,n=e.length;l<n;l++){const n=e[l];if(t(n,l))return f.some(n);if(o(n,l))break}return f.none()})(e,t,g),E=(e,t)=>(e=>{const t=[];for(let o=0,l=e.length;o<l;++o){if(!n(e[o]))throw new Error("Arr.flatten item "+o+" was not an array, input: "+e);_.apply(t,e[o])}return t})(M(e,t)),F=(e,t)=>{for(let o=0,l=e.length;o<l;++o)if(!0!==t(e[o],o))return!1;return!0},q=(e,t)=>t>=0&&t<e.length?f.some(e[t]):f.none(),L=(e,t)=>{for(let o=0;o<e.length;o++){const l=t(e[o],o);if(l.isSome())return l}return f.none()},H=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},j={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return H(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return H(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return H(o)},fromDom:H,fromPoint:(e,t,o)=>f.from(e.dom.elementFromPoint(t,o)).map(H)};"undefined"!=typeof window?window:Function("return this;")();const V=e=>e.dom.nodeName.toLowerCase(),z=e=>e.dom.nodeType,W=e=>t=>z(t)===e,$=W(1),U=W(3),G=W(9),K=W(11),J=e=>t=>$(t)&&V(t)===e,Q=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},X=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,Y=(e,t)=>e.dom===t.dom,Z=Q,ee=e=>G(e)?e:j.fromDom(e.dom.ownerDocument),te=e=>f.from(e.dom.parentNode).map(j.fromDom),oe=e=>f.from(e.dom.nextSibling).map(j.fromDom),le=e=>M(e.dom.childNodes,j.fromDom),ne=c(Element.prototype.attachShadow)&&c(Node.prototype.getRootNode)?e=>j.fromDom(e.dom.getRootNode()):ee,re=e=>j.fromDom(e.dom.host),ae=e=>{const t=U(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=ne(e);return K(o=t)&&s(o.dom.host)?f.some(t):f.none();var o})(j.fromDom(t)).fold((()=>o.body.contains(t)),(l=ae,n=re,e=>l(n(e))));var l,n},se=(e,t)=>{let o=[];return N(le(e),(e=>{t(e)&&(o=o.concat([e])),o=o.concat(se(e,t))})),o},ce=(e,t)=>((e,o)=>P(le(e),(e=>Q(e,t))))(e),ie=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return X(o)?[]:M(o.querySelectorAll(e),j.fromDom)})(t,e),me=(e,t,o)=>{let l=e.dom;const n=c(o)?o:g;for(;l.parentNode;){l=l.parentNode;const e=j.fromDom(l);if(t(e))return f.some(e);if(n(e))break}return f.none()},de=(e,t,o)=>me(e,(e=>Q(e,t)),o),ue=(e,t)=>((e,o)=>B(e.dom.childNodes,(e=>{return o=j.fromDom(e),Q(o,t);var o})).map(j.fromDom))(e),pe=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return X(o)?f.none():f.from(o.querySelector(e)).map(j.fromDom)})(t,e),be=(e,t,o)=>((e,t,o,l,n)=>((e,t)=>Q(e,t))(o,l)?f.some(o):c(n)&&n(o)?f.none():t(o,l,n))(0,de,e,t,o),ge=(e,t,o)=>{if(!(l(o)||r(o)||i(o)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",o,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,o+"")},he=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},fe=(e,t)=>f.from(he(e,t)),ye=(e,t)=>{e.dom.removeAttribute(t)},we=(e,t,o=p)=>e.exists((e=>o(e,t))),Se=(e,t,o)=>e.isSome()&&t.isSome()?f.some(o(e.getOrDie(),t.getOrDie())):f.none(),Ce=(e,t)=>((e,t,o)=>""===t||e.length>=t.length&&e.substr(0,0+t.length)===t)(e,t),ve=(Te=/^\s+|\s+$/g,e=>e.replace(Te,""));var Te;const xe=e=>e.length>0,Ae=e=>void 0!==e.style&&c(e.style.getPropertyValue),Re=(e,t)=>{const o=e.dom,l=window.getComputedStyle(o).getPropertyValue(t);return""!==l||ae(e)?l:_e(o,t)},_e=(e,t)=>Ae(e)?e.style.getPropertyValue(t):"",Oe=(e,t)=>{const o=e.dom,l=_e(o,t);return f.from(l).filter((e=>e.length>0))},De=(e,t,o=0)=>fe(e,t).map((e=>parseInt(e,10))).getOr(o),Ie=(e,t)=>Me(e,t,h),Me=(e,t,o)=>E(le(e),(e=>Q(e,t)?o(e)?[e]:[]:Me(e,t,o))),Ne=["tfoot","thead","tbody","colgroup"],Pe=(e,t,o)=>({element:e,rowspan:t,colspan:o}),ke=(e,t,o)=>({element:e,cells:t,section:o}),Be=(e,t)=>be(e,"table",t),Ee=e=>Ie(e,"tr"),Fe=e=>Be(e).fold(d([]),(e=>ce(e,"colgroup"))),qe=e=>te(e).map((e=>{const t=V(e);return(e=>O(Ne,e))(t)?t:"tbody"})).getOr("tbody"),Le=e=>fe(e,"data-snooker-locked-cols").bind((e=>f.from(e.match(/\d+/g)))).map((e=>((e,t)=>{const o={};for(let l=0,n=e.length;l<n;l++){const n=e[l];o[String(n)]=t(n,l)}return o})(e,h))),He=(e,t)=>e+","+t,je=e=>{const t={},o=[];var l;const n=(l=e,q(l,0)).map((e=>e.element)).bind(Be).bind(Le).getOr({});let r=0,a=0,s=0;const{pass:c,fail:i}=((e,t)=>{const o=[],l=[];for(let t=0,r=e.length;t<r;t++){const r=e[t];(n=r,"colgroup"===n.section?o:l).push(r)}var n;return{pass:o,fail:l}})(e);N(i,(e=>{const l=[];N(e.cells,(e=>{let o=0;for(;void 0!==t[He(s,o)];)o++;const r=A(n,o.toString()),c=((e,t,o,l,n,r)=>({element:e,rowspan:t,colspan:o,row:l,column:n,isLocked:r}))(e.element,e.rowspan,e.colspan,s,o,r);for(let l=0;l<e.colspan;l++)for(let n=0;n<e.rowspan;n++){const e=o+l,r=He(s+n,e);t[r]=c,a=Math.max(a,e+1)}l.push(c)})),r++,o.push(ke(e.element,l,e.section)),s++}));const{columns:m,colgroups:d}=(e=>q(e,e.length-1))(c).map((e=>{const t=(e=>{const t={};let o=0;return N(e.cells,(e=>{const l=e.colspan;I(l,(n=>{const r=o+n;t[r]=((e,t,o)=>({element:e,colspan:t,column:o}))(e.element,l,r)})),o+=l})),t})(e),o=((e,t)=>({element:e,columns:t}))(e.element,((e,t)=>{const o=[];return S(e,((e,l)=>{o.push(t(e,l))})),o})(t,u));return{colgroups:[o],columns:t}})).getOrThunk((()=>({colgroups:[],columns:{}}))),p=((e,t)=>({rows:e,columns:t}))(r,a);return{grid:p,access:t,all:o,columns:m,colgroups:d}},Ve=e=>{const t=(e=>{const t=Ee(e);return((e,t)=>M(e,(e=>{if("colgroup"===V(e)){const t=M((e=>Q(e,"colgroup")?ce(e,"col"):E(Fe(e),(e=>ce(e,"col"))))(e),(e=>{const t=De(e,"span",1);return Pe(e,1,t)}));return ke(e,t,"colgroup")}{const o=M((e=>Ie(e,"th,td"))(e),(e=>{const t=De(e,"rowspan",1),o=De(e,"colspan",1);return Pe(e,t,o)}));return ke(e,o,t(e))}})))([...Fe(e),...t],qe)})(e);return je(t)},ze=(e,t,o)=>f.from(e.access[He(t,o)]),We=(e,t,o)=>{const l=((e,t)=>{const o=E(e.all,(e=>e.cells));return P(o,t)})(e,(e=>o(t,e.element)));return l.length>0?f.some(l[0]):f.none()},$e=(e,t)=>f.from(e.columns[t]);var Ue=tinymce.util.Tools.resolve("tinymce.util.Tools");const Ge=(e,t,o)=>((t,l)=>{for(let n=0;n<l.length;n++){const r=e.getStyle(l[n],o);if(void 0===t&&(t=r),t!==r)return""}return t})(void 0,e.select("td,th",t)),Ke=(e,t,o)=>{Ue.each("left center right".split(" "),(l=>{l!==o&&e.formatter.remove("align"+l,{},t)})),o&&e.formatter.apply("align"+o,{},t)},Je=(e,t,o)=>{e.dispatch("TableModified",{...o,table:t})},Qe=(e,t,o)=>((e,t)=>(e=>{const t=parseFloat(e);return isNaN(t)?f.none():f.some(t)})(e).getOr(t))(Re(e,t),o),Xe=e=>((e,t)=>{const o=e.dom,l=o.getBoundingClientRect().width||o.offsetWidth;return"border-box"===t?l:((e,t,o,l)=>t-Qe(e,"padding-left",0)-Qe(e,"padding-right",0)-Qe(e,"border-left-width",0)-Qe(e,"border-right-width",0))(e,l)})(e,"content-box");var Ye=tinymce.util.Tools.resolve("tinymce.Env");const Ze=I(5,(e=>{const t=`${e+1}px`;return{title:t,value:t}})),et=M(["Solid","Dotted","Dashed","Double","Groove","Ridge","Inset","Outset","None","Hidden"],(e=>({title:e,value:e.toLowerCase()}))),tt=e=>t=>t.options.get(e),ot=tt("table_sizing_mode"),lt=tt("table_border_widths"),nt=tt("table_border_styles"),rt=tt("table_default_attributes"),at=tt("table_cell_advtab"),st=tt("table_row_advtab"),ct=tt("table_advtab"),it=tt("table_appearance_options"),mt=tt("table_grid"),dt=tt("table_style_by_css"),ut=tt("table_cell_class_list"),pt=tt("table_row_class_list"),bt=tt("table_class_list"),gt=tt("table_toolbar"),ht=tt("table_background_color_map"),ft=tt("table_border_color_map"),yt=e=>{const t=e.options,o=t.get("table_default_styles");return t.isSet("table_default_styles")?o:((e,t)=>{var o;if((e=>"fixed"===ot(e))(e)){const l=e.dom,n=null!==(o=l.getParent(e.selection.getStart(),l.isBlock))&&void 0!==o?o:e.getBody(),r=Xe(j.fromDom(n));return{...t,width:r+"px"}}return(e=>"responsive"===ot(e))(e)?C(t,((e,t)=>"width"!==t)):t})(e,o)},wt=e=>t=>Y(t,(e=>j.fromDom(e.getBody()))(e)),St=e=>/^\d+(\.\d+)?$/.test(e)?e+"px":e,Ct=e=>j.fromDom(e.selection.getStart()),vt=(e,t)=>t.column>=e.startCol&&t.column+t.colspan-1<=e.finishCol&&t.row>=e.startRow&&t.row+t.rowspan-1<=e.finishRow,Tt=(e,t,o)=>((e,t,o)=>{const l=We(e,t,Y),n=We(e,o,Y);return l.bind((e=>n.map((t=>{return o=e,l=t,{startRow:Math.min(o.row,l.row),startCol:Math.min(o.column,l.column),finishRow:Math.max(o.row+o.rowspan-1,l.row+l.rowspan-1),finishCol:Math.max(o.column+o.colspan-1,l.column+l.colspan-1)};var o,l}))))})(e,t,o).bind((t=>((e,t)=>{let o=!0;const l=b(vt,t);for(let n=t.startRow;n<=t.finishRow;n++)for(let r=t.startCol;r<=t.finishCol;r++)o=o&&ze(e,n,r).exists(l);return o?f.some(t):f.none()})(e,t))),xt=Ve,At=(e,t)=>{te(e).each((o=>{o.dom.insertBefore(t.dom,e.dom)}))},Rt=(e,t)=>{oe(e).fold((()=>{te(e).each((e=>{_t(e,t)}))}),(e=>{At(e,t)}))},_t=(e,t)=>{e.dom.appendChild(t.dom)},Ot=(e,t)=>{N(t,((o,l)=>{const n=0===l?e:t[l-1];Rt(n,o)}))},Dt=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},It=((e,t)=>{const o=t=>e(t)?f.from(t.dom.nodeValue):f.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return o(t).getOr("")},getOption:o,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(U);var Mt=["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"];const Nt=(e,t,o,l)=>{const n=t(e,o);return r=(o,l)=>{const n=t(e,l);return Pt(e,o,n)},a=n,((e,t)=>{for(let o=e.length-1;o>=0;o--)t(e[o],o)})(l,((e,t)=>{a=r(a,e)})),a;var r,a},Pt=(e,t,o)=>t.bind((t=>o.filter(b(e.eq,t)))),kt={up:d({selector:de,closest:be,predicate:me,all:(e,t)=>{const o=c(t)?t:g;let l=e.dom;const n=[];for(;null!==l.parentNode&&void 0!==l.parentNode;){const e=l.parentNode,t=j.fromDom(e);if(n.push(t),!0===o(t))break;l=e}return n}}),down:d({selector:ie,predicate:se}),styles:d({get:Re,getRaw:Oe,set:(e,t,o)=>{((e,t,o)=>{if(!l(o))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",o,":: Element ",e),new Error("CSS value must be a string: "+o);Ae(e)&&e.style.setProperty(t,o)})(e.dom,t,o)},remove:(e,t)=>{((e,t)=>{Ae(e)&&e.style.removeProperty(t)})(e.dom,t),we(fe(e,"style").map(ve),"")&&ye(e,"style")}}),attrs:d({get:he,set:(e,t,o)=>{ge(e.dom,t,o)},remove:ye,copyTo:(e,t)=>{((e,t)=>{const o=e.dom;S(t,((e,t)=>{ge(o,t,e)}))})(t,k(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}))}}),insert:d({before:At,after:Rt,afterAll:Ot,append:_t,appendAll:(e,t)=>{N(t,(t=>{_t(e,t)}))},prepend:(e,t)=>{(e=>((e,t)=>{const o=e.dom.childNodes;return f.from(o[0]).map(j.fromDom)})(e))(e).fold((()=>{_t(e,t)}),(o=>{e.dom.insertBefore(t.dom,o.dom)}))},wrap:(e,t)=>{At(e,t),_t(t,e)}}),remove:d({unwrap:e=>{const t=le(e);t.length>0&&Ot(e,t),Dt(e)},remove:Dt}),create:d({nu:j.fromTag,clone:e=>j.fromDom(e.dom.cloneNode(!1)),text:j.fromText}),query:d({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:e=>f.from(e.dom.previousSibling).map(j.fromDom),nextSibling:oe}),property:d({children:le,name:V,parent:te,document:e=>ee(e).dom,isText:U,isComment:e=>8===z(e)||"#comment"===V(e),isElement:$,isSpecial:e=>{const t=V(e);return O(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>$(e)?fe(e,"lang"):f.none(),getText:e=>It.get(e),setText:(e,t)=>It.set(e,t),isBoundary:e=>!!$(e)&&("body"===V(e)||O(Mt,V(e))),isEmptyTag:e=>!!$(e)&&O(["br","img","hr","input"],V(e)),isNonEditable:e=>$(e)&&"false"===he(e,"contenteditable")}),eq:Y,is:Z},Bt=e=>de(e,"table"),Et=(e,t,o)=>pe(e,t).bind((t=>pe(e,o).bind((e=>{return(o=Bt,l=[t,e],((e,t,o)=>o.length>0?((e,t,o,l)=>l(e,t,o[0],o.slice(1)))(e,t,o,Nt):f.none())(kt,((e,t)=>o(t)),l)).map((o=>({first:t,last:e,table:o})));var o,l})))),Ft=e=>M(e,j.fromDom),qt={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]"},Lt=e=>(t,o)=>{const l=V(t),n="col"===l||"colgroup"===l?Be(r=t).bind((e=>((e,t)=>((e,t)=>{const o=ie(e,t);return o.length>0?f.some(o):f.none()})(e,t))(e,qt.firstSelectedSelector))).fold(d(r),(e=>e[0])):t;var r;return be(n,e,o)},Ht=Lt("th,td,caption"),jt=Lt("th,td"),Vt=e=>Ft(e.model.table.getSelectedCells()),zt=(e,t)=>{const o=jt(e),l=o.bind((e=>Be(e))).map((e=>Ee(e)));return Se(o,l,((e,o)=>P(o,(o=>D(Ft(o.dom.cells),(o=>"1"===he(o,t)||Y(o,e))))))).getOr([])},Wt=[{text:"None",value:""},{text:"Top",value:"top"},{text:"Middle",value:"middle"},{text:"Bottom",value:"bottom"}],$t=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,Ut=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,Gt=e=>{return(t=e,"#",Ce(t,"#")?((e,t)=>e.substring(t))(t,"#".length):t).toUpperCase();var t},Kt=e=>{const t=e.toString(16);return(1===t.length?"0"+t:t).toUpperCase()},Jt=e=>({value:Kt(e.red)+Kt(e.green)+Kt(e.blue)}),Qt=/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/i,Xt=/^\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?(?:\.\d+)?)\s*\)\s*$/i,Yt=(e,t,o,l)=>({red:e,green:t,blue:o,alpha:l}),Zt=(e,t,o,l)=>{const n=parseInt(e,10),r=parseInt(t,10),a=parseInt(o,10),s=parseFloat(l);return Yt(n,r,a,s)},eo=e=>{if("transparent"===e)return f.some(Yt(0,0,0,0));const t=Qt.exec(e);if(null!==t)return f.some(Zt(t[1],t[2],t[3],"1"));const o=Xt.exec(e);return null!==o?f.some(Zt(o[1],o[2],o[3],o[4])):f.none()},to=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},oo=(e,t,o)=>l=>{const n=(e=>{const t=to(f.none()),o=()=>t.get().each(e);return{clear:()=>{o(),t.set(f.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{o(),t.set(f.some(e))}}})((e=>e.unbind())),r=!xe(o),a=()=>{const a=Vt(e),s=l=>e.formatter.match(t,{value:o},l.dom,r);r?(l.setActive(!D(a,s)),n.set(e.formatter.formatChanged(t,(e=>l.setActive(!e)),!0))):(l.setActive(F(a,s)),n.set(e.formatter.formatChanged(t,l.setActive,!1,{value:o})))};return e.initialized?a():e.on("init",a),n.clear},lo=e=>A(e,"menu"),no=e=>M(e,(e=>{const t=e.text||e.title;return lo(e)?{text:t,items:no(e.menu)}:{text:t,value:e.value}})),ro=(e,t,o,l)=>M(t,(t=>{const n=t.text||t.title;return lo(t)?{type:"nestedmenuitem",text:n,getSubmenuItems:()=>ro(e,t.menu,o,l)}:{text:n,type:"togglemenuitem",onAction:()=>l(t.value),onSetup:oo(e,o,t.value)}})),ao=(e,t)=>o=>{e.execCommand("mceTableApplyCellStyle",!1,{[t]:o})},so=e=>E(e,(e=>lo(e)?[{...e,menu:so(e.menu)}]:xe(e.value)?[e]:[])),co=(e,t,o,l)=>n=>n(ro(e,t,o,l)),io=(e,t,o)=>{const l=M(t,(e=>{return{text:e.title,value:"#"+(o=e.value,(t=o,(e=>$t.test(e)||Ut.test(e))(t)?f.some({value:Gt(t)}):f.none()).orThunk((()=>eo(o).map(Jt))).getOrThunk((()=>{const e=document.createElement("canvas");e.height=1,e.width=1;const t=e.getContext("2d");t.clearRect(0,0,e.width,e.height),t.fillStyle="#FFFFFF",t.fillStyle=o,t.fillRect(0,0,1,1);const l=t.getImageData(0,0,1,1).data,n=l[0],r=l[1],a=l[2],s=l[3];return Jt(Yt(n,r,a,s))}))).value,type:"choiceitem"};var t,o}));return[{type:"fancymenuitem",fancytype:"colorswatch",initData:{colors:l.length>0?l:void 0,allowCustomColors:!1},onAction:t=>{const l="remove"===t.value?"":t.value;e.execCommand("mceTableApplyCellStyle",!1,{[o]:l})}}]},mo=e=>()=>{const t="header"===e.queryCommandValue("mceTableRowType")?"body":"header";e.execCommand("mceTableRowType",!1,{type:t})},uo=e=>()=>{const t="th"===e.queryCommandValue("mceTableColType")?"td":"th";e.execCommand("mceTableColType",!1,{type:t})},po=[{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:Wt}],bo=e=>po.concat((e=>{const t=no(ut(e));return t.length>0?f.some({name:"class",type:"listbox",label:"Class",items:t}):f.none()})(e).toArray()),go=(e,t)=>{const o=[{name:"borderstyle",type:"listbox",label:"Border style",items:[{text:"Select...",value:""}].concat(no(nt(e)))},{name:"bordercolor",type:"colorinput",label:"Border color"},{name:"backgroundcolor",type:"colorinput",label:"Background color"}];return{title:"Advanced",name:"advanced",items:"cell"===t?[{name:"borderwidth",type:"input",label:"Border width"}].concat(o):o}},ho=(e,t)=>{const o=e.dom;return{setAttrib:(e,l)=>{o.setAttrib(t,e,l)},setStyle:(e,l)=>{o.setStyle(t,e,l)},setFormat:(o,l)=>{""===l?e.formatter.remove(o,{value:null},t,!0):e.formatter.apply(o,{value:l},t)}}},fo=J("th"),yo=(e,t)=>e&&t?"sectionCells":e?"section":"cells",wo=e=>{const t=M(e,(e=>(e=>{const t="thead"===e.section,o=we((e=>{const t=P(e,(e=>fo(e.element)));return 0===t.length?f.some("td"):t.length===e.length?f.some("th"):f.none()})(e.cells),"th");return"tfoot"===e.section?{type:"footer"}:t||o?{type:"header",subType:yo(t,o)}:{type:"body"}})(e).type)),o=O(t,"header"),l=O(t,"footer");if(o||l){const e=O(t,"body");return!o||e||l?o||e||!l?f.none():f.some("footer"):f.some("header")}return f.some("body")},So=(e,t)=>L(e.all,(e=>B(e.cells,(e=>Y(t,e.element))))),Co=(e,t,o)=>{const l=(e=>{const t=[],o=e=>{t.push(e)};for(let t=0;t<e.length;t++)e[t].each(o);return t})(M(t.selection,(t=>{return(l=t,((e,t,o=g)=>o(t)?f.none():O(e,V(t))?f.some(t):de(t,e.join(","),(e=>Q(e,"table")||o(e))))(["td","th"],l,n)).bind((t=>So(e,t))).filter(o);var l,n})));return n=l,l.length>0?f.some(n):f.none();var n},vo=(e,t)=>Co(e,t,h),To=(e,t)=>F(t,(t=>((e,t)=>So(e,t).exists((e=>!e.isLocked)))(e,t))),xo=(e,t)=>((e,t)=>t.mergable)(0,t).filter((t=>To(e,t.cells))),Ao=(e,t)=>((e,t)=>t.unmergable)(0,t).filter((t=>To(e,t))),Ro=((e=>{if(!n(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],o={};N(e,((l,r)=>{const a=y(l);if(1!==a.length)throw new Error("one and only one name per case");const s=a[0],c=l[s];if(void 0!==o[s])throw new Error("duplicate key detected:"+s);if("cata"===s)throw new Error("cannot have a case named cata (sorry)");if(!n(c))throw new Error("case arguments must be an array");t.push(s),o[s]=(...o)=>{const l=o.length;if(l!==c.length)throw new Error("Wrong number of arguments to case "+s+". Expected "+c.length+" ("+c+"), got "+l);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[r].apply(null,o)},match:e=>{const l=y(e);if(t.length!==l.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+l.join(","));if(!F(t,(e=>O(l,e))))throw new Error("Not all branches were specified when using match. Specified: "+l.join(", ")+"\nRequired: "+t.join(", "));return e[s].apply(null,o)},log:e=>{console.log(e,{constructors:t,constructor:s,params:o})}}}}))})([{none:[]},{only:["index"]},{left:["index","next"]},{middle:["prev","index","next"]},{right:["prev","index"]}]),(e,t)=>{const o=Ve(e);return vo(o,t).bind((e=>{const t=e[e.length-1],l=e[0].row,n=t.row+t.rowspan,r=o.all.slice(l,n);return wo(r)})).getOr("")}),_o=e=>{return Ce(e,"rgb")?eo(t=e).map(Jt).map((e=>"#"+e.value)).getOr(t):e;var t},Oo=e=>{const t=j.fromDom(e);return{borderwidth:Oe(t,"border-width").getOr(""),borderstyle:Oe(t,"border-style").getOr(""),bordercolor:Oe(t,"border-color").map(_o).getOr(""),backgroundcolor:Oe(t,"background-color").map(_o).getOr("")}},Do=e=>{const t=e[0],o=e.slice(1);return N(o,(e=>{N(y(t),(o=>{S(e,((e,l)=>{const n=t[o];""!==n&&o===l&&n!==e&&(t[o]="")}))}))})),t},Io=(e,t,o,l)=>B(e,(e=>!a(o.formatter.matchNode(l,t+e)))).getOr(""),Mo=b(Io,["left","center","right"],"align"),No=b(Io,["top","middle","bottom"],"valign"),Po=e=>Be(j.fromDom(e)).map((t=>{const o={selection:Ft(e.cells)};return Ro(t,o)})).getOr(""),ko=(e,t)=>{const o=Ve(e),l=(e=>E(e.all,(e=>e.cells)))(o),n=P(l,(e=>D(t,(t=>Y(e.element,t)))));return M(n,(e=>({element:e.element.dom,column:$e(o,e.column).map((e=>e.element.dom))})))},Bo=(e,t,o,l)=>{const n=l.getData();l.close(),e.undoManager.transact((()=>{((e,t,o,l)=>{const n=C(l,((e,t)=>o[t]!==e));v(n)>0&&t.length>=1&&Be(t[0]).each((o=>{const r=ko(o,t),a=v(C(n,((e,t)=>"scope"!==t&&"celltype"!==t)))>0,s=x(n,"celltype");(a||x(n,"scope"))&&((e,t,o,l)=>{const n=1===t.length;N(t,(t=>{const r=t.element,a=n?h:l,s=ho(e,r);((e,t,o,l)=>{l("scope")&&e.setAttrib("scope",o.scope),l("class")&&e.setAttrib("class",o.class),l("height")&&e.setStyle("height",St(o.height)),l("width")&&t.setStyle("width",St(o.width))})(s,t.column.map((t=>ho(e,t))).getOr(s),o,a),at(e)&&((e,t,o)=>{o("backgroundcolor")&&e.setFormat("tablecellbackgroundcolor",t.backgroundcolor),o("bordercolor")&&e.setFormat("tablecellbordercolor",t.bordercolor),o("borderstyle")&&e.setFormat("tablecellborderstyle",t.borderstyle),o("borderwidth")&&e.setFormat("tablecellborderwidth",St(t.borderwidth))})(s,o,a),l("halign")&&Ke(e,r,o.halign),l("valign")&&((e,t,o)=>{Ue.each("top middle bottom".split(" "),(l=>{l!==o&&e.formatter.remove("valign"+l,{},t)})),o&&e.formatter.apply("valign"+o,{},t)})(e,r,o.valign)}))})(e,r,l,b(x,n)),s&&((e,t)=>{e.execCommand("mceTableCellType",!1,{type:t.celltype,no_events:!0})})(e,l),Je(e,o.dom,{structure:s,style:a})}))})(e,t,o,n),e.focus()}))},Eo=e=>{const t=Vt(e);if(0===t.length)return;const o=((e,t)=>{const o=Be(t[0]).map((o=>M(ko(o,t),(t=>((e,t,o,l)=>{const n=e.dom,r=(e,t)=>n.getStyle(e,t)||n.getAttrib(e,t);return{width:r(l.getOr(t),"width"),height:r(t,"height"),scope:n.getAttrib(t,"scope"),celltype:(a=t,a.nodeName.toLowerCase()),class:n.getAttrib(t,"class",""),halign:Mo(e,t),valign:No(e,t),...o?Oo(t):{}};var a})(e,t.element,at(e),t.column)))));return Do(o.getOrDie())})(e,t),l={type:"tabpanel",tabs:[{title:"General",name:"general",items:bo(e)},go(e,"cell")]},n={type:"panel",items:[{type:"grid",columns:2,items:bo(e)}]};e.windowManager.open({title:"Cell Properties",size:"normal",body:at(e)?l:n,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:o,onSubmit:b(Bo,e,t,o)})},Fo=[{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"}],qo=e=>Fo.concat((e=>{const t=no(pt(e));return t.length>0?f.some({name:"class",type:"listbox",label:"Class",items:t}):f.none()})(e).toArray()),Lo=(e,t,o,l)=>{const n=l.getData();l.close(),e.undoManager.transact((()=>{((e,t,o,l)=>{const n=C(l,((e,t)=>o[t]!==e));if(v(n)>0){const o=x(n,"type"),r=!o||v(n)>1;r&&((e,t,o,l)=>{const n=1===t.length?h:l;N(t,(t=>{const r=ho(e,t);((e,t,o)=>{o("class")&&e.setAttrib("class",t.class),o("height")&&e.setStyle("height",St(t.height))})(r,o,n),st(e)&&((e,t,o)=>{o("backgroundcolor")&&e.setStyle("background-color",t.backgroundcolor),o("bordercolor")&&e.setStyle("border-color",t.bordercolor),o("borderstyle")&&e.setStyle("border-style",t.borderstyle)})(r,o,n),l("align")&&Ke(e,t,o.align)}))})(e,t,l,b(x,n)),o&&((e,t)=>{e.execCommand("mceTableRowType",!1,{type:t.type,no_events:!0})})(e,l),Be(j.fromDom(t[0])).each((t=>Je(e,t.dom,{structure:o,style:r})))}})(e,t,o,n),e.focus()}))},Ho=e=>{const t=zt(Ct(e),qt.selected);if(0===t.length)return;const o=M(t,(t=>((e,t,o)=>{const l=e.dom;return{height:l.getStyle(t,"height")||l.getAttrib(t,"height"),class:l.getAttrib(t,"class",""),type:Po(t),align:Mo(e,t),...o?Oo(t):{}}})(e,t.dom,st(e)))),l=Do(o),n={type:"tabpanel",tabs:[{title:"General",name:"general",items:qo(e)},go(e,"row")]},r={type:"panel",items:[{type:"grid",columns:2,items:qo(e)}]};e.windowManager.open({title:"Row Properties",size:"normal",body:st(e)?n:r,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:l,onSubmit:b(Lo,e,M(t,(e=>e.dom)),l)})},jo=(e,t,o)=>{const l=o?[{type:"input",name:"cols",label:"Cols",inputMode:"numeric"},{type:"input",name:"rows",label:"Rows",inputMode:"numeric"}]:[],n=it(e)?[{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"}]}]:[],r=t.length>0?[{type:"listbox",name:"class",label:"Class",items:t}]:[];return l.concat([{type:"input",name:"width",label:"Width"},{type:"input",name:"height",label:"Height"}]).concat(n).concat([{type:"listbox",name:"align",label:"Alignment",items:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]}]).concat(r)},Vo=(e,t,o,n)=>{if("TD"===t.tagName||"TH"===t.tagName)l(o)?e.setStyle(t,o,n):e.setStyles(t,o);else if(t.children)for(let l=0;l<t.children.length;l++)Vo(e,t.children[l],o,n)},zo=(e,t,o,l)=>{const n=e.dom,r=l.getData(),a=C(r,((e,t)=>o[t]!==e));l.close(),""===r.class&&delete r.class,e.undoManager.transact((()=>{if(!t){const o=parseInt(r.cols,10)||1,l=parseInt(r.rows,10)||1;e.execCommand("mceInsertTable",!1,{rows:l,columns:o}),t=jt(Ct(e),wt(e)).bind((t=>Be(t,wt(e)))).map((e=>e.dom)).getOrUndefined()}if(v(a)>0){((e,t,o)=>{const l=e.dom,n={},r={};if(n.class=o.class,r.height=St(o.height),l.getAttrib(t,"width")&&!dt(e)?n.width=(e=>e?e.replace(/px$/,""):"")(o.width):r.width=St(o.width),dt(e)?(r["border-width"]=St(o.border),r["border-spacing"]=St(o.cellspacing)):(n.border=o.border,n.cellpadding=o.cellpadding,n.cellspacing=o.cellspacing),dt(e)&&t.children)for(let n=0;n<t.children.length;n++)Vo(l,t.children[n],{"border-width":St(o.border),padding:St(o.cellpadding)}),ct(e)&&Vo(l,t.children[n],{"border-color":o.bordercolor});ct(e)&&(r["background-color"]=o.backgroundcolor,r["border-color"]=o.bordercolor,r["border-style"]=o.borderstyle),n.style=l.serializeStyle({...yt(e),...r}),l.setAttribs(t,{...rt(e),...n})})(e,t,r);const o=n.select("caption",t)[0];(o&&!r.caption||!o&&r.caption)&&e.execCommand("mceTableToggleCaption"),Ke(e,t,r.align)}if(e.focus(),e.addVisual(),v(a)>0){const o=x(a,"caption"),l=!o||v(a)>1;Je(e,t,{structure:o,style:l})}}))},Wo=(e,t)=>{const o=e.dom;let l,n=((e,t)=>{const o=yt(e),l=rt(e),n=t?{borderstyle:T(o,"border-style").getOr(""),bordercolor:_o(T(o,"border-color").getOr("")),backgroundcolor:_o(T(o,"background-color").getOr(""))}:{};return{height:"",width:"100%",cellspacing:"",cellpadding:"",caption:!1,class:"",align:"",border:"",...o,...l,...n,...(()=>{const t=o["border-width"];return dt(e)&&t?{border:t}:T(l,"border").fold((()=>({})),(e=>({border:e})))})(),...{...T(o,"border-spacing").or(T(l,"cellspacing")).fold((()=>({})),(e=>({cellspacing:e}))),...T(o,"border-padding").or(T(l,"cellpadding")).fold((()=>({})),(e=>({cellpadding:e})))}}})(e,ct(e));!1===t?(l=o.getParent(e.selection.getStart(),"table",e.getBody()),l?n=((e,t,o)=>{const l=e.dom,n=dt(e)?l.getStyle(t,"border-spacing")||l.getAttrib(t,"cellspacing"):l.getAttrib(t,"cellspacing")||l.getStyle(t,"border-spacing"),r=dt(e)?Ge(l,t,"padding")||l.getAttrib(t,"cellpadding"):l.getAttrib(t,"cellpadding")||Ge(l,t,"padding");return{width:l.getStyle(t,"width")||l.getAttrib(t,"width"),height:l.getStyle(t,"height")||l.getAttrib(t,"height"),cellspacing:n,cellpadding:r,border:((t,o)=>{const l=Oe(j.fromDom(o),"border-width");return dt(e)&&l.isSome()?l.getOr(""):t.getAttrib(o,"border")||Ge(e.dom,o,"border-width")||Ge(e.dom,o,"border")})(l,t),caption:!!l.select("caption",t)[0],class:l.getAttrib(t,"class",""),align:Mo(e,t),...o?Oo(t):{}}})(e,l,ct(e)):ct(e)&&(n.borderstyle="",n.bordercolor="",n.backgroundcolor="")):(n.cols="1",n.rows="1",ct(e)&&(n.borderstyle="",n.bordercolor="",n.backgroundcolor=""));const r=no(bt(e));r.length>0&&n.class&&(n.class=n.class.replace(/\s*mce\-item\-table\s*/g,""));const a={type:"grid",columns:2,items:jo(e,r,t)},s=ct(e)?{type:"tabpanel",tabs:[{title:"General",name:"general",items:[a]},go(e,"table")]}:{type:"panel",items:[a]};e.windowManager.open({title:"Table Properties",size:"normal",body:s,onSubmit:b(zo,e,l,n),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:n})},$o=u,Uo=e=>{const t=(e,t)=>fe(e,t).exists((e=>parseInt(e,10)>1));return e.length>0&&F(e,(e=>t(e,"rowspan")||t(e,"colspan")))?f.some(e):f.none()},Go=(e,t,o)=>{return t.length<=1?f.none():(l=e,n=o.firstSelectedSelector,r=o.lastSelectedSelector,Et(l,n,r).bind((e=>{const t=e=>Y(l,e),o="thead,tfoot,tbody,table",n=de(e.first,o,t),r=de(e.last,o,t);return n.bind((t=>r.bind((o=>Y(t,o)?((e,t,o)=>{const l=xt(e);return Tt(l,t,o)})(e.table,e.first,e.last):f.none()))))}))).map((e=>({bounds:e,cells:t})));var l,n,r},Ko=e=>{const t=to(f.none()),o=to([]);let l=f.none();const n=J("caption"),r=e=>l.forall((t=>!t[e])),a=()=>Ht(Ct(e),wt(e)).bind((t=>{return o=Se(Be(t),Ht((e=>j.fromDom(e.selection.getEnd()))(e),wt(e)).bind(Be),((o,l)=>Y(o,l)?n(t)?f.some((e=>({element:e,mergable:f.none(),unmergable:f.none(),selection:[e]}))(t)):f.some(((e,t,o)=>({element:o,mergable:Go(t,e,qt),unmergable:Uo(e),selection:$o(e)}))(Vt(e),o,t)):f.none())),o.bind(u);var o})),s=e=>Be(e.element).map((t=>{const o=Ve(t),l=vo(o,e).getOr([]),n=k(l,((e,t)=>(t.isLocked&&(e.onAny=!0,0===t.column?e.onFirst=!0:t.column+t.colspan>=o.grid.columns&&(e.onLast=!0)),e)),{onAny:!1,onFirst:!1,onLast:!1});return{mergeable:xo(o,e).isSome(),unmergeable:Ao(o,e).isSome(),locked:n}})),c=()=>{t.set((e=>{let t,o=!1;return(...l)=>(o||(o=!0,t=e.apply(null,l)),t)})(a)()),l=t.get().bind(s),N(o.get(),(e=>e()))},i=e=>(e(),o.set(o.get().concat([e])),()=>{o.set(P(o.get(),(t=>t!==e)))}),m=(e,o)=>i((()=>t.get().fold((()=>{e.setEnabled(!1)}),(t=>{e.setEnabled(!o(t))})))),d=(e,o,l)=>i((()=>t.get().fold((()=>{e.setEnabled(!1),e.setActive(!1)}),(t=>{e.setEnabled(!o(t)),e.setActive(l(t))})))),p=e=>l.exists((t=>t.locked[e])),b=(t,o)=>l=>d(l,(e=>n(e.element)),(()=>e.queryCommandValue(t)===o)),h=b("mceTableRowType","header"),y=b("mceTableColType","th");return e.on("NodeChange ExecCommand TableSelectorChange",c),{onSetupTable:e=>m(e,(e=>!1)),onSetupCellOrRow:e=>m(e,(e=>n(e.element))),onSetupColumn:e=>t=>m(t,(t=>n(t.element)||p(e))),onSetupPasteable:e=>t=>m(t,(t=>n(t.element)||e().isNone())),onSetupPasteableColumn:(e,t)=>o=>m(o,(o=>n(o.element)||e().isNone()||p(t))),onSetupMergeable:e=>m(e,(e=>r("mergeable"))),onSetupUnmergeable:e=>m(e,(e=>r("unmergeable"))),resetTargets:c,onSetupTableWithCaption:t=>d(t,g,(t=>Be(t.element,wt(e)).exists((e=>ue(e,"caption").isSome())))),onSetupTableRowHeaders:h,onSetupTableColumnHeaders:y,targets:t.get}};var Jo=tinymce.util.Tools.resolve("tinymce.FakeClipboard");const Qo=e=>{var t;const o=null!==(t=Jo.read())&&void 0!==t?t:[];return L(o,(t=>f.from(t.getType(e))))},Xo=()=>Qo("x-tinymce/dom-table-rows"),Yo=()=>Qo("x-tinymce/dom-table-columns");e.add("table",(e=>{const t=Ko(e);(e=>{const t=e.options.register;t("table_border_widths",{processor:"object[]",default:Ze}),t("table_border_styles",{processor:"object[]",default:et}),t("table_cell_advtab",{processor:"boolean",default:!0}),t("table_row_advtab",{processor:"boolean",default:!0}),t("table_advtab",{processor:"boolean",default:!0}),t("table_appearance_options",{processor:"boolean",default:!0}),t("table_grid",{processor:"boolean",default:!Ye.deviceType.isTouch()}),t("table_style_by_css",{processor:"boolean",default:!0}),t("table_cell_class_list",{processor:"object[]",default:[]}),t("table_row_class_list",{processor:"object[]",default:[]}),t("table_class_list",{processor:"object[]",default:[]}),t("table_toolbar",{processor:"string",default:"tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol"}),t("table_background_color_map",{processor:"object[]",default:[]}),t("table_border_color_map",{processor:"object[]",default:[]})})(e),(e=>{S({mceTableProps:b(Wo,e,!1),mceTableRowProps:b(Ho,e),mceTableCellProps:b(Eo,e)},((t,o)=>e.addCommand(o,(()=>t())))),e.addCommand("mceInsertTableDialog",(t=>{Wo(e,!0)}))})(e),((e,t)=>{const o=t=>()=>e.execCommand(t),l=(t,l)=>!!e.queryCommandSupported(l.command)&&(e.ui.registry.addMenuItem(t,{...l,onAction:c(l.onAction)?l.onAction:o(l.command)}),!0),n=(t,l)=>{e.queryCommandSupported(l.command)&&e.ui.registry.addToggleMenuItem(t,{...l,onAction:c(l.onAction)?l.onAction:o(l.command)})},r=t=>{e.execCommand("mceInsertTable",!1,{rows:t.numRows,columns:t.numColumns})},a=[l("tableinsertrowbefore",{text:"Insert row before",icon:"table-insert-row-above",command:"mceTableInsertRowBefore",onSetup:t.onSetupCellOrRow}),l("tableinsertrowafter",{text:"Insert row after",icon:"table-insert-row-after",command:"mceTableInsertRowAfter",onSetup:t.onSetupCellOrRow}),l("tabledeleterow",{text:"Delete row",icon:"table-delete-row",command:"mceTableDeleteRow",onSetup:t.onSetupCellOrRow}),l("tablerowprops",{text:"Row properties",icon:"table-row-properties",command:"mceTableRowProps",onSetup:t.onSetupCellOrRow}),l("tablecutrow",{text:"Cut row",icon:"cut-row",command:"mceTableCutRow",onSetup:t.onSetupCellOrRow}),l("tablecopyrow",{text:"Copy row",icon:"duplicate-row",command:"mceTableCopyRow",onSetup:t.onSetupCellOrRow}),l("tablepasterowbefore",{text:"Paste row before",icon:"paste-row-before",command:"mceTablePasteRowBefore",onSetup:t.onSetupPasteable(Xo)}),l("tablepasterowafter",{text:"Paste row after",icon:"paste-row-after",command:"mceTablePasteRowAfter",onSetup:t.onSetupPasteable(Xo)})],s=[l("tableinsertcolumnbefore",{text:"Insert column before",icon:"table-insert-column-before",command:"mceTableInsertColBefore",onSetup:t.onSetupColumn("onFirst")}),l("tableinsertcolumnafter",{text:"Insert column after",icon:"table-insert-column-after",command:"mceTableInsertColAfter",onSetup:t.onSetupColumn("onLast")}),l("tabledeletecolumn",{text:"Delete column",icon:"table-delete-column",command:"mceTableDeleteCol",onSetup:t.onSetupColumn("onAny")}),l("tablecutcolumn",{text:"Cut column",icon:"cut-column",command:"mceTableCutCol",onSetup:t.onSetupColumn("onAny")}),l("tablecopycolumn",{text:"Copy column",icon:"duplicate-column",command:"mceTableCopyCol",onSetup:t.onSetupColumn("onAny")}),l("tablepastecolumnbefore",{text:"Paste column before",icon:"paste-column-before",command:"mceTablePasteColBefore",onSetup:t.onSetupPasteableColumn(Yo,"onFirst")}),l("tablepastecolumnafter",{text:"Paste column after",icon:"paste-column-after",command:"mceTablePasteColAfter",onSetup:t.onSetupPasteableColumn(Yo,"onLast")})],i=[l("tablecellprops",{text:"Cell properties",icon:"table-cell-properties",command:"mceTableCellProps",onSetup:t.onSetupCellOrRow}),l("tablemergecells",{text:"Merge cells",icon:"table-merge-cells",command:"mceTableMergeCells",onSetup:t.onSetupMergeable}),l("tablesplitcells",{text:"Split cell",icon:"table-split-cells",command:"mceTableSplitCells",onSetup:t.onSetupUnmergeable})];mt(e)?e.ui.registry.addNestedMenuItem("inserttable",{text:"Table",icon:"table",getSubmenuItems:()=>[{type:"fancymenuitem",fancytype:"inserttable",onAction:r}]}):e.ui.registry.addMenuItem("inserttable",{text:"Table",icon:"table",onAction:o("mceInsertTableDialog")}),e.ui.registry.addMenuItem("inserttabledialog",{text:"Insert table",icon:"table",onAction:o("mceInsertTableDialog")}),l("tableprops",{text:"Table properties",onSetup:t.onSetupTable,command:"mceTableProps"}),l("deletetable",{text:"Delete table",icon:"table-delete-table",onSetup:t.onSetupTable,command:"mceTableDelete"}),O(a,!0)&&e.ui.registry.addNestedMenuItem("row",{type:"nestedmenuitem",text:"Row",getSubmenuItems:d("tableinsertrowbefore tableinsertrowafter tabledeleterow tablerowprops | tablecutrow tablecopyrow tablepasterowbefore tablepasterowafter")}),O(s,!0)&&e.ui.registry.addNestedMenuItem("column",{type:"nestedmenuitem",text:"Column",getSubmenuItems:d("tableinsertcolumnbefore tableinsertcolumnafter tabledeletecolumn | tablecutcolumn tablecopycolumn tablepastecolumnbefore tablepastecolumnafter")}),O(i,!0)&&e.ui.registry.addNestedMenuItem("cell",{type:"nestedmenuitem",text:"Cell",getSubmenuItems:d("tablecellprops tablemergecells tablesplitcells")}),e.ui.registry.addContextMenu("table",{update:()=>(t.resetTargets(),t.targets().fold(d(""),(e=>"caption"===V(e.element)?"tableprops deletetable":"cell row column | advtablesort | tableprops deletetable")))});const m=so(bt(e));0!==m.length&&e.queryCommandSupported("mceTableToggleClass")&&e.ui.registry.addNestedMenuItem("tableclass",{icon:"table-classes",text:"Table styles",getSubmenuItems:()=>ro(e,m,"tableclass",(t=>e.execCommand("mceTableToggleClass",!1,t))),onSetup:t.onSetupTable});const u=so(ut(e));0!==u.length&&e.queryCommandSupported("mceTableCellToggleClass")&&e.ui.registry.addNestedMenuItem("tablecellclass",{icon:"table-cell-classes",text:"Cell styles",getSubmenuItems:()=>ro(e,u,"tablecellclass",(t=>e.execCommand("mceTableCellToggleClass",!1,t))),onSetup:t.onSetupCellOrRow}),e.queryCommandSupported("mceTableApplyCellStyle")&&(e.ui.registry.addNestedMenuItem("tablecellvalign",{icon:"vertical-align",text:"Vertical align",getSubmenuItems:()=>ro(e,Wt,"tablecellverticalalign",ao(e,"vertical-align")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addNestedMenuItem("tablecellborderwidth",{icon:"border-width",text:"Border width",getSubmenuItems:()=>ro(e,lt(e),"tablecellborderwidth",ao(e,"border-width")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addNestedMenuItem("tablecellborderstyle",{icon:"border-style",text:"Border style",getSubmenuItems:()=>ro(e,nt(e),"tablecellborderstyle",ao(e,"border-style")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addNestedMenuItem("tablecellbackgroundcolor",{icon:"cell-background-color",text:"Background color",getSubmenuItems:()=>io(e,ht(e),"background-color"),onSetup:t.onSetupCellOrRow}),e.ui.registry.addNestedMenuItem("tablecellbordercolor",{icon:"cell-border-color",text:"Border color",getSubmenuItems:()=>io(e,ft(e),"border-color"),onSetup:t.onSetupCellOrRow})),n("tablecaption",{icon:"table-caption",text:"Table caption",command:"mceTableToggleCaption",onSetup:t.onSetupTableWithCaption}),n("tablerowheader",{text:"Row header",icon:"table-top-header",command:"mceTableRowType",onAction:mo(e),onSetup:t.onSetupTableRowHeaders}),n("tablecolheader",{text:"Column header",icon:"table-left-header",command:"mceTableColType",onAction:uo(e),onSetup:t.onSetupTableRowHeaders})})(e,t),((e,t)=>{e.ui.registry.addMenuButton("table",{tooltip:"Table",icon:"table",fetch:e=>e("inserttable | cell row column | advtablesort | tableprops deletetable")});const o=t=>()=>e.execCommand(t),l=(t,l)=>{e.queryCommandSupported(l.command)&&e.ui.registry.addButton(t,{...l,onAction:c(l.onAction)?l.onAction:o(l.command)})},n=(t,l)=>{e.queryCommandSupported(l.command)&&e.ui.registry.addToggleButton(t,{...l,onAction:c(l.onAction)?l.onAction:o(l.command)})};l("tableprops",{tooltip:"Table properties",command:"mceTableProps",icon:"table",onSetup:t.onSetupTable}),l("tabledelete",{tooltip:"Delete table",command:"mceTableDelete",icon:"table-delete-table",onSetup:t.onSetupTable}),l("tablecellprops",{tooltip:"Cell properties",command:"mceTableCellProps",icon:"table-cell-properties",onSetup:t.onSetupCellOrRow}),l("tablemergecells",{tooltip:"Merge cells",command:"mceTableMergeCells",icon:"table-merge-cells",onSetup:t.onSetupMergeable}),l("tablesplitcells",{tooltip:"Split cell",command:"mceTableSplitCells",icon:"table-split-cells",onSetup:t.onSetupUnmergeable}),l("tableinsertrowbefore",{tooltip:"Insert row before",command:"mceTableInsertRowBefore",icon:"table-insert-row-above",onSetup:t.onSetupCellOrRow}),l("tableinsertrowafter",{tooltip:"Insert row after",command:"mceTableInsertRowAfter",icon:"table-insert-row-after",onSetup:t.onSetupCellOrRow}),l("tabledeleterow",{tooltip:"Delete row",command:"mceTableDeleteRow",icon:"table-delete-row",onSetup:t.onSetupCellOrRow}),l("tablerowprops",{tooltip:"Row properties",command:"mceTableRowProps",icon:"table-row-properties",onSetup:t.onSetupCellOrRow}),l("tableinsertcolbefore",{tooltip:"Insert column before",command:"mceTableInsertColBefore",icon:"table-insert-column-before",onSetup:t.onSetupColumn("onFirst")}),l("tableinsertcolafter",{tooltip:"Insert column after",command:"mceTableInsertColAfter",icon:"table-insert-column-after",onSetup:t.onSetupColumn("onLast")}),l("tabledeletecol",{tooltip:"Delete column",command:"mceTableDeleteCol",icon:"table-delete-column",onSetup:t.onSetupColumn("onAny")}),l("tablecutrow",{tooltip:"Cut row",command:"mceTableCutRow",icon:"cut-row",onSetup:t.onSetupCellOrRow}),l("tablecopyrow",{tooltip:"Copy row",command:"mceTableCopyRow",icon:"duplicate-row",onSetup:t.onSetupCellOrRow}),l("tablepasterowbefore",{tooltip:"Paste row before",command:"mceTablePasteRowBefore",icon:"paste-row-before",onSetup:t.onSetupPasteable(Xo)}),l("tablepasterowafter",{tooltip:"Paste row after",command:"mceTablePasteRowAfter",icon:"paste-row-after",onSetup:t.onSetupPasteable(Xo)}),l("tablecutcol",{tooltip:"Cut column",command:"mceTableCutCol",icon:"cut-column",onSetup:t.onSetupColumn("onAny")}),l("tablecopycol",{tooltip:"Copy column",command:"mceTableCopyCol",icon:"duplicate-column",onSetup:t.onSetupColumn("onAny")}),l("tablepastecolbefore",{tooltip:"Paste column before",command:"mceTablePasteColBefore",icon:"paste-column-before",onSetup:t.onSetupPasteableColumn(Yo,"onFirst")}),l("tablepastecolafter",{tooltip:"Paste column after",command:"mceTablePasteColAfter",icon:"paste-column-after",onSetup:t.onSetupPasteableColumn(Yo,"onLast")}),l("tableinsertdialog",{tooltip:"Insert table",command:"mceInsertTableDialog",icon:"table"});const r=so(bt(e));0!==r.length&&e.queryCommandSupported("mceTableToggleClass")&&e.ui.registry.addMenuButton("tableclass",{icon:"table-classes",tooltip:"Table styles",fetch:co(e,r,"tableclass",(t=>e.execCommand("mceTableToggleClass",!1,t))),onSetup:t.onSetupTable});const a=so(ut(e));0!==a.length&&e.queryCommandSupported("mceTableCellToggleClass")&&e.ui.registry.addMenuButton("tablecellclass",{icon:"table-cell-classes",tooltip:"Cell styles",fetch:co(e,a,"tablecellclass",(t=>e.execCommand("mceTableCellToggleClass",!1,t))),onSetup:t.onSetupCellOrRow}),e.queryCommandSupported("mceTableApplyCellStyle")&&(e.ui.registry.addMenuButton("tablecellvalign",{icon:"vertical-align",tooltip:"Vertical align",fetch:co(e,Wt,"tablecellverticalalign",ao(e,"vertical-align")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addMenuButton("tablecellborderwidth",{icon:"border-width",tooltip:"Border width",fetch:co(e,lt(e),"tablecellborderwidth",ao(e,"border-width")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addMenuButton("tablecellborderstyle",{icon:"border-style",tooltip:"Border style",fetch:co(e,nt(e),"tablecellborderstyle",ao(e,"border-style")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addMenuButton("tablecellbackgroundcolor",{icon:"cell-background-color",tooltip:"Background color",fetch:t=>t(io(e,ht(e),"background-color")),onSetup:t.onSetupCellOrRow}),e.ui.registry.addMenuButton("tablecellbordercolor",{icon:"cell-border-color",tooltip:"Border color",fetch:t=>t(io(e,ft(e),"border-color")),onSetup:t.onSetupCellOrRow})),n("tablecaption",{tooltip:"Table caption",icon:"table-caption",command:"mceTableToggleCaption",onSetup:t.onSetupTableWithCaption}),n("tablerowheader",{tooltip:"Row header",icon:"table-top-header",command:"mceTableRowType",onAction:mo(e),onSetup:t.onSetupTableRowHeaders}),n("tablecolheader",{tooltip:"Column header",icon:"table-left-header",command:"mceTableColType",onAction:uo(e),onSetup:t.onSetupTableColumnHeaders})})(e,t),(e=>{const t=gt(e);t.length>0&&e.ui.registry.addContextToolbar("table",{predicate:t=>e.dom.is(t,"table")&&e.getBody().contains(t),items:t,scope:"node",position:"node"})})(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/template/plugin.js b/public/assets/tinymce/plugins/template/plugin.js
index 70578026118cbc29669f992a68cab9c9601d5b1e..9278de40c18449ac0e998468671f9577dc9220a4 100644
--- a/public/assets/tinymce/plugins/template/plugin.js
+++ b/public/assets/tinymce/plugins/template/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(a=n=e,(r=String).prototype.isPrototypeOf(a)||(null===(s=n.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var a,n,r,s})(t)===e,a=t("string"),n=t("object"),r=t("array"),s=("function",e=>"function"==typeof e);const l=(!1,()=>false);var o=tinymce.util.Tools.resolve("tinymce.util.Tools");const c=e=>t=>t.options.get(e),i=c("template_cdate_classes"),u=c("template_mdate_classes"),m=c("template_selected_content_classes"),p=c("template_preview_replace_values"),d=c("template_replace_values"),h=c("templates"),g=c("template_cdate_format"),v=c("template_mdate_format"),y=c("content_style"),f=c("content_css_cors"),b=c("body_class"),_=(e,t)=>{if((e=""+e).length<t)for(let a=0;a<t-e.length;a++)e="0"+e;return e},M=(e,t,a=new Date)=>{const n="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),r="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),s="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),l="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",""+a.getFullYear())).replace("%y",""+a.getYear())).replace("%m",_(a.getMonth()+1,2))).replace("%d",_(a.getDate(),2))).replace("%H",""+_(a.getHours(),2))).replace("%M",""+_(a.getMinutes(),2))).replace("%S",""+_(a.getSeconds(),2))).replace("%I",""+((a.getHours()+11)%12+1))).replace("%p",a.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(l[a.getMonth()]))).replace("%b",""+e.translate(s[a.getMonth()]))).replace("%A",""+e.translate(r[a.getDay()]))).replace("%a",""+e.translate(n[a.getDay()]))).replace("%%","%")},T=(e,t)=>(o.each(t,((t,a)=>{s(t)&&(t=t(a)),e=e.replace(new RegExp("\\{\\$"+a+"\\}","g"),t)})),e),x=(e,t)=>{const a=e.dom,n=d(e);o.each(a.select("*",t),(e=>{o.each(n,((t,n)=>{a.hasClass(e,n)&&s(t)&&t(e)}))}))},S=(e,t)=>new RegExp("\\b"+t+"\\b","g").test(e.className),w=(e,t,a)=>{const n=e.dom,r=e.selection.getContent();a=T(a,d(e));let s=n.create("div",null,a);const l=n.select(".mceTmpl",s);l&&l.length>0&&(s=n.create("div",null),s.appendChild(l[0].cloneNode(!0))),o.each(n.select("*",s),(t=>{S(t,i(e).replace(/\s+/g,"|"))&&(t.innerHTML=M(e,g(e))),S(t,u(e).replace(/\s+/g,"|"))&&(t.innerHTML=M(e,v(e))),S(t,m(e).replace(/\s+/g,"|"))&&(t.innerHTML=r)})),x(e,s),e.execCommand("mceInsertContent",!1,s.innerHTML),e.addVisual()};class C{constructor(e,t){this.tag=e,this.value=t}static some(e){return new C(!0,e)}static none(){return C.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?C.some(e(this.value)):C.none()}bind(e){return this.tag?e(this.value):C.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:C.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?C.none():C.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}C.singletonNone=new C(!1);var O=tinymce.util.Tools.resolve("tinymce.Env");const A=Object.hasOwnProperty,D={'"':"&quot;","<":"&lt;",">":"&gt;","&":"&amp;","'":"&#039;"},I=e=>e.replace(/["'<>&]/g,(e=>{return(t=D,a=e,((e,t)=>A.call(e,t))(t,a)?C.from(t[a]):C.none()).getOr(e);var t,a})),N=(e,t)=>{const a=(e,t)=>((e,t,a)=>{for(let n=0,r=e.length;n<r;n++){const r=e[n];if(t(r,n))return C.some(r);if(a(r,n))break}return C.none()})(e,(e=>e.text===t),l),n=t=>{e.windowManager.alert("Could not load the specified template.",(()=>t.focus("template")))},r=e=>e.value.url.fold((()=>Promise.resolve(e.value.content.getOr(""))),(e=>fetch(e).then((e=>e.ok?e.text():Promise.reject())))),s=(e,t)=>(s,l)=>{if("template"===l.name){const l=s.getData().template;a(e,l).each((e=>{s.block("Loading..."),r(e).then((a=>{t(s,e,a)})).catch((()=>{t(s,e,""),s.setEnabled("save",!1),n(s)}))}))}},c=t=>s=>{const l=s.getData();a(t,l.template).each((t=>{r(t).then((t=>{e.execCommand("mceInsertTemplate",!1,t),s.close()})).catch((()=>{s.setEnabled("save",!1),n(s)}))}))};(()=>{if(!t||0===t.length){const t=e.translate("No templates defined.");return e.notificationManager.open({text:t,type:"info"}),C.none()}return C.from(o.map(t,((e,t)=>{const a=e=>void 0!==e.url;return{selected:0===t,text:e.title,value:{url:a(e)?C.from(e.url):C.none(),content:a(e)?C.none():C.from(e.content),description:e.description}}})))})().each((t=>{const a=(e=>((e,t)=>{const a=e.length,n=new Array(a);for(let t=0;t<a;t++){const a=e[t];n[t]={text:(r=a).text,value:r.text}}var r;return n})(e))(t),l=(e,a)=>({title:"Insert Template",size:"large",body:{type:"panel",items:e},initialData:a,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:c(t),onChange:s(t,i)}),i=(t,n,r)=>{const s=((e,t)=>{var a;if(-1===t.indexOf("<html>")){let n="";const r=null!==(a=y(e))&&void 0!==a?a:"",s=f(e)?' crossorigin="anonymous"':"";o.each(e.contentCSS,(t=>{n+='<link type="text/css" rel="stylesheet" href="'+e.documentBaseURI.toAbsolute(t)+'"'+s+">"})),r&&(n+='<style type="text/css">'+r+"</style>");const l=b(e),c=e.dom.encode,i='<script>document.addEventListener && document.addEventListener("click", function(e) {for (var elm = e.target; elm; elm = elm.parentNode) {if (elm.nodeName === "A" && !('+(O.os.isMacOS()||O.os.isiOS()?"e.metaKey":"e.ctrlKey && !e.altKey")+")) {e.preventDefault();}}}, false);<\/script> ",u=e.getBody().dir,m=u?' dir="'+c(u)+'"':"";t='<!DOCTYPE html><html><head><base href="'+c(e.documentBaseURI.getURI())+'">'+n+i+'</head><body class="'+c(l)+'"'+m+">"+t+"</body></html>"}return T(t,p(e))})(e,r),c=[{type:"selectbox",name:"template",label:"Templates",items:a},{type:"htmlpanel",html:`<p aria-live="polite">${I(n.value.description)}</p>`},{label:"Preview",type:"iframe",name:"preview",sandboxed:!1}],i={template:n.text,preview:s};t.unblock(),t.redial(l(c,i)),t.focus("template")},u=e.windowManager.open(l([],{template:"",preview:""}));u.block("Loading..."),r(t[0]).then((e=>{i(u,t[0],e)})).catch((()=>{i(u,t[0],""),u.setEnabled("save",!1),n(u)}))}))};e.add("template",(e=>{(e=>{const t=e.options.register;t("template_cdate_classes",{processor:"string",default:"cdate"}),t("template_mdate_classes",{processor:"string",default:"mdate"}),t("template_selected_content_classes",{processor:"string",default:"selcontent"}),t("template_preview_replace_values",{processor:"object"}),t("template_replace_values",{processor:"object"}),t("templates",{processor:e=>a(e)||((e,t)=>{if(r(e)){for(let a=0,n=e.length;a<n;++a)if(!t(e[a]))return!1;return!0}return!1})(e,n)||s(e)}),t("template_cdate_format",{processor:"string",default:e.translate("%Y-%m-%d")}),t("template_mdate_format",{processor:"string",default:e.translate("%Y-%m-%d")})})(e),(e=>{const t=()=>e.execCommand("mceTemplate");e.ui.registry.addButton("template",{icon:"template",tooltip:"Insert template",onAction:t}),e.ui.registry.addMenuItem("template",{icon:"template",text:"Insert template...",onAction:t})})(e),(e=>{e.addCommand("mceInsertTemplate",function(e,...t){return(...a)=>{const n=t.concat(a);return e.apply(null,n)}}(w,e)),e.addCommand("mceTemplate",((e,t)=>()=>{const n=h(e);s(n)?n(t):a(n)?fetch(n).then((e=>{e.ok&&e.json().then(t)})):t(n)})(e,(e=>t=>{N(e,t)})(e)))})(e),(e=>{e.on("PreProcess",(t=>{const a=e.dom,n=v(e);o.each(a.select("div",t.node),(t=>{a.hasClass(t,"mceTmpl")&&(o.each(a.select("*",t),(t=>{a.hasClass(t,u(e).replace(/\s+/g,"|"))&&(t.innerHTML=M(e,n))})),x(e,t))}))}))})(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/visualblocks/plugin.js b/public/assets/tinymce/plugins/visualblocks/plugin.js
index 707aea160aab8868c80a52fa09121bd02eaf8fa6..fb447d5256211e8b5a992b6e3b26d039788ca2a9 100644
--- a/public/assets/tinymce/plugins/visualblocks/plugin.js
+++ b/public/assets/tinymce/plugins/visualblocks/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const s=(t,s,o)=>{t.dom.toggleClass(t.getBody(),"mce-visualblocks"),o.set(!o.get()),((t,s)=>{t.dispatch("VisualBlocks",{state:s})})(t,o.get())},o=("visualblocks_default_state",t=>t.options.get("visualblocks_default_state"));const e=(t,s)=>o=>{o.setActive(s.get());const e=t=>o.setActive(t.state);return t.on("VisualBlocks",e),()=>t.off("VisualBlocks",e)};t.add("visualblocks",((t,l)=>{(t=>{(0,t.options.register)("visualblocks_default_state",{processor:"boolean",default:!1})})(t);const a=(t=>{let s=!1;return{get:()=>s,set:t=>{s=t}}})();((t,o,e)=>{t.addCommand("mceVisualBlocks",(()=>{s(t,0,e)}))})(t,0,a),((t,s)=>{const o=()=>t.execCommand("mceVisualBlocks");t.ui.registry.addToggleButton("visualblocks",{icon:"visualblocks",tooltip:"Show blocks",onAction:o,onSetup:e(t,s)}),t.ui.registry.addToggleMenuItem("visualblocks",{text:"Show blocks",icon:"visualblocks",onAction:o,onSetup:e(t,s)})})(t,a),((t,e,l)=>{t.on("PreviewFormats AfterPreviewFormats",(s=>{l.get()&&t.dom.toggleClass(t.getBody(),"mce-visualblocks","afterpreviewformats"===s.type)})),t.on("init",(()=>{o(t)&&s(t,0,l)}))})(t,0,a)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/visualchars/plugin.js b/public/assets/tinymce/plugins/visualchars/plugin.js
index fa21951b097636c9c667b55c5f5f2f7bb6119649..3537e0614ab43732c4f04896cfdf61a1d2608550 100644
--- a/public/assets/tinymce/plugins/visualchars/plugin.js
+++ b/public/assets/tinymce/plugins/visualchars/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>typeof e===t,n=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(n=o=t,(s=String).prototype.isPrototypeOf(n)||(null===(r=o.constructor)||void 0===r?void 0:r.name)===s.name)?"string":e;var n,o,s,r})(t),o=(null,t=>null===t);const s=e("boolean"),r=e("number");class a{constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return null==t?a.none():a.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);const i=(t,e)=>{for(let n=0,o=t.length;n<o;n++)e(t[n],n)},l=Object.keys,u=(t,e)=>{const n=l(t);for(let o=0,s=n.length;o<s;o++){const s=n[o];e(t[s],s)}};"undefined"!=typeof window?window:Function("return this;")();const c=t=>t.dom.nodeValue,d=t=>3===(t=>t.dom.nodeType)(t),h=(t,e,o)=>{((t,e,o)=>{if(!(n(o)||s(o)||r(o)))throw console.error("Invalid call to Attribute.set. Key ",e,":: Value ",o,":: Element ",t),new Error("Attribute value was not simple");t.setAttribute(e,o+"")})(t.dom,e,o)},g=(t,e)=>{t.dom.removeAttribute(e)},m=(t,e)=>{const n=((t,e)=>{const n=t.dom.getAttribute(e);return null===n?void 0:n})(t,e);return void 0===n||""===n?[]:n.split(" ")},v=t=>void 0!==t.dom.classList,p=t=>{if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}},f=p,y={"\xa0":"nbsp","\xad":"shy"},b=(t,e)=>{let n="";return u(t,((t,e)=>{n+=e})),new RegExp("["+n+"]",e?"g":"")},w=b(y),A=b(y,!0),k=(t=>{let e="";return u(t,(t=>{e&&(e+=","),e+="span.mce-"+t})),e})(y),N="mce-nbsp",C=t=>'<span data-mce-bogus="1" class="mce-'+y[t]+'">'+t+"</span>",T=t=>{const e=c(t);return d(t)&&void 0!==e&&w.test(e)},O=(t,e)=>{let n=[];const o=((t,e)=>{const n=t.length,o=new Array(n);for(let s=0;s<n;s++){const n=t[s];o[s]=e(n,s)}return o})(t.dom.childNodes,f);return i(o,(t=>{e(t)&&(n=n.concat([t])),n=n.concat(O(t,e))})),n},B=t=>"span"===t.nodeName.toLowerCase()&&t.classList.contains("mce-nbsp-wrap"),S=(t,e)=>{const n=O(f(e),T);i(n,(e=>{const n=e.dom.parentNode;if(B(n))o=f(n),s=N,v(o)?o.dom.classList.add(s):((t,e)=>{((t,e,n)=>{const o=m(t,e).concat([n]);h(t,e,o.join(" "))})(t,"class",e)})(o,s);else{const n=t.dom.encode(c(e)).replace(A,C),o=t.dom.create("div",null,n);let s;for(;s=o.lastChild;)t.dom.insertAfter(s,e.dom);t.dom.remove(e.dom)}var o,s}))},V=(t,e)=>{const n=t.dom.select(k,e);i(n,(e=>{var n,o;B(e)?(n=f(e),o=N,v(n)?n.dom.classList.remove(o):((t,e)=>{((t,e,n)=>{const o=((t,e)=>{const o=[];for(let e=0,s=t.length;e<s;e++){const s=t[e];s!==n&&o.push(s)}return o})(m(t,e));o.length>0?h(t,e,o.join(" ")):g(t,e)})(t,"class",e)})(n,o),(t=>{const e=v(t)?t.dom.classList:(t=>m(t,"class"))(t);0===e.length&&g(t,"class")})(n)):t.dom.remove(e,!0)}))},E=t=>{const e=t.getBody(),n=t.selection.getBookmark();let o=((t,e)=>{for(;t.parentNode;){if(t.parentNode===e)return t;t=t.parentNode}})(t.selection.getNode(),e);o=void 0!==o?o:e,V(t,o),S(t,o),t.selection.moveToBookmark(n)},L=(t,e)=>{((t,e)=>{t.dispatch("VisualChars",{state:e})})(t,e.get());const n=t.getBody();!0===e.get()?S(t,n):V(t,n)},_=("visualchars_default_state",t=>t.options.get("visualchars_default_state"));const j=(t,e)=>{const n=((t,e)=>{let n=null;return{cancel:()=>{o(n)||(clearTimeout(n),n=null)},throttle:(...e)=>{o(n)&&(n=setTimeout((()=>{n=null,t.apply(null,e)}),300))}}})((()=>{E(t)}));t.on("keydown",(o=>{!0===e.get()&&(13===o.keyCode?E(t):n.throttle())})),t.on("remove",n.cancel)},x=(t,e)=>n=>{n.setActive(e.get());const o=t=>n.setActive(t.state);return t.on("VisualChars",o),()=>t.off("VisualChars",o)};t.add("visualchars",(t=>{(t=>{(0,t.options.register)("visualchars_default_state",{processor:"boolean",default:!1})})(t);const e=(t=>{let e=t;return{get:()=>e,set:t=>{e=t}}})(_(t));return((t,e)=>{t.addCommand("mceVisualChars",(()=>{((t,e)=>{e.set(!e.get());const n=t.selection.getBookmark();L(t,e),t.selection.moveToBookmark(n)})(t,e)}))})(t,e),((t,e)=>{const n=()=>t.execCommand("mceVisualChars");t.ui.registry.addToggleButton("visualchars",{tooltip:"Show invisible characters",icon:"visualchars",onAction:n,onSetup:x(t,e)}),t.ui.registry.addToggleMenuItem("visualchars",{text:"Show invisible characters",icon:"visualchars",onAction:n,onSetup:x(t,e)})})(t,e),j(t,e),((t,e)=>{t.on("init",(()=>{L(t,e)}))})(t,e),(t=>({isEnabled:()=>t.get()}))(e)}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/plugins/wordcount/plugin.js b/public/assets/tinymce/plugins/wordcount/plugin.js
index f3b88cb4bd357a89a3de244b0bfdc6bfc939d6c9..b8d9602538d7154dc691b85f2d4fe7d86bf294ab 100644
--- a/public/assets/tinymce/plugins/wordcount/plugin.js
+++ b/public/assets/tinymce/plugins/wordcount/plugin.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=(null,t=>null===t);const n=t=>t,o="[-'\\.\u2018\u2019\u2024\ufe52\uff07\uff0e]",r="[:\xb7\xb7\u05f4\u2027\ufe13\ufe55\uff1a]",c="[\xb1+*/,;;\u0589\u060c\u060d\u066c\u07f8\u2044\ufe10\ufe14\ufe50\ufe54\uff0c\uff1b]",u="[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]",s="\\r",a="\\n",l="[\v\f\x85\u2028\u2029]",i="[\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]",g="[\xad\u0600-\u0603\u06dd\u070f\u17b4\u17b5\u200e\u200f\u202a-\u202e\u2060-\u2064\u206a-\u206f\ufeff\ufff9-\ufffb]",d="[\u3031-\u3035\u309b\u309c\u30a0-\u30fa\u30fc-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff9d]",p="[=_\u203f\u2040\u2054\ufe33\ufe34\ufe4d-\ufe4f\uff3f\u2200-\u22ff<>]",h="[!-#%-*,-\\/:;?@\\[-\\]_{}\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=[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(o),new RegExp(r),new RegExp(c),new RegExp(u),new RegExp(s),new RegExp(a),new RegExp(l),new RegExp(i),new RegExp(g),new RegExp(d),new RegExp(p),new RegExp("@")],y=new RegExp("^"+h+"$"),m=C,w=t=>{let e=13;const n=m.length;for(let o=0;o<n;++o){const n=m[o];if(n&&n.test(t)){e=o;break}}return e},f=(t,e)=>{const n=t[e],o=t[e+1];if(e<0||e>t.length-1&&0!==e)return!1;if(0===n&&0===o)return!1;const r=t[e+2];if(0===n&&(2===o||1===o||12===o)&&0===r)return!1;const c=t[e-1];return(2!==n&&1!==n&&12!==o||0!==o||0!==c)&&(4!==n&&0!==n||4!==o&&0!==o)&&(3!==n&&1!==n||4!==o||4!==c)&&(4!==n||3!==o&&1!==o||4!==r)&&8!==n&&9!==n&&8!==c&&9!==c&&8!==o&&9!==o&&(5!==n||6!==o)&&(7===n||5===n||6===n||7===o||5===o||6===o||(10!==n||10!==o)&&(11!==o||0!==n&&4!==n&&10!==n&&11!==n)&&(11!==n||0!==o&&4!==o&&10!==o)&&12!==n)},W=/^\s+$/,x=y,E=t=>"http"===t||"https"===t,R=(t,e)=>{const n=((t,e)=>{let n;for(n=e;n<t.length&&!W.test(t[n]);n++);return n})(t,e+1);return"://"===t.slice(e+1,n).join("").substr(0,3)?n:e},S=(t,e,n)=>{n={includeWhitespace:!1,includePunctuation:!1,...n};const o=[],r=[];for(let n=0;n<t.length;n++){const c=e(t[n]);"\ufeff"!==c&&(o.push(t[n]),r.push(c))}return((t,e,n,o)=>{const r=[];let c=[];for(let u=0;u<n.length;++u)if(c.push(t[u]),f(n,u)){const n=e[u];if((o.includeWhitespace||!W.test(n))&&(o.includePunctuation||!x.test(n))){const n=u-c.length+1,o=u+1,s=e.slice(n,o).join("");if(E(s)){const n=R(e,u),r=t.slice(o,n);Array.prototype.push.apply(c,r),u=n}r.push(c)}c=[]}return r})(o,r,((t,e)=>{const n=t.length,o=new Array(n);for(let r=0;r<n;r++){const n=t[r];o[r]=e(n,r)}return o})(r,(t=>{const e={};return n=>{if(e[n])return e[n];{const o=t(n);return e[n]=o,o}}})(w)),n)};var b=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker");const v=(t,e)=>{const n=e.getBlockElements(),o=e.getVoidElements(),r=t=>n[t.nodeName]||o[t.nodeName],c=[];let u="";const s=new b(t,t);for(;t=s.next();)3===t.nodeType?u+=t.data.replace(/\uFEFF/g,""):r(t)&&u.length&&(c.push(u),u="");return u.length&&c.push(u),c},F=t=>t.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").length,T=(t,e)=>{const o=(t=>t.replace(/\u200B/g,""))(v(t,e).join("\n"));return S(o.split(""),n).length},A=(t,e)=>{const n=v(t,e).join("");return F(n)},B=(t,e)=>{const n=v(t,e).join("").replace(/\s/g,"");return F(n)},D=(t,e)=>()=>e(t.getBody(),t.schema),j=(t,e)=>()=>e(t.selection.getRng().cloneContents(),t.schema),k=t=>D(t,T);var U=tinymce.util.Tools.resolve("tinymce.util.Delay");const M=(t,e)=>{((t,e)=>{t.dispatch("wordCountUpdate",{wordCount:{words:e.body.getWordCount(),characters:e.body.getCharacterCount(),charactersWithoutSpaces:e.body.getCharacterCountWithoutSpaces()}})})(t,e)},P=(t,n,o)=>{const r=((t,n)=>{let o=null;return{cancel:()=>{e(o)||(clearTimeout(o),o=null)},throttle:(...r)=>{e(o)&&(o=setTimeout((()=>{o=null,t.apply(null,r)}),n))}}})((()=>M(t,n)),o);t.on("init",(()=>{M(t,n),U.setEditorTimeout(t,(()=>{t.on("SetContent BeforeAddUndo Undo Redo ViewUpdate keyup",r.throttle)}),0),t.on("remove",r.cancel)}))};((e=300)=>{t.add("wordcount",(t=>{const n=(t=>({body:{getWordCount:k(t),getCharacterCount:D(t,A),getCharacterCountWithoutSpaces:D(t,B)},selection:{getWordCount:j(t,T),getCharacterCount:j(t,A),getCharacterCountWithoutSpaces:j(t,B)},getCount:k(t)}))(t);return((t,e)=>{t.addCommand("mceWordCount",(()=>((t,e)=>{t.windowManager.open({title:"Word Count",body:{type:"panel",items:[{type:"table",header:["Count","Document","Selection"],cells:[["Words",String(e.body.getWordCount()),String(e.selection.getWordCount())],["Characters (no spaces)",String(e.body.getCharacterCountWithoutSpaces()),String(e.selection.getCharacterCountWithoutSpaces())],["Characters",String(e.body.getCharacterCount()),String(e.selection.getCharacterCount())]]}]},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}]})})(t,e)))})(t,n),(t=>{const e=()=>t.execCommand("mceWordCount");t.ui.registry.addButton("wordcount",{tooltip:"Word count",icon:"character-count",onAction:e}),t.ui.registry.addMenuItem("wordcount",{text:"Word count",icon:"character-count",onAction:e})})(t),P(t,n,e),n}))})()}();
\ No newline at end of file
diff --git a/public/assets/tinymce/themes/silver/theme.js b/public/assets/tinymce/themes/silver/theme.js
index 126dfa8a83b3050ec505d22785be93e742b3bc1f..ebb14b3e70533f3e63dbfa351b5fe46cba8e5222 100644
--- a/public/assets/tinymce/themes/silver/theme.js
+++ b/public/assets/tinymce/themes/silver/theme.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
 !function(){"use strict";const e=Object.getPrototypeOf,t=(e,t,o)=>{var n;return!!o(e,t.prototype)||(null===(n=e.constructor)||void 0===n?void 0:n.name)===t.name},o=e=>o=>(e=>{const o=typeof e;return null===e?"null":"object"===o&&Array.isArray(e)?"array":"object"===o&&t(e,String,((e,t)=>t.isPrototypeOf(e)))?"string":o})(o)===e,n=e=>t=>typeof t===e,s=e=>t=>e===t,r=o("string"),a=o("object"),i=o=>((o,n)=>a(o)&&t(o,n,((t,o)=>e(t)===o)))(o,Object),l=o("array"),c=s(null),d=n("boolean"),u=s(void 0),m=e=>null==e,g=e=>!m(e),p=n("function"),h=n("number"),f=(e,t)=>{if(l(e)){for(let o=0,n=e.length;o<n;++o)if(!t(e[o]))return!1;return!0}return!1},b=()=>{},v=(e,t)=>(...o)=>e(t.apply(null,o)),y=e=>()=>e,x=e=>e,w=(e,t)=>e===t;function S(e,...t){return(...o)=>{const n=t.concat(o);return e.apply(null,n)}}const k=e=>t=>!e(t),C=e=>()=>{throw new Error(e)},O=e=>e(),_=y(!1),T=y(!0);var E=tinymce.util.Tools.resolve("tinymce.ThemeManager");class B{constructor(e,t){this.tag=e,this.value=t}static some(e){return new B(!0,e)}static none(){return B.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?B.some(e(this.value)):B.none()}bind(e){return this.tag?e(this.value):B.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:B.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return g(e)?B.some(e):B.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}B.singletonNone=new B(!1);const M=Array.prototype.slice,A=Array.prototype.indexOf,D=Array.prototype.push,F=(e,t)=>A.call(e,t),I=(e,t)=>{const o=F(e,t);return-1===o?B.none():B.some(o)},V=(e,t)=>F(e,t)>-1,R=(e,t)=>{for(let o=0,n=e.length;o<n;o++)if(t(e[o],o))return!0;return!1},z=(e,t)=>{const o=[];for(let n=0;n<e;n++)o.push(t(n));return o},H=(e,t)=>{const o=[];for(let n=0;n<e.length;n+=t){const s=M.call(e,n,n+t);o.push(s)}return o},P=(e,t)=>{const o=e.length,n=new Array(o);for(let s=0;s<o;s++){const o=e[s];n[s]=t(o,s)}return n},N=(e,t)=>{for(let o=0,n=e.length;o<n;o++)t(e[o],o)},L=(e,t)=>{const o=[],n=[];for(let s=0,r=e.length;s<r;s++){const r=e[s];(t(r,s)?o:n).push(r)}return{pass:o,fail:n}},W=(e,t)=>{const o=[];for(let n=0,s=e.length;n<s;n++){const s=e[n];t(s,n)&&o.push(s)}return o},U=(e,t,o)=>(((e,t)=>{for(let o=e.length-1;o>=0;o--)t(e[o],o)})(e,((e,n)=>{o=t(o,e,n)})),o),j=(e,t,o)=>(N(e,((e,n)=>{o=t(o,e,n)})),o),G=(e,t)=>((e,t,o)=>{for(let n=0,s=e.length;n<s;n++){const s=e[n];if(t(s,n))return B.some(s);if(o(s,n))break}return B.none()})(e,t,_),$=(e,t)=>{for(let o=0,n=e.length;o<n;o++)if(t(e[o],o))return B.some(o);return B.none()},q=e=>{const t=[];for(let o=0,n=e.length;o<n;++o){if(!l(e[o]))throw new Error("Arr.flatten item "+o+" was not an array, input: "+e);D.apply(t,e[o])}return t},X=(e,t)=>q(P(e,t)),K=(e,t)=>{for(let o=0,n=e.length;o<n;++o)if(!0!==t(e[o],o))return!1;return!0},Y=e=>{const t=M.call(e,0);return t.reverse(),t},J=(e,t)=>W(e,(e=>!V(t,e))),Z=(e,t)=>{const o={};for(let n=0,s=e.length;n<s;n++){const s=e[n];o[String(s)]=t(s,n)}return o},Q=e=>[e],ee=(e,t)=>{const o=M.call(e,0);return o.sort(t),o},te=(e,t)=>t>=0&&t<e.length?B.some(e[t]):B.none(),oe=e=>te(e,0),ne=e=>te(e,e.length-1),se=p(Array.from)?Array.from:e=>M.call(e),re=(e,t)=>{for(let o=0;o<e.length;o++){const n=t(e[o],o);if(n.isSome())return n}return B.none()},ae=Object.keys,ie=Object.hasOwnProperty,le=(e,t)=>{const o=ae(e);for(let n=0,s=o.length;n<s;n++){const s=o[n];t(e[s],s)}},ce=(e,t)=>de(e,((e,o)=>({k:o,v:t(e,o)}))),de=(e,t)=>{const o={};return le(e,((e,n)=>{const s=t(e,n);o[s.k]=s.v})),o},ue=e=>(t,o)=>{e[o]=t},me=(e,t,o,n)=>(le(e,((e,s)=>{(t(e,s)?o:n)(e,s)})),{}),ge=(e,t)=>{const o=[];return le(e,((e,n)=>{o.push(t(e,n))})),o},pe=(e,t)=>{const o=ae(e);for(let n=0,s=o.length;n<s;n++){const s=o[n],r=e[s];if(t(r,s,e))return B.some(r)}return B.none()},he=e=>ge(e,x),fe=(e,t)=>be(e,t)?B.from(e[t]):B.none(),be=(e,t)=>ie.call(e,t),ve=(e,t)=>be(e,t)&&void 0!==e[t]&&null!==e[t],ye=(e,t,o=w)=>e.exists((e=>o(e,t))),xe=e=>{const t=[],o=e=>{t.push(e)};for(let t=0;t<e.length;t++)e[t].each(o);return t},we=(e,t,o)=>e.isSome()&&t.isSome()?B.some(o(e.getOrDie(),t.getOrDie())):B.none(),Se=(e,t)=>e?B.some(t):B.none(),ke=(e,t,o)=>""===t||e.length>=t.length&&e.substr(o,o+t.length)===t,Ce=(e,t)=>-1!==e.indexOf(t),Oe=(e,t)=>ke(e,t,e.length-t.length),_e=(Ie=/^\s+|\s+$/g,e=>e.replace(Ie,"")),Te=e=>e.length>0,Ee=e=>void 0!==e.style&&p(e.style.getPropertyValue),Be=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},Me=(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return Be(o.childNodes[0])},Ae=(e,t)=>{const o=(t||document).createElement(e);return Be(o)},De=(e,t)=>{const o=(t||document).createTextNode(e);return Be(o)},Fe=Be;var Ie;"undefined"!=typeof window?window:Function("return this;")();const Ve=e=>e.dom.nodeName.toLowerCase(),Re=e=>t=>(e=>e.dom.nodeType)(t)===e,ze=Re(1),He=Re(3),Pe=Re(9),Ne=Re(11),Le=e=>t=>ze(t)&&Ve(t)===e,We=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},Ue=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,je=(e,t)=>e.dom===t.dom,Ge=(e,t)=>{const o=e.dom,n=t.dom;return o!==n&&o.contains(n)},$e=e=>Fe(e.dom.ownerDocument),qe=e=>Pe(e)?e:$e(e),Xe=e=>Fe(qe(e).dom.documentElement),Ke=e=>Fe(qe(e).dom.defaultView),Ye=e=>B.from(e.dom.parentNode).map(Fe),Je=e=>B.from(e.dom.parentElement).map(Fe),Ze=e=>B.from(e.dom.offsetParent).map(Fe),Qe=e=>P(e.dom.childNodes,Fe),et=(e,t)=>{const o=e.dom.childNodes;return B.from(o[t]).map(Fe)},tt=(e,t)=>({element:e,offset:t}),ot=(e,t)=>{const o=Qe(e);return o.length>0&&t<o.length?tt(o[t],0):tt(e,t)},nt=e=>Ne(e)&&g(e.dom.host),st=p(Element.prototype.attachShadow)&&p(Node.prototype.getRootNode),rt=y(st),at=st?e=>Fe(e.dom.getRootNode()):qe,it=e=>nt(e)?e:Fe(qe(e).dom.body),lt=e=>{const t=at(e);return nt(t)?B.some(t):B.none()},ct=e=>Fe(e.dom.host),dt=e=>{const t=He(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return lt(Fe(t)).fold((()=>o.body.contains(t)),(n=dt,s=ct,e=>n(s(e))));var n,s},ut=()=>mt(Fe(document)),mt=e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return Fe(t)},gt=(e,t,o)=>{if(!(r(o)||d(o)||h(o)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",o,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,o+"")},pt=(e,t,o)=>{gt(e.dom,t,o)},ht=(e,t)=>{const o=e.dom;le(t,((e,t)=>{gt(o,t,e)}))},ft=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},bt=(e,t)=>B.from(ft(e,t)),vt=(e,t)=>{const o=e.dom;return!(!o||!o.hasAttribute)&&o.hasAttribute(t)},yt=(e,t)=>{e.dom.removeAttribute(t)},xt=(e,t,o)=>{if(!r(o))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",o,":: Element ",e),new Error("CSS value must be a string: "+o);Ee(e)&&e.style.setProperty(t,o)},wt=(e,t)=>{Ee(e)&&e.style.removeProperty(t)},St=(e,t,o)=>{const n=e.dom;xt(n,t,o)},kt=(e,t)=>{const o=e.dom;le(t,((e,t)=>{xt(o,t,e)}))},Ct=(e,t)=>{const o=e.dom;le(t,((e,t)=>{e.fold((()=>{wt(o,t)}),(e=>{xt(o,t,e)}))}))},Ot=(e,t)=>{const o=e.dom,n=window.getComputedStyle(o).getPropertyValue(t);return""!==n||dt(e)?n:_t(o,t)},_t=(e,t)=>Ee(e)?e.style.getPropertyValue(t):"",Tt=(e,t)=>{const o=e.dom,n=_t(o,t);return B.from(n).filter((e=>e.length>0))},Et=e=>{const t={},o=e.dom;if(Ee(o))for(let e=0;e<o.style.length;e++){const n=o.style.item(e);t[n]=o.style[n]}return t},Bt=(e,t,o)=>{const n=Ae(e);return St(n,t,o),Tt(n,t).isSome()},Mt=(e,t)=>{const o=e.dom;wt(o,t),ye(bt(e,"style").map(_e),"")&&yt(e,"style")},At=e=>e.dom.offsetWidth,Dt=(e,t)=>{const o=o=>{const n=t(o);if(n<=0||null===n){const t=Ot(o,e);return parseFloat(t)||0}return n},n=(e,t)=>j(t,((t,o)=>{const n=Ot(e,o),s=void 0===n?0:parseInt(n,10);return isNaN(s)?t:t+s}),0);return{set:(t,o)=>{if(!h(o)&&!o.match(/^[0-9]+$/))throw new Error(e+".set accepts only positive integer values. Value was "+o);const n=t.dom;Ee(n)&&(n.style[e]=o+"px")},get:o,getOuter:o,aggregate:n,max:(e,t,o)=>{const s=n(e,o);return t>s?t-s:0}}},Ft=Dt("height",(e=>{const t=e.dom;return dt(e)?t.getBoundingClientRect().height:t.offsetHeight})),It=e=>Ft.get(e),Vt=e=>Ft.getOuter(e),Rt=(e,t)=>({left:e,top:t,translate:(o,n)=>Rt(e+o,t+n)}),zt=Rt,Ht=(e,t)=>void 0!==e?e:void 0!==t?t:0,Pt=e=>{const t=e.dom.ownerDocument,o=t.body,n=t.defaultView,s=t.documentElement;if(o===e.dom)return zt(o.offsetLeft,o.offsetTop);const r=Ht(null==n?void 0:n.pageYOffset,s.scrollTop),a=Ht(null==n?void 0:n.pageXOffset,s.scrollLeft),i=Ht(s.clientTop,o.clientTop),l=Ht(s.clientLeft,o.clientLeft);return Nt(e).translate(a-l,r-i)},Nt=e=>{const t=e.dom,o=t.ownerDocument.body;return o===t?zt(o.offsetLeft,o.offsetTop):dt(e)?(e=>{const t=e.getBoundingClientRect();return zt(t.left,t.top)})(t):zt(0,0)},Lt=Dt("width",(e=>e.dom.offsetWidth)),Wt=e=>Lt.get(e),Ut=e=>Lt.getOuter(e),jt=e=>{let t,o=!1;return(...n)=>(o||(o=!0,t=e.apply(null,n)),t)},Gt=()=>$t(0,0),$t=(e,t)=>({major:e,minor:t}),qt={nu:$t,detect:(e,t)=>{const o=String(t).toLowerCase();return 0===e.length?Gt():((e,t)=>{const o=((e,t)=>{for(let o=0;o<e.length;o++){const n=e[o];if(n.test(t))return n}})(e,t);if(!o)return{major:0,minor:0};const n=e=>Number(t.replace(o,"$"+e));return $t(n(1),n(2))})(e,o)},unknown:Gt},Xt=(e,t)=>{const o=String(t).toLowerCase();return G(e,(e=>e.search(o)))},Kt=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,Yt=e=>t=>Ce(t,e),Jt=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>Ce(e,"edge/")&&Ce(e,"chrome")&&Ce(e,"safari")&&Ce(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,Kt],search:e=>Ce(e,"chrome")&&!Ce(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>Ce(e,"msie")||Ce(e,"trident")},{name:"Opera",versionRegexes:[Kt,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Yt("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Yt("firefox")},{name:"Safari",versionRegexes:[Kt,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(Ce(e,"safari")||Ce(e,"mobile/"))&&Ce(e,"applewebkit")}],Zt=[{name:"Windows",search:Yt("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>Ce(e,"iphone")||Ce(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Yt("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:Yt("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Yt("linux"),versionRegexes:[]},{name:"Solaris",search:Yt("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Yt("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:Yt("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],Qt={browsers:y(Jt),oses:y(Zt)},eo="Edge",to="Chromium",oo="Opera",no="Firefox",so="Safari",ro=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isEdge:n(eo),isChromium:n(to),isIE:n("IE"),isOpera:n(oo),isFirefox:n(no),isSafari:n(so)}},ao=()=>ro({current:void 0,version:qt.unknown()}),io=ro,lo=(y(eo),y(to),y("IE"),y(oo),y(no),y(so),"Windows"),co="Android",uo="Linux",mo="macOS",go="Solaris",po="FreeBSD",ho="ChromeOS",fo=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isWindows:n(lo),isiOS:n("iOS"),isAndroid:n(co),isMacOS:n(mo),isLinux:n(uo),isSolaris:n(go),isFreeBSD:n(po),isChromeOS:n(ho)}},bo=()=>fo({current:void 0,version:qt.unknown()}),vo=fo,yo=(y(lo),y("iOS"),y(co),y(uo),y(mo),y(go),y(po),y(ho),e=>window.matchMedia(e).matches);let xo=jt((()=>((e,t,o)=>{const n=Qt.browsers(),s=Qt.oses(),r=t.bind((e=>((e,t)=>re(t.brands,(t=>{const o=t.brand.toLowerCase();return G(e,(e=>{var t;return o===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:qt.nu(parseInt(t.version,10),0)})))})))(n,e))).orThunk((()=>((e,t)=>Xt(e,t).map((e=>{const o=qt.detect(e.versionRegexes,t);return{current:e.name,version:o}})))(n,e))).fold(ao,io),a=((e,t)=>Xt(e,t).map((e=>{const o=qt.detect(e.versionRegexes,t);return{current:e.name,version:o}})))(s,e).fold(bo,vo),i=((e,t,o,n)=>{const s=e.isiOS()&&!0===/ipad/i.test(o),r=e.isiOS()&&!s,a=e.isiOS()||e.isAndroid(),i=a||n("(pointer:coarse)"),l=s||!r&&a&&n("(min-device-width:768px)"),c=r||a&&!l,d=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(o),u=!c&&!l&&!d;return{isiPad:y(s),isiPhone:y(r),isTablet:y(l),isPhone:y(c),isTouch:y(i),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:y(d),isDesktop:y(u)}})(a,r,e,o);return{browser:r,os:a,deviceType:i}})(navigator.userAgent,B.from(navigator.userAgentData),yo)));const wo=()=>xo(),So=e=>{const t=Fe((e=>{if(rt()&&g(e.target)){const t=Fe(e.target);if(ze(t)&&(e=>g(e.dom.shadowRoot))(t)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return oe(t)}}return B.from(e.target)})(e).getOr(e.target)),o=()=>e.stopPropagation(),n=()=>e.preventDefault(),s=v(n,o);return((e,t,o,n,s,r,a)=>({target:e,x:t,y:o,stop:n,prevent:s,kill:r,raw:a}))(t,e.clientX,e.clientY,o,n,s,e)},ko=(e,t,o,n,s)=>{const r=((e,t)=>o=>{e(o)&&t(So(o))})(o,n);return e.dom.addEventListener(t,r,s),{unbind:S(Co,e,t,r,s)}},Co=(e,t,o,n)=>{e.dom.removeEventListener(t,o,n)},Oo=(e,t)=>{Ye(e).each((o=>{o.dom.insertBefore(t.dom,e.dom)}))},_o=(e,t)=>{const o=(e=>B.from(e.dom.nextSibling).map(Fe))(e);o.fold((()=>{Ye(e).each((e=>{Eo(e,t)}))}),(e=>{Oo(e,t)}))},To=(e,t)=>{const o=(e=>et(e,0))(e);o.fold((()=>{Eo(e,t)}),(o=>{e.dom.insertBefore(t.dom,o.dom)}))},Eo=(e,t)=>{e.dom.appendChild(t.dom)},Bo=(e,t)=>{N(t,(t=>{Eo(e,t)}))},Mo=e=>{e.dom.textContent="",N(Qe(e),(e=>{Ao(e)}))},Ao=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},Do=e=>{const t=void 0!==e?e.dom:document,o=t.body.scrollLeft||t.documentElement.scrollLeft,n=t.body.scrollTop||t.documentElement.scrollTop;return zt(o,n)},Fo=(e,t,o)=>{const n=(void 0!==o?o.dom:document).defaultView;n&&n.scrollTo(e,t)},Io=(e,t,o,n)=>({x:e,y:t,width:o,height:n,right:e+o,bottom:t+n}),Vo=e=>{const t=void 0===e?window:e,o=t.document,n=Do(Fe(o));return(e=>{const t=void 0===e?window:e;return wo().browser.isFirefox()?B.none():B.from(t.visualViewport)})(t).fold((()=>{const e=t.document.documentElement,o=e.clientWidth,s=e.clientHeight;return Io(n.left,n.top,o,s)}),(e=>Io(Math.max(e.pageLeft,n.left),Math.max(e.pageTop,n.top),e.width,e.height)))},Ro=()=>Fe(document),zo=(e,t)=>e.view(t).fold(y([]),(t=>{const o=e.owner(t),n=zo(e,o);return[t].concat(n)}));var Ho=Object.freeze({__proto__:null,view:e=>{var t;return(e.dom===document?B.none():B.from(null===(t=e.dom.defaultView)||void 0===t?void 0:t.frameElement)).map(Fe)},owner:e=>$e(e)});const Po=e=>{const t=Ro(),o=Do(t),n=((e,t)=>{const o=t.owner(e),n=zo(t,o);return B.some(n)})(e,Ho);return n.fold(S(Pt,e),(t=>{const n=Nt(e),s=U(t,((e,t)=>{const o=Nt(t);return{left:e.left+o.left,top:e.top+o.top}}),{left:0,top:0});return zt(s.left+n.left+o.left,s.top+n.top+o.top)}))},No=(e,t,o,n)=>({x:e,y:t,width:o,height:n,right:e+o,bottom:t+n}),Lo=e=>{const t=Pt(e),o=Ut(e),n=Vt(e);return No(t.left,t.top,o,n)},Wo=e=>{const t=Po(e),o=Ut(e),n=Vt(e);return No(t.left,t.top,o,n)},Uo=()=>Vo(window),jo=e=>{const t=t=>t(e),o=y(e),n=()=>s,s={tag:!0,inner:e,fold:(t,o)=>o(e),isValue:T,isError:_,map:t=>$o.value(t(e)),mapError:n,bind:t,exists:t,forall:t,getOr:o,or:n,getOrThunk:o,orThunk:n,getOrDie:o,each:t=>{t(e)},toOptional:()=>B.some(e)};return s},Go=e=>{const t=()=>o,o={tag:!1,inner:e,fold:(t,o)=>t(e),isValue:_,isError:T,map:t,mapError:t=>$o.error(t(e)),bind:t,exists:_,forall:T,getOr:x,or:x,getOrThunk:O,orThunk:O,getOrDie:C(String(e)),each:b,toOptional:B.none};return o},$o={value:jo,error:Go,fromOption:(e,t)=>e.fold((()=>Go(t)),jo)};var qo;!function(e){e[e.Error=0]="Error",e[e.Value=1]="Value"}(qo||(qo={}));const Xo=(e,t,o)=>e.stype===qo.Error?t(e.serror):o(e.svalue),Ko=e=>({stype:qo.Value,svalue:e}),Yo=e=>({stype:qo.Error,serror:e}),Jo=Ko,Zo=Yo,Qo=Xo,en=(e,t,o,n)=>({tag:"field",key:e,newKey:t,presence:o,prop:n}),tn=(e,t,o)=>{switch(e.tag){case"field":return t(e.key,e.newKey,e.presence,e.prop);case"custom":return o(e.newKey,e.instantiator)}},on=e=>(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const o={};for(let n=0;n<t.length;n++){const s=t[n];for(const t in s)be(s,t)&&(o[t]=e(o[t],s[t]))}return o},nn=on(((e,t)=>i(e)&&i(t)?nn(e,t):t)),sn=on(((e,t)=>t)),rn=e=>({tag:"defaultedThunk",process:e}),an=e=>rn(y(e)),ln=e=>({tag:"mergeWithThunk",process:e}),cn=e=>{const t=(e=>{const t=[],o=[];return N(e,(e=>{Xo(e,(e=>o.push(e)),(e=>t.push(e)))})),{values:t,errors:o}})(e);return t.errors.length>0?(o=t.errors,v(Zo,q)(o)):Jo(t.values);var o},dn=e=>a(e)&&ae(e).length>100?" removed due to size":JSON.stringify(e,null,2),un=(e,t)=>Zo([{path:e,getErrorInfo:t}]),mn=e=>({extract:(t,o)=>{return n=e(o),s=e=>((e,t)=>un(e,y(t)))(t,e),n.stype===qo.Error?s(n.serror):n;var n,s},toString:y("val")}),gn=mn(Jo),pn=(e,t,o,n)=>n(fe(e,t).getOrThunk((()=>o(e)))),hn=(e,t,o,n,s)=>{const r=e=>s.extract(t.concat([n]),e),a=e=>e.fold((()=>Jo(B.none())),(e=>{const o=s.extract(t.concat([n]),e);return r=o,a=B.some,r.stype===qo.Value?{stype:qo.Value,svalue:a(r.svalue)}:r;var r,a}));switch(e.tag){case"required":return((e,t,o,n)=>fe(t,o).fold((()=>((e,t,o)=>un(e,(()=>'Could not find valid *required* value for "'+t+'" in '+dn(o))))(e,o,t)),n))(t,o,n,r);case"defaultedThunk":return pn(o,n,e.process,r);case"option":return((e,t,o)=>o(fe(e,t)))(o,n,a);case"defaultedOptionThunk":return((e,t,o,n)=>n(fe(e,t).map((t=>!0===t?o(e):t))))(o,n,e.process,a);case"mergeWithThunk":return pn(o,n,y({}),(t=>{const n=nn(e.process(o),t);return r(n)}))}},fn=e=>({extract:(t,o)=>e().extract(t,o),toString:()=>e().toString()}),bn=e=>ae(((e,t)=>{const o={};return me(e,t,ue(o),b),o})(e,g)),vn=e=>{const t=yn(e),o=U(e,((e,t)=>tn(t,(t=>nn(e,{[t]:!0})),y(e))),{});return{extract:(e,n)=>{const s=d(n)?[]:bn(n),r=W(s,(e=>!ve(o,e)));return 0===r.length?t.extract(e,n):((e,t)=>un(e,(()=>"There are unsupported fields: ["+t.join(", ")+"] specified")))(e,r)},toString:t.toString}},yn=e=>({extract:(t,o)=>((e,t,o)=>{const n={},s=[];for(const r of o)tn(r,((o,r,a,i)=>{const l=hn(a,e,t,o,i);Qo(l,(e=>{s.push(...e)}),(e=>{n[r]=e}))}),((e,o)=>{n[e]=o(t)}));return s.length>0?Zo(s):Jo(n)})(t,o,e),toString:()=>{const t=P(e,(e=>tn(e,((e,t,o,n)=>e+" -> "+n.toString()),((e,t)=>"state("+e+")"))));return"obj{\n"+t.join("\n")+"}"}}),xn=e=>({extract:(t,o)=>{const n=P(o,((o,n)=>e.extract(t.concat(["["+n+"]"]),o)));return cn(n)},toString:()=>"array("+e.toString()+")"}),wn=e=>({extract:(t,o)=>{const n=[];for(const s of e){const e=s.extract(t,o);if(e.stype===qo.Value)return e;n.push(e)}return cn(n)},toString:()=>"oneOf("+P(e,(e=>e.toString())).join(", ")+")"}),Sn=(e,t)=>({extract:(o,n)=>{const s=ae(n),r=((t,o)=>xn(mn(e)).extract(t,o))(o,s);return i=e=>{const s=P(e,(e=>en(e,e,{tag:"required",process:{}},t)));return yn(s).extract(o,n)},(a=r).stype===qo.Value?i(a.svalue):a;var a,i},toString:()=>"setOf("+t.toString()+")"}),kn=v(xn,yn),Cn=y(gn),On=(e,t)=>mn((o=>{const n=typeof o;return e(o)?Jo(o):Zo(`Expected type: ${t} but got: ${n}`)})),_n=On(h,"number"),Tn=On(r,"string"),En=On(d,"boolean"),Bn=On(p,"function"),Mn=e=>{if(Object(e)!==e)return!0;switch({}.toString.call(e).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(e).every((t=>Mn(e[t])));default:return!1}},An=mn((e=>Mn(e)?Jo(e):Zo("Expected value to be acceptable for sending via postMessage"))),Dn=(e,t)=>({extract:(o,n)=>fe(n,e).fold((()=>((e,t)=>un(e,(()=>'Choice schema did not contain choice key: "'+t+'"')))(o,e)),(e=>((e,t,o,n)=>fe(o,n).fold((()=>((e,t,o)=>un(e,(()=>'The chosen schema: "'+o+'" did not exist in branches: '+dn(t))))(e,o,n)),(o=>o.extract(e.concat(["branch: "+n]),t))))(o,n,t,e))),toString:()=>"chooseOn("+e+"). Possible values: "+ae(t)}),Fn=e=>mn((t=>e(t).fold(Zo,Jo))),In=(e,t)=>Sn((t=>e(t).fold(Yo,Ko)),t),Vn=(e,t,o)=>{return n=((e,t,o)=>((e,t)=>e.stype===qo.Error?{stype:qo.Error,serror:t(e.serror)}:e)(t.extract([e],o),(e=>({input:o,errors:e}))))(e,t,o),Xo(n,$o.error,$o.value);var n},Rn=e=>e.fold((e=>{throw new Error(Hn(e))}),x),zn=(e,t,o)=>Rn(Vn(e,t,o)),Hn=e=>"Errors: \n"+(e=>{const t=e.length>10?e.slice(0,10).concat([{path:[],getErrorInfo:y("... (only showing first ten failures)")}]):e;return P(t,(e=>"Failed path: ("+e.path.join(" > ")+")\n"+e.getErrorInfo()))})(e.errors).join("\n")+"\n\nInput object: "+dn(e.input),Pn=(e,t)=>Dn(e,ce(t,yn)),Nn=en,Ln=(e,t)=>({tag:"custom",newKey:e,instantiator:t}),Wn=e=>Fn((t=>V(e,t)?$o.value(t):$o.error(`Unsupported value: "${t}", choose one of "${e.join(", ")}".`))),Un=e=>Nn(e,e,{tag:"required",process:{}},Cn()),jn=(e,t)=>Nn(e,e,{tag:"required",process:{}},t),Gn=e=>jn(e,_n),$n=e=>jn(e,Tn),qn=(e,t)=>Nn(e,e,{tag:"required",process:{}},Wn(t)),Xn=e=>jn(e,Bn),Kn=(e,t)=>Nn(e,e,{tag:"required",process:{}},yn(t)),Yn=(e,t)=>Nn(e,e,{tag:"required",process:{}},kn(t)),Jn=(e,t)=>Nn(e,e,{tag:"required",process:{}},xn(t)),Zn=e=>Nn(e,e,{tag:"option",process:{}},Cn()),Qn=(e,t)=>Nn(e,e,{tag:"option",process:{}},t),es=e=>Qn(e,_n),ts=e=>Qn(e,Tn),os=(e,t)=>Qn(e,Wn(t)),ns=e=>Qn(e,Bn),ss=(e,t)=>Qn(e,xn(t)),rs=(e,t)=>Qn(e,yn(t)),as=(e,t)=>Nn(e,e,an(t),Cn()),is=(e,t,o)=>Nn(e,e,an(t),o),ls=(e,t)=>is(e,t,_n),cs=(e,t)=>is(e,t,Tn),ds=(e,t,o)=>is(e,t,Wn(o)),us=(e,t)=>is(e,t,En),ms=(e,t)=>is(e,t,Bn),gs=(e,t,o)=>is(e,t,xn(o)),ps=(e,t,o)=>is(e,t,yn(o)),hs=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},fs=e=>{if(!l(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],o={};return N(e,((n,s)=>{const r=ae(n);if(1!==r.length)throw new Error("one and only one name per case");const a=r[0],i=n[a];if(void 0!==o[a])throw new Error("duplicate key detected:"+a);if("cata"===a)throw new Error("cannot have a case named cata (sorry)");if(!l(i))throw new Error("case arguments must be an array");t.push(a),o[a]=(...o)=>{const n=o.length;if(n!==i.length)throw new Error("Wrong number of arguments to case "+a+". Expected "+i.length+" ("+i+"), got "+n);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[s].apply(null,o)},match:e=>{const n=ae(e);if(t.length!==n.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+n.join(","));if(!K(t,(e=>V(n,e))))throw new Error("Not all branches were specified when using match. Specified: "+n.join(", ")+"\nRequired: "+t.join(", "));return e[a].apply(null,o)},log:e=>{console.log(e,{constructors:t,constructor:a,params:o})}}}})),o};fs([{bothErrors:["error1","error2"]},{firstError:["error1","value2"]},{secondError:["value1","error2"]},{bothValues:["value1","value2"]}]);const bs=(e,t)=>((e,t)=>({[e]:t}))(e,t),vs=e=>(e=>{const t={};return N(e,(e=>{t[e.key]=e.value})),t})(e),ys=e=>p(e)?e:_,xs=(e,t,o)=>{let n=e.dom;const s=ys(o);for(;n.parentNode;){n=n.parentNode;const e=Fe(n),o=t(e);if(o.isSome())return o;if(s(e))break}return B.none()},ws=(e,t,o)=>{const n=t(e),s=ys(o);return n.orThunk((()=>s(e)?B.none():xs(e,t,s)))},Ss=(e,t)=>je(e.element,t.event.target),ks={can:T,abort:_,run:b},Cs=e=>{if(!ve(e,"can")&&!ve(e,"abort")&&!ve(e,"run"))throw new Error("EventHandler defined by: "+JSON.stringify(e,null,2)+" does not have can, abort, or run!");return{...ks,...e}},Os=y,_s=Os("touchstart"),Ts=Os("touchmove"),Es=Os("touchend"),Bs=Os("touchcancel"),Ms=Os("mousedown"),As=Os("mousemove"),Ds=Os("mouseout"),Fs=Os("mouseup"),Is=Os("mouseover"),Vs=Os("focusin"),Rs=Os("focusout"),zs=Os("keydown"),Hs=Os("keyup"),Ps=Os("input"),Ns=Os("change"),Ls=Os("click"),Ws=Os("transitioncancel"),Us=Os("transitionend"),js=Os("transitionstart"),Gs=Os("selectstart"),$s=e=>y("alloy."+e),qs={tap:$s("tap")},Xs=$s("focus"),Ks=$s("blur.post"),Ys=$s("paste.post"),Js=$s("receive"),Zs=$s("execute"),Qs=$s("focus.item"),er=qs.tap,tr=$s("longpress"),or=$s("sandbox.close"),nr=$s("typeahead.cancel"),sr=$s("system.init"),rr=$s("system.touchmove"),ar=$s("system.touchend"),ir=$s("system.scroll"),lr=$s("system.resize"),cr=$s("system.attached"),dr=$s("system.detached"),ur=$s("system.dismissRequested"),mr=$s("system.repositionRequested"),gr=$s("focusmanager.shifted"),pr=$s("slotcontainer.visibility"),hr=$s("change.tab"),fr=$s("dismiss.tab"),br=$s("highlight"),vr=$s("dehighlight"),yr=(e,t)=>{kr(e,e.element,t,{})},xr=(e,t,o)=>{kr(e,e.element,t,o)},wr=e=>{yr(e,Zs())},Sr=(e,t,o)=>{kr(e,t,o,{})},kr=(e,t,o,n)=>{const s={target:t,...n};e.getSystem().triggerEvent(o,t,s)},Cr=(e,t,o,n)=>{e.getSystem().triggerEvent(o,t,n.event)},Or=e=>vs(e),_r=(e,t)=>({key:e,value:Cs({abort:t})}),Tr=e=>({key:e,value:Cs({run:(e,t)=>{t.event.prevent()}})}),Er=(e,t)=>({key:e,value:Cs({run:t})}),Br=(e,t,o)=>({key:e,value:Cs({run:(e,n)=>{t.apply(void 0,[e,n].concat(o))}})}),Mr=e=>t=>({key:e,value:Cs({run:(e,o)=>{Ss(e,o)&&t(e,o)}})}),Ar=(e,t,o)=>((e,t)=>Er(e,((o,n)=>{o.getSystem().getByUid(t).each((t=>{Cr(t,t.element,e,n)}))})))(e,t.partUids[o]),Dr=(e,t)=>Er(e,((e,o)=>{const n=o.event,s=e.getSystem().getByDom(n.target).getOrThunk((()=>ws(n.target,(t=>e.getSystem().getByDom(t).toOptional()),_).getOr(e)));t(e,s,o)})),Fr=e=>Er(e,((e,t)=>{t.cut()})),Ir=e=>Er(e,((e,t)=>{t.stop()})),Vr=(e,t)=>Mr(e)(t),Rr=Mr(cr()),zr=Mr(dr()),Hr=Mr(sr()),Pr=(Gr=Zs(),e=>Er(Gr,e)),Nr=e=>e.dom.innerHTML,Lr=(e,t)=>{const o=$e(e).dom,n=Fe(o.createDocumentFragment()),s=((e,t)=>{const o=(t||document).createElement("div");return o.innerHTML=e,Qe(Fe(o))})(t,o);Bo(n,s),Mo(e),Eo(e,n)},Wr=e=>nt(e)?"#shadow-root":(e=>{const t=Ae("div"),o=Fe(e.dom.cloneNode(!0));return Eo(t,o),Nr(t)})((e=>((e,t)=>Fe(e.dom.cloneNode(!1)))(e))(e)),Ur=e=>Wr(e),jr=Or([((e,t)=>({key:e,value:Cs({can:(e,t)=>{const o=t.event,n=o.originator,s=o.target;return!((e,t,o)=>je(t,e.element)&&!je(t,o))(e,n,s)||(console.warn(Xs()+" did not get interpreted by the desired target. \nOriginator: "+Ur(n)+"\nTarget: "+Ur(s)+"\nCheck the "+Xs()+" event handlers"),!1)}})}))(Xs())]);var Gr,$r=Object.freeze({__proto__:null,events:jr});let qr=0;const Xr=e=>{const t=(new Date).getTime(),o=Math.floor(1e9*Math.random());return qr++,e+"_"+o+qr+String(t)},Kr=y("alloy-id-"),Yr=y("data-alloy-id"),Jr=Kr(),Zr=Yr(),Qr=(e,t)=>{Object.defineProperty(e.dom,Zr,{value:t,writable:!0})},ea=e=>{const t=ze(e)?e.dom[Zr]:null;return B.from(t)},ta=e=>Xr(e),oa=x,na=e=>{const t=t=>`The component must be in a context to execute: ${t}`+(e?"\n"+Ur(e().element)+" is not in context.":""),o=e=>()=>{throw new Error(t(e))},n=e=>()=>{console.warn(t(e))};return{debugInfo:y("fake"),triggerEvent:n("triggerEvent"),triggerFocus:n("triggerFocus"),triggerEscape:n("triggerEscape"),broadcast:n("broadcast"),broadcastOn:n("broadcastOn"),broadcastEvent:n("broadcastEvent"),build:o("build"),buildOrPatch:o("buildOrPatch"),addToWorld:o("addToWorld"),removeFromWorld:o("removeFromWorld"),addToGui:o("addToGui"),removeFromGui:o("removeFromGui"),getByUid:o("getByUid"),getByDom:o("getByDom"),isConnected:_}},sa=na(),ra=e=>P(e,(e=>Oe(e,"/*")?e.substring(0,e.length-"/*".length):e)),aa=(e,t)=>{const o=e.toString(),n=o.indexOf(")")+1,s=o.indexOf("("),r=o.substring(s+1,n-1).split(/,\s*/);return e.toFunctionAnnotation=()=>({name:t,parameters:ra(r)}),e},ia=Xr("alloy-premade"),la=e=>(Object.defineProperty(e.element.dom,ia,{value:e.uid,writable:!0}),bs(ia,e)),ca=e=>fe(e,ia),da=e=>((e,t)=>{const o=t.toString(),n=o.indexOf(")")+1,s=o.indexOf("("),r=o.substring(s+1,n-1).split(/,\s*/);return e.toFunctionAnnotation=()=>({name:"OVERRIDE",parameters:ra(r.slice(1))}),e})(((t,...o)=>e(t.getApis(),t,...o)),e),ua={init:()=>ma({readState:y("No State required")})},ma=e=>e,ga=(e,t)=>{const o={};return le(e,((e,n)=>{le(e,((e,s)=>{const r=fe(o,s).getOr([]);o[s]=r.concat([t(n,e)])}))})),o},pa=e=>({classes:u(e.classes)?[]:e.classes,attributes:u(e.attributes)?{}:e.attributes,styles:u(e.styles)?{}:e.styles}),ha=e=>e.cHandler,fa=(e,t)=>({name:e,handler:t}),ba=(e,t)=>{const o={};return N(e,(e=>{o[e.name()]=e.handlers(t)})),o},va=(e,t,o)=>{const n=t[o];return n?((e,t,o,n)=>{try{const t=ee(o,((t,o)=>{const s=t.name,r=o.name,a=n.indexOf(s),i=n.indexOf(r);if(-1===a)throw new Error("The ordering for "+e+" does not have an entry for "+s+".\nOrder specified: "+JSON.stringify(n,null,2));if(-1===i)throw new Error("The ordering for "+e+" does not have an entry for "+r+".\nOrder specified: "+JSON.stringify(n,null,2));return a<i?-1:i<a?1:0}));return $o.value(t)}catch(e){return $o.error([e])}})("Event: "+o,0,e,n).map((e=>(e=>{const t=((e,t)=>(...t)=>j(e,((e,o)=>e&&(e=>e.can)(o).apply(void 0,t)),!0))(e),o=((e,t)=>(...t)=>j(e,((e,o)=>e||(e=>e.abort)(o).apply(void 0,t)),!1))(e);return{can:t,abort:o,run:(...t)=>{N(e,(e=>{e.run.apply(void 0,t)}))}}})(P(e,(e=>e.handler))))):((e,t)=>$o.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(P(t,(e=>e.name)),null,2)]))(o,e)},ya=(e,t)=>((e,t)=>{const o=(e=>{const t=[],o=[];return N(e,(e=>{e.fold((e=>{t.push(e)}),(e=>{o.push(e)}))})),{errors:t,values:o}})(e);return o.errors.length>0?(n=o.errors,$o.error(q(n))):((e,t)=>0===e.length?$o.value(t):$o.value(nn(t,sn.apply(void 0,e))))(o.values,t);var n})(ge(e,((e,o)=>(1===e.length?$o.value(e[0].handler):va(e,t,o)).map((n=>{const s=(e=>{const t=(e=>p(e)?{can:T,abort:_,run:e}:e)(e);return(e,o,...n)=>{const s=[e,o].concat(n);t.abort.apply(void 0,s)?o.stop():t.can.apply(void 0,s)&&t.run.apply(void 0,s)}})(n),r=e.length>1?W(t[o],(t=>R(e,(e=>e.name===t)))).join(" > "):e[0].name;return bs(o,((e,t)=>({handler:e,purpose:t}))(s,r))})))),{}),xa="alloy.base.behaviour",wa=yn([Nn("dom","dom",{tag:"required",process:{}},yn([Un("tag"),as("styles",{}),as("classes",[]),as("attributes",{}),Zn("value"),Zn("innerHtml")])),Un("components"),Un("uid"),as("events",{}),as("apis",{}),Nn("eventOrder","eventOrder",($a={[Zs()]:["disabling",xa,"toggling","typeaheadevents"],[Xs()]:[xa,"focusing","keying"],[sr()]:[xa,"disabling","toggling","representing"],[Ps()]:[xa,"representing","streaming","invalidating"],[dr()]:[xa,"representing","item-events","tooltipping"],[Ms()]:["focusing",xa,"item-type-events"],[_s()]:["focusing",xa,"item-type-events"],[Is()]:["item-type-events","tooltipping"],[Js()]:["receiving","reflecting","tooltipping"]},ln(y($a))),Cn()),Zn("domModification")]),Sa=e=>e.events,ka=(e,t)=>{const o=ft(e,t);return void 0===o||""===o?[]:o.split(" ")},Ca=e=>void 0!==e.dom.classList,Oa=e=>ka(e,"class"),_a=(e,t)=>{Ca(e)?e.dom.classList.add(t):((e,t)=>{((e,t,o)=>{const n=ka(e,t).concat([o]);pt(e,t,n.join(" "))})(e,"class",t)})(e,t)},Ta=(e,t)=>{Ca(e)?e.dom.classList.remove(t):((e,t)=>{((e,t,o)=>{const n=W(ka(e,t),(e=>e!==o));n.length>0?pt(e,t,n.join(" ")):yt(e,t)})(e,"class",t)})(e,t),(e=>{0===(Ca(e)?e.dom.classList:Oa(e)).length&&yt(e,"class")})(e)},Ea=(e,t)=>Ca(e)&&e.dom.classList.contains(t),Ba=(e,t)=>{N(t,(t=>{_a(e,t)}))},Ma=(e,t)=>{N(t,(t=>{Ta(e,t)}))},Aa=e=>e.dom.value,Da=(e,t)=>{if(void 0===t)throw new Error("Value.set was undefined");e.dom.value=t},Fa=(e,t,o)=>{o.fold((()=>Eo(e,t)),(e=>{je(e,t)||(Oo(e,t),Ao(e))}))},Ia=(e,t,o)=>{const n=P(t,o),s=Qe(e);return N(s.slice(n.length),Ao),n},Va=(e,t,o,n)=>{const s=et(e,t),r=n(o,s),a=((e,t,o)=>et(e,t).map((e=>{if(o.exists((t=>!je(t,e)))){const t=o.map(Ve).getOr("span"),n=Ae(t);return Oo(e,n),n}return e})))(e,t,s);return Fa(e,r.element,a),r},Ra=(e,t)=>{const o=ae(e),n=ae(t);return{toRemove:J(n,o),toSet:((e,o)=>{const n={},s={};return me(e,((e,o)=>!be(t,o)||e!==t[o]),ue(n),ue(s)),{t:n,f:s}})(e).t}},za=(e,t)=>{const{class:o,style:n,...s}=(e=>j(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}))(t),{toSet:r,toRemove:a}=Ra(e.attributes,s),i=Et(t),{toSet:l,toRemove:c}=Ra(e.styles,i),d=(e=>Ca(e)?(e=>{const t=e.dom.classList,o=new Array(t.length);for(let e=0;e<t.length;e++){const n=t.item(e);null!==n&&(o[e]=n)}return o})(e):Oa(e))(t),u=J(d,e.classes),m=J(e.classes,d);return N(a,(e=>yt(t,e))),ht(t,r),Ba(t,m),Ma(t,u),N(c,(e=>Mt(t,e))),kt(t,l),e.innerHtml.fold((()=>{const o=e.domChildren;((e,t)=>{Ia(e,t,((t,o)=>{const n=et(e,o);return Fa(e,t,n),t}))})(t,o)}),(e=>{Lr(t,e)})),(()=>{const o=t;e.value.filter((e=>e!==Aa(o))).each((e=>Da(o,e)))})(),t},Ha=e=>{const t=(e=>{const t=fe(e,"behaviours").getOr({});return X(ae(t),(e=>{const o=t[e];return g(o)?[o.me]:[]}))})(e);return((e,t)=>((e,t)=>{const o=P(t,(e=>rs(e.name(),[Un("config"),as("state",ua)]))),n=Vn("component.behaviours",yn(o),e.behaviours).fold((t=>{throw new Error(Hn(t)+"\nComplete spec:\n"+JSON.stringify(e,null,2))}),x);return{list:t,data:ce(n,(e=>{const t=e.map((e=>({config:e.config,state:e.state.init(e.config)})));return y(t)}))}})(e,t))(e,t)},Pa=(e,t)=>{const o=()=>m,n=hs(sa),s=Rn((e=>Vn("custom.definition",wa,e))(e)),r=Ha(e),a=(e=>e.list)(r),i=(e=>e.data)(r),l=((e,t,o)=>{const n={...(s=e).dom,uid:s.uid,domChildren:P(s.components,(e=>e.element))};var s;const r=(e=>e.domModification.fold((()=>pa({})),pa))(e),a={"alloy.base.modification":r},i=t.length>0?((e,t,o,n)=>{const s={...t};N(o,(t=>{s[t.name()]=t.exhibit(e,n)}));const r=ga(s,((e,t)=>({name:e,modification:t}))),a=e=>U(e,((e,t)=>({...t.modification,...e})),{}),i=U(r.classes,((e,t)=>t.modification.concat(e)),[]),l=a(r.attributes),c=a(r.styles);return pa({classes:i,attributes:l,styles:c})})(o,a,t,n):r;return l=n,c=i,{...l,attributes:{...l.attributes,...c.attributes},styles:{...l.styles,...c.styles},classes:l.classes.concat(c.classes)};var l,c})(s,a,i),c=((e,t)=>{const o=t.filter((t=>Ve(t)===e.tag&&!(e=>e.innerHtml.isSome()&&e.domChildren.length>0)(e)&&!(e=>be(e.dom,ia))(t))).bind((t=>((e,t)=>{try{const o=za(e,t);return B.some(o)}catch(e){return B.none()}})(e,t))).getOrThunk((()=>(e=>{const t=Ae(e.tag);ht(t,e.attributes),Ba(t,e.classes),kt(t,e.styles),e.innerHtml.each((e=>Lr(t,e)));const o=e.domChildren;return Bo(t,o),e.value.each((e=>{Da(t,e)})),t})(e)));return Qr(o,e.uid),o})(l,t),d=((e,t,o)=>{const n={"alloy.base.behaviour":Sa(e)};return((e,t,o,n)=>{const s=((e,t,o)=>{const n={...o,...ba(t,e)};return ga(n,fa)})(e,o,n);return ya(s,t)})(o,e.eventOrder,t,n).getOrDie()})(s,a,i),u=hs(s.components),m={uid:e.uid,getSystem:n.get,config:t=>{const o=i;return(p(o[t.name()])?o[t.name()]:()=>{throw new Error("Could not find "+t.name()+" in "+JSON.stringify(e,null,2))})()},hasConfigured:e=>p(i[e.name()]),spec:e,readState:e=>i[e]().map((e=>e.state.readState())).getOr("not enabled"),getApis:()=>s.apis,connect:e=>{n.set(e)},disconnect:()=>{n.set(na(o))},element:c,syncComponents:()=>{const e=Qe(c),t=X(e,(e=>n.get().getByDom(e).fold((()=>[]),Q)));u.set(t)},components:u.get,events:d};return m},Na=e=>{const t=De(e);return La({element:t})},La=e=>{const t=zn("external.component",vn([Un("element"),Zn("uid")]),e),o=hs(na()),n=t.uid.getOrThunk((()=>ta("external")));Qr(t.element,n);const s={uid:n,getSystem:o.get,config:B.none,hasConfigured:_,connect:e=>{o.set(e)},disconnect:()=>{o.set(na((()=>s)))},getApis:()=>({}),element:t.element,spec:e,readState:y("No state"),syncComponents:b,components:y([]),events:{}};return la(s)},Wa=ta,Ua=(e,t)=>ca(e).getOrThunk((()=>((e,t)=>{const{events:o,...n}=oa(e),s=((e,t)=>{const o=fe(e,"components").getOr([]);return t.fold((()=>P(o,ja)),(e=>P(o,((t,o)=>Ua(t,et(e,o))))))})(n,t),r={...n,events:{...$r,...o},components:s};return $o.value(Pa(r,t))})((e=>be(e,"uid"))(e)?e:{uid:Wa(""),...e},t).getOrDie())),ja=e=>Ua(e,B.none()),Ga=la;var $a,qa=(e,t,o,n,s)=>e(o,n)?B.some(o):p(s)&&s(o)?B.none():t(o,n,s);const Xa=(e,t,o)=>{let n=e.dom;const s=p(o)?o:_;for(;n.parentNode;){n=n.parentNode;const e=Fe(n);if(t(e))return B.some(e);if(s(e))break}return B.none()},Ka=(e,t,o)=>qa(((e,t)=>t(e)),Xa,e,t,o),Ya=(e,t,o)=>Ka(e,t,o).isSome(),Ja=(e,t,o)=>Xa(e,(e=>We(e,t)),o),Za=(e,t)=>((e,o)=>G(e.dom.childNodes,(e=>{return o=Fe(e),We(o,t);var o})).map(Fe))(e),Qa=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return Ue(o)?B.none():B.from(o.querySelector(e)).map(Fe)})(t,e),ei=(e,t,o)=>qa(((e,t)=>We(e,t)),Ja,e,t,o),ti="aria-controls",oi=()=>{const e=Xr(ti);return{id:e,link:t=>{pt(t,ti,e)},unlink:e=>{yt(e,ti)}}},ni=(e,t)=>Ya(t,(t=>je(t,e.element)),_)||((e,t)=>(e=>Ka(e,(e=>{if(!ze(e))return!1;const t=ft(e,"id");return void 0!==t&&t.indexOf(ti)>-1})).bind((e=>{const t=ft(e,"id"),o=at(e);return Qa(o,`[${ti}="${t}"]`)})))(t).exists((t=>ni(e,t))))(e,t);var si;!function(e){e[e.STOP=0]="STOP",e[e.NORMAL=1]="NORMAL",e[e.LOGGING=2]="LOGGING"}(si||(si={}));const ri=hs({}),ai=["alloy/data/Fields","alloy/debugging/Debugging"],ii=(e,t,o)=>((e,t,o)=>{switch(fe(ri.get(),e).orThunk((()=>{const t=ae(ri.get());return re(t,(t=>e.indexOf(t)>-1?B.some(ri.get()[t]):B.none()))})).getOr(si.NORMAL)){case si.NORMAL:return o(li());case si.LOGGING:{const n=((e,t)=>{const o=[],n=(new Date).getTime();return{logEventCut:(e,t,n)=>{o.push({outcome:"cut",target:t,purpose:n})},logEventStopped:(e,t,n)=>{o.push({outcome:"stopped",target:t,purpose:n})},logNoParent:(e,t,n)=>{o.push({outcome:"no-parent",target:t,purpose:n})},logEventNoHandlers:(e,t)=>{o.push({outcome:"no-handlers-left",target:t})},logEventResponse:(e,t,n)=>{o.push({outcome:"response",purpose:n,target:t})},write:()=>{const s=(new Date).getTime();V(["mousemove","mouseover","mouseout",sr()],e)||console.log(e,{event:e,time:s-n,target:t.dom,sequence:P(o,(e=>V(["cut","stopped","response"],e.outcome)?"{"+e.purpose+"} "+e.outcome+" at ("+Ur(e.target)+")":e.outcome))})}}})(e,t),s=o(n);return n.write(),s}case si.STOP:return!0}})(e,t,o),li=y({logEventCut:b,logEventStopped:b,logNoParent:b,logEventNoHandlers:b,logEventResponse:b,write:b}),ci=y([Un("menu"),Un("selectedMenu")]),di=y([Un("item"),Un("selectedItem")]);y(yn(di().concat(ci())));const ui=y(yn(di())),mi=Kn("initSize",[Un("numColumns"),Un("numRows")]),gi=()=>Kn("markers",[Un("backgroundMenu")].concat(ci()).concat(di())),pi=e=>Kn("markers",P(e,Un)),hi=(e,t,o)=>((()=>{const e=new Error;if(void 0!==e.stack){const t=e.stack.split("\n");G(t,(e=>e.indexOf("alloy")>0&&!R(ai,(t=>e.indexOf(t)>-1)))).getOr("unknown")}})(),Nn(t,t,o,Fn((e=>$o.value(((...t)=>e.apply(void 0,t))))))),fi=e=>hi(0,e,an(b)),bi=e=>hi(0,e,an(B.none)),vi=e=>hi(0,e,{tag:"required",process:{}}),yi=e=>hi(0,e,{tag:"required",process:{}}),xi=(e,t)=>Ln(e,y(t)),wi=e=>Ln(e,x),Si=y(mi),ki=(e,t,o,n,s,r,a,i=!1)=>({x:e,y:t,bubble:o,direction:n,placement:s,restriction:r,label:`${a}-${s}`,alwaysFit:i}),Ci=fs([{southeast:[]},{southwest:[]},{northeast:[]},{northwest:[]},{south:[]},{north:[]},{east:[]},{west:[]}]),Oi=Ci.southeast,_i=Ci.southwest,Ti=Ci.northeast,Ei=Ci.northwest,Bi=Ci.south,Mi=Ci.north,Ai=Ci.east,Di=Ci.west,Fi=(e,t,o,n)=>{const s=e+t;return s>n?o:s<o?n:s},Ii=(e,t,o)=>Math.min(Math.max(e,t),o),Vi=(e,t)=>Z(["left","right","top","bottom"],(o=>fe(t,o).map((t=>((e,t)=>{switch(t){case 1:return e.x;case 0:return e.x+e.width;case 2:return e.y;case 3:return e.y+e.height}})(e,t))))),Ri="layout",zi=e=>e.x,Hi=(e,t)=>e.x+e.width/2-t.width/2,Pi=(e,t)=>e.x+e.width-t.width,Ni=(e,t)=>e.y-t.height,Li=e=>e.y+e.height,Wi=(e,t)=>e.y+e.height/2-t.height/2,Ui=(e,t,o)=>ki(zi(e),Li(e),o.southeast(),Oi(),"southeast",Vi(e,{left:1,top:3}),Ri),ji=(e,t,o)=>ki(Pi(e,t),Li(e),o.southwest(),_i(),"southwest",Vi(e,{right:0,top:3}),Ri),Gi=(e,t,o)=>ki(zi(e),Ni(e,t),o.northeast(),Ti(),"northeast",Vi(e,{left:1,bottom:2}),Ri),$i=(e,t,o)=>ki(Pi(e,t),Ni(e,t),o.northwest(),Ei(),"northwest",Vi(e,{right:0,bottom:2}),Ri),qi=(e,t,o)=>ki(Hi(e,t),Ni(e,t),o.north(),Mi(),"north",Vi(e,{bottom:2}),Ri),Xi=(e,t,o)=>ki(Hi(e,t),Li(e),o.south(),Bi(),"south",Vi(e,{top:3}),Ri),Ki=(e,t,o)=>ki((e=>e.x+e.width)(e),Wi(e,t),o.east(),Ai(),"east",Vi(e,{left:0}),Ri),Yi=(e,t,o)=>ki(((e,t)=>e.x-t.width)(e,t),Wi(e,t),o.west(),Di(),"west",Vi(e,{right:1}),Ri),Ji=()=>[Ui,ji,Gi,$i,Xi,qi,Ki,Yi],Zi=()=>[ji,Ui,$i,Gi,Xi,qi,Ki,Yi],Qi=()=>[Gi,$i,Ui,ji,qi,Xi],el=()=>[$i,Gi,ji,Ui,qi,Xi],tl=()=>[Ui,ji,Gi,$i,Xi,qi],ol=()=>[ji,Ui,$i,Gi,Xi,qi];var nl=Object.freeze({__proto__:null,events:e=>Or([Er(Js(),((t,o)=>{const n=e.channels,s=ae(n),r=o,a=((e,t)=>t.universal?e:W(e,(e=>V(t.channels,e))))(s,r);N(a,(e=>{const o=n[e],s=o.schema,a=zn("channel["+e+"] data\nReceiver: "+Ur(t.element),s,r.data);o.onReceive(t,a)}))}))])}),sl=[jn("channels",In($o.value,vn([vi("onReceive"),as("schema",Cn())])))];const rl=(e,t,o)=>Hr(((n,s)=>{o(n,e,t)})),al=e=>({key:e,value:void 0}),il=(e,t,o,n,s,r,a)=>{const i=e=>ve(e,o)?e[o]():B.none(),l=ce(s,((e,t)=>((e,t,o)=>((e,t,o)=>{const n=o.toString(),s=n.indexOf(")")+1,r=n.indexOf("("),a=n.substring(r+1,s-1).split(/,\s*/);return e.toFunctionAnnotation=()=>({name:t,parameters:ra(a.slice(0,1).concat(a.slice(3)))}),e})(((n,...s)=>{const r=[n].concat(s);return n.config({name:y(e)}).fold((()=>{throw new Error("We could not find any behaviour configuration for: "+e+". Using API: "+o)}),(e=>{const o=Array.prototype.slice.call(r,1);return t.apply(void 0,[n,e.config,e.state].concat(o))}))}),o,t))(o,e,t))),c={...ce(r,((e,t)=>aa(e,t))),...l,revoke:S(al,o),config:t=>{const n=zn(o+"-config",e,t);return{key:o,value:{config:n,me:c,configAsRaw:jt((()=>zn(o+"-config",e,t))),initialConfig:t,state:a}}},schema:y(t),exhibit:(e,t)=>we(i(e),fe(n,"exhibit"),((e,o)=>o(t,e.config,e.state))).getOrThunk((()=>pa({}))),name:y(o),handlers:e=>i(e).map((e=>fe(n,"events").getOr((()=>({})))(e.config,e.state))).getOr({})};return c},ll=e=>vs(e),cl=vn([Un("fields"),Un("name"),as("active",{}),as("apis",{}),as("state",ua),as("extra",{})]),dl=e=>{const t=zn("Creating behaviour: "+e.name,cl,e);return((e,t,o,n,s,r)=>{const a=vn(e),i=rs(t,[("config",l=e,Qn("config",vn(l)))]);var l;return il(a,i,t,o,n,s,r)})(t.fields,t.name,t.active,t.apis,t.extra,t.state)},ul=vn([Un("branchKey"),Un("branches"),Un("name"),as("active",{}),as("apis",{}),as("state",ua),as("extra",{})]),ml=e=>{const t=zn("Creating behaviour: "+e.name,ul,e);return((e,t,o,n,s,r)=>{const a=e,i=rs(t,[Qn("config",e)]);return il(a,i,t,o,n,s,r)})(Pn(t.branchKey,t.branches),t.name,t.active,t.apis,t.extra,t.state)},gl=y(void 0),pl=dl({fields:sl,name:"receiving",active:nl});var hl=Object.freeze({__proto__:null,exhibit:(e,t)=>pa({classes:[],styles:t.useFixed()?{}:{position:"relative"}})});const fl=e=>e.dom.focus(),bl=e=>{const t=at(e).dom;return e.dom===t.activeElement},vl=(e=Ro())=>B.from(e.dom.activeElement).map(Fe),yl=e=>vl(at(e)).filter((t=>e.dom.contains(t.dom))),xl=(e,t)=>{const o=at(t),n=vl(o).bind((e=>{const o=t=>je(e,t);return o(t)?B.some(t):((e,t)=>{const o=e=>{for(let n=0;n<e.childNodes.length;n++){const s=Fe(e.childNodes[n]);if(t(s))return B.some(s);const r=o(e.childNodes[n]);if(r.isSome())return r}return B.none()};return o(e.dom)})(t,o)})),s=e(t);return n.each((e=>{vl(o).filter((t=>je(t,e))).fold((()=>{fl(e)}),b)})),s},wl=(e,t,o,n,s)=>{const r=e=>e+"px";return{position:e,left:t.map(r),top:o.map(r),right:n.map(r),bottom:s.map(r)}},Sl=(e,t)=>{Ct(e,(e=>({...e,position:B.some(e.position)}))(t))},kl=fs([{none:[]},{relative:["x","y","width","height"]},{fixed:["x","y","width","height"]}]),Cl=(e,t,o,n,s,r)=>{const a=t.rect,i=a.x-o,l=a.y-n,c=s-(i+a.width),d=r-(l+a.height),u=B.some(i),m=B.some(l),g=B.some(c),p=B.some(d),h=B.none();return t.direction.fold((()=>wl(e,u,m,h,h)),(()=>wl(e,h,m,g,h)),(()=>wl(e,u,h,h,p)),(()=>wl(e,h,h,g,p)),(()=>wl(e,u,m,h,h)),(()=>wl(e,u,h,h,p)),(()=>wl(e,u,m,h,h)),(()=>wl(e,h,m,g,h)))},Ol=(e,t)=>e.fold((()=>{const e=t.rect;return wl("absolute",B.some(e.x),B.some(e.y),B.none(),B.none())}),((e,o,n,s)=>Cl("absolute",t,e,o,n,s)),((e,o,n,s)=>Cl("fixed",t,e,o,n,s))),_l=(e,t)=>{const o=S(Po,t),n=e.fold(o,o,(()=>{const e=Do();return Po(t).translate(-e.left,-e.top)})),s=Ut(t),r=Vt(t);return No(n.left,n.top,s,r)},Tl=(e,t)=>t.fold((()=>e.fold(Uo,Uo,No)),(t=>e.fold(t,t,(()=>{const o=t(),n=El(e,o.x,o.y);return No(n.left,n.top,o.width,o.height)})))),El=(e,t,o)=>{const n=zt(t,o);return e.fold(y(n),y(n),(()=>{const e=Do();return n.translate(-e.left,-e.top)}))};kl.none;const Bl=kl.relative,Ml=kl.fixed,Al="data-alloy-placement",Dl=e=>bt(e,Al),Fl=fs([{fit:["reposition"]},{nofit:["reposition","visibleW","visibleH","isVisible"]}]),Il=(e,t,o,n)=>{const s=e.bubble,r=s.offset,a=((e,t,o)=>{const n=(n,s)=>t[n].map((t=>{const r="top"===n||"bottom"===n,a=r?o.top:o.left,i=("left"===n||"top"===n?Math.max:Math.min)(t,s)+a;return r?Ii(i,e.y,e.bottom):Ii(i,e.x,e.right)})).getOr(s),s=n("left",e.x),r=n("top",e.y),a=n("right",e.right),i=n("bottom",e.bottom);return No(s,r,a-s,i-r)})(n,e.restriction,r),i=e.x+r.left,l=e.y+r.top,c=No(i,l,t,o),{originInBounds:d,sizeInBounds:u,visibleW:m,visibleH:g}=((e,t)=>{const{x:o,y:n,right:s,bottom:r}=t,{x:a,y:i,right:l,bottom:c,width:d,height:u}=e;return{originInBounds:a>=o&&a<=s&&i>=n&&i<=r,sizeInBounds:l<=s&&l>=o&&c<=r&&c>=n,visibleW:Math.min(d,a>=o?s-a:l-o),visibleH:Math.min(u,i>=n?r-i:c-n)}})(c,a),p=d&&u,h=p?c:((e,t)=>{const{x:o,y:n,right:s,bottom:r}=t,{x:a,y:i,width:l,height:c}=e,d=Math.max(o,s-l),u=Math.max(n,r-c),m=Ii(a,o,d),g=Ii(i,n,u),p=Math.min(m+l,s)-m,h=Math.min(g+c,r)-g;return No(m,g,p,h)})(c,a),f=h.width>0&&h.height>0,{maxWidth:b,maxHeight:v}=((e,t,o)=>{const n=y(t.bottom-o.y),s=y(o.bottom-t.y),r=((e,t,o,n)=>e.fold(t,t,n,n,t,n,o,o))(e,s,s,n),a=y(t.right-o.x),i=y(o.right-t.x),l=((e,t,o,n)=>e.fold(t,n,t,n,o,o,t,n))(e,i,i,a);return{maxWidth:l,maxHeight:r}})(e.direction,h,n),x={rect:h,maxHeight:v,maxWidth:b,direction:e.direction,placement:e.placement,classes:{on:s.classesOn,off:s.classesOff},layout:e.label,testY:l};return p||e.alwaysFit?Fl.fit(x):Fl.nofit(x,m,g,f)},Vl=e=>{const t=hs(B.none()),o=()=>t.get().each(e);return{clear:()=>{o(),t.set(B.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{o(),t.set(B.some(e))}}},Rl=()=>Vl((e=>e.unbind())),zl=()=>{const e=Vl(b);return{...e,on:t=>e.get().each(t)}},Hl=T,Pl=(e,t,o)=>((e,t,o,n)=>ko(e,t,o,n,!1))(e,t,Hl,o),Nl=(e,t,o)=>((e,t,o,n)=>ko(e,t,o,n,!0))(e,t,Hl,o),Ll=So,Wl=["top","bottom","right","left"],Ul="data-alloy-transition-timer",jl=(e,t,o,n,s,a)=>{const i=((e,t,o)=>o.exists((o=>{const n=e.mode;return"all"===n||o[n]!==t[n]})))(n,s,a);if(i||((e,t)=>((e,t)=>K(t,(t=>Ea(e,t))))(e,t.classes))(e,n)){St(e,"position",o.position);const a=_l(t,e),l=Ol(t,{...s,rect:a}),c=Z(Wl,(e=>l[e]));((e,t)=>{const o=e=>parseFloat(e).toFixed(3);return pe(t,((t,n)=>!((e,t,o=w)=>we(e,t,o).getOr(e.isNone()&&t.isNone()))(e[n].map(o),t.map(o)))).isSome()})(o,c)&&(Ct(e,c),i&&((e,t)=>{Ba(e,t.classes),bt(e,Ul).each((t=>{clearTimeout(parseInt(t,10)),yt(e,Ul)})),((e,t)=>{const o=Rl(),n=Rl();let s;const a=t=>{var o;const n=null!==(o=t.raw.pseudoElement)&&void 0!==o?o:"";return je(t.target,e)&&!Te(n)&&V(Wl,t.raw.propertyName)},i=r=>{if(m(r)||a(r)){o.clear(),n.clear();const a=null==r?void 0:r.raw.type;(m(a)||a===Us())&&(clearTimeout(s),yt(e,Ul),Ma(e,t.classes))}},l=Pl(e,js(),(t=>{a(t)&&(l.unbind(),o.set(Pl(e,Us(),i)),n.set(Pl(e,Ws(),i)))})),c=(e=>{const t=t=>{const o=Ot(e,t).split(/\s*,\s*/);return W(o,Te)},o=e=>{if(r(e)&&/^[\d.]+/.test(e)){const t=parseFloat(e);return Oe(e,"ms")?t:1e3*t}return 0},n=t("transition-delay"),s=t("transition-duration");return j(s,((e,t,s)=>{const r=o(n[s])+o(t);return Math.max(e,r)}),0)})(e);requestAnimationFrame((()=>{s=setTimeout(i,c+17),pt(e,Ul,s)}))})(e,t)})(e,n),At(e))}else Ma(e,n.classes)},Gl=(e,t)=>{((e,t)=>{const o=Ft.max(e,t,["margin-top","border-top-width","padding-top","padding-bottom","border-bottom-width","margin-bottom"]);St(e,"max-height",o+"px")})(e,Math.floor(t))},$l=y(((e,t)=>{Gl(e,t),kt(e,{"overflow-x":"hidden","overflow-y":"auto"})})),ql=y(((e,t)=>{Gl(e,t)})),Xl=(e,t,o)=>void 0===e[t]?o:e[t],Kl=(e,t,o,n)=>{const s=((e,t,o,n)=>{Mt(t,"max-height"),Mt(t,"max-width");const s={width:Ut(r=t),height:Vt(r)};var r;return((e,t,o,n,s,r)=>{const a=n.width,i=n.height,l=(t,l,c,d,u)=>{const m=t(o,n,s,e,r),g=Il(m,a,i,r);return g.fold(y(g),((e,t,o,n)=>(u===n?o>d||t>c:!u&&n)?g:Fl.nofit(l,c,d,u)))};return j(t,((e,t)=>{const o=S(l,t);return e.fold(y(e),o)}),Fl.nofit({rect:o,maxHeight:n.height,maxWidth:n.width,direction:Oi(),placement:"southeast",classes:{on:[],off:[]},layout:"none",testY:o.y},-1,-1,!1)).fold(x,x)})(t,n.preference,e,s,o,n.bounds)})(e,t,o,n);return((e,t,o)=>{const n=Ol(o.origin,t);o.transition.each((s=>{jl(e,o.origin,n,s,t,o.lastPlacement)})),Sl(e,n)})(t,s,n),((e,t)=>{((e,t)=>{pt(e,Al,t)})(e,t.placement)})(t,s),((e,t)=>{const o=t.classes;Ma(e,o.off),Ba(e,o.on)})(t,s),((e,t,o)=>{(0,o.maxHeightFunction)(e,t.maxHeight)})(t,s,n),((e,t,o)=>{(0,o.maxWidthFunction)(e,t.maxWidth)})(t,s,n),{layout:s.layout,placement:s.placement}},Yl=["valignCentre","alignLeft","alignRight","alignCentre","top","bottom","left","right","inset"],Jl=(e,t,o,n=1)=>{const s=e*n,r=t*n,a=e=>fe(o,e).getOr([]),i=(e,t,o)=>{const n=J(Yl,o);return{offset:zt(e,t),classesOn:X(o,a),classesOff:X(n,a)}};return{southeast:()=>i(-e,t,["top","alignLeft"]),southwest:()=>i(e,t,["top","alignRight"]),south:()=>i(-e/2,t,["top","alignCentre"]),northeast:()=>i(-e,-t,["bottom","alignLeft"]),northwest:()=>i(e,-t,["bottom","alignRight"]),north:()=>i(-e/2,-t,["bottom","alignCentre"]),east:()=>i(e,-t/2,["valignCentre","left"]),west:()=>i(-e,-t/2,["valignCentre","right"]),insetNortheast:()=>i(s,r,["top","alignLeft","inset"]),insetNorthwest:()=>i(-s,r,["top","alignRight","inset"]),insetNorth:()=>i(-s/2,r,["top","alignCentre","inset"]),insetSoutheast:()=>i(s,-r,["bottom","alignLeft","inset"]),insetSouthwest:()=>i(-s,-r,["bottom","alignRight","inset"]),insetSouth:()=>i(-s/2,-r,["bottom","alignCentre","inset"]),insetEast:()=>i(-s,-r/2,["valignCentre","right","inset"]),insetWest:()=>i(s,-r/2,["valignCentre","left","inset"])}},Zl=()=>Jl(0,0,{}),Ql=x,ec=(e,t)=>o=>"rtl"===tc(o)?t:e,tc=e=>"rtl"===Ot(e,"direction")?"rtl":"ltr";var oc;!function(e){e.TopToBottom="toptobottom",e.BottomToTop="bottomtotop"}(oc||(oc={}));const nc="data-alloy-vertical-dir",sc=e=>Ya(e,(e=>ze(e)&&ft(e,"data-alloy-vertical-dir")===oc.BottomToTop)),rc=()=>rs("layouts",[Un("onLtr"),Un("onRtl"),Zn("onBottomLtr"),Zn("onBottomRtl")]),ac=(e,t,o,n,s,r,a)=>{const i=a.map(sc).getOr(!1),l=t.layouts.map((t=>t.onLtr(e))),c=t.layouts.map((t=>t.onRtl(e))),d=i?t.layouts.bind((t=>t.onBottomLtr.map((t=>t(e))))).or(l).getOr(s):l.getOr(o),u=i?t.layouts.bind((t=>t.onBottomRtl.map((t=>t(e))))).or(c).getOr(r):c.getOr(n);return ec(d,u)(e)};var ic=[Un("hotspot"),Zn("bubble"),as("overrides",{}),rc(),xi("placement",((e,t,o)=>{const n=t.hotspot,s=_l(o,n.element),r=ac(e.element,t,tl(),ol(),Qi(),el(),B.some(t.hotspot.element));return B.some(Ql({anchorBox:s,bubble:t.bubble.getOr(Zl()),overrides:t.overrides,layouts:r,placer:B.none()}))}))],lc=[Un("x"),Un("y"),as("height",0),as("width",0),as("bubble",Zl()),as("overrides",{}),rc(),xi("placement",((e,t,o)=>{const n=El(o,t.x,t.y),s=No(n.left,n.top,t.width,t.height),r=ac(e.element,t,Ji(),Zi(),Ji(),Zi(),B.none());return B.some(Ql({anchorBox:s,bubble:t.bubble,overrides:t.overrides,layouts:r,placer:B.none()}))}))];const cc=fs([{screen:["point"]},{absolute:["point","scrollLeft","scrollTop"]}]),dc=e=>e.fold(x,((e,t,o)=>e.translate(-t,-o))),uc=e=>e.fold(x,x),mc=e=>j(e,((e,t)=>e.translate(t.left,t.top)),zt(0,0)),gc=e=>{const t=P(e,uc);return mc(t)},pc=cc.screen,hc=cc.absolute,fc=(e,t,o)=>{const n=$e(e.element),s=Do(n),r=((e,t,o)=>{const n=Ke(o.root).dom;return B.from(n.frameElement).map(Fe).filter((t=>{const o=$e(t),n=$e(e.element);return je(o,n)})).map(Pt)})(e,0,o).getOr(s);return hc(r,s.left,s.top)},bc=(e,t,o,n)=>{const s=pc(zt(e,t));return B.some(((e,t,o)=>({point:e,width:t,height:o}))(s,o,n))},vc=(e,t,o,n,s)=>e.map((e=>{const r=[t,e.point],a=(i=()=>gc(r),l=()=>gc(r),c=()=>(e=>{const t=P(e,dc);return mc(t)})(r),n.fold(i,l,c));var i,l,c;const d=(p=a.left,h=a.top,f=e.width,b=e.height,{x:p,y:h,width:f,height:b}),u=o.showAbove?Qi():tl(),m=o.showAbove?el():ol(),g=ac(s,o,u,m,u,m,B.none());var p,h,f,b;return Ql({anchorBox:d,bubble:o.bubble.getOr(Zl()),overrides:o.overrides,layouts:g,placer:B.none()})}));var yc=[Un("node"),Un("root"),Zn("bubble"),rc(),as("overrides",{}),as("showAbove",!1),xi("placement",((e,t,o)=>{const n=fc(e,0,t);return t.node.filter(dt).bind((s=>{const r=s.dom.getBoundingClientRect(),a=bc(r.left,r.top,r.width,r.height),i=t.node.getOr(e.element);return vc(a,n,t,o,i)}))}))];const xc=(e,t,o,n)=>({start:e,soffset:t,finish:o,foffset:n}),wc=fs([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Sc=(wc.before,wc.on,wc.after,e=>e.fold(x,x,x)),kc=fs([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Cc={domRange:kc.domRange,relative:kc.relative,exact:kc.exact,exactFromRange:e=>kc.exact(e.start,e.soffset,e.finish,e.foffset),getWin:e=>{const t=(e=>e.match({domRange:e=>Fe(e.startContainer),relative:(e,t)=>Sc(e),exact:(e,t,o,n)=>e}))(e);return Ke(t)},range:xc},Oc=(e,t,o)=>{const n=e.document.createRange();var s;return s=n,t.fold((e=>{s.setStartBefore(e.dom)}),((e,t)=>{s.setStart(e.dom,t)}),(e=>{s.setStartAfter(e.dom)})),((e,t)=>{t.fold((t=>{e.setEndBefore(t.dom)}),((t,o)=>{e.setEnd(t.dom,o)}),(t=>{e.setEndAfter(t.dom)}))})(n,o),n},_c=(e,t,o,n,s)=>{const r=e.document.createRange();return r.setStart(t.dom,o),r.setEnd(n.dom,s),r},Tc=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom,width:e.width,height:e.height}),Ec=fs([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]),Bc=(e,t,o)=>t(Fe(o.startContainer),o.startOffset,Fe(o.endContainer),o.endOffset),Mc=(e,t)=>((e,t)=>{const o=((e,t)=>t.match({domRange:e=>({ltr:y(e),rtl:B.none}),relative:(t,o)=>({ltr:jt((()=>Oc(e,t,o))),rtl:jt((()=>B.some(Oc(e,o,t))))}),exact:(t,o,n,s)=>({ltr:jt((()=>_c(e,t,o,n,s))),rtl:jt((()=>B.some(_c(e,n,s,t,o))))})}))(e,t);return((e,t)=>{const o=t.ltr();return o.collapsed?t.rtl().filter((e=>!1===e.collapsed)).map((e=>Ec.rtl(Fe(e.endContainer),e.endOffset,Fe(e.startContainer),e.startOffset))).getOrThunk((()=>Bc(0,Ec.ltr,o))):Bc(0,Ec.ltr,o)})(0,o)})(e,t).match({ltr:(t,o,n,s)=>{const r=e.document.createRange();return r.setStart(t.dom,o),r.setEnd(n.dom,s),r},rtl:(t,o,n,s)=>{const r=e.document.createRange();return r.setStart(n.dom,s),r.setEnd(t.dom,o),r}});Ec.ltr,Ec.rtl;const Ac=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return Ue(o)?[]:P(o.querySelectorAll(e),Fe)})(t,e),Dc=e=>{if(e.rangeCount>0){const t=e.getRangeAt(0),o=e.getRangeAt(e.rangeCount-1);return B.some(xc(Fe(t.startContainer),t.startOffset,Fe(o.endContainer),o.endOffset))}return B.none()},Fc=e=>{if(null===e.anchorNode||null===e.focusNode)return Dc(e);{const t=Fe(e.anchorNode),o=Fe(e.focusNode);return((e,t,o,n)=>{const s=((e,t,o,n)=>{const s=$e(e).dom.createRange();return s.setStart(e.dom,t),s.setEnd(o.dom,n),s})(e,t,o,n),r=je(e,o)&&t===n;return s.collapsed&&!r})(t,e.anchorOffset,o,e.focusOffset)?B.some(xc(t,e.anchorOffset,o,e.focusOffset)):Dc(e)}},Ic=(e,t)=>(e=>{const t=e.getClientRects(),o=t.length>0?t[0]:e.getBoundingClientRect();return o.width>0||o.height>0?B.some(o).map(Tc):B.none()})(Mc(e,t)),Vc=((e,t)=>{const o=t=>e(t)?B.from(t.dom.nodeValue):B.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return o(t).getOr("")},getOption:o,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(He),Rc=(e,t)=>({element:e,offset:t}),zc=(e,t)=>He(e)?Rc(e,t):((e,t)=>{const o=Qe(e);if(0===o.length)return Rc(e,t);if(t<o.length)return Rc(o[t],0);{const e=o[o.length-1],t=He(e)?(e=>Vc.get(e))(e).length:Qe(e).length;return Rc(e,t)}})(e,t),Hc=(e,t)=>t.getSelection.getOrThunk((()=>()=>(e=>(e=>B.from(e.getSelection()))(e).filter((e=>e.rangeCount>0)).bind(Fc))(e)))().map((e=>{const t=zc(e.start,e.soffset),o=zc(e.finish,e.foffset);return Cc.range(t.element,t.offset,o.element,o.offset)}));var Pc=[Zn("getSelection"),Un("root"),Zn("bubble"),rc(),as("overrides",{}),as("showAbove",!1),xi("placement",((e,t,o)=>{const n=Ke(t.root).dom,s=fc(e,0,t),r=Hc(n,t).bind((e=>{const t=((e,t)=>(e=>{const t=e.getBoundingClientRect();return t.width>0||t.height>0?B.some(t).map(Tc):B.none()})(Mc(e,t)))(n,Cc.exactFromRange(e)).orThunk((()=>{const t=De("\ufeff");Oo(e.start,t);const o=Ic(n,Cc.exact(t,0,t,1));return Ao(t),o}));return t.bind((e=>bc(e.left,e.top,e.width,e.height)))})),a=Hc(n,t).bind((e=>ze(e.start)?B.some(e.start):Je(e.start))).getOr(e.element);return vc(r,s,t,o,a)}))];const Nc="link-layout",Lc=e=>e.x+e.width,Wc=(e,t)=>e.x-t.width,Uc=(e,t)=>e.y-t.height+e.height,jc=e=>e.y,Gc=(e,t,o)=>ki(Lc(e),jc(e),o.southeast(),Oi(),"southeast",Vi(e,{left:0,top:2}),Nc),$c=(e,t,o)=>ki(Wc(e,t),jc(e),o.southwest(),_i(),"southwest",Vi(e,{right:1,top:2}),Nc),qc=(e,t,o)=>ki(Lc(e),Uc(e,t),o.northeast(),Ti(),"northeast",Vi(e,{left:0,bottom:3}),Nc),Xc=(e,t,o)=>ki(Wc(e,t),Uc(e,t),o.northwest(),Ei(),"northwest",Vi(e,{right:1,bottom:3}),Nc),Kc=()=>[Gc,$c,qc,Xc],Yc=()=>[$c,Gc,Xc,qc];var Jc=[Un("item"),rc(),as("overrides",{}),xi("placement",((e,t,o)=>{const n=_l(o,t.item.element),s=ac(e.element,t,Kc(),Yc(),Kc(),Yc(),B.none());return B.some(Ql({anchorBox:n,bubble:Zl(),overrides:t.overrides,layouts:s,placer:B.none()}))}))],Zc=Pn("type",{selection:Pc,node:yc,hotspot:ic,submenu:Jc,makeshift:lc});const Qc=[Jn("classes",Tn),ds("mode","all",["all","layout","placement"])],ed=[as("useFixed",_),Zn("getBounds")],td=[jn("anchor",Zc),rs("transition",Qc)],od=(e,t,o,n,s,r,a)=>((e,t,o,n,s,r,a,i)=>{const l=Xl(a,"maxHeightFunction",$l()),c=Xl(a,"maxWidthFunction",b),d=e.anchorBox,u=e.origin,m={bounds:Tl(u,r),origin:u,preference:n,maxHeightFunction:l,maxWidthFunction:c,lastPlacement:s,transition:i};return Kl(d,t,o,m)})(((e,t)=>((e,t)=>({anchorBox:e,origin:t}))(e,t))(o.anchorBox,t),s.element,o.bubble,o.layouts,r,n,o.overrides,a),nd=(e,t,o,n,s,r)=>{const a=r.map(Lo);return sd(e,t,o,n,s,a)},sd=(e,t,o,n,s,r)=>{const a=zn("placement.info",yn(td),s),i=a.anchor,l=n.element,c=o.get(n.uid);xl((()=>{St(l,"position","fixed");const s=Tt(l,"visibility");St(l,"visibility","hidden");const d=t.useFixed()?(()=>{const e=document.documentElement;return Ml(0,0,e.clientWidth,e.clientHeight)})():(e=>{const t=Pt(e.element),o=e.element.dom.getBoundingClientRect();return Bl(t.left,t.top,o.width,o.height)})(e),u=i.placement,m=r.map(y).or(t.getBounds);u(e,i,d).each((t=>{const s=t.placer.getOr(od)(e,d,t,m,n,c,a.transition);o.set(n.uid,s)})),s.fold((()=>{Mt(l,"visibility")}),(e=>{St(l,"visibility",e)})),Tt(l,"left").isNone()&&Tt(l,"top").isNone()&&Tt(l,"right").isNone()&&Tt(l,"bottom").isNone()&&ye(Tt(l,"position"),"fixed")&&Mt(l,"position")}),l)};var rd=Object.freeze({__proto__:null,position:(e,t,o,n,s)=>{nd(e,t,o,n,s,B.none())},positionWithin:nd,positionWithinBounds:sd,getMode:(e,t,o)=>t.useFixed()?"fixed":"absolute",reset:(e,t,o,n)=>{const s=n.element;N(["position","left","right","top","bottom"],(e=>Mt(s,e))),(e=>{yt(e,Al)})(s),o.clear(n.uid)}});const ad=dl({fields:ed,name:"positioning",active:hl,apis:rd,state:Object.freeze({__proto__:null,init:()=>{let e={};return ma({readState:()=>e,clear:t=>{g(t)?delete e[t]:e={}},set:(t,o)=>{e[t]=o},get:t=>fe(e,t)})}})}),id=e=>e.getSystem().isConnected(),ld=e=>{yr(e,dr());const t=e.components();N(t,ld)},cd=e=>{const t=e.components();N(t,cd),yr(e,cr())},dd=(e,t)=>{e.getSystem().addToWorld(t),dt(e.element)&&cd(t)},ud=e=>{ld(e),e.getSystem().removeFromWorld(e)},md=(e,t)=>{Eo(e.element,t.element)},gd=(e,t)=>{pd(e,t,Eo)},pd=(e,t,o)=>{e.getSystem().addToWorld(t),o(e.element,t.element),dt(e.element)&&cd(t),e.syncComponents()},hd=e=>{ld(e),Ao(e.element),e.getSystem().removeFromWorld(e)},fd=e=>{const t=Ye(e.element).bind((t=>e.getSystem().getByDom(t).toOptional()));hd(e),t.each((e=>{e.syncComponents()}))},bd=e=>{const t=e.components();N(t,hd),Mo(e.element),e.syncComponents()},vd=(e,t)=>{yd(e,t,Eo)},yd=(e,t,o)=>{o(e,t.element);const n=Qe(t.element);N(n,(e=>{t.getByDom(e).each(cd)}))},xd=e=>{const t=Qe(e.element);N(t,(t=>{e.getByDom(t).each(ld)})),Ao(e.element)},wd=(e,t,o,n)=>{o.get().each((t=>{bd(e)}));const s=t.getAttachPoint(e);gd(s,e);const r=e.getSystem().build(n);return gd(e,r),o.set(r),r},Sd=(e,t,o,n)=>{const s=wd(e,t,o,n);return t.onOpen(e,s),s},kd=(e,t,o)=>{o.get().each((n=>{bd(e),fd(e),t.onClose(e,n),o.clear()}))},Cd=(e,t,o)=>o.isOpen(),Od=(e,t,o)=>{const n=t.getAttachPoint(e);St(e.element,"position",ad.getMode(n)),((e,t,o,n)=>{Tt(e.element,t).fold((()=>{yt(e.element,o)}),(t=>{pt(e.element,o,t)})),St(e.element,t,"hidden")})(e,"visibility",t.cloakVisibilityAttr)},_d=(e,t,o)=>{(e=>R(["top","left","right","bottom"],(t=>Tt(e,t).isSome())))(e.element)||Mt(e.element,"position"),((e,t,o)=>{bt(e.element,o).fold((()=>Mt(e.element,t)),(o=>St(e.element,t,o)))})(e,"visibility",t.cloakVisibilityAttr)};var Td=Object.freeze({__proto__:null,cloak:Od,decloak:_d,open:Sd,openWhileCloaked:(e,t,o,n,s)=>{Od(e,t),Sd(e,t,o,n),s(),_d(e,t)},close:kd,isOpen:Cd,isPartOf:(e,t,o,n)=>Cd(0,0,o)&&o.get().exists((o=>t.isPartOf(e,o,n))),getState:(e,t,o)=>o.get(),setContent:(e,t,o,n)=>o.get().map((()=>wd(e,t,o,n)))}),Ed=Object.freeze({__proto__:null,events:(e,t)=>Or([Er(or(),((o,n)=>{kd(o,e,t)}))])}),Bd=[fi("onOpen"),fi("onClose"),Un("isPartOf"),Un("getAttachPoint"),as("cloakVisibilityAttr","data-precloak-visibility")],Md=Object.freeze({__proto__:null,init:()=>{const e=zl(),t=y("not-implemented");return ma({readState:t,isOpen:e.isSet,clear:e.clear,set:e.set,get:e.get})}});const Ad=dl({fields:Bd,name:"sandboxing",active:Ed,apis:Td,state:Md}),Dd=y("dismiss.popups"),Fd=y("reposition.popups"),Id=y("mouse.released"),Vd=vn([as("isExtraPart",_),rs("fireEventInstead",[as("event",ur())])]),Rd=e=>{const t=zn("Dismissal",Vd,e);return{[Dd()]:{schema:vn([Un("target")]),onReceive:(e,o)=>{Ad.isOpen(e)&&(Ad.isPartOf(e,o.target)||t.isExtraPart(e,o.target)||t.fireEventInstead.fold((()=>Ad.close(e)),(t=>yr(e,t.event))))}}}},zd=vn([rs("fireEventInstead",[as("event",mr())]),Xn("doReposition")]),Hd=e=>{const t=zn("Reposition",zd,e);return{[Fd()]:{onReceive:e=>{Ad.isOpen(e)&&t.fireEventInstead.fold((()=>t.doReposition(e)),(t=>yr(e,t.event)))}}}},Pd=(e,t,o)=>{t.store.manager.onLoad(e,t,o)},Nd=(e,t,o)=>{t.store.manager.onUnload(e,t,o)};var Ld=Object.freeze({__proto__:null,onLoad:Pd,onUnload:Nd,setValue:(e,t,o,n)=>{t.store.manager.setValue(e,t,o,n)},getValue:(e,t,o)=>t.store.manager.getValue(e,t,o),getState:(e,t,o)=>o}),Wd=Object.freeze({__proto__:null,events:(e,t)=>{const o=e.resetOnDom?[Rr(((o,n)=>{Pd(o,e,t)})),zr(((o,n)=>{Nd(o,e,t)}))]:[rl(e,t,Pd)];return Or(o)}});const Ud=()=>{const e=hs(null);return ma({set:e.set,get:e.get,isNotSet:()=>null===e.get(),clear:()=>{e.set(null)},readState:()=>({mode:"memory",value:e.get()})})},jd=()=>{const e=hs({}),t=hs({});return ma({readState:()=>({mode:"dataset",dataByValue:e.get(),dataByText:t.get()}),lookup:o=>fe(e.get(),o).orThunk((()=>fe(t.get(),o))),update:o=>{const n=e.get(),s=t.get(),r={},a={};N(o,(e=>{r[e.value]=e,fe(e,"meta").each((t=>{fe(t,"text").each((t=>{a[t]=e}))}))})),e.set({...n,...r}),t.set({...s,...a})},clear:()=>{e.set({}),t.set({})}})};var Gd=Object.freeze({__proto__:null,memory:Ud,dataset:jd,manual:()=>ma({readState:b}),init:e=>e.store.manager.state(e)});const $d=(e,t,o,n)=>{const s=t.store;o.update([n]),s.setValue(e,n),t.onSetValue(e,n)};var qd=[Zn("initialValue"),Un("getFallbackEntry"),Un("getDataKey"),Un("setValue"),xi("manager",{setValue:$d,getValue:(e,t,o)=>{const n=t.store,s=n.getDataKey(e);return o.lookup(s).getOrThunk((()=>n.getFallbackEntry(s)))},onLoad:(e,t,o)=>{t.store.initialValue.each((n=>{$d(e,t,o,n)}))},onUnload:(e,t,o)=>{o.clear()},state:jd})],Xd=[Un("getValue"),as("setValue",b),Zn("initialValue"),xi("manager",{setValue:(e,t,o,n)=>{t.store.setValue(e,n),t.onSetValue(e,n)},getValue:(e,t,o)=>t.store.getValue(e),onLoad:(e,t,o)=>{t.store.initialValue.each((o=>{t.store.setValue(e,o)}))},onUnload:b,state:ua.init})],Kd=[Zn("initialValue"),xi("manager",{setValue:(e,t,o,n)=>{o.set(n),t.onSetValue(e,n)},getValue:(e,t,o)=>o.get(),onLoad:(e,t,o)=>{t.store.initialValue.each((e=>{o.isNotSet()&&o.set(e)}))},onUnload:(e,t,o)=>{o.clear()},state:Ud})],Yd=[is("store",{mode:"memory"},Pn("mode",{memory:Kd,manual:Xd,dataset:qd})),fi("onSetValue"),as("resetOnDom",!1)];const Jd=dl({fields:Yd,name:"representing",active:Wd,apis:Ld,extra:{setValueFrom:(e,t)=>{const o=Jd.getValue(t);Jd.setValue(e,o)}},state:Gd}),Zd=(e,t)=>ps(e,{},P(t,(t=>{return o=t.name(),n="Cannot configure "+t.name()+" for "+e,Nn(o,o,{tag:"option",process:{}},mn((e=>Zo("The field: "+o+" is forbidden. "+n))));var o,n})).concat([Ln("dump",x)])),Qd=e=>e.dump,eu=(e,t)=>({...ll(t),...e.dump}),tu=Zd,ou=eu,nu="placeholder",su=fs([{single:["required","valueThunk"]},{multiple:["required","valueThunks"]}]),ru=e=>be(e,"uiType"),au=(e,t,o,n)=>((e,t,o,n)=>ru(o)&&o.uiType===nu?((e,t,o,n)=>e.exists((e=>e!==o.owner))?su.single(!0,y(o)):fe(n,o.name).fold((()=>{throw new Error("Unknown placeholder component: "+o.name+"\nKnown: ["+ae(n)+"]\nNamespace: "+e.getOr("none")+"\nSpec: "+JSON.stringify(o,null,2))}),(e=>e.replace())))(e,0,o,n):su.single(!1,y(o)))(e,0,o,n).fold(((s,r)=>{const a=ru(o)?r(t,o.config,o.validated):r(t),i=fe(a,"components").getOr([]),l=X(i,(o=>au(e,t,o,n)));return[{...a,components:l}]}),((e,n)=>{if(ru(o)){const e=n(t,o.config,o.validated);return o.validated.preprocess.getOr(x)(e)}return n(t)})),iu=su.single,lu=su.multiple,cu=y(nu),du=fs([{required:["data"]},{external:["data"]},{optional:["data"]},{group:["data"]}]),uu=as("factory",{sketch:x}),mu=as("schema",[]),gu=Un("name"),pu=Nn("pname","pname",rn((e=>"<alloy."+Xr(e.name)+">")),Cn()),hu=Ln("schema",(()=>[Zn("preprocess")])),fu=as("defaults",y({})),bu=as("overrides",y({})),vu=yn([uu,mu,gu,pu,fu,bu]),yu=yn([uu,mu,gu,fu,bu]),xu=yn([uu,mu,gu,pu,fu,bu]),wu=yn([uu,hu,gu,Un("unit"),pu,fu,bu]),Su=e=>e.fold(B.some,B.none,B.some,B.some),ku=e=>{const t=e=>e.name;return e.fold(t,t,t,t)},Cu=(e,t)=>o=>{const n=zn("Converting part type",t,o);return e(n)},Ou=Cu(du.required,vu),_u=Cu(du.external,yu),Tu=Cu(du.optional,xu),Eu=Cu(du.group,wu),Bu=y("entirety");var Mu=Object.freeze({__proto__:null,required:Ou,external:_u,optional:Tu,group:Eu,asNamedPart:Su,name:ku,asCommon:e=>e.fold(x,x,x,x),original:Bu});const Au=(e,t,o,n)=>nn(t.defaults(e,o,n),o,{uid:e.partUids[t.name]},t.overrides(e,o,n)),Du=(e,t)=>{const o={};return N(t,(t=>{Su(t).each((t=>{const n=Fu(e,t.pname);o[t.name]=o=>{const s=zn("Part: "+t.name+" in "+e,yn(t.schema),o);return{...n,config:o,validated:s}}}))})),o},Fu=(e,t)=>({uiType:cu(),owner:e,name:t}),Iu=(e,t,o)=>({uiType:cu(),owner:e,name:t,config:o,validated:{}}),Vu=e=>X(e,(e=>e.fold(B.none,B.some,B.none,B.none).map((e=>Kn(e.name,e.schema.concat([wi(Bu())])))).toArray())),Ru=e=>P(e,ku),zu=(e,t,o)=>((e,t,o)=>{const n={},s={};return N(o,(e=>{e.fold((e=>{n[e.pname]=iu(!0,((t,o,n)=>e.factory.sketch(Au(t,e,o,n))))}),(e=>{const o=t.parts[e.name];s[e.name]=y(e.factory.sketch(Au(t,e,o[Bu()]),o))}),(e=>{n[e.pname]=iu(!1,((t,o,n)=>e.factory.sketch(Au(t,e,o,n))))}),(e=>{n[e.pname]=lu(!0,((t,o,n)=>{const s=t[e.name];return P(s,(o=>e.factory.sketch(nn(e.defaults(t,o,n),o,e.overrides(t,o)))))}))}))})),{internals:y(n),externals:y(s)}})(0,t,o),Hu=(e,t,o)=>((e,t,o,n)=>{const s=ce(n,((e,t)=>((e,t)=>{let o=!1;return{name:y(e),required:()=>t.fold(((e,t)=>e),((e,t)=>e)),used:()=>o,replace:()=>{if(o)throw new Error("Trying to use the same placeholder more than once: "+e);return o=!0,t}}})(t,e))),r=((e,t,o,n)=>X(o,(o=>au(e,t,o,n))))(e,t,o,s);return le(s,(o=>{if(!1===o.used()&&o.required())throw new Error("Placeholder: "+o.name()+" was not found in components list\nNamespace: "+e.getOr("none")+"\nComponents: "+JSON.stringify(t.components,null,2))})),r})(B.some(e),t,t.components,o),Pu=(e,t,o)=>{const n=t.partUids[o];return e.getSystem().getByUid(n).toOptional()},Nu=(e,t,o)=>Pu(e,t,o).getOrDie("Could not find part: "+o),Lu=(e,t,o)=>{const n={},s=t.partUids,r=e.getSystem();return N(o,(e=>{n[e]=y(r.getByUid(s[e]))})),n},Wu=(e,t)=>{const o=e.getSystem();return ce(t.partUids,((e,t)=>y(o.getByUid(e))))},Uu=e=>ae(e.partUids),ju=(e,t,o)=>{const n={},s=t.partUids,r=e.getSystem();return N(o,(e=>{n[e]=y(r.getByUid(s[e]).getOrDie())})),n},Gu=(e,t)=>{const o=Ru(t);return vs(P(o,(t=>({key:t,value:e+"-"+t}))))},$u=e=>Nn("partUids","partUids",ln((t=>Gu(t.uid,e))),Cn());var qu=Object.freeze({__proto__:null,generate:Du,generateOne:Iu,schemas:Vu,names:Ru,substitutes:zu,components:Hu,defaultUids:Gu,defaultUidsSchema:$u,getAllParts:Wu,getAllPartNames:Uu,getPart:Pu,getPartOrDie:Nu,getParts:Lu,getPartsOrDie:ju});const Xu=(e,t,o,n,s)=>{const r=((e,t)=>(e.length>0?[Kn("parts",e)]:[]).concat([Un("uid"),as("dom",{}),as("components",[]),wi("originalSpec"),as("debug.sketcher",{})]).concat(t))(n,s);return zn(e+" [SpecSchema]",vn(r.concat(t)),o)},Ku=(e,t,o,n,s)=>{const r=Yu(s),a=Vu(o),i=$u(o),l=Xu(e,t,r,a,[i]),c=zu(0,l,o);return n(l,Hu(e,l,c.internals()),r,c.externals())},Yu=e=>(e=>be(e,"uid"))(e)?e:{...e,uid:ta("uid")},Ju=vn([Un("name"),Un("factory"),Un("configFields"),as("apis",{}),as("extraApis",{})]),Zu=vn([Un("name"),Un("factory"),Un("configFields"),Un("partFields"),as("apis",{}),as("extraApis",{})]),Qu=e=>{const t=zn("Sketcher for "+e.name,Ju,e),o=ce(t.apis,da),n=ce(t.extraApis,((e,t)=>aa(e,t)));return{name:t.name,configFields:t.configFields,sketch:e=>((e,t,o,n)=>{const s=Yu(n);return o(Xu(e,t,s,[],[]),s)})(t.name,t.configFields,t.factory,e),...o,...n}},em=e=>{const t=zn("Sketcher for "+e.name,Zu,e),o=Du(t.name,t.partFields),n=ce(t.apis,da),s=ce(t.extraApis,((e,t)=>aa(e,t)));return{name:t.name,partFields:t.partFields,configFields:t.configFields,sketch:e=>Ku(t.name,t.configFields,t.partFields,t.factory,e),parts:o,...n,...s}},tm=e=>Le("input")(e)&&"radio"!==ft(e,"type")||Le("textarea")(e);var om=Object.freeze({__proto__:null,getCurrent:(e,t,o)=>t.find(e)});const nm=[Un("find")],sm=dl({fields:nm,name:"composing",apis:om}),rm=["input","button","textarea","select"],am=(e,t,o)=>{(t.disabled()?mm:gm)(e,t)},im=(e,t)=>!0===t.useNative&&V(rm,Ve(e.element)),lm=e=>{pt(e.element,"disabled","disabled")},cm=e=>{yt(e.element,"disabled")},dm=e=>{pt(e.element,"aria-disabled","true")},um=e=>{pt(e.element,"aria-disabled","false")},mm=(e,t,o)=>{t.disableClass.each((t=>{_a(e.element,t)})),(im(e,t)?lm:dm)(e),t.onDisabled(e)},gm=(e,t,o)=>{t.disableClass.each((t=>{Ta(e.element,t)})),(im(e,t)?cm:um)(e),t.onEnabled(e)},pm=(e,t)=>im(e,t)?(e=>vt(e.element,"disabled"))(e):(e=>"true"===ft(e.element,"aria-disabled"))(e);var hm=Object.freeze({__proto__:null,enable:gm,disable:mm,isDisabled:pm,onLoad:am,set:(e,t,o,n)=>{(n?mm:gm)(e,t)}}),fm=Object.freeze({__proto__:null,exhibit:(e,t)=>pa({classes:t.disabled()?t.disableClass.toArray():[]}),events:(e,t)=>Or([_r(Zs(),((t,o)=>pm(t,e))),rl(e,t,am)])}),bm=[ms("disabled",_),as("useNative",!0),Zn("disableClass"),fi("onDisabled"),fi("onEnabled")];const vm=dl({fields:bm,name:"disabling",active:fm,apis:hm}),ym=(e,t,o,n)=>{const s=Ac(e.element,"."+t.highlightClass);N(s,(o=>{R(n,(e=>e.element===o))||(Ta(o,t.highlightClass),e.getSystem().getByDom(o).each((o=>{t.onDehighlight(e,o),yr(o,vr())})))}))},xm=(e,t,o,n)=>{ym(e,t,0,[n]),wm(e,t,o,n)||(_a(n.element,t.highlightClass),t.onHighlight(e,n),yr(n,br()))},wm=(e,t,o,n)=>Ea(n.element,t.highlightClass),Sm=(e,t,o)=>Qa(e.element,"."+t.itemClass).bind((t=>e.getSystem().getByDom(t).toOptional())),km=(e,t,o)=>{const n=Ac(e.element,"."+t.itemClass);return(n.length>0?B.some(n[n.length-1]):B.none()).bind((t=>e.getSystem().getByDom(t).toOptional()))},Cm=(e,t,o,n)=>{const s=Ac(e.element,"."+t.itemClass);return $(s,(e=>Ea(e,t.highlightClass))).bind((t=>{const o=Fi(t,n,0,s.length-1);return e.getSystem().getByDom(s[o]).toOptional()}))},Om=(e,t,o)=>{const n=Ac(e.element,"."+t.itemClass);return xe(P(n,(t=>e.getSystem().getByDom(t).toOptional())))};var _m=Object.freeze({__proto__:null,dehighlightAll:(e,t,o)=>ym(e,t,0,[]),dehighlight:(e,t,o,n)=>{wm(e,t,o,n)&&(Ta(n.element,t.highlightClass),t.onDehighlight(e,n),yr(n,vr()))},highlight:xm,highlightFirst:(e,t,o)=>{Sm(e,t).each((n=>{xm(e,t,o,n)}))},highlightLast:(e,t,o)=>{km(e,t).each((n=>{xm(e,t,o,n)}))},highlightAt:(e,t,o,n)=>{((e,t,o,n)=>{const s=Ac(e.element,"."+t.itemClass);return B.from(s[n]).fold((()=>$o.error(new Error("No element found with index "+n))),e.getSystem().getByDom)})(e,t,0,n).fold((e=>{throw e}),(n=>{xm(e,t,o,n)}))},highlightBy:(e,t,o,n)=>{const s=Om(e,t);G(s,n).each((n=>{xm(e,t,o,n)}))},isHighlighted:wm,getHighlighted:(e,t,o)=>Qa(e.element,"."+t.highlightClass).bind((t=>e.getSystem().getByDom(t).toOptional())),getFirst:Sm,getLast:km,getPrevious:(e,t,o)=>Cm(e,t,0,-1),getNext:(e,t,o)=>Cm(e,t,0,1),getCandidates:Om}),Tm=[Un("highlightClass"),Un("itemClass"),fi("onHighlight"),fi("onDehighlight")];const Em=dl({fields:Tm,name:"highlighting",apis:_m}),Bm=[8],Mm=[9],Am=[13],Dm=[27],Fm=[32],Im=[37],Vm=[38],Rm=[39],zm=[40],Hm=(e,t,o)=>{const n=Y(e.slice(0,t)),s=Y(e.slice(t+1));return G(n.concat(s),o)},Pm=(e,t,o)=>{const n=Y(e.slice(0,t));return G(n,o)},Nm=(e,t,o)=>{const n=e.slice(0,t),s=e.slice(t+1);return G(s.concat(n),o)},Lm=(e,t,o)=>{const n=e.slice(t+1);return G(n,o)},Wm=e=>t=>{const o=t.raw;return V(e,o.which)},Um=e=>t=>K(e,(e=>e(t))),jm=e=>!0===e.raw.shiftKey,Gm=e=>!0===e.raw.ctrlKey,$m=k(jm),qm=(e,t)=>({matches:e,classification:t}),Xm=(e,t,o)=>{t.exists((e=>o.exists((t=>je(t,e)))))||xr(e,gr(),{prevFocus:t,newFocus:o})},Km=()=>{const e=e=>yl(e.element);return{get:e,set:(t,o)=>{const n=e(t);t.getSystem().triggerFocus(o,t.element);const s=e(t);Xm(t,n,s)}}},Ym=()=>{const e=e=>Em.getHighlighted(e).map((e=>e.element));return{get:e,set:(t,o)=>{const n=e(t);t.getSystem().getByDom(o).fold(b,(e=>{Em.highlight(t,e)}));const s=e(t);Xm(t,n,s)}}};var Jm;!function(e){e.OnFocusMode="onFocus",e.OnEnterOrSpaceMode="onEnterOrSpace",e.OnApiMode="onApi"}(Jm||(Jm={}));const Zm=(e,t,o,n,s)=>{const r=(e,t,o,n,s)=>{return(r=o(e,t,n,s),a=t.event,G(r,(e=>e.matches(a))).map((e=>e.classification))).bind((o=>o(e,t,n,s)));var r,a},a={schema:()=>e.concat([as("focusManager",Km()),is("focusInside","onFocus",Fn((e=>V(["onFocus","onEnterOrSpace","onApi"],e)?$o.value(e):$o.error("Invalid value for focusInside")))),xi("handler",a),xi("state",t),xi("sendFocusIn",s)]),processKey:r,toEvents:(e,t)=>{const a=e.focusInside!==Jm.OnFocusMode?B.none():s(e).map((o=>Er(Xs(),((n,s)=>{o(n,e,t),s.stop()})))),i=[Er(zs(),((n,a)=>{r(n,a,o,e,t).fold((()=>{((o,n)=>{const r=Wm(Fm.concat(Am))(n.event);e.focusInside===Jm.OnEnterOrSpaceMode&&r&&Ss(o,n)&&s(e).each((s=>{s(o,e,t),n.stop()}))})(n,a)}),(e=>{a.stop()}))})),Er(Hs(),((o,s)=>{r(o,s,n,e,t).each((e=>{s.stop()}))}))];return Or(a.toArray().concat(i))}};return a},Qm=e=>{const t=[Zn("onEscape"),Zn("onEnter"),as("selector",'[data-alloy-tabstop="true"]:not(:disabled)'),as("firstTabstop",0),as("useTabstopAt",T),Zn("visibilitySelector")].concat([e]),o=(e,t)=>{const o=e.visibilitySelector.bind((e=>ei(t,e))).getOr(t);return It(o)>0},n=(e,t,n)=>{((e,t)=>{const n=Ac(e.element,t.selector),s=W(n,(e=>o(t,e)));return B.from(s[t.firstTabstop])})(e,t).each((o=>{t.focusManager.set(e,o)}))},s=(e,t,n,s)=>{const r=Ac(e.element,n.selector);return((e,t)=>t.focusManager.get(e).bind((e=>ei(e,t.selector))))(e,n).bind((t=>$(r,S(je,t)).bind((t=>((e,t,n,s,r)=>r(t,n,(e=>((e,t)=>o(e,t)&&e.useTabstopAt(t))(s,e))).fold((()=>s.cyclic?B.some(!0):B.none()),(t=>(s.focusManager.set(e,t),B.some(!0)))))(e,r,t,n,s)))))},r=y([qm(Um([jm,Wm(Mm)]),((e,t,o)=>{const n=o.cyclic?Hm:Pm;return s(e,0,o,n)})),qm(Wm(Mm),((e,t,o)=>{const n=o.cyclic?Nm:Lm;return s(e,0,o,n)})),qm(Wm(Dm),((e,t,o)=>o.onEscape.bind((o=>o(e,t))))),qm(Um([$m,Wm(Am)]),((e,t,o)=>o.onEnter.bind((o=>o(e,t)))))]),a=y([]);return Zm(t,ua.init,r,a,(()=>B.some(n)))};var eg=Qm(Ln("cyclic",_)),tg=Qm(Ln("cyclic",T));const og=(e,t,o)=>tm(o)&&Wm(Fm)(t.event)?B.none():((e,t,o)=>(Sr(e,o,Zs()),B.some(!0)))(e,0,o),ng=(e,t)=>B.some(!0),sg=[as("execute",og),as("useSpace",!1),as("useEnter",!0),as("useControlEnter",!1),as("useDown",!1)],rg=(e,t,o)=>o.execute(e,t,e.element);var ag=Zm(sg,ua.init,((e,t,o,n)=>{const s=o.useSpace&&!tm(e.element)?Fm:[],r=o.useEnter?Am:[],a=o.useDown?zm:[],i=s.concat(r).concat(a);return[qm(Wm(i),rg)].concat(o.useControlEnter?[qm(Um([Gm,Wm(Am)]),rg)]:[])}),((e,t,o,n)=>o.useSpace&&!tm(e.element)?[qm(Wm(Fm),ng)]:[]),(()=>B.none()));const ig=()=>{const e=zl();return ma({readState:()=>e.get().map((e=>({numRows:String(e.numRows),numColumns:String(e.numColumns)}))).getOr({numRows:"?",numColumns:"?"}),setGridSize:(t,o)=>{e.set({numRows:t,numColumns:o})},getNumRows:()=>e.get().map((e=>e.numRows)),getNumColumns:()=>e.get().map((e=>e.numColumns))})};var lg=Object.freeze({__proto__:null,flatgrid:ig,init:e=>e.state(e)});const cg=e=>(t,o,n,s)=>{const r=e(t.element);return gg(r,t,o,n,s)},dg=(e,t)=>{const o=ec(e,t);return cg(o)},ug=(e,t)=>{const o=ec(t,e);return cg(o)},mg=e=>(t,o,n,s)=>gg(e,t,o,n,s),gg=(e,t,o,n,s)=>n.focusManager.get(t).bind((o=>e(t.element,o,n,s))).map((e=>(n.focusManager.set(t,e),!0))),pg=mg,hg=mg,fg=mg,bg=e=>!(e=>e.offsetWidth<=0&&e.offsetHeight<=0)(e.dom),vg=(e,t,o)=>{const n=Ac(e,o);return((e,o)=>$(e,(e=>je(e,t))).map((t=>({index:t,candidates:e}))))(W(n,bg))},yg=(e,t)=>$(e,(e=>je(t,e))),xg=(e,t,o,n)=>n(Math.floor(t/o),t%o).bind((t=>{const n=t.row*o+t.column;return n>=0&&n<e.length?B.some(e[n]):B.none()})),wg=(e,t,o,n,s)=>xg(e,t,n,((t,r)=>{const a=t===o-1?e.length-t*n:n,i=Fi(r,s,0,a-1);return B.some({row:t,column:i})})),Sg=(e,t,o,n,s)=>xg(e,t,n,((t,r)=>{const a=Fi(t,s,0,o-1),i=a===o-1?e.length-a*n:n,l=Ii(r,0,i-1);return B.some({row:a,column:l})})),kg=[Un("selector"),as("execute",og),bi("onEscape"),as("captureTab",!1),Si()],Cg=(e,t,o)=>{Qa(e.element,t.selector).each((o=>{t.focusManager.set(e,o)}))},Og=e=>(t,o,n,s)=>vg(t,o,n.selector).bind((t=>e(t.candidates,t.index,s.getNumRows().getOr(n.initSize.numRows),s.getNumColumns().getOr(n.initSize.numColumns)))),_g=(e,t,o)=>o.captureTab?B.some(!0):B.none(),Tg=Og(((e,t,o,n)=>wg(e,t,o,n,-1))),Eg=Og(((e,t,o,n)=>wg(e,t,o,n,1))),Bg=Og(((e,t,o,n)=>Sg(e,t,o,n,-1))),Mg=Og(((e,t,o,n)=>Sg(e,t,o,n,1))),Ag=y([qm(Wm(Im),dg(Tg,Eg)),qm(Wm(Rm),ug(Tg,Eg)),qm(Wm(Vm),pg(Bg)),qm(Wm(zm),hg(Mg)),qm(Um([jm,Wm(Mm)]),_g),qm(Um([$m,Wm(Mm)]),_g),qm(Wm(Dm),((e,t,o)=>o.onEscape(e,t))),qm(Wm(Fm.concat(Am)),((e,t,o,n)=>((e,t)=>t.focusManager.get(e).bind((e=>ei(e,t.selector))))(e,o).bind((n=>o.execute(e,t,n)))))]),Dg=y([qm(Wm(Fm),ng)]);var Fg=Zm(kg,ig,Ag,Dg,(()=>B.some(Cg)));const Ig=(e,t,o,n)=>{const s=(e,t,o)=>{const r=Fi(t,n,0,o.length-1);return r===e?B.none():(a=o[r],"button"===Ve(a)&&"disabled"===ft(a,"disabled")?s(e,r,o):B.from(o[r]));var a};return vg(e,o,t).bind((e=>{const t=e.index,o=e.candidates;return s(t,t,o)}))},Vg=[Un("selector"),as("getInitial",B.none),as("execute",og),bi("onEscape"),as("executeOnMove",!1),as("allowVertical",!0)],Rg=(e,t,o)=>((e,t)=>t.focusManager.get(e).bind((e=>ei(e,t.selector))))(e,o).bind((n=>o.execute(e,t,n))),zg=(e,t,o)=>{t.getInitial(e).orThunk((()=>Qa(e.element,t.selector))).each((o=>{t.focusManager.set(e,o)}))},Hg=(e,t,o)=>Ig(e,o.selector,t,-1),Pg=(e,t,o)=>Ig(e,o.selector,t,1),Ng=e=>(t,o,n,s)=>e(t,o,n,s).bind((()=>n.executeOnMove?Rg(t,o,n):B.some(!0))),Lg=(e,t,o)=>o.onEscape(e,t),Wg=y([qm(Wm(Fm),ng)]);var Ug=Zm(Vg,ua.init,((e,t,o,n)=>{const s=Im.concat(o.allowVertical?Vm:[]),r=Rm.concat(o.allowVertical?zm:[]);return[qm(Wm(s),Ng(dg(Hg,Pg))),qm(Wm(r),Ng(ug(Hg,Pg))),qm(Wm(Am),Rg),qm(Wm(Fm),Rg),qm(Wm(Dm),Lg)]}),Wg,(()=>B.some(zg)));const jg=(e,t,o)=>B.from(e[t]).bind((e=>B.from(e[o]).map((e=>({rowIndex:t,columnIndex:o,cell:e}))))),Gg=(e,t,o,n)=>{const s=e[t].length,r=Fi(o,n,0,s-1);return jg(e,t,r)},$g=(e,t,o,n)=>{const s=Fi(o,n,0,e.length-1),r=e[s].length,a=Ii(t,0,r-1);return jg(e,s,a)},qg=(e,t,o,n)=>{const s=e[t].length,r=Ii(o+n,0,s-1);return jg(e,t,r)},Xg=(e,t,o,n)=>{const s=Ii(o+n,0,e.length-1),r=e[s].length,a=Ii(t,0,r-1);return jg(e,s,a)},Kg=[Kn("selectors",[Un("row"),Un("cell")]),as("cycles",!0),as("previousSelector",B.none),as("execute",og)],Yg=(e,t,o)=>{t.previousSelector(e).orThunk((()=>{const o=t.selectors;return Qa(e.element,o.cell)})).each((o=>{t.focusManager.set(e,o)}))},Jg=(e,t)=>(o,n,s)=>{const r=s.cycles?e:t;return ei(n,s.selectors.row).bind((e=>{const t=Ac(e,s.selectors.cell);return yg(t,n).bind((t=>{const n=Ac(o,s.selectors.row);return yg(n,e).bind((e=>{const o=((e,t)=>P(e,(e=>Ac(e,t.selectors.cell))))(n,s);return r(o,e,t).map((e=>e.cell))}))}))}))},Zg=Jg(((e,t,o)=>Gg(e,t,o,-1)),((e,t,o)=>qg(e,t,o,-1))),Qg=Jg(((e,t,o)=>Gg(e,t,o,1)),((e,t,o)=>qg(e,t,o,1))),ep=Jg(((e,t,o)=>$g(e,o,t,-1)),((e,t,o)=>Xg(e,o,t,-1))),tp=Jg(((e,t,o)=>$g(e,o,t,1)),((e,t,o)=>Xg(e,o,t,1))),op=y([qm(Wm(Im),dg(Zg,Qg)),qm(Wm(Rm),ug(Zg,Qg)),qm(Wm(Vm),pg(ep)),qm(Wm(zm),hg(tp)),qm(Wm(Fm.concat(Am)),((e,t,o)=>yl(e.element).bind((n=>o.execute(e,t,n)))))]),np=y([qm(Wm(Fm),ng)]);var sp=Zm(Kg,ua.init,op,np,(()=>B.some(Yg)));const rp=[Un("selector"),as("execute",og),as("moveOnTab",!1)],ap=(e,t,o)=>o.focusManager.get(e).bind((n=>o.execute(e,t,n))),ip=(e,t,o)=>{Qa(e.element,t.selector).each((o=>{t.focusManager.set(e,o)}))},lp=(e,t,o)=>Ig(e,o.selector,t,-1),cp=(e,t,o)=>Ig(e,o.selector,t,1),dp=y([qm(Wm(Vm),fg(lp)),qm(Wm(zm),fg(cp)),qm(Um([jm,Wm(Mm)]),((e,t,o,n)=>o.moveOnTab?fg(lp)(e,t,o,n):B.none())),qm(Um([$m,Wm(Mm)]),((e,t,o,n)=>o.moveOnTab?fg(cp)(e,t,o,n):B.none())),qm(Wm(Am),ap),qm(Wm(Fm),ap)]),up=y([qm(Wm(Fm),ng)]);var mp=Zm(rp,ua.init,dp,up,(()=>B.some(ip)));const gp=[bi("onSpace"),bi("onEnter"),bi("onShiftEnter"),bi("onLeft"),bi("onRight"),bi("onTab"),bi("onShiftTab"),bi("onUp"),bi("onDown"),bi("onEscape"),as("stopSpaceKeyup",!1),Zn("focusIn")];var pp=Zm(gp,ua.init,((e,t,o)=>[qm(Wm(Fm),o.onSpace),qm(Um([$m,Wm(Am)]),o.onEnter),qm(Um([jm,Wm(Am)]),o.onShiftEnter),qm(Um([jm,Wm(Mm)]),o.onShiftTab),qm(Um([$m,Wm(Mm)]),o.onTab),qm(Wm(Vm),o.onUp),qm(Wm(zm),o.onDown),qm(Wm(Im),o.onLeft),qm(Wm(Rm),o.onRight),qm(Wm(Fm),o.onSpace),qm(Wm(Dm),o.onEscape)]),((e,t,o)=>o.stopSpaceKeyup?[qm(Wm(Fm),ng)]:[]),(e=>e.focusIn));const hp=eg.schema(),fp=tg.schema(),bp=Ug.schema(),vp=Fg.schema(),yp=sp.schema(),xp=ag.schema(),wp=mp.schema(),Sp=pp.schema(),kp=ml({branchKey:"mode",branches:Object.freeze({__proto__:null,acyclic:hp,cyclic:fp,flow:bp,flatgrid:vp,matrix:yp,execution:xp,menu:wp,special:Sp}),name:"keying",active:{events:(e,t)=>e.handler.toEvents(e,t)},apis:{focusIn:(e,t,o)=>{t.sendFocusIn(t).fold((()=>{e.getSystem().triggerFocus(e.element,e.element)}),(n=>{n(e,t,o)}))},setGridSize:(e,t,o,n,s)=>{(e=>ve(e,"setGridSize"))(o)?o.setGridSize(n,s):console.error("Layout does not support setGridSize")}},state:lg}),Cp=(e,t)=>{xl((()=>{((e,t,o)=>{const n=e.components();(e=>{N(e.components(),(e=>Ao(e.element))),Mo(e.element),e.syncComponents()})(e);const s=o(t),r=J(n,s);N(r,(t=>{ld(t),e.getSystem().removeFromWorld(t)})),N(s,(t=>{id(t)?md(e,t):(e.getSystem().addToWorld(t),md(e,t),dt(e.element)&&cd(t))})),e.syncComponents()})(e,t,(()=>P(t,e.getSystem().build)))}),e.element)},Op=(e,t)=>{xl((()=>{((o,n,s)=>{const r=o.components(),a=X(n,(e=>ca(e).toArray()));N(r,(e=>{V(a,e)||ud(e)}));const i=((e,t,o)=>Ia(e,t,((t,n)=>Va(e,n,t,o))))(e.element,t,e.getSystem().buildOrPatch),l=J(r,i);N(l,(e=>{id(e)&&ud(e)})),N(i,(e=>{id(e)||dd(o,e)})),o.syncComponents()})(e,t)}),e.element)},_p=(e,t,o,n)=>{ud(t);const s=Va(e.element,o,n,e.getSystem().buildOrPatch);dd(e,s),e.syncComponents()},Tp=(e,t,o)=>{const n=e.getSystem().build(o);pd(e,n,t)},Ep=(e,t,o,n)=>{fd(t),Tp(e,((e,t)=>((e,t,o)=>{et(e,o).fold((()=>{Eo(e,t)}),(e=>{Oo(e,t)}))})(e,t,o)),n)},Bp=(e,t)=>e.components(),Mp=(e,t,o,n,s)=>{const r=Bp(e);return B.from(r[n]).map((o=>(s.fold((()=>fd(o)),(s=>{(t.reuseDom?_p:Ep)(e,o,n,s)})),o)))};var Ap=Object.freeze({__proto__:null,append:(e,t,o,n)=>{Tp(e,Eo,n)},prepend:(e,t,o,n)=>{Tp(e,To,n)},remove:(e,t,o,n)=>{const s=Bp(e),r=G(s,(e=>je(n.element,e.element)));r.each(fd)},replaceAt:Mp,replaceBy:(e,t,o,n,s)=>{const r=Bp(e);return $(r,n).bind((o=>Mp(e,t,0,o,s)))},set:(e,t,o,n)=>(t.reuseDom?Op:Cp)(e,n),contents:Bp});const Dp=dl({fields:[us("reuseDom",!0)],name:"replacing",apis:Ap}),Fp=(e,t)=>{const o=((e,t)=>{const o=Or(t);return dl({fields:[Un("enabled")],name:e,active:{events:y(o)}})})(e,t);return{key:e,value:{config:{},me:o,configAsRaw:y({}),initialConfig:{},state:ua}}},Ip=(e,t)=>{t.ignore||(fl(e.element),t.onFocus(e))};var Vp=Object.freeze({__proto__:null,focus:Ip,blur:(e,t)=>{t.ignore||(e=>{e.dom.blur()})(e.element)},isFocused:e=>bl(e.element)}),Rp=Object.freeze({__proto__:null,exhibit:(e,t)=>{const o=t.ignore?{}:{attributes:{tabindex:"-1"}};return pa(o)},events:e=>Or([Er(Xs(),((t,o)=>{Ip(t,e),o.stop()}))].concat(e.stopMousedown?[Er(Ms(),((e,t)=>{t.event.prevent()}))]:[]))}),zp=[fi("onFocus"),as("stopMousedown",!1),as("ignore",!1)];const Hp=dl({fields:zp,name:"focusing",active:Rp,apis:Vp}),Pp=(e,t,o)=>{const n=t.aria;n.update(e,n,o.get())},Np=(e,t,o)=>{t.toggleClass.each((t=>{o.get()?_a(e.element,t):Ta(e.element,t)}))},Lp=(e,t,o)=>{jp(e,t,o,!o.get())},Wp=(e,t,o)=>{o.set(!0),Np(e,t,o),Pp(e,t,o)},Up=(e,t,o)=>{o.set(!1),Np(e,t,o),Pp(e,t,o)},jp=(e,t,o,n)=>{(n?Wp:Up)(e,t,o)},Gp=(e,t,o)=>{jp(e,t,o,t.selected)};var $p=Object.freeze({__proto__:null,onLoad:Gp,toggle:Lp,isOn:(e,t,o)=>o.get(),on:Wp,off:Up,set:jp}),qp=Object.freeze({__proto__:null,exhibit:()=>pa({}),events:(e,t)=>{const o=(n=e,s=t,r=Lp,Pr((e=>{r(e,n,s)})));var n,s,r;const a=rl(e,t,Gp);return Or(q([e.toggleOnExecute?[o]:[],[a]]))}});const Xp=(e,t,o)=>{pt(e.element,"aria-expanded",o)};var Kp=[as("selected",!1),Zn("toggleClass"),as("toggleOnExecute",!0),is("aria",{mode:"none"},Pn("mode",{pressed:[as("syncWithExpanded",!1),xi("update",((e,t,o)=>{pt(e.element,"aria-pressed",o),t.syncWithExpanded&&Xp(e,0,o)}))],checked:[xi("update",((e,t,o)=>{pt(e.element,"aria-checked",o)}))],expanded:[xi("update",Xp)],selected:[xi("update",((e,t,o)=>{pt(e.element,"aria-selected",o)}))],none:[xi("update",b)]}))];const Yp=dl({fields:Kp,name:"toggling",active:qp,apis:$p,state:(!1,{init:()=>{const e=hs(false);return{get:()=>e.get(),set:t=>e.set(t),clear:()=>e.set(false),readState:()=>e.get()}}})});const Jp=()=>{const e=(e,t)=>{t.stop(),wr(e)};return[Er(Ls(),e),Er(er(),e),Fr(_s()),Fr(Ms())]},Zp=e=>Or(q([e.map((e=>Pr(((t,o)=>{e(t),o.stop()})))).toArray(),Jp()])),Qp="alloy.item-hover",eh="alloy.item-focus",th=e=>{(yl(e.element).isNone()||Hp.isFocused(e))&&(Hp.isFocused(e)||Hp.focus(e),xr(e,Qp,{item:e}))},oh=e=>{xr(e,eh,{item:e})},nh=y(Qp),sh=y(eh),rh=[Un("data"),Un("components"),Un("dom"),as("hasSubmenu",!1),Zn("toggling"),tu("itemBehaviours",[Yp,Hp,kp,Jd]),as("ignoreFocus",!1),as("domModification",{}),xi("builder",(e=>({dom:e.dom,domModification:{...e.domModification,attributes:{role:e.toggling.isSome()?"menuitemcheckbox":"menuitem",...e.domModification.attributes,"aria-haspopup":e.hasSubmenu,...e.hasSubmenu?{"aria-expanded":!1}:{}}},behaviours:ou(e.itemBehaviours,[e.toggling.fold(Yp.revoke,(e=>Yp.config({aria:{mode:"checked"},...e}))),Hp.config({ignore:e.ignoreFocus,stopMousedown:e.ignoreFocus,onFocus:e=>{oh(e)}}),kp.config({mode:"execution"}),Jd.config({store:{mode:"memory",initialValue:e.data}}),Fp("item-type-events",[...Jp(),Er(Is(),th),Er(Qs(),Hp.focus)])]),components:e.components,eventOrder:e.eventOrder}))),as("eventOrder",{})],ah=[Un("dom"),Un("components"),xi("builder",(e=>({dom:e.dom,components:e.components,events:Or([Ir(Qs())])})))],ih=y("item-widget"),lh=y([Ou({name:"widget",overrides:e=>({behaviours:ll([Jd.config({store:{mode:"manual",getValue:t=>e.data,setValue:b}})])})})]),ch=[Un("uid"),Un("data"),Un("components"),Un("dom"),as("autofocus",!1),as("ignoreFocus",!1),tu("widgetBehaviours",[Jd,Hp,kp]),as("domModification",{}),$u(lh()),xi("builder",(e=>{const t=zu(ih(),e,lh()),o=Hu(ih(),e,t.internals()),n=t=>Pu(t,e,"widget").map((e=>(kp.focusIn(e),e))),s=(t,o)=>tm(o.event.target)?B.none():e.autofocus?(o.setSource(t.element),B.none()):B.none();return{dom:e.dom,components:o,domModification:e.domModification,events:Or([Pr(((e,t)=>{n(e).each((e=>{t.stop()}))})),Er(Is(),th),Er(Qs(),((t,o)=>{e.autofocus?n(t):Hp.focus(t)}))]),behaviours:ou(e.widgetBehaviours,[Jd.config({store:{mode:"memory",initialValue:e.data}}),Hp.config({ignore:e.ignoreFocus,onFocus:e=>{oh(e)}}),kp.config({mode:"special",focusIn:e.autofocus?e=>{n(e)}:gl(),onLeft:s,onRight:s,onEscape:(t,o)=>Hp.isFocused(t)||e.autofocus?e.autofocus?(o.setSource(t.element),B.none()):B.none():(Hp.focus(t),B.some(!0))})])}}))],dh=Pn("type",{widget:ch,item:rh,separator:ah}),uh=y([Eu({factory:{sketch:e=>{const t=zn("menu.spec item",dh,e);return t.builder(t)}},name:"items",unit:"item",defaults:(e,t)=>be(t,"uid")?t:{...t,uid:ta("item")},overrides:(e,t)=>({type:t.type,ignoreFocus:e.fakeFocus,domModification:{classes:[e.markers.item]}})})]),mh=y([Un("value"),Un("items"),Un("dom"),Un("components"),as("eventOrder",{}),Zd("menuBehaviours",[Em,Jd,sm,kp]),is("movement",{mode:"menu",moveOnTab:!0},Pn("mode",{grid:[Si(),xi("config",((e,t)=>({mode:"flatgrid",selector:"."+e.markers.item,initSize:{numColumns:t.initSize.numColumns,numRows:t.initSize.numRows},focusManager:e.focusManager})))],matrix:[xi("config",((e,t)=>({mode:"matrix",selectors:{row:t.rowSelector,cell:"."+e.markers.item},focusManager:e.focusManager}))),Un("rowSelector")],menu:[as("moveOnTab",!0),xi("config",((e,t)=>({mode:"menu",selector:"."+e.markers.item,moveOnTab:t.moveOnTab,focusManager:e.focusManager})))]})),jn("markers",ui()),as("fakeFocus",!1),as("focusManager",Km()),fi("onHighlight")]),gh=y("alloy.menu-focus"),ph=em({name:"Menu",configFields:mh(),partFields:uh(),factory:(e,t,o,n)=>({uid:e.uid,dom:e.dom,markers:e.markers,behaviours:eu(e.menuBehaviours,[Em.config({highlightClass:e.markers.selectedItem,itemClass:e.markers.item,onHighlight:e.onHighlight}),Jd.config({store:{mode:"memory",initialValue:e.value}}),sm.config({find:B.some}),kp.config(e.movement.config(e,e.movement))]),events:Or([Er(sh(),((e,t)=>{const o=t.event;e.getSystem().getByDom(o.target).each((o=>{Em.highlight(e,o),t.stop(),xr(e,gh(),{menu:e,item:o})}))})),Er(nh(),((e,t)=>{const o=t.event.item;Em.highlight(e,o)}))]),components:t,eventOrder:e.eventOrder,domModification:{attributes:{role:"menu"}}})}),hh=(e,t,o,n)=>fe(o,n).bind((n=>fe(e,n).bind((n=>{const s=hh(e,t,o,n);return B.some([n].concat(s))})))).getOr([]),fh=e=>"prepared"===e.type?B.some(e.menu):B.none(),bh=()=>{const e=hs({}),t=hs({}),o=hs({}),n=zl(),s=hs({}),r=e=>a(e).bind(fh),a=e=>fe(t.get(),e),i=t=>fe(e.get(),t);return{setMenuBuilt:(e,o)=>{t.set({...t.get(),[e]:{type:"prepared",menu:o}})},setContents:(r,a,i,l)=>{n.set(r),e.set(i),t.set(a),s.set(l);const c=((e,t)=>{const o={};le(e,((e,t)=>{N(e,(e=>{o[e]=t}))}));const n=t,s=de(t,((e,t)=>({k:e,v:t}))),r=ce(s,((e,t)=>[t].concat(hh(o,n,s,t))));return ce(o,(e=>fe(r,e).getOr([e])))})(l,i);o.set(c)},expand:t=>fe(e.get(),t).map((e=>{const n=fe(o.get(),t).getOr([]);return[e].concat(n)})),refresh:e=>fe(o.get(),e),collapse:e=>fe(o.get(),e).bind((e=>e.length>1?B.some(e.slice(1)):B.none())),lookupMenu:a,lookupItem:i,otherMenus:e=>{const t=s.get();return J(ae(t),e)},getPrimary:()=>n.get().bind(r),getMenus:()=>t.get(),clear:()=>{e.set({}),t.set({}),o.set({}),n.clear()},isClear:()=>n.get().isNone(),getTriggeringPath:(t,s)=>{const a=W(i(t).toArray(),(e=>r(e).isSome()));return fe(o.get(),t).bind((t=>{const o=Y(a.concat(t));return(e=>{const t=[];for(let o=0;o<e.length;o++){const n=e[o];if(!n.isSome())return B.none();t.push(n.getOrDie())}return B.some(t)})(X(o,((t,a)=>((t,o,n)=>r(t).bind((s=>(t=>pe(e.get(),((e,o)=>e===t)))(t).bind((e=>o(e).map((e=>({triggeredMenu:s,triggeringItem:e,triggeringPath:n}))))))))(t,s,o.slice(0,a+1)).fold((()=>ye(n.get(),t)?[]:[B.none()]),(e=>[B.some(e)])))))}))}}},vh=fh,yh=y("collapse-item"),xh=Qu({name:"TieredMenu",configFields:[yi("onExecute"),yi("onEscape"),vi("onOpenMenu"),vi("onOpenSubmenu"),fi("onRepositionMenu"),fi("onCollapseMenu"),as("highlightImmediately",!0),Kn("data",[Un("primary"),Un("menus"),Un("expansions")]),as("fakeFocus",!1),fi("onHighlight"),fi("onHover"),gi(),Un("dom"),as("navigateOnHover",!0),as("stayInDom",!1),Zd("tmenuBehaviours",[kp,Em,sm,Dp]),as("eventOrder",{})],apis:{collapseMenu:(e,t)=>{e.collapseMenu(t)},highlightPrimary:(e,t)=>{e.highlightPrimary(t)},repositionMenus:(e,t)=>{e.repositionMenus(t)}},factory:(e,t)=>{const o=zl(),n=bh(),s=e=>Jd.getValue(e).value,r=t=>ce(e.data.menus,((e,t)=>X(e.items,(e=>"separator"===e.type?[]:[e.data.value])))),a=(e,t)=>{Em.highlight(e,t),Em.getHighlighted(t).orThunk((()=>Em.getFirst(t))).each((t=>{Sr(e,t.element,Qs())}))},i=(e,t)=>xe(P(t,(t=>e.lookupMenu(t).bind((e=>"prepared"===e.type?B.some(e.menu):B.none()))))),l=(t,o,n)=>{const s=i(o,o.otherMenus(n));N(s,(o=>{Ma(o.element,[e.markers.backgroundMenu]),e.stayInDom||Dp.remove(t,o)}))},c=(t,n)=>{const r=(t=>o.get().getOrThunk((()=>{const n={},r=Ac(t.element,`.${e.markers.item}`),a=W(r,(e=>"true"===ft(e,"aria-haspopup")));return N(a,(e=>{t.getSystem().getByDom(e).each((e=>{const t=s(e);n[t]=e}))})),o.set(n),n})))(t);le(r,((e,t)=>{const o=V(n,t);pt(e.element,"aria-expanded",o)}))},d=(t,o,n)=>B.from(n[0]).bind((s=>o.lookupMenu(s).bind((s=>{if("notbuilt"===s.type)return B.none();{const r=s.menu,c=i(o,n.slice(1));return N(c,(t=>{_a(t.element,e.markers.backgroundMenu)})),dt(r.element)||Dp.append(t,Ga(r)),Ma(r.element,[e.markers.backgroundMenu]),a(t,r),l(t,o,n),B.some(r)}}))));let u;!function(e){e[e.HighlightSubmenu=0]="HighlightSubmenu",e[e.HighlightParent=1]="HighlightParent"}(u||(u={}));const m=(t,o,r=u.HighlightSubmenu)=>{if(o.hasConfigured(vm)&&vm.isDisabled(o))return B.some(o);{const a=s(o);return n.expand(a).bind((s=>(c(t,s),B.from(s[0]).bind((a=>n.lookupMenu(a).bind((i=>{const l=((e,t,o)=>{if("notbuilt"===o.type){const s=e.getSystem().build(o.nbMenu());return n.setMenuBuilt(t,s),s}return o.menu})(t,a,i);return dt(l.element)||Dp.append(t,Ga(l)),e.onOpenSubmenu(t,o,l,Y(s)),r===u.HighlightSubmenu?(Em.highlightFirst(l),d(t,n,s)):(Em.dehighlightAll(l),B.some(o))})))))))}},g=(t,o)=>{const r=s(o);return n.collapse(r).bind((s=>(c(t,s),d(t,n,s).map((n=>(e.onCollapseMenu(t,o,n),n))))))},p=t=>(o,n)=>ei(n.getSource(),"."+e.markers.item).bind((e=>o.getSystem().getByDom(e).toOptional().bind((e=>t(o,e).map(T))))),h=Or([Er(gh(),((e,t)=>{const o=t.event.item;n.lookupItem(s(o)).each((()=>{const o=t.event.menu;Em.highlight(e,o);const r=s(t.event.item);n.refresh(r).each((t=>l(e,n,t)))}))})),Pr(((t,o)=>{const n=o.event.target;t.getSystem().getByDom(n).each((o=>{0===s(o).indexOf("collapse-item")&&g(t,o),m(t,o,u.HighlightSubmenu).fold((()=>{e.onExecute(t,o)}),b)}))})),Rr(((t,o)=>{(t=>{const o=((t,o,n)=>ce(n,((n,s)=>{const r=()=>ph.sketch({...n,value:s,markers:e.markers,fakeFocus:e.fakeFocus,onHighlight:e.onHighlight,focusManager:e.fakeFocus?Ym():Km()});return s===o?{type:"prepared",menu:t.getSystem().build(r())}:{type:"notbuilt",nbMenu:r}})))(t,e.data.primary,e.data.menus),s=r();return n.setContents(e.data.primary,o,e.data.expansions,s),n.getPrimary()})(t).each((o=>{Dp.append(t,Ga(o)),e.onOpenMenu(t,o),e.highlightImmediately&&a(t,o)}))}))].concat(e.navigateOnHover?[Er(nh(),((t,o)=>{const r=o.event.item;((e,t)=>{const o=s(t);n.refresh(o).bind((t=>(c(e,t),d(e,n,t))))})(t,r),m(t,r,u.HighlightParent),e.onHover(t,r)}))]:[])),f=e=>Em.getHighlighted(e).bind(Em.getHighlighted),v={collapseMenu:e=>{f(e).each((t=>{g(e,t)}))},highlightPrimary:e=>{n.getPrimary().each((t=>{a(e,t)}))},repositionMenus:t=>{const o=n.getPrimary().bind((e=>f(t).bind((e=>{const t=s(e),o=he(n.getMenus()),r=xe(P(o,vh));return n.getTriggeringPath(t,(e=>((e,t,o)=>re(t,(e=>{if(!e.getSystem().isConnected())return B.none();const t=Em.getCandidates(e);return G(t,(e=>s(e)===o))})))(0,r,e)))})).map((t=>({primary:e,triggeringPath:t})))));o.fold((()=>{(e=>B.from(e.components()[0]).filter((e=>"menu"===ft(e.element,"role"))))(t).each((o=>{e.onRepositionMenu(t,o,[])}))}),(({primary:o,triggeringPath:n})=>{e.onRepositionMenu(t,o,n)}))}};return{uid:e.uid,dom:e.dom,markers:e.markers,behaviours:eu(e.tmenuBehaviours,[kp.config({mode:"special",onRight:p(((e,t)=>tm(t.element)?B.none():m(e,t,u.HighlightSubmenu))),onLeft:p(((e,t)=>tm(t.element)?B.none():g(e,t))),onEscape:p(((t,o)=>g(t,o).orThunk((()=>e.onEscape(t,o).map((()=>t)))))),focusIn:(e,t)=>{n.getPrimary().each((t=>{Sr(e,t.element,Qs())}))}}),Em.config({highlightClass:e.markers.selectedMenu,itemClass:e.markers.menu}),sm.config({find:e=>Em.getHighlighted(e)}),Dp.config({})]),eventOrder:e.eventOrder,apis:v,events:h}},extraApis:{tieredData:(e,t,o)=>({primary:e,menus:t,expansions:o}),singleData:(e,t)=>({primary:e,menus:bs(e,t),expansions:{}}),collapseItem:e=>({value:Xr(yh()),meta:{text:e}})}}),wh=Qu({name:"InlineView",configFields:[Un("lazySink"),fi("onShow"),fi("onHide"),ns("onEscape"),Zd("inlineBehaviours",[Ad,Jd,pl]),rs("fireDismissalEventInstead",[as("event",ur())]),rs("fireRepositionEventInstead",[as("event",mr())]),as("getRelated",B.none),as("isExtraPart",_),as("eventOrder",B.none)],factory:(e,t)=>{const o=(e,t,o,s)=>{n(e,t,o,(()=>s.map((e=>Lo(e)))))},n=(t,o,n,s)=>{const r=e.lazySink(t).getOrDie();Ad.openWhileCloaked(t,o,(()=>ad.positionWithinBounds(r,t,n,s()))),Jd.setValue(t,B.some({mode:"position",config:n,getBounds:s}))},s=(t,o,n,s)=>{const r=((e,t,o,n,s)=>{const r=()=>e.lazySink(t),a="horizontal"===n.type?{layouts:{onLtr:()=>tl(),onRtl:()=>ol()}}:{},i=e=>(e=>2===e.length)(e)?a:{};return xh.sketch({dom:{tag:"div"},data:n.data,markers:n.menu.markers,highlightImmediately:n.menu.highlightImmediately,onEscape:()=>(Ad.close(t),e.onEscape.map((e=>e(t))),B.some(!0)),onExecute:()=>B.some(!0),onOpenMenu:(e,t)=>{ad.positionWithinBounds(r().getOrDie(),t,o,s())},onOpenSubmenu:(e,t,o,n)=>{const s=r().getOrDie();ad.position(s,o,{anchor:{type:"submenu",item:t,...i(n)}})},onRepositionMenu:(e,t,n)=>{const a=r().getOrDie();ad.positionWithinBounds(a,t,o,s()),N(n,(e=>{const t=i(e.triggeringPath);ad.position(a,e.triggeredMenu,{anchor:{type:"submenu",item:e.triggeringItem,...t}})}))}})})(e,t,o,n,s);Ad.open(t,r),Jd.setValue(t,B.some({mode:"menu",menu:r}))},r=t=>{Ad.isOpen(t)&&Jd.getValue(t).each((o=>{switch(o.mode){case"menu":Ad.getState(t).each(xh.repositionMenus);break;case"position":const n=e.lazySink(t).getOrDie();ad.positionWithinBounds(n,t,o.config,o.getBounds())}}))},a={setContent:(e,t)=>{Ad.setContent(e,t)},showAt:(e,t,n)=>{o(e,t,n,B.none())},showWithin:o,showWithinBounds:n,showMenuAt:(e,t,o)=>{s(e,t,o,B.none)},showMenuWithinBounds:s,hide:e=>{Ad.isOpen(e)&&(Jd.setValue(e,B.none()),Ad.close(e))},getContent:e=>Ad.getState(e),reposition:r,isOpen:Ad.isOpen};return{uid:e.uid,dom:e.dom,behaviours:eu(e.inlineBehaviours,[Ad.config({isPartOf:(t,o,n)=>ni(o,n)||((t,o)=>e.getRelated(t).exists((e=>ni(e,o))))(t,n),getAttachPoint:t=>e.lazySink(t).getOrDie(),onOpen:t=>{e.onShow(t)},onClose:t=>{e.onHide(t)}}),Jd.config({store:{mode:"memory",initialValue:B.none()}}),pl.config({channels:{...Rd({isExtraPart:t.isExtraPart,...e.fireDismissalEventInstead.map((e=>({fireEventInstead:{event:e.event}}))).getOr({})}),...Hd({...e.fireRepositionEventInstead.map((e=>({fireEventInstead:{event:e.event}}))).getOr({}),doReposition:r})}})]),eventOrder:e.eventOrder,apis:a}},apis:{showAt:(e,t,o,n)=>{e.showAt(t,o,n)},showWithin:(e,t,o,n,s)=>{e.showWithin(t,o,n,s)},showWithinBounds:(e,t,o,n,s)=>{e.showWithinBounds(t,o,n,s)},showMenuAt:(e,t,o,n)=>{e.showMenuAt(t,o,n)},showMenuWithinBounds:(e,t,o,n,s)=>{e.showMenuWithinBounds(t,o,n,s)},hide:(e,t)=>{e.hide(t)},isOpen:(e,t)=>e.isOpen(t),getContent:(e,t)=>e.getContent(t),setContent:(e,t,o)=>{e.setContent(t,o)},reposition:(e,t)=>{e.reposition(t)}}});var Sh=tinymce.util.Tools.resolve("tinymce.util.Delay");const kh=Qu({name:"Button",factory:e=>{const t=Zp(e.action),o=e.dom.tag,n=t=>fe(e.dom,"attributes").bind((e=>fe(e,t)));return{uid:e.uid,dom:e.dom,components:e.components,events:t,behaviours:ou(e.buttonBehaviours,[Hp.config({}),kp.config({mode:"execution",useSpace:!0,useEnter:!0})]),domModification:{attributes:"button"===o?{type:n("type").getOr("button"),...n("role").map((e=>({role:e}))).getOr({})}:{role:n("role").getOr("button")}},eventOrder:e.eventOrder}},configFields:[as("uid",void 0),Un("dom"),as("components",[]),tu("buttonBehaviours",[Hp,kp]),Zn("action"),Zn("role"),as("eventOrder",{})]}),Ch=e=>{const t=(e=>void 0!==e.uid)(e)&&ve(e,"uid")?e.uid:ta("memento");return{get:e=>e.getSystem().getByUid(t).getOrDie(),getOpt:e=>e.getSystem().getByUid(t).toOptional(),asSpec:()=>({...e,uid:t})}};var Oh=tinymce.util.Tools.resolve("tinymce.util.I18n");const _h={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},Th="temporary-placeholder",Eh=e=>()=>fe(e,Th).getOr("!not found!"),Bh=(e,t)=>{const o=e.toLowerCase();if(Oh.isRtl()){const e=((e,t)=>Oe(e,t)?e:((e,t)=>e+"-rtl")(e))(o,"-rtl");return be(t,e)?e:o}return o},Mh=(e,t)=>fe(t,Bh(e,t)),Ah=(e,t)=>{const o=t();return Mh(e,o).getOrThunk(Eh(o))},Dh=()=>Fp("add-focusable",[Rr((e=>{Za(e.element,"svg").each((e=>pt(e,"focusable","false")))}))]),Fh=(e,t,o,n)=>{var s,r;const a=(e=>!!Oh.isRtl()&&be(_h,e))(t)?["tox-icon--flip"]:[],i=fe(o,Bh(t,o)).or(n).getOrThunk(Eh(o));return{dom:{tag:e.tag,attributes:null!==(s=e.attributes)&&void 0!==s?s:{},classes:e.classes.concat(a),innerHtml:i},behaviours:ll([...null!==(r=e.behaviours)&&void 0!==r?r:[],Dh()])}},Ih=(e,t,o,n=B.none())=>Fh(t,e,o(),n),Vh={success:"checkmark",error:"warning",err:"error",warning:"warning",warn:"warning",info:"info"},Rh=Qu({name:"Notification",factory:e=>{const t=Ch({dom:{tag:"p",innerHtml:e.translationProvider(e.text)},behaviours:ll([Dp.config({})])}),o=e=>({dom:{tag:"div",classes:["tox-bar"],styles:{width:`${e}%`}}}),n=e=>({dom:{tag:"div",classes:["tox-text"],innerHtml:`${e}%`}}),s=Ch({dom:{tag:"div",classes:e.progress?["tox-progress-bar","tox-progress-indicator"]:["tox-progress-bar"]},components:[{dom:{tag:"div",classes:["tox-bar-container"]},components:[o(0)]},n(0)],behaviours:ll([Dp.config({})])}),r={updateProgress:(e,t)=>{e.getSystem().isConnected()&&s.getOpt(e).each((e=>{Dp.set(e,[{dom:{tag:"div",classes:["tox-bar-container"]},components:[o(t)]},n(t)])}))},updateText:(e,o)=>{if(e.getSystem().isConnected()){const n=t.get(e);Dp.set(n,[Na(o)])}}},a=q([e.icon.toArray(),e.level.toArray(),e.level.bind((e=>B.from(Vh[e]))).toArray()]),i=Ch(kh.sketch({dom:{tag:"button",classes:["tox-notification__dismiss","tox-button","tox-button--naked","tox-button--icon"]},components:[Ih("close",{tag:"div",classes:["tox-icon"],attributes:{"aria-label":e.translationProvider("Close")}},e.iconProvider)],action:t=>{e.onAction(t)}})),l=((e,t,o)=>{const n=o(),s=G(e,(e=>be(n,Bh(e,n))));return Fh({tag:"div",classes:["tox-notification__icon"]},s.getOr(Th),n,B.none())})(a,0,e.iconProvider),c=[l,{dom:{tag:"div",classes:["tox-notification__body"]},components:[t.asSpec()],behaviours:ll([Dp.config({})])}];return{uid:e.uid,dom:{tag:"div",attributes:{role:"alert"},classes:e.level.map((e=>["tox-notification","tox-notification--in",`tox-notification--${e}`])).getOr(["tox-notification","tox-notification--in"])},behaviours:ll([Hp.config({}),Fp("notification-events",[Er(Vs(),(e=>{i.getOpt(e).each(Hp.focus)}))])]),components:c.concat(e.progress?[s.asSpec()]:[]).concat(e.closeButton?[i.asSpec()]:[]),apis:r}},configFields:[Zn("level"),Un("progress"),Un("icon"),Un("onAction"),Un("text"),Un("iconProvider"),Un("translationProvider"),us("closeButton",!0)],apis:{updateProgress:(e,t,o)=>{e.updateProgress(t,o)},updateText:(e,t,o)=>{e.updateText(t,o)}}});var zh,Hh,Ph=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),Nh=tinymce.util.Tools.resolve("tinymce.EditorManager"),Lh=tinymce.util.Tools.resolve("tinymce.Env");!function(e){e.default="wrap",e.floating="floating",e.sliding="sliding",e.scrolling="scrolling"}(zh||(zh={})),function(e){e.auto="auto",e.top="top",e.bottom="bottom"}(Hh||(Hh={}));const Wh=e=>t=>t.options.get(e),Uh=e=>t=>B.from(e(t)),jh=e=>{const t=Lh.deviceType.isPhone(),o=Lh.deviceType.isTablet()||t,n=e.options.register,s=e=>r(e)||!1===e,a=e=>r(e)||h(e);n("skin",{processor:e=>r(e)||!1===e,default:"oxide"}),n("skin_url",{processor:"string"}),n("height",{processor:a,default:Math.max(e.getElement().offsetHeight,400)}),n("width",{processor:a,default:Ph.DOM.getStyle(e.getElement(),"width")}),n("min_height",{processor:"number",default:100}),n("min_width",{processor:"number"}),n("max_height",{processor:"number"}),n("max_width",{processor:"number"}),n("style_formats",{processor:"object[]"}),n("style_formats_merge",{processor:"boolean",default:!1}),n("style_formats_autohide",{processor:"boolean",default:!1}),n("line_height_formats",{processor:"string",default:"1 1.1 1.2 1.3 1.4 1.5 2"}),n("font_family_formats",{processor:"string",default:"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"}),n("font_size_formats",{processor:"string",default:"8pt 10pt 12pt 14pt 18pt 24pt 36pt"}),n("block_formats",{processor:"string",default:"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre"}),n("content_langs",{processor:"object[]"}),n("removed_menuitems",{processor:"string",default:""}),n("menubar",{processor:e=>r(e)||d(e),default:!t}),n("menu",{processor:"object",default:{}}),n("toolbar",{processor:e=>d(e)||r(e)||l(e)?{value:e,valid:!0}:{valid:!1,message:"Must be a boolean, string or array."},default:!0}),z(9,(e=>{n("toolbar"+(e+1),{processor:"string"})})),n("toolbar_mode",{processor:"string",default:o?"scrolling":"floating"}),n("toolbar_groups",{processor:"object",default:{}}),n("toolbar_location",{processor:"string",default:Hh.auto}),n("toolbar_persist",{processor:"boolean",default:!1}),n("toolbar_sticky",{processor:"boolean",default:e.inline}),n("toolbar_sticky_offset",{processor:"number",default:0}),n("fixed_toolbar_container",{processor:"string",default:""}),n("fixed_toolbar_container_target",{processor:"object"}),n("file_picker_callback",{processor:"function"}),n("file_picker_validator_handler",{processor:"function"}),n("file_picker_types",{processor:"string"}),n("typeahead_urls",{processor:"boolean",default:!0}),n("anchor_top",{processor:s,default:"#top"}),n("anchor_bottom",{processor:s,default:"#bottom"}),n("draggable_modal",{processor:"boolean",default:!1}),n("statusbar",{processor:"boolean",default:!0}),n("elementpath",{processor:"boolean",default:!0}),n("branding",{processor:"boolean",default:!0}),n("resize",{processor:e=>"both"===e||d(e),default:!Lh.deviceType.isTouch()})},Gh=Wh("readonly"),$h=Wh("height"),qh=Wh("width"),Xh=Uh(Wh("min_width")),Kh=Uh(Wh("min_height")),Yh=Uh(Wh("max_width")),Jh=Uh(Wh("max_height")),Zh=Uh(Wh("style_formats")),Qh=Wh("style_formats_merge"),ef=Wh("style_formats_autohide"),tf=Wh("content_langs"),of=Wh("removed_menuitems"),nf=Wh("toolbar_mode"),sf=Wh("toolbar_groups"),rf=Wh("toolbar_location"),af=Wh("fixed_toolbar_container"),lf=Wh("fixed_toolbar_container_target"),cf=Wh("toolbar_persist"),df=Wh("toolbar_sticky_offset"),uf=Wh("menubar"),mf=Wh("toolbar"),gf=Wh("file_picker_callback"),pf=Wh("file_picker_validator_handler"),hf=Wh("file_picker_types"),ff=Wh("typeahead_urls"),bf=Wh("anchor_top"),vf=Wh("anchor_bottom"),yf=Wh("draggable_modal"),xf=Wh("statusbar"),wf=Wh("elementpath"),Sf=Wh("branding"),kf=Wh("resize"),Cf=Wh("paste_as_text"),Of=e=>!1===e.options.get("skin"),_f=e=>!1!==e.options.get("menubar"),Tf=e=>{const t=e.options.get("skin_url");if(Of(e))return t;if(t)return e.documentBaseURI.toAbsolute(t);{const t=e.options.get("skin");return Nh.baseURL+"/skins/ui/"+t}},Ef=e=>e.options.get("line_height_formats").split(" "),Bf=e=>{const t=mf(e),o=r(t),n=l(t)&&t.length>0;return!Af(e)&&(n||o||!0===t)},Mf=e=>{const t=z(9,(t=>e.options.get("toolbar"+(t+1)))),o=W(t,r);return Se(o.length>0,o)},Af=e=>Mf(e).fold((()=>{const t=mf(e);return f(t,r)&&t.length>0}),T),Df=e=>rf(e)===Hh.bottom,Ff=e=>{if(!e.inline)return B.none();const t=af(e);if(t.length>0)return Qa(ut(),t);const o=lf(e);return g(o)?B.some(Fe(o)):B.none()},If=e=>e.inline&&Ff(e).isSome(),Vf=e=>Ff(e).getOrThunk((()=>it(at(Fe(e.getElement()))))),Rf=e=>e.inline&&!_f(e)&&!Bf(e)&&!Af(e),zf=e=>(e.options.get("toolbar_sticky")||e.inline)&&!If(e)&&!Rf(e),Hf=e=>{const t=e.options.get("menu");return ce(t,(e=>({...e,items:e.items})))};var Pf=Object.freeze({__proto__:null,get ToolbarMode(){return zh},get ToolbarLocation(){return Hh},register:jh,getSkinUrl:Tf,isReadOnly:Gh,isSkinDisabled:Of,getHeightOption:$h,getWidthOption:qh,getMinWidthOption:Xh,getMinHeightOption:Kh,getMaxWidthOption:Yh,getMaxHeightOption:Jh,getUserStyleFormats:Zh,shouldMergeStyleFormats:Qh,shouldAutoHideStyleFormats:ef,getLineHeightFormats:Ef,getContentLanguages:tf,getRemovedMenuItems:of,isMenubarEnabled:_f,isMultipleToolbars:Af,isToolbarEnabled:Bf,isToolbarPersist:cf,getMultipleToolbarsOption:Mf,getUiContainer:Vf,useFixedContainer:If,getToolbarMode:nf,isDraggableModal:yf,isDistractionFree:Rf,isStickyToolbar:zf,getStickyToolbarOffset:df,getToolbarLocation:rf,isToolbarLocationBottom:Df,getToolbarGroups:sf,getMenus:Hf,getMenubar:uf,getToolbar:mf,getFilePickerCallback:gf,getFilePickerTypes:hf,useTypeaheadUrls:ff,getAnchorTop:bf,getAnchorBottom:vf,getFilePickerValidatorHandler:pf,useStatusBar:xf,useElementPath:wf,useBranding:Sf,getResize:kf,getPasteAsText:Cf});const Nf="[data-mce-autocompleter]",Lf=e=>ei(e,Nf);var Wf;!function(e){e[e.CLOSE_ON_EXECUTE=0]="CLOSE_ON_EXECUTE",e[e.BUBBLE_TO_SANDBOX=1]="BUBBLE_TO_SANDBOX"}(Wf||(Wf={}));var Uf=Wf;const jf="tox-menu-nav__js",Gf="tox-collection__item",$f={normal:jf,color:"tox-swatch"},qf="tox-collection__item--enabled",Xf="tox-collection__item-icon",Kf="tox-collection__item-label",Yf="tox-collection__item-caret",Jf="tox-collection__item--active",Zf="tox-collection__item-container",Qf="tox-collection__item-container--row",eb=e=>fe($f,e).getOr(jf),tb=e=>"color"===e?"tox-swatches":"tox-menu",ob=e=>({backgroundMenu:"tox-background-menu",selectedMenu:"tox-selected-menu",selectedItem:"tox-collection__item--active",hasIcons:"tox-menu--has-icons",menu:tb(e),tieredMenu:"tox-tiered-menu"}),nb=e=>{const t=ob(e);return{backgroundMenu:t.backgroundMenu,selectedMenu:t.selectedMenu,menu:t.menu,selectedItem:t.selectedItem,item:eb(e)}},sb=(e,t,o)=>{const n=ob(o);return{tag:"div",classes:q([[n.menu,`tox-menu-${t}-column`],e?[n.hasIcons]:[]])}},rb=[ph.parts.items({})],ab=(e,t,o)=>{const n=ob(o);return{dom:{tag:"div",classes:q([[n.tieredMenu]])},markers:nb(o)}},ib=(e,t)=>o=>{const n=H(o,t);return P(n,(t=>({dom:e,components:t})))},lb=(e,t)=>{const o=[];let n=[];return N(e,((e,s)=>{t(e,s)?(n.length>0&&o.push(n),n=[],(be(e.dom,"innerHtml")||e.components.length>0)&&n.push(e)):n.push(e)})),n.length>0&&o.push(n),P(o,(e=>({dom:{tag:"div",classes:["tox-collection__group"]},components:e})))},cb=(e,t,o=!0)=>({dom:{tag:"div",classes:["tox-menu","tox-collection"].concat(1===e?["tox-collection--list"]:["tox-collection--grid"])},components:[ph.parts.items({preprocess:o=>"auto"!==e&&e>1?ib({tag:"div",classes:["tox-collection__group"]},e)(o):lb(o,((e,o)=>"separator"===t[o].type))})]}),db=e=>R(e,(e=>"icon"in e&&void 0!==e.icon)),ub=e=>(console.error(Hn(e)),console.log(e),B.none()),mb=(e,t,o,n,s)=>{const r=(a=o,{dom:{tag:"div",classes:["tox-collection","tox-collection--horizontal"]},components:[ph.parts.items({preprocess:e=>lb(e,((e,t)=>"separator"===a[t].type))})]});var a;return{value:e,dom:r.dom,components:r.components,items:o}},gb=(e,t,o,n,s)=>{if("color"===s){const t=(e=>({dom:{tag:"div",classes:["tox-menu","tox-swatches-menu"]},components:[{dom:{tag:"div",classes:["tox-swatches"]},components:[ph.parts.items({preprocess:"auto"!==e?ib({tag:"div",classes:["tox-swatches__row"]},e):x})]}]}))(n);return{value:e,dom:t.dom,components:t.components,items:o}}if("normal"===s&&"auto"===n){const t=cb(n,o);return{value:e,dom:t.dom,components:t.components,items:o}}if("normal"===s&&1===n){const t=cb(1,o);return{value:e,dom:t.dom,components:t.components,items:o}}if("normal"===s){const t=cb(n,o);return{value:e,dom:t.dom,components:t.components,items:o}}if("listpreview"===s&&"auto"!==n){const t=(e=>({dom:{tag:"div",classes:["tox-menu","tox-collection","tox-collection--toolbar","tox-collection--toolbar-lg"]},components:[ph.parts.items({preprocess:ib({tag:"div",classes:["tox-collection__group"]},e)})]}))(n);return{value:e,dom:t.dom,components:t.components,items:o}}return{value:e,dom:sb(t,n,s),components:rb,items:o}},pb=$n("type"),hb=$n("name"),fb=$n("label"),bb=$n("text"),vb=$n("title"),yb=$n("icon"),xb=$n("value"),wb=Xn("fetch"),Sb=Xn("getSubmenuItems"),kb=Xn("onAction"),Cb=Xn("onItemAction"),Ob=ms("onSetup",(()=>b)),_b=ts("name"),Tb=ts("text"),Eb=ts("icon"),Bb=ts("tooltip"),Mb=ts("label"),Ab=ts("shortcut"),Db=ns("select"),Fb=us("active",!1),Ib=us("borderless",!1),Vb=us("enabled",!0),Rb=us("primary",!1),zb=e=>as("columns",e),Hb=as("meta",{}),Pb=ms("onAction",b),Nb=e=>cs("type",e),Lb=e=>Nn("name","name",rn((()=>Xr(`${e}-name`))),Tn),Wb=yn([pb,Tb]),Ub=yn([Nb("autocompleteitem"),Fb,Vb,Hb,xb,Tb,Eb]),jb=[Vb,Bb,Eb,Tb,Ob],Gb=yn([pb,kb].concat(jb)),$b=e=>Vn("toolbarbutton",Gb,e),qb=[Fb].concat(jb),Xb=yn(qb.concat([pb,kb])),Kb=e=>Vn("ToggleButton",Xb,e),Yb=[ms("predicate",_),ds("scope","node",["node","editor"]),ds("position","selection",["node","selection","line"])],Jb=jb.concat([Nb("contextformbutton"),Rb,kb,Ln("original",x)]),Zb=qb.concat([Nb("contextformbutton"),Rb,kb,Ln("original",x)]),Qb=jb.concat([Nb("contextformbutton")]),ev=qb.concat([Nb("contextformtogglebutton")]),tv=Pn("type",{contextformbutton:Jb,contextformtogglebutton:Zb}),ov=yn([Nb("contextform"),ms("initValue",y("")),Mb,Jn("commands",tv),Qn("launch",Pn("type",{contextformbutton:Qb,contextformtogglebutton:ev}))].concat(Yb)),nv=yn([Nb("contexttoolbar"),$n("items")].concat(Yb)),sv=[pb,$n("src"),ts("alt"),gs("classes",[],Tn)],rv=yn(sv),av=[pb,bb,_b,gs("classes",["tox-collection__item-label"],Tn)],iv=yn(av),lv=fn((()=>Dn("type",{cardimage:rv,cardtext:iv,cardcontainer:cv}))),cv=yn([pb,cs("direction","horizontal"),cs("align","left"),cs("valign","middle"),Jn("items",lv)]),dv=[Vb,Tb,Ab,("menuitem",Nn("value","value",rn((()=>Xr("menuitem-value"))),Cn())),Hb];const uv=yn([pb,Mb,Jn("items",lv),Ob,Pb].concat(dv)),mv=yn([pb,Fb,Eb].concat(dv)),gv=[pb,$n("fancytype"),Pb],pv=[as("initData",{})].concat(gv),hv=[ps("initData",{},[us("allowCustomColors",!0),ss("colors",Cn())])].concat(gv),fv=Pn("fancytype",{inserttable:pv,colorswatch:hv}),bv=yn([pb,Ob,Pb,Eb].concat(dv)),vv=yn([pb,Sb,Ob,Eb].concat(dv)),yv=yn([pb,Eb,Fb,Ob,kb].concat(dv)),xv=(e,t,o)=>{const n=Ac(e.element,"."+o);if(n.length>0){const e=$(n,(e=>{const o=e.dom.getBoundingClientRect().top,s=n[0].dom.getBoundingClientRect().top;return Math.abs(o-s)>t})).getOr(n.length);return B.some({numColumns:e,numRows:Math.ceil(n.length/e)})}return B.none()},wv=e=>((e,t)=>ll([Fp(e,t)]))(Xr("unnamed-events"),e),Sv=Xr("tooltip.exclusive"),kv=Xr("tooltip.show"),Cv=Xr("tooltip.hide"),Ov=(e,t,o)=>{e.getSystem().broadcastOn([Sv],{})};var _v=Object.freeze({__proto__:null,hideAllExclusive:Ov,setComponents:(e,t,o,n)=>{o.getTooltip().each((e=>{e.getSystem().isConnected()&&Dp.set(e,n)}))}}),Tv=Object.freeze({__proto__:null,events:(e,t)=>{const o=o=>{t.getTooltip().each((n=>{fd(n),e.onHide(o,n),t.clearTooltip()})),t.clearTimer()};return Or(q([[Er(kv,(o=>{t.resetTimer((()=>{(o=>{if(!t.isShowing()){Ov(o);const n=e.lazySink(o).getOrDie(),s=o.getSystem().build({dom:e.tooltipDom,components:e.tooltipComponents,events:Or("normal"===e.mode?[Er(Is(),(e=>{yr(o,kv)})),Er(Ds(),(e=>{yr(o,Cv)}))]:[]),behaviours:ll([Dp.config({})])});t.setTooltip(s),gd(n,s),e.onShow(o,s),ad.position(n,s,{anchor:e.anchor(o)})}})(o)}),e.delay)})),Er(Cv,(n=>{t.resetTimer((()=>{o(n)}),e.delay)})),Er(Js(),((e,t)=>{const n=t;n.universal||V(n.channels,Sv)&&o(e)})),zr((e=>{o(e)}))],"normal"===e.mode?[Er(Vs(),(e=>{yr(e,kv)})),Er(Ks(),(e=>{yr(e,Cv)})),Er(Is(),(e=>{yr(e,kv)})),Er(Ds(),(e=>{yr(e,Cv)}))]:[Er(br(),((e,t)=>{yr(e,kv)})),Er(vr(),(e=>{yr(e,Cv)}))]]))}}),Ev=[Un("lazySink"),Un("tooltipDom"),as("exclusive",!0),as("tooltipComponents",[]),as("delay",300),ds("mode","normal",["normal","follow-highlight"]),as("anchor",(e=>({type:"hotspot",hotspot:e,layouts:{onLtr:y([Xi,qi,Ui,Gi,ji,$i]),onRtl:y([Xi,qi,Ui,Gi,ji,$i])}}))),fi("onHide"),fi("onShow")];const Bv=dl({fields:Ev,name:"tooltipping",active:Tv,state:Object.freeze({__proto__:null,init:()=>{const e=zl(),t=zl(),o=()=>{e.on(clearTimeout)},n=y("not-implemented");return ma({getTooltip:t.get,isShowing:t.isSet,setTooltip:t.set,clearTooltip:t.clear,clearTimer:o,resetTimer:(t,n)=>{o(),e.set(setTimeout(t,n))},readState:n})}}),apis:_v}),Mv="silver.readonly",Av=yn([("readonly",jn("readonly",En))]);const Dv=(e,t)=>{const o=e.outerContainer.element;t&&(e.mothership.broadcastOn([Dd()],{target:o}),e.uiMothership.broadcastOn([Dd()],{target:o})),e.mothership.broadcastOn([Mv],{readonly:t}),e.uiMothership.broadcastOn([Mv],{readonly:t})},Fv=(e,t)=>{e.on("init",(()=>{e.mode.isReadOnly()&&Dv(t,!0)})),e.on("SwitchMode",(()=>Dv(t,e.mode.isReadOnly()))),Gh(e)&&e.mode.set("readonly")},Iv=()=>pl.config({channels:{[Mv]:{schema:Av,onReceive:(e,t)=>{vm.set(e,t.readonly)}}}}),Vv=e=>vm.config({disabled:e}),Rv=e=>vm.config({disabled:e,disableClass:"tox-tbtn--disabled"}),zv=e=>vm.config({disabled:e,disableClass:"tox-tbtn--disabled",useNative:!1}),Hv=(e,t)=>{const o=e.getApi(t);return e=>{e(o)}},Pv=(e,t)=>Rr((o=>{Hv(e,o)((o=>{const n=e.onSetup(o);p(n)&&t.set(n)}))})),Nv=(e,t)=>zr((o=>Hv(e,o)(t.get()))),Lv=(e,t)=>Pr(((o,n)=>{Hv(e,o)(e.onAction),e.triggersSubmenu||t!==Uf.CLOSE_ON_EXECUTE||(o.getSystem().isConnected()&&yr(o,or()),n.stop())})),Wv={[Zs()]:["disabling","alloy.base.behaviour","toggling","item-events"]},Uv=xe,jv=(e,t,o,n)=>{const s=hs(b);return{type:"item",dom:t.dom,components:Uv(t.optComponents),data:e.data,eventOrder:Wv,hasSubmenu:e.triggersSubmenu,itemBehaviours:ll([Fp("item-events",[Lv(e,o),Pv(e,s),Nv(e,s)]),(r=()=>!e.enabled||n.isDisabled(),vm.config({disabled:r,disableClass:"tox-collection__item--state-disabled"})),Iv(),Dp.config({})].concat(e.itemBehaviours))};var r},Gv=e=>({value:e.value,meta:{text:e.text.getOr(""),...e.meta}}),$v=e=>{const t=Lh.os.isMacOS()||Lh.os.isiOS(),o=t?{alt:"\u2325",ctrl:"\u2303",shift:"\u21e7",meta:"\u2318",access:"\u2303\u2325"}:{meta:"Ctrl",access:"Shift+Alt"},n=e.split("+"),s=P(n,(e=>{const t=e.toLowerCase().trim();return be(o,t)?o[t]:e}));return t?s.join(""):s.join("+")},qv=(e,t,o=[Xf])=>Ih(e,{tag:"div",classes:o},t),Xv=e=>({dom:{tag:"div",classes:[Kf]},components:[Na(Oh.translate(e))]}),Kv=(e,t)=>({dom:{tag:"div",classes:t,innerHtml:e}}),Yv=(e,t)=>({dom:{tag:"div",classes:[Kf]},components:[{dom:{tag:e.tag,styles:e.styles},components:[Na(Oh.translate(t))]}]}),Jv=e=>({dom:{tag:"div",classes:["tox-collection__item-accessory"]},components:[Na($v(e))]}),Zv=e=>qv("checkmark",e,["tox-collection__item-checkmark"]),Qv=e=>{const t=e.map((e=>({attributes:{title:Oh.translate(e)}}))).getOr({});return{tag:"div",classes:[jf,Gf],...t}},ey=(e,t,o,n=B.none())=>"color"===e.presets?((e,t,o)=>{const n=e.ariaLabel,s=e.value,r=e.iconContent.map((e=>((e,t,o)=>{const n=t();return Mh(e,n).or(o).getOrThunk(Eh(n))})(e,t.icons,o)));return{dom:(()=>{const e=r.getOr(""),o=n.map((e=>({title:t.translate(e)}))).getOr({}),a={tag:"div",attributes:o,classes:["tox-swatch"]};return"custom"===s?{...a,tag:"button",classes:[...a.classes,"tox-swatches__picker-btn"],innerHtml:e}:"remove"===s?{...a,classes:[...a.classes,"tox-swatch--remove"],innerHtml:e}:{...a,attributes:{...a.attributes,"data-mce-color":s},styles:{"background-color":s}}})(),optComponents:[]}})(e,t,n):((e,t,o,n)=>{const s={tag:"div",classes:[Xf]},r=o?e.iconContent.map((e=>Ih(e,s,t.icons,n))).orThunk((()=>B.some({dom:s}))):B.none(),a=e.checkMark,i=B.from(e.meta).fold((()=>Xv),(e=>be(e,"style")?S(Yv,e.style):Xv)),l=e.htmlContent.fold((()=>e.textContent.map(i)),(e=>B.some(Kv(e,[Kf]))));return{dom:Qv(e.ariaLabel),optComponents:[r,l,e.shortcutContent.map(Jv),a,e.caret]}})(e,t,o,n),ty=(e,t)=>fe(e,"tooltipWorker").map((e=>[Bv.config({lazySink:t.getSink,tooltipDom:{tag:"div",classes:["tox-tooltip-worker-container"]},tooltipComponents:[],anchor:e=>({type:"submenu",item:e,overrides:{maxHeightFunction:ql}}),mode:"follow-highlight",onShow:(t,o)=>{e((e=>{Bv.setComponents(t,[La({element:Fe(e)})])}))}})])).getOr([]),oy=(e,t)=>{const o=(e=>Ph.DOM.encode(e))(Oh.translate(e));if(t.length>0){const e=new RegExp((e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"))(t),"gi");return o.replace(e,(e=>`<span class="tox-autocompleter-highlight">${e}</span>`))}return o},ny=(e,t)=>P(e,(e=>{switch(e.type){case"cardcontainer":return((e,t)=>{const o="vertical"===e.direction?"tox-collection__item-container--column":Qf,n="left"===e.align?"tox-collection__item-container--align-left":"tox-collection__item-container--align-right";return{dom:{tag:"div",classes:[Zf,o,n,(()=>{switch(e.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:t}})(e,ny(e.items,t));case"cardimage":return((e,t,o)=>({dom:{tag:"img",classes:t,attributes:{src:e,alt:o.getOr("")}}}))(e.src,e.classes,e.alt);case"cardtext":const o=e.name.exists((e=>V(t.cardText.highlightOn,e))),n=o?B.from(t.cardText.matchText).getOr(""):"";return Kv(oy(e.text,n),e.classes)}})),sy=Du(ih(),lh()),ry=e=>({value:e}),ay=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,iy=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,ly=e=>ay.test(e)||iy.test(e),cy=e=>{return(t=e,((e,t)=>ke(e,t,0))(t,"#")?((e,t)=>e.substring(t))(t,"#".length):t).toUpperCase();var t},dy=e=>{const t=e.toString(16);return(1===t.length?"0"+t:t).toUpperCase()},uy=e=>{const t=dy(e.red)+dy(e.green)+dy(e.blue);return ry(t)},my=Math.min,gy=Math.max,py=Math.round,hy=/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/i,fy=/^\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?(?:\.\d+)?)\s*\)\s*$/i,by=(e,t,o,n)=>({red:e,green:t,blue:o,alpha:n}),vy=e=>{const t=parseInt(e,10);return t.toString()===e&&t>=0&&t<=255},yy=e=>{let t,o,n;const s=(e.hue||0)%360;let r=e.saturation/100,a=e.value/100;if(r=gy(0,my(r,1)),a=gy(0,my(a,1)),0===r)return t=o=n=py(255*a),by(t,o,n,1);const i=s/60,l=a*r,c=l*(1-Math.abs(i%2-1)),d=a-l;switch(Math.floor(i)){case 0:t=l,o=c,n=0;break;case 1:t=c,o=l,n=0;break;case 2:t=0,o=l,n=c;break;case 3:t=0,o=c,n=l;break;case 4:t=c,o=0,n=l;break;case 5:t=l,o=0,n=c;break;default:t=o=n=0}return t=py(255*(t+d)),o=py(255*(o+d)),n=py(255*(n+d)),by(t,o,n,1)},xy=e=>{const t=(e=>{const t=(e=>{const t=e.value.replace(ay,((e,t,o,n)=>t+t+o+o+n+n));return{value:t}})(e),o=iy.exec(t.value);return null===o?["FFFFFF","FF","FF","FF"]:o})(e),o=parseInt(t[1],16),n=parseInt(t[2],16),s=parseInt(t[3],16);return by(o,n,s,1)},wy=(e,t,o,n)=>{const s=parseInt(e,10),r=parseInt(t,10),a=parseInt(o,10),i=parseFloat(n);return by(s,r,a,i)},Sy=e=>{if("transparent"===e)return B.some(by(0,0,0,0));const t=hy.exec(e);if(null!==t)return B.some(wy(t[1],t[2],t[3],"1"));const o=fy.exec(e);return null!==o?B.some(wy(o[1],o[2],o[3],o[4])):B.none()},ky=e=>`rgba(${e.red},${e.green},${e.blue},${e.alpha})`,Cy=by(255,0,0,1),Oy=(e,t)=>e.dispatch("ResizeContent",t),_y=(e,t,o)=>({hue:e,saturation:t,value:o}),Ty=e=>{let t=0,o=0,n=0;const s=e.red/255,r=e.green/255,a=e.blue/255,i=Math.min(s,Math.min(r,a)),l=Math.max(s,Math.max(r,a));return i===l?(n=i,_y(0,0,100*n)):(t=s===i?3:a===i?1:5,t=60*(t-(s===i?r-a:a===i?s-r:a-s)/(l-i)),o=(l-i)/l,n=l,_y(Math.round(t),Math.round(100*o),Math.round(100*n)))},Ey=e=>uy(yy(e)),By=e=>{return(t=e,ly(t)?B.some({value:cy(t)}):B.none()).orThunk((()=>Sy(e).map(uy))).getOrThunk((()=>{const t=document.createElement("canvas");t.height=1,t.width=1;const o=t.getContext("2d");o.clearRect(0,0,t.width,t.height),o.fillStyle="#FFFFFF",o.fillStyle=e,o.fillRect(0,0,1,1);const n=o.getImageData(0,0,1,1).data,s=n[0],r=n[1],a=n[2],i=n[3];return uy(by(s,r,a,i))}));var t};var My=tinymce.util.Tools.resolve("tinymce.util.LocalStorage");const Ay="tinymce-custom-colors",Dy=((e=10)=>{const t=My.getItem(Ay),o=r(t)?JSON.parse(t):[],n=e-(s=o).length<0?s.slice(0,e):s;var s;const a=e=>{n.splice(e,1)};return{add:t=>{I(n,t).each(a),n.unshift(t),n.length>e&&n.pop(),My.setItem(Ay,JSON.stringify(n))},state:()=>n.slice(0)}})(10),Fy=e=>{const t=[];for(let o=0;o<e.length;o+=2)t.push({text:e[o+1],value:"#"+By(e[o]).value,type:"choiceitem"});return t},Iy=e=>t=>t.options.get(e),Vy=Iy("color_cols"),Ry=Iy("custom_colors"),zy=Iy("color_map"),Hy=e=>{Dy.add(e)},Py="#000000",Ny=e=>{const t="choiceitem",o={type:t,text:"Remove color",icon:"color-swatch-remove-color",value:"remove"};return e?[o,{type:t,text:"Custom color",icon:"color-picker",value:"custom"}]:[o]},Ly=(e,t,o,n)=>{"custom"===o?qy(e)((o=>{o.each((o=>{Hy(o),e.execCommand("mceApplyTextcolor",t,o),n(o)}))}),Py):"remove"===o?(n(""),e.execCommand("mceRemoveTextcolor",t)):(n(o),e.execCommand("mceApplyTextcolor",t,o))},Wy=(e,t)=>e.concat(P(Dy.state(),(e=>({type:"choiceitem",text:e,value:e}))).concat(Ny(t))),Uy=(e,t)=>o=>{o(Wy(e,t))},jy=(e,t,o)=>{const n="forecolor"===t?"tox-icon-text-color__color":"tox-icon-highlight-bg-color__color";e.setIconFill(n,o)},Gy=(e,t,o,n,s)=>{e.ui.registry.addSplitButton(t,{tooltip:n,presets:"color",icon:"forecolor"===t?"text-color":"highlight-bg-color",select:t=>{const n=((e,t)=>{let o;return e.dom.getParents(e.selection.getStart(),(e=>{let n;(n=e.style["forecolor"===t?"color":"background-color"])&&(o=o||n)})),B.from(o)})(e,o);return n.bind((e=>Sy(e).map((e=>{const o=uy(e).value;return Ce(t.toLowerCase(),o)})))).getOr(!1)},columns:Vy(e),fetch:Uy(zy(e),Ry(e)),onAction:t=>{Ly(e,o,s.get(),b)},onItemAction:(n,r)=>{Ly(e,o,r,(o=>{s.set(o),((e,t)=>{e.dispatch("TextColorChange",t)})(e,{name:t,color:o})}))},onSetup:o=>{jy(o,t,s.get());const n=e=>{e.name===t&&jy(o,e.name,e.color)};return e.on("TextColorChange",n),()=>{e.off("TextColorChange",n)}}})},$y=(e,t,o,n)=>{e.ui.registry.addNestedMenuItem(t,{text:n,icon:"forecolor"===t?"text-color":"highlight-bg-color",getSubmenuItems:()=>[{type:"fancymenuitem",fancytype:"colorswatch",onAction:t=>{Ly(e,o,t.value,b)}}]})},qy=e=>(t,o)=>{let n=!1;const s={colorpicker:o};e.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:s,onAction:(e,t)=>{"hex-valid"===t.name&&(n=t.value)},onSubmit:o=>{const s=o.getData().colorpicker;n?(t(B.from(s)),o.close()):e.windowManager.alert(e.translate(["Invalid hex color code: {0}",s]))},onClose:b,onCancel:()=>{t(B.none())}})},Xy=(e,t,o,n,s,r,a,i)=>{const l=db(t),c=Ky(t,o,n,"color"!==s?"normal":"color",r,a,i);return gb(e,l,c,n,s)},Ky=(e,t,o,n,s,r,a)=>xe(P(e,(i=>{return"choiceitem"===i.type?(l=i,Vn("choicemenuitem",mv,l)).fold(ub,(l=>B.some(((e,t,o,n,s,r,a,i=!0)=>{const l=ey({presets:o,textContent:t?e.text:B.none(),htmlContent:B.none(),ariaLabel:e.text,iconContent:e.icon,shortcutContent:t?e.shortcut:B.none(),checkMark:t?B.some(Zv(a.icons)):B.none(),caret:B.none(),value:e.value},a,i);return nn(jv({data:Gv(e),enabled:e.enabled,getApi:e=>({setActive:t=>{Yp.set(e,t)},isActive:()=>Yp.isOn(e),isEnabled:()=>!vm.isDisabled(e),setEnabled:t=>vm.set(e,!t)}),onAction:t=>n(e.value),onSetup:e=>(e.setActive(s),b),triggersSubmenu:!1,itemBehaviours:[]},l,r,a),{toggling:{toggleClass:qf,toggleOnExecute:!1,selected:e.active}})})(l,1===o,n,t,r(i.value),s,a,db(e))))):B.none();var l}))),Yy=(e,t)=>{const o=nb(t);return 1===e?{mode:"menu",moveOnTab:!0}:"auto"===e?{mode:"grid",selector:"."+o.item,initSize:{numColumns:1,numRows:1}}:{mode:"matrix",rowSelector:"."+("color"===t?"tox-swatches__row":"tox-collection__group")}},Jy=Xr("cell-over"),Zy=Xr("cell-execute"),Qy=(e,t,o)=>{const n=o=>xr(o,Zy,{row:e,col:t}),s=(e,t)=>{t.stop(),n(e)};return ja({dom:{tag:"div",attributes:{role:"button","aria-labelledby":o}},behaviours:ll([Fp("insert-table-picker-cell",[Er(Is(),Hp.focus),Er(Zs(),n),Er(Ls(),s),Er(er(),s)]),Yp.config({toggleClass:"tox-insert-table-picker__selected",toggleOnExecute:!1}),Hp.config({onFocus:o=>xr(o,Jy,{row:e,col:t})})])})},ex=e=>X(e,(e=>P(e,Ga))),tx=(e,t)=>Na(`${t}x${e}`),ox={inserttable:e=>{const t=Xr("size-label"),o=((e,t,o)=>{const n=[];for(let t=0;t<10;t++){const o=[];for(let n=0;n<10;n++)o.push(Qy(t,n,e));n.push(o)}return n})(t),n=tx(0,0),s=Ch({dom:{tag:"span",classes:["tox-insert-table-picker__label"],attributes:{id:t}},components:[n],behaviours:ll([Dp.config({})])});return{type:"widget",data:{value:Xr("widget-id")},dom:{tag:"div",classes:["tox-fancymenuitem"]},autofocus:!0,components:[sy.widget({dom:{tag:"div",classes:["tox-insert-table-picker"]},components:ex(o).concat(s.asSpec()),behaviours:ll([Fp("insert-table-picker",[Rr((e=>{Dp.set(s.get(e),[n])})),Dr(Jy,((e,t,n)=>{const{row:r,col:a}=n.event;((e,t,o,n,s)=>{for(let n=0;n<10;n++)for(let s=0;s<10;s++)Yp.set(e[n][s],n<=t&&s<=o)})(o,r,a),Dp.set(s.get(e),[tx(r+1,a+1)])})),Dr(Zy,((t,o,n)=>{const{row:s,col:r}=n.event;e.onAction({numRows:s+1,numColumns:r+1}),yr(t,or())}))]),kp.config({initSize:{numRows:10,numColumns:10},mode:"flatgrid",selector:'[role="button"]'})])})]}},colorswatch:(e,t)=>{const o=((e,t)=>{const o=e.initData.allowCustomColors&&t.colorinput.hasCustomColors();return e.initData.colors.fold((()=>Wy(t.colorinput.getColors(),o)),(e=>e.concat(Ny(o))))})(e,t),n=t.colorinput.getColorCols(),s="color",r={...Xy(Xr("menu-value"),o,(t=>{e.onAction({value:t})}),n,s,Uf.CLOSE_ON_EXECUTE,_,t.shared.providers),markers:nb(s),movement:Yy(n,s)};return{type:"widget",data:{value:Xr("widget-id")},dom:{tag:"div",classes:["tox-fancymenuitem"]},autofocus:!0,components:[sy.widget(ph.sketch(r))]}}},nx=e=>({type:"separator",dom:{tag:"div",classes:[Gf,"tox-collection__group-heading"]},components:e.text.map(Na).toArray()});var sx;!function(e){e[e.ContentFocus=0]="ContentFocus",e[e.UiFocus=1]="UiFocus"}(sx||(sx={}));const rx=(e,t,o,n,s)=>{const r=o.shared.providers,a=e=>s?{...e,shortcut:B.none(),icon:e.text.isSome()?B.none():e.icon}:e;switch(e.type){case"menuitem":return(i=e,Vn("menuitem",bv,i)).fold(ub,(e=>B.some(((e,t,o,n=!0)=>{const s=ey({presets:"normal",iconContent:e.icon,textContent:e.text,htmlContent:B.none(),ariaLabel:e.text,caret:B.none(),checkMark:B.none(),shortcutContent:e.shortcut},o,n);return jv({data:Gv(e),getApi:e=>({isEnabled:()=>!vm.isDisabled(e),setEnabled:t=>vm.set(e,!t)}),enabled:e.enabled,onAction:e.onAction,onSetup:e.onSetup,triggersSubmenu:!1,itemBehaviours:[]},s,t,o)})(a(e),t,r,n))));case"nestedmenuitem":return(e=>Vn("nestedmenuitem",vv,e))(e).fold(ub,(e=>B.some(((e,t,o,n=!0,s=!1)=>{const r=s?(a=o.icons,qv("chevron-down",a,[Yf])):(e=>qv("chevron-right",e,[Yf]))(o.icons);var a;const i=ey({presets:"normal",iconContent:e.icon,textContent:e.text,htmlContent:B.none(),ariaLabel:e.text,caret:B.some(r),checkMark:B.none(),shortcutContent:e.shortcut},o,n);return jv({data:Gv(e),getApi:e=>({isEnabled:()=>!vm.isDisabled(e),setEnabled:t=>vm.set(e,!t)}),enabled:e.enabled,onAction:b,onSetup:e.onSetup,triggersSubmenu:!0,itemBehaviours:[]},i,t,o)})(a(e),t,r,n,s))));case"togglemenuitem":return(e=>Vn("togglemenuitem",yv,e))(e).fold(ub,(e=>B.some(((e,t,o,n=!0)=>{const s=ey({iconContent:e.icon,textContent:e.text,htmlContent:B.none(),ariaLabel:e.text,checkMark:B.some(Zv(o.icons)),caret:B.none(),shortcutContent:e.shortcut,presets:"normal",meta:e.meta},o,n);return nn(jv({data:Gv(e),enabled:e.enabled,getApi:e=>({setActive:t=>{Yp.set(e,t)},isActive:()=>Yp.isOn(e),isEnabled:()=>!vm.isDisabled(e),setEnabled:t=>vm.set(e,!t)}),onAction:e.onAction,onSetup:e.onSetup,triggersSubmenu:!1,itemBehaviours:[]},s,t,o),{toggling:{toggleClass:qf,toggleOnExecute:!1,selected:e.active}})})(a(e),t,r,n))));case"separator":return(e=>Vn("separatormenuitem",Wb,e))(e).fold(ub,(e=>B.some(nx(e))));case"fancymenuitem":return(e=>Vn("fancymenuitem",fv,e))(e).fold(ub,(e=>((e,t)=>fe(ox,e.fancytype).map((o=>o(e,t))))(a(e),o)));default:return console.error("Unknown item in general menu",e),B.none()}var i},ax=(e,t,o,n,s,r,a)=>{const i=1===n,l=!i||db(e);return xe(P(e,(e=>{switch(e.type){case"separator":return(n=e,Vn("Autocompleter.Separator",Wb,n)).fold(ub,(e=>B.some(nx(e))));case"cardmenuitem":return(e=>Vn("cardmenuitem",uv,e))(e).fold(ub,(e=>B.some(((e,t,o,n)=>{const s={dom:Qv(e.label),optComponents:[B.some({dom:{tag:"div",classes:[Zf,Qf]},components:ny(e.items,n)})]};return jv({data:Gv({text:B.none(),...e}),enabled:e.enabled,getApi:e=>({isEnabled:()=>!vm.isDisabled(e),setEnabled:t=>{vm.set(e,!t),N(Ac(e.element,"*"),(o=>{e.getSystem().getByDom(o).each((e=>{e.hasConfigured(vm)&&vm.set(e,!t)}))}))}}),onAction:e.onAction,onSetup:e.onSetup,triggersSubmenu:!1,itemBehaviours:B.from(n.itemBehaviours).getOr([])},s,t,o.providers)})({...e,onAction:t=>{e.onAction(t),o(e.value,e.meta)}},s,r,{itemBehaviours:ty(e.meta,r),cardText:{matchText:t,highlightOn:a}}))));default:return(e=>Vn("Autocompleter.Item",Ub,e))(e).fold(ub,(e=>B.some(((e,t,o,n,s,r,a,i=!0)=>{const l=ey({presets:n,textContent:B.none(),htmlContent:o?e.text.map((e=>oy(e,t))):B.none(),ariaLabel:e.text,iconContent:e.icon,shortcutContent:B.none(),checkMark:B.none(),caret:B.none(),value:e.value},a.providers,i,e.icon);return jv({data:Gv(e),enabled:e.enabled,getApi:y({}),onAction:t=>s(e.value,e.meta),onSetup:y(b),triggersSubmenu:!1,itemBehaviours:ty(e.meta,a)},l,r,a.providers)})(e,t,i,"normal",o,s,r,l))))}var n})))},ix=(e,t,o,n,s)=>{const r=db(t),a=xe(P(t,(e=>{const t=e=>rx(e,o,n,(e=>s?!be(e,"text"):r)(e),s);return"nestedmenuitem"===e.type&&e.getSubmenuItems().length<=0?t({...e,enabled:!1}):t(e)})));return(s?mb:gb)(e,r,a,1,"normal")},lx=e=>xh.singleData(e.value,e),cx=(e,t)=>{const o=hs(!1),n=hs(!1),s=ja(wh.sketch({dom:{tag:"div",classes:["tox-autocompleter"]},components:[],fireDismissalEventInstead:{},inlineBehaviours:ll([Fp("dismissAutocompleter",[Er(ur(),(()=>l()))])]),lazySink:t.getSink})),r=()=>wh.isOpen(s),a=n.get,i=()=>{r()&&wh.hide(s)},l=()=>e.execCommand("mceAutocompleterClose"),c=n=>{const r=(n=>{const s=re(n,(e=>B.from(e.columns))).getOr(1);return X(n,(n=>{const r=n.items;return ax(r,n.matchText,((t,s)=>{const r=e.selection.getRng();((e,t)=>Lf(Fe(t.startContainer)).map((t=>{const o=e.createRng();return o.selectNode(t.dom),o})))(e.dom,r).each((r=>{const a={hide:()=>l(),reload:t=>{i(),e.execCommand("mceAutocompleterReload",!1,{fetchOptions:t})}};o.set(!0),n.onAction(a,r,t,s),o.set(!1)}))}),s,Uf.BUBBLE_TO_SANDBOX,t,n.highlightOn)}))})(n);r.length>0?((t,o)=>{var n;(n=Fe(e.getBody()),Qa(n,Nf)).each((n=>{const r=re(t,(e=>B.from(e.columns))).getOr(1);wh.showAt(s,ph.sketch(((e,t,o,n)=>{const s=o===sx.ContentFocus?Ym():Km(),r=Yy(t,n),a=nb(n);return{dom:e.dom,components:e.components,items:e.items,value:e.value,markers:{selectedItem:a.selectedItem,item:a.item},movement:r,fakeFocus:o===sx.ContentFocus,focusManager:s,menuBehaviours:wv("auto"!==t?[]:[Rr(((e,t)=>{xv(e,4,a.item).each((({numColumns:t,numRows:o})=>{kp.setGridSize(e,o,t)}))}))])}})(gb("autocompleter-value",!0,o,r,"normal"),r,sx.ContentFocus,"normal")),{anchor:{type:"node",root:Fe(e.getBody()),node:B.from(n)}}),wh.getContent(s).each(Em.highlightFirst)}))})(n,r):i()};e.on("AutocompleterStart",(({lookupData:e})=>{n.set(!0),o.set(!1),c(e)})),e.on("AutocompleterUpdate",(({lookupData:e})=>c(e))),e.on("AutocompleterEnd",(()=>{i(),n.set(!1),o.set(!1)}));((e,t)=>{const o=(e,t)=>{xr(e,zs(),{raw:t})},n=()=>e.getView().bind(Em.getHighlighted);t.on("keydown",(t=>{const s=t.which;e.isActive()&&(e.isMenuOpen()?13===s?(n().each(wr),t.preventDefault()):40===s?(n().fold((()=>{e.getView().each(Em.highlightFirst)}),(e=>{o(e,t)})),t.preventDefault(),t.stopImmediatePropagation()):37!==s&&38!==s&&39!==s||n().each((e=>{o(e,t),t.preventDefault(),t.stopImmediatePropagation()})):13!==s&&38!==s&&40!==s||e.cancelIfNecessary())})),t.on("NodeChange",(t=>{e.isActive()&&!e.isProcessingAction()&&Lf(Fe(t.element)).isNone()&&e.cancelIfNecessary()}))})({cancelIfNecessary:l,isMenuOpen:r,isActive:a,isProcessingAction:o.get,getView:()=>wh.getContent(s)},e)},dx=(e,t,o)=>ei(e,t,o).isSome(),ux=(e,t)=>{let o=null;return{cancel:()=>{null!==o&&(clearTimeout(o),o=null)},schedule:(...n)=>{o=setTimeout((()=>{e.apply(null,n),o=null}),t)}}},mx=e=>{const t=e.raw;return void 0===t.touches||1!==t.touches.length?B.none():B.some(t.touches[0])},gx=(e,t)=>{const o={stopBackspace:!0,...t},n=(e=>{const t=zl(),o=hs(!1),n=ux((t=>{e.triggerEvent(tr(),t),o.set(!0)}),400),s=vs([{key:_s(),value:e=>(mx(e).each((s=>{n.cancel();const r={x:s.clientX,y:s.clientY,target:e.target};n.schedule(e),o.set(!1),t.set(r)})),B.none())},{key:Ts(),value:e=>(n.cancel(),mx(e).each((e=>{t.on((o=>{((e,t)=>{const o=Math.abs(e.clientX-t.x),n=Math.abs(e.clientY-t.y);return o>5||n>5})(e,o)&&t.clear()}))})),B.none())},{key:Es(),value:s=>(n.cancel(),t.get().filter((e=>je(e.target,s.target))).map((t=>o.get()?(s.prevent(),!1):e.triggerEvent(er(),s))))}]);return{fireIfReady:(e,t)=>fe(s,t).bind((t=>t(e)))}})(o),s=P(["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"]),(t=>Pl(e,t,(e=>{n.fireIfReady(e,t).each((t=>{t&&e.kill()})),o.triggerEvent(t,e)&&e.kill()})))),r=zl(),a=Pl(e,"paste",(e=>{n.fireIfReady(e,"paste").each((t=>{t&&e.kill()})),o.triggerEvent("paste",e)&&e.kill(),r.set(setTimeout((()=>{o.triggerEvent(Ys(),e)}),0))})),i=Pl(e,"keydown",(e=>{o.triggerEvent("keydown",e)?e.kill():o.stopBackspace&&(e=>e.raw.which===Bm[0]&&!V(["input","textarea"],Ve(e.target))&&!dx(e.target,'[contenteditable="true"]'))(e)&&e.prevent()})),l=Pl(e,"focusin",(e=>{o.triggerEvent("focusin",e)&&e.kill()})),c=zl(),d=Pl(e,"focusout",(e=>{o.triggerEvent("focusout",e)&&e.kill(),c.set(setTimeout((()=>{o.triggerEvent(Ks(),e)}),0))}));return{unbind:()=>{N(s,(e=>{e.unbind()})),i.unbind(),l.unbind(),d.unbind(),a.unbind(),r.on(clearTimeout),c.on(clearTimeout)}}},px=(e,t)=>{const o=fe(e,"target").getOr(t);return hs(o)},hx=fs([{stopped:[]},{resume:["element"]},{complete:[]}]),fx=(e,t,o,n,s,r)=>{const a=e(t,n),i=((e,t)=>{const o=hs(!1),n=hs(!1);return{stop:()=>{o.set(!0)},cut:()=>{n.set(!0)},isStopped:o.get,isCut:n.get,event:e,setSource:t.set,getSource:t.get}})(o,s);return a.fold((()=>(r.logEventNoHandlers(t,n),hx.complete())),(e=>{const o=e.descHandler;return ha(o)(i),i.isStopped()?(r.logEventStopped(t,e.element,o.purpose),hx.stopped()):i.isCut()?(r.logEventCut(t,e.element,o.purpose),hx.complete()):Ye(e.element).fold((()=>(r.logNoParent(t,e.element,o.purpose),hx.complete())),(n=>(r.logEventResponse(t,e.element,o.purpose),hx.resume(n))))}))},bx=(e,t,o,n,s,r)=>fx(e,t,o,n,s,r).fold(T,(n=>bx(e,t,o,n,s,r)),_),vx=(e,t,o,n,s)=>{const r=px(o,n);return bx(e,t,o,n,r,s)},yx=()=>{const e=(()=>{const e={};return{registerId:(t,o,n)=>{le(n,((n,s)=>{const r=void 0!==e[s]?e[s]:{};r[o]=((e,t)=>({cHandler:S.apply(void 0,[e.handler].concat(t)),purpose:e.purpose}))(n,t),e[s]=r}))},unregisterId:t=>{le(e,((e,o)=>{be(e,t)&&delete e[t]}))},filterByType:t=>fe(e,t).map((e=>ge(e,((e,t)=>((e,t)=>({id:e,descHandler:t}))(t,e))))).getOr([]),find:(t,o,n)=>fe(e,o).bind((e=>ws(n,(t=>((e,t)=>ea(t).bind((t=>fe(e,t))).map((e=>((e,t)=>({element:e,descHandler:t}))(t,e))))(e,t)),t)))}})(),t={},o=o=>{ea(o.element).each((o=>{delete t[o],e.unregisterId(o)}))};return{find:(t,o,n)=>e.find(t,o,n),filter:t=>e.filterByType(t),register:n=>{const s=(e=>{const t=e.element;return ea(t).getOrThunk((()=>((e,t)=>{const o=Xr(Jr+"uid-");return Qr(t,o),o})(0,e.element)))})(n);ve(t,s)&&((e,n)=>{const s=t[n];if(s!==e)throw new Error('The tagId "'+n+'" is already used by: '+Ur(s.element)+"\nCannot use it for: "+Ur(e.element)+"\nThe conflicting element is"+(dt(s.element)?" ":" not ")+"already in the DOM");o(e)})(n,s);const r=[n];e.registerId(r,s,n.events),t[s]=n},unregister:o,getById:e=>fe(t,e)}},xx=Qu({name:"Container",factory:e=>{const{attributes:t,...o}=e.dom;return{uid:e.uid,dom:{tag:"div",attributes:{role:"presentation",...t},...o},components:e.components,behaviours:Qd(e.containerBehaviours),events:e.events,domModification:e.domModification,eventOrder:e.eventOrder}},configFields:[as("components",[]),Zd("containerBehaviours",[]),as("events",{}),as("domModification",{}),as("eventOrder",{})]}),wx=e=>{const t=t=>Ye(e.element).fold(T,(e=>je(t,e))),o=yx(),n=(e,n)=>o.find(t,e,n),s=gx(e.element,{triggerEvent:(e,t)=>ii(e,t.target,(o=>((e,t,o,n)=>vx(e,t,o,o.target,n))(n,e,t,o)))}),r={debugInfo:y("real"),triggerEvent:(e,t,o)=>{ii(e,t,(s=>vx(n,e,o,t,s)))},triggerFocus:(e,t)=>{ea(e).fold((()=>{fl(e)}),(o=>{ii(Xs(),e,(o=>(((e,t,o,n,s)=>{const r=px(o,n);fx(e,t,o,n,r,s)})(n,Xs(),{originator:t,kill:b,prevent:b,target:e},e,o),!1)))}))},triggerEscape:(e,t)=>{r.triggerEvent("keydown",e.element,t.event)},getByUid:e=>p(e),getByDom:e=>h(e),build:ja,buildOrPatch:Ua,addToGui:e=>{l(e)},removeFromGui:e=>{c(e)},addToWorld:e=>{a(e)},removeFromWorld:e=>{i(e)},broadcast:e=>{u(e)},broadcastOn:(e,t)=>{m(e,t)},broadcastEvent:(e,t)=>{g(e,t)},isConnected:T},a=e=>{e.connect(r),He(e.element)||(o.register(e),N(e.components(),a),r.triggerEvent(sr(),e.element,{target:e.element}))},i=e=>{He(e.element)||(N(e.components(),i),o.unregister(e)),e.disconnect()},l=t=>{gd(e,t)},c=e=>{fd(e)},d=e=>{const t=o.filter(Js());N(t,(t=>{const o=t.descHandler;ha(o)(e)}))},u=e=>{d({universal:!0,data:e})},m=(e,t)=>{d({universal:!1,channels:e,data:t})},g=(e,t)=>((e,t,o)=>{const n=(e=>{const t=hs(!1);return{stop:()=>{t.set(!0)},cut:b,isStopped:t.get,isCut:_,event:e,setSource:C("Cannot set source of a broadcasted event"),getSource:C("Cannot get source of a broadcasted event")}})(t);return N(e,(e=>{const t=e.descHandler;ha(t)(n)})),n.isStopped()})(o.filter(e),t),p=e=>o.getById(e).fold((()=>$o.error(new Error('Could not find component with uid: "'+e+'" in system.'))),$o.value),h=e=>{const t=ea(e).getOr("not found");return p(t)};return a(e),{root:e,element:e.element,destroy:()=>{s.unbind(),Ao(e.element)},add:l,remove:c,getByUid:p,getByDom:h,addToWorld:a,removeFromWorld:i,broadcast:u,broadcastOn:m,broadcastEvent:g}},Sx=y([as("prefix","form-field"),Zd("fieldBehaviours",[sm,Jd])]),kx=y([Tu({schema:[Un("dom")],name:"label"}),Tu({factory:{sketch:e=>({uid:e.uid,dom:{tag:"span",styles:{display:"none"},attributes:{"aria-hidden":"true"},innerHtml:e.text}})},schema:[Un("text")],name:"aria-descriptor"}),Ou({factory:{sketch:e=>{const t=((e,t)=>{const o={};return le(e,((e,n)=>{V(t,n)||(o[n]=e)})),o})(e,["factory"]);return e.factory.sketch(t)}},schema:[Un("factory")],name:"field"})]),Cx=em({name:"FormField",configFields:Sx(),partFields:kx(),factory:(e,t,o,n)=>{const s=eu(e.fieldBehaviours,[sm.config({find:t=>Pu(t,e,"field")}),Jd.config({store:{mode:"manual",getValue:e=>sm.getCurrent(e).bind(Jd.getValue),setValue:(e,t)=>{sm.getCurrent(e).each((e=>{Jd.setValue(e,t)}))}}})]),r=Or([Rr(((t,o)=>{const n=Lu(t,e,["label","field","aria-descriptor"]);n.field().each((t=>{const o=Xr(e.prefix);n.label().each((e=>{pt(e.element,"for",o),pt(t.element,"id",o)})),n["aria-descriptor"]().each((o=>{const n=Xr(e.prefix);pt(o.element,"id",n),pt(t.element,"aria-describedby",n)}))}))}))]),a={getField:t=>Pu(t,e,"field"),getLabel:t=>Pu(t,e,"label")};return{uid:e.uid,dom:e.dom,components:t,behaviours:s,events:r,apis:a}},apis:{getField:(e,t)=>e.getField(t),getLabel:(e,t)=>e.getLabel(t)}});var Ox=Object.freeze({__proto__:null,exhibit:(e,t)=>pa({attributes:vs([{key:t.tabAttr,value:"true"}])})}),_x=[as("tabAttr","data-alloy-tabstop")];const Tx=dl({fields:_x,name:"tabstopping",active:Ox});var Ex=tinymce.util.Tools.resolve("tinymce.html.Entities");const Bx=(e,t,o,n)=>{const s=Mx(e,t,o,n);return Cx.sketch(s)},Mx=(e,t,o,n)=>({dom:Ax(o),components:e.toArray().concat([t]),fieldBehaviours:ll(n)}),Ax=e=>({tag:"div",classes:["tox-form__group"].concat(e)}),Dx=(e,t)=>Cx.parts.label({dom:{tag:"label",classes:["tox-label"]},components:[Na(t.translate(e))]}),Fx=Xr("form-component-change"),Ix=Xr("form-close"),Vx=Xr("form-cancel"),Rx=Xr("form-action"),zx=Xr("form-submit"),Hx=Xr("form-block"),Px=Xr("form-unblock"),Nx=Xr("form-tabchange"),Lx=Xr("form-resize"),Wx=y([Zn("data"),as("inputAttributes",{}),as("inputStyles",{}),as("tag","input"),as("inputClasses",[]),fi("onSetValue"),as("styles",{}),as("eventOrder",{}),Zd("inputBehaviours",[Jd,Hp]),as("selectOnFocus",!0)]),Ux=e=>ll([Hp.config({onFocus:e.selectOnFocus?e=>{const t=e.element,o=Aa(t);t.dom.setSelectionRange(0,o.length)}:b})]),jx=e=>({...Ux(e),...eu(e.inputBehaviours,[Jd.config({store:{mode:"manual",...e.data.map((e=>({initialValue:e}))).getOr({}),getValue:e=>Aa(e.element),setValue:(e,t)=>{Aa(e.element)!==t&&Da(e.element,t)}},onSetValue:e.onSetValue})])}),Gx=e=>({tag:e.tag,attributes:{type:"text",...e.inputAttributes},styles:e.inputStyles,classes:e.inputClasses}),$x=Qu({name:"Input",configFields:Wx(),factory:(e,t)=>({uid:e.uid,dom:Gx(e),components:[],behaviours:jx(e),eventOrder:e.eventOrder})}),qx=e=>{let t=B.none(),o=[];const n=e=>{s()?r(e):o.push(e)},s=()=>t.isSome(),r=e=>{t.each((t=>{setTimeout((()=>{e(t)}),0)}))};return e((e=>{s()||(t=B.some(e),N(o,r),o=[])})),{get:n,map:e=>qx((t=>{n((o=>{t(e(o))}))})),isReady:s}},Xx={nu:qx,pure:e=>qx((t=>{t(e)}))},Kx=e=>{setTimeout((()=>{throw e}),0)},Yx=e=>{const t=t=>{e().then(t,Kx)};return{map:t=>Yx((()=>e().then(t))),bind:t=>Yx((()=>e().then((e=>t(e).toPromise())))),anonBind:t=>Yx((()=>e().then((()=>t.toPromise())))),toLazy:()=>Xx.nu(t),toCached:()=>{let t=null;return Yx((()=>(null===t&&(t=e()),t)))},toPromise:e,get:t}},Jx=e=>Yx((()=>new Promise(e))),Zx=e=>Yx((()=>Promise.resolve(e))),Qx=["input","textarea"],ew=e=>{const t=Ve(e);return V(Qx,t)},tw=(e,t)=>{const o=t.getRoot(e).getOr(e.element);Ta(o,t.invalidClass),t.notify.each((t=>{ew(e.element)&&pt(e.element,"aria-invalid",!1),t.getContainer(e).each((e=>{Lr(e,t.validHtml)})),t.onValid(e)}))},ow=(e,t,o,n)=>{const s=t.getRoot(e).getOr(e.element);_a(s,t.invalidClass),t.notify.each((t=>{ew(e.element)&&pt(e.element,"aria-invalid",!0),t.getContainer(e).each((e=>{Lr(e,n)})),t.onInvalid(e,n)}))},nw=(e,t,o)=>t.validator.fold((()=>Zx($o.value(!0))),(t=>t.validate(e))),sw=(e,t,o)=>(t.notify.each((t=>{t.onValidate(e)})),nw(e,t).map((o=>e.getSystem().isConnected()?o.fold((o=>(ow(e,t,0,o),$o.error(o))),(o=>(tw(e,t),$o.value(o)))):$o.error("No longer in system"))));var rw=Object.freeze({__proto__:null,markValid:tw,markInvalid:ow,query:nw,run:sw,isInvalid:(e,t)=>{const o=t.getRoot(e).getOr(e.element);return Ea(o,t.invalidClass)}}),aw=Object.freeze({__proto__:null,events:(e,t)=>e.validator.map((t=>Or([Er(t.onEvent,(t=>{sw(t,e).get(x)}))].concat(t.validateOnLoad?[Rr((t=>{sw(t,e).get(b)}))]:[])))).getOr({})}),iw=[Un("invalidClass"),as("getRoot",B.none),rs("notify",[as("aria","alert"),as("getContainer",B.none),as("validHtml",""),fi("onValid"),fi("onInvalid"),fi("onValidate")]),rs("validator",[Un("validate"),as("onEvent","input"),as("validateOnLoad",!0)])];const lw=dl({fields:iw,name:"invalidating",active:aw,apis:rw,extra:{validation:e=>t=>{const o=Jd.getValue(t);return Zx(e(o))}}});var cw=Object.freeze({__proto__:null,getCoupled:(e,t,o,n)=>o.getOrCreate(e,t,n)}),dw=[jn("others",In($o.value,Cn()))],uw=Object.freeze({__proto__:null,init:()=>{const e={},t=y({});return ma({readState:t,getOrCreate:(t,o,n)=>{const s=ae(o.others);if(s)return fe(e,n).getOrThunk((()=>{const s=fe(o.others,n).getOrDie("No information found for coupled component: "+n)(t),r=t.getSystem().build(s);return e[n]=r,r}));throw new Error("Cannot find coupled component: "+n+". Known coupled components: "+JSON.stringify(s,null,2))}})}});const mw=dl({fields:dw,name:"coupling",apis:cw,state:uw}),gw=y("sink"),pw=y(Tu({name:gw(),overrides:y({dom:{tag:"div"},behaviours:ll([ad.config({useFixed:T})]),events:Or([Fr(zs()),Fr(Ms()),Fr(Ls())])})}));var hw;!function(e){e[e.HighlightFirst=0]="HighlightFirst",e[e.HighlightNone=1]="HighlightNone"}(hw||(hw={}));const fw=(e,t)=>{const o=e.getHotspot(t).getOr(t),n="hotspot",s=e.getAnchorOverrides();return e.layouts.fold((()=>({type:n,hotspot:o,overrides:s})),(e=>({type:n,hotspot:o,overrides:s,layouts:e})))},bw=(e,t,o,n,s,r,a)=>{const i=((e,t,o,n,s,r,a)=>{const i=((e,t,o)=>(0,e.fetch)(o).map(t))(e,t,n),l=xw(n,e);return i.map((e=>e.bind((e=>B.from(xh.sketch({...r.menu(),uid:ta(""),data:e,highlightImmediately:a===hw.HighlightFirst,onOpenMenu:(e,t)=>{const n=l().getOrDie();ad.position(n,t,{anchor:o}),Ad.decloak(s)},onOpenSubmenu:(e,t,o)=>{const n=l().getOrDie();ad.position(n,o,{anchor:{type:"submenu",item:t}}),Ad.decloak(s)},onRepositionMenu:(e,t,n)=>{const s=l().getOrDie();ad.position(s,t,{anchor:o}),N(n,(e=>{ad.position(s,e.triggeredMenu,{anchor:{type:"submenu",item:e.triggeringItem}})}))},onEscape:()=>(Hp.focus(n),Ad.close(s),B.some(!0))}))))))})(e,t,fw(e,o),o,n,s,a);return i.map((e=>(e.fold((()=>{Ad.isOpen(n)&&Ad.close(n)}),(e=>{Ad.cloak(n),Ad.open(n,e),r(n)})),n)))},vw=(e,t,o,n,s,r,a)=>(Ad.close(n),Zx(n)),yw=(e,t,o,n,s,r)=>{const a=mw.getCoupled(o,"sandbox");return(Ad.isOpen(a)?vw:bw)(e,t,o,a,n,s,r)},xw=(e,t)=>e.getSystem().getByUid(t.uid+"-"+gw()).map((e=>()=>$o.value(e))).getOrThunk((()=>t.lazySink.fold((()=>()=>$o.error(new Error("No internal sink is specified, nor could an external sink be found"))),(t=>()=>t(e))))),ww=e=>{Ad.getState(e).each((e=>{xh.repositionMenus(e)}))},Sw=(e,t,o)=>{const n=oi(),s=xw(t,e);return{dom:{tag:"div",classes:e.sandboxClasses,attributes:{id:n.id,role:"listbox"}},behaviours:ou(e.sandboxBehaviours,[Jd.config({store:{mode:"memory",initialValue:t}}),Ad.config({onOpen:(s,r)=>{const a=fw(e,t);n.link(t.element),e.matchWidth&&((e,t,o)=>{const n=sm.getCurrent(t).getOr(t),s=Wt(e.element);o?St(n.element,"min-width",s+"px"):((e,t)=>{Lt.set(e,t)})(n.element,s)})(a.hotspot,r,e.useMinWidth),e.onOpen(a,s,r),void 0!==o&&void 0!==o.onOpen&&o.onOpen(s,r)},onClose:(e,s)=>{n.unlink(t.element),void 0!==o&&void 0!==o.onClose&&o.onClose(e,s)},isPartOf:(e,o,n)=>ni(o,n)||ni(t,n),getAttachPoint:()=>s().getOrDie()}),sm.config({find:e=>Ad.getState(e).bind((e=>sm.getCurrent(e)))}),pl.config({channels:{...Rd({isExtraPart:_}),...Hd({doReposition:ww})}})])}},kw=e=>{const t=mw.getCoupled(e,"sandbox");ww(t)},Cw=()=>[as("sandboxClasses",[]),tu("sandboxBehaviours",[sm,pl,Ad,Jd])],Ow=y([Un("dom"),Un("fetch"),fi("onOpen"),bi("onExecute"),as("getHotspot",B.some),as("getAnchorOverrides",y({})),rc(),Zd("dropdownBehaviours",[Yp,mw,kp,Hp]),Un("toggleClass"),as("eventOrder",{}),Zn("lazySink"),as("matchWidth",!1),as("useMinWidth",!1),Zn("role")].concat(Cw())),_w=y([_u({schema:[gi()],name:"menu",defaults:e=>({onExecute:e.onExecute})}),pw()]),Tw=em({name:"Dropdown",configFields:Ow(),partFields:_w(),factory:(e,t,o,n)=>{const s=e=>{Ad.getState(e).each((e=>{xh.highlightPrimary(e)}))},r={expand:t=>{Yp.isOn(t)||yw(e,x,t,n,b,hw.HighlightNone).get(b)},open:t=>{Yp.isOn(t)||yw(e,x,t,n,b,hw.HighlightFirst).get(b)},isOpen:Yp.isOn,close:t=>{Yp.isOn(t)&&yw(e,x,t,n,b,hw.HighlightFirst).get(b)},repositionMenus:e=>{Yp.isOn(e)&&kw(e)}},a=(e,t)=>(wr(e),B.some(!0));return{uid:e.uid,dom:e.dom,components:t,behaviours:eu(e.dropdownBehaviours,[Yp.config({toggleClass:e.toggleClass,aria:{mode:"expanded"}}),mw.config({others:{sandbox:t=>Sw(e,t,{onOpen:()=>Yp.on(t),onClose:()=>Yp.off(t)})}}),kp.config({mode:"special",onSpace:a,onEnter:a,onDown:(e,t)=>{if(Tw.isOpen(e)){const t=mw.getCoupled(e,"sandbox");s(t)}else Tw.open(e);return B.some(!0)},onEscape:(e,t)=>Tw.isOpen(e)?(Tw.close(e),B.some(!0)):B.none()}),Hp.config({})]),events:Zp(B.some((t=>{yw(e,x,t,n,s,hw.HighlightFirst).get(b)}))),eventOrder:{...e.eventOrder,[Zs()]:["disabling","toggling","alloy.base.behaviour"]},apis:r,domModification:{attributes:{"aria-haspopup":"true",...e.role.fold((()=>({})),(e=>({role:e}))),..."button"===e.dom.tag?{type:("type",fe(e.dom,"attributes").bind((e=>fe(e,"type")))).getOr("button")}:{}}}}},apis:{open:(e,t)=>e.open(t),expand:(e,t)=>e.expand(t),close:(e,t)=>e.close(t),isOpen:(e,t)=>e.isOpen(t),repositionMenus:(e,t)=>e.repositionMenus(t)}}),Ew=dl({fields:[],name:"unselecting",active:Object.freeze({__proto__:null,events:()=>Or([_r(Gs(),T)]),exhibit:()=>pa({styles:{"-webkit-user-select":"none","user-select":"none","-ms-user-select":"none","-moz-user-select":"-moz-none"},attributes:{unselectable:"on"}})})}),Bw=Xr("color-input-change"),Mw=Xr("color-swatch-change"),Aw=Xr("color-picker-cancel"),Dw=Tu({schema:[Un("dom")],name:"label"}),Fw=e=>Tu({name:e+"-edge",overrides:t=>t.model.manager.edgeActions[e].fold((()=>({})),(e=>({events:Or([Br(_s(),((t,o,n)=>e(t,n)),[t]),Br(Ms(),((t,o,n)=>e(t,n)),[t]),Br(As(),((t,o,n)=>{n.mouseIsDown.get()&&e(t,n)}),[t])])})))}),Iw=Fw("top-left"),Vw=Fw("top"),Rw=Fw("top-right"),zw=Fw("right"),Hw=Fw("bottom-right"),Pw=Fw("bottom"),Nw=Fw("bottom-left");var Lw=[Dw,Fw("left"),zw,Vw,Pw,Iw,Rw,Nw,Hw,Ou({name:"thumb",defaults:y({dom:{styles:{position:"absolute"}}}),overrides:e=>({events:Or([Ar(_s(),e,"spectrum"),Ar(Ts(),e,"spectrum"),Ar(Es(),e,"spectrum"),Ar(Ms(),e,"spectrum"),Ar(As(),e,"spectrum"),Ar(Fs(),e,"spectrum")])})}),Ou({schema:[Ln("mouseIsDown",(()=>hs(!1)))],name:"spectrum",overrides:e=>{const t=e.model.manager,o=(o,n)=>t.getValueFromEvent(n).map((n=>t.setValueFrom(o,e,n)));return{behaviours:ll([kp.config({mode:"special",onLeft:o=>t.onLeft(o,e),onRight:o=>t.onRight(o,e),onUp:o=>t.onUp(o,e),onDown:o=>t.onDown(o,e)}),Hp.config({})]),events:Or([Er(_s(),o),Er(Ts(),o),Er(Ms(),o),Er(As(),((t,n)=>{e.mouseIsDown.get()&&o(t,n)}))])}}})];const Ww=y("slider.change.value"),Uw=e=>{const t=e.event.raw;if((e=>-1!==e.type.indexOf("touch"))(t)){const e=t;return void 0!==e.touches&&1===e.touches.length?B.some(e.touches[0]).map((e=>zt(e.clientX,e.clientY))):B.none()}{const e=t;return void 0!==e.clientX?B.some(e).map((e=>zt(e.clientX,e.clientY))):B.none()}},jw=e=>e.model.minX,Gw=e=>e.model.minY,$w=e=>e.model.minX-1,qw=e=>e.model.minY-1,Xw=e=>e.model.maxX,Kw=e=>e.model.maxY,Yw=e=>e.model.maxX+1,Jw=e=>e.model.maxY+1,Zw=(e,t,o)=>t(e)-o(e),Qw=e=>Zw(e,Xw,jw),eS=e=>Zw(e,Kw,Gw),tS=e=>Qw(e)/2,oS=e=>eS(e)/2,nS=e=>e.stepSize,sS=e=>e.snapToGrid,rS=e=>e.snapStart,aS=e=>e.rounded,iS=(e,t)=>void 0!==e[t+"-edge"],lS=e=>iS(e,"left"),cS=e=>iS(e,"right"),dS=e=>iS(e,"top"),uS=e=>iS(e,"bottom"),mS=e=>e.model.value.get(),gS=(e,t)=>({x:e,y:t}),pS=(e,t)=>{xr(e,Ww(),{value:t})},hS=(e,t,o,n)=>e<t?e:e>o?o:e===t?t-1:Math.max(t,e-n),fS=(e,t,o,n)=>e>o?e:e<t?t:e===o?o+1:Math.min(o,e+n),bS=(e,t,o)=>Math.max(t,Math.min(o,e)),vS=e=>{const{min:t,max:o,range:n,value:s,step:r,snap:a,snapStart:i,rounded:l,hasMinEdge:c,hasMaxEdge:d,minBound:u,maxBound:m,screenRange:g}=e,p=c?t-1:t,h=d?o+1:o;if(s<u)return p;if(s>m)return h;{const e=((e,t,o)=>Math.min(o,Math.max(e,t))-t)(s,u,m),c=bS(e/g*n+t,p,h);return a&&c>=t&&c<=o?((e,t,o,n,s)=>s.fold((()=>{const s=e-t,r=Math.round(s/n)*n;return bS(t+r,t-1,o+1)}),(t=>{const s=(e-t)%n,r=Math.round(s/n),a=Math.floor((e-t)/n),i=Math.floor((o-t)/n),l=t+Math.min(i,a+r)*n;return Math.max(t,l)})))(c,t,o,r,i):l?Math.round(c):c}},yS=e=>{const{min:t,max:o,range:n,value:s,hasMinEdge:r,hasMaxEdge:a,maxBound:i,maxOffset:l,centerMinEdge:c,centerMaxEdge:d}=e;return s<t?r?0:c:s>o?a?i:d:(s-t)/n*l},xS="top",wS="right",SS="bottom",kS="left",CS=e=>e.element.dom.getBoundingClientRect(),OS=(e,t)=>e[t],_S=e=>{const t=CS(e);return OS(t,kS)},TS=e=>{const t=CS(e);return OS(t,wS)},ES=e=>{const t=CS(e);return OS(t,xS)},BS=e=>{const t=CS(e);return OS(t,SS)},MS=e=>{const t=CS(e);return OS(t,"width")},AS=e=>{const t=CS(e);return OS(t,"height")},DS=(e,t,o)=>(e+t)/2-o,FS=(e,t)=>{const o=CS(e),n=CS(t),s=OS(o,kS),r=OS(o,wS),a=OS(n,kS);return DS(s,r,a)},IS=(e,t)=>{const o=CS(e),n=CS(t),s=OS(o,xS),r=OS(o,SS),a=OS(n,xS);return DS(s,r,a)},VS=(e,t)=>{xr(e,Ww(),{value:t})},RS=(e,t,o)=>{const n={min:jw(t),max:Xw(t),range:Qw(t),value:o,step:nS(t),snap:sS(t),snapStart:rS(t),rounded:aS(t),hasMinEdge:lS(t),hasMaxEdge:cS(t),minBound:_S(e),maxBound:TS(e),screenRange:MS(e)};return vS(n)},zS=e=>(t,o)=>((e,t,o)=>{const n=(e>0?fS:hS)(mS(o),jw(o),Xw(o),nS(o));return VS(t,n),B.some(n)})(e,t,o).map(T),HS=(e,t,o,n,s,r)=>{const a=((e,t,o,n,s)=>{const r=MS(e),a=n.bind((t=>B.some(FS(t,e)))).getOr(0),i=s.bind((t=>B.some(FS(t,e)))).getOr(r),l={min:jw(t),max:Xw(t),range:Qw(t),value:o,hasMinEdge:lS(t),hasMaxEdge:cS(t),minBound:_S(e),minOffset:0,maxBound:TS(e),maxOffset:r,centerMinEdge:a,centerMaxEdge:i};return yS(l)})(t,r,o,n,s);return _S(t)-_S(e)+a},PS=zS(-1),NS=zS(1),LS=B.none,WS=B.none,US={"top-left":B.none(),top:B.none(),"top-right":B.none(),right:B.some(((e,t)=>{pS(e,Yw(t))})),"bottom-right":B.none(),bottom:B.none(),"bottom-left":B.none(),left:B.some(((e,t)=>{pS(e,$w(t))}))};var jS=Object.freeze({__proto__:null,setValueFrom:(e,t,o)=>{const n=RS(e,t,o);return VS(e,n),n},setToMin:(e,t)=>{const o=jw(t);VS(e,o)},setToMax:(e,t)=>{const o=Xw(t);VS(e,o)},findValueOfOffset:RS,getValueFromEvent:e=>Uw(e).map((e=>e.left)),findPositionOfValue:HS,setPositionFromValue:(e,t,o,n)=>{const s=mS(o),r=HS(e,n.getSpectrum(e),s,n.getLeftEdge(e),n.getRightEdge(e),o),a=Wt(t.element)/2;St(t.element,"left",r-a+"px")},onLeft:PS,onRight:NS,onUp:LS,onDown:WS,edgeActions:US});const GS=(e,t)=>{xr(e,Ww(),{value:t})},$S=(e,t,o)=>{const n={min:Gw(t),max:Kw(t),range:eS(t),value:o,step:nS(t),snap:sS(t),snapStart:rS(t),rounded:aS(t),hasMinEdge:dS(t),hasMaxEdge:uS(t),minBound:ES(e),maxBound:BS(e),screenRange:AS(e)};return vS(n)},qS=e=>(t,o)=>((e,t,o)=>{const n=(e>0?fS:hS)(mS(o),Gw(o),Kw(o),nS(o));return GS(t,n),B.some(n)})(e,t,o).map(T),XS=(e,t,o,n,s,r)=>{const a=((e,t,o,n,s)=>{const r=AS(e),a=n.bind((t=>B.some(IS(t,e)))).getOr(0),i=s.bind((t=>B.some(IS(t,e)))).getOr(r),l={min:Gw(t),max:Kw(t),range:eS(t),value:o,hasMinEdge:dS(t),hasMaxEdge:uS(t),minBound:ES(e),minOffset:0,maxBound:BS(e),maxOffset:r,centerMinEdge:a,centerMaxEdge:i};return yS(l)})(t,r,o,n,s);return ES(t)-ES(e)+a},KS=B.none,YS=B.none,JS=qS(-1),ZS=qS(1),QS={"top-left":B.none(),top:B.some(((e,t)=>{pS(e,qw(t))})),"top-right":B.none(),right:B.none(),"bottom-right":B.none(),bottom:B.some(((e,t)=>{pS(e,Jw(t))})),"bottom-left":B.none(),left:B.none()};var ek=Object.freeze({__proto__:null,setValueFrom:(e,t,o)=>{const n=$S(e,t,o);return GS(e,n),n},setToMin:(e,t)=>{const o=Gw(t);GS(e,o)},setToMax:(e,t)=>{const o=Kw(t);GS(e,o)},findValueOfOffset:$S,getValueFromEvent:e=>Uw(e).map((e=>e.top)),findPositionOfValue:XS,setPositionFromValue:(e,t,o,n)=>{const s=mS(o),r=XS(e,n.getSpectrum(e),s,n.getTopEdge(e),n.getBottomEdge(e),o),a=It(t.element)/2;St(t.element,"top",r-a+"px")},onLeft:KS,onRight:YS,onUp:JS,onDown:ZS,edgeActions:QS});const tk=(e,t)=>{xr(e,Ww(),{value:t})},ok=(e,t)=>({x:e,y:t}),nk=(e,t)=>(o,n)=>((e,t,o,n)=>{const s=e>0?fS:hS,r=t?mS(n).x:s(mS(n).x,jw(n),Xw(n),nS(n)),a=t?s(mS(n).y,Gw(n),Kw(n),nS(n)):mS(n).y;return tk(o,ok(r,a)),B.some(r)})(e,t,o,n).map(T),sk=nk(-1,!1),rk=nk(1,!1),ak=nk(-1,!0),ik=nk(1,!0),lk={"top-left":B.some(((e,t)=>{pS(e,gS($w(t),qw(t)))})),top:B.some(((e,t)=>{pS(e,gS(tS(t),qw(t)))})),"top-right":B.some(((e,t)=>{pS(e,gS(Yw(t),qw(t)))})),right:B.some(((e,t)=>{pS(e,gS(Yw(t),oS(t)))})),"bottom-right":B.some(((e,t)=>{pS(e,gS(Yw(t),Jw(t)))})),bottom:B.some(((e,t)=>{pS(e,gS(tS(t),Jw(t)))})),"bottom-left":B.some(((e,t)=>{pS(e,gS($w(t),Jw(t)))})),left:B.some(((e,t)=>{pS(e,gS($w(t),oS(t)))}))};var ck=Object.freeze({__proto__:null,setValueFrom:(e,t,o)=>{const n=RS(e,t,o.left),s=$S(e,t,o.top),r=ok(n,s);return tk(e,r),r},setToMin:(e,t)=>{const o=jw(t),n=Gw(t);tk(e,ok(o,n))},setToMax:(e,t)=>{const o=Xw(t),n=Kw(t);tk(e,ok(o,n))},getValueFromEvent:e=>Uw(e),setPositionFromValue:(e,t,o,n)=>{const s=mS(o),r=HS(e,n.getSpectrum(e),s.x,n.getLeftEdge(e),n.getRightEdge(e),o),a=XS(e,n.getSpectrum(e),s.y,n.getTopEdge(e),n.getBottomEdge(e),o),i=Wt(t.element)/2,l=It(t.element)/2;St(t.element,"left",r-i+"px"),St(t.element,"top",a-l+"px")},onLeft:sk,onRight:rk,onUp:ak,onDown:ik,edgeActions:lk});const dk=em({name:"Slider",configFields:[as("stepSize",1),as("onChange",b),as("onChoose",b),as("onInit",b),as("onDragStart",b),as("onDragEnd",b),as("snapToGrid",!1),as("rounded",!0),Zn("snapStart"),jn("model",Pn("mode",{x:[as("minX",0),as("maxX",100),Ln("value",(e=>hs(e.mode.minX))),Un("getInitialValue"),xi("manager",jS)],y:[as("minY",0),as("maxY",100),Ln("value",(e=>hs(e.mode.minY))),Un("getInitialValue"),xi("manager",ek)],xy:[as("minX",0),as("maxX",100),as("minY",0),as("maxY",100),Ln("value",(e=>hs({x:e.mode.minX,y:e.mode.minY}))),Un("getInitialValue"),xi("manager",ck)]})),Zd("sliderBehaviours",[kp,Jd]),Ln("mouseIsDown",(()=>hs(!1)))],partFields:Lw,factory:(e,t,o,n)=>{const s=t=>Nu(t,e,"thumb"),r=t=>Nu(t,e,"spectrum"),a=t=>Pu(t,e,"left-edge"),i=t=>Pu(t,e,"right-edge"),l=t=>Pu(t,e,"top-edge"),c=t=>Pu(t,e,"bottom-edge"),d=e.model,u=d.manager,m=(t,o)=>{u.setPositionFromValue(t,o,e,{getLeftEdge:a,getRightEdge:i,getTopEdge:l,getBottomEdge:c,getSpectrum:r})},g=(e,t)=>{d.value.set(t);const o=s(e);m(e,o)},p=t=>{const o=e.mouseIsDown.get();e.mouseIsDown.set(!1),o&&Pu(t,e,"thumb").each((o=>{const n=d.value.get();e.onChoose(t,o,n)}))},h=(t,o)=>{o.stop(),e.mouseIsDown.set(!0),e.onDragStart(t,s(t))},f=(t,o)=>{o.stop(),e.onDragEnd(t,s(t)),p(t)};return{uid:e.uid,dom:e.dom,components:t,behaviours:eu(e.sliderBehaviours,[kp.config({mode:"special",focusIn:t=>Pu(t,e,"spectrum").map(kp.focusIn).map(T)}),Jd.config({store:{mode:"manual",getValue:e=>d.value.get(),setValue:g}}),pl.config({channels:{[Id()]:{onReceive:p}}})]),events:Or([Er(Ww(),((t,o)=>{((t,o)=>{g(t,o);const n=s(t);e.onChange(t,n,o),B.some(!0)})(t,o.event.value)})),Rr(((t,o)=>{const n=d.getInitialValue();d.value.set(n);const a=s(t);m(t,a);const i=r(t);e.onInit(t,a,i,d.value.get())})),Er(_s(),h),Er(Es(),f),Er(Ms(),h),Er(Fs(),f)]),apis:{resetToMin:t=>{u.setToMin(t,e)},resetToMax:t=>{u.setToMax(t,e)},setValue:g,refresh:m},domModification:{styles:{position:"relative"}}}},apis:{setValue:(e,t,o)=>{e.setValue(t,o)},resetToMin:(e,t)=>{e.resetToMin(t)},resetToMax:(e,t)=>{e.resetToMax(t)},refresh:(e,t)=>{e.refresh(t)}}}),uk=Xr("rgb-hex-update"),mk=Xr("slider-update"),gk=Xr("palette-update"),pk="form",hk=[Zd("formBehaviours",[Jd])],fk=e=>"<alloy.field."+e+">",bk=(e,t)=>({uid:e.uid,dom:e.dom,components:t,behaviours:eu(e.formBehaviours,[Jd.config({store:{mode:"manual",getValue:t=>{const o=Wu(t,e);return ce(o,((e,t)=>e().bind((e=>{return o=sm.getCurrent(e),n=new Error(`Cannot find a current component to extract the value from for form part '${t}': `+Ur(e.element)),o.fold((()=>$o.error(n)),$o.value);var o,n})).map(Jd.getValue)))},setValue:(t,o)=>{le(o,((o,n)=>{Pu(t,e,n).each((e=>{sm.getCurrent(e).each((e=>{Jd.setValue(e,o)}))}))}))}}})]),apis:{getField:(t,o)=>Pu(t,e,o).bind(sm.getCurrent)}}),vk={getField:da(((e,t,o)=>e.getField(t,o))),sketch:e=>{const t=(()=>{const e=[];return{field:(t,o)=>(e.push(t),Iu(pk,fk(t),o)),record:y(e)}})(),o=e(t),n=t.record(),s=P(n,(e=>Ou({name:e,pname:fk(e)})));return Ku(pk,hk,s,bk,o)}},yk=Xr("valid-input"),xk=Xr("invalid-input"),wk=Xr("validating-input"),Sk="colorcustom.rgb.",kk=(e,t,o,n)=>{const s=(o,n)=>lw.config({invalidClass:t("invalid"),notify:{onValidate:e=>{xr(e,wk,{type:o})},onValid:e=>{xr(e,yk,{type:o,value:Jd.getValue(e)})},onInvalid:e=>{xr(e,xk,{type:o,value:Jd.getValue(e)})}},validator:{validate:t=>{const o=Jd.getValue(t),s=n(o)?$o.value(!0):$o.error(e("aria.input.invalid"));return Zx(s)},validateOnLoad:!1}}),r=(o,n,r,a,i)=>{const l=e("colorcustom.rgb.range"),c=Cx.parts.label({dom:{tag:"label",attributes:{"aria-label":a}},components:[Na(r)]}),d=Cx.parts.field({data:i,factory:$x,inputAttributes:{type:"text",..."hex"===n?{"aria-live":"polite"}:{}},inputClasses:[t("textfield")],inputBehaviours:ll([s(n,o),Tx.config({})]),onSetValue:e=>{lw.isInvalid(e)&&lw.run(e).get(b)}}),u=[c,d],m="hex"!==n?[Cx.parts["aria-descriptor"]({text:l})]:[];return{dom:{tag:"div",attributes:{role:"presentation"}},components:u.concat(m)}},a=(e,t)=>{const o=t.red,n=t.green,s=t.blue;Jd.setValue(e,{red:o,green:n,blue:s})},i=Ch({dom:{tag:"div",classes:[t("rgba-preview")],styles:{"background-color":"white"},attributes:{role:"presentation"}}}),l=(e,t)=>{i.getOpt(e).each((e=>{St(e.element,"background-color","#"+t.value)}))},c=Qu({factory:()=>{const s={red:hs(B.some(255)),green:hs(B.some(255)),blue:hs(B.some(255)),hex:hs(B.some("ffffff"))},c=e=>s[e].get(),d=(e,t)=>{s[e].set(t)},u=e=>{const t=e.red,o=e.green,n=e.blue;d("red",B.some(t)),d("green",B.some(o)),d("blue",B.some(n))},m=(e,t)=>{const o=t.event;"hex"!==o.type?d(o.type,B.none()):n(e)},g=(e,t)=>{const n=t.event;(e=>"hex"===e.type)(n)?((e,t)=>{o(e);const n=ry(t);d("hex",B.some(t));const s=xy(n);a(e,s),u(s),xr(e,uk,{hex:n}),l(e,n)})(e,n.value):((e,t,o)=>{const n=parseInt(o,10);d(t,B.some(n)),c("red").bind((e=>c("green").bind((t=>c("blue").map((o=>by(e,t,o,1))))))).each((t=>{const o=((e,t)=>{const o=uy(t);return vk.getField(e,"hex").each((t=>{Hp.isFocused(t)||Jd.setValue(e,{hex:o.value})})),o})(e,t);xr(e,uk,{hex:o}),l(e,o)}))})(e,n.type,n.value)},p=t=>({label:e(Sk+t+".label"),description:e(Sk+t+".description")}),h=p("red"),f=p("green"),b=p("blue"),v=p("hex");return nn(vk.sketch((o=>({dom:{tag:"form",classes:[t("rgb-form")],attributes:{"aria-label":e("aria.color.picker")}},components:[o.field("red",Cx.sketch(r(vy,"red",h.label,h.description,255))),o.field("green",Cx.sketch(r(vy,"green",f.label,f.description,255))),o.field("blue",Cx.sketch(r(vy,"blue",b.label,b.description,255))),o.field("hex",Cx.sketch(r(ly,"hex",v.label,v.description,"ffffff"))),i.asSpec()],formBehaviours:ll([lw.config({invalidClass:t("form-invalid")}),Fp("rgb-form-events",[Er(yk,g),Er(xk,m),Er(wk,m)])])}))),{apis:{updateHex:(e,t)=>{Jd.setValue(e,{hex:t.value}),((e,t)=>{const o=xy(t);a(e,o),u(o)})(e,t),l(e,t)}}})},name:"RgbForm",configFields:[],apis:{updateHex:(e,t,o)=>{e.updateHex(t,o)}},extraApis:{}});return c},Ck=(e,t)=>{const o=Qu({name:"ColourPicker",configFields:[Un("dom"),as("onValidHex",b),as("onInvalidHex",b)],factory:o=>{const n=kk(e,t,o.onValidHex,o.onInvalidHex),s=((e,t)=>{const o=dk.parts.spectrum({dom:{tag:"canvas",attributes:{role:"presentation"},classes:[t("sv-palette-spectrum")]}}),n=dk.parts.thumb({dom:{tag:"div",attributes:{role:"presentation"},classes:[t("sv-palette-thumb")],innerHtml:`<div class=${t("sv-palette-inner-thumb")} role="presentation"></div>`}}),s=(e,t)=>{const{width:o,height:n}=e,s=e.getContext("2d");if(null===s)return;s.fillStyle=t,s.fillRect(0,0,o,n);const r=s.createLinearGradient(0,0,o,0);r.addColorStop(0,"rgba(255,255,255,1)"),r.addColorStop(1,"rgba(255,255,255,0)"),s.fillStyle=r,s.fillRect(0,0,o,n);const a=s.createLinearGradient(0,0,0,n);a.addColorStop(0,"rgba(0,0,0,0)"),a.addColorStop(1,"rgba(0,0,0,1)"),s.fillStyle=a,s.fillRect(0,0,o,n)};return Qu({factory:e=>{const r=y({x:0,y:0}),a=ll([sm.config({find:B.some}),Hp.config({})]);return dk.sketch({dom:{tag:"div",attributes:{role:"presentation"},classes:[t("sv-palette")]},model:{mode:"xy",getInitialValue:r},rounded:!1,components:[o,n],onChange:(e,t,o)=>{xr(e,gk,{value:o})},onInit:(e,t,o,n)=>{s(o.element.dom,ky(Cy))},sliderBehaviours:a})},name:"SaturationBrightnessPalette",configFields:[],apis:{setHue:(e,t,o)=>{((e,t)=>{const o=e.components()[0].element.dom,n=_y(t,100,100),r=yy(n);s(o,ky(r))})(t,o)},setThumb:(e,t,o)=>{((e,t)=>{const o=Ty(xy(t));dk.setValue(e,{x:o.saturation,y:100-o.value})})(t,o)}},extraApis:{}})})(0,t),r={paletteRgba:hs(Cy),paletteHue:hs(0)},a=Ch(((e,t)=>{const o=dk.parts.spectrum({dom:{tag:"div",classes:[t("hue-slider-spectrum")],attributes:{role:"presentation"}}}),n=dk.parts.thumb({dom:{tag:"div",classes:[t("hue-slider-thumb")],attributes:{role:"presentation"}}});return dk.sketch({dom:{tag:"div",classes:[t("hue-slider")],attributes:{role:"presentation"}},rounded:!1,model:{mode:"y",getInitialValue:y(0)},components:[o,n],sliderBehaviours:ll([Hp.config({})]),onChange:(e,t,o)=>{xr(e,mk,{value:o})}})})(0,t)),i=Ch(s.sketch({})),l=Ch(n.sketch({})),c=(e,t,o)=>{i.getOpt(e).each((e=>{s.setHue(e,o)}))},d=(e,t)=>{l.getOpt(e).each((e=>{n.updateHex(e,t)}))},u=(e,t,o)=>{a.getOpt(e).each((e=>{dk.setValue(e,(e=>100-e/360*100)(o))}))},m=(e,t)=>{i.getOpt(e).each((e=>{s.setThumb(e,t)}))},g=(e,t,o,n)=>{((e,t)=>{const o=xy(e);r.paletteRgba.set(o),r.paletteHue.set(t)})(t,o),N(n,(n=>{n(e,t,o)}))};return{uid:o.uid,dom:o.dom,components:[i.asSpec(),a.asSpec(),l.asSpec()],behaviours:ll([Fp("colour-picker-events",[Er(uk,(()=>{const e=[c,u,m];return(t,o)=>{const n=o.event.hex,s=(e=>Ty(xy(e)))(n);g(t,n,s.hue,e)}})()),Er(gk,(()=>{const e=[d];return(t,o)=>{const n=o.event.value,s=r.paletteHue.get(),a=_y(s,n.x,100-n.y),i=Ey(a);g(t,i,s,e)}})()),Er(mk,(()=>{const e=[c,d];return(t,o)=>{const n=(e=>(100-e)/100*360)(o.event.value),s=r.paletteRgba.get(),a=Ty(s),i=_y(n,a.saturation,a.value),l=Ey(i);g(t,l,n,e)}})())]),sm.config({find:e=>l.getOpt(e)}),kp.config({mode:"acyclic"})])}}});return o},Ok=()=>sm.config({find:B.some}),_k=e=>sm.config({find:t=>et(t.element,e).bind((e=>t.getSystem().getByDom(e).toOptional()))}),Tk=yn([as("preprocess",x),as("postprocess",x)]),Ek=(e,t,o)=>Jd.config({store:{mode:"manual",...e.map((e=>({initialValue:e}))).getOr({}),getValue:t,setValue:o}}),Bk=(e,t,o)=>Ek(e,(e=>t(e.element)),((e,t)=>o(e.element,t))),Mk=(e,t)=>{const o=zn("RepresentingConfigs.memento processors",Tk,t);return Jd.config({store:{mode:"manual",getValue:t=>{const n=e.get(t),s=Jd.getValue(n);return o.postprocess(s)},setValue:(t,n)=>{const s=o.preprocess(n),r=e.get(t);Jd.setValue(r,s)}}})},Ak=Bk,Dk=Ek,Fk=e=>Jd.config({store:{mode:"memory",initialValue:e}}),Ik={"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","aria.color.picker":"Color Picker","aria.input.invalid":"Invalid input"};var Vk=tinymce.util.Tools.resolve("tinymce.Resource"),Rk=tinymce.util.Tools.resolve("tinymce.util.Tools");const zk=Xr("alloy-fake-before-tabstop"),Hk=Xr("alloy-fake-after-tabstop"),Pk=e=>({dom:{tag:"div",styles:{width:"1px",height:"1px",outline:"none"},attributes:{tabindex:"0"},classes:e},behaviours:ll([Hp.config({ignore:!0}),Tx.config({})])}),Nk=e=>({dom:{tag:"div",classes:["tox-navobj"]},components:[Pk([zk]),e,Pk([Hk])],behaviours:ll([_k(1)])}),Lk=(e,t)=>{xr(e,zs(),{raw:{which:9,shiftKey:t}})},Wk=(e,t)=>{const o=t.element;Ea(o,zk)?Lk(e,!0):Ea(o,Hk)&&Lk(e,!1)},Uk=e=>dx(e,["."+zk,"."+Hk].join(","),_),jk=Xr("toolbar.button.execute"),Gk={[Zs()]:["disabling","alloy.base.behaviour","toggling","toolbar-button-events"]},$k=(e,t,o)=>Ih(e,{tag:"span",classes:["tox-icon","tox-tbtn__icon-wrap"],behaviours:o},t),qk=(e,t)=>$k(e,t,[]),Xk=(e,t)=>$k(e,t,[Dp.config({})]),Kk=(e,t,o)=>({dom:{tag:"span",classes:[`${t}__select-label`]},components:[Na(o.translate(e))],behaviours:ll([Dp.config({})])}),Yk=Xr("update-menu-text"),Jk=Xr("update-menu-icon"),Zk=(e,t,o)=>{const n=hs(b),s=e.text.map((e=>Ch(Kk(e,t,o.providers)))),r=e.icon.map((e=>Ch(Xk(e,o.providers.icons)))),a=(e,t)=>{const o=Jd.getValue(e);return Hp.focus(o),xr(o,"keydown",{raw:t.event.raw}),Tw.close(o),B.some(!0)},i=e.role.fold((()=>({})),(e=>({role:e}))),l=e.tooltip.fold((()=>({})),(e=>{const t=o.providers.translate(e);return{title:t,"aria-label":t}})),c=Ih("chevron-down",{tag:"div",classes:[`${t}__select-chevron`]},o.providers.icons);return Ch(Tw.sketch({...e.uid?{uid:e.uid}:{},...i,dom:{tag:"button",classes:[t,`${t}--select`].concat(P(e.classes,(e=>`${t}--${e}`))),attributes:{...l}},components:Uv([r.map((e=>e.asSpec())),s.map((e=>e.asSpec())),B.some(c)]),matchWidth:!0,useMinWidth:!0,dropdownBehaviours:ll([...e.dropdownBehaviours,Vv((()=>e.disabled||o.providers.isDisabled())),Iv(),Ew.config({}),Dp.config({}),Fp("dropdown-events",[Pv(e,n),Nv(e,n)]),Fp("menubutton-update-display-text",[Er(Yk,((e,t)=>{s.bind((t=>t.getOpt(e))).each((e=>{Dp.set(e,[Na(o.providers.translate(t.event.text))])}))})),Er(Jk,((e,t)=>{r.bind((t=>t.getOpt(e))).each((e=>{Dp.set(e,[Xk(t.event.icon,o.providers.icons)])}))}))])]),eventOrder:nn(Gk,{mousedown:["focusing","alloy.base.behaviour","item-type-events","normal-dropdown-events"]}),sandboxBehaviours:ll([kp.config({mode:"special",onLeft:a,onRight:a})]),lazySink:o.getSink,toggleClass:`${t}--active`,parts:{menu:ab(0,e.columns,e.presets)},fetch:t=>Jx(S(e.fetch,t))})).asSpec()},Qk=e=>"separator"===e.type,eC={type:"separator"},tC=(e,t)=>{const o=((e,t)=>{const o=j(e,((e,o)=>(e=>r(e))(o)?""===o?e:"|"===o?e.length>0&&!Qk(e[e.length-1])?e.concat([eC]):e:be(t,o.toLowerCase())?e.concat([t[o.toLowerCase()]]):e:e.concat([o])),[]);return o.length>0&&Qk(o[o.length-1])&&o.pop(),o})(r(e)?e.split(" "):e,t);return U(o,((e,o)=>{const n=(e=>{if(Qk(e))return e;{const t=fe(e,"value").getOrThunk((()=>Xr("generated-menu-item")));return nn({value:t},e)}})(o),s=((e,t)=>(e=>be(e,"getSubmenuItems"))(e)?((e,t)=>{const o=e.getSubmenuItems(),n=tC(o,t);return{item:e,menus:nn(n.menus,bs(e.value,n.items)),expansions:nn(n.expansions,bs(e.value,e.value))}})(e,t):{item:e,menus:{},expansions:{}})(n,t);return{menus:nn(e.menus,s.menus),items:[s.item].concat(e.items),expansions:nn(e.expansions,s.expansions)}}),{menus:{},expansions:{},items:[]})},oC=(e,t,o,n)=>{const s=Xr("primary-menu"),r=tC(e,o.shared.providers.menuItems());if(0===r.items.length)return B.none();const a=ix(s,r.items,t,o,n),i=ce(r.menus,((e,n)=>ix(n,e,t,o,!1))),l=nn(i,bs(s,a));return B.from(xh.tieredData(s,l,r.expansions))},nC=e=>!be(e,"items"),sC="data-value",rC=(e,t,o,n)=>P(o,(o=>nC(o)?{type:"togglemenuitem",text:o.text,value:o.value,active:o.value===n,onAction:()=>{Jd.setValue(e,o.value),xr(e,Fx,{name:t}),Hp.focus(e)}}:{type:"nestedmenuitem",text:o.text,getSubmenuItems:()=>rC(e,t,o.items,n)})),aC=(e,t)=>re(e,(e=>nC(e)?Se(e.value===t,e):aC(e.items,t))),iC=Qu({name:"HtmlSelect",configFields:[Un("options"),Zd("selectBehaviours",[Hp,Jd]),as("selectClasses",[]),as("selectAttributes",{}),Zn("data")],factory:(e,t)=>{const o=P(e.options,(e=>({dom:{tag:"option",value:e.value,innerHtml:e.text}}))),n=e.data.map((e=>bs("initialValue",e))).getOr({});return{uid:e.uid,dom:{tag:"select",classes:e.selectClasses,attributes:e.selectAttributes},components:o,behaviours:eu(e.selectBehaviours,[Hp.config({}),Jd.config({store:{mode:"manual",getValue:e=>Aa(e.element),setValue:(t,o)=>{G(e.options,(e=>e.value===o)).isSome()&&Da(t.element,o)},...n}})])}}}),lC=y([as("field1Name","field1"),as("field2Name","field2"),vi("onLockedChange"),pi(["lockClass"]),as("locked",!1),tu("coupledFieldBehaviours",[sm,Jd])]),cC=(e,t)=>Ou({factory:Cx,name:e,overrides:e=>({fieldBehaviours:ll([Fp("coupled-input-behaviour",[Er(Ps(),(o=>{((e,t,o)=>Pu(e,t,o).bind(sm.getCurrent))(o,e,t).each((t=>{Pu(o,e,"lock").each((n=>{Yp.isOn(n)&&e.onLockedChange(o,t,n)}))}))}))])])})}),dC=y([cC("field1","field2"),cC("field2","field1"),Ou({factory:kh,schema:[Un("dom")],name:"lock",overrides:e=>({buttonBehaviours:ll([Yp.config({selected:e.locked,toggleClass:e.markers.lockClass,aria:{mode:"pressed"}})])})})]),uC=em({name:"FormCoupledInputs",configFields:lC(),partFields:dC(),factory:(e,t,o,n)=>({uid:e.uid,dom:e.dom,components:t,behaviours:ou(e.coupledFieldBehaviours,[sm.config({find:B.some}),Jd.config({store:{mode:"manual",getValue:t=>{const o=ju(t,e,["field1","field2"]);return{[e.field1Name]:Jd.getValue(o.field1()),[e.field2Name]:Jd.getValue(o.field2())}},setValue:(t,o)=>{const n=ju(t,e,["field1","field2"]);ve(o,e.field1Name)&&Jd.setValue(n.field1(),o[e.field1Name]),ve(o,e.field2Name)&&Jd.setValue(n.field2(),o[e.field2Name])}}})]),apis:{getField1:t=>Pu(t,e,"field1"),getField2:t=>Pu(t,e,"field2"),getLock:t=>Pu(t,e,"lock")}}),apis:{getField1:(e,t)=>e.getField1(t),getField2:(e,t)=>e.getField2(t),getLock:(e,t)=>e.getLock(t)}}),mC=e=>{const t=/^\s*(\d+(?:\.\d+)?)\s*(|cm|mm|in|px|pt|pc|em|ex|ch|rem|vw|vh|vmin|vmax|%)\s*$/.exec(e);if(null!==t){const e=parseFloat(t[1]),o=t[2];return $o.value({value:e,unit:o})}return $o.error(e)},gC=(e,t)=>{const o={"":96,px:96,pt:72,cm:2.54,pc:12,mm:25.4,in:1},n=e=>be(o,e);return e.unit===t?B.some(e.value):n(e.unit)&&n(t)?o[e.unit]===o[t]?B.some(e.value):B.some(e.value/o[e.unit]*o[t]):B.none()},pC=e=>B.none(),hC=(e,t)=>{const o=e.label.map((e=>Dx(e,t))),n=[vm.config({disabled:()=>e.disabled||t.isDisabled()}),Iv(),kp.config({mode:"execution",useEnter:!0!==e.multiline,useControlEnter:!0===e.multiline,execute:e=>(yr(e,zx),B.some(!0))}),Fp("textfield-change",[Er(Ps(),((t,o)=>{xr(t,Fx,{name:e.name})})),Er(Ys(),((t,o)=>{xr(t,Fx,{name:e.name})}))]),Tx.config({})],s=e.validation.map((e=>lw.config({getRoot:e=>Je(e.element),invalidClass:"tox-invalid",validator:{validate:t=>{const o=Jd.getValue(t),n=e.validator(o);return Zx(!0===n?$o.value(o):$o.error(n))},validateOnLoad:e.validateOnLoad}}))).toArray(),r={...e.placeholder.fold(y({}),(e=>({placeholder:t.translate(e)}))),...e.inputMode.fold(y({}),(e=>({inputmode:e})))},a=Cx.parts.field({tag:!0===e.multiline?"textarea":"input",...e.data.map((e=>({data:e}))).getOr({}),inputAttributes:r,inputClasses:[e.classname],inputBehaviours:ll(q([n,s])),selectOnFocus:!1,factory:$x}),i=(e.flex?["tox-form__group--stretched"]:[]).concat(e.maximized?["tox-form-group--maximize"]:[]),l=[vm.config({disabled:()=>e.disabled||t.isDisabled(),onDisabled:e=>{Cx.getField(e).each(vm.disable)},onEnabled:e=>{Cx.getField(e).each(vm.enable)}}),Iv()];return Bx(o,a,i,l)};var fC=Object.freeze({__proto__:null,events:(e,t)=>{const o=e.stream.streams.setup(e,t);return Or([Er(e.event,o),zr((()=>t.cancel()))].concat(e.cancelEvent.map((e=>[Er(e,(()=>t.cancel()))])).getOr([])))}});const bC=(e,t)=>{let o=null;const n=()=>{c(o)||(clearTimeout(o),o=null)};return{cancel:n,throttle:(...s)=>{n(),o=setTimeout((()=>{o=null,e.apply(null,s)}),t)}}},vC=e=>{const t=hs(null);return ma({readState:()=>({timer:null!==t.get()?"set":"unset"}),setTimer:e=>{t.set(e)},cancel:()=>{const e=t.get();null!==e&&e.cancel()}})};var yC=Object.freeze({__proto__:null,throttle:vC,init:e=>e.stream.streams.state(e)}),xC=[jn("stream",Pn("mode",{throttle:[Un("delay"),as("stopEvent",!0),xi("streams",{setup:(e,t)=>{const o=e.stream,n=bC(e.onStream,o.delay);return t.setTimer(n),(e,t)=>{n.throttle(e,t),o.stopEvent&&t.stop()}},state:vC})]})),as("event","input"),Zn("cancelEvent"),vi("onStream")];const wC=dl({fields:xC,name:"streaming",active:fC,state:yC}),SC=(e,t,o)=>{const n=Jd.getValue(o);Jd.setValue(t,n),CC(t)},kC=(e,t)=>{const o=e.element,n=Aa(o),s=o.dom;"number"!==ft(o,"type")&&t(s,n)},CC=e=>{kC(e,((e,t)=>e.setSelectionRange(t.length,t.length)))},OC=y("alloy.typeahead.itemexecute"),_C=y([Zn("lazySink"),Un("fetch"),as("minChars",5),as("responseTime",1e3),fi("onOpen"),as("getHotspot",B.some),as("getAnchorOverrides",y({})),as("layouts",B.none()),as("eventOrder",{}),ps("model",{},[as("getDisplayText",(e=>void 0!==e.meta&&void 0!==e.meta.text?e.meta.text:e.value)),as("selectsOver",!0),as("populateFromBrowse",!0)]),fi("onSetValue"),bi("onExecute"),fi("onItemExecute"),as("inputClasses",[]),as("inputAttributes",{}),as("inputStyles",{}),as("matchWidth",!0),as("useMinWidth",!1),as("dismissOnBlur",!0),pi(["openClass"]),Zn("initialData"),Zd("typeaheadBehaviours",[Hp,Jd,wC,kp,Yp,mw]),Ln("previewing",(()=>hs(!0)))].concat(Wx()).concat(Cw())),TC=y([_u({schema:[gi()],name:"menu",overrides:e=>({fakeFocus:!0,onHighlight:(t,o)=>{e.previewing.get()?t.getSystem().getByUid(e.uid).each((n=>{((e,t,o)=>{if(e.selectsOver){const n=Jd.getValue(t),s=e.getDisplayText(n),r=Jd.getValue(o);return 0===e.getDisplayText(r).indexOf(s)?B.some((()=>{SC(0,t,o),((e,t)=>{kC(e,((e,o)=>e.setSelectionRange(t,o.length)))})(t,s.length)})):B.none()}return B.none()})(e.model,n,o).fold((()=>Em.dehighlight(t,o)),(e=>e()))})):t.getSystem().getByUid(e.uid).each((t=>{e.model.populateFromBrowse&&SC(e.model,t,o)})),e.previewing.set(!1)},onExecute:(t,o)=>t.getSystem().getByUid(e.uid).toOptional().map((e=>(xr(e,OC(),{item:o}),!0))),onHover:(t,o)=>{e.previewing.set(!1),t.getSystem().getByUid(e.uid).each((t=>{e.model.populateFromBrowse&&SC(e.model,t,o)}))}})})]),EC=em({name:"Typeahead",configFields:_C(),partFields:TC(),factory:(e,t,o,n)=>{const s=(t,o,s)=>{e.previewing.set(!1);const r=mw.getCoupled(t,"sandbox");if(Ad.isOpen(r))sm.getCurrent(r).each((e=>{Em.getHighlighted(e).fold((()=>{s(e)}),(()=>{Cr(r,e.element,"keydown",o)}))}));else{const o=e=>{sm.getCurrent(e).each(s)};bw(e,a(t),t,r,n,o,hw.HighlightFirst).get(b)}},r=Ux(e),a=e=>t=>t.map((t=>{const o=he(t.menus),n=X(o,(e=>W(e.items,(e=>"item"===e.type))));return Jd.getState(e).update(P(n,(e=>e.data))),t})),i=[Hp.config({}),Jd.config({onSetValue:e.onSetValue,store:{mode:"dataset",getDataKey:e=>Aa(e.element),getFallbackEntry:e=>({value:e,meta:{}}),setValue:(t,o)=>{Da(t.element,e.model.getDisplayText(o))},...e.initialData.map((e=>bs("initialValue",e))).getOr({})}}),wC.config({stream:{mode:"throttle",delay:e.responseTime,stopEvent:!1},onStream:(t,o)=>{const s=mw.getCoupled(t,"sandbox");if(Hp.isFocused(t)&&Aa(t.element).length>=e.minChars){const o=sm.getCurrent(s).bind((e=>Em.getHighlighted(e).map(Jd.getValue)));e.previewing.set(!0);const r=t=>{sm.getCurrent(s).each((t=>{o.fold((()=>{e.model.selectsOver&&Em.highlightFirst(t)}),(e=>{Em.highlightBy(t,(t=>Jd.getValue(t).value===e.value)),Em.getHighlighted(t).orThunk((()=>(Em.highlightFirst(t),B.none())))}))}))};bw(e,a(t),t,s,n,r,hw.HighlightFirst).get(b)}},cancelEvent:nr()}),kp.config({mode:"special",onDown:(e,t)=>(s(e,t,Em.highlightFirst),B.some(!0)),onEscape:e=>{const t=mw.getCoupled(e,"sandbox");return Ad.isOpen(t)?(Ad.close(t),B.some(!0)):B.none()},onUp:(e,t)=>(s(e,t,Em.highlightLast),B.some(!0)),onEnter:t=>{const o=mw.getCoupled(t,"sandbox"),n=Ad.isOpen(o);if(n&&!e.previewing.get())return sm.getCurrent(o).bind((e=>Em.getHighlighted(e))).map((e=>(xr(t,OC(),{item:e}),!0)));{const s=Jd.getValue(t);return yr(t,nr()),e.onExecute(o,t,s),n&&Ad.close(o),B.some(!0)}}}),Yp.config({toggleClass:e.markers.openClass,aria:{mode:"expanded"}}),mw.config({others:{sandbox:t=>Sw(e,t,{onOpen:()=>Yp.on(t),onClose:()=>Yp.off(t)})}}),Fp("typeaheadevents",[Pr((t=>{const o=b;yw(e,a(t),t,n,o,hw.HighlightFirst).get(b)})),Er(OC(),((t,o)=>{const n=mw.getCoupled(t,"sandbox");SC(e.model,t,o.event.item),yr(t,nr()),e.onItemExecute(t,n,o.event.item,Jd.getValue(t)),Ad.close(n),CC(t)}))].concat(e.dismissOnBlur?[Er(Ks(),(e=>{const t=mw.getCoupled(e,"sandbox");yl(t.element).isNone()&&Ad.close(t)}))]:[]))];return{uid:e.uid,dom:Gx(nn(e,{inputAttributes:{role:"combobox","aria-autocomplete":"list","aria-haspopup":"true"}})),behaviours:{...r,...eu(e.typeaheadBehaviours,i)},eventOrder:e.eventOrder}}}),BC=e=>({...e,toCached:()=>BC(e.toCached()),bindFuture:t=>BC(e.bind((e=>e.fold((e=>Zx($o.error(e))),(e=>t(e)))))),bindResult:t=>BC(e.map((e=>e.bind(t)))),mapResult:t=>BC(e.map((e=>e.map(t)))),mapError:t=>BC(e.map((e=>e.mapError(t)))),foldResult:(t,o)=>e.map((e=>e.fold(t,o))),withTimeout:(t,o)=>BC(Jx((n=>{let s=!1;const r=setTimeout((()=>{s=!0,n($o.error(o()))}),t);e.get((e=>{s||(clearTimeout(r),n(e))}))})))}),MC=e=>BC(Jx(e)),AC=e=>({isEnabled:()=>!vm.isDisabled(e),setEnabled:t=>vm.set(e,!t),setActive:t=>{const o=e.element;t?(_a(o,"tox-tbtn--enabled"),pt(o,"aria-pressed",!0)):(Ta(o,"tox-tbtn--enabled"),yt(o,"aria-pressed"))},isActive:()=>Ea(e.element,"tox-tbtn--enabled")}),DC=(e,t,o,n)=>Zk({text:e.text,icon:e.icon,tooltip:e.tooltip,role:n,fetch:(t,n)=>{e.fetch((e=>{n(oC(e,Uf.CLOSE_ON_EXECUTE,o,!1))}))},onSetup:e.onSetup,getApi:AC,columns:1,presets:"normal",classes:[],dropdownBehaviours:[Tx.config({})]},t,o.shared),FC=(e,t,o)=>{const n=e=>n=>{const s=!n.isActive();n.setActive(s),e.storage.set(s),o.shared.getSink().each((o=>{t().getOpt(o).each((t=>{fl(t.element),xr(t,Rx,{name:e.name,value:e.storage.get()})}))}))},s=e=>t=>{t.setActive(e.storage.get())};return t=>{t(P(e,(e=>{const t=e.text.fold((()=>({})),(e=>({text:e})));return{type:e.type,active:!1,...t,onAction:n(e),onSetup:s(e)}})))}},IC=(e,t,o=[],n,s,r)=>{const a=t.fold((()=>({})),(e=>({action:e}))),i={buttonBehaviours:ll([Vv((()=>!e.enabled||r.isDisabled())),Iv(),Tx.config({}),Fp("button press",[Tr("click"),Tr("mousedown")])].concat(o)),eventOrder:{click:["button press","alloy.base.behaviour"],mousedown:["button press","alloy.base.behaviour"]},...a},l=nn(i,{dom:n});return nn(l,{components:s})},VC=(e,t,o,n=[])=>{const s={tag:"button",classes:["tox-tbtn"],attributes:e.tooltip.map((e=>({"aria-label":o.translate(e),title:o.translate(e)}))).getOr({})},r=e.icon.map((e=>qk(e,o.icons))),a=Uv([r]);return IC(e,t,n,s,a,o)},RC=(e,t,o,n=[],s=[])=>{const r=o.translate(e.text),a=e.icon.map((e=>qk(e,o.icons))),i=[a.getOrThunk((()=>Na(r)))],l=[...(e=>{switch(e){case"primary":return["tox-button"];case"toolbar":return["tox-tbtn"];default:return["tox-button","tox-button--secondary"]}})(e.buttonType.getOr(e.primary||e.borderless?"primary":"secondary")),...a.isSome()?["tox-button--icon"]:[],...e.borderless?["tox-button--naked"]:[],...s];return IC(e,t,n,{tag:"button",classes:l,attributes:{title:r}},i,o)},zC=(e,t,o,n=[],s=[])=>{const r=RC(e,B.some(t),o,n,s);return kh.sketch(r)},HC=(e,t)=>o=>{"custom"===t?xr(o,Rx,{name:e,value:{}}):"submit"===t?yr(o,zx):"cancel"===t?yr(o,Vx):console.error("Unknown button type: ",t)},PC=(e,t,o)=>{if(((e,t)=>"menu"===t)(0,t)){const t=()=>r,n=e,s={...e,onSetup:t=>(t.setEnabled(e.enabled),b),fetch:FC(n.items,t,o)},r=Ch(DC(s,"tox-tbtn",o,B.none()));return r.asSpec()}if(((e,t)=>"custom"===t||"cancel"===t||"submit"===t)(0,t)){const n=HC(e.name,t),s={...e,borderless:!1};return zC(s,n,o.shared.providers,[])}console.error("Unknown footer button type: ",t)},NC={type:"separator"},LC=e=>({type:"menuitem",value:e.url,text:e.title,meta:{attach:e.attach},onAction:b}),WC=(e,t)=>({type:"menuitem",value:t,text:e,meta:{attach:void 0},onAction:b}),UC=(e,t)=>(e=>P(e,LC))(((e,t)=>W(t,(t=>t.type===e)))(e,t)),jC=e=>UC("header",e.targets),GC=e=>UC("anchor",e.targets),$C=e=>B.from(e.anchorTop).map((e=>WC("<top>",e))).toArray(),qC=e=>B.from(e.anchorBottom).map((e=>WC("<bottom>",e))).toArray(),XC=(e,t)=>{const o=e.toLowerCase();return W(t,(e=>{const t=void 0!==e.meta&&void 0!==e.meta.text?e.meta.text:e.text;return Ce(t.toLowerCase(),o)||Ce(e.value.toLowerCase(),o)}))},KC=Xr("aria-invalid"),YC=(e,t)=>{e.dom.checked=t},JC=e=>e.dom.checked,ZC=e=>(t,o,n,s)=>fe(o,"name").fold((()=>e(o,s,B.none())),(r=>t.field(r,e(o,s,fe(n,r))))),QC={bar:ZC(((e,t)=>((e,t)=>({dom:{tag:"div",classes:["tox-bar","tox-form__controls-h-stack"]},components:P(e.items,t.interpreter)}))(e,t.shared))),collection:ZC(((e,t,o)=>((e,t,o)=>{const n=e.label.map((e=>Dx(e,t))),s=e=>(t,o)=>{ei(o.event.target,"[data-collection-item-value]").each((n=>{e(t,o,n,ft(n,"data-collection-item-value"))}))},r=s(((o,n,s,r)=>{n.stop(),t.isDisabled()||xr(o,Rx,{name:e.name,value:r})})),a=[Er(Is(),s(((e,t,o)=>{fl(o)}))),Er(Ls(),r),Er(er(),r),Er(Vs(),s(((e,t,o)=>{Qa(e.element,"."+Jf).each((e=>{Ta(e,Jf)})),_a(o,Jf)}))),Er(Rs(),s((e=>{Qa(e.element,"."+Jf).each((e=>{Ta(e,Jf)}))}))),Pr(s(((t,o,n,s)=>{xr(t,Rx,{name:e.name,value:s})})))],i=(e,t)=>P(Ac(e.element,".tox-collection__item"),t),l=Cx.parts.field({dom:{tag:"div",classes:["tox-collection"].concat(1!==e.columns?["tox-collection--grid"]:["tox-collection--list"])},components:[],factory:{sketch:x},behaviours:ll([vm.config({disabled:t.isDisabled,onDisabled:e=>{i(e,(e=>{_a(e,"tox-collection__item--state-disabled"),pt(e,"aria-disabled",!0)}))},onEnabled:e=>{i(e,(e=>{Ta(e,"tox-collection__item--state-disabled"),yt(e,"aria-disabled")}))}}),Iv(),Dp.config({}),Jd.config({store:{mode:"memory",initialValue:o.getOr([])},onSetValue:(o,n)=>{((o,n)=>{const s=P(n,(o=>{const n=Oh.translate(o.text),s=1===e.columns?`<div class="tox-collection__item-label">${n}</div>`:"",r=`<div class="tox-collection__item-icon">${o.icon}</div>`,a={_:" "," - ":" ","-":" "},i=n.replace(/\_| \- |\-/g,(e=>a[e]));return`<div class="tox-collection__item${t.isDisabled()?" tox-collection__item--state-disabled":""}" tabindex="-1" data-collection-item-value="${Ex.encodeAllRaw(o.value)}" title="${i}" aria-label="${i}">${r}${s}</div>`})),r="auto"!==e.columns&&e.columns>1?H(s,e.columns):[s],a=P(r,(e=>`<div class="tox-collection__group">${e.join("")}</div>`));Lr(o.element,a.join(""))})(o,n),"auto"===e.columns&&xv(o,5,"tox-collection__item").each((({numRows:e,numColumns:t})=>{kp.setGridSize(o,e,t)})),yr(o,Lx)}}),Tx.config({}),kp.config((c=e.columns,1===c?{mode:"menu",moveOnTab:!1,selector:".tox-collection__item"}:"auto"===c?{mode:"flatgrid",selector:".tox-collection__item",initSize:{numColumns:1,numRows:1}}:{mode:"matrix",selectors:{row:".tox-collection__group",cell:`.${Gf}`}})),Fp("collection-events",a)]),eventOrder:{[Zs()]:["disabling","alloy.base.behaviour","collection-events"]}});var c;return Bx(n,l,["tox-form__group--collection"],[])})(e,t.shared.providers,o))),alertbanner:ZC(((e,t)=>((e,t)=>xx.sketch({dom:{tag:"div",attributes:{role:"alert"},classes:["tox-notification","tox-notification--in",`tox-notification--${e.level}`]},components:[{dom:{tag:"div",classes:["tox-notification__icon"]},components:[kh.sketch({dom:{tag:"button",classes:["tox-button","tox-button--naked","tox-button--icon"],innerHtml:Ah(e.icon,t.icons),attributes:{title:t.translate(e.iconTooltip)}},action:t=>{xr(t,Rx,{name:"alert-banner",value:e.url})},buttonBehaviours:ll([Dh()])})]},{dom:{tag:"div",classes:["tox-notification__body"],innerHtml:t.translate(e.text)}}]}))(e,t.shared.providers))),input:ZC(((e,t,o)=>((e,t,o)=>hC({name:e.name,multiline:!1,label:e.label,inputMode:e.inputMode,placeholder:e.placeholder,flex:!1,disabled:!e.enabled,classname:"tox-textfield",validation:B.none(),maximized:e.maximized,data:o},t))(e,t.shared.providers,o))),textarea:ZC(((e,t,o)=>((e,t,o)=>hC({name:e.name,multiline:!0,label:e.label,inputMode:B.none(),placeholder:e.placeholder,flex:!0,disabled:!e.enabled,classname:"tox-textarea",validation:B.none(),maximized:e.maximized,data:o},t))(e,t.shared.providers,o))),label:ZC(((e,t)=>((e,t)=>{return{dom:{tag:"div",classes:["tox-form__group"]},components:[{dom:{tag:"label",classes:["tox-label"]},components:[Na(t.providers.translate(e.label))]},...P(e.items,t.interpreter)],behaviours:ll([Ok(),Dp.config({}),(o=B.none(),Bk(o,Nr,Lr)),kp.config({mode:"acyclic"})])};var o})(e,t.shared))),iframe:(C_=(e,t,o)=>((e,t,o)=>{const n=e.sandboxed,s={...e.label.map((e=>({title:e}))).getOr({}),...o.map((e=>({srcdoc:e}))).getOr({}),...n?{sandbox:"allow-scripts allow-same-origin"}:{}},r=(e=>{const t=hs(e.getOr(""));return{getValue:e=>t.get(),setValue:(e,o)=>{t.get()!==o&&pt(e.element,"srcdoc",o),t.set(o)}}})(o),a=e.label.map((e=>Dx(e,t))),i=Cx.parts.field({factory:{sketch:e=>Nk({uid:e.uid,dom:{tag:"iframe",attributes:s},behaviours:ll([Tx.config({}),Hp.config({}),Dk(o,r.getValue,r.setValue)])})}});return Bx(a,i,["tox-form__group--stretched"],[])})(e,t.shared.providers,o),(e,t,o,n)=>{const s=nn(t,{source:"dynamic"});return ZC(C_)(e,s,o,n)}),button:ZC(((e,t)=>((e,t)=>{const o=HC(e.name,"custom");return n=B.none(),s=Cx.parts.field({factory:kh,...RC(e,B.some(o),t,[Fk(""),Ok()])}),Bx(n,s,[],[]);var n,s})(e,t.shared.providers))),checkbox:ZC(((e,t,o)=>((e,t,o)=>{const n=e=>(e.element.dom.click(),B.some(!0)),s=Cx.parts.field({factory:{sketch:x},dom:{tag:"input",classes:["tox-checkbox__input"],attributes:{type:"checkbox"}},behaviours:ll([Ok(),vm.config({disabled:()=>!e.enabled||t.isDisabled()}),Tx.config({}),Hp.config({}),Ak(o,JC,YC),kp.config({mode:"special",onEnter:n,onSpace:n,stopSpaceKeyup:!0}),Fp("checkbox-events",[Er(Ns(),((t,o)=>{xr(t,Fx,{name:e.name})}))])])}),r=Cx.parts.label({dom:{tag:"span",classes:["tox-checkbox__label"]},components:[Na(t.translate(e.label))],behaviours:ll([Ew.config({})])}),a=e=>Ih("checked"===e?"selected":"unselected",{tag:"span",classes:["tox-icon","tox-checkbox-icon__"+e]},t.icons),i=Ch({dom:{tag:"div",classes:["tox-checkbox__icons"]},components:[a("checked"),a("unchecked")]});return Cx.sketch({dom:{tag:"label",classes:["tox-checkbox"]},components:[s,i.asSpec(),r],fieldBehaviours:ll([vm.config({disabled:()=>!e.enabled||t.isDisabled(),disableClass:"tox-checkbox--disabled",onDisabled:e=>{Cx.getField(e).each(vm.disable)},onEnabled:e=>{Cx.getField(e).each(vm.enable)}}),Iv()])})})(e,t.shared.providers,o))),colorinput:ZC(((e,t,o)=>((e,t,o,n)=>{const s=Cx.parts.field({factory:$x,inputClasses:["tox-textfield"],data:n,onSetValue:e=>lw.run(e).get(b),inputBehaviours:ll([vm.config({disabled:t.providers.isDisabled}),Iv(),Tx.config({}),lw.config({invalidClass:"tox-textbox-field-invalid",getRoot:e=>Je(e.element),notify:{onValid:e=>{const t=Jd.getValue(e);xr(e,Bw,{color:t})}},validator:{validateOnLoad:!1,validate:e=>{const t=Jd.getValue(e);if(0===t.length)return Zx($o.value(!0));{const e=Ae("span");St(e,"background-color",t);const o=Tt(e,"background-color").fold((()=>$o.error("blah")),(e=>$o.value(t)));return Zx(o)}}}})]),selectOnFocus:!1}),r=e.label.map((e=>Dx(e,t.providers))),a=(e,t)=>{xr(e,Mw,{value:t})},i=Ch(((e,t)=>Tw.sketch({dom:e.dom,components:e.components,toggleClass:"mce-active",dropdownBehaviours:ll([Vv(t.providers.isDisabled),Iv(),Ew.config({}),Tx.config({})]),layouts:e.layouts,sandboxClasses:["tox-dialog__popups"],lazySink:t.getSink,fetch:o=>Jx((t=>e.fetch(t))).map((n=>B.from(lx(nn(Xy(Xr("menu-value"),n,(t=>{e.onItemAction(o,t)}),e.columns,e.presets,Uf.CLOSE_ON_EXECUTE,_,t.providers),{movement:Yy(e.columns,e.presets)}))))),parts:{menu:ab(0,0,e.presets)}}))({dom:{tag:"span",attributes:{"aria-label":t.providers.translate("Color swatch")}},layouts:{onRtl:()=>[ji,Ui,Xi],onLtr:()=>[Ui,ji,Xi]},components:[],fetch:Uy(o.getColors(),o.hasCustomColors()),columns:o.getColorCols(),presets:"color",onItemAction:(e,t)=>{i.getOpt(e).each((e=>{"custom"===t?o.colorPicker((t=>{t.fold((()=>yr(e,Aw)),(t=>{a(e,t),Hy(t)}))}),"#ffffff"):a(e,"remove"===t?"":t)}))}},t));return Cx.sketch({dom:{tag:"div",classes:["tox-form__group"]},components:r.toArray().concat([{dom:{tag:"div",classes:["tox-color-input"]},components:[s,i.asSpec()]}]),fieldBehaviours:ll([Fp("form-field-events",[Er(Bw,((t,o)=>{i.getOpt(t).each((e=>{St(e.element,"background-color",o.event.color)})),xr(t,Fx,{name:e.name})})),Er(Mw,((e,t)=>{Cx.getField(e).each((o=>{Jd.setValue(o,t.event.value),sm.getCurrent(e).each(Hp.focus)}))})),Er(Aw,((e,t)=>{Cx.getField(e).each((t=>{sm.getCurrent(e).each(Hp.focus)}))}))])])})})(e,t.shared,t.colorinput,o))),colorpicker:ZC(((e,t,o)=>((e,t,o)=>{const n=e=>"tox-"+e,s=Ck((e=>t=>e.translate(Ik[t]))(t),n),r=Ch(s.sketch({dom:{tag:"div",classes:[n("color-picker-container")],attributes:{role:"presentation"}},onValidHex:e=>{xr(e,Rx,{name:"hex-valid",value:!0})},onInvalidHex:e=>{xr(e,Rx,{name:"hex-valid",value:!1})}}));return{dom:{tag:"div"},components:[r.asSpec()],behaviours:ll([Dk(o,(e=>{const t=r.get(e);return sm.getCurrent(t).bind((e=>Jd.getValue(e).hex)).map((e=>"#"+e)).getOr("")}),((e,t)=>{const o=/^#([a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?)/.exec(t),n=r.get(e);sm.getCurrent(n).fold((()=>{console.log("Can not find form")}),(e=>{Jd.setValue(e,{hex:B.from(o[1]).getOr("")}),vk.getField(e,"hex").each((e=>{yr(e,Ps())}))}))})),Ok()])}})(0,t.shared.providers,o))),dropzone:ZC(((e,t,o)=>((e,t,o)=>{const n=(e,t)=>{t.stop()},s=e=>(t,o)=>{N(e,(e=>{e(t,o)}))},r=(e,t)=>{if(!vm.isDisabled(e)){const o=t.event.raw;i(e,o.dataTransfer.files)}},a=(e,t)=>{const o=t.event.raw.target;i(e,o.files)},i=(o,n)=>{Jd.setValue(o,((e,t)=>{const o=Rk.explode(t.getOption("images_file_types"));return W(se(e),(e=>R(o,(t=>Oe(e.name.toLowerCase(),`.${t.toLowerCase()}`)))))})(n,t)),xr(o,Fx,{name:e.name})},l=Ch({dom:{tag:"input",attributes:{type:"file",accept:"image/*"},styles:{display:"none"}},behaviours:ll([Fp("input-file-events",[Fr(Ls()),Fr(er())])])}),c=e.label.map((e=>Dx(e,t))),d=Cx.parts.field({factory:{sketch:e=>({uid:e.uid,dom:{tag:"div",classes:["tox-dropzone-container"]},behaviours:ll([Fk(o.getOr([])),Ok(),vm.config({}),Yp.config({toggleClass:"dragenter",toggleOnExecute:!1}),Fp("dropzone-events",[Er("dragenter",s([n,Yp.toggle])),Er("dragleave",s([n,Yp.toggle])),Er("dragover",n),Er("drop",s([n,r])),Er(Ns(),a)])]),components:[{dom:{tag:"div",classes:["tox-dropzone"],styles:{}},components:[{dom:{tag:"p"},components:[Na(t.translate("Drop an image here"))]},kh.sketch({dom:{tag:"button",styles:{position:"relative"},classes:["tox-button","tox-button--secondary"]},components:[Na(t.translate("Browse for an image")),l.asSpec()],action:e=>{l.get(e).element.dom.click()},buttonBehaviours:ll([Tx.config({}),Vv(t.isDisabled),Iv()])})]}]})}});return Bx(c,d,["tox-form__group--stretched"],[])})(e,t.shared.providers,o))),grid:ZC(((e,t)=>((e,t)=>({dom:{tag:"div",classes:["tox-form__grid",`tox-form__grid--${e.columns}col`]},components:P(e.items,t.interpreter)}))(e,t.shared))),listbox:ZC(((e,t,o)=>((e,t,o)=>{const n=t.shared.providers,s=o.bind((t=>aC(e.items,t))).orThunk((()=>oe(e.items).filter(nC))),r=e.label.map((e=>Dx(e,n))),a=Cx.parts.field({dom:{},factory:{sketch:o=>Zk({uid:o.uid,text:s.map((e=>e.text)),icon:B.none(),tooltip:e.label,role:B.none(),fetch:(o,n)=>{const s=rC(o,e.name,e.items,Jd.getValue(o));n(oC(s,Uf.CLOSE_ON_EXECUTE,t,!1))},onSetup:y(b),getApi:y({}),columns:1,presets:"normal",classes:[],dropdownBehaviours:[Tx.config({}),Dk(s.map((e=>e.value)),(e=>ft(e.element,sC)),((t,o)=>{aC(e.items,o).each((e=>{pt(t.element,sC,e.value),xr(t,Yk,{text:e.text})}))}))]},"tox-listbox",t.shared)}}),i={dom:{tag:"div",classes:["tox-listboxfield"]},components:[a]};return Cx.sketch({dom:{tag:"div",classes:["tox-form__group"]},components:q([r.toArray(),[i]]),fieldBehaviours:ll([vm.config({disabled:y(!e.enabled),onDisabled:e=>{Cx.getField(e).each(vm.disable)},onEnabled:e=>{Cx.getField(e).each(vm.enable)}})])})})(e,t,o))),selectbox:ZC(((e,t,o)=>((e,t,o)=>{const n=P(e.items,(e=>({text:t.translate(e.text),value:e.value}))),s=e.label.map((e=>Dx(e,t))),r=Cx.parts.field({dom:{},...o.map((e=>({data:e}))).getOr({}),selectAttributes:{size:e.size},options:n,factory:iC,selectBehaviours:ll([vm.config({disabled:()=>!e.enabled||t.isDisabled()}),Tx.config({}),Fp("selectbox-change",[Er(Ns(),((t,o)=>{xr(t,Fx,{name:e.name})}))])])}),a=e.size>1?B.none():B.some(Ih("chevron-down",{tag:"div",classes:["tox-selectfield__icon-js"]},t.icons)),i={dom:{tag:"div",classes:["tox-selectfield"]},components:q([[r],a.toArray()])};return Cx.sketch({dom:{tag:"div",classes:["tox-form__group"]},components:q([s.toArray(),[i]]),fieldBehaviours:ll([vm.config({disabled:()=>!e.enabled||t.isDisabled(),onDisabled:e=>{Cx.getField(e).each(vm.disable)},onEnabled:e=>{Cx.getField(e).each(vm.enable)}}),Iv()])})})(e,t.shared.providers,o))),sizeinput:ZC(((e,t)=>((e,t)=>{let o=pC;const n=Xr("ratio-event"),s=e=>Ih(e,{tag:"span",classes:["tox-icon","tox-lock-icon__"+e]},t.icons),r=uC.parts.lock({dom:{tag:"button",classes:["tox-lock","tox-button","tox-button--naked","tox-button--icon"],attributes:{title:t.translate(e.label.getOr("Constrain proportions"))}},components:[s("lock"),s("unlock")],buttonBehaviours:ll([vm.config({disabled:()=>!e.enabled||t.isDisabled()}),Iv(),Tx.config({})])}),a=e=>({dom:{tag:"div",classes:["tox-form__group"]},components:e}),i=o=>Cx.parts.field({factory:$x,inputClasses:["tox-textfield"],inputBehaviours:ll([vm.config({disabled:()=>!e.enabled||t.isDisabled()}),Iv(),Tx.config({}),Fp("size-input-events",[Er(Vs(),((e,t)=>{xr(e,n,{isField1:o})})),Er(Ns(),((t,o)=>{xr(t,Fx,{name:e.name})}))])]),selectOnFocus:!1}),l=e=>({dom:{tag:"label",classes:["tox-label"]},components:[Na(t.translate(e))]}),c=uC.parts.field1(a([Cx.parts.label(l("Width")),i(!0)])),d=uC.parts.field2(a([Cx.parts.label(l("Height")),i(!1)]));return uC.sketch({dom:{tag:"div",classes:["tox-form__group"]},components:[{dom:{tag:"div",classes:["tox-form__controls-h-stack"]},components:[c,d,a([l("\xa0"),r])]}],field1Name:"width",field2Name:"height",locked:!0,markers:{lockClass:"tox-locked"},onLockedChange:(e,t,n)=>{mC(Jd.getValue(e)).each((e=>{o(e).each((e=>{Jd.setValue(t,(e=>{const t={"":0,px:0,pt:1,mm:1,pc:2,ex:2,em:2,ch:2,rem:2,cm:3,in:4,"%":4};let o=e.value.toFixed((n=e.unit)in t?t[n]:1);var n;return-1!==o.indexOf(".")&&(o=o.replace(/\.?0*$/,"")),o+e.unit})(e))}))}))},coupledFieldBehaviours:ll([vm.config({disabled:()=>!e.enabled||t.isDisabled(),onDisabled:e=>{uC.getField1(e).bind(Cx.getField).each(vm.disable),uC.getField2(e).bind(Cx.getField).each(vm.disable),uC.getLock(e).each(vm.disable)},onEnabled:e=>{uC.getField1(e).bind(Cx.getField).each(vm.enable),uC.getField2(e).bind(Cx.getField).each(vm.enable),uC.getLock(e).each(vm.enable)}}),Iv(),Fp("size-input-events2",[Er(n,((e,t)=>{const n=t.event.isField1,s=n?uC.getField1(e):uC.getField2(e),r=n?uC.getField2(e):uC.getField1(e),a=s.map(Jd.getValue).getOr(""),i=r.map(Jd.getValue).getOr("");o=((e,t)=>{const o=mC(e).toOptional(),n=mC(t).toOptional();return we(o,n,((e,t)=>gC(e,t.unit).map((e=>t.value/e)).map((e=>{return o=e,n=t.unit,e=>gC(e,n).map((e=>({value:e*o,unit:n})));var o,n})).getOr(pC))).getOr(pC)})(a,i)}))])])})})(e,t.shared.providers))),slider:ZC(((e,t,o)=>((e,t,o)=>{const n=dk.parts.label({dom:{tag:"label",classes:["tox-label"]},components:[Na(t.translate(e.label))]}),s=dk.parts.spectrum({dom:{tag:"div",classes:["tox-slider__rail"],attributes:{role:"presentation"}}}),r=dk.parts.thumb({dom:{tag:"div",classes:["tox-slider__handle"],attributes:{role:"presentation"}}});return dk.sketch({dom:{tag:"div",classes:["tox-slider"],attributes:{role:"presentation"}},model:{mode:"x",minX:e.min,maxX:e.max,getInitialValue:y(o.getOrThunk((()=>(Math.abs(e.max)-Math.abs(e.min))/2)))},components:[n,s,r],sliderBehaviours:ll([Ok(),Hp.config({})]),onChoose:(t,o,n)=>{xr(t,Fx,{name:e.name,value:n})}})})(e,t.shared.providers,o))),urlinput:ZC(((e,t,o)=>((e,t,o,n)=>{const s=t.shared.providers,r=t=>{const n=Jd.getValue(t);o.addToHistory(n.value,e.filetype)},a=Cx.parts.field({factory:EC,...n.map((e=>({initialData:e}))).getOr({}),dismissOnBlur:!0,inputClasses:["tox-textfield"],sandboxClasses:["tox-dialog__popups"],inputAttributes:{"aria-errormessage":KC,type:"url"},minChars:0,responseTime:0,fetch:n=>{const s=((e,t,o)=>{const n=Jd.getValue(t),s=void 0!==n.meta.text?n.meta.text:n.value;return o.getLinkInformation().fold((()=>[]),(t=>{const n=XC(s,(e=>P(e,(e=>WC(e,e))))(o.getHistory(e)));return"file"===e?(r=[n,XC(s,jC(t)),XC(s,q([$C(t),GC(t),qC(t)]))],j(r,((e,t)=>0===e.length||0===t.length?e.concat(t):e.concat(NC,t)),[])):n;var r}))})(e.filetype,n,o),r=oC(s,Uf.BUBBLE_TO_SANDBOX,t,!1);return Zx(r)},getHotspot:e=>m.getOpt(e),onSetValue:(e,t)=>{e.hasConfigured(lw)&&lw.run(e).get(b)},typeaheadBehaviours:ll(q([o.getValidationHandler().map((t=>lw.config({getRoot:e=>Je(e.element),invalidClass:"tox-control-wrap--status-invalid",notify:{onInvalid:(e,t)=>{l.getOpt(e).each((e=>{pt(e.element,"title",s.translate(t))}))}},validator:{validate:o=>{const n=Jd.getValue(o);return MC((o=>{t({type:e.filetype,url:n.value},(e=>{if("invalid"===e.status){const t=$o.error(e.message);o(t)}else{const t=$o.value(e.message);o(t)}}))}))},validateOnLoad:!1}}))).toArray(),[vm.config({disabled:()=>!e.enabled||s.isDisabled()}),Tx.config({}),Fp("urlinput-events",q(["file"===e.filetype?[Er(Ps(),(t=>{xr(t,Fx,{name:e.name})}))]:[],[Er(Ns(),(t=>{xr(t,Fx,{name:e.name}),r(t)})),Er(Ys(),(t=>{xr(t,Fx,{name:e.name}),r(t)}))]]))]])),eventOrder:{[Ps()]:["streaming","urlinput-events","invalidating"]},model:{getDisplayText:e=>e.value,selectsOver:!1,populateFromBrowse:!1},markers:{openClass:"tox-textfield--popup-open"},lazySink:t.shared.getSink,parts:{menu:ab(0,0,"normal")},onExecute:(e,t,o)=>{xr(t,zx,{})},onItemExecute:(t,o,n,s)=>{r(t),xr(t,Fx,{name:e.name})}}),i=e.label.map((e=>Dx(e,s))),l=Ch(((e,t,o=e,n=e)=>Ih(o,{tag:"div",classes:["tox-icon","tox-control-wrap__status-icon-"+e],attributes:{title:s.translate(n),"aria-live":"polite",...t.fold((()=>({})),(e=>({id:e})))}},s.icons))("invalid",B.some(KC),"warning")),c=Ch({dom:{tag:"div",classes:["tox-control-wrap__status-icon-wrap"]},components:[l.asSpec()]}),d=o.getUrlPicker(e.filetype),u=Xr("browser.url.event"),m=Ch({dom:{tag:"div",classes:["tox-control-wrap"]},components:[a,c.asSpec()],behaviours:ll([vm.config({disabled:()=>!e.enabled||s.isDisabled()})])}),g=Ch(zC({name:e.name,icon:B.some("browse"),text:e.label.getOr(""),enabled:e.enabled,primary:!1,buttonType:B.none(),borderless:!0},(e=>yr(e,u)),s,[],["tox-browse-url"]));return Cx.sketch({dom:Ax([]),components:i.toArray().concat([{dom:{tag:"div",classes:["tox-form__controls-h-stack"]},components:q([[m.asSpec()],d.map((()=>g.asSpec())).toArray()])}]),fieldBehaviours:ll([vm.config({disabled:()=>!e.enabled||s.isDisabled(),onDisabled:e=>{Cx.getField(e).each(vm.disable),g.getOpt(e).each(vm.disable)},onEnabled:e=>{Cx.getField(e).each(vm.enable),g.getOpt(e).each(vm.enable)}}),Iv(),Fp("url-input-events",[Er(u,(t=>{sm.getCurrent(t).each((o=>{const n=Jd.getValue(o),s={fieldname:e.name,...n};d.each((n=>{n(s).get((n=>{Jd.setValue(o,n),xr(t,Fx,{name:e.name})}))}))}))}))])])})})(e,t,t.urlinput,o))),customeditor:ZC((e=>{const t=zl(),o=Ch({dom:{tag:e.tag}}),n=zl();return{dom:{tag:"div",classes:["tox-custom-editor"]},behaviours:ll([Fp("custom-editor-events",[Rr((s=>{o.getOpt(s).each((o=>{((e=>be(e,"init"))(e)?e.init(o.element.dom):Vk.load(e.scriptId,e.scriptUrl).then((t=>t(o.element.dom,e.settings)))).then((e=>{n.on((t=>{e.setValue(t)})),n.clear(),t.set(e)}))}))}))]),Dk(B.none(),(()=>t.get().fold((()=>n.get().getOr("")),(e=>e.getValue()))),((e,o)=>{t.get().fold((()=>n.set(o)),(e=>e.setValue(o)))})),Ok()]),components:[o.asSpec()]}})),htmlpanel:ZC((e=>"presentation"===e.presets?xx.sketch({dom:{tag:"div",classes:["tox-form__group"],innerHtml:e.html}}):xx.sketch({dom:{tag:"div",classes:["tox-form__group"],innerHtml:e.html,attributes:{role:"document"}},containerBehaviours:ll([Tx.config({}),Hp.config({})])}))),imagepreview:ZC(((e,t,o)=>((e,t)=>{const o=hs(t.getOr({url:""})),n=Ch({dom:{tag:"img",classes:["tox-imagepreview__image"],attributes:t.map((e=>({src:e.url}))).getOr({})}}),s=Ch({dom:{tag:"div",classes:["tox-imagepreview__container"],attributes:{role:"presentation"}},components:[n.asSpec()]}),r={};e.height.each((e=>r.height=e));const a=t.map((e=>({url:e.url,zoom:B.from(e.zoom),cachedWidth:B.from(e.cachedWidth),cachedHeight:B.from(e.cachedHeight)})));return{dom:{tag:"div",classes:["tox-imagepreview"],styles:r,attributes:{role:"presentation"}},components:[s.asSpec()],behaviours:ll([Ok(),Dk(a,(()=>o.get()),((e,t)=>{const r={url:t.url};t.zoom.each((e=>r.zoom=e)),t.cachedWidth.each((e=>r.cachedWidth=e)),t.cachedHeight.each((e=>r.cachedHeight=e)),o.set(r);const a=()=>{const t=r.cachedWidth,o=r.cachedHeight;if(u(r.zoom)){const n=((e,t,o)=>{const n=Wt(e),s=It(e);return Math.min(n/t,s/o,1)})(e.element,t,o);r.zoom=n}const n=((e,t,o,n,s)=>{const r=o*s,a=n*s,i=Math.max(0,e/2-r/2),l=Math.max(0,t/2-a/2);return{left:i.toString()+"px",top:l.toString()+"px",width:r.toString()+"px",height:a.toString()+"px"}})(Wt(e.element),It(e.element),t,o,r.zoom);s.getOpt(e).each((e=>{kt(e.element,n)}))};n.getOpt(e).each((o=>{const n=o.element;var s;t.url!==ft(n,"src")&&(pt(n,"src",t.url),Ta(e.element,"tox-imagepreview__loaded")),u(r.cachedWidth)||u(r.cachedHeight)||a(),(s=n,new Promise(((e,t)=>{const o=()=>{r(),e(s)},n=[Pl(s,"load",o),Pl(s,"error",(()=>{r(),t("Unable to load data from image: "+s.dom.src)}))],r=()=>N(n,(e=>e.unbind()));s.dom.complete&&o()}))).then((t=>{e.getSystem().isConnected()&&(_a(e.element,"tox-imagepreview__loaded"),r.cachedWidth=t.dom.naturalWidth,r.cachedHeight=t.dom.naturalHeight,a())}))}))}))])}})(e,o))),table:ZC(((e,t)=>((e,t)=>{const o=e=>({dom:{tag:"td",innerHtml:t.translate(e)}});return{dom:{tag:"table",classes:["tox-dialog__table"]},components:[(s=e.header,{dom:{tag:"thead"},components:[{dom:{tag:"tr"},components:P(s,(e=>({dom:{tag:"th",innerHtml:t.translate(e)}})))}]}),(n=e.cells,{dom:{tag:"tbody"},components:P(n,(e=>({dom:{tag:"tr"},components:P(e,o)})))})],behaviours:ll([Tx.config({}),Hp.config({})])};var n,s})(e,t.shared.providers))),panel:ZC(((e,t)=>((e,t)=>({dom:{tag:"div",classes:e.classes},components:P(e.items,t.shared.interpreter)}))(e,t)))},eO={field:(e,t)=>t,record:y([])},tO=(e,t,o,n)=>{const s=nn(n,{shared:{interpreter:t=>oO(e,t,o,s)}});return oO(e,t,o,s)},oO=(e,t,o,n)=>fe(QC,t.type).fold((()=>(console.error(`Unknown factory type "${t.type}", defaulting to container: `,t),t)),(s=>s(e,t,o,n))),nO="layout-inset",sO=e=>e.x,rO=(e,t)=>e.x+e.width/2-t.width/2,aO=(e,t)=>e.x+e.width-t.width,iO=e=>e.y,lO=(e,t)=>e.y+e.height-t.height,cO=(e,t)=>e.y+e.height/2-t.height/2,dO=(e,t,o)=>ki(aO(e,t),lO(e,t),o.insetSouthwest(),Ei(),"southwest",Vi(e,{right:0,bottom:3}),nO),uO=(e,t,o)=>ki(sO(e),lO(e,t),o.insetSoutheast(),Ti(),"southeast",Vi(e,{left:1,bottom:3}),nO),mO=(e,t,o)=>ki(aO(e,t),iO(e),o.insetNorthwest(),_i(),"northwest",Vi(e,{right:0,top:2}),nO),gO=(e,t,o)=>ki(sO(e),iO(e),o.insetNortheast(),Oi(),"northeast",Vi(e,{left:1,top:2}),nO),pO=(e,t,o)=>ki(rO(e,t),iO(e),o.insetNorth(),Bi(),"north",Vi(e,{top:2}),nO),hO=(e,t,o)=>ki(rO(e,t),lO(e,t),o.insetSouth(),Mi(),"south",Vi(e,{bottom:3}),nO),fO=(e,t,o)=>ki(aO(e,t),cO(e,t),o.insetEast(),Di(),"east",Vi(e,{right:0}),nO),bO=(e,t,o)=>ki(sO(e),cO(e,t),o.insetWest(),Ai(),"west",Vi(e,{left:1}),nO),vO=e=>{switch(e){case"north":return pO;case"northeast":return gO;case"northwest":return mO;case"south":return hO;case"southeast":return uO;case"southwest":return dO;case"east":return fO;case"west":return bO}},yO=(e,t,o,n,s)=>Dl(n).map(vO).getOr(pO)(e,t,o,n,s),xO=e=>{switch(e){case"north":return hO;case"northeast":return uO;case"northwest":return dO;case"south":return pO;case"southeast":return gO;case"southwest":return mO;case"east":return bO;case"west":return fO}},wO=(e,t,o,n,s)=>Dl(n).map(xO).getOr(pO)(e,t,o,n,s),SO={valignCentre:[],alignCentre:[],alignLeft:[],alignRight:[],right:[],left:[],bottom:[],top:[]},kO=(e,t,o)=>{const n={maxHeightFunction:ql()};return()=>o()?{type:"node",root:it(e()),node:B.from(e()),bubble:Jl(12,12,SO),layouts:{onRtl:()=>[gO],onLtr:()=>[mO]},overrides:n}:{type:"hotspot",hotspot:t(),bubble:Jl(-12,12,SO),layouts:{onRtl:()=>[Ui],onLtr:()=>[ji]},overrides:n}},CO=(e,t,o)=>()=>o()?{type:"node",root:it(e()),node:B.from(e()),layouts:{onRtl:()=>[pO],onLtr:()=>[pO]}}:{type:"hotspot",hotspot:t(),layouts:{onRtl:()=>[Xi],onLtr:()=>[Xi]}},OO=(e,t)=>()=>({type:"selection",root:t(),getSelection:()=>{const t=e.selection.getRng();return B.some(Cc.range(Fe(t.startContainer),t.startOffset,Fe(t.endContainer),t.endOffset))}}),_O=e=>t=>({type:"node",root:e(),node:t}),TO=(e,t,o)=>{const n=If(e),s=()=>Fe(e.getBody()),r=()=>Fe(e.getContentAreaContainer()),a=()=>n||!o();return{inlineDialog:kO(r,t,a),banner:CO(r,t,a),cursor:OO(e,s),node:_O(s)}},EO=e=>(t,o)=>{qy(e)(t,o)},BO=e=>()=>Ry(e),MO=e=>()=>zy(e),AO=e=>()=>Vy(e),DO=e=>({colorPicker:EO(e),hasCustomColors:BO(e),getColors:MO(e),getColorCols:AO(e)}),FO=e=>()=>yf(e),IO=e=>({isDraggableModal:FO(e)}),VO=[{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"}]}],RO=e=>j(e,((e,t)=>{if(be(t,"items")){const o=RO(t.items);return{customFormats:e.customFormats.concat(o.customFormats),formats:e.formats.concat([{title:t.title,items:o.formats}])}}if(be(t,"inline")||(e=>be(e,"block"))(t)||(e=>be(e,"selector"))(t)){const o=`custom-${r(t.name)?t.name:t.title.toLowerCase()}`;return{customFormats:e.customFormats.concat([{name:o,format:t}]),formats:e.formats.concat([{title:t.title,format:o,icon:t.icon}])}}return{...e,formats:e.formats.concat(t)}}),{customFormats:[],formats:[]}),zO=e=>Zh(e).map((t=>{const o=((e,t)=>{const o=RO(t),n=t=>{N(t,(t=>{e.formatter.has(t.name)||e.formatter.register(t.name,t.format)}))};return e.formatter?n(o.customFormats):e.on("init",(()=>{n(o.customFormats)})),o.formats})(e,t);return Qh(e)?VO.concat(o):o})).getOr(VO),HO=(e,t,o)=>{const n={type:"formatter",isSelected:t(e.format),getStylePreview:o(e.format)};return nn(e,n)},PO=(e,t,o,n)=>{const s=t=>P(t,(t=>{const a=ae(t);if(ve(t,"items")){const e=s(t.items);return nn((e=>nn(e,{type:"submenu"}))(t),{getStyleItems:y(e)})}return ve(t,"format")?(e=>HO(e,o,n))(t):1===a.length&&V(a,"title")?nn(t,{type:"separator"}):(t=>{const s=r(t.name)?t.name:Xr(t.title),a=`custom-${s}`,i={type:"formatter",format:a,isSelected:o(a),getStylePreview:n(a)},l=nn(t,i);return e.formatter.register(s,l),l})(t)}));return s(t)},NO=e=>{const t=t=>()=>e.formatter.match(t),o=t=>()=>{const o=e.formatter.get(t);return void 0!==o?B.some({tag:o.length>0&&(o[0].inline||o[0].block)||"div",styles:e.dom.parseStyle(e.formatter.getCssText(t))}):B.none()},n=e=>{const t=e.items;return void 0!==t&&t.length>0?X(t,n):[e.format]},s=hs([]),r=hs([]),a=hs([]),i=hs([]),l=hs(!1);return e.on("PreInit",(a=>{const i=zO(e),l=PO(e,i,t,o);s.set(l),r.set(X(l,n))})),e.on("addStyleModifications",(s=>{const r=PO(e,s.items,t,o);a.set(r),l.set(s.replace),i.set(X(r,n))})),{getData:()=>{const e=l.get()?[]:s.get(),t=a.get();return e.concat(t)},getFlattenedKeys:()=>{const e=l.get()?[]:r.get(),t=i.get();return e.concat(t)}}},LO=Rk.trim,WO=e=>t=>{if((e=>g(e)&&1===e.nodeType)(t)){if(t.contentEditable===e)return!0;if(t.getAttribute("data-mce-contenteditable")===e)return!0}return!1},UO=WO("true"),jO=WO("false"),GO=(e,t,o,n,s)=>({type:e,title:t,url:o,level:n,attach:s}),$O=e=>e.innerText||e.textContent,qO=e=>(e=>e&&"A"===e.nodeName&&void 0!==(e.id||e.name))(e)&&KO(e),XO=e=>e&&/^(H[1-6])$/.test(e.nodeName),KO=e=>(e=>{for(;e=e.parentNode;){const t=e.contentEditable;if(t&&"inherit"!==t)return UO(e)}return!1})(e)&&!jO(e),YO=e=>XO(e)&&KO(e),JO=e=>{const t=(e=>e.id?e.id:Xr("h"))(e);return GO("header",$O(e),"#"+t,(e=>XO(e)?parseInt(e.nodeName.substr(1),10):0)(e),(()=>{e.id=t}))},ZO=e=>{const t=e.id||e.name,o=$O(e);return GO("anchor",o||"#"+t,"#"+t,0,b)},QO=e=>LO(e.title).length>0,e_=e=>{const t=(e=>{const t=P(Ac(Fe(e),"h1,h2,h3,h4,h5,h6,a:not([href])"),(e=>e.dom));return t})(e);return W((e=>P(W(e,YO),JO))(t).concat((e=>P(W(e,qO),ZO))(t)),QO)},t_="tinymce-url-history",o_=e=>r(e)&&/^https?/.test(e),n_=e=>a(e)&&pe(e,(e=>{return!(l(t=e)&&t.length<=5&&K(t,o_));var t})).isNone(),s_=()=>{const e=My.getItem(t_);if(null===e)return{};let t;try{t=JSON.parse(e)}catch(e){if(e instanceof SyntaxError)return console.log("Local storage "+t_+" was not valid JSON",e),{};throw e}return n_(t)?t:(console.log("Local storage "+t_+" was not valid format",t),{})},r_=e=>{const t=s_();return fe(t,e).getOr([])},a_=(e,t)=>{if(!o_(e))return;const o=s_(),n=fe(o,t).getOr([]),s=W(n,(t=>t!==e));o[t]=[e].concat(s).slice(0,5),(e=>{if(!n_(e))throw new Error("Bad format for history:\n"+JSON.stringify(e));My.setItem(t_,JSON.stringify(e))})(o)},i_=e=>!!e,l_=e=>ce(Rk.makeMap(e,/[, ]/),i_),c_=e=>B.from(gf(e)),d_=e=>B.from(e).filter(r).getOrUndefined(),u_=e=>({getHistory:r_,addToHistory:a_,getLinkInformation:()=>(e=>ff(e)?B.some({targets:e_(e.getBody()),anchorTop:d_(bf(e)),anchorBottom:d_(vf(e))}):B.none())(e),getValidationHandler:()=>(e=>B.from(pf(e)))(e),getUrlPicker:t=>((e,t)=>((e,t)=>{const o=(e=>{const t=B.from(hf(e)).filter(i_).map(l_);return c_(e).fold(_,(e=>t.fold(T,(e=>ae(e).length>0&&e))))})(e);return d(o)?o?c_(e):B.none():o[t]?c_(e):B.none()})(e,t).map((o=>n=>Jx((s=>{const i={filetype:t,fieldname:n.fieldname,...B.from(n.meta).getOr({})};o.call(e,((e,t)=>{if(!r(e))throw new Error("Expected value to be string");if(void 0!==t&&!a(t))throw new Error("Expected meta to be a object");s({value:e,meta:t})}),n.value,i)})))))(e,t)}),m_=qu,g_=Mu,p_=y([as("shell",!1),Un("makeItem"),as("setupItem",b),tu("listBehaviours",[Dp])]),h_=Tu({name:"items",overrides:()=>({behaviours:ll([Dp.config({})])})}),f_=y([h_]),b_=em({name:y("CustomList")(),configFields:p_(),partFields:f_(),factory:(e,t,o,n)=>{const s=e.shell?{behaviours:[Dp.config({})],components:[]}:{behaviours:[],components:t};return{uid:e.uid,dom:e.dom,components:s.components,behaviours:eu(e.listBehaviours,s.behaviours),apis:{setItems:(t,o)=>{var n;(n=t,e.shell?B.some(n):Pu(n,e,"items")).fold((()=>{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")}),(n=>{const s=Dp.contents(n),r=o.length,a=r-s.length,i=a>0?z(a,(()=>e.makeItem())):[],l=s.slice(r);N(l,(e=>Dp.remove(n,e))),N(i,(e=>Dp.append(n,e)));const c=Dp.contents(n);N(c,((n,s)=>{e.setupItem(t,n,o[s],s)}))}))}}}},apis:{setItems:(e,t,o)=>{e.setItems(t,o)}}}),v_=y([Un("dom"),as("shell",!0),Zd("toolbarBehaviours",[Dp])]),y_=y([Tu({name:"groups",overrides:()=>({behaviours:ll([Dp.config({})])})})]),x_=em({name:"Toolbar",configFields:v_(),partFields:y_(),factory:(e,t,o,n)=>{const s=e.shell?{behaviours:[Dp.config({})],components:[]}:{behaviours:[],components:t};return{uid:e.uid,dom:e.dom,components:s.components,behaviours:eu(e.toolbarBehaviours,s.behaviours),apis:{setGroups:(t,o)=>{var n;(n=t,e.shell?B.some(n):Pu(n,e,"groups")).fold((()=>{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")}),(e=>{Dp.set(e,o)}))}},domModification:{attributes:{role:"group"}}}},apis:{setGroups:(e,t,o)=>{e.setGroups(t,o)}}}),w_=b,S_=_,k_=y([]);var C_,O_=Object.freeze({__proto__:null,setup:w_,isDocked:S_,getBehaviours:k_});const __=e=>(ye(Tt(e,"position"),"fixed")?B.none():Ze(e)).orThunk((()=>{const t=Ae("span");return Ye(e).bind((e=>{Eo(e,t);const o=Ze(t);return Ao(t),o}))})),T_=e=>__(e).map(Pt).getOrThunk((()=>zt(0,0))),E_=fs([{static:[]},{absolute:["positionCss"]},{fixed:["positionCss"]}]),B_=(e,t)=>{const o=e.element;_a(o,t.transitionClass),Ta(o,t.fadeOutClass),_a(o,t.fadeInClass),t.onShow(e)},M_=(e,t)=>{const o=e.element;_a(o,t.transitionClass),Ta(o,t.fadeInClass),_a(o,t.fadeOutClass),t.onHide(e)},A_=(e,t,o)=>K(e,(e=>{switch(e){case"bottom":return((e,t)=>e.bottom<=t.bottom)(t,o);case"top":return((e,t)=>e.y>=t.y)(t,o)}})),D_=(e,t)=>t.getInitialPos().map((t=>No(t.bounds.x,t.bounds.y,Wt(e),It(e)))),F_=(e,t,o)=>o.getInitialPos().bind((n=>{switch(o.clearInitialPos(),n.position){case"static":return B.some(E_.static());case"absolute":const o=__(e).map(Lo).getOrThunk((()=>Lo(ut())));return B.some(E_.absolute(wl("absolute",fe(n.style,"left").map((e=>t.x-o.x)),fe(n.style,"top").map((e=>t.y-o.y)),fe(n.style,"right").map((e=>o.right-t.right)),fe(n.style,"bottom").map((e=>o.bottom-t.bottom)))));default:return B.none()}})),I_=(e,t,o)=>{const n=e.element;return ye(Tt(n,"position"),"fixed")?((e,t,o)=>D_(e,o).filter((e=>A_(o.getModes(),e,t))).bind((t=>F_(e,t,o))))(n,t,o):((e,t,o)=>{const n=Lo(e);if(A_(o.getModes(),n,t))return B.none();{((e,t,o)=>{o.setInitialPos({style:Et(e),position:Ot(e,"position")||"static",bounds:t})})(e,n,o);const s=Uo(),r=n.x-s.x,a=t.y-s.y,i=s.bottom-t.bottom,l=n.y<=t.y;return B.some(E_.fixed(wl("fixed",B.some(r),l?B.some(a):B.none(),B.none(),l?B.none():B.some(i))))}})(n,t,o)},V_=(e,t,o)=>{o.setDocked(!1),N(["left","right","top","bottom","position"],(t=>Mt(e.element,t))),t.onUndocked(e)},R_=(e,t,o,n)=>{const s="fixed"===n.position;o.setDocked(s),Sl(e.element,n),(s?t.onDocked:t.onUndocked)(e)},z_=(e,t,o,n,s=!1)=>{t.contextual.each((t=>{t.lazyContext(e).each((r=>{const a=((e,t)=>e.y<t.bottom&&e.bottom>t.y)(r,n);a!==o.isVisible()&&(o.setVisible(a),s&&!a?(Ba(e.element,[t.fadeOutClass]),t.onHide(e)):(a?B_:M_)(e,t))}))}))},H_=(e,t,o)=>{e.getSystem().isConnected()&&((e,t,o)=>{const n=t.lazyViewport(e);o.isDocked()&&z_(e,t,o,n),I_(e,n,o).each((s=>{s.fold((()=>V_(e,t,o)),(n=>R_(e,t,o,n)),(s=>{z_(e,t,o,n,!0),R_(e,t,o,s)}))}))})(e,t,o)},P_=(e,t,o)=>{o.isDocked()&&((e,t,o)=>{const n=e.element;o.setDocked(!1),((e,t)=>{const o=e.element;return D_(o,t).bind((e=>F_(o,e,t)))})(e,o).each((n=>{n.fold((()=>V_(e,t,o)),(n=>R_(e,t,o,n)),b)})),o.setVisible(!0),t.contextual.each((t=>{Ma(n,[t.fadeInClass,t.fadeOutClass,t.transitionClass]),t.onShow(e)})),H_(e,t,o)})(e,t,o)};var N_=Object.freeze({__proto__:null,refresh:H_,reset:P_,isDocked:(e,t,o)=>o.isDocked(),getModes:(e,t,o)=>o.getModes(),setModes:(e,t,o,n)=>o.setModes(n)}),L_=Object.freeze({__proto__:null,events:(e,t)=>Or([Vr(Us(),((o,n)=>{e.contextual.each((e=>{Ea(o.element,e.transitionClass)&&(Ma(o.element,[e.transitionClass,e.fadeInClass]),(t.isVisible()?e.onShown:e.onHidden)(o)),n.stop()}))})),Er(ir(),((o,n)=>{H_(o,e,t)})),Er(lr(),((o,n)=>{P_(o,e,t)}))])}),W_=[rs("contextual",[$n("fadeInClass"),$n("fadeOutClass"),$n("transitionClass"),Xn("lazyContext"),fi("onShow"),fi("onShown"),fi("onHide"),fi("onHidden")]),ms("lazyViewport",Uo),gs("modes",["top","bottom"],Tn),fi("onDocked"),fi("onUndocked")];const U_=dl({fields:W_,name:"docking",active:L_,apis:N_,state:Object.freeze({__proto__:null,init:e=>{const t=hs(!1),o=hs(!0),n=zl(),s=hs(e.modes);return ma({isDocked:t.get,setDocked:t.set,getInitialPos:n.get,setInitialPos:n.set,clearInitialPos:n.clear,isVisible:o.get,setVisible:o.set,getModes:s.get,setModes:s.set,readState:()=>`docked:  ${t.get()}, visible: ${o.get()}, modes: ${s.get().join(",")}`})}})}),j_=y(Xr("toolbar-height-change")),G_={fadeInClass:"tox-editor-dock-fadein",fadeOutClass:"tox-editor-dock-fadeout",transitionClass:"tox-editor-dock-transition"},$_="tox-tinymce--toolbar-sticky-on",q_="tox-tinymce--toolbar-sticky-off",X_=(e,t)=>V(U_.getModes(e),t),K_=e=>{const t=e.element;Ye(t).each((o=>{const n="padding-"+U_.getModes(e)[0];if(U_.isDocked(e)){const e=Wt(o);St(t,"width",e+"px"),St(o,n,(e=>Vt(e)+(parseInt(Ot(e,"margin-top"),10)||0)+(parseInt(Ot(e,"margin-bottom"),10)||0))(t)+"px")}else Mt(t,"width"),Mt(o,n)}))},Y_=(e,t)=>{t?(Ta(e,G_.fadeOutClass),Ba(e,[G_.transitionClass,G_.fadeInClass])):(Ta(e,G_.fadeInClass),Ba(e,[G_.fadeOutClass,G_.transitionClass]))},J_=(e,t)=>{const o=Fe(e.getContainer());t?(_a(o,$_),Ta(o,q_)):(_a(o,q_),Ta(o,$_))},Z_=(e,t)=>{const o=zl(),n=t.getSink,s=e=>{n().each((t=>e(t.element)))},r=t=>{e.inline||K_(t),J_(e,U_.isDocked(t)),t.getSystem().broadcastOn([Fd()],{}),n().each((e=>e.getSystem().broadcastOn([Fd()],{})))},a=e.inline?[]:[pl.config({channels:{[j_()]:{onReceive:K_}}})];return[Hp.config({}),U_.config({contextual:{lazyContext:t=>{const o=Vt(t.element),n=e.inline?e.getContentAreaContainer():e.getContainer(),s=Lo(Fe(n)),r=s.height-o,a=s.y+(X_(t,"top")?0:o);return B.some(No(s.x,a,s.width,r))},onShow:()=>{s((e=>Y_(e,!0)))},onShown:e=>{s((e=>Ma(e,[G_.transitionClass,G_.fadeInClass]))),o.get().each((t=>{((e,t)=>{const o=$e(t);vl(o).filter((e=>!je(t,e))).filter((t=>je(t,Fe(o.dom.body))||Ge(e,t))).each((()=>fl(t)))})(e.element,t),o.clear()}))},onHide:e=>{((e,t)=>yl(e).orThunk((()=>t().toOptional().bind((e=>yl(e.element))))))(e.element,n).fold(o.clear,o.set),s((e=>Y_(e,!1)))},onHidden:()=>{s((e=>Ma(e,[G_.transitionClass])))},...G_},lazyViewport:t=>{const o=Uo(),n=df(e),s=o.y+(X_(t,"top")?n:0),r=o.height-(X_(t,"bottom")?n:0);return No(o.x,s,o.width,r)},modes:[t.header.getDockingMode()],onDocked:r,onUndocked:r}),...a]};var Q_=Object.freeze({__proto__:null,setup:(e,t,o)=>{e.inline||(t.header.isPositionedAtTop()||e.on("ResizeEditor",(()=>{o().each(U_.reset)})),e.on("ResizeWindow ResizeEditor",(()=>{o().each(K_)})),e.on("SkinLoaded",(()=>{o().each((e=>{U_.isDocked(e)?U_.reset(e):U_.refresh(e)}))})),e.on("FullscreenStateChanged",(()=>{o().each(U_.reset)}))),e.on("AfterScrollIntoView",(e=>{o().each((t=>{U_.refresh(t);const o=t.element;bg(o)&&((e,t)=>{const o=$e(t),n=o.dom.defaultView.innerHeight,s=Do(o),r=Fe(e.elm),a=Wo(r),i=It(r),l=a.y,c=l+i,d=Pt(t),u=It(t),m=d.top,g=m+u,p=Math.abs(m-s.top)<2,h=Math.abs(g-(s.top+n))<2;if(p&&l<g)Fo(s.left,l-u,o);else if(h&&c>m){const e=l-n+i+u;Fo(s.left,e,o)}})(e,o)}))})),e.on("PostRender",(()=>{J_(e,!1)}))},isDocked:e=>e().map(U_.isDocked).getOr(!1),getBehaviours:Z_});const eT=yn([pb,jn("items",wn([kn([hb,Jn("items",Tn)]),Tn]))].concat(jb)),tT=[ts("text"),ts("tooltip"),ts("icon"),Xn("fetch"),ms("onSetup",(()=>b))],oT=yn([pb,...tT]),nT=e=>Vn("menubutton",oT,e),sT=yn([pb,Bb,Eb,Tb,Db,wb,Ob,ds("presets","normal",["normal","color","listpreview"]),zb(1),kb,Cb]);var rT=Qu({factory:(e,t)=>{const o={focus:kp.focusIn,setMenus:(e,o)=>{const n=P(o,(e=>{const o={type:"menubutton",text:e.text,fetch:t=>{t(e.getItems())}},n=nT(o).mapError((e=>Hn(e))).getOrDie();return DC(n,"tox-mbtn",t.backstage,B.some("menuitem"))}));Dp.set(e,n)}};return{uid:e.uid,dom:e.dom,components:[],behaviours:ll([Dp.config({}),Fp("menubar-events",[Rr((t=>{e.onSetup(t)})),Er(Is(),((e,t)=>{Qa(e.element,".tox-mbtn--active").each((o=>{ei(t.event.target,".tox-mbtn").each((t=>{je(o,t)||e.getSystem().getByDom(o).each((o=>{e.getSystem().getByDom(t).each((e=>{Tw.expand(e),Tw.close(o),Hp.focus(e)}))}))}))}))})),Er(gr(),((e,t)=>{t.event.prevFocus.bind((t=>e.getSystem().getByDom(t).toOptional())).each((o=>{t.event.newFocus.bind((t=>e.getSystem().getByDom(t).toOptional())).each((e=>{Tw.isOpen(o)&&(Tw.expand(e),Tw.close(o))}))}))}))]),kp.config({mode:"flow",selector:".tox-mbtn",onEscape:t=>(e.onEscape(t),B.some(!0))}),Tx.config({})]),apis:o,domModification:{attributes:{role:"menubar"}}}},name:"silver.Menubar",configFields:[Un("dom"),Un("uid"),Un("onEscape"),Un("backstage"),as("onSetup",b)],apis:{focus:(e,t)=>{e.focus(t)},setMenus:(e,t,o)=>{e.setMenus(t,o)}}});const aT=(e,t)=>t.getAnimationRoot.fold((()=>e.element),(t=>t(e))),iT=e=>e.dimension.property,lT=(e,t)=>e.dimension.getDimension(t),cT=(e,t)=>{const o=aT(e,t);Ma(o,[t.shrinkingClass,t.growingClass])},dT=(e,t)=>{Ta(e.element,t.openClass),_a(e.element,t.closedClass),St(e.element,iT(t),"0px"),At(e.element)},uT=(e,t)=>{Ta(e.element,t.closedClass),_a(e.element,t.openClass),Mt(e.element,iT(t))},mT=(e,t,o,n)=>{o.setCollapsed(),St(e.element,iT(t),lT(t,e.element)),At(e.element),cT(e,t),dT(e,t),t.onStartShrink(e),t.onShrunk(e)},gT=(e,t,o,n)=>{const s=n.getOrThunk((()=>lT(t,e.element)));o.setCollapsed(),St(e.element,iT(t),s),At(e.element);const r=aT(e,t);Ta(r,t.growingClass),_a(r,t.shrinkingClass),dT(e,t),t.onStartShrink(e)},pT=(e,t,o)=>{const n=lT(t,e.element);("0px"===n?mT:gT)(e,t,o,B.some(n))},hT=(e,t,o)=>{const n=aT(e,t),s=Ea(n,t.shrinkingClass),r=lT(t,e.element);uT(e,t);const a=lT(t,e.element);(s?()=>{St(e.element,iT(t),r),At(e.element)}:()=>{dT(e,t)})(),Ta(n,t.shrinkingClass),_a(n,t.growingClass),uT(e,t),St(e.element,iT(t),a),o.setExpanded(),t.onStartGrow(e)},fT=(e,t,o)=>{const n=aT(e,t);return!0===Ea(n,t.growingClass)},bT=(e,t,o)=>{const n=aT(e,t);return!0===Ea(n,t.shrinkingClass)};var vT=Object.freeze({__proto__:null,refresh:(e,t,o)=>{if(o.isExpanded()){Mt(e.element,iT(t));const o=lT(t,e.element);St(e.element,iT(t),o)}},grow:(e,t,o)=>{o.isExpanded()||hT(e,t,o)},shrink:(e,t,o)=>{o.isExpanded()&&pT(e,t,o)},immediateShrink:(e,t,o)=>{o.isExpanded()&&mT(e,t,o)},hasGrown:(e,t,o)=>o.isExpanded(),hasShrunk:(e,t,o)=>o.isCollapsed(),isGrowing:fT,isShrinking:bT,isTransitioning:(e,t,o)=>fT(e,t)||bT(e,t),toggleGrow:(e,t,o)=>{(o.isExpanded()?pT:hT)(e,t,o)},disableTransitions:cT}),yT=Object.freeze({__proto__:null,exhibit:(e,t,o)=>{const n=t.expanded;return pa(n?{classes:[t.openClass],styles:{}}:{classes:[t.closedClass],styles:bs(t.dimension.property,"0px")})},events:(e,t)=>Or([Vr(Us(),((o,n)=>{n.event.raw.propertyName===e.dimension.property&&(cT(o,e),t.isExpanded()&&Mt(o.element,e.dimension.property),(t.isExpanded()?e.onGrown:e.onShrunk)(o))}))])}),xT=[Un("closedClass"),Un("openClass"),Un("shrinkingClass"),Un("growingClass"),Zn("getAnimationRoot"),fi("onShrunk"),fi("onStartShrink"),fi("onGrown"),fi("onStartGrow"),as("expanded",!1),jn("dimension",Pn("property",{width:[xi("property","width"),xi("getDimension",(e=>Wt(e)+"px"))],height:[xi("property","height"),xi("getDimension",(e=>It(e)+"px"))]}))];const wT=dl({fields:xT,name:"sliding",active:yT,apis:vT,state:Object.freeze({__proto__:null,init:e=>{const t=hs(e.expanded);return ma({isExpanded:()=>!0===t.get(),isCollapsed:()=>!1===t.get(),setCollapsed:S(t.set,!1),setExpanded:S(t.set,!0),readState:()=>"expanded: "+t.get()})}})}),ST="container",kT=[Zd("slotBehaviours",[])],CT=e=>"<alloy.field."+e+">",OT=(e,t)=>{const o=t=>Uu(e),n=(t,o)=>(n,s)=>Pu(n,e,s).map((e=>t(e,s))).getOr(o),s=(e,t)=>"true"!==ft(e.element,"aria-hidden"),r=n(s,!1),a=n(((e,t)=>{if(s(e)){const o=e.element;St(o,"display","none"),pt(o,"aria-hidden","true"),xr(e,pr(),{name:t,visible:!1})}})),i=(l=a,(e,t)=>{N(t,(t=>l(e,t)))});var l;const c=n(((e,t)=>{if(!s(e)){const o=e.element;Mt(o,"display"),yt(o,"aria-hidden"),xr(e,pr(),{name:t,visible:!0})}})),d={getSlotNames:o,getSlot:(t,o)=>Pu(t,e,o),isShowing:r,hideSlot:a,hideAllSlots:e=>i(e,o()),showSlot:c};return{uid:e.uid,dom:e.dom,components:t,behaviours:Qd(e.slotBehaviours),apis:d}},_T=ce({getSlotNames:(e,t)=>e.getSlotNames(t),getSlot:(e,t,o)=>e.getSlot(t,o),isShowing:(e,t,o)=>e.isShowing(t,o),hideSlot:(e,t,o)=>e.hideSlot(t,o),hideAllSlots:(e,t)=>e.hideAllSlots(t),showSlot:(e,t,o)=>e.showSlot(t,o)},(e=>da(e))),TT={..._T,sketch:e=>{const t=(()=>{const e=[];return{slot:(t,o)=>(e.push(t),Iu(ST,CT(t),o)),record:y(e)}})(),o=e(t),n=t.record(),s=P(n,(e=>Ou({name:e,pname:CT(e)})));return Ku(ST,kT,s,OT,o)}},ET=yn([Eb,Bb,ms("onShow",b),ms("onHide",b),Ob]),BT=e=>({element:()=>e.element.dom}),MT=(e,t)=>{const o=P(ae(t),(e=>{const o=t[e],n=Rn((e=>Vn("sidebar",ET,e))(o));return{name:e,getApi:BT,onSetup:n.onSetup,onShow:n.onShow,onHide:n.onHide}}));return P(o,(t=>{const n=hs(b);return e.slot(t.name,{dom:{tag:"div",classes:["tox-sidebar__pane"]},behaviours:wv([Pv(t,n),Nv(t,n),Er(pr(),((e,t)=>{const n=t.event,s=G(o,(e=>e.name===n.name));s.each((t=>{(n.visible?t.onShow:t.onHide)(t.getApi(e))}))}))])})}))},AT=e=>TT.sketch((t=>({dom:{tag:"div",classes:["tox-sidebar__pane-container"]},components:MT(t,e),slotBehaviours:wv([Rr((e=>TT.hideAllSlots(e)))])}))),DT=e=>sm.getCurrent(e).bind((e=>wT.isGrowing(e)||wT.hasGrown(e)?sm.getCurrent(e).bind((e=>G(TT.getSlotNames(e),(t=>TT.isShowing(e,t))))):B.none())),FT=Xr("FixSizeEvent"),IT=Xr("AutoSizeEvent");var VT=Object.freeze({__proto__:null,block:(e,t,o,n)=>{pt(e.element,"aria-busy",!0);const s=t.getRoot(e).getOr(e),r=ll([kp.config({mode:"special",onTab:()=>B.some(!0),onShiftTab:()=>B.some(!0)}),Hp.config({})]),a=n(s,r),i=s.getSystem().build(a);Dp.append(s,Ga(i)),i.hasConfigured(kp)&&t.focus&&kp.focusIn(i),o.isBlocked()||t.onBlock(e),o.blockWith((()=>Dp.remove(s,i)))},unblock:(e,t,o)=>{yt(e.element,"aria-busy"),o.isBlocked()&&t.onUnblock(e),o.clear()}}),RT=[ms("getRoot",B.none),us("focus",!0),fi("onBlock"),fi("onUnblock")];const zT=dl({fields:RT,name:"blocking",apis:VT,state:Object.freeze({__proto__:null,init:()=>{const e=Vl((e=>e.destroy()));return ma({readState:e.isSet,blockWith:t=>{e.set({destroy:t})},clear:e.clear,isBlocked:e.isSet})}})}),HT=e=>{const t=Me(e),o=Qe(t),n=(e=>{const t=void 0!==e.dom.attributes?e.dom.attributes:[];return j(t,((e,t)=>"class"===t.name?e:{...e,[t.name]:t.value}),{})})(t),s=(e=>Array.prototype.slice.call(e.dom.classList,0))(t),r=0===o.length?{}:{innerHtml:Nr(t)};return{tag:Ve(t),classes:s,attributes:n,...r}},PT=e=>sm.getCurrent(e).each((e=>fl(e.element))),NT=(e,t,o)=>{const n=hs(!1),s=zl(),r=o=>{var s;n.get()&&(!(e=>"focusin"===e.type)(s=o)||!(s.composed?oe(s.composedPath()):B.from(s.target)).map(Fe).filter(ze).exists((e=>Ea(e,"mce-pastebin"))))&&(o.preventDefault(),PT(t()),e.editorManager.setActive(e))};e.inline||e.on("PreInit",(()=>{e.dom.bind(e.getWin(),"focusin",r),e.on("BeforeExecCommand",(e=>{"mcefocus"===e.command.toLowerCase()&&!0!==e.value&&r(e)}))}));const a=s=>{s!==n.get()&&(n.set(s),((e,t,o,n)=>{const s=t.element;if(((e,t)=>{const o="tabindex",n="data-mce-tabindex";B.from(e.iframeElement).map(Fe).each((e=>{t?(bt(e,o).each((t=>pt(e,n,t))),pt(e,o,-1)):(yt(e,o),bt(e,n).each((t=>{pt(e,o,t),yt(e,n)})))}))})(e,o),o)zT.block(t,(e=>(t,o)=>({dom:{tag:"div",attributes:{"aria-label":e.translate("Loading..."),tabindex:"0"},classes:["tox-throbber__busy-spinner"]},components:[{dom:HT('<div class="tox-spinner"><div></div><div></div><div></div></div>')}]}))(n)),Mt(s,"display"),yt(s,"aria-hidden"),e.hasFocus()&&PT(t);else{const o=sm.getCurrent(t).exists((e=>bl(e.element)));zT.unblock(t),St(s,"display","none"),pt(s,"aria-hidden","true"),o&&e.focus()}})(e,t(),s,o.providers),e.dispatch("AfterProgressState",{state:s}))};e.on("ProgressState",(t=>{if(s.on(clearTimeout),h(t.time)){const o=Sh.setEditorTimeout(e,(()=>a(t.state)),t.time);s.set(o)}else a(t.state),s.clear()}))},LT=(e,t,o)=>({within:e,extra:t,withinWidth:o}),WT=(e,t,o)=>{const n=j(e,((e,t)=>((e,t)=>{const n=o(e);return B.some({element:e,start:t,finish:t+n,width:n})})(t,e.len).fold(y(e),(t=>({len:t.finish,list:e.list.concat([t])})))),{len:0,list:[]}).list,s=W(n,(e=>e.finish<=t)),r=U(s,((e,t)=>e+t.width),0);return{within:s,extra:n.slice(s.length),withinWidth:r}},UT=e=>P(e,(e=>e.element)),jT=(e,t)=>{const o=P(t,(e=>Ga(e)));x_.setGroups(e,o)},GT=(e,t,o)=>{const n=t.builtGroups.get();if(0===n.length)return;const s=Nu(e,t,"primary"),r=mw.getCoupled(e,"overflowGroup");St(s.element,"visibility","hidden");const a=n.concat([r]),i=re(a,(e=>yl(e.element).bind((t=>e.getSystem().getByDom(t).toOptional()))));o([]),jT(s,a);const l=((e,t,o,n)=>{const s=((e,t,o)=>{const n=WT(t,e,o);return 0===n.extra.length?B.some(n):B.none()})(e,t,o).getOrThunk((()=>WT(t,e-o(n),o))),r=s.within,a=s.extra,i=s.withinWidth;return 1===a.length&&a[0].width<=o(n)?((e,t,o)=>{const n=UT(e.concat(t));return LT(n,[],o)})(r,a,i):a.length>=1?((e,t,o,n)=>{const s=UT(e).concat([o]);return LT(s,UT(t),n)})(r,a,n,i):((e,t,o)=>LT(UT(e),[],o))(r,0,i)})(Wt(s.element),t.builtGroups.get(),(e=>Wt(e.element)),r);0===l.extra.length?(Dp.remove(s,r),o([])):(jT(s,l.within),o(l.extra)),Mt(s.element,"visibility"),At(s.element),i.each(Hp.focus)},$T=y([Zd("splitToolbarBehaviours",[mw]),Ln("builtGroups",(()=>hs([])))]),qT=y([pi(["overflowToggledClass"]),ns("getOverflowBounds"),Un("lazySink"),Ln("overflowGroups",(()=>hs([])))].concat($T())),XT=y([Ou({factory:x_,schema:v_(),name:"primary"}),_u({schema:v_(),name:"overflow"}),_u({name:"overflow-button"}),_u({name:"overflow-group"})]),KT=y(((e,t)=>{((e,t)=>{const o=Lt.max(e,t,["margin-left","border-left-width","padding-left","padding-right","border-right-width","margin-right"]);St(e,"max-width",o+"px")})(e,Math.floor(t))})),YT=y([pi(["toggledClass"]),Un("lazySink"),Xn("fetch"),ns("getBounds"),rs("fireDismissalEventInstead",[as("event",ur())]),rc()]),JT=y([_u({name:"button",overrides:e=>({dom:{attributes:{"aria-haspopup":"true"}},buttonBehaviours:ll([Yp.config({toggleClass:e.markers.toggledClass,aria:{mode:"expanded"},toggleOnExecute:!1})])})}),_u({factory:x_,schema:v_(),name:"toolbar",overrides:e=>({toolbarBehaviours:ll([kp.config({mode:"cyclic",onEscape:t=>(Pu(t,e,"button").each(Hp.focus),B.none())})])})})]),ZT=(e,t)=>{const o=mw.getCoupled(e,"toolbarSandbox");Ad.isOpen(o)?Ad.close(o):Ad.open(o,t.toolbar())},QT=(e,t,o,n)=>{const s=o.getBounds.map((e=>e())),r=o.lazySink(e).getOrDie();ad.positionWithinBounds(r,t,{anchor:{type:"hotspot",hotspot:e,layouts:n,overrides:{maxWidthFunction:KT()}}},s)},eE=(e,t,o,n,s)=>{x_.setGroups(t,s),QT(e,t,o,n),Yp.on(e)},tE=em({name:"FloatingToolbarButton",factory:(e,t,o,n)=>({...kh.sketch({...n.button(),action:e=>{ZT(e,n)},buttonBehaviours:ou({dump:n.button().buttonBehaviours},[mw.config({others:{toolbarSandbox:t=>((e,t,o)=>{const n=oi();return{dom:{tag:"div",attributes:{id:n.id}},behaviours:ll([kp.config({mode:"special",onEscape:e=>(Ad.close(e),B.some(!0))}),Ad.config({onOpen:(s,r)=>{o.fetch().get((s=>{eE(e,r,o,t.layouts,s),n.link(e.element),kp.focusIn(r)}))},onClose:()=>{Yp.off(e),Hp.focus(e),n.unlink(e.element)},isPartOf:(t,o,n)=>ni(o,n)||ni(e,n),getAttachPoint:()=>o.lazySink(e).getOrDie()}),pl.config({channels:{...Rd({isExtraPart:_,...o.fireDismissalEventInstead.map((e=>({fireEventInstead:{event:e.event}}))).getOr({})}),...Hd({doReposition:()=>{Ad.getState(mw.getCoupled(e,"toolbarSandbox")).each((n=>{QT(e,n,o,t.layouts)}))}})}})])}})(t,o,e)}})])}),apis:{setGroups:(t,n)=>{Ad.getState(mw.getCoupled(t,"toolbarSandbox")).each((s=>{eE(t,s,e,o.layouts,n)}))},reposition:t=>{Ad.getState(mw.getCoupled(t,"toolbarSandbox")).each((n=>{QT(t,n,e,o.layouts)}))},toggle:e=>{ZT(e,n)},getToolbar:e=>Ad.getState(mw.getCoupled(e,"toolbarSandbox")),isOpen:e=>Ad.isOpen(mw.getCoupled(e,"toolbarSandbox"))}}),configFields:YT(),partFields:JT(),apis:{setGroups:(e,t,o)=>{e.setGroups(t,o)},reposition:(e,t)=>{e.reposition(t)},toggle:(e,t)=>{e.toggle(t)},getToolbar:(e,t)=>e.getToolbar(t),isOpen:(e,t)=>e.isOpen(t)}}),oE=y([Un("items"),pi(["itemSelector"]),Zd("tgroupBehaviours",[kp])]),nE=y([Eu({name:"items",unit:"item"})]),sE=em({name:"ToolbarGroup",configFields:oE(),partFields:nE(),factory:(e,t,o,n)=>({uid:e.uid,dom:e.dom,components:t,behaviours:eu(e.tgroupBehaviours,[kp.config({mode:"flow",selector:e.markers.itemSelector})]),domModification:{attributes:{role:"toolbar"}}})}),rE=e=>P(e,(e=>Ga(e))),aE=(e,t,o)=>{GT(e,o,(n=>{o.overflowGroups.set(n),t.getOpt(e).each((e=>{tE.setGroups(e,rE(n))}))}))},iE=em({name:"SplitFloatingToolbar",configFields:qT(),partFields:XT(),factory:(e,t,o,n)=>{const s=Ch(tE.sketch({fetch:()=>Jx((t=>{t(rE(e.overflowGroups.get()))})),layouts:{onLtr:()=>[ji,Ui],onRtl:()=>[Ui,ji],onBottomLtr:()=>[$i,Gi],onBottomRtl:()=>[Gi,$i]},getBounds:o.getOverflowBounds,lazySink:e.lazySink,fireDismissalEventInstead:{},markers:{toggledClass:e.markers.overflowToggledClass},parts:{button:n["overflow-button"](),toolbar:n.overflow()}}));return{uid:e.uid,dom:e.dom,components:t,behaviours:eu(e.splitToolbarBehaviours,[mw.config({others:{overflowGroup:()=>sE.sketch({...n["overflow-group"](),items:[s.asSpec()]})}})]),apis:{setGroups:(t,o)=>{e.builtGroups.set(P(o,t.getSystem().build)),aE(t,s,e)},refresh:t=>aE(t,s,e),toggle:e=>{s.getOpt(e).each((e=>{tE.toggle(e)}))},isOpen:e=>s.getOpt(e).map(tE.isOpen).getOr(!1),reposition:e=>{s.getOpt(e).each((e=>{tE.reposition(e)}))},getOverflow:e=>s.getOpt(e).bind(tE.getToolbar)},domModification:{attributes:{role:"group"}}}},apis:{setGroups:(e,t,o)=>{e.setGroups(t,o)},refresh:(e,t)=>{e.refresh(t)},reposition:(e,t)=>{e.reposition(t)},toggle:(e,t)=>{e.toggle(t)},isOpen:(e,t)=>e.isOpen(t),getOverflow:(e,t)=>e.getOverflow(t)}}),lE=y([pi(["closedClass","openClass","shrinkingClass","growingClass","overflowToggledClass"]),fi("onOpened"),fi("onClosed")].concat($T())),cE=y([Ou({factory:x_,schema:v_(),name:"primary"}),Ou({factory:x_,schema:v_(),name:"overflow",overrides:e=>({toolbarBehaviours:ll([wT.config({dimension:{property:"height"},closedClass:e.markers.closedClass,openClass:e.markers.openClass,shrinkingClass:e.markers.shrinkingClass,growingClass:e.markers.growingClass,onShrunk:t=>{Pu(t,e,"overflow-button").each((e=>{Yp.off(e),Hp.focus(e)})),e.onClosed(t)},onGrown:t=>{kp.focusIn(t),e.onOpened(t)},onStartGrow:t=>{Pu(t,e,"overflow-button").each(Yp.on)}}),kp.config({mode:"acyclic",onEscape:t=>(Pu(t,e,"overflow-button").each(Hp.focus),B.some(!0))})])})}),_u({name:"overflow-button",overrides:e=>({buttonBehaviours:ll([Yp.config({toggleClass:e.markers.overflowToggledClass,aria:{mode:"pressed"},toggleOnExecute:!1})])})}),_u({name:"overflow-group"})]),dE=(e,t)=>{Pu(e,t,"overflow-button").bind((()=>Pu(e,t,"overflow"))).each((o=>{uE(e,t),wT.toggleGrow(o)}))},uE=(e,t)=>{Pu(e,t,"overflow").each((o=>{GT(e,t,(e=>{const t=P(e,(e=>Ga(e)));x_.setGroups(o,t)})),Pu(e,t,"overflow-button").each((e=>{wT.hasGrown(o)&&Yp.on(e)})),wT.refresh(o)}))},mE=em({name:"SplitSlidingToolbar",configFields:lE(),partFields:cE(),factory:(e,t,o,n)=>{const s="alloy.toolbar.toggle";return{uid:e.uid,dom:e.dom,components:t,behaviours:eu(e.splitToolbarBehaviours,[mw.config({others:{overflowGroup:e=>sE.sketch({...n["overflow-group"](),items:[kh.sketch({...n["overflow-button"](),action:t=>{yr(e,s)}})]})}}),Fp("toolbar-toggle-events",[Er(s,(t=>{dE(t,e)}))])]),apis:{setGroups:(t,o)=>{((t,o)=>{const n=P(o,t.getSystem().build);e.builtGroups.set(n)})(t,o),uE(t,e)},refresh:t=>uE(t,e),toggle:t=>dE(t,e),isOpen:t=>((e,t)=>Pu(e,t,"overflow").map(wT.hasGrown).getOr(!1))(t,e)},domModification:{attributes:{role:"group"}}}},apis:{setGroups:(e,t,o)=>{e.setGroups(t,o)},refresh:(e,t)=>{e.refresh(t)},toggle:(e,t)=>{e.toggle(t)},isOpen:(e,t)=>e.isOpen(t)}}),gE=e=>{const t=e.title.fold((()=>({})),(e=>({attributes:{title:e}})));return{dom:{tag:"div",classes:["tox-toolbar__group"],...t},components:[sE.parts.items({})],items:e.items,markers:{itemSelector:"*:not(.tox-split-button) > .tox-tbtn:not([disabled]), .tox-split-button:not([disabled]), .tox-toolbar-nav-js:not([disabled])"},tgroupBehaviours:ll([Tx.config({}),Hp.config({})])}},pE=e=>sE.sketch(gE(e)),hE=(e,t)=>{const o=Rr((t=>{const o=P(e.initGroups,pE);x_.setGroups(t,o)}));return ll([zv(e.providers.isDisabled),Iv(),kp.config({mode:t,onEscape:e.onEscape,selector:".tox-toolbar__group"}),Fp("toolbar-events",[o])])},fE=e=>{const t=e.cyclicKeying?"cyclic":"acyclic";return{uid:e.uid,dom:{tag:"div",classes:["tox-toolbar-overlord"]},parts:{"overflow-group":gE({title:B.none(),items:[]}),"overflow-button":VC({name:"more",icon:B.some("more-drawer"),enabled:!0,tooltip:B.some("More..."),primary:!1,buttonType:B.none(),borderless:!1},B.none(),e.providers)},splitToolbarBehaviours:hE(e,t)}},bE=e=>{const t=fE(e),o=iE.parts.primary({dom:{tag:"div",classes:["tox-toolbar__primary"]}});return iE.sketch({...t,lazySink:e.getSink,getOverflowBounds:()=>{const t=e.moreDrawerData.lazyHeader().element,o=Wo(t),n=Xe(t),s=Wo(n),r=Math.max(n.dom.scrollHeight,s.height);return No(o.x+4,s.y,o.width-8,r)},parts:{...t.parts,overflow:{dom:{tag:"div",classes:["tox-toolbar__overflow"],attributes:e.attributes}}},components:[o],markers:{overflowToggledClass:"tox-tbtn--enabled"}})},vE=e=>{const t=mE.parts.primary({dom:{tag:"div",classes:["tox-toolbar__primary"]}}),o=mE.parts.overflow({dom:{tag:"div",classes:["tox-toolbar__overflow"]}}),n=fE(e);return mE.sketch({...n,components:[t,o],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:e=>{e.getSystem().broadcastOn([j_()],{type:"opened"})},onClosed:e=>{e.getSystem().broadcastOn([j_()],{type:"closed"})}})},yE=e=>{const t=e.cyclicKeying?"cyclic":"acyclic";return x_.sketch({uid:e.uid,dom:{tag:"div",classes:["tox-toolbar"].concat(e.type===zh.scrolling?["tox-toolbar--scrolling"]:[])},components:[x_.parts.groups({})],toolbarBehaviours:hE(e,t)})},xE=g_.optional({factory:rT,name:"menubar",schema:[Un("backstage")]}),wE=g_.optional({factory:{sketch:e=>b_.sketch({uid:e.uid,dom:e.dom,listBehaviours:ll([kp.config({mode:"acyclic",selector:".tox-toolbar"})]),makeItem:()=>yE({type:e.type,uid:Xr("multiple-toolbar-item"),cyclicKeying:!1,initGroups:[],providers:e.providers,onEscape:()=>(e.onEscape(),B.some(!0))}),setupItem:(e,t,o,n)=>{x_.setGroups(t,o)},shell:!0})},name:"multiple-toolbar",schema:[Un("dom"),Un("onEscape")]}),SE=g_.optional({factory:{sketch:e=>{const t=(e=>e.type===zh.sliding?vE:e.type===zh.floating?bE:yE)(e);return t({type:e.type,uid:e.uid,onEscape:()=>(e.onEscape(),B.some(!0)),cyclicKeying:!1,initGroups:[],getSink:e.getSink,providers:e.providers,moreDrawerData:{lazyToolbar:e.lazyToolbar,lazyMoreButton:e.lazyMoreButton,lazyHeader:e.lazyHeader},attributes:e.attributes})}},name:"toolbar",schema:[Un("dom"),Un("onEscape"),Un("getSink")]}),kE=g_.optional({factory:{sketch:e=>{const t=e.editor,o=e.sticky?Z_:k_;return{uid:e.uid,dom:e.dom,components:e.components,behaviours:ll(o(t,e.sharedBackstage))}}},name:"header",schema:[Un("dom")]}),CE=g_.optional({name:"socket",schema:[Un("dom")]}),OE=g_.optional({factory:{sketch:e=>({uid:e.uid,dom:{tag:"div",classes:["tox-sidebar"],attributes:{role:"complementary"}},components:[{dom:{tag:"div",classes:["tox-sidebar__slider"]},components:[],behaviours:ll([Tx.config({}),Hp.config({}),wT.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:e=>{sm.getCurrent(e).each(TT.hideAllSlots),yr(e,IT)},onGrown:e=>{yr(e,IT)},onStartGrow:e=>{xr(e,FT,{width:Tt(e.element,"width").getOr("")})},onStartShrink:e=>{xr(e,FT,{width:Wt(e.element)+"px"})}}),Dp.config({}),sm.config({find:e=>{const t=Dp.contents(e);return oe(t)}})])}],behaviours:ll([_k(0),Fp("sidebar-sliding-events",[Er(FT,((e,t)=>{St(e.element,"width",t.event.width)})),Er(IT,((e,t)=>{Mt(e.element,"width")}))])])})},name:"sidebar",schema:[Un("dom")]}),_E=g_.optional({factory:{sketch:e=>({uid:e.uid,dom:{tag:"div",attributes:{"aria-hidden":"true"},classes:["tox-throbber"],styles:{display:"none"}},behaviours:ll([Dp.config({}),zT.config({focus:!1}),sm.config({find:e=>oe(e.components())})]),components:[]})},name:"throbber",schema:[Un("dom")]});var TE=em({name:"OuterContainer",factory:(e,t,o)=>{const n={getSocket:t=>m_.getPart(t,e,"socket"),setSidebar:(t,o)=>{m_.getPart(t,e,"sidebar").each((e=>((e,t)=>{sm.getCurrent(e).each((e=>Dp.set(e,[AT(t)])))})(e,o)))},toggleSidebar:(t,o)=>{m_.getPart(t,e,"sidebar").each((e=>((e,t)=>{sm.getCurrent(e).each((e=>{sm.getCurrent(e).each((o=>{wT.hasGrown(e)?TT.isShowing(o,t)?wT.shrink(e):(TT.hideAllSlots(o),TT.showSlot(o,t)):(TT.hideAllSlots(o),TT.showSlot(o,t),wT.grow(e))}))}))})(e,o)))},whichSidebar:t=>m_.getPart(t,e,"sidebar").bind(DT).getOrNull(),getHeader:t=>m_.getPart(t,e,"header"),getToolbar:t=>m_.getPart(t,e,"toolbar"),setToolbar:(t,o)=>{m_.getPart(t,e,"toolbar").each((e=>{e.getApis().setGroups(e,o)}))},setToolbars:(t,o)=>{m_.getPart(t,e,"multiple-toolbar").each((e=>{b_.setItems(e,o)}))},refreshToolbar:t=>{m_.getPart(t,e,"toolbar").each((e=>e.getApis().refresh(e)))},toggleToolbarDrawer:t=>{m_.getPart(t,e,"toolbar").each((e=>{var t,o;o=t=>t(e),null!=(t=e.getApis().toggle)?B.some(o(t)):B.none()}))},isToolbarDrawerToggled:t=>m_.getPart(t,e,"toolbar").bind((e=>B.from(e.getApis().isOpen).map((t=>t(e))))).getOr(!1),getThrobber:t=>m_.getPart(t,e,"throbber"),focusToolbar:t=>{m_.getPart(t,e,"toolbar").orThunk((()=>m_.getPart(t,e,"multiple-toolbar"))).each((e=>{kp.focusIn(e)}))},setMenubar:(t,o)=>{m_.getPart(t,e,"menubar").each((e=>{rT.setMenus(e,o)}))},focusMenubar:t=>{m_.getPart(t,e,"menubar").each((e=>{rT.focus(e)}))}};return{uid:e.uid,dom:e.dom,components:t,apis:n,behaviours:e.behaviours}},configFields:[Un("dom"),Un("behaviours")],partFields:[kE,xE,SE,wE,CE,OE,_E],apis:{getSocket:(e,t)=>e.getSocket(t),setSidebar:(e,t,o)=>{e.setSidebar(t,o)},toggleSidebar:(e,t,o)=>{e.toggleSidebar(t,o)},whichSidebar:(e,t)=>e.whichSidebar(t),getHeader:(e,t)=>e.getHeader(t),getToolbar:(e,t)=>e.getToolbar(t),setToolbar:(e,t,o)=>{const n=P(o,(e=>pE(e)));e.setToolbar(t,n)},setToolbars:(e,t,o)=>{const n=P(o,(e=>P(e,pE)));e.setToolbars(t,n)},refreshToolbar:(e,t)=>e.refreshToolbar(t),toggleToolbarDrawer:(e,t)=>{e.toggleToolbarDrawer(t)},isToolbarDrawerToggled:(e,t)=>e.isToolbarDrawerToggled(t),getThrobber:(e,t)=>e.getThrobber(t),setMenubar:(e,t,o)=>{e.setMenubar(t,o)},focusMenubar:(e,t)=>{e.focusMenubar(t)},focusToolbar:(e,t)=>{e.focusToolbar(t)}}});const EE={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 tableofcontents | insertdatetime"},format:{title:"Format",items:"bold italic underline strikethrough superscript subscript codeformat | styles blocks fontfamily fontsize 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"}},BE=e=>"string"==typeof e?e.split(" "):e,ME=(e,t)=>{const o={...EE,...t.menus},n=ae(t.menus).length>0,s=void 0===t.menubar||!0===t.menubar?BE("file edit view insert format tools table help"):BE(!1===t.menubar?"":t.menubar),r=W(s,(e=>{const o=be(EE,e);return n?o||fe(t.menus,e).exists((e=>be(e,"items"))):o})),a=P(r,(n=>{const s=o[n];return((e,t,o)=>{const n=of(o).split(/[ ,]/);return{text:e.title,getItems:()=>X(e.items,(e=>{const o=e.toLowerCase();return 0===o.trim().length||R(n,(e=>e===o))?[]:"separator"===o||"|"===o?[{type:"separator"}]:t.menuItems[o]?[t.menuItems[o]]:[]}))}})({title:s.title,items:BE(s.items)},t,e)}));return W(a,(e=>e.getItems().length>0&&R(e.getItems(),(e=>"separator"!==e.type))))},AE=e=>{const t=()=>{e._skinLoaded=!0,(e=>{e.dispatch("SkinLoaded")})(e)};return()=>{e.initialized?t():e.on("init",t)}},DE=(e,t,o)=>(e.on("remove",(()=>o.unload(t))),o.load(t)),FE=(e,t)=>DE(e,t+"/skin.min.css",e.ui.styleSheetLoader),IE=(e,t)=>{var o;return o=Fe(e.getElement()),lt(o).isSome()?DE(e,t+"/skin.shadowdom.min.css",Ph.DOM.styleSheetLoader):Promise.resolve()},VE=(e,t)=>{const o=Tf(t);o&&t.contentCSS.push(o+(e?"/content.inline":"/content")+".min.css"),!Of(t)&&r(o)?Promise.all([FE(t,o),IE(t,o)]).then(AE(t),((e,t)=>()=>((e,t)=>e.dispatch("SkinLoadError",t))(e,{message:"Skin could not be loaded"}))(t)):AE(t)()},RE=S(VE,!1),zE=S(VE,!0),HE=(e,t)=>o=>{const n=Rl(),s=()=>{o.setActive(e.formatter.match(t));const s=e.formatter.formatChanged(t,o.setActive);n.set(s)};return e.initialized?s():e.once("init",s),()=>{e.off("init",s),n.clear()}},PE=(e,t,o)=>n=>{const s=()=>o(n),r=()=>{o(n),e.on(t,s)};return e.initialized?r():e.once("init",r),()=>{e.off("init",r),e.off(t,s)}},NE=e=>t=>()=>{e.undoManager.transact((()=>{e.focus(),e.execCommand("mceToggleFormat",!1,t.format)}))},LE=(e,t)=>()=>e.execCommand(t),WE=(e,t,o)=>{const n=(e,n,r,a)=>{const i=t.shared.providers.translate(e.title);if("separator"===e.type)return B.some({type:"separator",text:i});if("submenu"===e.type){const t=X(e.getStyleItems(),(e=>s(e,n,a)));return 0===n&&t.length<=0?B.none():B.some({type:"nestedmenuitem",text:i,enabled:t.length>0,getSubmenuItems:()=>X(e.getStyleItems(),(e=>s(e,n,a)))})}return B.some({type:"togglemenuitem",text:i,icon:e.icon,active:e.isSelected(a),enabled:!r,onAction:o.onAction(e),...e.getStylePreview().fold((()=>({})),(e=>({meta:{style:e}})))})},s=(e,t,s)=>{const r="formatter"===e.type&&o.isInvalid(e);return 0===t?r?[]:n(e,t,!1,s).toArray():n(e,t,r,s).toArray()},r=e=>{const t=o.getCurrentValue(),n=o.shouldHide?0:1;return X(e,(e=>s(e,n,t)))};return{validateItems:r,getFetch:(e,t)=>(o,n)=>{const s=t(),a=r(s);n(oC(a,Uf.CLOSE_ON_EXECUTE,e,!1))}}},UE=(e,t,o)=>{const n=o.dataset,s="basic"===n.type?()=>P(n.data,(e=>HO(e,o.isSelectedFor,o.getPreviewFor))):n.getData;return{items:WE(0,t,o),getStyleItems:s}},jE=(e,t,o)=>{const{items:n,getStyleItems:s}=UE(0,t,o),r=PE(e,"NodeChange",(e=>{const t=e.getComponent();o.updateText(t)}));return Zk({text:o.icon.isSome()?B.none():o.text,icon:o.icon,tooltip:B.from(o.tooltip),role:B.none(),fetch:n.getFetch(t,s),onSetup:r,getApi:e=>({getComponent:y(e)}),columns:1,presets:"normal",classes:o.icon.isSome()?[]:["bespoke"],dropdownBehaviours:[]},"tox-tbtn",t.shared)};var GE;!function(e){e[e.SemiColon=0]="SemiColon",e[e.Space=1]="Space"}(GE||(GE={}));const $E=(e,t,o)=>{const n=(s=((e,t)=>t===GE.SemiColon?e.replace(/;$/,"").split(";"):e.split(" "))(e.options.get(t),o),P(s,(e=>{let t=e,o=e;const n=e.split("=");return n.length>1&&(t=n[0],o=n[1]),{title:t,format:o}})));var s;return{type:"basic",data:n}},qE=[{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"}],XE=e=>{const t={type:"basic",data:qE};return{tooltip:"Align",text:B.none(),icon:B.some("align-left"),isSelectedFor:t=>()=>e.formatter.match(t),getCurrentValue:B.none,getPreviewFor:e=>B.none,onAction:t=>()=>G(qE,(e=>e.format===t.format)).each((t=>e.execCommand(t.command))),updateText:t=>{const o=G(qE,(t=>e.formatter.match(t.format))).fold(y("left"),(e=>e.title.toLowerCase()));xr(t,Jk,{icon:`align-${o}`})},dataset:t,shouldHide:!1,isInvalid:t=>!e.formatter.canApply(t.format)}},KE=(e,t)=>{const o=t(),n=P(o,(e=>e.format));return B.from(e.formatter.closest(n)).bind((e=>G(o,(t=>t.format===e)))).orThunk((()=>Se(e.formatter.match("p"),{title:"Paragraph",format:"p"})))},YE=e=>{const t="Paragraph",o=$E(e,"block_formats",GE.SemiColon);return{tooltip:"Blocks",text:B.some(t),icon:B.none(),isSelectedFor:t=>()=>e.formatter.match(t),getCurrentValue:B.none,getPreviewFor:t=>()=>{const o=e.formatter.get(t);return B.some({tag:o.length>0&&(o[0].inline||o[0].block)||"div",styles:e.dom.parseStyle(e.formatter.getCssText(t))})},onAction:NE(e),updateText:n=>{const s=KE(e,(()=>o.data)).fold(y(t),(e=>e.title));xr(n,Yk,{text:s})},dataset:o,shouldHide:!1,isInvalid:t=>!e.formatter.canApply(t.format)}},JE=["-apple-system","Segoe UI","Roboto","Helvetica Neue","sans-serif"],ZE=e=>{const t=e.split(/\s*,\s*/);return P(t,(e=>e.replace(/^['"]+|['"]+$/g,"")))},QE=e=>{const t="System Font",o=()=>{const o=e=>e?ZE(e)[0]:"",s=e.queryCommandValue("FontName"),r=n.data,a=s?s.toLowerCase():"",i=G(r,(e=>{const t=e.format;return t.toLowerCase()===a||o(t).toLowerCase()===o(a).toLowerCase()})).orThunk((()=>Se((e=>0===e.indexOf("-apple-system")&&(()=>{const t=ZE(e.toLowerCase());return K(JE,(e=>t.indexOf(e.toLowerCase())>-1))})())(a),{title:t,format:a})));return{matchOpt:i,font:s}},n=$E(e,"font_family_formats",GE.SemiColon);return{tooltip:"Fonts",text:B.some(t),icon:B.none(),isSelectedFor:e=>t=>t.exists((t=>t.format===e)),getCurrentValue:()=>{const{matchOpt:e}=o();return e},getPreviewFor:e=>()=>B.some({tag:"div",styles:-1===e.indexOf("dings")?{"font-family":e}:{}}),onAction:t=>()=>{e.undoManager.transact((()=>{e.focus(),e.execCommand("FontName",!1,t.format)}))},updateText:e=>{const{matchOpt:t,font:n}=o(),s=t.fold(y(n),(e=>e.title));xr(e,Yk,{text:s})},dataset:n,shouldHide:!1,isInvalid:_}},eB={"8pt":"1","10pt":"2","12pt":"3","14pt":"4","18pt":"5","24pt":"6","36pt":"7"},tB={"xx-small":"7pt","x-small":"8pt",small:"10pt",medium:"12pt",large:"14pt","x-large":"18pt","xx-large":"24pt"},oB=(e,t)=>/[0-9.]+px$/.test(e)?((e,t)=>{const o=Math.pow(10,t);return Math.round(e*o)/o})(72*parseInt(e,10)/96,t||0)+"pt":fe(tB,e).getOr(e),nB=e=>fe(eB,e).getOr(""),sB=e=>{const t=()=>{let t=B.none();const o=n.data,s=e.queryCommandValue("FontSize");if(s)for(let e=3;t.isNone()&&e>=0;e--){const n=oB(s,e),r=nB(n);t=G(o,(e=>e.format===s||e.format===n||e.format===r))}return{matchOpt:t,size:s}},o=y(B.none),n=$E(e,"font_size_formats",GE.Space);return{tooltip:"Font sizes",text:B.some("12pt"),icon:B.none(),isSelectedFor:e=>t=>t.exists((t=>t.format===e)),getPreviewFor:o,getCurrentValue:()=>{const{matchOpt:e}=t();return e},onAction:t=>()=>{e.undoManager.transact((()=>{e.focus(),e.execCommand("FontSize",!1,t.format)}))},updateText:e=>{const{matchOpt:o,size:n}=t(),s=o.fold(y(n),(e=>e.title));xr(e,Yk,{text:s})},dataset:n,shouldHide:!1,isInvalid:_}},rB=(e,t)=>{const o="Paragraph";return{tooltip:"Formats",text:B.some(o),icon:B.none(),isSelectedFor:t=>()=>e.formatter.match(t),getCurrentValue:B.none,getPreviewFor:t=>()=>{const o=e.formatter.get(t);return void 0!==o?B.some({tag:o.length>0&&(o[0].inline||o[0].block)||"div",styles:e.dom.parseStyle(e.formatter.getCssText(t))}):B.none()},onAction:NE(e),updateText:t=>{const n=e=>{const t=e.items;return void 0!==t&&t.length>0?X(t,n):[{title:e.title,format:e.format}]},s=X(zO(e),n),r=KE(e,y(s)).fold(y(o),(e=>e.title));xr(t,Yk,{text:r})},shouldHide:ef(e),isInvalid:t=>!e.formatter.canApply(t.format),dataset:t}};var aB=Object.freeze({__proto__:null,events:(e,t)=>{const o=(o,n)=>{e.updateState.each((e=>{const s=e(o,n);t.set(s)})),e.renderComponents.each((s=>{const r=s(n,t.get());(e.reuseDom?Op:Cp)(o,r)}))};return Or([Er(Js(),((t,n)=>{const s=n;if(!s.universal){const n=e.channel;V(s.channels,n)&&o(t,s.data)}})),Rr(((t,n)=>{e.initialData.each((e=>{o(t,e)}))}))])}}),iB=Object.freeze({__proto__:null,getState:(e,t,o)=>o}),lB=[Un("channel"),Zn("renderComponents"),Zn("updateState"),Zn("initialData"),us("reuseDom",!0)];const cB=dl({fields:lB,name:"reflecting",active:aB,apis:iB,state:Object.freeze({__proto__:null,init:()=>{const e=hs(B.none());return{readState:()=>e.get().getOr("none"),get:e.get,set:e.set,clear:()=>e.set(B.none())}}})}),dB=y([Un("toggleClass"),Un("fetch"),vi("onExecute"),as("getHotspot",B.some),as("getAnchorOverrides",y({})),rc(),vi("onItemExecute"),Zn("lazySink"),Un("dom"),fi("onOpen"),Zd("splitDropdownBehaviours",[mw,kp,Hp]),as("matchWidth",!1),as("useMinWidth",!1),as("eventOrder",{}),Zn("role")].concat(Cw())),uB=Ou({factory:kh,schema:[Un("dom")],name:"arrow",defaults:()=>({buttonBehaviours:ll([Hp.revoke()])}),overrides:e=>({dom:{tag:"span",attributes:{role:"presentation"}},action:t=>{t.getSystem().getByUid(e.uid).each(wr)},buttonBehaviours:ll([Yp.config({toggleOnExecute:!1,toggleClass:e.toggleClass})])})}),mB=Ou({factory:kh,schema:[Un("dom")],name:"button",defaults:()=>({buttonBehaviours:ll([Hp.revoke()])}),overrides:e=>({dom:{tag:"span",attributes:{role:"presentation"}},action:t=>{t.getSystem().getByUid(e.uid).each((o=>{e.onExecute(o,t)}))}})}),gB=y([uB,mB,Tu({factory:{sketch:e=>({uid:e.uid,dom:{tag:"span",styles:{display:"none"},attributes:{"aria-hidden":"true"},innerHtml:e.text}})},schema:[Un("text")],name:"aria-descriptor"}),_u({schema:[gi()],name:"menu",defaults:e=>({onExecute:(t,o)=>{t.getSystem().getByUid(e.uid).each((n=>{e.onItemExecute(n,t,o)}))}})}),pw()]),pB=em({name:"SplitDropdown",configFields:dB(),partFields:gB(),factory:(e,t,o,n)=>{const s=e=>{sm.getCurrent(e).each((e=>{Em.highlightFirst(e),kp.focusIn(e)}))},r=t=>{yw(e,x,t,n,s,hw.HighlightFirst).get(b)},a=t=>{const o=Nu(t,e,"button");return wr(o),B.some(!0)},i={...Or([Rr(((t,o)=>{Pu(t,e,"aria-descriptor").each((e=>{const o=Xr("aria");pt(e.element,"id",o),pt(t.element,"aria-describedby",o)}))}))]),...Zp(B.some(r))},l={repositionMenus:e=>{Yp.isOn(e)&&kw(e)}};return{uid:e.uid,dom:e.dom,components:t,apis:l,eventOrder:{...e.eventOrder,[Zs()]:["disabling","toggling","alloy.base.behaviour"]},events:i,behaviours:eu(e.splitDropdownBehaviours,[mw.config({others:{sandbox:t=>{const o=Nu(t,e,"arrow");return Sw(e,t,{onOpen:()=>{Yp.on(o),Yp.on(t)},onClose:()=>{Yp.off(o),Yp.off(t)}})}}}),kp.config({mode:"special",onSpace:a,onEnter:a,onDown:e=>(r(e),B.some(!0))}),Hp.config({}),Yp.config({toggleOnExecute:!1,aria:{mode:"expanded"}})]),domModification:{attributes:{role:e.role.getOr("button"),"aria-haspopup":!0}}}},apis:{repositionMenus:(e,t)=>e.repositionMenus(t)}}),hB=e=>({isEnabled:()=>!vm.isDisabled(e),setEnabled:t=>vm.set(e,!t)}),fB=e=>({setActive:t=>{Yp.set(e,t)},isActive:()=>Yp.isOn(e),isEnabled:()=>!vm.isDisabled(e),setEnabled:t=>vm.set(e,!t)}),bB=(e,t)=>e.map((e=>({"aria-label":t.translate(e),title:t.translate(e)}))).getOr({}),vB=Xr("focus-button"),yB=(e,t,o,n,s,r)=>({dom:{tag:"button",classes:["tox-tbtn"].concat(t.isSome()?["tox-tbtn--select"]:[]),attributes:bB(o,r)},components:Uv([e.map((e=>qk(e,r.icons))),t.map((e=>Kk(e,"tox-tbtn",r)))]),eventOrder:{[Ms()]:["focusing","alloy.base.behaviour","common-button-display-events"]},buttonBehaviours:ll([zv(r.isDisabled),Iv(),Fp("common-button-display-events",[Er(Ms(),((e,t)=>{t.event.prevent(),yr(e,vB)}))])].concat(n.map((o=>cB.config({channel:o,initialData:{icon:e,text:t},renderComponents:(e,t)=>Uv([e.icon.map((e=>qk(e,r.icons))),e.text.map((e=>Kk(e,"tox-tbtn",r)))])}))).toArray()).concat(s.getOr([])))}),xB=(e,t,o)=>{const n=hs(b),s=yB(e.icon,e.text,e.tooltip,B.none(),B.none(),o);return kh.sketch({dom:s.dom,components:s.components,eventOrder:Gk,buttonBehaviours:ll([Fp("toolbar-button-events",[(r={onAction:e.onAction,getApi:t.getApi},Pr(((e,t)=>{Hv(r,e)((t=>{xr(e,jk,{buttonApi:t}),r.onAction(t)}))}))),Pv(t,n),Nv(t,n)]),zv((()=>!e.enabled||o.isDisabled())),Iv()].concat(t.toolbarButtonBehaviours))});var r},wB=(e,t,o)=>xB(e,{toolbarButtonBehaviours:[].concat(o.length>0?[Fp("toolbarButtonWith",o)]:[]),getApi:hB,onSetup:e.onSetup},t),SB=(e,t,o)=>nn(xB(e,{toolbarButtonBehaviours:[Dp.config({}),Yp.config({toggleClass:"tox-tbtn--enabled",aria:{mode:"pressed"},toggleOnExecute:!1})].concat(o.length>0?[Fp("toolbarToggleButtonWith",o)]:[]),getApi:fB,onSetup:e.onSetup},t)),kB=(e,t,o)=>n=>Jx((e=>t.fetch(e))).map((s=>B.from(lx(nn(Xy(Xr("menu-value"),s,(o=>{t.onItemAction(e(n),o)}),t.columns,t.presets,Uf.CLOSE_ON_EXECUTE,t.select.getOr(_),o),{movement:Yy(t.columns,t.presets),menuBehaviours:wv("auto"!==t.columns?[]:[Rr(((e,o)=>{xv(e,4,eb(t.presets)).each((({numRows:t,numColumns:o})=>{kp.setGridSize(e,t,o)}))}))])}))))),CB=[{name:"history",items:["undo","redo"]},{name:"styles",items:["styles"]},{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"]}],OB=(e,t)=>(o,n,s)=>{const r=e(o).mapError((e=>Hn(e))).getOrDie();return t(r,n,s)},_B={button:OB($b,((e,t)=>{return o=e,n=t.backstage.shared.providers,wB(o,n,[]);var o,n})),togglebutton:OB(Kb,((e,t)=>{return o=e,n=t.backstage.shared.providers,SB(o,n,[]);var o,n})),menubutton:OB(nT,((e,t)=>DC(e,"tox-tbtn",t.backstage,B.none()))),splitbutton:OB((e=>Vn("SplitButton",sT,e)),((e,t)=>((e,t)=>{const o=Xr("channel-update-split-dropdown-display"),n=e=>({isEnabled:()=>!vm.isDisabled(e),setEnabled:t=>vm.set(e,!t),setIconFill:(t,o)=>{Qa(e.element,'svg path[id="'+t+'"], rect[id="'+t+'"]').each((e=>{pt(e,"fill",o)}))},setActive:t=>{pt(e.element,"aria-pressed",t),Qa(e.element,"span").each((o=>{e.getSystem().getByDom(o).each((e=>Yp.set(e,t)))}))},isActive:()=>Qa(e.element,"span").exists((t=>e.getSystem().getByDom(t).exists(Yp.isOn)))}),s=hs(b),r={getApi:n,onSetup:e.onSetup};return pB.sketch({dom:{tag:"div",classes:["tox-split-button"],attributes:{"aria-pressed":!1,...bB(e.tooltip,t.providers)}},onExecute:t=>{e.onAction(n(t))},onItemExecute:(e,t,o)=>{},splitDropdownBehaviours:ll([Rv(t.providers.isDisabled),Iv(),Fp("split-dropdown-events",[Er(vB,Hp.focus),Pv(r,s),Nv(r,s)]),Ew.config({})]),eventOrder:{[cr()]:["alloy.base.behaviour","split-dropdown-events"]},toggleClass:"tox-tbtn--enabled",lazySink:t.getSink,fetch:kB(n,e,t.providers),parts:{menu:ab(0,e.columns,e.presets)},components:[pB.parts.button(yB(e.icon,e.text,B.none(),B.some(o),B.some([Yp.config({toggleClass:"tox-tbtn--enabled",toggleOnExecute:!1})]),t.providers)),pB.parts.arrow({dom:{tag:"button",classes:["tox-tbtn","tox-split-button__chevron"],innerHtml:Ah("chevron-down",t.providers.icons)},buttonBehaviours:ll([Rv(t.providers.isDisabled),Iv(),Dh()])}),pB.parts["aria-descriptor"]({text:t.providers.translate("To open the popup, press Shift+Enter")})]})})(e,t.backstage.shared))),grouptoolbarbutton:OB((e=>Vn("GroupToolbarButton",eT,e)),((e,t,o)=>{const n=o.ui.registry.getAll().buttons,s={[nc]:t.backstage.shared.header.isPositionedAtTop()?oc.TopToBottom:oc.BottomToTop};if(nf(o)===zh.floating)return((e,t,o,n)=>{const s=t.shared;return tE.sketch({lazySink:s.getSink,fetch:()=>Jx((t=>{t(P(o(e.items),pE))})),markers:{toggledClass:"tox-tbtn--enabled"},parts:{button:yB(e.icon,e.text,e.tooltip,B.none(),B.none(),s.providers),toolbar:{dom:{tag:"div",classes:["tox-toolbar__overflow"],attributes:n}}}})})(e,t.backstage,(e=>EB(o,{buttons:n,toolbar:e,allowToolbarGroups:!1},t,B.none())),s);throw new Error("Toolbar groups are only supported when using floating toolbar mode")})),styleSelectButton:(e,t)=>((e,t)=>{const o={type:"advanced",...t.styles};return jE(e,t,rB(e,o))})(e,t.backstage),fontsizeSelectButton:(e,t)=>((e,t)=>jE(e,t,sB(e)))(e,t.backstage),fontSelectButton:(e,t)=>((e,t)=>jE(e,t,QE(e)))(e,t.backstage),formatButton:(e,t)=>((e,t)=>jE(e,t,YE(e)))(e,t.backstage),alignMenuButton:(e,t)=>((e,t)=>jE(e,t,XE(e)))(e,t.backstage)},TB={styles:_B.styleSelectButton,fontsize:_B.fontsizeSelectButton,fontfamily:_B.fontSelectButton,blocks:_B.formatButton,align:_B.alignMenuButton},EB=(e,t,o,n)=>{const s=(e=>{const t=e.toolbar,o=e.buttons;return!1===t?[]:void 0===t||!0===t?(e=>{const t=P(CB,(t=>{const o=W(t.items,(t=>be(e,t)||be(TB,t)));return{name:t.name,items:o}}));return W(t,(e=>e.items.length>0))})(o):r(t)?(e=>{const t=e.split("|");return P(t,(e=>({items:e.trim().split(" ")})))})(t):(e=>f(e,(e=>be(e,"name")&&be(e,"items"))))(t)?t:(console.error("Toolbar type should be string, string[], boolean or ToolbarGroup[]"),[])})(t),a=P(s,(s=>{const r=X(s.items,(s=>0===s.trim().length?[]:((e,t,o,n,s,r)=>fe(t,o.toLowerCase()).orThunk((()=>r.bind((e=>re(e,(e=>fe(t,e+o.toLowerCase()))))))).fold((()=>fe(TB,o.toLowerCase()).map((t=>t(e,s))).orThunk((()=>B.none()))),(t=>"grouptoolbarbutton"!==t.type||n?((e,t,o)=>fe(_B,e.type).fold((()=>(console.error("skipping button defined by",e),B.none())),(n=>B.some(n(e,t,o)))))(t,s,e):(console.warn(`Ignoring the '${o}' toolbar button. Group toolbar buttons are only supported when using floating toolbar mode and cannot be nested.`),B.none()))))(e,t.buttons,s,t.allowToolbarGroups,o,n).toArray()));return{title:B.from(e.translate(s.name)),items:r}}));return W(a,(e=>e.items.length>0))},BB=(e,t,o,n)=>{const s=t.outerContainer,a=o.toolbar,i=o.buttons;if(f(a,r)){const t=a.map((t=>{const s={toolbar:t,buttons:i,allowToolbarGroups:o.allowToolbarGroups};return EB(e,s,{backstage:n},B.none())}));TE.setToolbars(s,t)}else TE.setToolbar(s,EB(e,o,{backstage:n},B.none()))},MB=wo(),AB=MB.os.isiOS()&&MB.os.version.major<=12;var DB=Object.freeze({__proto__:null,render:(e,t,o,n,s)=>{const r=hs(0),a=t.outerContainer;RE(e);const i=Fe(s.targetNode),l=it(at(i));((e,t)=>{yd(e,t,_o)})(i,t.mothership),vd(l,t.uiMothership),e.on("PostRender",(()=>{BB(e,t,o,n),r.set(e.getWin().innerWidth),TE.setMenubar(a,ME(e,o)),TE.setSidebar(a,o.sidebar),((e,t)=>{const o=e.dom;let n=e.getWin();const s=e.getDoc().documentElement,r=hs(zt(n.innerWidth,n.innerHeight)),a=hs(zt(s.offsetWidth,s.offsetHeight)),i=()=>{const t=r.get();t.left===n.innerWidth&&t.top===n.innerHeight||(r.set(zt(n.innerWidth,n.innerHeight)),Oy(e))},l=()=>{const t=e.getDoc().documentElement,o=a.get();o.left===t.offsetWidth&&o.top===t.offsetHeight||(a.set(zt(t.offsetWidth,t.offsetHeight)),Oy(e))},c=t=>((e,t)=>e.dispatch("ScrollContent",t))(e,t);o.bind(n,"resize",i),o.bind(n,"scroll",c);const d=Nl(Fe(e.getBody()),"load",l),u=t.uiMothership.element;e.on("hide",(()=>{St(u,"display","none")})),e.on("show",(()=>{Mt(u,"display")})),e.on("NodeChange",l),e.on("remove",(()=>{d.unbind(),o.unbind(n,"resize",i),o.unbind(n,"scroll",c),n=null}))})(e,t)}));const d=TE.getSocket(a).getOrDie("Could not find expected socket element");if(AB){kt(d.element,{overflow:"scroll","-webkit-overflow-scrolling":"touch"});const t=((e,t)=>{let o=null;return{cancel:()=>{c(o)||(clearTimeout(o),o=null)},throttle:(...t)=>{c(o)&&(o=setTimeout((()=>{o=null,e.apply(null,t)}),20))}}})((()=>{e.dispatch("ScrollContent")})),o=Pl(d.element,"scroll",t.throttle);e.on("remove",o.unbind)}Fv(e,t),e.addCommand("ToggleSidebar",((t,o)=>{TE.toggleSidebar(a,o),e.dispatch("ToggleSidebar")})),e.addQueryValueHandler("ToggleSidebar",(()=>TE.whichSidebar(a)));const u=nf(e);u!==zh.sliding&&u!==zh.floating||e.on("ResizeWindow ResizeEditor ResizeContent",(()=>{const o=e.getWin().innerWidth;o!==r.get()&&(TE.refreshToolbar(t.outerContainer),r.set(o))}));const m={setEnabled:e=>{Dv(t,!e)},isEnabled:()=>!vm.isDisabled(a)};return{iframeContainer:d.element.dom,editorContainer:a.element.dom,api:m}}});const FB=e=>/^[0-9\.]+(|px)$/i.test(""+e)?B.some(parseInt(""+e,10)):B.none(),IB=e=>h(e)?e+"px":e,VB=(e,t,o)=>{const n=t.filter((t=>e<t)),s=o.filter((t=>e>t));return n.or(s).getOr(e)},RB=e=>{const t=qh(e),o=Xh(e),n=Yh(e);return FB(t).map((e=>VB(e,o,n)))},{ToolbarLocation:zB,ToolbarMode:HB}=Pf,PB=(e,t)=>{const o=Lo(e);return{pos:t?o.y:o.bottom,bounds:o}};var NB=Object.freeze({__proto__:null,render:(e,t,o,n,s)=>{const{mothership:r,uiMothership:a,outerContainer:i}=t,l=hs(null),c=Fe(s.targetNode),d=((e,t,o,n,s)=>{const{uiMothership:r,outerContainer:a}=o,i=Ph.DOM,l=If(e),c=zf(e),d=Yh(e).or(RB(e)),u=n.shared.header,m=u.isPositionedAtTop,g=nf(e),p=g===HB.sliding||g===HB.floating,h=hs(!1),f=()=>h.get()&&!e.removed,b=e=>p?e.fold(y(0),(e=>e.components().length>1?It(e.components()[1].element):0)):0,v=()=>{r.broadcastOn([Fd()],{})},x=(e=!1)=>{if(f()){if(l||(()=>{const e=d.getOrThunk((()=>{const e=FB(Ot(ut(),"margin-left")).getOr(0);return Wt(ut())-Pt(t).left+e}));St(s.get().element,"max-width",e+"px")})(),p&&TE.refreshToolbar(a),l||(()=>{const e=TE.getToolbar(a),o=b(e),n=Lo(t),r=m()?Math.max(n.y-It(s.get().element)+o,0):n.bottom;kt(a.element,{position:"absolute",top:Math.round(r)+"px",left:Math.round(n.x)+"px"})})(),c){const t=s.get();e?U_.reset(t):U_.refresh(t)}v()}},w=(o=!0)=>{if(l||!c||!f())return;const n=u.getDockingMode(),r=(o=>{switch(rf(e)){case zB.auto:const e=TE.getToolbar(a),n=b(e),s=It(o.element)-n,r=Lo(t);if(r.y>s)return"top";{const e=Xe(t),o=Math.max(e.dom.scrollHeight,It(e));return r.bottom<o-s||Uo().bottom<r.bottom-s?"bottom":"top"}case zB.bottom:return"bottom";case zB.top:default:return"top"}})(s.get());r!==n&&((e=>{const t=s.get();U_.setModes(t,[e]),u.setDockingMode(e);const o=m()?oc.TopToBottom:oc.BottomToTop;pt(t.element,nc,o)})(r),o&&x(!0))};return{isVisible:f,isPositionedAtTop:m,show:()=>{h.set(!0),St(a.element,"display","flex"),i.addClass(e.getBody(),"mce-edit-focus"),Mt(r.element,"display"),w(!1),x()},hide:()=>{h.set(!1),o.outerContainer&&(St(a.element,"display","none"),i.removeClass(e.getBody(),"mce-edit-focus")),St(r.element,"display","none")},update:x,updateMode:w,repositionPopups:v}})(e,c,t,n,l),u=cf(e);zE(e);const m=()=>{if(l.get())return void d.show();l.set(TE.getHeader(i).getOrDie());const s=Vf(e);vd(s,r),vd(s,a),BB(e,t,o,n),TE.setMenubar(i,ME(e,o)),d.show(),((e,t,o,n)=>{const s=hs(PB(t,o.isPositionedAtTop())),r=n=>{const{pos:r,bounds:a}=PB(t,o.isPositionedAtTop()),{pos:i,bounds:l}=s.get(),c=a.height!==l.height||a.width!==l.width;s.set({pos:r,bounds:a}),c&&Oy(e,n),o.isVisible()&&(i!==r?o.update(!0):c&&(o.updateMode(),o.repositionPopups()))};n||(e.on("activate",o.show),e.on("deactivate",o.hide)),e.on("SkinLoaded ResizeWindow",(()=>o.update(!0))),e.on("NodeChange keydown",(e=>{requestAnimationFrame((()=>r(e)))})),e.on("ScrollWindow",(()=>o.updateMode()));const a=Rl();a.set(Nl(Fe(e.getBody()),"load",r)),e.on("remove",(()=>{a.clear()}))})(e,c,d,u),e.nodeChanged()};e.on("show",m),e.on("hide",d.hide),u||(e.on("focus",m),e.on("blur",d.hide)),e.on("init",(()=>{(e.hasFocus()||u)&&m()})),Fv(e,t);const g={show:()=>{m()},hide:()=>{d.hide()},setEnabled:e=>{Dv(t,!e)},isEnabled:()=>!vm.isDisabled(i)};return{editorContainer:i.element.dom,api:g}}});const LB="contexttoolbar-hide",WB=(e,t)=>Er(jk,((o,n)=>{const s=(e=>({hide:()=>yr(e,or()),getValue:()=>Jd.getValue(e)}))(e.get(o));t.onAction(s,n.event.buttonApi)})),UB=(e,t)=>{const o=e.label.fold((()=>({})),(e=>({"aria-label":e}))),n=Ch($x.sketch({inputClasses:["tox-toolbar-textfield","tox-toolbar-nav-js"],data:e.initValue(),inputAttributes:o,selectOnFocus:!0,inputBehaviours:ll([kp.config({mode:"special",onEnter:e=>s.findPrimary(e).map((e=>(wr(e),!0))),onLeft:(e,t)=>(t.cut(),B.none()),onRight:(e,t)=>(t.cut(),B.none())})])})),s=((e,t,o)=>{const n=P(t,(t=>Ch(((e,t,o)=>{const n={backstage:{shared:{providers:o}}};return"contextformtogglebutton"===t.type?((e,t,o)=>{const{primary:n,...s}=t.original,r=Rn(Kb({...s,type:"togglebutton",onAction:b}));return SB(r,o.backstage.shared.providers,[WB(e,t)])})(e,t,n):((e,t,o)=>{const{primary:n,...s}=t.original,r=Rn($b({...s,type:"button",onAction:b}));return wB(r,o.backstage.shared.providers,[WB(e,t)])})(e,t,n)})(e,t,o))));return{asSpecs:()=>P(n,(e=>e.asSpec())),findPrimary:e=>re(t,((t,o)=>t.primary?B.from(n[o]).bind((t=>t.getOpt(e))).filter(k(vm.isDisabled)):B.none()))}})(n,e.commands,t);return[{title:B.none(),items:[n.asSpec()]},{title:B.none(),items:s.asSpecs()}]},jB=(e,t,o=.01)=>t.bottom-e.y>=o&&e.bottom-t.y>=o,GB=e=>{const t=(e=>{const t=e.getBoundingClientRect();if(t.height<=0&&t.width<=0){const o=ot(Fe(e.startContainer),e.startOffset).element;return(He(o)?Ye(o):B.some(o)).filter(ze).map((e=>e.dom.getBoundingClientRect())).getOr(t)}return t})(e.selection.getRng());if(e.inline){const e=Do();return No(e.left+t.left,e.top+t.top,t.width,t.height)}{const o=Wo(Fe(e.getBody()));return No(o.x+t.left,o.y+t.top,t.width,t.height)}},$B=(e,t,o,n=0)=>{const s=Vo(window),r=Lo(Fe(e.getContentAreaContainer())),a=_f(e)||Bf(e)||Af(e),{x:i,width:l}=((e,t,o)=>{const n=Math.max(e.x+o,t.x);return{x:n,width:Math.min(e.right-o,t.right)-n}})(r,s,n);if(e.inline&&!a)return No(i,s.y,l,s.height);{const a=t.header.isPositionedAtTop(),{y:c,bottom:d}=((e,t,o,n,s,r)=>{const a=Fe(e.getContainer()),i=Qa(a,".tox-editor-header").getOr(a),l=Lo(i),c=l.y>=t.bottom,d=n&&!c;if(e.inline&&d)return{y:Math.max(l.bottom+r,o.y),bottom:o.bottom};if(e.inline&&!d)return{y:o.y,bottom:Math.min(l.y-r,o.bottom)};const u="line"===s?Lo(a):t;return d?{y:Math.max(l.bottom+r,o.y),bottom:Math.min(u.bottom-r,o.bottom)}:{y:Math.max(u.y+r,o.y),bottom:Math.min(l.y-r,o.bottom)}})(e,r,s,a,o,n);return No(i,c,l,d-c)}},qB={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"]},XB={maxHeightFunction:ql(),maxWidthFunction:KT()},KB=e=>"node"===e,YB=(e,t,o,n,s)=>{const r=GB(e),a=n.lastElement().exists((e=>je(o,e)));return((e,t)=>{const o=e.selection.getRng(),n=ot(Fe(o.startContainer),o.startOffset);return o.startContainer===o.endContainer&&o.startOffset===o.endOffset-1&&je(n.element,t)})(e,o)?a?yO:pO:a?((e,o,s)=>{const a=Tt(e,"position");St(e,"position",o);const i=jB(r,Lo(t))&&!n.isReposition()?wO:yO;return a.each((t=>St(e,"position",t))),i})(t,n.getMode()):("fixed"===n.getMode()?s.y+Do().top:s.y)+(It(t)+12)<=r.y?pO:hO},JB=(e,t,o,n)=>{const s=t=>(n,s,r,a,i)=>({...YB(e,a,t,o,i)({...n,y:i.y,height:i.height},s,r,a,i),alwaysFit:!0}),r=e=>KB(n)?[s(e)]:[];return t?{onLtr:e=>[Xi,Ui,ji,Gi,$i,qi].concat(r(e)),onRtl:e=>[Xi,ji,Ui,$i,Gi,qi].concat(r(e))}:{onLtr:e=>[qi,Xi,Gi,Ui,$i,ji].concat(r(e)),onRtl:e=>[qi,Xi,$i,ji,Gi,Ui].concat(r(e))}},ZB=(e,t)=>{const o=W(t,(t=>t.predicate(e.dom))),{pass:n,fail:s}=L(o,(e=>"contexttoolbar"===e.type));return{contextToolbars:n,contextForms:s}},QB=(e,t)=>{const o={},n=[],s=[],r={},a={},i=ae(e);return N(i,(i=>{const l=e[i];"contextform"===l.type?((e,i)=>{const l=Rn(Vn("ContextForm",ov,i));o[e]=l,l.launch.map((o=>{r["form:"+e]={...i.launch,type:"contextformtogglebutton"===o.type?"togglebutton":"button",onAction:()=>{t(l)}}})),"editor"===l.scope?s.push(l):n.push(l),a[e]=l})(i,l):"contexttoolbar"===l.type&&((e,t)=>{var o;(o=t,Vn("ContextToolbar",nv,o)).each((o=>{"editor"===t.scope?s.push(o):n.push(o),a[e]=o}))})(i,l)})),{forms:o,inNodeScope:n,inEditorScope:s,lookupTable:a,formNavigators:r}},eM=Xr("forward-slide"),tM=Xr("backward-slide"),oM=Xr("change-slide-event"),nM="tox-pop--resizing",sM="tox-pop--transition",rM=(e,t,o,n)=>{const s=n.backstage,r=s.shared,a=wo().deviceType.isTouch,i=zl(),l=zl(),c=zl(),d=ja((e=>{const t=hs([]);return wh.sketch({dom:{tag:"div",classes:["tox-pop"]},fireDismissalEventInstead:{event:"doNotDismissYet"},onShow:e=>{t.set([]),wh.getContent(e).each((e=>{Mt(e.element,"visibility")})),Ta(e.element,nM),Mt(e.element,"width")},inlineBehaviours:ll([Fp("context-toolbar-events",[Vr(Us(),((e,t)=>{"width"===t.event.raw.propertyName&&(Ta(e.element,nM),Mt(e.element,"width"))})),Er(oM,((e,t)=>{const o=e.element;Mt(o,"width");const n=Wt(o);wh.setContent(e,t.event.contents),_a(o,nM);const s=Wt(o);St(o,"width",n+"px"),wh.getContent(e).each((e=>{t.event.focus.bind((e=>(fl(e),yl(o)))).orThunk((()=>(kp.focusIn(e),vl(at(o)))))})),setTimeout((()=>{St(e.element,"width",s+"px")}),0)})),Er(eM,((e,o)=>{wh.getContent(e).each((o=>{t.set(t.get().concat([{bar:o,focus:vl(at(e.element))}]))})),xr(e,oM,{contents:o.event.forwardContents,focus:B.none()})})),Er(tM,((e,o)=>{ne(t.get()).each((o=>{t.set(t.get().slice(0,t.get().length-1)),xr(e,oM,{contents:Ga(o.bar),focus:o.focus})}))}))]),kp.config({mode:"special",onEscape:o=>ne(t.get()).fold((()=>e.onEscape()),(e=>(yr(o,tM),B.some(!0))))})]),lazySink:()=>$o.value(e.sink)})})({sink:o,onEscape:()=>(e.focus(),B.some(!0))})),u=()=>{const t=c.get().getOr("node"),o=KB(t)?1:0;return $B(e,r,t,o)},m=()=>!(e.removed||a()&&s.isContextMenuOpen()),g=()=>{if(m()){const t=u(),o=ye(c.get(),"node")?((e,t)=>t.filter(dt).map(Wo).getOrThunk((()=>GB(e))))(e,i.get()):GB(e);return t.height<=0||!jB(o,t)}return!0},p=()=>{i.clear(),l.clear(),c.clear(),wh.hide(d)},h=()=>{if(wh.isOpen(d)){const e=d.element;Mt(e,"display"),g()?St(e,"display","none"):(l.set(0),wh.reposition(d))}},f=t=>({dom:{tag:"div",classes:["tox-pop__dialog"]},components:[t],behaviours:ll([kp.config({mode:"acyclic"}),Fp("pop-dialog-wrap-events",[Rr((t=>{e.shortcuts.add("ctrl+F9","focus statusbar",(()=>kp.focusIn(t)))})),zr((t=>{e.shortcuts.remove("ctrl+F9")}))])])}),v=jt((()=>QB(t,(e=>{const t=y([e]);xr(d,eM,{forwardContents:f(t)})})))),y=t=>{const{buttons:o}=e.ui.registry.getAll(),s={...o,...v().formNavigators},a=nf(e)===zh.scrolling?zh.scrolling:zh.default,i=q(P(t,(t=>"contexttoolbar"===t.type?((t,o)=>EB(e,{buttons:t,toolbar:o.items,allowToolbarGroups:!1},n,B.some(["form:"])))(s,t):((e,t)=>UB(e,t))(t,r.providers))));return yE({type:a,uid:Xr("context-toolbar"),initGroups:i,onEscape:B.none,cyclicKeying:!0,providers:r.providers})},x=(t,n)=>{if(w.cancel(),!m())return;const s=y(t),p=t[0].position,h=((t,n)=>{const s="node"===t?r.anchors.node(n):r.anchors.cursor(),c=((e,t,o,n)=>"line"===t?{bubble:Jl(12,0,qB),layouts:{onLtr:()=>[Ki],onRtl:()=>[Yi]},overrides:XB}:{bubble:Jl(0,12,qB,1/12),layouts:JB(e,o,n,t),overrides:XB})(e,t,a(),{lastElement:i.get,isReposition:()=>ye(l.get(),0),getMode:()=>ad.getMode(o)});return nn(s,c)})(p,n);c.set(p),l.set(1);const b=d.element;Mt(b,"display"),(e=>ye(we(e,i.get(),je),!0))(n)||(Ta(b,sM),ad.reset(o,d)),wh.showWithinBounds(d,f(s),{anchor:h,transition:{classes:[sM],mode:"placement"}},(()=>B.some(u()))),n.fold(i.clear,i.set),g()&&St(b,"display","none")},w=bC((()=>{e.hasFocus()&&!e.removed&&(Ea(d.element,sM)?w.throttle():((e,t)=>{const o=Fe(t.getBody()),n=e=>je(e,o),s=Fe(t.selection.getNode());return(e=>!n(e)&&!Ge(o,e))(s)?B.none():((e,t,o)=>{const n=ZB(e,t);if(n.contextForms.length>0)return B.some({elem:e,toolbars:[n.contextForms[0]]});{const t=ZB(e,o);if(t.contextForms.length>0)return B.some({elem:e,toolbars:[t.contextForms[0]]});if(n.contextToolbars.length>0||t.contextToolbars.length>0){const o=(e=>{if(e.length<=1)return e;{const t=t=>R(e,(e=>e.position===t)),o=t=>W(e,(e=>e.position===t)),n=t("selection"),s=t("node");if(n||s){if(s&&n){const e=o("node"),t=P(o("selection"),(e=>({...e,position:"node"})));return e.concat(t)}return o(n?"selection":"node")}return o("line")}})(n.contextToolbars.concat(t.contextToolbars));return B.some({elem:e,toolbars:o})}return B.none()}})(s,e.inNodeScope,e.inEditorScope).orThunk((()=>((e,t,o)=>e(t)?B.none():xs(t,(e=>{if(ze(e)){const{contextToolbars:t,contextForms:n}=ZB(e,o.inNodeScope),s=n.length>0?n:(e=>{if(e.length<=1)return e;{const t=t=>G(e,(e=>e.position===t));return t("selection").orThunk((()=>t("node"))).orThunk((()=>t("line"))).map((e=>e.position)).fold((()=>[]),(t=>W(e,(e=>e.position===t))))}})(t);return s.length>0?B.some({elem:e,toolbars:s}):B.none()}return B.none()}),e))(n,s,e)))})(v(),e).fold(p,(e=>{x(e.toolbars,B.some(e.elem))})))}),17);e.on("init",(()=>{e.on("remove",p),e.on("ScrollContent ScrollWindow ObjectResized ResizeEditor longpress",h),e.on("click keyup focus SetContent",w.throttle),e.on(LB,p),e.on("contexttoolbar-show",(t=>{const o=v();fe(o.lookupTable,t.toolbarKey).each((o=>{x([o],Se(t.target!==e,t.target)),wh.getContent(d).each(kp.focusIn)}))})),e.on("focusout",(t=>{Sh.setEditorTimeout(e,(()=>{yl(o.element).isNone()&&yl(d.element).isNone()&&p()}),0)})),e.on("SwitchMode",(()=>{e.mode.isReadOnly()&&p()})),e.on("AfterProgressState",(t=>{t.state?p():e.hasFocus()&&w.throttle()})),e.on("NodeChange",(e=>{yl(d.element).fold(w.throttle,b)}))}))},aM={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:[""]},iM=(()=>{const e="[0-9]+",t="[eE][+-]?[0-9]+",o=e=>`(?:${e})?`,n=["Infinity","[0-9]+\\."+o(e)+o(t),"\\.[0-9]+"+o(t),e+o(t)].join("|");return new RegExp(`^([+-]?(?:${n}))(.*)$`)})(),lM=(e,t)=>{const o=()=>{const o=t.getOptions(e),n=t.getCurrent(e).map(t.hash),s=zl();return P(o,(o=>({type:"togglemenuitem",text:t.display(o),onSetup:r=>{const a=e=>{e&&(s.on((e=>e.setActive(!1))),s.set(r)),r.setActive(e)};a(ye(n,t.hash(o)));const i=t.watcher(e,o,a);return()=>{s.clear(),i()}},onAction:()=>t.setCurrent(e,o)})))};e.ui.registry.addMenuButton(t.name,{tooltip:t.text,icon:t.icon,fetch:e=>e(o()),onSetup:t.onToolbarSetup}),e.ui.registry.addNestedMenuItem(t.name,{type:"nestedmenuitem",text:t.text,getSubmenuItems:o,onSetup:t.onMenuSetup})},cM={name:"lineheight",text:"Line height",icon:"line-height",getOptions:Ef,hash:e=>((e,t)=>((e,t)=>B.from(iM.exec(e)).bind((e=>{const o=Number(e[1]),n=e[2];return((e,t)=>R(t,(t=>R(aM[t],(t=>e===t)))))(n,t)?B.some({value:o,unit:n}):B.none()})))(e,["fixed","relative","empty"]).map((({value:e,unit:t})=>e+t)))(e).getOr(e),display:x,watcher:(e,t,o)=>e.formatter.formatChanged("lineheight",o,!1,{value:t}).unbind,getCurrent:e=>B.from(e.queryCommandValue("LineHeight")),setCurrent:(e,t)=>e.execCommand("LineHeight",!1,t)},dM=e=>PE(e,"NodeChange",(t=>{t.setEnabled(e.queryCommandState("outdent"))})),uM=(e,t)=>o=>{o.setActive(t.get());const n=e=>{t.set(e.state),o.setActive(e.state)};return e.on("PastePlainTextToggle",n),()=>e.off("PastePlainTextToggle",n)},mM=(e,t)=>()=>{e.execCommand("mceToggleFormat",!1,t)},gM=e=>{(e=>{(e=>{Rk.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"}],((t,o)=>{e.ui.registry.addToggleButton(t.name,{tooltip:t.text,icon:t.icon,onSetup:HE(e,t.name),onAction:mM(e,t.name)})}));for(let t=1;t<=6;t++){const o="h"+t;e.ui.registry.addToggleButton(o,{text:o.toUpperCase(),tooltip:"Heading "+t,onSetup:HE(e,o),onAction:mM(e,o)})}})(e),(e=>{Rk.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"},{name:"print",text:"Print",action:"mcePrint",icon:"print"},{name:"hr",text:"Horizontal line",action:"InsertHorizontalRule",icon:"horizontal-rule"}],(t=>{e.ui.registry.addButton(t.name,{tooltip:t.text,icon:t.icon,onAction:LE(e,t.action)})}))})(e),(e=>{Rk.each([{name:"blockquote",text:"Blockquote",action:"mceBlockQuote",icon:"quote"}],(t=>{e.ui.registry.addToggleButton(t.name,{tooltip:t.text,icon:t.icon,onAction:LE(e,t.action),onSetup:HE(e,t.name)})}))})(e)})(e),(e=>{Rk.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"},{name:"subscript",text:"Subscript",action:"Subscript",icon:"subscript"},{name:"superscript",text:"Superscript",action:"Superscript",icon:"superscript"},{name:"removeformat",text:"Clear formatting",action:"RemoveFormat",icon:"remove-formatting"},{name:"newdocument",text:"New document",action:"mceNewDocument",icon:"new-document"},{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"},{name:"print",text:"Print...",action:"mcePrint",icon:"print",shortcut:"Meta+P"},{name:"hr",text:"Horizontal line",action:"InsertHorizontalRule",icon:"horizontal-rule"}],(t=>{e.ui.registry.addMenuItem(t.name,{text:t.text,icon:t.icon,shortcut:t.shortcut,onAction:LE(e,t.action)})})),e.ui.registry.addMenuItem("codeformat",{text:"Code",icon:"sourcecode",onAction:mM(e,"code")})})(e)},pM=(e,t)=>PE(e,"Undo Redo AddUndo TypingUndo ClearUndos SwitchMode",(o=>{o.setEnabled(!e.mode.isReadOnly()&&e.undoManager[t]())})),hM=e=>PE(e,"VisualAid",(t=>{t.setActive(e.hasVisual)})),fM=(e,t)=>{(e=>{N([{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"}],(t=>{e.ui.registry.addToggleButton(t.name,{tooltip:t.text,icon:t.icon,onAction:LE(e,t.cmd),onSetup:HE(e,t.name)})})),e.ui.registry.addButton("alignnone",{tooltip:"No alignment",icon:"align-none",onAction:LE(e,"JustifyNone")})})(e),gM(e),((e,t)=>{((e,t)=>{const o=UE(0,t,XE(e));e.ui.registry.addNestedMenuItem("align",{text:t.shared.providers.translate("Align"),getSubmenuItems:()=>o.items.validateItems(o.getStyleItems())})})(e,t),((e,t)=>{const o=UE(0,t,QE(e));e.ui.registry.addNestedMenuItem("fontfamily",{text:t.shared.providers.translate("Fonts"),getSubmenuItems:()=>o.items.validateItems(o.getStyleItems())})})(e,t),((e,t)=>{const o={type:"advanced",...t.styles},n=UE(0,t,rB(e,o));e.ui.registry.addNestedMenuItem("styles",{text:"Formats",getSubmenuItems:()=>n.items.validateItems(n.getStyleItems())})})(e,t),((e,t)=>{const o=UE(0,t,YE(e));e.ui.registry.addNestedMenuItem("blocks",{text:"Blocks",getSubmenuItems:()=>o.items.validateItems(o.getStyleItems())})})(e,t),((e,t)=>{const o=UE(0,t,sB(e));e.ui.registry.addNestedMenuItem("fontsize",{text:"Font sizes",getSubmenuItems:()=>o.items.validateItems(o.getStyleItems())})})(e,t)})(e,t),(e=>{(e=>{e.ui.registry.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onSetup:pM(e,"hasUndo"),onAction:LE(e,"undo")}),e.ui.registry.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onSetup:pM(e,"hasRedo"),onAction:LE(e,"redo")})})(e),(e=>{e.ui.registry.addButton("undo",{tooltip:"Undo",icon:"undo",enabled:!1,onSetup:pM(e,"hasUndo"),onAction:LE(e,"undo")}),e.ui.registry.addButton("redo",{tooltip:"Redo",icon:"redo",enabled:!1,onSetup:pM(e,"hasRedo"),onAction:LE(e,"redo")})})(e)})(e),(e=>{(e=>{e.addCommand("mceApplyTextcolor",((t,o)=>{((e,t,o)=>{e.undoManager.transact((()=>{e.focus(),e.formatter.apply(t,{value:o}),e.nodeChanged()}))})(e,t,o)})),e.addCommand("mceRemoveTextcolor",(t=>{((e,t)=>{e.undoManager.transact((()=>{e.focus(),e.formatter.remove(t,{value:null},null,!0),e.nodeChanged()}))})(e,t)}))})(e);const t=hs(Py),o=hs(Py);Gy(e,"forecolor","forecolor","Text color",t),Gy(e,"backcolor","hilitecolor","Background color",o),$y(e,"forecolor","forecolor","Text color"),$y(e,"backcolor","hilitecolor","Background color")})(e),(e=>{(e=>{e.ui.registry.addButton("visualaid",{tooltip:"Visual aids",text:"Visual aids",onAction:LE(e,"mceToggleVisualAid")})})(e),(e=>{e.ui.registry.addToggleMenuItem("visualaid",{text:"Visual aids",onSetup:hM(e),onAction:LE(e,"mceToggleVisualAid")})})(e)})(e),(e=>{(e=>{e.ui.registry.addButton("outdent",{tooltip:"Decrease indent",icon:"outdent",onSetup:dM(e),onAction:LE(e,"outdent")}),e.ui.registry.addButton("indent",{tooltip:"Increase indent",icon:"indent",onAction:LE(e,"indent")})})(e)})(e),(e=>{lM(e,cM),(e=>B.from(tf(e)).map((t=>({name:"language",text:"Language",icon:"language",getOptions:y(t),hash:e=>u(e.customCode)?e.code:`${e.code}/${e.customCode}`,display:e=>e.title,watcher:(e,t,o)=>e.formatter.formatChanged("lang",o,!1,{value:t.code,customValue:t.customCode}).unbind,getCurrent:e=>{const t=Fe(e.selection.getNode());return ws(t,(e=>B.some(e).filter(ze).bind((e=>bt(e,"lang").map((t=>({code:t,customCode:bt(e,"data-mce-lang").getOrUndefined(),title:""})))))))},setCurrent:(e,t)=>e.execCommand("Lang",!1,t),onToolbarSetup:t=>{const o=Rl();return t.setActive(e.formatter.match("lang",{},void 0,!0)),o.set(e.formatter.formatChanged("lang",t.setActive,!0)),o.clear}}))))(e).each((t=>lM(e,t)))})(e),(e=>{const t=hs(Cf(e)),o=()=>e.execCommand("mceTogglePlainTextPaste");e.ui.registry.addToggleButton("pastetext",{active:!1,icon:"paste-text",tooltip:"Paste as text",onAction:o,onSetup:uM(e,t)}),e.ui.registry.addToggleMenuItem("pastetext",{text:"Paste as text",icon:"paste-text",onAction:o,onSetup:uM(e,t)})})(e)},bM=e=>r(e)?e.split(/[ ,]/):e,vM=e=>t=>t.options.get(e),yM=vM("contextmenu_never_use_native"),xM=vM("contextmenu_avoid_overlap"),wM=e=>{const t=e.ui.registry.getAll().contextMenus,o=e.options.get("contextmenu");return e.options.isSet("contextmenu")?o:W(o,(e=>be(t,e)))},SM=(e,t)=>({type:"makeshift",x:e,y:t}),kM=e=>"longpress"===e.type||0===e.type.indexOf("touch"),CM=(e,t)=>"contextmenu"===t.type||"longpress"===t.type?e.inline?(e=>{if(kM(e)){const t=e.touches[0];return SM(t.pageX,t.pageY)}return SM(e.pageX,e.pageY)})(t):((e,t)=>{const o=Ph.DOM.getPos(e);return((e,t,o)=>SM(e.x+t,e.y+o))(t,o.x,o.y)})(e.getContentAreaContainer(),(e=>{if(kM(e)){const t=e.touches[0];return SM(t.clientX,t.clientY)}return SM(e.clientX,e.clientY)})(t)):OM(e),OM=e=>({type:"selection",root:Fe(e.selection.getNode())}),_M=(e,t,o)=>{switch(o){case"node":return(e=>({type:"node",node:B.some(Fe(e.selection.getNode())),root:Fe(e.getBody())}))(e);case"point":return CM(e,t);case"selection":return OM(e)}},TM=(e,t,o,n,s,r)=>{const a=o(),i=_M(e,t,r);oC(a,Uf.CLOSE_ON_EXECUTE,n,!1).map((e=>{t.preventDefault(),wh.showMenuAt(s,{anchor:i},{menu:{markers:nb("normal")},data:e})}))},EM={onLtr:()=>[Xi,Ui,ji,Gi,$i,qi,pO,hO,gO,uO,mO,dO],onRtl:()=>[Xi,ji,Ui,$i,Gi,qi,pO,hO,mO,dO,gO,uO]},BM={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"]},MM=(e,t,o,n,s,r)=>{const a=wo(),i=a.os.isiOS(),l=a.os.isMacOS(),c=a.os.isAndroid(),d=a.deviceType.isTouch(),u=()=>{const a=o();((e,t,o,n,s,r,a)=>{const i=((e,t,o)=>{const n=_M(e,t,o);return{bubble:Jl(0,"point"===o?12:0,BM),layouts:EM,overrides:{maxWidthFunction:KT(),maxHeightFunction:ql()},...n}})(e,t,r);oC(o,Uf.CLOSE_ON_EXECUTE,n,!0).map((o=>{t.preventDefault(),wh.showMenuWithinBounds(s,{anchor:i},{menu:{markers:nb("normal"),highlightImmediately:a},data:o,type:"horizontal"},(()=>B.some($B(e,n.shared,"node"===r?"node":"selection")))),e.dispatch(LB)}))})(e,t,a,n,s,r,!(c||i||l&&d))};if((l||i)&&"node"!==r){const o=()=>{(e=>{const t=e.selection.getRng(),o=()=>{Sh.setEditorTimeout(e,(()=>{e.selection.setRng(t)}),10),r()};e.once("touchend",o);const n=e=>{e.preventDefault(),e.stopImmediatePropagation()};e.on("mousedown",n,!0);const s=()=>r();e.once("longpresscancel",s);const r=()=>{e.off("touchend",o),e.off("longpresscancel",s),e.off("mousedown",n)}})(e),u()};((e,t)=>{const o=e.selection;if(o.isCollapsed()||t.touches.length<1)return!1;{const n=t.touches[0],s=o.getRng();return Ic(e.getWin(),Cc.domRange(s)).exists((e=>e.left<=n.clientX&&e.right>=n.clientX&&e.top<=n.clientY&&e.bottom>=n.clientY))}})(e,t)?o():(e.once("selectionchange",o),e.once("touchend",(()=>e.off("selectionchange",o))))}else u()},AM=e=>r(e)?"|"===e:"separator"===e.type,DM={type:"separator"},FM=e=>{const t=e=>({text:e.text,icon:e.icon,enabled:e.enabled,shortcut:e.shortcut});if(r(e))return e;switch(e.type){case"separator":return DM;case"submenu":return{type:"nestedmenuitem",...t(e),getSubmenuItems:()=>{const t=e.getSubmenuItems();return r(t)?t:P(t,FM)}};default:return{type:"menuitem",...t(e),onAction:(o=e.onAction,()=>o())}}var o},IM=(e,t)=>{if(0===t.length)return e;const o=ne(e).filter((e=>!AM(e))).fold((()=>[]),(e=>[DM]));return e.concat(o).concat(t).concat([DM])},VM=(e,t)=>"longpress"!==t.type&&(2!==t.button||t.target===e.getBody()&&""===t.pointerType),RM=(e,t)=>VM(e,t)?e.selection.getStart(!0):t.target,zM=(e,t,o)=>{const n=wo().deviceType.isTouch,s=ja(wh.sketch({dom:{tag:"div"},lazySink:t,onEscape:()=>e.focus(),onShow:()=>o.setContextMenuState(!0),onHide:()=>o.setContextMenuState(!1),fireDismissalEventInstead:{},inlineBehaviours:ll([Fp("dismissContextMenu",[Er(ur(),((t,o)=>{Ad.close(t),e.focus()}))])])})),a=e=>wh.hide(s),i=t=>{if(yM(e)&&t.preventDefault(),((e,t)=>t.ctrlKey&&!yM(e))(e,t)||(e=>0===wM(e).length)(e))return;const a=((e,t)=>{const o=xM(e),n=VM(e,t)?"selection":"point";if(Te(o)){const s=RM(e,t);return dx(Fe(s),o)?"node":n}return n})(e,t);(n()?MM:TM)(e,t,(()=>{const o=RM(e,t),n=e.ui.registry.getAll(),s=wM(e);return((e,t,o)=>{const n=j(t,((t,n)=>fe(e,n.toLowerCase()).map((e=>{const n=e.update(o);if(r(n))return IM(t,n.split(" "));if(n.length>0){const e=P(n,FM);return IM(t,e)}return t})).getOrThunk((()=>t.concat([n])))),[]);return n.length>0&&AM(n[n.length-1])&&n.pop(),n})(n.contextMenus,s,o)}),o,s,a)};e.on("init",(()=>{const t="ResizeEditor ScrollContent ScrollWindow longpresscancel"+(n()?"":" ResizeWindow");e.on(t,a),e.on("longpress contextmenu",i)}))},HM=fs([{offset:["x","y"]},{absolute:["x","y"]},{fixed:["x","y"]}]),PM=e=>t=>t.translate(-e.left,-e.top),NM=e=>t=>t.translate(e.left,e.top),LM=e=>(t,o)=>j(e,((e,t)=>t(e)),zt(t,o)),WM=(e,t,o)=>e.fold(LM([NM(o),PM(t)]),LM([PM(t)]),LM([])),UM=(e,t,o)=>e.fold(LM([NM(o)]),LM([]),LM([NM(t)])),jM=(e,t,o)=>e.fold(LM([]),LM([PM(o)]),LM([NM(t),PM(o)])),GM=(e,t,o)=>{const n=e.fold(((e,t)=>({position:B.some("absolute"),left:B.some(e+"px"),top:B.some(t+"px")})),((e,t)=>({position:B.some("absolute"),left:B.some(e-o.left+"px"),top:B.some(t-o.top+"px")})),((e,t)=>({position:B.some("fixed"),left:B.some(e+"px"),top:B.some(t+"px")})));return{right:B.none(),bottom:B.none(),...n}},$M=(e,t,o,n)=>{const s=(e,s)=>(r,a)=>{const i=e(t,o,n);return s(r.getOr(i.left),a.getOr(i.top))};return e.fold(s(jM,qM),s(UM,XM),s(WM,KM))},qM=HM.offset,XM=HM.absolute,KM=HM.fixed,YM=(e,t)=>{const o=ft(e,t);return u(o)?NaN:parseInt(o,10)},JM=(e,t,o,n,s,r)=>{const a=((e,t,o,n)=>((e,t)=>{const o=e.element,n=YM(o,t.leftAttr),s=YM(o,t.topAttr);return isNaN(n)||isNaN(s)?B.none():B.some(zt(n,s))})(e,t).fold((()=>o),(e=>KM(e.left+n.left,e.top+n.top))))(e,t,o,n),i=t.mustSnap?QM(e,t,a,s,r):eA(e,t,a,s,r),l=WM(a,s,r);return((e,t,o)=>{const n=e.element;pt(n,t.leftAttr,o.left+"px"),pt(n,t.topAttr,o.top+"px")})(e,t,l),i.fold((()=>({coord:KM(l.left,l.top),extra:B.none()})),(e=>({coord:e.output,extra:e.extra})))},ZM=(e,t,o,n)=>re(e,(e=>{const s=e.sensor,r=((e,t,o,n,s,r)=>{const a=UM(e,s,r),i=UM(t,s,r);return Math.abs(a.left-i.left)<=o&&Math.abs(a.top-i.top)<=n})(t,s,e.range.left,e.range.top,o,n);return r?B.some({output:$M(e.output,t,o,n),extra:e.extra}):B.none()})),QM=(e,t,o,n,s)=>{const r=t.getSnapPoints(e);return ZM(r,o,n,s).orThunk((()=>{const e=j(r,((e,t)=>{const r=t.sensor,a=((e,t,o,n,s,r)=>{const a=UM(e,s,r),i=UM(t,s,r),l=Math.abs(a.left-i.left),c=Math.abs(a.top-i.top);return zt(l,c)})(o,r,t.range.left,t.range.top,n,s);return e.deltas.fold((()=>({deltas:B.some(a),snap:B.some(t)})),(o=>(a.left+a.top)/2<=(o.left+o.top)/2?{deltas:B.some(a),snap:B.some(t)}:e))}),{deltas:B.none(),snap:B.none()});return e.snap.map((e=>({output:$M(e.output,o,n,s),extra:e.extra})))}))},eA=(e,t,o,n,s)=>{const r=t.getSnapPoints(e);return ZM(r,o,n,s)};var tA=Object.freeze({__proto__:null,snapTo:(e,t,o,n)=>{const s=t.getTarget(e.element);if(t.repositionTarget){const t=$e(e.element),o=Do(t),r=T_(s),a=((e,t,o)=>({coord:$M(e.output,e.output,t,o),extra:e.extra}))(n,o,r),i=GM(a.coord,0,r);Ct(s,i)}}});const oA="data-initial-z-index",nA=(e,t)=>{e.getSystem().addToGui(t),(e=>{Ye(e.element).filter(ze).each((t=>{Tt(t,"z-index").each((e=>{pt(t,oA,e)})),St(t,"z-index",Ot(e.element,"z-index"))}))})(t)},sA=e=>{(e=>{Ye(e.element).filter(ze).each((e=>{bt(e,oA).fold((()=>Mt(e,"z-index")),(t=>St(e,"z-index",t))),yt(e,oA)}))})(e),e.getSystem().removeFromGui(e)},rA=(e,t,o)=>e.getSystem().build(xx.sketch({dom:{styles:{left:"0px",top:"0px",width:"100%",height:"100%",position:"fixed","z-index":"1000000000000000"},classes:[t]},events:o}));var aA=rs("snaps",[Un("getSnapPoints"),fi("onSensor"),Un("leftAttr"),Un("topAttr"),as("lazyViewport",Uo),as("mustSnap",!1)]);const iA=[as("useFixed",_),Un("blockerClass"),as("getTarget",x),as("onDrag",b),as("repositionTarget",!0),as("onDrop",b),ms("getBounds",Uo),aA],lA=(e,t)=>({bounds:e.getBounds(),height:Vt(t.element),width:Ut(t.element)}),cA=(e,t,o,n,s)=>{const r=o.update(n,s),a=o.getStartData().getOrThunk((()=>lA(t,e)));r.each((o=>{((e,t,o,n)=>{const s=t.getTarget(e.element);if(t.repositionTarget){const r=$e(e.element),a=Do(r),i=T_(s),l=(e=>{return(t=Tt(e,"left"),o=Tt(e,"top"),n=Tt(e,"position"),s=(e,t,o)=>("fixed"===o?KM:qM)(parseInt(e,10),parseInt(t,10)),t.isSome()&&o.isSome()&&n.isSome()?B.some(s(t.getOrDie(),o.getOrDie(),n.getOrDie())):B.none()).getOrThunk((()=>{const t=Pt(e);return XM(t.left,t.top)}));var t,o,n,s})(s),c=((e,t,o,n,s,r,a)=>((e,t,o,n,s)=>{const r=s.bounds,a=UM(t,o,n),i=Ii(a.left,r.x,r.x+r.width-s.width),l=Ii(a.top,r.y,r.y+r.height-s.height),c=XM(i,l);return t.fold((()=>{const e=jM(c,o,n);return qM(e.left,e.top)}),y(c),(()=>{const e=WM(c,o,n);return KM(e.left,e.top)}))})(0,t.fold((()=>{const e=(t=o,a=r.left,i=r.top,t.fold(((e,t)=>qM(e+a,t+i)),((e,t)=>XM(e+a,t+i)),((e,t)=>KM(e+a,t+i))));var t,a,i;const l=WM(e,n,s);return KM(l.left,l.top)}),(t=>{const a=JM(e,t,o,r,n,s);return a.extra.each((o=>{t.onSensor(e,o)})),a.coord})),n,s,a))(e,t.snaps,l,a,i,n,o),d=GM(c,0,i);Ct(s,d)}t.onDrag(e,s,n)})(e,t,a,o)}))},dA=(e,t,o,n)=>{t.each(sA),o.snaps.each((t=>{((e,t)=>{((e,t)=>{const o=e.element;yt(o,t.leftAttr),yt(o,t.topAttr)})(e,t)})(e,t)}));const s=o.getTarget(e.element);n.reset(),o.onDrop(e,s)},uA=e=>(t,o)=>{const n=e=>{o.setStartData(lA(t,e))};return Or([Er(ir(),(e=>{o.getStartData().each((()=>n(e)))})),...e(t,o,n)])};var mA=Object.freeze({__proto__:null,getData:e=>B.from(zt(e.x,e.y)),getDelta:(e,t)=>zt(t.left-e.left,t.top-e.top)});const gA=(e,t,o)=>[Er(Ms(),((n,s)=>{if(0!==s.event.raw.button)return;s.stop();const r=()=>dA(n,B.some(l),e,t),a=ux(r,200),i={drop:r,delayDrop:a.schedule,forceDrop:r,move:o=>{a.cancel(),cA(n,e,t,mA,o)}},l=rA(n,e.blockerClass,(e=>Or([Er(Ms(),e.forceDrop),Er(Fs(),e.drop),Er(As(),((t,o)=>{e.move(o.event)})),Er(Ds(),e.delayDrop)]))(i));o(n),nA(n,l)}))],pA=[...iA,xi("dragger",{handlers:uA(gA)})];var hA=Object.freeze({__proto__:null,getData:e=>{const t=e.raw.touches;return 1===t.length?(e=>{const t=e[0];return B.some(zt(t.clientX,t.clientY))})(t):B.none()},getDelta:(e,t)=>zt(t.left-e.left,t.top-e.top)});const fA=(e,t,o)=>{const n=zl(),s=o=>{dA(o,n.get(),e,t),n.clear()};return[Er(_s(),((r,a)=>{a.stop();const i=()=>s(r),l={drop:i,delayDrop:b,forceDrop:i,move:o=>{cA(r,e,t,hA,o)}},c=rA(r,e.blockerClass,(e=>Or([Er(_s(),e.forceDrop),Er(Es(),e.drop),Er(Bs(),e.drop),Er(Ts(),((t,o)=>{e.move(o.event)}))]))(l));n.set(c),o(r),nA(r,c)})),Er(Ts(),((o,n)=>{n.stop(),cA(o,e,t,hA,n.event)})),Er(Es(),((e,t)=>{t.stop(),s(e)})),Er(Bs(),s)]},bA=pA,vA=[...iA,xi("dragger",{handlers:uA(fA)})],yA=[...iA,xi("dragger",{handlers:uA(((e,t,o)=>[...gA(e,t,o),...fA(e,t,o)]))})];var xA=Object.freeze({__proto__:null,mouse:bA,touch:vA,mouseOrTouch:yA}),wA=Object.freeze({__proto__:null,init:()=>{let e=B.none(),t=B.none();const o=y({});return ma({readState:o,reset:()=>{e=B.none(),t=B.none()},update:(t,o)=>t.getData(o).bind((o=>((t,o)=>{const n=e.map((e=>t.getDelta(e,o)));return e=B.some(o),n})(t,o))),getStartData:()=>t,setStartData:e=>{t=B.some(e)}})}});const SA=ml({branchKey:"mode",branches:xA,name:"dragging",active:{events:(e,t)=>e.dragger.handlers(e,t)},extra:{snap:e=>({sensor:e.sensor,range:e.range,output:e.output,extra:B.from(e.extra)})},state:wA,apis:tA}),kA=(e,t,o,n,s,r)=>e.fold((()=>SA.snap({sensor:XM(o-20,n-20),range:zt(s,r),output:XM(B.some(o),B.some(n)),extra:{td:t}})),(e=>{const s=o-20,r=n-20,a=e.element.dom.getBoundingClientRect();return SA.snap({sensor:XM(s,r),range:zt(40,40),output:XM(B.some(o-a.width/2),B.some(n-a.height/2)),extra:{td:t}})})),CA=(e,t,o)=>({getSnapPoints:e,leftAttr:"data-drag-left",topAttr:"data-drag-top",onSensor:(e,n)=>{const s=n.td;((e,t)=>e.exists((e=>je(e,t))))(t.get(),s)||(t.set(s),o(s))},mustSnap:!0}),OA=e=>Ch(kh.sketch({dom:{tag:"div",classes:["tox-selector"]},buttonBehaviours:ll([SA.config({mode:"mouseOrTouch",blockerClass:"blocker",snaps:e}),Ew.config({})]),eventOrder:{mousedown:["dragging","alloy.base.behaviour"],touchstart:["dragging","alloy.base.behaviour"]}})),_A=(e,t)=>{const o=hs([]),n=hs([]),s=hs(!1),r=zl(),a=zl(),i=e=>{const o=Wo(e);return kA(u.getOpt(t),e,o.x,o.y,o.width,o.height)},l=e=>{const o=Wo(e);return kA(m.getOpt(t),e,o.right,o.bottom,o.width,o.height)},c=CA((()=>P(o.get(),(e=>i(e)))),r,(t=>{a.get().each((o=>{e.dispatch("TableSelectorChange",{start:t,finish:o})}))})),d=CA((()=>P(n.get(),(e=>l(e)))),a,(t=>{r.get().each((o=>{e.dispatch("TableSelectorChange",{start:o,finish:t})}))})),u=OA(c),m=OA(d),g=ja(u.asSpec()),p=ja(m.asSpec()),h=(t,o,n,s)=>{const r=n(o);SA.snapTo(t,r),((t,o,n,r)=>{const a=o.dom.getBoundingClientRect();Mt(t.element,"display");const i=Ke(Fe(e.getBody())).dom.innerHeight,l=a[s]<0,c=((e,t)=>e[s]>t)(a,i);(l||c)&&St(t.element,"display","none")})(t,o)},f=e=>h(g,e,i,"top"),b=e=>h(p,e,l,"bottom");wo().deviceType.isTouch()&&(e.on("TableSelectionChange",(e=>{s.get()||(gd(t,g),gd(t,p),s.set(!0)),r.set(e.start),a.set(e.finish),e.otherCells.each((t=>{o.set(t.upOrLeftCells),n.set(t.downOrRightCells),f(e.start),b(e.finish)}))})),e.on("ResizeEditor ResizeWindow ScrollContent",(()=>{r.get().each(f),a.get().each(b)})),e.on("TableSelectionClear",(()=>{s.get()&&(fd(g),fd(p),s.set(!1)),r.clear(),a.clear()})))},TA=(e,t,o)=>{var n;const s=null!==(n=t.delimiter)&&void 0!==n?n:"\u203a";return{dom:{tag:"div",classes:["tox-statusbar__path"],attributes:{role:"navigation"}},behaviours:ll([kp.config({mode:"flow",selector:"div[role=button]"}),vm.config({disabled:o.isDisabled}),Iv(),Tx.config({}),Dp.config({}),Fp("elementPathEvents",[Rr(((t,n)=>{e.shortcuts.add("alt+F11","focus statusbar elementpath",(()=>kp.focusIn(t))),e.on("NodeChange",(n=>{const r=(t=>{const o=[];let n=t.length;for(;n-- >0;){const r=t[n];if(1===r.nodeType&&"BR"!==(s=r).nodeName&&!s.getAttribute("data-mce-bogus")&&"bookmark"!==s.getAttribute("data-mce-type")){const t=e.dispatch("ResolveName",{name:r.nodeName.toLowerCase(),target:r});if(t.isDefaultPrevented()||o.push({name:t.name,element:r}),t.isPropagationStopped())break}}var s;return o})(n.parents),a=r.length>0?j(r,((t,n,r)=>{const a=((t,n,s)=>kh.sketch({dom:{tag:"div",classes:["tox-statusbar__path-item"],attributes:{"data-index":s,"aria-level":s+1}},components:[Na(t)],action:t=>{e.focus(),e.selection.select(n),e.nodeChanged()},buttonBehaviours:ll([Vv(o.isDisabled),Iv()])}))(n.name,n.element,r);return 0===r?t.concat([a]):t.concat([{dom:{tag:"div",classes:["tox-statusbar__path-divider"],attributes:{"aria-hidden":!0}},components:[Na(` ${s} `)]},a])}),[]):[];Dp.set(t,a)}))}))])]),components:[]}};var EA;!function(e){e[e.None=0]="None",e[e.Both=1]="Both",e[e.Vertical=2]="Vertical"}(EA||(EA={}));const BA=(e,t,o)=>{const n=Fe(e.getContainer()),s=((e,t,o,n,s)=>{const r={};return r.height=VB(n+t.top,Kh(e),Jh(e)),o===EA.Both&&(r.width=VB(s+t.left,Xh(e),Yh(e))),r})(e,t,o,It(n),Wt(n));le(s,((e,t)=>St(n,t,IB(e)))),(e=>{e.dispatch("ResizeEditor")})(e)},MA=(e,t,o,n)=>{const s=zt(20*o,20*n);return BA(e,s,t),B.some(!0)},AA=(e,t)=>({dom:{tag:"div",classes:["tox-statusbar"]},components:(()=>{const o=(()=>{const o=[];return wf(e)&&o.push(TA(e,{},t)),e.hasPlugin("wordcount")&&o.push(((e,t)=>{const o=(e,o,n)=>Dp.set(e,[Na(t.translate(["{0} "+n,o[n]]))]);return kh.sketch({dom:{tag:"button",classes:["tox-statusbar__wordcount"]},components:[],buttonBehaviours:ll([Vv(t.isDisabled),Iv(),Tx.config({}),Dp.config({}),Jd.config({store:{mode:"memory",initialValue:{mode:"words",count:{words:0,characters:0}}}}),Fp("wordcount-events",[Pr((e=>{const t=Jd.getValue(e),n="words"===t.mode?"characters":"words";Jd.setValue(e,{mode:n,count:t.count}),o(e,t.count,n)})),Rr((t=>{e.on("wordCountUpdate",(e=>{const{mode:n}=Jd.getValue(t);Jd.setValue(t,{mode:n,count:e.wordCount}),o(t,e.wordCount,n)}))}))])]),eventOrder:{[Zs()]:["disabling","alloy.base.behaviour","wordcount-events"]}})})(e,t)),Sf(e)&&o.push({dom:{tag:"span",classes:["tox-statusbar__branding"]},components:[{dom:{tag:"a",attributes:{href:"https://www.tiny.cloud/powered-by-tiny?utm_campaign=editor_referral&utm_medium=poweredby&utm_source=tinymce&utm_content=v6",rel:"noopener",target:"_blank","aria-label":Oh.translate(["Powered by {0}","Tiny"])},innerHtml:'<svg width="50px" height="16px" viewBox="0 0 50 16" xmlns="http://www.w3.org/2000/svg">\n  <path fill-rule="evenodd" clip-rule="evenodd" d="M10.143 0c2.608.015 5.186 2.178 5.186 5.331 0 0 .077 3.812-.084 4.87-.361 2.41-2.164 4.074-4.65 4.496-1.453.284-2.523.49-3.212.623-.373.071-.634.122-.785.152-.184.038-.997.145-1.35.145-2.732 0-5.21-2.04-5.248-5.33 0 0 0-3.514.03-4.442.093-2.4 1.758-4.342 4.926-4.963 0 0 3.875-.752 4.036-.782.368-.07.775-.1 1.15-.1Zm1.826 2.8L5.83 3.989v2.393l-2.455.475v5.968l6.137-1.189V9.243l2.456-.476V2.8ZM5.83 6.382l3.682-.713v3.574l-3.682.713V6.382Zm27.173-1.64-.084-1.066h-2.226v9.132h2.456V7.743c-.008-1.151.998-2.064 2.149-2.072 1.15-.008 1.987.92 1.995 2.072v5.065h2.455V7.359c-.015-2.18-1.657-3.929-3.837-3.913a3.993 3.993 0 0 0-2.908 1.296Zm-6.3-4.266L29.16 0v2.387l-2.456.475V.476Zm0 3.2v9.132h2.456V3.676h-2.456Zm18.179 11.787L49.11 3.676H46.58l-1.612 4.527-.46 1.382-.384-1.382-1.611-4.527H39.98l3.3 9.132L42.15 16l2.732-.537ZM22.867 9.738c0 .752.568 1.075.921 1.075.353 0 .668-.047.998-.154l.537 1.765c-.23.154-.92.537-2.225.537-1.305 0-2.655-.997-2.686-2.686a136.877 136.877 0 0 1 0-4.374H18.8V3.676h1.612v-1.98l2.455-.476v2.456h2.302V5.9h-2.302v3.837Z"/>\n</svg>\n'.trim()},behaviours:ll([Hp.config({})])}]}),o.length>0?[{dom:{tag:"div",classes:["tox-statusbar__text-container"]},components:o}]:[]})(),n=((e,t)=>{const o=(e=>{const t=kf(e);return!1===t?EA.None:"both"===t?EA.Both:EA.Vertical})(e);return o===EA.None?B.none():B.some(Ih("resize-handle",{tag:"div",classes:["tox-statusbar__resize-handle"],attributes:{title:t.translate("Resize")},behaviours:[SA.config({mode:"mouse",repositionTarget:!1,onDrag:(t,n,s)=>BA(e,s,o),blockerClass:"tox-blocker"}),kp.config({mode:"special",onLeft:()=>MA(e,o,-1,0),onRight:()=>MA(e,o,1,0),onUp:()=>MA(e,o,0,-1),onDown:()=>MA(e,o,0,1)}),Tx.config({}),Hp.config({})]},t.icons))})(e,t);return o.concat(n.toArray())})()}),DA=e=>e.get().getOrDie("UI has not been rendered"),FA=e=>{const t=e.inline,o=t?NB:DB,n=zf(e)?Q_:O_,s=zl(),r=zl(),a=zl(),i=zl(),l=wo().deviceType.isTouch()?["tox-platform-touch"]:[],c=Df(e),d=nf(e),u=Ch({dom:{tag:"div",classes:["tox-anchorbar"]}}),m=()=>r.get().bind(TE.getHeader),g=()=>$o.fromOption(s.get(),"UI has not been rendered"),p=()=>r.get().bind((e=>TE.getToolbar(e))).getOrDie("Could not find more toolbar element"),h=()=>r.get().bind((e=>TE.getThrobber(e))).getOrDie("Could not find throbber element"),f=((e,t,o)=>{const n=hs(!1),s=(e=>{const t=hs(Df(e)?"bottom":"top");return{isPositionedAtTop:()=>"top"===t.get(),getDockingMode:t.get,setDockingMode:t.set}})(t),r={shared:{providers:{icons:()=>t.ui.registry.getAll().icons,menuItems:()=>t.ui.registry.getAll().menuItems,translate:Oh.translate,isDisabled:()=>t.mode.isReadOnly()||!t.ui.isEnabled(),getOption:t.options.get},interpreter:e=>((e,t,o)=>oO(eO,e,{},o))(e,0,r),anchors:TO(t,o,s.isPositionedAtTop),header:s,getSink:e},urlinput:u_(t),styles:NO(t),colorinput:DO(t),dialog:IO(t),isContextMenuOpen:()=>n.get(),setContextMenuState:e=>n.set(e)};return r})(g,e,(()=>r.get().bind((e=>u.getOpt(e))).getOrDie("Could not find a anchor bar element"))),b=t=>{const o=IB((e=>{const t=(e=>{const t=$h(e),o=Kh(e),n=Jh(e);return FB(t).map((e=>VB(e,o,n)))})(e);return t.getOr($h(e))})(e)),n=IB((e=>RB(e).getOr(qh(e)))(e));return e.inline||(Bt("div","width",n)&&St(t.element,"width",n),Bt("div","height",o)?St(t.element,"height",o):St(t.element,"height","400px")),o};return{getMothership:()=>DA(a),getUiMothership:()=>DA(i),backstage:f,renderUI:()=>{const{mothership:v,outerContainer:y}=(()=>{const o=(()=>{const t={attributes:{[nc]:c?oc.BottomToTop:oc.TopToBottom}},o=TE.parts.menubar({dom:{tag:"div",classes:["tox-menubar"]},backstage:f,onEscape:()=>{e.focus()}}),n=TE.parts.toolbar({dom:{tag:"div",classes:["tox-toolbar"]},getSink:g,providers:f.shared.providers,onEscape:()=>{e.focus()},type:d,lazyToolbar:p,lazyHeader:()=>m().getOrDie("Could not find header element"),...t}),s=TE.parts["multiple-toolbar"]({dom:{tag:"div",classes:["tox-toolbar-overlord"]},providers:f.shared.providers,onEscape:()=>{e.focus()},type:d}),r=Af(e),a=Bf(e),i=_f(e);return TE.parts.header({dom:{tag:"div",classes:["tox-editor-header"],...t},components:q([i?[o]:[],r?[s]:a?[n]:[],If(e)?[]:[u.asSpec()]]),sticky:zf(e),editor:e,sharedBackstage:f.shared})})(),n={dom:{tag:"div",classes:["tox-sidebar-wrap"]},components:[TE.parts.socket({dom:{tag:"div",classes:["tox-edit-area"]}}),TE.parts.sidebar({dom:{tag:"div",classes:["tox-sidebar"]}})]},s=TE.parts.throbber({dom:{tag:"div",classes:["tox-throbber"]},backstage:f}),i=xf(e)&&!t?B.some(AA(e,f.shared.providers)):B.none(),h=q([c?[]:[o],t?[]:[n],c?[o]:[]]),b=q([[{dom:{tag:"div",classes:["tox-editor-container"]},components:h}],t?[]:i.toArray(),[s]]),v=Rf(e),y={role:"application",...Oh.isRtl()?{dir:"rtl"}:{},...v?{"aria-hidden":"true"}:{}},x=ja(TE.sketch({dom:{tag:"div",classes:["tox","tox-tinymce"].concat(t?["tox-tinymce-inline"]:[]).concat(c?["tox-tinymce--toolbar-bottom"]:[]).concat(l),styles:{visibility:"hidden",...v?{opacity:"0",border:"0"}:{}},attributes:y},components:b,behaviours:ll([Iv(),vm.config({disableClass:"tox-tinymce--disabled"}),kp.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"})])})),w=wx(x);return r.set(x),a.set(w),{mothership:w,outerContainer:x}})(),{uiMothership:x,sink:w}=(()=>{const t=Vf(e),o=je(ut(),t)&&"grid"===Ot(t,"display"),r={dom:{tag:"div",classes:["tox","tox-silver-sink","tox-tinymce-aux"].concat(l),attributes:{...Oh.isRtl()?{dir:"rtl"}:{}}},behaviours:ll([ad.config({useFixed:()=>n.isDocked(m)})])},a={dom:{styles:{width:document.body.clientWidth+"px"}},events:Or([Er(lr(),(e=>{St(e.element,"width",document.body.clientWidth+"px")}))])},c=ja(nn(r,o?a:{})),d=wx(c);return s.set(c),i.set(d),{sink:c,uiMothership:d}})();ce(sf(e),((t,o)=>{e.ui.registry.addGroupToolbarButton(o,t)}));const{buttons:S,menuItems:k,contextToolbars:C,sidebars:O}=e.ui.registry.getAll(),_=Mf(e),T={menuItems:k,menus:Hf(e),menubar:uf(e),toolbar:_.getOrThunk((()=>mf(e))),allowToolbarGroups:d===zh.floating,buttons:S,sidebar:O};(t=>{e.addShortcut("alt+F9","focus menubar",(()=>{TE.focusMenubar(t)})),e.addShortcut("alt+F10","focus toolbar",(()=>{TE.focusToolbar(t)})),e.addCommand("ToggleToolbarDrawer",(()=>{TE.toggleToolbarDrawer(t)})),e.addQueryStateHandler("ToggleToolbarDrawer",(()=>TE.isToolbarDrawerToggled(t)))})(y),((e,t,o)=>{const n=(e,n)=>{N([t,o],(t=>{t.broadcastEvent(e,n)}))},s=(e,n)=>{N([t,o],(t=>{t.broadcastOn([e],n)}))},r=e=>s(Dd(),{target:e.target}),a=Ro(),i=Pl(a,"touchstart",r),l=Pl(a,"touchmove",(e=>n(rr(),e))),c=Pl(a,"touchend",(e=>n(ar(),e))),d=Pl(a,"mousedown",r),u=Pl(a,"mouseup",(e=>{0===e.raw.button&&s(Id(),{target:e.target})})),m=e=>s(Dd(),{target:Fe(e.target)}),g=e=>{0===e.button&&s(Id(),{target:Fe(e.target)})},p=()=>{N(e.editorManager.get(),(t=>{e!==t&&t.dispatch("DismissPopups",{relatedTarget:e})}))},h=e=>n(ir(),Ll(e)),f=e=>{s(Fd(),{}),n(lr(),Ll(e))},b=()=>s(Fd(),{}),v=t=>{t.state&&s(Dd(),{target:Fe(e.getContainer())})},y=e=>{s(Dd(),{target:Fe(e.relatedTarget.getContainer())})};e.on("PostRender",(()=>{e.on("click",m),e.on("tap",m),e.on("mouseup",g),e.on("mousedown",p),e.on("ScrollWindow",h),e.on("ResizeWindow",f),e.on("ResizeEditor",b),e.on("AfterProgressState",v),e.on("DismissPopups",y)})),e.on("remove",(()=>{e.off("click",m),e.off("tap",m),e.off("mouseup",g),e.off("mousedown",p),e.off("ScrollWindow",h),e.off("ResizeWindow",f),e.off("ResizeEditor",b),e.off("AfterProgressState",v),e.off("DismissPopups",y),d.unbind(),i.unbind(),l.unbind(),c.unbind(),u.unbind()})),e.on("detach",(()=>{xd(t),xd(o),t.destroy(),o.destroy()}))})(e,v,x),n.setup(e,f.shared,m),fM(e,f),zM(e,g,f),(e=>{const{sidebars:t}=e.ui.registry.getAll();N(ae(t),(o=>{const n=t[o],s=()=>ye(B.from(e.queryCommandValue("ToggleSidebar")),o);e.ui.registry.addToggleButton(o,{icon:n.icon,tooltip:n.tooltip,onAction:t=>{e.execCommand("ToggleSidebar",!1,o),t.setActive(s())},onSetup:t=>{const o=()=>t.setActive(s());return e.on("ToggleSidebar",o),()=>{e.off("ToggleSidebar",o)}}})}))})(e),NT(e,h,f.shared),rM(e,C,w,{backstage:f}),_A(e,w);const E={mothership:v,uiMothership:x,outerContainer:y,sink:w},M={targetNode:e.getElement(),height:b(y)};return o.render(e,E,T,f,M)}}},IA=y([Un("lazySink"),Zn("dragBlockClass"),ms("getBounds",Uo),as("useTabstopAt",T),as("eventOrder",{}),Zd("modalBehaviours",[kp]),bi("onExecute"),yi("onEscape")]),VA={sketch:x},RA=y([Tu({name:"draghandle",overrides:(e,t)=>({behaviours:ll([SA.config({mode:"mouse",getTarget:e=>Ja(e,'[role="dialog"]').getOr(e),blockerClass:e.dragBlockClass.getOrDie(new Error("The drag blocker class was not specified for a dialog with a drag handle: \n"+JSON.stringify(t,null,2)).message),getBounds:e.getDragBounds})])})}),Ou({schema:[Un("dom")],name:"title"}),Ou({factory:VA,schema:[Un("dom")],name:"close"}),Ou({factory:VA,schema:[Un("dom")],name:"body"}),Tu({factory:VA,schema:[Un("dom")],name:"footer"}),_u({factory:{sketch:(e,t)=>({...e,dom:t.dom,components:t.components})},schema:[as("dom",{tag:"div",styles:{position:"fixed",left:"0px",top:"0px",right:"0px",bottom:"0px"}}),as("components",[])],name:"blocker"})]),zA=em({name:"ModalDialog",configFields:IA(),partFields:RA(),factory:(e,t,o,n)=>{const s=zl(),r=Xr("modal-events"),a={...e.eventOrder,[cr()]:[r].concat(e.eventOrder["alloy.system.attached"]||[])};return{uid:e.uid,dom:e.dom,components:t,apis:{show:t=>{s.set(t);const o=e.lazySink(t).getOrDie(),r=n.blocker(),a=o.getSystem().build({...r,components:r.components.concat([Ga(t)]),behaviours:ll([Hp.config({}),Fp("dialog-blocker-events",[Vr(Vs(),(()=>{kp.focusIn(t)}))])])});gd(o,a),kp.focusIn(t)},hide:e=>{s.clear(),Ye(e.element).each((t=>{e.getSystem().getByDom(t).each((e=>{fd(e)}))}))},getBody:t=>Nu(t,e,"body"),getFooter:t=>Nu(t,e,"footer"),setIdle:e=>{zT.unblock(e)},setBusy:(e,t)=>{zT.block(e,t)}},eventOrder:a,domModification:{attributes:{role:"dialog","aria-modal":"true"}},behaviours:eu(e.modalBehaviours,[Dp.config({}),kp.config({mode:"cyclic",onEnter:e.onExecute,onEscape:e.onEscape,useTabstopAt:e.useTabstopAt}),zT.config({getRoot:s.get}),Fp(r,[Rr((t=>{((e,t)=>{const o=bt(e,"id").fold((()=>{const e=Xr("dialog-label");return pt(t,"id",e),e}),x);pt(e,"aria-labelledby",o)})(t.element,Nu(t,e,"title").element),((e,t)=>{const o=B.from(ft(e,"id")).fold((()=>{const e=Xr("dialog-describe");return pt(t,"id",e),e}),x);pt(e,"aria-describedby",o)})(t.element,Nu(t,e,"body").element)}))])])}},apis:{show:(e,t)=>{e.show(t)},hide:(e,t)=>{e.hide(t)},getBody:(e,t)=>e.getBody(t),getFooter:(e,t)=>e.getFooter(t),setBusy:(e,t,o)=>{e.setBusy(t,o)},setIdle:(e,t)=>{e.setIdle(t)}}}),HA=yn([pb,hb].concat(dv)),PA=En,NA=[Lb("button"),Eb,ds("align","end",["start","end"]),Rb,Vb,os("buttonType",["primary","secondary"])],LA=[...NA,bb],WA=[qn("type",["submit","cancel","custom"]),...LA],UA=[qn("type",["menu"]),Tb,Bb,Eb,Jn("items",HA),...NA],jA=Pn("type",{submit:WA,cancel:WA,custom:WA,menu:UA}),GA=[pb,bb,qn("level",["info","warn","error","success"]),yb,as("url","")],$A=yn(GA),qA=[pb,bb,Vb,Lb("button"),Eb,Ib,os("buttonType",["primary","secondary","toolbar"]),Rb],XA=yn(qA),KA=[pb,hb],YA=KA.concat([Mb]),JA=KA.concat([fb,Vb]),ZA=yn(JA),QA=En,eD=YA.concat([zb("auto")]),tD=yn(eD),oD=kn([xb,bb,yb]),nD=yn(YA),sD=Tn,rD=yn(YA),aD=Tn,iD=KA.concat([cs("tag","textarea"),$n("scriptId"),$n("scriptUrl"),is("settings",void 0,An)]),lD=KA.concat([cs("tag","textarea"),Xn("init")]),cD=Fn((e=>Vn("customeditor.old",vn(lD),e).orThunk((()=>Vn("customeditor.new",vn(iD),e))))),dD=Tn,uD=yn(YA),mD=xn(gn),gD=e=>[pb,Gn("columns"),e],pD=[pb,$n("html"),ds("presets","presentation",["presentation","document"])],hD=yn(pD),fD=YA.concat([us("sandboxed",!0)]),bD=yn(fD),vD=Tn,yD=yn(KA.concat([ts("height")])),xD=yn([$n("url"),es("zoom"),es("cachedWidth"),es("cachedHeight")]),wD=YA.concat([ts("inputMode"),ts("placeholder"),us("maximized",!1),Vb]),SD=yn(wD),kD=Tn,CD=e=>[pb,fb,e],OD=[bb,xb],_D=[bb,Jn("items",((e,t)=>{const o=jt(t);return{extract:(e,t)=>o().extract(e,t),toString:()=>o().toString()}})(0,(()=>TD)))],TD=wn([yn(OD),yn(_D)]),ED=YA.concat([Jn("items",TD),Vb]),BD=yn(ED),MD=Tn,AD=YA.concat([Yn("items",[bb,xb]),ls("size",1),Vb]),DD=yn(AD),FD=Tn,ID=YA.concat([us("constrain",!0),Vb]),VD=yn(ID),RD=yn([$n("width"),$n("height")]),zD=KA.concat([fb,ls("min",0),ls("max",0)]),HD=yn(zD),PD=_n,ND=[pb,Jn("header",Tn),Jn("cells",xn(Tn))],LD=yn(ND),WD=YA.concat([ts("placeholder"),us("maximized",!1),Vb]),UD=yn(WD),jD=Tn,GD=YA.concat([ds("filetype","file",["image","media","file"]),Vb]),$D=yn(GD),qD=yn([xb,Hb]),XD=e=>Nn("items","items",{tag:"required",process:{}},xn(Fn((t=>Vn(`Checking item of ${e}`,KD,t).fold((e=>$o.error(Hn(e))),(e=>$o.value(e))))))),KD=fn((()=>{return Dn("type",{alertbanner:$A,bar:yn((e=XD("bar"),[pb,e])),button:XA,checkbox:ZA,colorinput:nD,colorpicker:rD,dropzone:uD,grid:yn(gD(XD("grid"))),iframe:bD,input:SD,listbox:BD,selectbox:DD,sizeinput:VD,slider:HD,textarea:UD,urlinput:$D,customeditor:cD,htmlpanel:hD,imagepreview:yD,collection:tD,label:yn(CD(XD("label"))),table:LD,panel:JD});var e})),YD=[pb,as("classes",[]),Jn("items",KD)],JD=yn(YD),ZD=[Lb("tab"),vb,Jn("items",KD)],QD=[pb,Yn("tabs",ZD)],eF=yn(QD),tF=LA,oF=jA,nF=yn([$n("title"),jn("body",Dn("type",{panel:JD,tabpanel:eF})),cs("size","normal"),Jn("buttons",oF),as("initialData",{}),ms("onAction",b),ms("onChange",b),ms("onSubmit",b),ms("onClose",b),ms("onCancel",b),ms("onTabChange",b)]),sF=yn([qn("type",["cancel","custom"]),...tF]),rF=yn([$n("title"),$n("url"),es("height"),es("width"),ss("buttons",sF),ms("onAction",b),ms("onCancel",b),ms("onClose",b),ms("onMessage",b)]),aF=e=>a(e)?[e].concat(X(he(e),aF)):l(e)?X(e,aF):[],iF=e=>r(e.type)&&r(e.name),lF={checkbox:QA,colorinput:sD,colorpicker:aD,dropzone:mD,input:kD,iframe:vD,imagepreview:xD,selectbox:FD,sizeinput:RD,slider:PD,listbox:MD,size:RD,textarea:jD,urlinput:qD,customeditor:dD,collection:oD,togglemenuitem:PA},cF=e=>{const t=(e=>W(aF(e),iF))(e),o=X(t,(e=>(e=>B.from(lF[e.type]))(e).fold((()=>[]),(t=>[jn(e.name,t)]))));return yn(o)},dF=e=>({internalDialog:Rn(Vn("dialog",nF,e)),dataValidator:cF(e),initialData:e.initialData}),uF={open:(e,t)=>{const o=dF(t);return e(o.internalDialog,o.initialData,o.dataValidator)},openUrl:(e,t)=>e(Rn(Vn("dialog",rF,t))),redial:e=>dF(e)},mF=e=>{const t=[],o={};return le(e,((e,n)=>{e.fold((()=>{t.push(n)}),(e=>{o[n]=e}))})),t.length>0?$o.error(t):$o.value(o)},gF=(e,t,o)=>{const n=Ch(vk.sketch((n=>({dom:{tag:"div",classes:["tox-form"].concat(e.classes)},components:P(e.items,(e=>tO(n,e,t,o)))}))));return{dom:{tag:"div",classes:["tox-dialog__body"]},components:[{dom:{tag:"div",classes:["tox-dialog__body-content"]},components:[n.asSpec()]}],behaviours:ll([kp.config({mode:"acyclic",useTabstopAt:k(Uk)}),(s=n,sm.config({find:s.getOpt})),Mk(n,{postprocess:e=>mF(e).fold((e=>(console.error(e),{})),x)})])};var s},pF=Qu({name:"TabButton",configFields:[as("uid",void 0),Un("value"),Nn("dom","dom",ln((()=>({attributes:{role:"tab",id:Xr("aria"),"aria-selected":"false"}}))),Cn()),Zn("action"),as("domModification",{}),Zd("tabButtonBehaviours",[Hp,kp,Jd]),Un("view")],factory:(e,t)=>({uid:e.uid,dom:e.dom,components:e.components,events:Zp(e.action),behaviours:eu(e.tabButtonBehaviours,[Hp.config({}),kp.config({mode:"execution",useSpace:!0,useEnter:!0}),Jd.config({store:{mode:"memory",initialValue:e.value}})]),domModification:e.domModification})}),hF=y([Un("tabs"),Un("dom"),as("clickToDismiss",!1),Zd("tabbarBehaviours",[Em,kp]),pi(["tabClass","selectedClass"])]),fF=Eu({factory:pF,name:"tabs",unit:"tab",overrides:e=>{const t=(e,t)=>{Em.dehighlight(e,t),xr(e,fr(),{tabbar:e,button:t})},o=(e,t)=>{Em.highlight(e,t),xr(e,hr(),{tabbar:e,button:t})};return{action:n=>{const s=n.getSystem().getByUid(e.uid).getOrDie(),r=Em.isHighlighted(s,n);(r&&e.clickToDismiss?t:r?b:o)(s,n)},domModification:{classes:[e.markers.tabClass]}}}}),bF=y([fF]),vF=em({name:"Tabbar",configFields:hF(),partFields:bF(),factory:(e,t,o,n)=>({uid:e.uid,dom:e.dom,components:t,"debug.sketcher":"Tabbar",domModification:{attributes:{role:"tablist"}},behaviours:eu(e.tabbarBehaviours,[Em.config({highlightClass:e.markers.selectedClass,itemClass:e.markers.tabClass,onHighlight:(e,t)=>{pt(t.element,"aria-selected","true")},onDehighlight:(e,t)=>{pt(t.element,"aria-selected","false")}}),kp.config({mode:"flow",getInitial:e=>Em.getHighlighted(e).map((e=>e.element)),selector:"."+e.markers.tabClass,executeOnMove:!0})])})}),yF=Qu({name:"Tabview",configFields:[Zd("tabviewBehaviours",[Dp])],factory:(e,t)=>({uid:e.uid,dom:e.dom,behaviours:eu(e.tabviewBehaviours,[Dp.config({})]),domModification:{attributes:{role:"tabpanel"}}})}),xF=y([as("selectFirst",!0),fi("onChangeTab"),fi("onDismissTab"),as("tabs",[]),Zd("tabSectionBehaviours",[])]),wF=Ou({factory:vF,schema:[Un("dom"),Kn("markers",[Un("tabClass"),Un("selectedClass")])],name:"tabbar",defaults:e=>({tabs:e.tabs})}),SF=Ou({factory:yF,name:"tabview"}),kF=y([wF,SF]),CF=em({name:"TabSection",configFields:xF(),partFields:kF(),factory:(e,t,o,n)=>{const s=(t,o)=>{Pu(t,e,"tabbar").each((e=>{o(e).each(wr)}))};return{uid:e.uid,dom:e.dom,components:t,behaviours:Qd(e.tabSectionBehaviours),events:Or(q([e.selectFirst?[Rr(((e,t)=>{s(e,Em.getFirst)}))]:[],[Er(hr(),((t,o)=>{(t=>{const o=Jd.getValue(t);Pu(t,e,"tabview").each((n=>{G(e.tabs,(e=>e.value===o)).each((o=>{const s=o.view();bt(t.element,"id").each((e=>{pt(n.element,"aria-labelledby",e)})),Dp.set(n,s),e.onChangeTab(n,t,s)}))}))})(o.event.button)})),Er(fr(),((t,o)=>{const n=o.event.button;e.onDismissTab(t,n)}))]])),apis:{getViewItems:t=>Pu(t,e,"tabview").map((e=>Dp.contents(e))).getOr([]),showTab:(e,t)=>{s(e,(e=>{const o=Em.getCandidates(e);return G(o,(e=>Jd.getValue(e)===t)).filter((t=>!Em.isHighlighted(e,t)))}))}}}},apis:{getViewItems:(e,t)=>e.getViewItems(t),showTab:(e,t,o)=>{e.showTab(t,o)}}}),OF=(e,t)=>{St(e,"height",t+"px"),St(e,"flex-basis",t+"px")},_F=(e,t,o)=>{Ja(e,'[role="dialog"]').each((e=>{Qa(e,'[role="tablist"]').each((n=>{o.get().map((o=>(St(t,"height","0"),St(t,"flex-basis","0"),Math.min(o,((e,t,o)=>{const n=Xe(e).dom,s=Ja(e,".tox-dialog-wrap").getOr(e);let r;r="fixed"===Ot(s,"position")?Math.max(n.clientHeight,window.innerHeight):Math.max(n.offsetHeight,n.scrollHeight);const a=It(t),i=t.dom.offsetLeft>=o.dom.offsetLeft+Wt(o)?Math.max(It(o),a):a,l=parseInt(Ot(e,"margin-top"),10)||0,c=parseInt(Ot(e,"margin-bottom"),10)||0;return r-(It(e)+l+c-i)})(e,t,n))))).each((e=>{OF(t,e)}))}))}))},TF=e=>Qa(e,'[role="tabpanel"]'),EF="send-data-to-section",BF="send-data-to-view",MF=(e,t,o)=>{const n=hs({}),s=e=>{const t=Jd.getValue(e),o=mF(t).getOr({}),s=n.get(),r=nn(s,o);n.set(r)},r=e=>{const t=n.get();Jd.setValue(e,t)},a=hs(null),i=P(e.tabs,(e=>({value:e.name,dom:{tag:"div",classes:["tox-dialog__body-nav-item"]},components:[Na(o.shared.providers.translate(e.title))],view:()=>[vk.sketch((n=>({dom:{tag:"div",classes:["tox-form"]},components:P(e.items,(e=>tO(n,e,t,o))),formBehaviours:ll([kp.config({mode:"acyclic",useTabstopAt:k(Uk)}),Fp("TabView.form.events",[Rr(r),zr(s)]),pl.config({channels:vs([{key:EF,value:{onReceive:s}},{key:BF,value:{onReceive:r}}])})])})))]}))),l=(e=>{const t=(()=>{const t=zl(),o=[Rr((o=>{const n=o.element;TF(n).each((s=>{St(s,"visibility","hidden"),o.getSystem().getByDom(s).toOptional().each((o=>{const n=((e,t,o)=>P(e,((n,s)=>{Dp.set(o,e[s].view());const r=t.dom.getBoundingClientRect();return Dp.set(o,[]),r.height})))(e,s,o),r=(e=>oe(ee(e,((e,t)=>e>t?-1:e<t?1:0))))(n);r.fold(t.clear,t.set)})),_F(n,s,t),Mt(s,"visibility"),((e,t)=>{oe(e).each((e=>CF.showTab(t,e.value)))})(e,o),requestAnimationFrame((()=>{_F(n,s,t)}))}))})),Er(lr(),(e=>{const o=e.element;TF(o).each((e=>{_F(o,e,t)}))})),Er(Lx,((e,o)=>{const n=e.element;TF(n).each((e=>{const o=vl(at(e));St(e,"visibility","hidden");const s=Tt(e,"height").map((e=>parseInt(e,10)));Mt(e,"height"),Mt(e,"flex-basis");const r=e.dom.getBoundingClientRect().height;s.forall((e=>r>e))?(t.set(r),_F(n,e,t)):s.each((t=>{OF(e,t)})),Mt(e,"visibility"),o.each(fl)}))}))];return{extraEvents:o,selectFirst:!1}})();return{smartTabHeight:t,naiveTabHeight:{extraEvents:[],selectFirst:!0}}})(i).smartTabHeight;return CF.sketch({dom:{tag:"div",classes:["tox-dialog__body"]},onChangeTab:(e,t,o)=>{const n=Jd.getValue(t);xr(e,Nx,{name:n,oldName:a.get()}),a.set(n)},tabs:i,components:[CF.parts.tabbar({dom:{tag:"div",classes:["tox-dialog__body-nav"]},components:[vF.parts.tabs({})],markers:{tabClass:"tox-tab",selectedClass:"tox-dialog__body-nav-item--active"},tabbarBehaviours:ll([Tx.config({})])}),CF.parts.tabview({dom:{tag:"div",classes:["tox-dialog__body-content"]}})],selectFirst:l.selectFirst,tabSectionBehaviours:ll([Fp("tabpanel",l.extraEvents),kp.config({mode:"acyclic"}),sm.config({find:e=>oe(CF.getViewItems(e))}),Dk(B.none(),(e=>(e.getSystem().broadcastOn([EF],{}),n.get())),((e,t)=>{n.set(t),e.getSystem().broadcastOn([BF],{})}))])})},AF=Xr("update-dialog"),DF=Xr("update-title"),FF=Xr("update-body"),IF=Xr("update-footer"),VF=Xr("body-send-message"),RF=(e,t,o,n,s)=>({dom:{tag:"div",classes:["tox-dialog__content-js"],attributes:{...o.map((e=>({id:e}))).getOr({}),...s?{"aria-live":"polite"}:{}}},components:[],behaviours:ll([_k(0),cB.config({channel:`${FF}-${t}`,updateState:(e,t)=>B.some({isTabPanel:()=>"tabpanel"===t.body.type}),renderComponents:e=>{const t=e.body;return"tabpanel"===t.type?[MF(t,e.initialData,n)]:[gF(t,e.initialData,n)]},initialData:e})])}),zF=Lh.deviceType.isTouch(),HF=(e,t)=>({dom:{tag:"div",styles:{display:"none"},classes:["tox-dialog__header"]},components:[e,t]}),PF=(e,t)=>zA.parts.close(kh.sketch({dom:{tag:"button",classes:["tox-button","tox-button--icon","tox-button--naked"],attributes:{type:"button","aria-label":t.translate("Close")}},action:e,buttonBehaviours:ll([Tx.config({})])})),NF=()=>zA.parts.title({dom:{tag:"div",classes:["tox-dialog__title"],innerHtml:"",styles:{display:"none"}}}),LF=(e,t)=>zA.parts.body({dom:{tag:"div",classes:["tox-dialog__body"]},components:[{dom:{tag:"div",classes:["tox-dialog__body-content"]},components:[{dom:HT(`<p>${t.translate(e)}</p>`)}]}]}),WF=e=>zA.parts.footer({dom:{tag:"div",classes:["tox-dialog__footer"]},components:e}),UF=(e,t)=>[xx.sketch({dom:{tag:"div",classes:["tox-dialog__footer-start"]},components:e}),xx.sketch({dom:{tag:"div",classes:["tox-dialog__footer-end"]},components:t})],jF=e=>{const t="tox-dialog",o=t+"-wrap",n=o+"__backdrop",s=t+"__disable-scroll";return zA.sketch({lazySink:e.lazySink,onEscape:t=>(e.onEscape(t),B.some(!0)),useTabstopAt:e=>!Uk(e),dom:{tag:"div",classes:[t].concat(e.extraClasses),styles:{position:"relative",...e.extraStyles}},components:[e.header,e.body,...e.footer.toArray()],parts:{blocker:{dom:HT(`<div class="${o}"></div>`),components:[{dom:{tag:"div",classes:zF?[n,n+"--opaque"]:[n]}}]}},dragBlockClass:o,modalBehaviours:ll([Hp.config({}),Fp("dialog-events",e.dialogEvents.concat([Vr(Vs(),((e,t)=>{kp.focusIn(e)}))])),Fp("scroll-lock",[Rr((()=>{_a(ut(),s)})),zr((()=>{Ta(ut(),s)}))]),...e.extraBehaviours]),eventOrder:{[Zs()]:["dialog-events"],[cr()]:["scroll-lock","dialog-events","alloy.base.behaviour"],[dr()]:["alloy.base.behaviour","dialog-events","scroll-lock"],...e.eventOrder}})},GF=e=>kh.sketch({dom:{tag:"button",classes:["tox-button","tox-button--icon","tox-button--naked"],attributes:{type:"button","aria-label":e.translate("Close"),title:e.translate("Close")}},components:[Ih("close",{tag:"div",classes:["tox-icon"]},e.icons)],action:e=>{yr(e,Vx)}}),$F=(e,t,o,n)=>({dom:{tag:"div",classes:["tox-dialog__title"],attributes:{...o.map((e=>({id:e}))).getOr({})}},components:[],behaviours:ll([cB.config({channel:`${DF}-${t}`,initialData:e,renderComponents:e=>[Na(n.translate(e.title))]})])}),qF=()=>({dom:HT('<div class="tox-dialog__draghandle"></div>')}),XF=(e,t,o)=>((e,t,o)=>{const n=zA.parts.title($F(e,t,B.none(),o)),s=zA.parts.draghandle(qF()),r=zA.parts.close(GF(o)),a=[n].concat(e.draggable?[s]:[]).concat([r]);return xx.sketch({dom:HT('<div class="tox-dialog__header"></div>'),components:a})})({title:o.shared.providers.translate(e),draggable:o.dialog.isDraggableModal()},t,o.shared.providers),KF=(e,t,o)=>({dom:{tag:"div",classes:["tox-dialog__busy-spinner"],attributes:{"aria-label":o.translate(e)},styles:{left:"0px",right:"0px",bottom:"0px",top:"0px",position:"absolute"}},behaviours:t,components:[{dom:HT('<div class="tox-spinner"><div></div><div></div><div></div></div>')}]}),YF=(e,t,o)=>({onClose:()=>o.closeWindow(),onBlock:o=>{zA.setBusy(e(),((e,n)=>KF(o.message,n,t)))},onUnblock:()=>{zA.setIdle(e())}}),JF=(e,t,o,n)=>ja(jF({...e,lazySink:n.shared.getSink,extraBehaviours:[cB.config({channel:`${AF}-${e.id}`,updateState:(e,t)=>B.some(t),initialData:t}),Fk({}),...e.extraBehaviours],onEscape:e=>{yr(e,Vx)},dialogEvents:o,eventOrder:{[Js()]:[cB.name(),pl.name()],[cr()]:["scroll-lock",cB.name(),"messages","dialog-events","alloy.base.behaviour"],[dr()]:["alloy.base.behaviour","dialog-events","messages",cB.name(),"scroll-lock"]}})),ZF=e=>P(e,(e=>"menu"===e.type?(e=>{const t=P(e.items,(e=>({...e,storage:hs(!1)})));return{...e,items:t}})(e):e)),QF=e=>j(e,((e,t)=>"menu"===t.type?j(t.items,((e,t)=>(e[t.name]=t.storage,e)),e):e),{}),eI=(e,t)=>[Dr(Vs(),Wk),e(Ix,((e,o)=>{t.onClose(),o.onClose()})),e(Vx,((e,t,o,n)=>{t.onCancel(e),yr(n,Ix)})),Er(Px,((e,o)=>t.onUnblock())),Er(Hx,((e,o)=>t.onBlock(o.event)))],tI=(e,t,o)=>{const n=(t,o)=>Er(t,((t,n)=>{s(t,((s,r)=>{o(e(),s,n.event,t)}))})),s=(e,t)=>{cB.getState(e).get().each((o=>{t(o.internalDialog,e)}))};return[...eI(n,t),n(zx,((e,t)=>t.onSubmit(e))),n(Fx,((e,t,o)=>{t.onChange(e,{name:o.name})})),n(Rx,((e,t,n,s)=>{const r=()=>kp.focusIn(s),a=e=>vt(e,"disabled")||bt(e,"aria-disabled").exists((e=>"true"===e)),i=at(s.element),l=vl(i);t.onAction(e,{name:n.name,value:n.value}),vl(i).fold(r,(e=>{a(e)||l.exists((t=>Ge(e,t)&&a(t)))?r():o().toOptional().filter((t=>!Ge(t.element,e))).each(r)}))})),n(Nx,((e,t,o)=>{t.onTabChange(e,{newTabName:o.name,oldTabName:o.oldName})})),zr((t=>{const o=e();Jd.setValue(t,o.getData())}))]},oI=(e,t)=>{const o=t.map((e=>e.footerButtons)).getOr([]),n=L(o,(e=>"start"===e.align)),s=(e,t)=>xx.sketch({dom:{tag:"div",classes:[`tox-dialog__footer-${e}`]},components:P(t,(e=>e.memento.asSpec()))});return[s("start",n.pass),s("end",n.fail)]},nI=(e,t,o)=>({dom:HT('<div class="tox-dialog__footer"></div>'),components:[],behaviours:ll([cB.config({channel:`${IF}-${t}`,initialData:e,updateState:(e,t)=>{const n=P(t.buttons,(e=>{const t=Ch(((e,t)=>PC(e,e.type,t))(e,o));return{name:e.name,align:e.align,memento:t}}));return B.some({lookupByName:t=>((e,t,o)=>G(t,(e=>e.name===o)).bind((t=>t.memento.getOpt(e))))(e,n,t),footerButtons:n})},renderComponents:oI})])}),sI=(e,t,o)=>zA.parts.footer(nI(e,t,o)),rI=(e,t)=>{if(e.getRoot().getSystem().isConnected()){const o=sm.getCurrent(e.getFormWrapper()).getOr(e.getFormWrapper());return vk.getField(o,t).orThunk((()=>{const o=e.getFooter();return cB.getState(o).get().bind((e=>e.lookupByName(t)))}))}return B.none()},aI=(e,t,o)=>{const n=t=>{const o=e.getRoot();o.getSystem().isConnected()&&t(o)},s={getData:()=>{const t=e.getRoot(),n=t.getSystem().isConnected()?e.getFormWrapper():t;return{...Jd.getValue(n),...ce(o,(e=>e.get()))}},setData:t=>{n((n=>{const r=s.getData(),a=nn(r,t),i=((e,t)=>{const o=e.getRoot();return cB.getState(o).get().map((e=>Rn(Vn("data",e.dataValidator,t)))).getOr(t)})(e,a),l=e.getFormWrapper();Jd.setValue(l,i),le(o,((e,t)=>{be(a,t)&&e.set(a[t])}))}))},setEnabled:(t,o)=>{rI(e,t).each(o?vm.enable:vm.disable)},focus:t=>{rI(e,t).each(Hp.focus)},block:e=>{if(!r(e))throw new Error("The dialogInstanceAPI.block function should be passed a blocking message of type string as an argument");n((t=>{xr(t,Hx,{message:e})}))},unblock:()=>{n((e=>{yr(e,Px)}))},showTab:t=>{n((o=>{const n=e.getBody();cB.getState(n).get().exists((e=>e.isTabPanel()))&&sm.getCurrent(n).each((e=>{CF.showTab(e,t)}))}))},redial:o=>{n((n=>{const r=e.getId(),a=t(o);n.getSystem().broadcastOn([`${AF}-${r}`],a),n.getSystem().broadcastOn([`${DF}-${r}`],a.internalDialog),n.getSystem().broadcastOn([`${FF}-${r}`],a.internalDialog),n.getSystem().broadcastOn([`${IF}-${r}`],a.internalDialog),s.setData(a.initialData)}))},close:()=>{n((e=>{yr(e,Ix)}))}};return s};var iI=tinymce.util.Tools.resolve("tinymce.util.URI");const lI=["insertContent","setContent","execCommand","close","block","unblock"],cI=e=>a(e)&&-1!==lI.indexOf(e.mceAction),dI=(e,t,o,n)=>{const s=Xr("dialog"),i=XF(e.title,s,n),l=(e=>{const t={dom:{tag:"div",classes:["tox-dialog__content-js"]},components:[{dom:{tag:"div",classes:["tox-dialog__body-iframe"]},components:[Nk({dom:{tag:"iframe",attributes:{src:e.url}},behaviours:ll([Tx.config({}),Hp.config({})])})]}],behaviours:ll([kp.config({mode:"acyclic",useTabstopAt:k(Uk)})])};return zA.parts.body(t)})(e),c=e.buttons.bind((e=>0===e.length?B.none():B.some(sI({buttons:e},s,n)))),u=((e,t)=>{const o=(t,o)=>Er(t,((t,s)=>{n(t,((n,r)=>{o(e(),n,s.event,t)}))})),n=(e,t)=>{cB.getState(e).get().each((o=>{t(o,e)}))};return[...eI(o,t),o(Rx,((e,t,o)=>{t.onAction(e,{name:o.name})}))]})((()=>y),YF((()=>v),n.shared.providers,t)),m={...e.height.fold((()=>({})),(e=>({height:e+"px","max-height":e+"px"}))),...e.width.fold((()=>({})),(e=>({width:e+"px","max-width":e+"px"})))},g=e.width.isNone()&&e.height.isNone()?["tox-dialog--width-lg"]:[],p=new iI(e.url,{base_uri:new iI(window.location.href)}),h=`${p.protocol}://${p.host}${p.port?":"+p.port:""}`,f=Rl(),b=[Fp("messages",[Rr((()=>{const t=Pl(Fe(window),"message",(t=>{if(p.isSameOrigin(new iI(t.raw.origin))){const n=t.raw.data;cI(n)?((e,t,o)=>{switch(o.mceAction){case"insertContent":e.insertContent(o.content);break;case"setContent":e.setContent(o.content);break;case"execCommand":const n=!!d(o.ui)&&o.ui;e.execCommand(o.cmd,n,o.value);break;case"close":t.close();break;case"block":t.block(o.message);break;case"unblock":t.unblock()}})(o,y,n):(e=>!cI(e)&&a(e)&&be(e,"mceAction"))(n)&&e.onMessage(y,n)}}));f.set(t)})),zr(f.clear)]),pl.config({channels:{[VF]:{onReceive:(e,t)=>{Qa(e.element,"iframe").each((e=>{e.dom.contentWindow.postMessage(t,h)}))}}}})],v=JF({id:s,header:i,body:l,footer:c,extraClasses:g,extraBehaviours:b,extraStyles:m},e,u,n),y=(e=>{const t=t=>{e.getSystem().isConnected()&&t(e)};return{block:e=>{if(!r(e))throw new Error("The urlDialogInstanceAPI.block function should be passed a blocking message of type string as an argument");t((t=>{xr(t,Hx,{message:e})}))},unblock:()=>{t((e=>{yr(e,Px)}))},close:()=>{t((e=>{yr(e,Ix)}))},sendMessage:e=>{t((t=>{t.getSystem().broadcastOn([VF],e)}))}}})(v);return{dialog:v,instanceApi:y}},uI=(e,t,o)=>t&&o?[]:[U_.config({contextual:{lazyContext:()=>B.some(Lo(Fe(e.getContentAreaContainer()))),fadeInClass:"tox-dialog-dock-fadein",fadeOutClass:"tox-dialog-dock-fadeout",transitionClass:"tox-dialog-dock-transition"},modes:["top"]})],mI=e=>{const t=e.backstage,o=e.editor,n=zf(o),s=(e=>{const t=e.backstage.shared;return{open:(o,n)=>{const s=()=>{zA.hide(l),n()},r=Ch(PC({name:"close-alert",text:"OK",primary:!0,buttonType:B.some("primary"),align:"end",enabled:!0,icon:B.none()},"cancel",e.backstage)),a=NF(),i=PF(s,t.providers),l=ja(jF({lazySink:()=>t.getSink(),header:HF(a,i),body:LF(o,t.providers),footer:B.some(WF(UF([],[r.asSpec()]))),onEscape:s,extraClasses:["tox-alert-dialog"],extraBehaviours:[],extraStyles:{},dialogEvents:[Er(Vx,s)],eventOrder:{}}));zA.show(l);const c=r.get(l);Hp.focus(c)}}})(e),r=(e=>{const t=e.backstage.shared;return{open:(o,n)=>{const s=e=>{zA.hide(c),n(e)},r=Ch(PC({name:"yes",text:"Yes",primary:!0,buttonType:B.some("primary"),align:"end",enabled:!0,icon:B.none()},"submit",e.backstage)),a=PC({name:"no",text:"No",primary:!1,buttonType:B.some("secondary"),align:"end",enabled:!0,icon:B.none()},"cancel",e.backstage),i=NF(),l=PF((()=>s(!1)),t.providers),c=ja(jF({lazySink:()=>t.getSink(),header:HF(i,l),body:LF(o,t.providers),footer:B.some(WF(UF([],[a,r.asSpec()]))),onEscape:()=>s(!1),extraClasses:["tox-confirm-dialog"],extraBehaviours:[],extraStyles:{},dialogEvents:[Er(Vx,(()=>s(!1))),Er(zx,(()=>s(!0)))],eventOrder:{}}));zA.show(c);const d=r.get(c);Hp.focus(d)}}})(e),a=(e,o)=>uF.open(((e,n,s)=>{const r=n,a=((e,t,o)=>{const n=Xr("dialog"),s=e.internalDialog,r=XF(s.title,n,o),a=((e,t,o)=>{const n=RF(e,t,B.none(),o,!1);return zA.parts.body(n)})({body:s.body,initialData:s.initialData},n,o),i=ZF(s.buttons),l=QF(i),c=sI({buttons:i},n,o),d=tI((()=>h),YF((()=>g),o.shared.providers,t),o.shared.getSink),u=(e=>{switch(e){case"large":return["tox-dialog--width-lg"];case"medium":return["tox-dialog--width-md"];default:return[]}})(s.size),m={id:n,header:r,body:a,footer:B.some(c),extraClasses:u,extraBehaviours:[],extraStyles:{}},g=JF(m,e,d,o),p={getId:y(n),getRoot:y(g),getBody:()=>zA.getBody(g),getFooter:()=>zA.getFooter(g),getFormWrapper:()=>{const e=zA.getBody(g);return sm.getCurrent(e).getOr(e)}},h=aI(p,t.redial,l);return{dialog:g,instanceApi:h}})({dataValidator:s,initialData:r,internalDialog:e},{redial:uF.redial,closeWindow:()=>{zA.hide(a.dialog),o(a.instanceApi)}},t);return zA.show(a.dialog),a.instanceApi.setData(r),a.instanceApi}),e),i=(e,s,r,a)=>uF.open(((e,i,l)=>{const c=Rn(Vn("data",l,i)),d=zl(),u=t.shared.header.isPositionedAtTop(),m=()=>d.on((e=>{wh.reposition(e),U_.refresh(e)})),g=((e,t,o,n)=>{const s=Xr("dialog"),r=Xr("dialog-label"),a=Xr("dialog-content"),i=e.internalDialog,l=Ch(((e,t,o,n)=>xx.sketch({dom:HT('<div class="tox-dialog__header"></div>'),components:[$F(e,t,B.some(o),n),qF(),GF(n)],containerBehaviours:ll([SA.config({mode:"mouse",blockerClass:"blocker",getTarget:e=>ei(e,'[role="dialog"]').getOrDie(),snaps:{getSnapPoints:()=>[],leftAttr:"data-drag-left",topAttr:"data-drag-top"}})])}))({title:i.title,draggable:!0},s,r,o.shared.providers)),c=Ch(((e,t,o,n,s)=>RF(e,t,B.some(o),n,s))({body:i.body,initialData:i.initialData},s,a,o,n)),d=ZF(i.buttons),u=QF(d),m=Ch(((e,t,o)=>nI(e,t,o))({buttons:d},s,o)),g=tI((()=>h),{onBlock:e=>{zT.block(p,((t,n)=>KF(e.message,n,o.shared.providers)))},onUnblock:()=>{zT.unblock(p)},onClose:()=>t.closeWindow()},o.shared.getSink),p=ja({dom:{tag:"div",classes:["tox-dialog","tox-dialog-inline"],attributes:{role:"dialog","aria-labelledby":r,"aria-describedby":a}},eventOrder:{[Js()]:[cB.name(),pl.name()],[Zs()]:["execute-on-form"],[cr()]:["reflecting","execute-on-form"]},behaviours:ll([kp.config({mode:"cyclic",onEscape:e=>(yr(e,Ix),B.some(!0)),useTabstopAt:e=>!Uk(e)&&("button"!==Ve(e)||"disabled"!==ft(e,"disabled"))}),cB.config({channel:`${AF}-${s}`,updateState:(e,t)=>B.some(t),initialData:e}),Hp.config({}),Fp("execute-on-form",g.concat([Vr(Vs(),((e,t)=>{kp.focusIn(e)}))])),zT.config({getRoot:()=>B.some(p)}),Dp.config({}),Fk({})]),components:[l.asSpec(),c.asSpec(),m.asSpec()]}),h=aI({getId:y(s),getRoot:y(p),getFooter:()=>m.get(p),getBody:()=>c.get(p),getFormWrapper:()=>{const e=c.get(p);return sm.getCurrent(e).getOr(e)}},t.redial,u);return{dialog:p,instanceApi:h}})({dataValidator:l,initialData:c,internalDialog:e},{redial:uF.redial,closeWindow:()=>{d.on(wh.hide),o.off("ResizeEditor",m),d.clear(),r(g.instanceApi)}},t,a),p=ja(wh.sketch({lazySink:t.shared.getSink,dom:{tag:"div",classes:[]},fireDismissalEventInstead:{},...u?{}:{fireRepositionEventInstead:{}},inlineBehaviours:ll([Fp("window-manager-inline-events",[Er(ur(),((e,t)=>{yr(g.dialog,Vx)}))]),...uI(o,n,u)]),isExtraPart:(e,t)=>(e=>dx(e,".tox-alert-dialog")||dx(e,".tox-confirm-dialog"))(t)}));return d.set(p),wh.showWithin(p,Ga(g.dialog),{anchor:s},B.some(ut())),n&&u||(U_.refresh(p),o.on("ResizeEditor",m)),g.instanceApi.setData(c),kp.focusIn(g.dialog),g.instanceApi}),e);return{open:(e,o,n)=>void 0!==o&&"toolbar"===o.inline?i(e,t.shared.anchors.inlineDialog(),n,o.ariaAttrs):void 0!==o&&"cursor"===o.inline?i(e,t.shared.anchors.cursor(),n,o.ariaAttrs):a(e,n),openUrl:(e,n)=>((e,n)=>uF.openUrl((e=>{const s=dI(e,{closeWindow:()=>{zA.hide(s.dialog),n(s.instanceApi)}},o,t);return zA.show(s.dialog),s.instanceApi}),e))(e,n),alert:(e,t)=>{s.open(e,(()=>{t()}))},close:e=>{e.close()},confirm:(e,t)=>{r.open(e,(e=>{t(e)}))}}};E.add("silver",(e=>{(e=>{jh(e),(e=>{const t=e.options.register;var o;t("color_map",{processor:e=>f(e,r)?{value:Fy(e),valid:!0}:{valid:!1,message:"Must be an array of strings."},default:["#BFEDD2","Light Green","#FBEEB8","Light Yellow","#F8CAC6","Light Red","#ECCAFA","Light Purple","#C2E0F4","Light Blue","#2DC26B","Green","#F1C40F","Yellow","#E03E2D","Red","#B96AD9","Purple","#3598DB","Blue","#169179","Dark Turquoise","#E67E23","Orange","#BA372A","Dark Red","#843FA1","Dark Purple","#236FA1","Dark Blue","#ECF0F1","Light Gray","#CED4D9","Medium Gray","#95A5A6","Gray","#7E8C8D","Dark Gray","#34495E","Navy Blue","#000000","Black","#ffffff","White"]}),t("color_cols",{processor:"number",default:(o=zy(e).length,Math.max(5,Math.ceil(Math.sqrt(o))))}),t("custom_colors",{processor:"boolean",default:!0})})(e),(e=>{const t=e.options.register;t("contextmenu_avoid_overlap",{processor:"string",default:""}),t("contextmenu_never_use_native",{processor:"boolean",default:!1}),t("contextmenu",{processor:e=>!1===e?{value:[],valid:!0}:r(e)||f(e,r)?{value:bM(e),valid:!0}:{valid:!1,message:"Must be false or a string."},default:"link linkchecker image editimage table spellchecker configurepermanentpen"})})(e)})(e);const{getUiMothership:t,backstage:o,renderUI:n}=FA(e);cx(e,o.shared);const s=mI({editor:e,backstage:o});return{renderUI:n,getWindowManagerImpl:y(s),getNotificationManagerImpl:()=>((e,t,o)=>{const n=t.backstage.shared,s=()=>{const t=Lo(Fe(e.getContentAreaContainer())),o=Uo(),n=Ii(o.x,t.x,t.right),s=Ii(o.y,t.y,t.bottom),r=Math.max(t.right,o.right),a=Math.max(t.bottom,o.bottom);return B.some(No(n,s,r-n,a-s))};return{open:(t,r)=>{const a=()=>{r(),wh.hide(l)},i=ja(Rh.sketch({text:t.text,level:V(["success","error","warning","warn","info"],t.type)?t.type:void 0,progress:!0===t.progressBar,icon:B.from(t.icon),closeButton:t.closeButton,onAction:a,iconProvider:n.providers.icons,translationProvider:n.providers.translate})),l=ja(wh.sketch({dom:{tag:"div",classes:["tox-notifications-container"]},lazySink:n.getSink,fireDismissalEventInstead:{},...n.header.isPositionedAtTop()?{}:{fireRepositionEventInstead:{}}}));o.add(l),t.timeout>0&&Sh.setEditorTimeout(e,(()=>{a()}),t.timeout);const c={close:a,reposition:()=>{const t=Ga(i),o={maxHeightFunction:ql()},r=e.notificationManager.getNotifications();if(r[0]===c){const e={...n.anchors.banner(),overrides:o};wh.showWithinBounds(l,t,{anchor:e},s)}else I(r,c).each((e=>{const n=r[e-1].getEl(),a={type:"node",root:ut(),node:B.some(Fe(n)),overrides:o,layouts:{onRtl:()=>[Xi],onLtr:()=>[Xi]}};wh.showWithinBounds(l,t,{anchor:a},s)}))},text:e=>{Rh.updateText(i,e)},settings:t,getEl:()=>i.element.dom,progressBar:{value:e=>{Rh.updateProgress(i,e)}}};return c},close:e=>{e.close()},getArgs:e=>e.settings}})(e,{backstage:o},t())}}))}();
\ No newline at end of file
diff --git a/public/assets/tinymce/tinymce.d.ts b/public/assets/tinymce/tinymce.d.ts
index dcb38a58b399f3c190964f0882e8342e650a578d..47cb8ed69f79f3975394d79f2ef6e6562a60f073 100644
--- a/public/assets/tinymce/tinymce.d.ts
+++ b/public/assets/tinymce/tinymce.d.ts
@@ -135,6 +135,7 @@ interface SchemaSettings {
     valid_elements?: string;
     valid_styles?: string | Record<string, string>;
     verify_html?: boolean;
+    padd_empty_block_inline_children?: boolean;
 }
 interface Attribute {
     required?: boolean;
@@ -163,6 +164,7 @@ interface ElementRule {
     paddEmpty?: boolean;
     removeEmpty?: boolean;
     removeEmptyAttrs?: boolean;
+    paddInEmptyBlock?: boolean;
 }
 interface SchemaElement extends ElementRule {
     outputName?: string;
diff --git a/public/assets/tinymce/tinymce.js b/public/assets/tinymce/tinymce.js
index dc9209118da71dcbe5287f241f87f73715541c07..7d1fff4a3cedc12aad7ee038678f6518263b035b 100644
--- a/public/assets/tinymce/tinymce.js
+++ b/public/assets/tinymce/tinymce.js
@@ -1,4 +1,4 @@
 /**
- * TinyMCE version 6.0.2 (2022-04-27)
+ * TinyMCE version 6.0.3 (2022-05-25)
  */
-!function(){"use strict";var e=function(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},t=function(e){return{eq:e}},n=t((function(e,t){return e===t})),o=function(e){return t((function(t,n){if(t.length!==n.length)return!1;for(var o=t.length,r=0;r<o;r++)if(!e.eq(t[r],n[r]))return!1;return!0}))},r=function(e){return t((function(r,s){var a=Object.keys(r),i=Object.keys(s);if(!function(e,n){return function(e,n){return t((function(t,o){return e.eq(n(t),n(o))}))}(o(e),(function(e){return function(e,t){return Array.prototype.slice.call(e).sort(t)}(e,n)}))}(n).eq(a,i))return!1;for(var l=a.length,d=0;d<l;d++){var c=a[d];if(!e.eq(r[c],s[c]))return!1}return!0}))},s=t((function(t,n){if(t===n)return!0;var a=e(t);return a===e(n)&&(function(e){return-1!==["undefined","boolean","number","string","function","xml","null"].indexOf(e)}(a)?t===n:"array"===a?o(s).eq(t,n):"object"===a&&r(s).eq(t,n))}));const a=Object.getPrototypeOf,i=(e,t,n)=>{var o;return!!n(e,t.prototype)||(null===(o=e.constructor)||void 0===o?void 0:o.name)===t.name},l=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&i(e,String,((e,t)=>t.isPrototypeOf(e)))?"string":t})(t)===e,d=e=>t=>typeof t===e,c=e=>t=>e===t,u=(e,t)=>f(e)&&i(e,t,((e,t)=>a(e)===t)),m=l("string"),f=l("object"),g=e=>u(e,Object),p=l("array"),h=c(null),b=d("boolean"),v=c(void 0),y=e=>null==e,C=e=>!y(e),x=d("function"),w=d("number"),k=(e,t)=>{if(p(e)){for(let n=0,o=e.length;n<o;++n)if(!t(e[n]))return!1;return!0}return!1},S=()=>{},_=(e,t)=>(...n)=>e(t.apply(null,n)),E=(e,t)=>n=>e(t(n)),N=e=>()=>e,R=e=>e,A=(e,t)=>e===t;function O(e,...t){return(...n)=>{const o=t.concat(n);return e.apply(null,o)}}const T=e=>t=>!e(t),B=e=>e(),D=e=>{e()},L=N(!1),P=N(!0);class M{constructor(e,t){this.tag=e,this.value=t}static some(e){return new M(!0,e)}static none(){return M.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?M.some(e(this.value)):M.none()}bind(e){return this.tag?e(this.value):M.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:M.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return C(e)?M.some(e):M.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}M.singletonNone=new M(!1);const I=Array.prototype.slice,F=Array.prototype.indexOf,U=Array.prototype.push,z=(e,t)=>F.call(e,t),j=(e,t)=>z(e,t)>-1,V=(e,t)=>{for(let n=0,o=e.length;n<o;n++)if(t(e[n],n))return!0;return!1},H=(e,t)=>{const n=e.length,o=new Array(n);for(let r=0;r<n;r++){const n=e[r];o[r]=t(n,r)}return o},$=(e,t)=>{for(let n=0,o=e.length;n<o;n++)t(e[n],n)},q=(e,t)=>{for(let n=e.length-1;n>=0;n--)t(e[n],n)},W=(e,t)=>{const n=[],o=[];for(let r=0,s=e.length;r<s;r++){const s=e[r];(t(s,r)?n:o).push(s)}return{pass:n,fail:o}},K=(e,t)=>{const n=[];for(let o=0,r=e.length;o<r;o++){const r=e[o];t(r,o)&&n.push(r)}return n},G=(e,t,n)=>(q(e,((e,o)=>{n=t(n,e,o)})),n),Y=(e,t,n)=>($(e,((e,o)=>{n=t(n,e,o)})),n),X=(e,t,n)=>{for(let o=0,r=e.length;o<r;o++){const r=e[o];if(t(r,o))return M.some(r);if(n(r,o))break}return M.none()},Q=(e,t)=>X(e,t,L),J=(e,t)=>{for(let n=0,o=e.length;n<o;n++)if(t(e[n],n))return M.some(n);return M.none()},Z=e=>{const t=[];for(let n=0,o=e.length;n<o;++n){if(!p(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);U.apply(t,e[n])}return t},ee=(e,t)=>Z(H(e,t)),te=(e,t)=>{for(let n=0,o=e.length;n<o;++n)if(!0!==t(e[n],n))return!1;return!0},ne=e=>{const t=I.call(e,0);return t.reverse(),t},oe=(e,t)=>K(e,(e=>!j(t,e))),re=(e,t)=>{const n={};for(let o=0,r=e.length;o<r;o++){const r=e[o];n[String(r)]=t(r,o)}return n},se=(e,t)=>{const n=I.call(e,0);return n.sort(t),n},ae=(e,t)=>t>=0&&t<e.length?M.some(e[t]):M.none(),ie=e=>ae(e,0),le=e=>ae(e,e.length-1),de=x(Array.from)?Array.from:e=>I.call(e),ce=(e,t)=>{for(let n=0;n<e.length;n++){const o=t(e[n],n);if(o.isSome())return o}return M.none()},ue=Object.keys,me=Object.hasOwnProperty,fe=(e,t)=>{const n=ue(e);for(let o=0,r=n.length;o<r;o++){const r=n[o];t(e[r],r)}},ge=(e,t)=>pe(e,((e,n)=>({k:n,v:t(e,n)}))),pe=(e,t)=>{const n={};return fe(e,((e,o)=>{const r=t(e,o);n[r.k]=r.v})),n},he=e=>(t,n)=>{e[n]=t},be=(e,t,n,o)=>(fe(e,((e,r)=>{(t(e,r)?n:o)(e,r)})),{}),ve=(e,t)=>{const n={};return be(e,t,he(n),S),n},ye=(e,t)=>{const n=[];return fe(e,((e,o)=>{n.push(t(e,o))})),n},Ce=e=>ye(e,R),xe=(e,t)=>we(e,t)?M.from(e[t]):M.none(),we=(e,t)=>me.call(e,t),ke=(e,t)=>we(e,t)&&void 0!==e[t]&&null!==e[t],Se=e=>{const t={};return $(e,(e=>{t[e]={}})),ue(t)},_e=Array.isArray,Ee=(e,t,n)=>{let o,r;if(!e)return!1;if(n=n||e,void 0!==e.length){for(o=0,r=e.length;o<r;o++)if(!1===t.call(n,e[o],o,e))return!1}else for(o in e)if(we(e,o)&&!1===t.call(n,e[o],o,e))return!1;return!0},Ne=(e,t)=>{const n=[];return Ee(e,((o,r)=>{n.push(t(o,r,e))})),n},Re=(e,t)=>{const n=[];return Ee(e,((o,r)=>{t&&!t(o,r,e)||n.push(o)})),n},Ae=(e,t)=>{if(e)for(let n=0,o=e.length;n<o;n++)if(e[n]===t)return n;return-1},Oe=(e,t,n,o)=>{let r=v(n)?e[0]:n;for(let n=0;n<e.length;n++)r=t.call(o,r,e[n],n);return r},Te=(e,t,n)=>{let o,r;for(o=0,r=e.length;o<r;o++)if(t.call(n,e[o],o,e))return o;return-1},Be=e=>e[e.length-1],De=e=>{let t,n=!1;return(...o)=>(n||(n=!0,t=e.apply(null,o)),t)},Le=()=>Pe(0,0),Pe=(e,t)=>({major:e,minor:t}),Me={nu:Pe,detect:(e,t)=>{const n=String(t).toLowerCase();return 0===e.length?Le():((e,t)=>{const n=((e,t)=>{for(let n=0;n<e.length;n++){const o=e[n];if(o.test(t))return o}})(e,t);if(!n)return{major:0,minor:0};const o=e=>Number(t.replace(n,"$"+e));return Pe(o(1),o(2))})(e,n)},unknown:Le},Ie=(e,t)=>{const n=String(t).toLowerCase();return Q(e,(e=>e.search(n)))},Fe=(e,t,n)=>""===t||e.length>=t.length&&e.substr(n,n+t.length)===t,Ue=(e,t)=>-1!==e.indexOf(t),ze=(e,t)=>Fe(e,t,0),je=(e,t)=>Fe(e,t,e.length-t.length),Ve=e=>t=>t.replace(e,""),He=Ve(/^\s+|\s+$/g),$e=Ve(/^\s+/g),qe=Ve(/\s+$/g),We=e=>e.length>0,Ke=e=>!We(e),Ge=(e,t=10)=>{const n=parseInt(e,t);return isNaN(n)?M.none():M.some(n)},Ye=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,Xe=e=>t=>Ue(t,e),Qe=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>Ue(e,"edge/")&&Ue(e,"chrome")&&Ue(e,"safari")&&Ue(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,Ye],search:e=>Ue(e,"chrome")&&!Ue(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>Ue(e,"msie")||Ue(e,"trident")},{name:"Opera",versionRegexes:[Ye,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Xe("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Xe("firefox")},{name:"Safari",versionRegexes:[Ye,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(Ue(e,"safari")||Ue(e,"mobile/"))&&Ue(e,"applewebkit")}],Je=[{name:"Windows",search:Xe("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>Ue(e,"iphone")||Ue(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Xe("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:Xe("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Xe("linux"),versionRegexes:[]},{name:"Solaris",search:Xe("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Xe("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:Xe("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],Ze={browsers:N(Qe),oses:N(Je)},et="Edge",tt="Chromium",nt="Opera",ot="Firefox",rt="Safari",st=e=>{const t=e.current,n=e.version,o=e=>()=>t===e;return{current:t,version:n,isEdge:o(et),isChromium:o(tt),isIE:o("IE"),isOpera:o(nt),isFirefox:o(ot),isSafari:o(rt)}},at=()=>st({current:void 0,version:Me.unknown()}),it=st,lt=(N(et),N(tt),N("IE"),N(nt),N(ot),N(rt),"Windows"),dt="Android",ct="Linux",ut="macOS",mt="Solaris",ft="FreeBSD",gt="ChromeOS",pt=e=>{const t=e.current,n=e.version,o=e=>()=>t===e;return{current:t,version:n,isWindows:o(lt),isiOS:o("iOS"),isAndroid:o(dt),isMacOS:o(ut),isLinux:o(ct),isSolaris:o(mt),isFreeBSD:o(ft),isChromeOS:o(gt)}},ht=()=>pt({current:void 0,version:Me.unknown()}),bt=pt,vt=(N(lt),N("iOS"),N(dt),N(ct),N(ut),N(mt),N(ft),N(gt),e=>window.matchMedia(e).matches);let yt=De((()=>((e,t,n)=>{const o=Ze.browsers(),r=Ze.oses(),s=t.bind((e=>((e,t)=>ce(t.brands,(t=>{const n=t.brand.toLowerCase();return Q(e,(e=>{var t;return n===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:Me.nu(parseInt(t.version,10),0)})))})))(o,e))).orThunk((()=>((e,t)=>Ie(e,t).map((e=>{const n=Me.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(o,e))).fold(at,it),a=((e,t)=>Ie(e,t).map((e=>{const n=Me.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(r,e).fold(ht,bt),i=((e,t,n,o)=>{const r=e.isiOS()&&!0===/ipad/i.test(n),s=e.isiOS()&&!r,a=e.isiOS()||e.isAndroid(),i=a||o("(pointer:coarse)"),l=r||!s&&a&&o("(min-device-width:768px)"),d=s||a&&!l,c=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(n),u=!d&&!l&&!c;return{isiPad:N(r),isiPhone:N(s),isTablet:N(l),isPhone:N(d),isTouch:N(i),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:N(c),isDesktop:N(u)}})(a,s,e,n);return{browser:s,os:a,deviceType:i}})(navigator.userAgent,M.from(navigator.userAgentData),vt)));const Ct=()=>yt(),xt=navigator.userAgent,wt=Ct(),kt=wt.browser,St=wt.os,_t=wt.deviceType,Et=-1!==xt.indexOf("Windows Phone"),Nt={transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",documentMode:kt.isIE()?document.documentMode||7:10,cacheSuffix:null,container:null,canHaveCSP:!kt.isIE(),windowsPhone:Et,browser:{current:kt.current,version:kt.version,isChromium:kt.isChromium,isEdge:kt.isEdge,isFirefox:kt.isFirefox,isIE:kt.isIE,isOpera:kt.isOpera,isSafari:kt.isSafari},os:{current:St.current,version:St.version,isAndroid:St.isAndroid,isChromeOS:St.isChromeOS,isFreeBSD:St.isFreeBSD,isiOS:St.isiOS,isLinux:St.isLinux,isMacOS:St.isMacOS,isSolaris:St.isSolaris,isWindows:St.isWindows},deviceType:{isDesktop:_t.isDesktop,isiPad:_t.isiPad,isiPhone:_t.isiPhone,isPhone:_t.isPhone,isTablet:_t.isTablet,isTouch:_t.isTouch,isWebView:_t.isWebView}},Rt=/^\s*|\s*$/g,At=e=>null==e?"":(""+e).replace(Rt,""),Ot=(e,t)=>t?!("array"!==t||!_e(e))||typeof e===t:void 0!==e,Tt=function(e,t,n,o){o=o||this,e&&(n&&(e=e[n]),Ee(e,((e,r)=>{if(!1===t.call(o,e,r,n))return!1;Tt(e,t,n,o)})))},Bt={trim:At,isArray:_e,is:Ot,toArray:e=>{if(_e(e))return e;{const t=[];for(let n=0,o=e.length;n<o;n++)t[n]=e[n];return t}},makeMap:(e,t,n)=>{let o;for(t=t||",","string"==typeof(e=e||[])&&(e=e.split(t)),n=n||{},o=e.length;o--;)n[e[o]]={};return n},each:Ee,map:Ne,grep:Re,inArray:Ae,hasOwn:we,extend:(e,...t)=>{for(let n=0;n<t.length;n++){const o=t[n];for(const t in o)if(we(o,t)){const n=o[t];void 0!==n&&(e[t]=n)}}return e},walk:Tt,resolve:(e,t)=>{let n,o;for(t=t||window,n=0,o=(e=e.split(".")).length;n<o&&(t=t[e[n]]);n++);return t},explode:(e,t)=>!e||Ot(e,"array")?e:Ne(e.split(t||","),At),_addCacheSuffix:e=>{const t=Nt.cacheSuffix;return t&&(e+=(-1===e.indexOf("?")?"?":"&")+t),e}},Dt=(e,t,n=A)=>e.exists((e=>n(e,t))),Lt=(e,t,n)=>e.isSome()&&t.isSome()?M.some(n(e.getOrDie(),t.getOrDie())):M.none(),Pt=(e,t)=>e?M.some(t):M.none();"undefined"!=typeof window?window:Function("return this;")();const Mt=e=>e.dom.nodeName.toLowerCase(),It=e=>e.dom.nodeType,Ft=e=>t=>It(t)===e,Ut=Ft(1),zt=Ft(3),jt=Ft(9),Vt=Ft(11),Ht=(e,t,n)=>{if(!(m(n)||b(n)||w(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+"")},$t=(e,t,n)=>{Ht(e.dom,t,n)},qt=(e,t)=>{const n=e.dom;fe(t,((e,t)=>{Ht(n,t,e)}))},Wt=(e,t)=>{const n=e.dom.getAttribute(t);return null===n?void 0:n},Kt=(e,t)=>M.from(Wt(e,t)),Gt=(e,t)=>{const n=e.dom;return!(!n||!n.hasAttribute)&&n.hasAttribute(t)},Yt=(e,t)=>{e.dom.removeAttribute(t)},Xt=e=>Y(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}),Qt=(e,t)=>{const n=Wt(e,t);return void 0===n||""===n?[]:n.split(" ")},Jt=e=>void 0!==e.dom.classList,Zt=e=>Qt(e,"class"),en=(e,t)=>((e,t,n)=>{const o=Qt(e,t).concat([n]);return $t(e,t,o.join(" ")),!0})(e,"class",t),tn=(e,t)=>((e,t,n)=>{const o=K(Qt(e,t),(e=>e!==n));return o.length>0?$t(e,t,o.join(" ")):Yt(e,t),!1})(e,"class",t),nn=(e,t)=>{Jt(e)?e.dom.classList.add(t):en(e,t)},on=e=>{0===(Jt(e)?e.dom.classList:Zt(e)).length&&Yt(e,"class")},rn=(e,t)=>{Jt(e)?e.dom.classList.remove(t):tn(e,t),on(e)},sn=(e,t)=>Jt(e)&&e.dom.classList.contains(t),an=e=>void 0!==e.style&&x(e.style.getPropertyValue),ln=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},dn=(e,t)=>{const n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||n.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return ln(n.childNodes[0])},cn=(e,t)=>{const n=(t||document).createElement(e);return ln(n)},un=(e,t)=>{const n=(t||document).createTextNode(e);return ln(n)},mn=ln,fn=(e,t,n)=>M.from(e.dom.elementFromPoint(t,n)).map(ln),gn=(e,t)=>{const n=[],o=e=>(n.push(e),t(e));let r=t(e);do{r=r.bind(o)}while(r.isSome());return n},pn=(e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},hn=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,bn=(e,t)=>e.dom===t.dom,vn=(e,t)=>{const n=e.dom,o=t.dom;return n!==o&&n.contains(o)},yn=e=>mn(e.dom.ownerDocument),Cn=e=>jt(e)?e:yn(e),xn=e=>mn(Cn(e).dom.defaultView),wn=e=>M.from(e.dom.parentNode).map(mn),kn=e=>M.from(e.dom.previousSibling).map(mn),Sn=e=>M.from(e.dom.nextSibling).map(mn),_n=e=>ne(gn(e,kn)),En=e=>gn(e,Sn),Nn=e=>H(e.dom.childNodes,mn),Rn=(e,t)=>{const n=e.dom.childNodes;return M.from(n[t]).map(mn)},An=e=>Rn(e,0),On=e=>Rn(e,e.dom.childNodes.length-1),Tn=e=>e.dom.childNodes.length,Bn=e=>Vt(e)&&C(e.dom.host),Dn=x(Element.prototype.attachShadow)&&x(Node.prototype.getRootNode),Ln=N(Dn),Pn=Dn?e=>mn(e.dom.getRootNode()):Cn,Mn=e=>Bn(e)?e:(e=>{const t=e.dom.head;if(null==t)throw new Error("Head is not available yet");return mn(t)})(Cn(e)),In=e=>mn(e.dom.host),Fn=e=>{if(Ln()&&C(e.target)){const t=mn(e.target);if(Ut(t)&&Un(t)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return ie(t)}}return M.from(e.target)},Un=e=>C(e.dom.shadowRoot),zn=e=>{const t=zt(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const n=t.ownerDocument;return(e=>{const t=Pn(e);return Bn(t)?M.some(t):M.none()})(mn(t)).fold((()=>n.body.contains(t)),E(zn,In))},jn=(e,t,n)=>{if(!m(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);an(e)&&e.style.setProperty(t,n)},Vn=(e,t,n)=>{const o=e.dom;jn(o,t,n)},Hn=(e,t)=>{const n=e.dom;fe(t,((e,t)=>{jn(n,t,e)}))},$n=(e,t)=>{const n=e.dom,o=window.getComputedStyle(n).getPropertyValue(t);return""!==o||zn(e)?o:qn(n,t)},qn=(e,t)=>an(e)?e.style.getPropertyValue(t):"",Wn=(e,t)=>{const n=e.dom,o=qn(n,t);return M.from(o).filter((e=>e.length>0))},Kn=e=>{const t={},n=e.dom;if(an(n))for(let e=0;e<n.style.length;e++){const o=n.style.item(e);t[o]=n.style[o]}return t},Gn=(e,t)=>{((e,t)=>{an(e)&&e.style.removeProperty(t)})(e.dom,t),Dt(Kt(e,"style").map(He),"")&&Yt(e,"style")},Yn=(e,t)=>{wn(e).each((n=>{n.dom.insertBefore(t.dom,e.dom)}))},Xn=(e,t)=>{Sn(e).fold((()=>{wn(e).each((e=>{Jn(e,t)}))}),(e=>{Yn(e,t)}))},Qn=(e,t)=>{An(e).fold((()=>{Jn(e,t)}),(n=>{e.dom.insertBefore(t.dom,n.dom)}))},Jn=(e,t)=>{e.dom.appendChild(t.dom)},Zn=(e,t)=>{$(t,(t=>{Jn(e,t)}))},eo=e=>{e.dom.textContent="",$(Nn(e),(e=>{to(e)}))},to=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},no=e=>{const t=Nn(e);var n,o;t.length>0&&(n=e,$(o=t,((e,t)=>{const r=0===t?n:o[t-1];Xn(r,e)}))),to(e)},oo=e=>e.dom.innerHTML,ro=(e,t)=>{const n=yn(e).dom,o=mn(n.createDocumentFragment()),r=((e,t)=>{const n=(t||document).createElement("div");return n.innerHTML=e,Nn(mn(n))})(t,n);Zn(o,r),eo(e),Jn(e,o)},so=(e,t,n,o)=>((e,t,n,o,r)=>{const s=((e,t)=>n=>{e(n)&&t((e=>{const t=mn(Fn(e).getOr(e.target)),n=()=>e.stopPropagation(),o=()=>e.preventDefault(),r=_(o,n);return((e,t,n,o,r,s,a)=>({target:e,x:t,y:n,stop:o,prevent:r,kill:s,raw:a}))(t,e.clientX,e.clientY,n,o,r,e)})(n))})(n,o);return e.dom.addEventListener(t,s,false),{unbind:O(ao,e,t,s,false)}})(e,t,n,o),ao=(e,t,n,o)=>{e.dom.removeEventListener(t,n,o)},io=(e,t)=>({left:e,top:t,translate:(n,o)=>io(e+n,t+o)}),lo=io,co=(e,t)=>void 0!==e?e:void 0!==t?t:0,uo=e=>{const t=e.dom,n=t.ownerDocument.body;return n===t?lo(n.offsetLeft,n.offsetTop):zn(e)?(e=>{const t=e.getBoundingClientRect();return lo(t.left,t.top)})(t):lo(0,0)},mo=e=>{const t=void 0!==e?e.dom:document,n=t.body.scrollLeft||t.documentElement.scrollLeft,o=t.body.scrollTop||t.documentElement.scrollTop;return lo(n,o)},fo=(e,t,n)=>{const o=(void 0!==n?n.dom:document).defaultView;o&&o.scrollTo(e,t)},go=(e,t)=>{Ct().browser.isSafari()&&x(e.dom.scrollIntoViewIfNeeded)?e.dom.scrollIntoViewIfNeeded(!1):e.dom.scrollIntoView(t)},po=(e,t,n,o)=>({x:e,y:t,width:n,height:o,right:e+n,bottom:t+o}),ho=e=>{const t=void 0===e?window:e,n=t.document,o=mo(mn(n));return(e=>{const t=void 0===e?window:e;return Ct().browser.isFirefox()?M.none():M.from(t.visualViewport)})(t).fold((()=>{const e=t.document.documentElement,n=e.clientWidth,r=e.clientHeight;return po(o.left,o.top,n,r)}),(e=>po(Math.max(e.pageLeft,o.left),Math.max(e.pageTop,o.top),e.width,e.height)))},bo=e=>t=>!!t&&t.nodeType===e,vo=e=>!!e&&!Object.getPrototypeOf(e),yo=bo(1),Co=e=>{const t=e.map((e=>e.toLowerCase()));return e=>{if(e&&e.nodeName){const n=e.nodeName.toLowerCase();return j(t,n)}return!1}},xo=(e,t)=>{const n=t.toLowerCase().split(" ");return t=>{if(yo(t))for(let o=0;o<n.length;o++){const r=t.ownerDocument.defaultView.getComputedStyle(t,null);if((r?r.getPropertyValue(e):null)===n[o])return!0}return!1}},wo=e=>t=>yo(t)&&t.hasAttribute(e),ko=e=>yo(e)&&e.hasAttribute("data-mce-bogus"),So=e=>yo(e)&&"TABLE"===e.tagName,_o=e=>t=>{if(yo(t)){if(t.contentEditable===e)return!0;if(t.getAttribute("data-mce-contenteditable")===e)return!0}return!1},Eo=Co(["textarea","input"]),No=bo(3),Ro=bo(4),Ao=bo(7),Oo=bo(8),To=bo(9),Bo=bo(11),Do=Co(["br"]),Lo=Co(["img"]),Po=_o("true"),Mo=_o("false"),Io=Co(["td","th"]),Fo=Co(["video","audio","object","embed"]),Uo=Ct().browser,zo=e=>Q(e,Ut),jo=(e,t)=>e.children&&j(e.children,t);var Vo=(e,t,n,o,r)=>e(n,o)?M.some(n):x(r)&&r(n)?M.none():t(n,o,r);const Ho=(e,t,n)=>{let o=e.dom;const r=x(n)?n:L;for(;o.parentNode;){o=o.parentNode;const e=mn(o);if(t(e))return M.some(e);if(r(e))break}return M.none()},$o=(e,t,n)=>Vo(((e,t)=>t(e)),Ho,e,t,n),qo=(e,t,n)=>Ho(e,(e=>pn(e,t)),n),Wo=(e,t)=>((e,t)=>{const n=void 0===t?document:t.dom;return hn(n)?M.none():M.from(n.querySelector(e)).map(mn)})(t,e),Ko=(e,t,n)=>Vo(((e,t)=>pn(e,t)),qo,e,t,n),Go=(e,t={})=>{let n=0;const o={},r=mn(e),s=Cn(r),a=t.maxLoadTime||5e3,i=i=>new Promise(((l,d)=>{let c;const u=Bt._addCacheSuffix(i),m=(e=>xe(o,e).getOrThunk((()=>({id:"mce-u"+n++,passed:[],failed:[],count:0}))))(u);o[u]=m,m.count++;const f=(e,t)=>{$(e,D),m.status=t,m.passed=[],m.failed=[],c&&(c.onload=null,c.onerror=null,c=null)},g=()=>f(m.passed,2),p=()=>f(m.failed,3),h=()=>{var t;t=h,(()=>{const t=e.styleSheets;let n=t.length;for(;n--;){const e=t[n].ownerNode;if(e&&e.id===c.id)return g(),!0}return!1})()||(Date.now()-v<a?setTimeout(t):p())};if(l&&m.passed.push(l),d&&m.failed.push(d),1===m.status)return;if(2===m.status)return void g();if(3===m.status)return void p();m.status=1;const b=cn("link",s.dom);qt(b,{rel:"stylesheet",type:"text/css",id:m.id});const v=Date.now();var y;t.contentCssCors&&$t(b,"crossOrigin","anonymous"),t.referrerPolicy&&$t(b,"referrerpolicy",t.referrerPolicy),c=b.dom,c.onload=h,c.onerror=p,y=b,Jn(Mn(r),y),$t(b,"href",u)})),l=e=>{const t=Bt._addCacheSuffix(e);xe(o,t).each((e=>{0==--e.count&&(delete o[t],(e=>{const t=Mn(r);Wo(t,"#"+e).each(to)})(e.id))}))};return{load:i,loadAll:e=>Promise.allSettled(H(e,(e=>i(e).then(N(e))))).then((e=>{const t=W(e,(e=>"fulfilled"===e.status));return t.fail.length>0?Promise.reject(H(t.fail,(e=>e.reason))):H(t.pass,(e=>e.value))})),unload:l,unloadAll:e=>{$(e,(e=>{l(e)}))},_setReferrerPolicy:e=>{t.referrerPolicy=e}}},Yo=(()=>{const e=new WeakMap;return{forElement:(t,n)=>{const o=Pn(t).dom;return M.from(e.get(o)).getOrThunk((()=>{const t=Go(o,n);return e.set(o,t),t}))}}})();class Xo{constructor(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)}current(){return this.node}next(e){return this.node=this.findSibling(this.node,"firstChild","nextSibling",e),this.node}prev(e){return this.node=this.findSibling(this.node,"lastChild","previousSibling",e),this.node}prev2(e){return this.node=this.findPreviousNode(this.node,"lastChild","previousSibling",e),this.node}findSibling(e,t,n,o){let r,s;if(e){if(!o&&e[t])return e[t];if(e!==this.rootNode){if(r=e[n],r)return r;for(s=e.parentNode;s&&s!==this.rootNode;s=s.parentNode)if(r=s[n],r)return r}}}findPreviousNode(e,t,n,o){let r,s,a;if(e){if(r=e[n],this.rootNode&&r===this.rootNode)return;if(r){if(!o)for(a=r[t];a;a=a[t])if(!a[t])return a;return r}if(s=e.parentNode,s&&s!==this.rootNode)return s}}}const Qo=e=>{let t;return n=>(t=t||re(e,P),we(t,Mt(n)))},Jo=Qo(["h1","h2","h3","h4","h5","h6"]),Zo=Qo(["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"]),er=e=>Ut(e)&&!Zo(e),tr=e=>Ut(e)&&"br"===Mt(e),nr=Qo(["h1","h2","h3","h4","h5","h6","p","div","address","pre","form","blockquote","center","dir","fieldset","header","footer","article","section","hgroup","aside","nav","figure"]),or=Qo(["ul","ol","dl"]),rr=Qo(["li","dd","dt"]),sr=Qo(["thead","tbody","tfoot"]),ar=Qo(["td","th"]),ir=Qo(["pre","script","textarea","style"]),lr="\ufeff",dr="\xa0",cr=e=>e===lr,ur=lr,mr=cr,fr=e=>e.replace(/\uFEFF/g,""),gr=yo,pr=No,hr=e=>(pr(e)&&(e=e.parentNode),gr(e)&&e.hasAttribute("data-mce-caret")),br=e=>pr(e)&&mr(e.data),vr=e=>hr(e)||br(e),yr=e=>e.firstChild!==e.lastChild||!Do(e.firstChild),Cr=e=>{const t=e.container();return!!No(t)&&(t.data.charAt(e.offset())===ur||e.isAtStart()&&br(t.previousSibling))},xr=e=>{const t=e.container();return!!No(t)&&(t.data.charAt(e.offset()-1)===ur||e.isAtEnd()&&br(t.nextSibling))},wr=e=>pr(e)&&e.data[0]===ur,kr=e=>pr(e)&&e.data[e.data.length-1]===ur,Sr=e=>e&&e.hasAttribute("data-mce-caret")?((e=>{const t=e.getElementsByTagName("br"),n=t[t.length-1];ko(n)&&n.parentNode.removeChild(n)})(e),e.removeAttribute("data-mce-caret"),e.removeAttribute("data-mce-bogus"),e.removeAttribute("style"),e.removeAttribute("data-mce-style"),e.removeAttribute("_moz_abspos"),e):null,_r=e=>hr(e.startContainer),Er=Po,Nr=Mo,Rr=Do,Ar=No,Or=Co(["script","style","textarea"]),Tr=Co(["img","input","textarea","hr","iframe","video","audio","object","embed"]),Br=Co(["table"]),Dr=vr,Lr=e=>!Dr(e)&&(Ar(e)?!Or(e.parentNode):Tr(e)||Rr(e)||Br(e)||Pr(e)),Pr=e=>!1===(e=>yo(e)&&"true"===e.getAttribute("unselectable"))(e)&&Nr(e),Mr=(e,t)=>Lr(e)&&((e,t)=>{for(e=e.parentNode;e&&e!==t;e=e.parentNode){if(Pr(e))return!1;if(Er(e))return!0}return!0})(e,t),Ir=/^[ \t\r\n]*$/,Fr=e=>Ir.test(e),Ur=e=>"\n"===e||"\r"===e,zr=(e,t=4,n=!0,o=!0)=>{const r=((e,t)=>t<=0?"":new Array(t+1).join(" "))(0,t),s=e.replace(/\t/g,r),a=Y(s,((e,t)=>(e=>-1!==" \f\t\v".indexOf(e))(t)||t===dr?e.pcIsSpace||""===e.str&&n||e.str.length===s.length-1&&o||((e,t)=>t<e.length&&t>=0&&Ur(e[t]))(s,e.str.length+1)?{pcIsSpace:!1,str:e.str+dr}:{pcIsSpace:!0,str:e.str+" "}:{pcIsSpace:Ur(t),str:e.str+t}),{pcIsSpace:!1,str:""});return a.str},jr=(e,t)=>Lr(e)&&!1===((e,t)=>No(e)&&Fr(e.data)&&!1===((e,t)=>{const n=mn(t);return o=mn(e),r=O(bn,n),qo(o,"pre,code",r).isSome();var o,r})(e,t))(e,t)||(e=>yo(e)&&"A"===e.nodeName&&!e.hasAttribute("href")&&(e.hasAttribute("name")||e.hasAttribute("id")))(e)||Vr(e),Vr=wo("data-mce-bookmark"),Hr=wo("data-mce-bogus"),$r=("data-mce-bogus","all",e=>yo(e)&&"all"===e.getAttribute("data-mce-bogus"));const qr=(e,t=!0)=>((e,t)=>{let n=0;if(jr(e,e))return!1;{let o=e.firstChild;if(!o)return!0;const r=new Xo(o,e);do{if(t){if($r(o)){o=r.next(!0);continue}if(Hr(o)){o=r.next();continue}}if(Do(o))n++,o=r.next();else{if(jr(o,e))return!1;o=r.next()}}while(o);return n<=1}})(e.dom,t),Wr=(e,t)=>C(e)&&(jr(e,t)||er(mn(e))),Kr=e=>(e=>"span"===e.nodeName.toLowerCase())(e)&&"bookmark"===e.getAttribute("data-mce-type"),Gr=(e,t,n)=>{const o=n||t;if(yo(t)&&Kr(t))return t;const r=t.childNodes;for(let t=r.length-1;t>=0;t--)Gr(e,r[t],o);if(yo(t)){const e=t.childNodes;1===e.length&&Kr(e[0])&&t.parentNode.insertBefore(e[0],t)}return(e=>Bo(e)||To(e))(t)||jr(t,o)||(e=>!!yo(e)&&e.childNodes.length>0)(t)||((e,t)=>No(e)&&e.data.length>0&&((e,t)=>{const n=new Xo(e,t).prev(!1),o=new Xo(e,t).next(!1),r=v(n)||Wr(n,t),s=v(o)||Wr(o,t);return r&&s})(e,t))(t,o)||e.remove(t),t},Yr=Bt.makeMap,Xr=/[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Qr=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Jr=/[<>&\"\']/g,Zr=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,es={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"},ts={'"':"&quot;","'":"&#39;","<":"&lt;",">":"&gt;","&":"&amp;","`":"&#96;"},ns={"&lt;":"<","&gt;":">","&amp;":"&","&quot;":'"',"&apos;":"'"},os=(e,t)=>{let n,o,r;const s={};if(e){for(e=e.split(","),t=t||10,n=0;n<e.length;n+=2)o=String.fromCharCode(parseInt(e[n],t)),ts[o]||(r="&"+e[n+1]+";",s[o]=r,s[r]=o);return s}},rs=os("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),ss=(e,t)=>e.replace(t?Xr:Qr,(e=>ts[e]||e)),as=(e,t)=>e.replace(t?Xr:Qr,(e=>e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":ts[e]||"&#"+e.charCodeAt(0)+";")),is=(e,t,n)=>(n=n||rs,e.replace(t?Xr:Qr,(e=>ts[e]||n[e]||e))),ls={encodeRaw:ss,encodeAllRaw:e=>(""+e).replace(Jr,(e=>ts[e]||e)),encodeNumeric:as,encodeNamed:is,getEncodeFunc:(e,t)=>{const n=os(t)||rs,o=Yr(e.replace(/\+/g,","));return o.named&&o.numeric?(e,t)=>e.replace(t?Xr:Qr,(e=>void 0!==ts[e]?ts[e]:void 0!==n[e]?n[e]:e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":"&#"+e.charCodeAt(0)+";")):o.named?t?(e,t)=>is(e,t,n):is:o.numeric?as:ss},decode:e=>e.replace(Zr,((e,t)=>t?(t="x"===t.charAt(0).toLowerCase()?parseInt(t.substr(1),16):parseInt(t,10))>65535?(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t))):es[t]||String.fromCharCode(t):ns[e]||rs[e]||(e=>{const t=cn("div").dom;return t.innerHTML=e,t.textContent||t.innerText||e})(e)))},ds={},cs={},us=Bt.makeMap,ms=Bt.each,fs=Bt.extend,gs=Bt.explode,ps=Bt.inArray,hs=(e,t)=>(e=Bt.trim(e))?e.split(t||" "):[],bs=(e,t)=>{let n;return e&&(n={},"string"==typeof e&&(e={"*":e}),ms(e,((e,o)=>{n[o]=n[o.toUpperCase()]="map"===t?us(e,/[, ]/):gs(e,/[, ]/)}))),n},vs=e=>{var t;const n={},o={};let r=[];const s={},a={},i=(t,n,o)=>{let r=e[t];return r?r=us(r,/[, ]/,us(r.toUpperCase(),/[, ]/)):(r=ds[t],r||(r=us(n," ",us(n.toUpperCase()," ")),r=fs(r,o),ds[t]=r)),r},l=null!==(t=(e=e||{}).schema)&&void 0!==t?t:"html5",d=(e=>{const t={};let n,o,r,s,a,i;const l=(e,o="",r="")=>{const s=hs(r),a=hs(e);let i=a.length;for(;i--;){const e=hs([n,o].join(" "));t[a[i]]={attributes:re(e,(()=>({}))),attributesOrder:e,children:re(s,N(cs))}}},d=(e,n)=>{const o=hs(e),r=hs(n);let s=o.length;for(;s--;){const e=t[o[s]];for(let t=0,n=r.length;t<n;t++)e.attributes[r[t]]={},e.attributesOrder.push(r[t])}};return ds[e]?ds[e]:(n="id accesskey class dir lang style tabindex title role",o="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"!==e&&(n+=" contenteditable contextmenu draggable dropzone hidden spellcheck translate",o+=" 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"!==e&&(n+=" xml:lang",i="acronym applet basefont big font strike tt",r=[r,i].join(" "),ms(hs(i),(e=>{l(e,"",r)})),a="center dir isindex noframes",o=[o,a].join(" "),s=[o,r].join(" "),ms(hs(a),(e=>{l(e,"",s)}))),s=s||[o,r].join(" "),l("html","manifest","head body"),l("head","","base command link meta noscript script style title"),l("title hr noscript br"),l("base","href target"),l("link","href rel media hreflang type sizes hreflang"),l("meta","name http-equiv content charset"),l("style","media type scoped"),l("script","src async defer type charset"),l("body","onafterprint onbeforeprint onbeforeunload onblur onerror onfocus onhashchange onload onmessage onoffline ononline onpagehide onpageshow onpopstate onresize onscroll onstorage onunload",s),l("address dt dd div caption","",s),l("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),l("blockquote","cite",s),l("ol","reversed start type","li"),l("ul","","li"),l("li","value",s),l("dl","","dt dd"),l("a","href target rel media hreflang type",r),l("q","cite",r),l("ins del","cite datetime",s),l("img","src sizes srcset alt usemap ismap width height"),l("iframe","src name width height",s),l("embed","src type width height"),l("object","data type typemustmatch name usemap form width height",[s,"param"].join(" ")),l("param","name value"),l("map","name",[s,"area"].join(" ")),l("area","alt coords shape href target rel media hreflang type"),l("table","border","caption colgroup thead tfoot tbody tr"+("html4"===e?" col":"")),l("colgroup","span","col"),l("col","span"),l("tbody thead tfoot","","tr"),l("tr","","td th"),l("td","colspan rowspan headers",s),l("th","colspan rowspan headers scope abbr",s),l("form","accept-charset action autocomplete enctype method name novalidate target",s),l("fieldset","disabled form name",[s,"legend"].join(" ")),l("label","form for",r),l("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"),l("button","disabled form formaction formenctype formmethod formnovalidate formtarget name type value","html4"===e?s:r),l("select","disabled form multiple name required size","option optgroup"),l("optgroup","disabled label","option"),l("option","disabled label selected value"),l("textarea","cols dirname disabled form maxlength name readonly required rows wrap"),l("menu","type label",[s,"li"].join(" ")),l("noscript","",s),"html4"!==e&&(l("wbr"),l("ruby","",[r,"rt rp"].join(" ")),l("figcaption","",s),l("mark rt rp summary bdi","",r),l("canvas","width height",s),l("video","src crossorigin poster preload autoplay mediagroup loop muted controls width height buffered",[s,"track source"].join(" ")),l("audio","src crossorigin preload autoplay mediagroup loop muted controls buffered volume",[s,"track source"].join(" ")),l("picture","","img source"),l("source","src srcset type media sizes"),l("track","kind src srclang label default"),l("datalist","",[r,"option"].join(" ")),l("article section nav aside main header footer","",s),l("hgroup","","h1 h2 h3 h4 h5 h6"),l("figure","",[s,"figcaption"].join(" ")),l("time","datetime",r),l("dialog","open",s),l("command","type label icon disabled checked radiogroup command"),l("output","for form name",r),l("progress","value max",r),l("meter","value min max low high optimum",r),l("details","open",[s,"summary"].join(" ")),l("keygen","autofocus challenge disabled form keytype name")),"html5-strict"!==e&&(d("script","language xml:space"),d("style","xml:space"),d("object","declare classid code codebase codetype archive standby align border hspace vspace"),d("embed","align name hspace vspace"),d("param","valuetype type"),d("a","charset name rev shape coords"),d("br","clear"),d("applet","codebase archive code object alt name width height align hspace vspace"),d("img","name longdesc align border hspace vspace"),d("iframe","longdesc frameborder marginwidth marginheight scrolling align"),d("font basefont","size color face"),d("input","usemap align"),d("select"),d("textarea"),d("h1 h2 h3 h4 h5 h6 div p legend caption","align"),d("ul","type compact"),d("li","type"),d("ol dl menu dir","compact"),d("pre","width xml:space"),d("hr","align noshade size width"),d("isindex","prompt"),d("table","summary width frame rules cellspacing cellpadding align bgcolor"),d("col","width align char charoff valign"),d("colgroup","width align char charoff valign"),d("thead","align char charoff valign"),d("tr","align char charoff valign bgcolor"),d("th","axis align char charoff valign nowrap bgcolor width height"),d("form","accept"),d("td","abbr axis scope align char charoff valign nowrap bgcolor width height"),d("tfoot","align char charoff valign"),d("tbody","align char charoff valign"),d("area","nohref"),d("body","background bgcolor text link vlink alink")),"html4"!==e&&(d("input button select textarea","autofocus"),d("input textarea","placeholder"),d("a","download"),d("link script img","crossorigin"),d("img","loading"),d("iframe","sandbox seamless allowfullscreen loading")),"html4"!==e&&$([t.video,t.audio],(e=>{delete e.children.audio,delete e.children.video})),ms(hs("a form meter progress dfn"),(e=>{t[e]&&delete t[e].children[e]})),delete t.caption.children.table,delete t.script,ds[e]=t,t)})(l);!1===e.verify_html&&(e.valid_elements="*[*]");const c=bs(e.valid_styles),u=bs(e.invalid_styles,"map"),m=bs(e.valid_classes,"map"),f=i("whitespace_elements","pre script noscript style textarea video audio iframe object code"),g=i("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr"),p=i("void_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr track"),h=i("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls allowfullscreen"),b="td th iframe video audio object script code",v=i("non_empty_elements",b+" pre",p),y=i("move_caret_before_on_enter_elements",b+" table",p),C=i("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"),x=i("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",C),w=i("text_inline_elements","span strong b em i font strike u var cite dfn code mark q sup sub samp");ms("script noscript iframe noframes noembed title style textarea xmp plaintext".split(" "),(e=>{a[e]=new RegExp("</"+e+"[^>]*>","gi")}));const k=e=>new RegExp("^"+e.replace(/([?+*])/g,".$1")+"$"),S=e=>{let t,o,s,a,i,l,d,c,u,m,f,g,p,h,b,v,y,C;const x=/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)])?$/,w=/^([!\-])?(\w+[\\:]:\w+|[^=~<]+)?(?:([=~<])(.*))?$/,S=/[*?+]/;if(e){const _=hs(e,",");for(n["@"]&&(v=n["@"].attributes,y=n["@"].attributesOrder),t=0,o=_.length;t<o;t++)if(i=x.exec(_[t]),i){if(h=i[1],u=i[2],b=i[3],c=i[5],g={},p=[],l={attributes:g,attributesOrder:p},"#"===h&&(l.paddEmpty=!0),"-"===h&&(l.removeEmpty=!0),"!"===i[4]&&(l.removeEmptyAttrs=!0),v&&(fe(v,((e,t)=>{g[t]=e})),p.push.apply(p,y)),c)for(c=hs(c,"|"),s=0,a=c.length;s<a;s++)if(i=w.exec(c[s]),i){if(d={},f=i[1],m=i[2].replace(/[\\:]:/g,":"),h=i[3],C=i[4],"!"===f&&(l.attributesRequired=l.attributesRequired||[],l.attributesRequired.push(m),d.required=!0),"-"===f){delete g[m],p.splice(ps(p,m),1);continue}h&&("="===h&&(l.attributesDefault=l.attributesDefault||[],l.attributesDefault.push({name:m,value:C}),d.defaultValue=C),"~"===h&&(l.attributesForced=l.attributesForced||[],l.attributesForced.push({name:m,value:C}),d.forcedValue=C),"<"===h&&(d.validValues=us(C,"?"))),S.test(m)?(l.attributePatterns=l.attributePatterns||[],d.pattern=k(m),l.attributePatterns.push(d)):(g[m]||p.push(m),g[m]=d)}v||"@"!==u||(v=g,y=p),b&&(l.outputName=u,n[b]=l),S.test(u)?(l.pattern=k(u),r.push(l)):n[u]=l}}},_=e=>{r=[],$(ue(n),(e=>{delete n[e]})),S(e),ms(d,((e,t)=>{o[t]=e.children}))},E=e=>{const t=/^(~)?(.+)$/;e&&(ds.text_block_elements=ds.block_elements=null,ms(hs(e,","),(e=>{const r=t.exec(e),a="~"===r[1],i=a?"span":"div",l=r[2];if(o[l]=o[i],s[l]=i,a||(x[l.toUpperCase()]={},x[l]={}),!n[l]){let e=n[i];e=fs({},e),delete e.removeEmptyAttrs,delete e.removeEmpty,n[l]=e}ms(o,((e,t)=>{e[i]&&(o[t]=e=fs({},o[t]),e[l]=e[i])}))})))},R=e=>{const t=/^([+\-]?)([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]+)\[([^\]]+)]$/;ds[l]=null,e&&ms(hs(e,","),(e=>{const n=t.exec(e);let r,s;n&&(s=n[1],r=s?o[n[2]]:o[n[2]]={"#comment":{}},r=o[n[2]],ms(hs(n[3],"|"),(e=>{"-"===s?delete r[e]:r[e]={}})))}))},A=e=>{let t,o=n[e];if(o)return o;for(t=r.length;t--;)if(o=r[t],o.pattern.test(e))return o};e.valid_elements?_(e.valid_elements):(ms(d,((e,t)=>{n[t]={attributes:e.attributes,attributesOrder:e.attributesOrder},o[t]=e.children})),ms(hs("strong/b em/i"),(e=>{const t=hs(e,"/");n[t[1]].outputName=t[0]})),ms(hs("ol ul sub sup blockquote span font a table tbody strong em b i"),(e=>{n[e]&&(n[e].removeEmpty=!0)})),ms(hs("p h1 h2 h3 h4 h5 h6 th td pre div address caption li"),(e=>{n[e].paddEmpty=!0})),ms(hs("span"),(e=>{n[e].removeEmptyAttrs=!0}))),E(e.custom_elements),R(e.valid_children),S(e.extended_valid_elements),R("+ol[ul|ol],+ul[ul|ol]"),ms({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"},((e,t)=>{n[t]&&(n[t].parentsRequired=hs(e))})),e.invalid_elements&&ms(gs(e.invalid_elements),(e=>{n[e]&&delete n[e]})),A("span")||S("span[!data-mce-type|*]");const O=N(c),T=N(u),B=N(m),D=N(h),L=N(x),P=N(C),M=N(w),I=N(Object.seal(p)),F=N(g),U=N(v),z=N(y),j=N(f),V=N(Object.seal(a)),H=N(s);return{type:l,children:o,elements:n,getValidStyles:O,getValidClasses:B,getBlockElements:L,getInvalidStyles:T,getVoidElements:I,getTextBlockElements:P,getTextInlineElements:M,getBoolAttrs:D,getElementRule:A,getSelfClosingElements:F,getNonEmptyElements:U,getMoveCaretBeforeOnEnterElements:z,getWhitespaceElements:j,getSpecialElements:V,isValidChild:(e,t)=>{const n=o[e.toLowerCase()];return!(!n||!n[t.toLowerCase()])},isValid:(e,t)=>{let n,o;const r=A(e);if(r){if(!t)return!0;if(r.attributes[t])return!0;if(n=r.attributePatterns,n)for(o=n.length;o--;)if(n[o].pattern.test(t))return!0}return!1},getCustomElements:H,addValidElements:S,setValidElements:_,addCustomElements:E,addValidChildren:R}},ys=(e,t)=>{const n=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,o=/\s*([^:]+):\s*([^;]+);?/g,r=/\s+$/;let s;const a={};let i,l;e=e||{},t&&(i=t.getValidStyles(),l=t.getInvalidStyles());const d="\\\" \\' \\; \\: ; : \ufeff".split(" ");for(s=0;s<d.length;s++)a[d[s]]="\ufeff"+s,a["\ufeff"+s]=d[s];const c={parse:t=>{const i={};let l,d,u,m;const f=e.url_converter,g=e.url_converter_scope||c,p=(e,t,n)=>{const o=i[e+"-top"+t];if(!o)return;const r=i[e+"-right"+t];if(!r)return;const a=i[e+"-bottom"+t];if(!a)return;const l=i[e+"-left"+t];if(!l)return;const d=[o,r,a,l];for(s=d.length-1;s--&&d[s]===d[s+1];);s>-1&&n||(i[e+t]=-1===s?d[0]:d.join(" "),delete i[e+"-top"+t],delete i[e+"-right"+t],delete i[e+"-bottom"+t],delete i[e+"-left"+t])},h=e=>{let t,n=i[e];if(n){for(n=n.split(" "),t=n.length;t--;)if(n[t]!==n[0])return!1;return i[e]=n[0],!0}},b=e=>(m=!0,a[e]),v=(e,t)=>(m&&(e=e.replace(/\uFEFF[0-9]/g,(e=>a[e]))),t||(e=e.replace(/\\([\'\";:])/g,"$1")),e),y=e=>String.fromCharCode(parseInt(e.slice(1),16)),C=e=>e.replace(/\\[0-9a-f]+/gi,y),x=(t,n,o,r,s,a)=>{if(s=s||a)return"'"+(s=v(s)).replace(/\'/g,"\\'")+"'";if(n=v(n||o||r),!e.allow_script_urls){const t=n.replace(/[\s\r\n]+/g,"");if(/(java|vb)script:/i.test(t))return"";if(!e.allow_svg_data_urls&&/^data:image\/svg/i.test(t))return""}return f&&(n=f.call(g,n,"style")),"url('"+n.replace(/\'/g,"\\'")+"')"};if(t){for(t=(t=t.replace(/[\u0000-\u001F]/g,"")).replace(/\\[\"\';:\uFEFF]/g,b).replace(/\"[^\"]+\"|\'[^\']+\'/g,(e=>e.replace(/[;:]/g,b)));l=o.exec(t);)if(o.lastIndex=l.index+l[0].length,d=l[1].replace(r,"").toLowerCase(),u=l[2].replace(r,""),d&&u){if(d=C(d),u=C(u),-1!==d.indexOf("\ufeff")||-1!==d.indexOf('"'))continue;if(!e.allow_script_urls&&("behavior"===d||/expression\s*\(|\/\*|\*\//.test(u)))continue;"font-weight"===d&&"700"===u?u="bold":"color"!==d&&"background-color"!==d||(u=u.toLowerCase()),u=u.replace(n,x),i[d]=m?v(u,!0):u}p("border","",!0),p("border","-width"),p("border","-color"),p("border","-style"),p("padding",""),p("margin",""),"border",k="border-style",S="border-color",h(w="border-width")&&h(k)&&h(S)&&(i.border=i[w]+" "+i[k]+" "+i[S],delete i[w],delete i[k],delete i[S]),"medium none"===i.border&&delete i.border,"none"===i["border-image"]&&delete i["border-image"]}var w,k,S;return i},serialize:(e,t)=>{let n="";const o=t=>{let o;const r=i[t];if(r)for(let s=0,a=r.length;s<a;s++)t=r[s],o=e[t],o&&(n+=(n.length>0?" ":"")+t+": "+o+";")};return t&&i?(o("*"),o(t)):fe(e,((e,o)=>{!e||l&&!((e,t)=>{let n=l["*"];return!(n&&n[e]||(n=l[t],n&&n[e]))})(o,t)||(n+=(n.length>0?" ":"")+o+": "+e+";")})),n}};return c},Cs={keyLocation:!0,layerX:!0,layerY:!0,returnValue:!0,webkitMovementX:!0,webkitMovementY:!0,keyIdentifier:!0,mozPressure:!0},xs=(e,t)=>{const n=null!=t?t:{};for(const t in e)we(Cs,t)||(n[t]=e[t]);return C(n.composedPath)&&(n.composedPath=()=>e.composedPath()),n},ws=(e,t,n,o)=>{var r;const s=xs(t,o);return s.type=e,y(s.target)&&(s.target=null!==(r=s.srcElement)&&void 0!==r?r:n),(e=>y(e.preventDefault)||(e=>e instanceof Event||x(e.initEvent))(e))(t)&&(s.preventDefault=()=>{s.defaultPrevented=!0,s.isDefaultPrevented=P,x(t.preventDefault)&&t.preventDefault()},s.stopPropagation=()=>{s.cancelBubble=!0,s.isPropagationStopped=P,x(t.stopPropagation)&&t.stopPropagation()},s.stopImmediatePropagation=()=>{s.isImmediatePropagationStopped=P,s.stopPropagation()},(e=>e.isDefaultPrevented===P||e.isDefaultPrevented===L)(s)||(s.isDefaultPrevented=!0===s.defaultPrevented?P:L,s.isPropagationStopped=!0===s.cancelBubble?P:L,s.isImmediatePropagationStopped=L)),s},ks=/^(?:mouse|contextmenu)|click/,Ss=(e,t,n,o)=>{e.addEventListener?e.addEventListener(t,n,o||!1):e.attachEvent&&e.attachEvent("on"+t,n)},_s=(e,t,n,o)=>{e.removeEventListener?e.removeEventListener(t,n,o||!1):e.detachEvent&&e.detachEvent("on"+t,n)},Es=(e,t)=>{const n=ws(e.type,e,document,t);if((e=>C(e)&&ks.test(e.type))(e)&&v(e.pageX)&&!v(e.clientX)){const t=n.target.ownerDocument||document,o=t.documentElement,r=t.body,s=n;s.pageX=e.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),s.pageY=e.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)}return n},Ns=(e,t,n)=>{const o=e.document,r={type:"ready"};if(n.domLoaded)return void t(r);const s=()=>{_s(e,"DOMContentLoaded",s),_s(e,"load",s),n.domLoaded||(n.domLoaded=!0,t(r)),e=null};"complete"===o.readyState||"interactive"===o.readyState&&o.body?s():Ss(e,"DOMContentLoaded",s),n.domLoaded||Ss(e,"load",s)};class Rs{constructor(){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}bind(e,t,n,o){const r=this;let s,a,i,l,d,c,u;const m=window,f=e=>{r.executeHandlers(Es(e||m.event),s)};if(!e||3===e.nodeType||8===e.nodeType)return;e[r.expando]?s=e[r.expando]:(s=r.count++,e[r.expando]=s,r.events[s]={}),o=o||e;const g=t.split(" ");for(i=g.length;i--;)l=g[i],c=f,d=u=!1,"DOMContentLoaded"===l&&(l="ready"),r.domLoaded&&"ready"===l&&"complete"===e.readyState?n.call(o,Es({type:l})):(r.hasMouseEnterLeave||(d=r.mouseEnterLeave[l],d&&(c=e=>{const t=e.currentTarget;let n=e.relatedTarget;if(n&&t.contains)n=t.contains(n);else for(;n&&n!==t;)n=n.parentNode;n||((e=Es(e||m.event)).type="mouseout"===e.type?"mouseleave":"mouseenter",e.target=t,r.executeHandlers(e,s))})),r.hasFocusIn||"focusin"!==l&&"focusout"!==l||(u=!0,d="focusin"===l?"focus":"blur",c=e=>{(e=Es(e||m.event)).type="focus"===e.type?"focusin":"focusout",r.executeHandlers(e,s)}),a=r.events[s][l],a?"ready"===l&&r.domLoaded?n(Es({type:l})):a.push({func:n,scope:o}):(r.events[s][l]=a=[{func:n,scope:o}],a.fakeName=d,a.capture=u,a.nativeHandler=c,"ready"===l?Ns(e,c,r):Ss(e,d||l,c,u)));return e=a=null,n}unbind(e,t,n){let o,r,s,a,i;if(!e||3===e.nodeType||8===e.nodeType)return this;const l=e[this.expando];if(l){if(i=this.events[l],t){const l=t.split(" ");for(r=l.length;r--;)if(a=l[r],o=i[a],o){if(n)for(s=o.length;s--;)if(o[s].func===n){const e=o.nativeHandler,t=o.fakeName,n=o.capture;o=o.slice(0,s).concat(o.slice(s+1)),o.nativeHandler=e,o.fakeName=t,o.capture=n,i[a]=o}n&&0!==o.length||(delete i[a],_s(e,o.fakeName||a,o.nativeHandler,o.capture))}}else fe(i,((t,n)=>{_s(e,t.fakeName||n,t.nativeHandler,t.capture)})),i={};for(a in i)if(we(i,a))return this;delete this.events[l];try{delete e[this.expando]}catch(t){e[this.expando]=null}}return this}fire(e,t,n){return this.dispatch(e,t,n)}dispatch(e,t,n){let o;if(!e||3===e.nodeType||8===e.nodeType)return this;const r=Es({type:t,target:e},n);do{o=e[this.expando],o&&this.executeHandlers(r,o),e=e.parentNode||e.ownerDocument||e.defaultView||e.parentWindow}while(e&&!r.isPropagationStopped());return this}clean(e){let t,n;if(!e||3===e.nodeType||8===e.nodeType)return this;if(e[this.expando]&&this.unbind(e),e.getElementsByTagName||(e=e.document),e&&e.getElementsByTagName)for(this.unbind(e),n=e.getElementsByTagName("*"),t=n.length;t--;)(e=n[t])[this.expando]&&this.unbind(e);return this}destroy(){this.events={}}cancel(e){return e&&(e.preventDefault(),e.stopImmediatePropagation()),!1}executeHandlers(e,t){const n=this.events[t],o=n&&n[e.type];if(o)for(let t=0,n=o.length;t<n;t++){const n=o[t];if(n&&!1===n.func.call(n.scope,e)&&e.preventDefault(),e.isImmediatePropagationStopped())return}}}Rs.Event=new Rs;const As=Bt.each,Os=Bt.grep,Ts="data-mce-style",Bs=(e,t,n)=>{y(n)||""===n?Yt(e,t):$t(e,t,n)},Ds=(e,t)=>{const n=Wt(t,"style"),o=e.serialize(e.parse(n),Mt(t));Bs(t,Ts,o)},Ls=(e,t)=>{let n,o,r=0;if(e)for(n=e.nodeType,e=e.previousSibling;e;e=e.previousSibling)o=e.nodeType,(!t||3!==o||o!==n&&e.nodeValue.length)&&(r++,n=o);return r},Ps=Bt.makeMap("fill-opacity font-weight line-height opacity orphans widows z-index zoom"," "),Ms=e=>e.replace(/[A-Z]/g,(e=>"-"+e.toLowerCase())),Is=(e,t={})=>{const n={},o=window,r={};let s=0;const a=Yo.forElement(mn(e),{contentCssCors:t.contentCssCors,referrerPolicy:t.referrerPolicy}),i=[],l=t.schema?t.schema:vs({}),d=ys({url_converter:t.url_converter,url_converter_scope:t.url_converter_scope},t.schema),c=t.ownEvents?new Rs:Rs.Event,u=l.getBlockElements(),g=t=>t&&e&&m(t)?e.getElementById(t):t,h=e=>{const t=g(e);return C(t)?mn(t):null},b=(e,t,n)=>{let o;const r=h(e);if(C(r)&&Ut(r)){const e=J[t];o=e&&e.get?e.get(r.dom,t):Wt(r,t)}return C(o)?o:null!=n?n:""},v=e=>{const t=g(e);return y(t)?[]:t.attributes},k=(e,n,o)=>{L(e,(e=>{if(yo(e)){const r=mn(e);""===o&&(o=null);const s=Wt(r,n),a=J[n];a&&a.set?a.set(r.dom,o,n):Bs(r,n,o),s!==o&&t.onSetAttrib&&t.onSetAttrib({attrElm:r,attrName:n,attrValue:o})}}))},_=()=>t.root_element||e.body,E=(t,n)=>((e,t,n)=>{let o=0,r=0;const s=e.ownerDocument;if(n=n||e,t){if(n===e&&t.getBoundingClientRect&&"static"===$n(mn(e),"position")){const n=t.getBoundingClientRect();return o=n.left+(s.documentElement.scrollLeft||e.scrollLeft)-s.documentElement.clientLeft,r=n.top+(s.documentElement.scrollTop||e.scrollTop)-s.documentElement.clientTop,{x:o,y:r}}let a=t;for(;a&&a!==n&&a.nodeType&&!jo(a,n);){const e=a;o+=e.offsetLeft||0,r+=e.offsetTop||0,a=e.offsetParent}for(a=t.parentNode;a&&a!==n&&a.nodeType&&!jo(a,n);)o-=a.scrollLeft||0,r-=a.scrollTop||0,a=a.parentNode;r+=(e=>Uo.isFirefox()&&"table"===Mt(e)?zo(Nn(e)).filter((e=>"caption"===Mt(e))).bind((e=>zo(En(e)).map((t=>{const n=t.dom.offsetTop,o=e.dom.offsetTop,r=e.dom.offsetHeight;return n<=o?-r:0})))).getOr(0):0)(mn(t))}return{x:o,y:r}})(e.body,g(t),n),R=(e,n,o)=>{const r=(e,t)=>m(e)?e:w(e)?we(Ps,t)?e+"":e+"px":ge(e,r),s=(e,t,n)=>{const o=Ms(t);y(n)||""===n?Gn(e,o):Vn(e,o,r(n,o))};L(e,(e=>{const r=mn(e);m(n)?s(r,n,o):fe(n,((e,t)=>{s(r,t,e)})),t.update_styles&&Ds(d,r)}))},A=(e,t,n)=>{const o=g(e);if(!y(o)&&yo(o))return n?$n(mn(o),Ms(t)):("float"===(t=t.replace(/-(\D)/g,((e,t)=>t.toUpperCase())))&&(t="cssFloat"),o.style?o.style[t]:void 0)},O=e=>{let t,n;const o=g(e);return t=A(o,"width"),n=A(o,"height"),-1===t.indexOf("px")&&(t=0),-1===n.indexOf("px")&&(n=0),{w:parseInt(t,10)||o.offsetWidth||o.clientWidth,h:parseInt(n,10)||o.offsetHeight||o.clientHeight}},T=(e,t)=>{if(!e)return!1;const n=p(e)?e:[e];return V(n,(e=>pn(mn(e),t)))},B=(e,t,n,o)=>{const r=[];let s,a=g(e);for(o=void 0===o,n=n||("BODY"!==_().nodeName?_().parentNode:null),m(t)&&(s=t,t="*"===t?yo:e=>T(e,s));a&&!(a===n||y(a.nodeType)||To(a)||Bo(a));){if(!t||t(a)){if(!o)return[a];r.push(a)}a=a.parentNode}return o?r:null},D=(e,t,n)=>{let o=t;if(e)for(m(t)&&(o=e=>T(e,t)),e=e[n];e;e=e[n])if(x(o)&&o(e))return e;return null},L=function(e,t,n){const o=null!=n?n:this,r=m(e)?g(e):e;if(!r)return!1;if(p(r)&&(r.length||0===r.length)){const e=[];return As(r,((n,r)=>{n&&e.push(t.call(o,m(n)?g(n):n,r))})),e}return t.call(o,r)},P=(e,t)=>{L(e,(e=>{fe(t,((t,n)=>{k(e,n,t)}))}))},M=(e,t)=>{L(e,(e=>{const n=mn(e);ro(n,t)}))},I=(t,n,o,r,s)=>L(t,(t=>{const a=m(n)?e.createElement(n):n;return C(o)&&P(a,o),r&&(!m(r)&&r.nodeType?a.appendChild(r):m(r)&&M(a,r)),s?a:t.appendChild(a)})),F=(t,n,o)=>I(e.createElement(t),t,n,o,!0),U=ls.encodeAllRaw,z=(e,t)=>L(e,(e=>{const n=mn(e);return t&&$(Nn(n),(e=>{zt(e)&&0===e.dom.length?to(e):Yn(n,e)})),to(n),n.dom})),H=(e,t,n)=>{L(e,(e=>{if(yo(e)){const o=mn(e),r=t.split(" ");$(r,(e=>{C(n)?(n?nn:rn)(o,e):((e,t)=>{const n=Jt(e)?e.dom.classList.toggle(t):((e,t)=>j(Zt(e),t)?tn(e,t):en(e,t))(e,t);on(e)})(o,e)}))}}))},q=(e,t,n)=>L(t,(t=>(p(t)&&(e=e.cloneNode(!0)),n&&As(Os(t.childNodes),(t=>{e.appendChild(t)})),t.parentNode.replaceChild(e,t)))),W=e=>{if(yo(e)){const t="a"===e.nodeName.toLowerCase()&&!b(e,"href")&&b(e,"id");if(b(e,"name")||b(e,"data-mce-bookmark")||t)return!0}return!1},K=()=>e.createRange(),G=(n,r,s,a)=>{if(p(n)){let e=n.length;const t=[];for(;e--;)t[e]=G(n[e],r,s,a);return t}return!t.collect||n!==e&&n!==o||i.push([n,r,s,a]),c.bind(n,r,s,a||Q)},Y=(t,n,r)=>{if(p(t)){let e=t.length;const o=[];for(;e--;)o[e]=Y(t[e],n,r);return o}if(i.length>0&&(t===e||t===o)){let e=i.length;for(;e--;){const o=i[e];t!==o[0]||n&&n!==o[1]||r&&r!==o[2]||c.unbind(o[0],o[1],o[2])}}return c.unbind(t,n,r)},X=e=>{if(e&&yo(e)){const t=e.getAttribute("data-mce-contenteditable");return t&&"inherit"!==t?t:"inherit"!==e.contentEditable?e.contentEditable:null}return null},Q={doc:e,settings:t,win:o,files:r,stdMode:!0,boxModel:!0,styleSheetLoader:a,boundEvents:i,styles:d,schema:l,events:c,isBlock:e=>m(e)?we(u,e):yo(e)&&we(u,e.nodeName),root:null,clone:(e,t)=>e.cloneNode(t),getRoot:_,getViewPort:e=>{const t=ho(e);return{x:t.x,y:t.y,w:t.width,h:t.height}},getRect:e=>{const t=g(e),n=E(t),o=O(t);return{x:n.x,y:n.y,w:o.w,h:o.h}},getSize:O,getParent:(e,t,n)=>{const o=B(e,t,n,!1);return o&&o.length>0?o[0]:null},getParents:B,get:g,getNext:(e,t)=>D(e,t,"nextSibling"),getPrev:(e,t)=>D(e,t,"previousSibling"),select:(n,o)=>{var r,s;const a=null!==(s=null!==(r=g(o))&&void 0!==r?r:t.root_element)&&void 0!==s?s:e;return de(a.querySelectorAll(n))},is:T,add:I,create:F,createHTML:(e,t,n="")=>{let o,r="";for(o in r+="<"+e,t)ke(t,o)&&(r+=" "+o+'="'+U(t[o])+'"');return Ke(n)&&we(l.getVoidElements(),e)?r+" />":r+">"+n+"</"+e+">"},createFragment:t=>{let n;const o=e.createElement("div"),r=e.createDocumentFragment();for(r.appendChild(o),t&&(o.innerHTML=t);n=o.firstChild;)r.appendChild(n);return r.removeChild(o),r},remove:z,setStyle:R,getStyle:A,setStyles:(e,t)=>{R(e,t)},removeAllAttribs:e=>L(e,(e=>{const t=e.attributes;for(let n=t.length-1;n>=0;n--)e.removeAttributeNode(t.item(n))})),setAttrib:k,setAttribs:P,getAttrib:b,getPos:E,parseStyle:e=>d.parse(e),serializeStyle:(e,t)=>d.serialize(e,t),addStyle:t=>{let o,r;if(Q!==Is.DOM&&e===document){if(n[t])return;n[t]=!0}r=e.getElementById("mceDefaultStyles"),r||(r=e.createElement("style"),r.id="mceDefaultStyles",r.type="text/css",o=e.getElementsByTagName("head")[0],o.firstChild?o.insertBefore(r,o.firstChild):o.appendChild(r)),r.styleSheet?r.styleSheet.cssText+=t:r.appendChild(e.createTextNode(t))},loadCSS:e=>{e||(e=""),$(e.split(","),(e=>{r[e]=!0,a.load(e).catch(S)}))},addClass:(e,t)=>{H(e,t,!0)},removeClass:(e,t)=>{H(e,t,!1)},hasClass:(e,t)=>{const n=h(e),o=t.split(" ");return te(o,(e=>sn(n,e)))},toggleClass:H,show:e=>{L(e,(e=>Gn(mn(e),"display")))},hide:e=>{L(e,(e=>Vn(mn(e),"display","none")))},isHidden:e=>{const t=h(e);return Dt(Wn(t,"display"),"none")},uniqueId:e=>(e||"mce_")+s++,setHTML:M,getOuterHTML:e=>{const t=h(e);return yo(t.dom)?t.dom.outerHTML:(e=>{const t=cn("div"),n=mn(e.dom.cloneNode(!0));return Jn(t,n),oo(t)})(t)},setOuterHTML:(e,t)=>{L(e,(e=>{yo(e)&&(e.outerHTML=t)}))},decode:ls.decode,encode:U,insertAfter:(e,t)=>{const n=g(t);return L(e,(e=>{const t=n.parentNode,o=n.nextSibling;return o?t.insertBefore(e,o):t.appendChild(e),e}))},replace:q,rename:(e,t)=>{let n;return e.nodeName!==t.toUpperCase()&&(n=F(t),As(v(e),(t=>{k(n,t.nodeName,b(e,t.nodeName))})),q(n,e,!0)),n||e},findCommonAncestor:(e,t)=>{let n,o=e;for(;o;){for(n=t;n&&o!==n;)n=n.parentNode;if(o===n)break;o=o.parentNode}return!o&&e.ownerDocument?e.ownerDocument.documentElement:o},run:L,getAttribs:v,isEmpty:(e,t)=>{let n,o,r=0;if(W(e))return!1;if(e=e.firstChild){const s=new Xo(e,e.parentNode),a=l?l.getWhitespaceElements():{};t=t||(l?l.getNonEmptyElements():null);do{if(n=e.nodeType,yo(e)){const n=e.getAttribute("data-mce-bogus");if(n){e=s.next("all"===n);continue}if(o=e.nodeName.toLowerCase(),t&&t[o]){if("br"===o){r++,e=s.next();continue}return!1}if(W(e))return!1}if(8===n)return!1;if(3===n&&!Fr(e.nodeValue))return!1;if(3===n&&e.parentNode&&a[e.parentNode.nodeName]&&Fr(e.nodeValue))return!1;e=s.next()}while(e)}return r<=1},createRng:K,nodeIndex:Ls,split:(e,t,n)=>{let o,r,s,a=K();if(e&&t)return a.setStart(e.parentNode,Ls(e)),a.setEnd(t.parentNode,Ls(t)),o=a.extractContents(),a=K(),a.setStart(t.parentNode,Ls(t)+1),a.setEnd(e.parentNode,Ls(e)+1),r=a.extractContents(),s=e.parentNode,s.insertBefore(Gr(Q,o),e),n?s.insertBefore(n,e):s.insertBefore(t,e),s.insertBefore(Gr(Q,r),e),z(e),n||t},bind:G,unbind:Y,fire:(e,t,n)=>c.dispatch(e,t,n),dispatch:(e,t,n)=>c.dispatch(e,t,n),getContentEditable:X,getContentEditableParent:e=>{const t=_();let n=null;for(;e&&e!==t&&(n=X(e),null===n);e=e.parentNode);return n},destroy:()=>{if(i.length>0){let e=i.length;for(;e--;){const t=i[e];c.unbind(t[0],t[1],t[2])}}fe(r,((e,t)=>{a.unload(t),delete r[t]}))},isChildOf:(e,t)=>e===t||t.contains(e),dumpRng:e=>"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset},J=((e,t,n)=>{const o=t.keep_values,r={set:(e,o,r)=>{const s=mn(e);x(t.url_converter)&&C(o)&&(o=t.url_converter.call(t.url_converter_scope||n(),o,r,e[0])),Bs(s,"data-mce-"+r,o),Bs(s,r,o)},get:(e,t)=>{const n=mn(e);return Wt(n,"data-mce-"+t)||Wt(n,t)}},s={style:{set:(t,n)=>{const r=mn(t);f(n)?Hn(r,n):(o&&Bs(r,Ts,n),Yt(r,"style"),m(n)&&Hn(r,e.parse(n)))},get:t=>{const n=mn(t),o=Wt(n,Ts)||Wt(n,"style");return e.serialize(e.parse(o),Mt(n))}}};return o&&(s.href=s.src=r),s})(d,t,N(Q));return Q};Is.DOM=Is(document),Is.nodeIndex=Ls;const Fs=Is.DOM;class Us{constructor(e={}){this.states={},this.queue=[],this.scriptLoadedCallbacks={},this.queueLoadedCallbacks=[],this.loading=!1,this.settings=e}_setReferrerPolicy(e){this.settings.referrerPolicy=e}loadScript(e){return new Promise(((t,n)=>{const o=Fs;let r;const s=()=>{o.remove(a),r&&(r.onerror=r.onload=r=null)},a=o.uniqueId();r=document.createElement("script"),r.id=a,r.type="text/javascript",r.src=Bt._addCacheSuffix(e),this.settings.referrerPolicy&&o.setAttrib(r,"referrerpolicy",this.settings.referrerPolicy),r.onload=()=>{s(),t()},r.onerror=()=>{s(),n("Failed to load script: "+e)},(document.getElementsByTagName("head")[0]||document.body).appendChild(r)}))}isDone(e){return 2===this.states[e]}markDone(e){this.states[e]=2}add(e){const t=this;return t.queue.push(e),void 0===t.states[e]&&(t.states[e]=0),new Promise(((n,o)=>{t.scriptLoadedCallbacks[e]||(t.scriptLoadedCallbacks[e]=[]),t.scriptLoadedCallbacks[e].push({resolve:n,reject:o})}))}load(e){return this.add(e)}remove(e){delete this.states[e],delete this.scriptLoadedCallbacks[e]}loadQueue(){const e=this.queue;return this.queue=[],this.loadScripts(e)}loadScripts(e){const t=this,n=(e,n)=>{xe(t.scriptLoadedCallbacks,n).each((t=>{$(t,(t=>t[e](n)))})),delete t.scriptLoadedCallbacks[n]},o=e=>{const t=K(e,(e=>"rejected"===e.status));return t.length>0?Promise.reject(ee(t,(({reason:e})=>p(e)?e:[e]))):Promise.resolve()},r=e=>Promise.allSettled(H(e,(e=>2===t.states[e]?(n("resolve",e),Promise.resolve()):3===t.states[e]?(n("reject",e),Promise.reject(e)):(t.states[e]=1,t.loadScript(e).then((()=>{t.states[e]=2,n("resolve",e);const s=t.queue;if(s.length>0)return t.queue=[],r(s).then(o)}),(()=>(t.states[e]=3,n("reject",e),Promise.reject(e)))))))),s=e=>(t.loading=!0,r(e).then((e=>{t.loading=!1;const n=t.queueLoadedCallbacks.shift();return M.from(n).each(D),o(e)}))),a=Se(e);return t.loading?new Promise(((e,n)=>{t.queueLoadedCallbacks.push((()=>s(a).then(e,n)))})):s(a)}}Us.ScriptLoader=new Us;const zs=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},js={},Vs=zs("en"),Hs=()=>xe(js,Vs.get()),$s={getData:()=>ge(js,(e=>({...e}))),setCode:e=>{e&&Vs.set(e)},getCode:()=>Vs.get(),add:(e,t)=>{let n=js[e];n||(js[e]=n={}),fe(t,((e,t)=>{n[t.toLowerCase()]=e}))},translate:e=>{const t=Hs().getOr({}),n=e=>x(e)?Object.prototype.toString.call(e):o(e)?"":""+e,o=e=>""===e||null==e,r=e=>{const o=n(e);return xe(t,o.toLowerCase()).map(n).getOr(o)},s=e=>e.replace(/{context:\w+}$/,"");if(o(e))return"";if(f(a=e)&&we(a,"raw"))return n(e.raw);var a;if((e=>p(e)&&e.length>1)(e)){const t=e.slice(1);return s(r(e[0]).replace(/\{([0-9]+)\}/g,((e,o)=>we(t,o)?n(t[o]):e)))}return s(r(e))},isRtl:()=>Hs().bind((e=>xe(e,"_dir"))).exists((e=>"rtl"===e)),hasCode:e=>we(js,e)},qs=()=>{const e=[],t={},n={},o=[],r=(e,t)=>{const n=K(o,(n=>n.name===e&&n.state===t));$(n,(e=>e.resolve()))},s=e=>we(t,e),a=(e,n)=>{const o=$s.getCode();!o||n&&-1===(","+(n||"")+",").indexOf(","+o+",")||Us.ScriptLoader.add(t[e]+"/langs/"+o+".js")},i=(e,t="added")=>"added"===t&&(e=>we(n,e))(e)||"loaded"===t&&s(e)?Promise.resolve():new Promise((n=>{o.push({name:e,state:t,resolve:n})}));return{items:e,urls:t,lookup:n,get:e=>{if(n[e])return n[e].instance},requireLangPack:(e,t)=>{!1!==qs.languageLoad&&(s(e)?a(e,t):i(e,"loaded").then((()=>a(e,t))))},add:(t,o)=>(e.push(o),n[t]={instance:o},r(t,"added"),o),remove:e=>{delete t[e],delete n[e]},createUrl:(e,t)=>m(t)?m(e)?{prefix:"",resource:t,suffix:""}:{prefix:e.prefix,resource:t,suffix:e.suffix}:t,load:(e,o)=>{if(t[e])return Promise.resolve();let s=m(o)?o:o.prefix+o.resource+o.suffix;0!==s.indexOf("/")&&-1===s.indexOf("://")&&(s=qs.baseURL+"/"+s),t[e]=s.substring(0,s.lastIndexOf("/"));const a=()=>(r(e,"loaded"),Promise.resolve());return n[e]?a():Us.ScriptLoader.add(s).then(a)},waitFor:i}};qs.languageLoad=!0,qs.baseURL="",qs.PluginManager=qs(),qs.ThemeManager=qs(),qs.ModelManager=qs();const Ws=()=>{const e=(e=>{const t=zs(M.none()),n=()=>t.get().each(e);return{clear:()=>{n(),t.set(M.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{n(),t.set(M.some(e))}}})(S);return{...e,on:t=>e.get().each(t)}},Ks=(e,t)=>{let n=null;return{cancel:()=>{h(n)||(clearTimeout(n),n=null)},throttle:(...o)=>{h(n)&&(n=setTimeout((()=>{n=null,e.apply(null,o)}),t))}}},Gs=(e,t)=>{let n=null;const o=()=>{h(n)||(clearTimeout(n),n=null)};return{cancel:o,throttle:(...r)=>{o(),n=setTimeout((()=>{n=null,e.apply(null,r)}),t)}}},Ys=(e,t)=>{let n=[];return $(Nn(e),(e=>{t(e)&&(n=n.concat([e])),n=n.concat(Ys(e,t))})),n},Xs=(e,t)=>((e,t)=>{const n=void 0===t?document:t.dom;return hn(n)?[]:H(n.querySelectorAll(e),mn)})(t,e),Qs=N("mce-annotation"),Js=N("data-mce-annotation"),Zs=N("data-mce-annotation-uid"),ea=N("data-mce-annotation-active"),ta=(e,t)=>{const n=e.selection.getRng(),o=mn(n.startContainer),r=mn(e.getBody()),s=t.fold((()=>"."+Qs()),(e=>`[${Js()}="${e}"]`)),a=Rn(o,n.startOffset).getOr(o),i=Ko(a,s,(e=>bn(e,r))),l=(e,t)=>Gt(e,t)?M.some(Wt(e,t)):M.none();return i.bind((t=>l(t,`${Zs()}`).bind((n=>l(t,`${Js()}`).map((t=>{const o=na(e,n);return{uid:n,name:t,elements:o}}))))))},na=(e,t)=>{const n=mn(e.getBody());return Xs(n,`[${Zs()}="${t}"]`)},oa=(e,t)=>{const n=mn(e.getBody()),o=Xs(n,`[${Js()}="${t}"]`),r={};return $(o,(e=>{const t=Wt(e,Zs()),n=xe(r,t).getOr([]);r[t]=n.concat([e])})),r};let ra=0;const sa=e=>{const t=(new Date).getTime(),n=Math.floor(1e9*Math.random());return ra++,e+"_"+n+ra+String(t)},aa=(e,t)=>mn(e.dom.cloneNode(t)),ia=e=>aa(e,!1),la=e=>aa(e,!0),da=(e,t,n=L)=>{const o=new Xo(e,t),r=e=>{let t;do{t=o[e]()}while(t&&!No(t)&&!n(t));return M.from(t).filter(No)};return{current:()=>M.from(o.current()).filter(No),next:()=>r("next"),prev:()=>r("prev"),prev2:()=>r("prev2")}},ca=(e,t)=>{const n=t||(t=>e.isBlock(t)||Do(t)||Mo(t)),o=(e,t,n,r)=>{if(No(e)){const n=r(e,t,e.data);if(-1!==n)return M.some({container:e,offset:n})}return n().bind((e=>o(e.container,e.offset,n,r)))};return{backwards:(e,t,r,s)=>{const a=da(e,s,n);return o(e,t,(()=>a.prev().map((e=>({container:e,offset:e.length})))),r).getOrNull()},forwards:(e,t,r,s)=>{const a=da(e,s,n);return o(e,t,(()=>a.next().map((e=>({container:e,offset:0})))),r).getOrNull()}}},ua=Math.round,ma=e=>e?{left:ua(e.left),top:ua(e.top),bottom:ua(e.bottom),right:ua(e.right),width:ua(e.width),height:ua(e.height)}:{left:0,top:0,bottom:0,right:0,width:0,height:0},fa=(e,t)=>(e=ma(e),t||(e.left=e.left+e.width),e.right=e.left,e.width=0,e),ga=(e,t,n)=>e>=0&&e<=Math.min(t.height,n.height)/2,pa=(e,t)=>{const n=Math.min(t.height/2,e.height/2);return e.bottom-n<t.top||!(e.top>t.bottom)&&ga(t.top-e.bottom,e,t)},ha=(e,t)=>e.top>t.bottom||!(e.bottom<t.top)&&ga(t.bottom-e.top,e,t),ba=(e,t,n)=>{const o=Math.max(Math.min(t,e.left+e.width),e.left),r=Math.max(Math.min(n,e.top+e.height),e.top);return Math.sqrt((t-o)*(t-o)+(n-r)*(n-r))},va=e=>{const t=e.startContainer,n=e.startOffset;return t.hasChildNodes()&&e.endOffset===n+1?t.childNodes[n]:null},ya=(e,t)=>{if(yo(e)&&e.hasChildNodes()){const n=e.childNodes,o=((e,t,n)=>Math.min(Math.max(e,0),n))(t,0,n.length-1);return n[o]}return e},Ca=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]"),xa=e=>"string"==typeof e&&e.charCodeAt(0)>=768&&Ca.test(e),wa=yo,ka=Lr,Sa=xo("display","block table"),_a=xo("float","left right"),Ea=((...e)=>t=>{for(let n=0;n<e.length;n++)if(!e[n](t))return!1;return!0})(wa,ka,T(_a)),Na=T(xo("white-space","pre pre-line pre-wrap")),Ra=No,Aa=Do,Oa=Is.nodeIndex,Ta=(e,t)=>t<0&&yo(e)&&e.hasChildNodes()?void 0:ya(e,t),Ba=e=>"createRange"in e?e.createRange():Is.DOM.createRng(),Da=e=>e&&/[\r\n\t ]/.test(e),La=e=>!!e.setStart&&!!e.setEnd,Pa=e=>{const t=e.startContainer,n=e.startOffset;if(Da(e.toString())&&Na(t.parentNode)&&No(t)){const e=t.data;if(Da(e[n-1])||Da(e[n+1]))return!0}return!1},Ma=e=>0===e.left&&0===e.right&&0===e.top&&0===e.bottom,Ia=e=>{let t;const n=e.getClientRects();return t=n.length>0?ma(n[0]):ma(e.getBoundingClientRect()),!La(e)&&Aa(e)&&Ma(t)?(e=>{const t=e.ownerDocument,n=Ba(t),o=t.createTextNode(dr),r=e.parentNode;r.insertBefore(o,e),n.setStart(o,0),n.setEnd(o,1);const s=ma(n.getBoundingClientRect());return r.removeChild(o),s})(e):Ma(t)&&La(e)?(e=>{const t=e.startContainer,n=e.endContainer,o=e.startOffset,r=e.endOffset;if(t===n&&No(n)&&0===o&&1===r){const t=e.cloneRange();return t.setEndAfter(n),Ia(t)}return null})(e):t},Fa=(e,t)=>{const n=fa(e,t);return n.width=1,n.right=n.left+1,n},Ua=(e,t,n)=>{const o=()=>(n||(n=(e=>{const t=[],n=e=>{var n,o;0!==e.height&&(t.length>0&&(n=e,o=t[t.length-1],n.left===o.left&&n.top===o.top&&n.bottom===o.bottom&&n.right===o.right)||t.push(e))},o=(e,o)=>{const r=Ba(e.ownerDocument);if(o<e.data.length){if(xa(e.data[o]))return t;if(xa(e.data[o-1])&&(r.setStart(e,o),r.setEnd(e,o+1),!Pa(r)))return n(Fa(Ia(r),!1)),t}o>0&&(r.setStart(e,o-1),r.setEnd(e,o),Pa(r)||n(Fa(Ia(r),!1))),o<e.data.length&&(r.setStart(e,o),r.setEnd(e,o+1),Pa(r)||n(Fa(Ia(r),!0)))},r=e.container(),s=e.offset();if(Ra(r))return o(r,s),t;if(wa(r))if(e.isAtEnd()){const e=Ta(r,s);Ra(e)&&o(e,e.data.length),Ea(e)&&!Aa(e)&&n(Fa(Ia(e),!1))}else{const a=Ta(r,s);if(Ra(a)&&o(a,0),Ea(a)&&e.isAtEnd())return n(Fa(Ia(a),!1)),t;const i=Ta(e.container(),e.offset()-1);Ea(i)&&!Aa(i)&&(Sa(i)||Sa(a)||!Ea(a))&&n(Fa(Ia(i),!1)),Ea(a)&&n(Fa(Ia(a),!0))}return t})(Ua(e,t))),n);return{container:N(e),offset:N(t),toRange:()=>{const n=Ba(e.ownerDocument);return n.setStart(e,t),n.setEnd(e,t),n},getClientRects:o,isVisible:()=>o().length>0,isAtStart:()=>(Ra(e),0===t),isAtEnd:()=>Ra(e)?t>=e.data.length:t>=e.childNodes.length,isEqual:n=>n&&e===n.container()&&t===n.offset(),getNode:n=>Ta(e,n?t-1:t)}};Ua.fromRangeStart=e=>Ua(e.startContainer,e.startOffset),Ua.fromRangeEnd=e=>Ua(e.endContainer,e.endOffset),Ua.after=e=>Ua(e.parentNode,Oa(e)+1),Ua.before=e=>Ua(e.parentNode,Oa(e)),Ua.isAbove=(e,t)=>Lt(ie(t.getClientRects()),le(e.getClientRects()),pa).getOr(!1),Ua.isBelow=(e,t)=>Lt(le(t.getClientRects()),ie(e.getClientRects()),ha).getOr(!1),Ua.isAtStart=e=>!!e&&e.isAtStart(),Ua.isAtEnd=e=>!!e&&e.isAtEnd(),Ua.isTextPosition=e=>!!e&&No(e.container()),Ua.isElementPosition=e=>!1===Ua.isTextPosition(e);const za=(e,t)=>{No(t)&&0===t.data.length&&e.remove(t)},ja=(e,t,n)=>{Bo(n)?((e,t,n)=>{const o=M.from(n.firstChild),r=M.from(n.lastChild);t.insertNode(n),o.each((t=>za(e,t.previousSibling))),r.each((t=>za(e,t.nextSibling)))})(e,t,n):((e,t,n)=>{t.insertNode(n),za(e,n.previousSibling),za(e,n.nextSibling)})(e,t,n)},Va=No,Ha=ko,$a=Is.nodeIndex,qa=e=>{const t=e.parentNode;return Ha(t)?qa(t):t},Wa=e=>e?Oe(e.childNodes,((e,t)=>(Ha(t)&&"BR"!==t.nodeName?e=e.concat(Wa(t)):e.push(t),e)),[]):[],Ka=e=>t=>e===t,Ga=e=>{let t;return t=Va(e)?"text()":e.nodeName.toLowerCase(),t+"["+(e=>{let t,n;t=Wa(qa(e)),n=Te(t,Ka(e),e),t=t.slice(0,n+1);const o=Oe(t,((e,n,o)=>(Va(n)&&Va(t[o-1])&&e++,e)),0);return t=Re(t,Co([e.nodeName])),n=Te(t,Ka(e),e),n-o})(e)+"]"},Ya=(e,t)=>{let n,o,r,s,a,i=[];return n=t.container(),o=t.offset(),Va(n)?r=((e,t)=>{for(;(e=e.previousSibling)&&Va(e);)t+=e.data.length;return t})(n,o):(s=n.childNodes,o>=s.length?(r="after",o=s.length-1):r="before",n=s[o]),i.push(Ga(n)),a=((e,t,n)=>{const o=[];for(t=t.parentNode;t!==e;t=t.parentNode)o.push(t);return o})(e,n),a=Re(a,T(ko)),i=i.concat(Ne(a,(e=>Ga(e)))),i.reverse().join("/")+","+r},Xa=(e,t)=>{let n;if(!t)return null;const o=t.split(","),r=o[0].split("/");n=o.length>1?o[1]:"before";const s=Oe(r,((e,t)=>{const n=/([\w\-\(\)]+)\[([0-9]+)\]/.exec(t);return n?("text()"===n[1]&&(n[1]="#text"),((e,t,n)=>{let o=Wa(e);return o=Re(o,((e,t)=>!Va(e)||!Va(o[t-1]))),o=Re(o,Co([t])),o[n]})(e,n[1],parseInt(n[2],10))):null}),e);return s?Va(s)?((e,t)=>{let n,o=e,r=0;for(;Va(o);){if(n=o.data.length,t>=r&&t<=r+n){e=o,t-=r;break}if(!Va(o.nextSibling)){e=o,t=n;break}r+=n,o=o.nextSibling}return Va(e)&&t>e.data.length&&(t=e.data.length),Ua(e,t)})(s,parseInt(n,10)):(n="after"===n?$a(s)+1:$a(s),Ua(s.parentNode,n)):null},Qa=Mo,Ja=(e,t,n,o,r)=>{let s=o[r?"startContainer":"endContainer"],a=o[r?"startOffset":"endOffset"];const i=[];let l,d=0;const c=e.getRoot();for(No(s)?i.push(n?((e,t,n)=>{let o,r;for(r=e(t.data.slice(0,n)).length,o=t.previousSibling;o&&No(o);o=o.previousSibling)r+=e(o.data).length;return r})(t,s,a):a):(l=s.childNodes,a>=l.length&&l.length&&(d=1,a=Math.max(0,l.length-1)),i.push(e.nodeIndex(l[a],n)+d));s&&s!==c;s=s.parentNode)i.push(e.nodeIndex(s,n));return i},Za=(e,t,n)=>{let o=0;return Bt.each(e.select(t),(e=>{if("all"!==e.getAttribute("data-mce-bogus"))return e!==n&&void o++})),o},ei=(e,t)=>{let n,o,r;const s=t?"start":"end";n=e[s+"Container"],o=e[s+"Offset"],yo(n)&&"TR"===n.nodeName&&(r=n.childNodes,n=r[Math.min(t?o:o-1,r.length-1)],n&&(o=t?0:n.childNodes.length,e["set"+(t?"Start":"End")](n,o)))},ti=e=>(ei(e,!0),ei(e,!1),e),ni=(e,t)=>{let n;if(yo(e)&&(e=ya(e,t),Qa(e)))return e;if(vr(e)){if(No(e)&&hr(e)&&(e=e.parentNode),n=e.previousSibling,Qa(n))return n;if(n=e.nextSibling,Qa(n))return n}},oi=(e,t,n)=>{const o=n.getNode();let r=o?o.nodeName:null;const s=n.getRng();if(Qa(o)||"IMG"===r)return{name:r,index:Za(n.dom,r,o)};const a=(e=>ni(e.startContainer,e.startOffset)||ni(e.endContainer,e.endOffset))(s);return a?(r=a.tagName,{name:r,index:Za(n.dom,r,a)}):((e,t,n,o)=>{const r=t.dom,s={};return s.start=Ja(r,e,n,o,!0),t.isCollapsed()||(s.end=Ja(r,e,n,o,!1)),_r(o)&&(s.isFakeCaret=!0),s})(e,n,t,s)},ri=(e,t,n)=>{const o={"data-mce-type":"bookmark",id:t,style:"overflow:hidden;line-height:0px"};return n?e.create("span",o,"&#xFEFF;"):e.create("span",o)},si=(e,t)=>{const n=e.dom;let o=e.getRng();const r=n.uniqueId(),s=e.isCollapsed(),a=e.getNode(),i=a.nodeName;if("IMG"===i)return{name:i,index:Za(n,i,a)};const l=ti(o.cloneRange());if(!s){l.collapse(!1);const e=ri(n,r+"_end",t);ja(n,l,e)}o=ti(o),o.collapse(!0);const d=ri(n,r+"_start",t);return ja(n,o,d),e.moveToBookmark({id:r,keep:!0}),{id:r}},ai=O(oi,R,!0),ii=e=>{const t=t=>t(e),n=N(e),o=()=>r,r={tag:!0,inner:e,fold:(t,n)=>n(e),isValue:P,isError:L,map:t=>di.value(t(e)),mapError:o,bind:t,exists:t,forall:t,getOr:n,or:o,getOrThunk:n,orThunk:o,getOrDie:n,each:t=>{t(e)},toOptional:()=>M.some(e)};return r},li=e=>{const t=()=>n,n={tag:!1,inner:e,fold:(t,n)=>t(e),isValue:L,isError:P,map:t,mapError:t=>di.error(t(e)),bind:t,exists:L,forall:P,getOr:R,or:R,getOrThunk:B,orThunk:B,getOrDie:(o=String(e),()=>{throw new Error(o)}),each:S,toOptional:M.none};var o;return n},di={value:ii,error:li,fromOption:(e,t)=>e.fold((()=>li(t)),ii)},ci=e=>{if(!p(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],n={};return $(e,((o,r)=>{const s=ue(o);if(1!==s.length)throw new Error("one and only one name per case");const a=s[0],i=o[a];if(void 0!==n[a])throw new Error("duplicate key detected:"+a);if("cata"===a)throw new Error("cannot have a case named cata (sorry)");if(!p(i))throw new Error("case arguments must be an array");t.push(a),n[a]=(...n)=>{const o=n.length;if(o!==i.length)throw new Error("Wrong number of arguments to case "+a+". Expected "+i.length+" ("+i+"), got "+o);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[r].apply(null,n)},match:e=>{const o=ue(e);if(t.length!==o.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+o.join(","));if(!te(t,(e=>j(o,e))))throw new Error("Not all branches were specified when using match. Specified: "+o.join(", ")+"\nRequired: "+t.join(", "));return e[a].apply(null,n)},log:e=>{console.log(e,{constructors:t,constructor:a,params:n})}}}})),n};ci([{bothErrors:["error1","error2"]},{firstError:["error1","value2"]},{secondError:["value1","error2"]},{bothValues:["value1","value2"]}]);const ui=e=>"inline-command"===e.type||"inline-format"===e.type,mi=e=>"block-command"===e.type||"block-format"===e.type,fi=e=>{const t=t=>di.error({message:t,pattern:e}),n=(n,o,r)=>{if(void 0!==e.format){let r;if(p(e.format)){if(!te(e.format,m))return t(n+" pattern has non-string items in the `format` array");r=e.format}else{if(!m(e.format))return t(n+" pattern has non-string `format` parameter");r=[e.format]}return di.value(o(r))}return void 0!==e.cmd?m(e.cmd)?di.value(r(e.cmd,e.value)):t(n+" pattern has non-string `cmd` parameter"):t(n+" pattern is missing both `format` and `cmd` parameters")};if(!f(e))return t("Raw pattern is not an object");if(!m(e.start))return t("Raw pattern is missing `start` parameter");if(void 0!==e.end){if(!m(e.end))return t("Inline pattern has non-string `end` parameter");if(0===e.start.length&&0===e.end.length)return t("Inline pattern has empty `start` and `end` parameters");let o=e.start,r=e.end;return 0===r.length&&(r=o,o=""),n("Inline",(e=>({type:"inline-format",start:o,end:r,format:e})),((e,t)=>({type:"inline-command",start:o,end:r,cmd:e,value:t})))}return void 0!==e.replacement?m(e.replacement)?0===e.start.length?t("Replacement pattern has empty `start` parameter"):di.value({type:"inline-command",start:"",end:e.start,cmd:"mceInsertContent",value:e.replacement}):t("Replacement pattern has non-string `replacement` parameter"):0===e.start.length?t("Block pattern has empty `start` parameter"):n("Block",(t=>({type:"block-format",start:e.start,format:t[0]})),((t,n)=>({type:"block-command",start:e.start,cmd:t,value:n})))},gi=e=>(e=>se(e,((e,t)=>e.start.length===t.start.length?0:e.start.length>t.start.length?-1:1)))(K(e,mi)),pi=e=>K(e,ui),hi=e=>{const t=(e=>{const t=[],n=[];return $(e,(e=>{e.fold((e=>{t.push(e)}),(e=>{n.push(e)}))})),{errors:t,values:n}})(H(e,fi));return $(t.errors,(e=>console.error(e.message,e.pattern))),t.values},bi=Ct().deviceType,vi=bi.isTouch(),yi=Is.DOM,Ci=e=>u(e,RegExp),xi=e=>t=>t.options.get(e),wi=e=>m(e)||f(e),ki=(e,t="")=>n=>{const o=m(n);if(o){if(-1!==n.indexOf("=")){const r=(e=>{const t=e.indexOf("=")>0?e.split(/[;,](?![^=;,]*(?:[;,]|$))/):e.split(",");return Y(t,((e,t)=>{const n=t.split("="),o=n[0],r=n.length>1?n[1]:o;return e[He(o)]=He(r),e}),{})})(n);return{value:xe(r,e.id).getOr(t),valid:o}}return{value:n,valid:o}}return{valid:!1,message:"Must be a string."}},Si=xi("iframe_attrs"),_i=xi("doctype"),Ei=xi("document_base_url"),Ni=xi("body_id"),Ri=xi("body_class"),Ai=xi("content_security_policy"),Oi=xi("br_in_pre"),Ti=xi("forced_root_block"),Bi=xi("forced_root_block_attrs"),Di=xi("br_newline_selector"),Li=xi("no_newline_selector"),Pi=xi("keep_styles"),Mi=xi("end_container_on_empty_block"),Ii=xi("automatic_uploads"),Fi=xi("images_reuse_filename"),Ui=xi("images_replace_blob_uris"),zi=xi("icons"),ji=xi("icons_url"),Vi=xi("images_upload_url"),Hi=xi("images_upload_base_path"),$i=xi("images_upload_credentials"),qi=xi("images_upload_handler"),Wi=xi("content_css_cors"),Ki=xi("referrer_policy"),Gi=xi("language"),Yi=xi("language_url"),Xi=xi("indent_use_margin"),Qi=xi("indentation"),Ji=xi("content_css"),Zi=xi("content_style"),el=xi("font_css"),tl=xi("directionality"),nl=xi("inline_boundaries_selector"),ol=xi("object_resizing"),rl=xi("resize_img_proportional"),sl=xi("placeholder"),al=xi("event_root"),il=xi("service_message"),ll=xi("theme"),dl=xi("theme_url"),cl=xi("model"),ul=xi("model_url"),ml=xi("inline_boundaries"),fl=xi("formats"),gl=xi("preview_styles"),pl=xi("format_empty_lines"),hl=xi("custom_ui_selector"),bl=xi("inline"),vl=xi("hidden_input"),yl=xi("submit_patch"),Cl=xi("add_form_submit_trigger"),xl=xi("add_unload_trigger"),wl=xi("custom_undo_redo_levels"),kl=xi("disable_nodechange"),Sl=xi("readonly"),_l=xi("content_css_cors"),El=xi("plugins"),Nl=xi("external_plugins"),Rl=xi("block_unsupported_drop"),Al=xi("visual"),Ol=xi("visual_table_class"),Tl=xi("visual_anchor_class"),Bl=xi("iframe_aria_text"),Dl=xi("setup"),Ll=xi("init_instance_callback"),Pl=xi("urlconverter_callback"),Ml=xi("auto_focus"),Il=xi("browser_spellcheck"),Fl=xi("protect"),Ul=xi("paste_block_drop"),zl=xi("paste_data_images"),jl=xi("paste_preprocess"),Vl=xi("paste_postprocess"),Hl=xi("paste_webkit_styles"),$l=xi("paste_remove_styles_if_webkit"),ql=xi("paste_merge_formats"),Wl=xi("smart_paste"),Kl=xi("paste_as_text"),Gl=xi("paste_tab_spaces"),Yl=xi("allow_html_data_urls"),Xl=xi("text_patterns"),Ql=xi("noneditable_class"),Jl=xi("editable_class"),Zl=xi("noneditable_regexp"),ed=e=>Bt.explode(e.options.get("images_file_types")),td=xi("table_tab_navigation"),nd=yo,od=No,rd=e=>{const t=e.parentNode;t&&t.removeChild(e)},sd=e=>{const t=fr(e);return{count:e.length-t.length,text:t}},ad=e=>{let t;for(;-1!==(t=e.data.lastIndexOf(ur));)e.deleteData(t,1)},id=(e,t)=>(dd(e),t),ld=(e,t)=>Ua.isTextPosition(t)?((e,t)=>od(e)&&t.container()===e?((e,t)=>{const n=sd(e.data.substr(0,t.offset())),o=sd(e.data.substr(t.offset()));return(n.text+o.text).length>0?(ad(e),Ua(e,t.offset()-n.count)):t})(e,t):id(e,t))(e,t):((e,t)=>t.container()===e.parentNode?((e,t)=>{const n=t.container(),o=((e,t)=>{const n=z(e,t);return-1===n?M.none():M.some(n)})(de(n.childNodes),e).map((e=>e<t.offset()?Ua(n,t.offset()-1):t)).getOr(t);return dd(e),o})(e,t):id(e,t))(e,t),dd=e=>{nd(e)&&vr(e)&&(yr(e)?e.removeAttribute("data-mce-caret"):rd(e)),od(e)&&(ad(e),0===e.data.length&&rd(e))},cd=Mo,ud=Fo,md=Io,fd=(e,t,n)=>{const o=fa(t.getBoundingClientRect(),n);let r,s;if("BODY"===e.tagName){const t=e.ownerDocument.documentElement;r=e.scrollLeft||t.scrollLeft,s=e.scrollTop||t.scrollTop}else{const t=e.getBoundingClientRect();r=e.scrollLeft-t.left,s=e.scrollTop-t.top}o.left+=r,o.right+=r,o.top+=s,o.bottom+=s,o.width=1;let a=t.offsetWidth-t.clientWidth;return a>0&&(n&&(a*=-1),o.left+=a,o.right+=a),o},gd=(e,t,n,o)=>{const r=Ws();let s,a;const i=Ti(e),l=e.dom,d=()=>{(e=>{const t=Xs(mn(e),"*[contentEditable=false],video,audio,embed,object");for(let e=0;e<t.length;e++){const n=t[e].dom;let o=n.previousSibling;if(kr(o)){const e=o.data;1===e.length?o.parentNode.removeChild(o):o.deleteData(e.length-1,1)}o=n.nextSibling,wr(o)&&(1===o.data.length?o.parentNode.removeChild(o):o.deleteData(0,1))}})(t),a&&(dd(a),a=null),r.on((e=>{l.remove(e.caret),r.clear()})),s&&(clearInterval(s),s=void 0)};return{show:(e,c)=>{let u;if(d(),md(c))return null;if(!n(c))return a=((e,t)=>{const n=e.ownerDocument.createTextNode(ur),o=e.parentNode;if(t){const t=e.previousSibling;if(pr(t)){if(vr(t))return t;if(kr(t))return t.splitText(t.data.length-1)}o.insertBefore(n,e)}else{const t=e.nextSibling;if(pr(t)){if(vr(t))return t;if(wr(t))return t.splitText(1),t}e.nextSibling?o.insertBefore(n,e.nextSibling):o.appendChild(n)}return n})(c,e),u=c.ownerDocument.createRange(),hd(a.nextSibling)?(u.setStart(a,0),u.setEnd(a,0)):(u.setStart(a,1),u.setEnd(a,1)),u;{a=((e,t,n)=>{const o=t.ownerDocument.createElement(e);o.setAttribute("data-mce-caret",n?"before":"after"),o.setAttribute("data-mce-bogus","all"),o.appendChild((()=>{const e=document.createElement("br");return e.setAttribute("data-mce-bogus","1"),e})());const r=t.parentNode;return n?r.insertBefore(o,t):t.nextSibling?r.insertBefore(o,t.nextSibling):r.appendChild(o),o})(i,c,e);const n=fd(t,c,e);l.setStyle(a,"top",n.top);const d=l.create("div",{class:"mce-visual-caret","data-mce-bogus":"all"});l.setStyles(d,{...n}),l.add(t,d),r.set({caret:d,element:c,before:e}),e&&l.addClass(d,"mce-visual-caret-before"),s=setInterval((()=>{r.on((e=>{o()?l.toggleClass(e.caret,"mce-visual-caret-hidden"):l.addClass(e.caret,"mce-visual-caret-hidden")}))}),500),u=c.ownerDocument.createRange(),u.setStart(a,0),u.setEnd(a,0)}return u},hide:d,getCss:()=>".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:()=>{r.on((e=>{const n=fd(t,e.element,e.before);l.setStyles(e.caret,{...n})}))},destroy:()=>clearInterval(s)}},pd=()=>Nt.browser.isFirefox(),hd=e=>cd(e)||ud(e),bd=e=>hd(e)||So(e)&&pd(),vd=Po,yd=Mo,Cd=Fo,xd=xo("display","block table table-cell table-caption list-item"),wd=vr,kd=hr,Sd=yo,_d=Lr,Ed=e=>e>0,Nd=e=>e<0,Rd=(e,t)=>{let n;for(;n=e(t);)if(!kd(n))return n;return null},Ad=(e,t,n,o,r)=>{const s=new Xo(e,o),a=yd(e)||kd(e);if(Nd(t)){if(a&&n(e=Rd(s.prev.bind(s),!0)))return e;for(;e=Rd(s.prev.bind(s),r);)if(n(e))return e}if(Ed(t)){if(a&&n(e=Rd(s.next.bind(s),!0)))return e;for(;e=Rd(s.next.bind(s),r);)if(n(e))return e}return null},Od=(e,t)=>{for(;e&&e!==t;){if(xd(e))return e;e=e.parentNode}return null},Td=(e,t,n)=>Od(e.container(),n)===Od(t.container(),n),Bd=(e,t)=>{if(!t)return null;const n=t.container(),o=t.offset();return Sd(n)?n.childNodes[o+e]:null},Dd=(e,t)=>{const n=t.ownerDocument.createRange();return e?(n.setStartBefore(t),n.setEndBefore(t)):(n.setStartAfter(t),n.setEndAfter(t)),n},Ld=(e,t,n)=>Od(t,e)===Od(n,e),Pd=(e,t,n)=>{const o=e?"previousSibling":"nextSibling";for(;n&&n!==t;){let e=n[o];if(wd(e)&&(e=e[o]),yd(e)||Cd(e)){if(Ld(t,e,n))return e;break}if(_d(e))break;n=n.parentNode}return null},Md=O(Dd,!0),Id=O(Dd,!1),Fd=(e,t,n)=>{let o;const r=O(Pd,!0,t),s=O(Pd,!1,t);let a=n.startContainer;const i=n.startOffset;if(hr(a)){Sd(a)||(a=a.parentNode);const e=a.getAttribute("data-mce-caret");if("before"===e&&(o=a.nextSibling,bd(o)))return Md(o);if("after"===e&&(o=a.previousSibling,bd(o)))return Id(o)}if(!n.collapsed)return n;if(No(a)){if(wd(a)){if(1===e){if(o=s(a),o)return Md(o);if(o=r(a),o)return Id(o)}if(-1===e){if(o=r(a),o)return Id(o);if(o=s(a),o)return Md(o)}return n}if(kr(a)&&i>=a.data.length-1)return 1===e&&(o=s(a),o)?Md(o):n;if(wr(a)&&i<=1)return-1===e&&(o=r(a),o)?Id(o):n;if(i===a.data.length)return o=s(a),o?Md(o):n;if(0===i)return o=r(a),o?Id(o):n}return n},Ud=(e,t)=>M.from(Bd(e?0:-1,t)).filter(yd),zd=(e,t,n)=>{const o=Fd(e,t,n);return-1===e?Ua.fromRangeStart(o):Ua.fromRangeEnd(o)},jd=e=>M.from(e.getNode()).map(mn),Vd=(e,t)=>{for(;t=e(t);)if(t.isVisible())return t;return t},Hd=(e,t)=>{const n=Td(e,t);return!(n||!Do(e.getNode()))||n};var $d;!function(e){e[e.Backwards=-1]="Backwards",e[e.Forwards=1]="Forwards"}($d||($d={}));const qd=Mo,Wd=No,Kd=yo,Gd=Do,Yd=Lr,Xd=e=>Tr(e)||(e=>!!Pr(e)&&!0!==Y(de(e.getElementsByTagName("*")),((e,t)=>e||Er(t)),!1))(e),Qd=Mr,Jd=(e,t)=>e.hasChildNodes()&&t<e.childNodes.length?e.childNodes[t]:null,Zd=(e,t)=>{if(Ed(e)){if(Yd(t.previousSibling)&&!Wd(t.previousSibling))return Ua.before(t);if(Wd(t))return Ua(t,0)}if(Nd(e)){if(Yd(t.nextSibling)&&!Wd(t.nextSibling))return Ua.after(t);if(Wd(t))return Ua(t,t.data.length)}return Nd(e)?Gd(t)?Ua.before(t):Ua.after(t):Ua.before(t)},ec=(e,t,n)=>{let o,r,s,a;if(!Kd(n)||!t)return null;if(t.isEqual(Ua.after(n))&&n.lastChild){if(a=Ua.after(n.lastChild),Nd(e)&&Yd(n.lastChild)&&Kd(n.lastChild))return Gd(n.lastChild)?Ua.before(n.lastChild):a}else a=t;const i=a.container();let l=a.offset();if(Wd(i)){if(Nd(e)&&l>0)return Ua(i,--l);if(Ed(e)&&l<i.length)return Ua(i,++l);o=i}else{if(Nd(e)&&l>0&&(r=Jd(i,l-1),Yd(r)))return!Xd(r)&&(s=Ad(r,e,Qd,r),s)?Wd(s)?Ua(s,s.data.length):Ua.after(s):Wd(r)?Ua(r,r.data.length):Ua.before(r);if(Ed(e)&&l<i.childNodes.length&&(r=Jd(i,l),Yd(r)))return Gd(r)?((e,t)=>{const n=t.nextSibling;return n&&Yd(n)?Wd(n)?Ua(n,0):Ua.before(n):ec($d.Forwards,Ua.after(t),e)})(n,r):!Xd(r)&&(s=Ad(r,e,Qd,r),s)?Wd(s)?Ua(s,0):Ua.before(s):Wd(r)?Ua(r,0):Ua.after(r);o=r||a.getNode()}if((Ed(e)&&a.isAtEnd()||Nd(e)&&a.isAtStart())&&(o=Ad(o,e,P,n,!0),Qd(o,n)))return Zd(e,o);r=Ad(o,e,Qd,n);const d=Be(K(((e,t)=>{const n=[];for(;e&&e!==t;)n.push(e),e=e.parentNode;return n})(i,n),qd));return!d||r&&d.contains(r)?r?Zd(e,r):null:(a=Ed(e)?Ua.after(d):Ua.before(d),a)},tc=e=>({next:t=>ec($d.Forwards,t,e),prev:t=>ec($d.Backwards,t,e)}),nc=e=>Ua.isTextPosition(e)?0===e.offset():Lr(e.getNode()),oc=e=>{if(Ua.isTextPosition(e)){const t=e.container();return e.offset()===t.data.length}return Lr(e.getNode(!0))},rc=(e,t)=>!Ua.isTextPosition(e)&&!Ua.isTextPosition(t)&&e.getNode()===t.getNode(!0),sc=(e,t,n)=>{const o=tc(t);return M.from(e?o.next(n):o.prev(n))},ac=(e,t,n)=>sc(e,t,n).bind((o=>Td(n,o,t)&&((e,t,n)=>{return e?!rc(t,n)&&(o=t,!(!Ua.isTextPosition(o)&&Do(o.getNode())))&&oc(t)&&nc(n):!rc(n,t)&&nc(t)&&oc(n);var o})(e,n,o)?sc(e,t,o):M.some(o))),ic=(e,t,n,o)=>ac(e,t,n).bind((n=>o(n)?ic(e,t,n,o):M.some(n))),lc=(e,t)=>{const n=e?t.firstChild:t.lastChild;return No(n)?M.some(Ua(n,e?0:n.data.length)):n?Lr(n)?M.some(e?Ua.before(n):Do(o=n)?Ua.before(o):Ua.after(o)):((e,t,n)=>{const o=e?Ua.before(n):Ua.after(n);return sc(e,t,o)})(e,t,n):M.none();var o},dc=O(sc,!0),cc=O(sc,!1),uc=O(lc,!0),mc=O(lc,!1),fc="_mce_caret",gc=e=>yo(e)&&e.id===fc,pc=(e,t)=>{for(;t&&t!==e;){if(t.id===fc)return t;t=t.parentNode}return null},hc=e=>Bt.isArray(e.start),bc=(e,t)=>(yo(t)&&e.isBlock(t)&&!t.innerHTML&&(t.innerHTML='<br data-mce-bogus="1" />'),t),vc=(e,t)=>mc(e).fold(L,(e=>(t.setStart(e.container(),e.offset()),t.setEnd(e.container(),e.offset()),!0))),yc=(e,t,n)=>!(!(e=>!1===e.hasChildNodes())(t)||!pc(e,t)||(((e,t)=>{const n=e.ownerDocument.createTextNode(ur);e.appendChild(n),t.setStart(n,0),t.setEnd(n,0)})(t,n),0)),Cc=(e,t,n,o)=>{const r=n[t?"start":"end"];let s,a,i,l;const d=e.getRoot();if(r){for(i=r[0],a=d,s=r.length-1;s>=1;s--){if(l=a.childNodes,yc(d,a,o))return!0;if(r[s]>l.length-1)return!!yc(d,a,o)||vc(a,o);a=l[r[s]]}3===a.nodeType&&(i=Math.min(r[0],a.nodeValue.length)),1===a.nodeType&&(i=Math.min(r[0],a.childNodes.length)),t?o.setStart(a,i):o.setEnd(a,i)}return!0},xc=e=>No(e)&&e.data.length>0,wc=(e,t,n)=>{let o,r,s,a,i=e.get(n.id+"_"+t);const l=n.keep;let d,c;if(i){if(o=i.parentNode,"start"===t?(l?i.hasChildNodes()?(o=i.firstChild,r=1):xc(i.nextSibling)?(o=i.nextSibling,r=0):xc(i.previousSibling)?(o=i.previousSibling,r=i.previousSibling.data.length):(o=i.parentNode,r=e.nodeIndex(i)+1):r=e.nodeIndex(i),d=o,c=r):(l?i.hasChildNodes()?(o=i.firstChild,r=1):xc(i.previousSibling)?(o=i.previousSibling,r=i.previousSibling.data.length):(o=i.parentNode,r=e.nodeIndex(i)):r=e.nodeIndex(i),d=o,c=r),!l){for(a=i.previousSibling,s=i.nextSibling,Bt.each(Bt.grep(i.childNodes),(e=>{No(e)&&(e.nodeValue=e.nodeValue.replace(/\uFEFF/g,""))}));i=e.get(n.id+"_"+t);)e.remove(i,!0);a&&s&&a.nodeType===s.nodeType&&No(a)&&!Nt.browser.isOpera()&&(r=a.nodeValue.length,a.appendData(s.nodeValue),e.remove(s),d=a,c=r)}return M.some(Ua(d,c))}return M.none()},kc=(e,t,n)=>((e,t,n)=>2===t?oi(fr,n,e):3===t?(e=>{const t=e.getRng();return{start:Ya(e.dom.getRoot(),Ua.fromRangeStart(t)),end:Ya(e.dom.getRoot(),Ua.fromRangeEnd(t))}})(e):t?(e=>({rng:e.getRng()}))(e):si(e,!1))(e,t,n),Sc=(e,t)=>{((e,t)=>{const n=e.dom;if(t){if(hc(t))return((e,t)=>{const n=e.createRng();return Cc(e,!0,t,n)&&Cc(e,!1,t,n)?M.some(n):M.none()})(n,t);if((e=>m(e.start))(t))return M.some(((e,t)=>{let n;const o=e.createRng();return n=Xa(e.getRoot(),t.start),o.setStart(n.container(),n.offset()),n=Xa(e.getRoot(),t.end),o.setEnd(n.container(),n.offset()),o})(n,t));if((e=>we(e,"id"))(t))return((e,t)=>{const n=wc(e,"start",t),o=wc(e,"end",t);return Lt(n,o.or(n),((t,n)=>{const o=e.createRng();return o.setStart(bc(e,t.container()),t.offset()),o.setEnd(bc(e,n.container()),n.offset()),o}))})(n,t);if((e=>we(e,"name"))(t))return((e,t)=>M.from(e.select(t.name)[t.index]).map((t=>{const n=e.createRng();return n.selectNode(t),n})))(n,t);if((e=>we(e,"rng"))(t))return M.some(t.rng)}return M.none()})(e,t).each((t=>{e.setRng(t)}))},_c=e=>yo(e)&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type"),Ec=(dr,e=>"\xa0"===e);const Nc=e=>""!==e&&-1!==" \f\n\r\t\v".indexOf(e),Rc=e=>!Nc(e)&&!Ec(e)&&!cr(e),Ac=e=>{const t=e.toString(16);return(1===t.length?"0"+t:t).toUpperCase()},Oc=e=>(e=>({value:e}))(Ac(e.red)+Ac(e.green)+Ac(e.blue)),Tc=/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/i,Bc=/^\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?(?:\.\d+)?)\s*\)\s*$/i,Dc=(e,t,n,o)=>({red:e,green:t,blue:n,alpha:o}),Lc=(e,t,n,o)=>{const r=parseInt(e,10),s=parseInt(t,10),a=parseInt(n,10),i=parseFloat(o);return Dc(r,s,a,i)},Pc=e=>(e=>{if("transparent"===e)return M.some(Dc(0,0,0,0));const t=Tc.exec(e);if(null!==t)return M.some(Lc(t[1],t[2],t[3],"1"));const n=Bc.exec(e);return null!==n?M.some(Lc(n[1],n[2],n[3],n[4])):M.none()})(e).map(Oc).map((e=>"#"+e.value)).getOr(e),Mc=e=>!!e.nodeType,Ic=(e,t,n)=>{const o=n.startOffset;let r=n.startContainer;var s;if((r!==n.endContainer||!(s=r.childNodes[o])||!/^(IMG)$/.test(s.nodeName))&&yo(r)){const s=r.childNodes;let a;o<s.length?(r=s[o],a=new Xo(r,e.getParent(r,e.isBlock))):(r=s[s.length-1],a=new Xo(r,e.getParent(r,e.isBlock)),a.next(!0));for(let e=a.current();e;e=a.next())if(No(e)&&!jc(e))return n.setStart(e,0),void t.setRng(n)}},Fc=(e,t,n)=>{if(e){const o=t?"nextSibling":"previousSibling";for(e=n?e:e[o];e;e=e[o])if(yo(e)||!jc(e))return e}},Uc=(e,t)=>(Mc(t)&&(t=t.nodeName),!!e.schema.getTextBlockElements()[t.toLowerCase()]),zc=(e,t,n)=>e.schema.isValidChild(t,n),jc=(e,t=!1)=>{if(C(e)&&No(e)){const n=t?e.data.replace(/ /g,"\xa0"):e.data;return Fr(n)}return!1},Vc=(e,t)=>(x(e)?e=e(t):C(t)&&(e=e.replace(/%(\w+)/g,((e,n)=>t[n]||e))),e),Hc=(e,t)=>(t=t||"",e=""+((e=e||"").nodeName||e),t=""+(t.nodeName||t),e.toLowerCase()===t.toLowerCase()),$c=(e,t)=>("color"!==t&&"backgroundColor"!==t||(e=Pc(e)),"fontWeight"===t&&700===e&&(e="bold"),"fontFamily"===t&&(e=e.replace(/[\'\"]/g,"").replace(/,\s+/g,",")),""+e),qc=(e,t,n)=>$c(e.getStyle(t,n),n),Wc=(e,t)=>{let n;return e.getParent(t,(t=>(n=e.getStyle(t,"text-decoration"),n&&"none"!==n))),n},Kc=(e,t,n)=>e.getParents(t,n,e.getRoot()),Gc=e=>ke(e,"block"),Yc=e=>ke(e,"selector"),Xc=e=>ke(e,"inline"),Qc=e=>Yc(e)&&!1!==e.expand&&!Xc(e),Jc=_c,Zc=Kc,eu=jc,tu=Uc,nu=(e,t)=>{let n=t;for(;n;){if(yo(n)&&e.getContentEditable(n))return"false"===e.getContentEditable(n)?n:t;n=n.parentNode}return t},ou=(e,t,n,o)=>{const r=t.data;for(let t=n;e?t>=0:t<r.length;e?t--:t++)if(o(r.charAt(t)))return e?t+1:t;return-1},ru=(e,t,n)=>ou(e,t,n,(e=>Ec(e)||Nc(e))),su=(e,t,n)=>ou(e,t,n,Rc),au=(e,t,n,o,r,s)=>{let a;const i=e.getParent(n,e.isBlock)||t,l=(t,n,o)=>{const s=ca(e),l=r?s.backwards:s.forwards;return M.from(l(t,n,((e,t)=>Jc(e.parentNode)?-1:(a=e,o(r,e,t))),i))};return l(n,o,ru).bind((e=>s?l(e.container,e.offset+(r?-1:0),su):M.some(e))).orThunk((()=>a?M.some({container:a,offset:r?0:a.length}):M.none()))},iu=(e,t,n,o,r)=>{No(o)&&Ke(o.data)&&o[r]&&(o=o[r]);const s=Zc(e,o);for(let o=0;o<s.length;o++)for(let r=0;r<t.length;r++){const a=t[r];if((!C(a.collapsed)||a.collapsed===n.collapsed)&&Yc(a)&&e.is(s[o],a.selector))return s[o]}return o},lu=(e,t,n,o)=>{let r=n;const s=e.dom,a=s.getRoot(),i=t[0];if(Gc(i)&&(r=i.wrapper?null:s.getParent(n,i.block,a)),!r){const t=s.getParent(n,"LI,TD,TH");r=s.getParent(No(n)?n.parentNode:n,(t=>t!==a&&tu(e,t)),t)}if(r&&Gc(i)&&i.wrapper&&(r=Zc(s,r,"ul,ol").reverse()[0]||r),!r)for(r=n;r[o]&&!s.isBlock(r[o])&&(r=r[o],!Hc(r,"br")););return r||n},du=(e,t,n,o)=>{const r=n.parentNode;return!C(n[o])&&(!(r!==t&&!y(r)&&!e.isBlock(r))||du(e,t,r,o))},cu=(e,t,n,o,r)=>{let s=n;const a=r?"previousSibling":"nextSibling",i=e.getRoot();if(No(n)&&!eu(n)&&(r?o>0:o<n.data.length))return n;for(;;){if(!t[0].block_expand&&e.isBlock(s))return s;for(let t=s[a];t;t=t[a]){const n=No(t)&&!du(e,i,t,a);if(!Jc(t)&&(!Do(l=t)||!l.getAttribute("data-mce-bogus")||l.nextSibling)&&!eu(t,n))return s}if(s===i||s.parentNode===i){n=s;break}s=s.parentNode}var l;return n},uu=e=>Jc(e.parentNode)||Jc(e),mu=(e,t,n,o=!1)=>{let{startContainer:r,startOffset:s,endContainer:a,endOffset:i}=t;const l=e.dom,d=n[0];return yo(r)&&r.hasChildNodes()&&(r=ya(r,s),No(r)&&(s=0)),yo(a)&&a.hasChildNodes()&&(a=ya(a,t.collapsed?i:i-1),No(a)&&(i=a.nodeValue.length)),r=nu(l,r),a=nu(l,a),uu(r)&&(r=Jc(r)?r:r.parentNode,r=t.collapsed?r.previousSibling||r:r.nextSibling||r,No(r)&&(s=t.collapsed?r.length:0)),uu(a)&&(a=Jc(a)?a:a.parentNode,a=t.collapsed?a.nextSibling||a:a.previousSibling||a,No(a)&&(i=t.collapsed?0:a.length)),t.collapsed&&(au(l,e.getBody(),r,s,!0,o).each((({container:e,offset:t})=>{r=e,s=t})),au(l,e.getBody(),a,i,!1,o).each((({container:e,offset:t})=>{a=e,i=t}))),(Xc(d)||d.block_expand)&&(Xc(d)&&No(r)&&0!==s||(r=cu(l,n,r,s,!0)),Xc(d)&&No(a)&&i!==a.nodeValue.length||(a=cu(l,n,a,i,!1))),Qc(d)&&(r=iu(l,n,t,r,"previousSibling"),a=iu(l,n,t,a,"nextSibling")),(Gc(d)||Yc(d))&&(r=lu(e,n,r,"previousSibling"),a=lu(e,n,a,"nextSibling"),Gc(d)&&(l.isBlock(r)||(r=cu(l,n,r,s,!0)),l.isBlock(a)||(a=cu(l,n,a,i,!1)))),yo(r)&&(s=l.nodeIndex(r),r=r.parentNode),yo(a)&&(i=l.nodeIndex(a)+1,a=a.parentNode),{startContainer:r,startOffset:s,endContainer:a,endOffset:i}},fu=(e,t,n)=>{const o=t.startOffset,r=ya(t.startContainer,o),s=t.endOffset,a=ya(t.endContainer,s-1),i=e=>{const t=e[0];No(t)&&t===r&&o>=t.data.length&&e.splice(0,1);const n=e[e.length-1];return 0===s&&e.length>0&&n===a&&No(n)&&e.splice(e.length-1,1),e},l=(e,t,n)=>{const o=[];for(;e&&e!==n;e=e[t])o.push(e);return o},d=(t,n)=>e.getParent(t,(e=>e.parentNode===n),n),c=(e,t,o)=>{const r=o?"nextSibling":"previousSibling";for(let s=e,a=s.parentNode;s&&s!==t;s=a){a=s.parentNode;const t=l(s===e?s:s[r],r);t.length&&(o||t.reverse(),n(i(t)))}};if(r===a)return n(i([r]));const u=e.findCommonAncestor(r,a);if(e.isChildOf(r,a))return c(r,u,!0);if(e.isChildOf(a,r))return c(a,u);const m=d(r,u)||r,f=d(a,u)||a;c(r,m,!0);const g=l(m===r?m:m.nextSibling,"nextSibling",f===a?f.nextSibling:f);g.length&&n(i(g)),c(a,f)},gu=e=>{const t=[];if(e)for(let n=0;n<e.rangeCount;n++)t.push(e.getRangeAt(n));return t},pu=(e,t)=>{const n=Xs(t,"td[data-mce-selected],th[data-mce-selected]");return n.length>0?n:(e=>K((e=>ee(e,(e=>{const t=va(e);return t?[mn(t)]:[]})))(e),ar))(e)},hu=e=>pu(gu(e.selection.getSel()),mn(e.getBody())),bu=(e,t)=>qo(e,"table",t),vu=e=>An(e).fold(N([e]),(t=>[e].concat(vu(t)))),yu=e=>On(e).fold(N([e]),(t=>"br"===Mt(t)?kn(t).map((t=>[e].concat(yu(t)))).getOr([]):[e].concat(yu(t)))),Cu=(e,t)=>Lt((e=>{const t=e.startContainer,n=e.startOffset;return No(t)?0===n?M.some(mn(t)):M.none():M.from(t.childNodes[n]).map(mn)})(t),(e=>{const t=e.endContainer,n=e.endOffset;return No(t)?n===t.data.length?M.some(mn(t)):M.none():M.from(t.childNodes[n-1]).map(mn)})(t),((t,n)=>{const o=Q(vu(e),O(bn,t)),r=Q(yu(e),O(bn,n));return o.isSome()&&r.isSome()})).getOr(!1),xu=(e,t,n,o)=>{const r=n,s=new Xo(n,r),a=ve(e.schema.getMoveCaretBeforeOnEnterElements(),((e,t)=>!j(["td","th","table"],t.toLowerCase())));do{if(No(n)&&0!==Bt.trim(n.nodeValue).length)return void(o?t.setStart(n,0):t.setEnd(n,n.nodeValue.length));if(a[n.nodeName])return void(o?t.setStartBefore(n):"BR"===n.nodeName?t.setEndBefore(n):t.setEndAfter(n))}while(n=o?s.next():s.prev());"BODY"===r.nodeName&&(o?t.setStart(r,0):t.setEnd(r,r.childNodes.length))},wu=e=>{const t=e.selection.getSel();return t&&t.rangeCount>0},ku=(e,t)=>{const n=hu(e);n.length>0?$(n,(n=>{const o=n.dom,r=e.dom.createRng();r.setStartBefore(o),r.setEndAfter(o),t(r,!0)})):t(e.selection.getRng(),!1)},Su=(e,t,n)=>{const o=si(e,t);n(o),e.moveToBookmark(o)},_u=((e,t)=>{const n=t=>e(t)?M.from(t.dom.nodeValue):M.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return n(t).getOr("")},getOption:n,set:(t,n)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=n}}})(zt),Eu=e=>_u.get(e),Nu=e=>_u.getOption(e),Ru=(e,{uid:t=sa("mce-annotation"),...n},o,r)=>{const s=cn("span",e);nn(s,Qs()),$t(s,`${Zs()}`,t),$t(s,`${Js()}`,o);const{attributes:a={},classes:i=[]}=r(t,n);return qt(s,a),((e,t)=>{$(t,(t=>{nn(e,t)}))})(s,i),s},Au=(e,t,n,o,r)=>{const s=[],a=Ru(e.getDoc(),r,n,o),i=Ws(),l=()=>{i.clear()},d=e=>{$(e,c)},c=t=>{switch(((e,t,n,o)=>wn(t).fold((()=>"skipping"),(r=>"br"===o||(e=>zt(e)&&Eu(e)===ur)(t)?"valid":(e=>Ut(e)&&sn(e,Qs()))(t)?"existing":gc(t.dom)?"caret":zc(e,n,o)&&zc(e,Mt(r),n)?"valid":"invalid-child")))(e,t,"span",Mt(t))){case"invalid-child":{l();const e=Nn(t);d(e),l();break}case"valid":{const e=i.get().getOrThunk((()=>{const e=ia(a);return s.push(e),i.set(e),e}));((e,t)=>{Yn(e,t),Jn(t,e)})(t,e);break}}};return fu(e.dom,t,(e=>{l(),(e=>{const t=H(e,mn);d(t)})(e)})),s},Ou=e=>{const t=(()=>{const e={};return{register:(t,n)=>{e[t]={name:t,settings:n}},lookup:t=>xe(e,t).map((e=>e.settings)),getNames:()=>ue(e)}})();((e,t)=>{e.serializer.addTempAttr(ea()),e.serializer.addNodeFilter("span",(e=>{$(e,(e=>{(e=>M.from(e.attr(Js())).bind(t.lookup))(e).each((t=>{!1===t.persistent&&e.unwrap()}))}))}))})(e,t);const n=((e,t)=>{const n=zs({}),o=()=>({listeners:[],previous:Ws()}),r=(e,t)=>{s(e,(e=>(t(e),e)))},s=(e,t)=>{const r=n.get(),s=t(xe(r,e).getOrThunk(o));r[e]=s,n.set(r)},a=(t,n)=>{$(na(e,t),(e=>{n?$t(e,ea(),"true"):Yt(e,ea())}))},i=Gs((()=>{const n=se(t.getNames());$(n,(t=>{s(t,(n=>{const o=n.previous.get();return ta(e,M.some(t)).fold((()=>{o.each((e=>{(e=>{r(e,(t=>{$(t.listeners,(t=>t(!1,e)))}))})(t),n.previous.clear(),a(e,!1)}))}),(({uid:e,name:t,elements:s})=>{Dt(o,e)||(o.each((e=>a(e,!1))),((e,t,n)=>{r(e,(o=>{$(o.listeners,(o=>o(!0,e,{uid:t,nodes:H(n,(e=>e.dom))})))}))})(t,e,s),n.previous.set(e),a(e,!0))})),{previous:n.previous,listeners:n.listeners}}))}))}),30);return e.on("remove",(()=>{i.cancel()})),e.on("NodeChange",(()=>{i.throttle()})),{addListener:(e,t)=>{s(e,(e=>({previous:e.previous,listeners:e.listeners.concat([t])})))}}})(e,t);return{register:(e,n)=>{t.register(e,n)},annotate:(n,o)=>{t.lookup(n).each((t=>{((e,t,n,o)=>{e.undoManager.transact((()=>{const r=e.selection,s=r.getRng(),a=hu(e).length>0;if(s.collapsed&&!a&&((e,t)=>{const n=mu(e,t,[{inline:"span"}]);t.setStart(n.startContainer,n.startOffset),t.setEnd(n.endContainer,n.endOffset),e.selection.setRng(t)})(e,s),r.getRng().collapsed&&!a){const s=Ru(e.getDoc(),o,t,n.decorate);ro(s,dr),r.getRng().insertNode(s.dom),r.select(s.dom)}else Su(r,!1,(()=>{ku(e,(r=>{Au(e,r,t,n.decorate,o)}))}))}))})(e,n,t,o)}))},annotationChanged:(e,t)=>{n.addListener(e,t)},remove:t=>{const n=e.selection.getBookmark();ta(e,M.some(t)).each((({elements:e})=>{$(e,no)})),e.selection.moveToBookmark(n)},removeAll:t=>{const n=e.selection.getBookmark();fe(oa(e,t),((e,t)=>$(e,no))),e.selection.moveToBookmark(n)},getAll:t=>{const n=oa(e,t);return ge(n,(e=>H(e,(e=>e.dom))))}}},Tu=e=>({getBookmark:O(kc,e),moveToBookmark:O(Sc,e)});Tu.isBookmarkNode=_c;const Bu=(e,t,n)=>!n.collapsed&&V(n.getClientRects(),(n=>((e,t,n)=>t>=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom)(n,e,t))),Du=(e,t,n)=>e.dispatch(t,n),Lu=(e,t,n,o)=>e.dispatch("FormatApply",{format:t,node:n,vars:o}),Pu=(e,t,n,o)=>e.dispatch("FormatRemove",{format:t,node:n,vars:o}),Mu=(e,t)=>e.dispatch("SetContent",t),Iu=(e,t)=>e.dispatch("GetContent",t),Fu=(e,t)=>e.dispatch("PastePlainTextToggle",{state:t}),Uu={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:e=>e.shiftKey||e.ctrlKey||e.altKey||Uu.metaKeyPressed(e),metaKeyPressed:e=>Nt.os.isMacOS()||Nt.os.isiOS()?e.metaKey:e.ctrlKey&&!e.altKey},zu=(e,t)=>{const n="data-mce-selected",o=t.dom,r=Bt.each;let s,a,i,l,d,c,u,m,f,g,p,h,b;const v=t.getDoc(),y=document,x=Math.abs,w=Math.round,k=t.getBody();let S,_;const E={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]},N=e=>C(e)&&(Lo(e)||t.dom.is(e,"figure.image")),R=e=>Fo(e)||o.hasClass(e,"mce-preview-object"),A=e=>{const n=e.target;((e,t)=>{if("longpress"===e.type||0===e.type.indexOf("touch")){const n=e.touches[0];return N(e.target)&&!Bu(n.clientX,n.clientY,t)}return N(e.target)&&!Bu(e.clientX,e.clientY,t)})(e,t.selection.getRng())&&!e.isDefaultPrevented()&&t.selection.select(n)},O=e=>o.is(e,"figure.image")?[e.querySelector("img")]:o.hasClass(e,"mce-preview-object")&&C(e.firstElementChild)?[e,e.firstElementChild]:[e],T=e=>{const n=ol(t);return!!n&&"false"!==e.getAttribute("data-mce-resize")&&e!==t.getBody()&&(o.hasClass(e,"mce-preview-object")?pn(mn(e.firstElementChild),n):pn(mn(e),n))},B=(e,n,r)=>{if(C(r)){const s=O(e);$(s,(e=>{e.style[n]||!t.schema.isValid(e.nodeName.toLowerCase(),n)?o.setStyle(e,n,r):o.setAttrib(e,n,""+r)}))}},D=(e,t,n)=>{B(e,"width",t),B(e,"height",n)},L=e=>{let n,r,d,v,y;n=e.screenX-c,r=e.screenY-u,h=n*l[2]+m,b=r*l[3]+f,h=h<5?5:h,b=b<5?5:b,d=(N(s)||R(s))&&!1!==rl(t)?!Uu.modifierPressed(e):Uu.modifierPressed(e),d&&(x(n)>x(r)?(b=w(h*g),h=w(b/g)):(h=w(b/g),b=w(h*g))),D(a,h,b),v=l.startPos.x+n,y=l.startPos.y+r,v=v>0?v:0,y=y>0?y:0,o.setStyles(i,{left:v,top:y,display:"block"}),i.innerHTML=h+" &times; "+b,l[2]<0&&a.clientWidth<=h&&o.setStyle(a,"left",void 0+(m-h)),l[3]<0&&a.clientHeight<=b&&o.setStyle(a,"top",void 0+(f-b)),n=k.scrollWidth-S,r=k.scrollHeight-_,n+r!==0&&o.setStyles(i,{left:v-n,top:y-r}),p||(((e,t,n,o,r)=>{e.dispatch("ObjectResizeStart",{target:t,width:n,height:o,origin:r})})(t,s,m,f,"corner-"+l.name),p=!0)},P=()=>{const e=p;p=!1,e&&(B(s,"width",h),B(s,"height",b)),o.unbind(v,"mousemove",L),o.unbind(v,"mouseup",P),y!==v&&(o.unbind(y,"mousemove",L),o.unbind(y,"mouseup",P)),o.remove(a),o.remove(i),o.remove(d),M(s),e&&(((e,t,n,o,r)=>{e.dispatch("ObjectResized",{target:t,width:n,height:o,origin:r})})(t,s,h,b,"corner-"+l.name),o.setAttrib(s,"style",o.getAttrib(s,"style"))),t.nodeChanged()},M=e=>{U();const p=o.getPos(e,k),C=p.x,x=p.y,w=e.getBoundingClientRect(),N=w.width||w.right-w.left,A=w.height||w.bottom-w.top;s!==e&&(I(),s=e,h=b=0);const B=t.dispatch("ObjectSelected",{target:e}),M=o.getAttrib(s,n,"1");T(e)&&!B.isDefaultPrevented()?r(E,((e,t)=>{let r;r=o.get("mceResizeHandle"+t),r&&o.remove(r),r=o.add(k,"div",{id:"mceResizeHandle"+t,"data-mce-bogus":"all",class:"mce-resizehandle",unselectable:!0,style:"cursor:"+t+"-resize; margin:0; padding:0"}),o.bind(r,"mousedown",(r=>{r.stopImmediatePropagation(),r.preventDefault(),(r=>{const p=O(s)[0];var h;c=r.screenX,u=r.screenY,m=p.clientWidth,f=p.clientHeight,g=f/m,l=e,l.name=t,l.startPos={x:N*e[0]+C,y:A*e[1]+x},S=k.scrollWidth,_=k.scrollHeight,d=o.add(k,"div",{class:"mce-resize-backdrop","data-mce-bogus":"all"}),o.setStyles(d,{position:"fixed",left:"0",top:"0",width:"100%",height:"100%"}),a=R(h=s)?o.create("img",{src:Nt.transparentSrc}):h.cloneNode(!0),o.addClass(a,"mce-clonedresizable"),o.setAttrib(a,"data-mce-bogus","all"),a.contentEditable="false",o.setStyles(a,{left:C,top:x,margin:0}),D(a,N,A),a.removeAttribute(n),k.appendChild(a),o.bind(v,"mousemove",L),o.bind(v,"mouseup",P),y!==v&&(o.bind(y,"mousemove",L),o.bind(y,"mouseup",P)),i=o.add(k,"div",{class:"mce-resize-helper","data-mce-bogus":"all"},m+" &times; "+f)})(r)})),e.elm=r,o.setStyles(r,{left:N*e[0]+C-r.offsetWidth/2,top:A*e[1]+x-r.offsetHeight/2})})):I(),o.getAttrib(s,n)||s.setAttribute(n,M)},I=()=>{U(),s&&s.removeAttribute(n),fe(E,((e,t)=>{const n=o.get("mceResizeHandle"+t);n&&(o.unbind(n),o.remove(n))}))},F=s=>{var a;let i,l;const d=(e,t)=>{if(e)do{if(e===t)return!0}while(e=e.parentNode)};p||t.removed||(r(o.select("img[data-mce-selected],hr[data-mce-selected]"),(e=>{e.removeAttribute(n)})),l="mousedown"===s.type?s.target:e.getNode(),l=null===(a=Ko(mn(l),"table,img,figure.image,hr,video,span.mce-preview-object").getOrUndefined())||void 0===a?void 0:a.dom,d(l,k)&&(z(),i=e.getStart(!0),d(i,l)&&d(e.getEnd(!0),l))?M(l):I())},U=()=>{fe(E,(e=>{e.elm&&(o.unbind(e.elm),delete e.elm)}))},z=()=>{try{t.getDoc().execCommand("enableObjectResizing",!1,"false")}catch(e){}};return t.on("init",(()=>{z();const e=Ks((e=>{t.composing||F(e)}),0);t.on("nodechange ResizeEditor ResizeWindow ResizeContent drop FullscreenStateChanged",e.throttle),t.on("keyup compositionend",(t=>{s&&"TABLE"===s.nodeName&&e.throttle(t)})),t.on("hide blur",I),t.on("contextmenu longpress",A,!0)})),t.on("remove",U),{isResizable:T,showResizeRect:M,hideResizeRect:I,updateResizeRect:F,destroy:()=>{s=a=d=null}}},ju=(e,t,n)=>{const o=e.document.createRange();var r;return r=o,t.fold((e=>{r.setStartBefore(e.dom)}),((e,t)=>{r.setStart(e.dom,t)}),(e=>{r.setStartAfter(e.dom)})),((e,t)=>{t.fold((t=>{e.setEndBefore(t.dom)}),((t,n)=>{e.setEnd(t.dom,n)}),(t=>{e.setEndAfter(t.dom)}))})(o,n),o},Vu=(e,t,n,o,r)=>{const s=e.document.createRange();return s.setStart(t.dom,n),s.setEnd(o.dom,r),s},Hu=ci([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]),$u=(e,t,n)=>t(mn(n.startContainer),n.startOffset,mn(n.endContainer),n.endOffset);Hu.ltr,Hu.rtl;const qu=(e,t,n,o)=>({start:e,soffset:t,finish:n,foffset:o}),Wu=document.caretPositionFromPoint?(e,t,n)=>{var o,r;return M.from(null===(r=(o=e.dom).caretPositionFromPoint)||void 0===r?void 0:r.call(o,t,n)).bind((t=>{if(null===t.offsetNode)return M.none();const n=e.dom.createRange();return n.setStart(t.offsetNode,t.offset),n.collapse(),M.some(n)}))}:document.caretRangeFromPoint?(e,t,n)=>{var o,r;return M.from(null===(r=(o=e.dom).caretRangeFromPoint)||void 0===r?void 0:r.call(o,t,n))}:M.none,Ku=ci([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Gu={before:Ku.before,on:Ku.on,after:Ku.after,cata:(e,t,n,o)=>e.fold(t,n,o),getStart:e=>e.fold(R,R,R)},Yu=ci([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Xu={domRange:Yu.domRange,relative:Yu.relative,exact:Yu.exact,exactFromRange:e=>Yu.exact(e.start,e.soffset,e.finish,e.foffset),getWin:e=>{const t=(e=>e.match({domRange:e=>mn(e.startContainer),relative:(e,t)=>Gu.getStart(e),exact:(e,t,n,o)=>e}))(e);return xn(t)},range:qu},Qu=(e,t)=>{const n=Mt(e);return"input"===n?Gu.after(e):j(["br","img"],n)?0===t?Gu.before(e):Gu.after(e):Gu.on(e,t)},Ju=(e,t)=>{const n=e.fold(Gu.before,Qu,Gu.after),o=t.fold(Gu.before,Qu,Gu.after);return Xu.relative(n,o)},Zu=(e,t,n,o)=>{const r=Qu(e,t),s=Qu(n,o);return Xu.relative(r,s)},em=(e,t)=>{const n=(t||document).createDocumentFragment();return $(e,(e=>{n.appendChild(e.dom)})),mn(n)},tm=e=>{const t=Xu.getWin(e).dom,n=(e,n,o,r)=>Vu(t,e,n,o,r),o=(e=>e.match({domRange:e=>{const t=mn(e.startContainer),n=mn(e.endContainer);return Zu(t,e.startOffset,n,e.endOffset)},relative:Ju,exact:Zu}))(e);return((e,t)=>{const n=((e,t)=>t.match({domRange:e=>({ltr:N(e),rtl:M.none}),relative:(t,n)=>({ltr:De((()=>ju(e,t,n))),rtl:De((()=>M.some(ju(e,n,t))))}),exact:(t,n,o,r)=>({ltr:De((()=>Vu(e,t,n,o,r))),rtl:De((()=>M.some(Vu(e,o,r,t,n))))})}))(e,t);return((e,t)=>{const n=t.ltr();return n.collapsed?t.rtl().filter((e=>!1===e.collapsed)).map((e=>Hu.rtl(mn(e.endContainer),e.endOffset,mn(e.startContainer),e.startOffset))).getOrThunk((()=>$u(0,Hu.ltr,n))):$u(0,Hu.ltr,n)})(0,n)})(t,o).match({ltr:n,rtl:n})},nm=(e,t,n)=>{return(o=n.defaultView,r=e,s=t,((e,t,n)=>{const o=mn(e.document);return Wu(o,t,n).map((e=>qu(mn(e.startContainer),e.startOffset,mn(e.endContainer),e.endOffset)))})(o,r,s)).map((e=>{const t=n.createRange();return t.setStart(e.start.dom,e.soffset),t.setEnd(e.finish.dom,e.foffset),t})).getOrUndefined();var o,r,s},om=(e,t)=>e&&t&&e.startContainer===t.startContainer&&e.startOffset===t.startOffset&&e.endContainer===t.endContainer&&e.endOffset===t.endOffset,rm=(e,t,n)=>null!==((e,t,n)=>{for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null})(e,t,n),sm=(e,t,n)=>rm(e,t,(e=>e.nodeName===n)),am=e=>e&&"TABLE"===e.nodeName,im=e=>e&&/^(TD|TH|CAPTION)$/.test(e.nodeName),lm=(e,t)=>vr(e)&&!1===rm(e,t,gc),dm=(e,t,n)=>{const o=new Xo(t,e.getParent(t.parentNode,e.isBlock)||e.getRoot());for(;t=o[n?"prev":"next"]();)if(Do(t))return!0},cm=(e,t,n,o,r)=>{let s;const a=e.getRoot();let i;const l=e.schema.getNonEmptyElements(),d=e.getParent(r.parentNode,e.isBlock)||a;if(o&&Do(r)&&t&&e.isEmpty(d))return M.some(Ua(r.parentNode,e.nodeIndex(r)));const c=new Xo(r,d);for(;i=c[o?"prev":"next"]();){if("false"===e.getContentEditableParent(i)||lm(i,a))return M.none();if(No(i)&&i.nodeValue.length>0)return!1===sm(i,a,"A")?M.some(Ua(i,o?i.nodeValue.length:0)):M.none();if(e.isBlock(i)||l[i.nodeName.toLowerCase()])return M.none();s=i}return n&&s?M.some(Ua(s,0)):M.none()},um=(e,t,n,o)=>{let r,s;const a=e.getRoot();let i,l,d=!1;r=o[(n?"start":"end")+"Container"],s=o[(n?"start":"end")+"Offset"];const c=yo(r)&&s===r.childNodes.length,u=e.schema.getNonEmptyElements();if(l=n,vr(r))return M.none();if(yo(r)&&s>r.childNodes.length-1&&(l=!1),To(r)&&(r=a,s=0),r===a){if(l&&(i=r.childNodes[s>0?s-1:0],i)){if(vr(i))return M.none();if(u[i.nodeName]||am(i))return M.none()}if(r.hasChildNodes()){if(s=Math.min(!l&&s>0?s-1:s,r.childNodes.length-1),r=r.childNodes[s],s=No(r)&&c?r.data.length:0,!t&&r===a.lastChild&&am(r))return M.none();if(((e,t)=>{for(;t&&t!==e;){if(Mo(t))return!0;t=t.parentNode}return!1})(a,r)||vr(r))return M.none();if(r.hasChildNodes()&&!1===am(r)){i=r;const t=new Xo(r,a);do{if(Mo(i)||vr(i)){d=!1;break}if(No(i)&&i.nodeValue.length>0){s=l?0:i.nodeValue.length,r=i,d=!0;break}if(u[i.nodeName.toLowerCase()]&&!im(i)){s=e.nodeIndex(i),r=i.parentNode,l||s++,d=!0;break}}while(i=l?t.next():t.prev())}}}return t&&(No(r)&&0===s&&cm(e,c,t,!0,r).each((e=>{r=e.container(),s=e.offset(),d=!0})),yo(r)&&(i=r.childNodes[s],i||(i=r.childNodes[s-1]),!i||!Do(i)||((e,t)=>e.previousSibling&&"A"===e.previousSibling.nodeName)(i)||dm(e,i,!1)||dm(e,i,!0)||cm(e,c,t,!0,i).each((e=>{r=e.container(),s=e.offset(),d=!0})))),l&&!t&&No(r)&&s===r.nodeValue.length&&cm(e,c,t,!1,r).each((e=>{r=e.container(),s=e.offset(),d=!0})),d?M.some(Ua(r,s)):M.none()},mm=(e,t)=>{const n=t.collapsed,o=t.cloneRange(),r=Ua.fromRangeStart(t);return um(e,n,!0,o).each((e=>{n&&Ua.isAbove(r,e)||o.setStart(e.container(),e.offset())})),n||um(e,n,!1,o).each((e=>{o.setEnd(e.container(),e.offset())})),n&&o.collapse(!0),om(t,o)?M.none():M.some(o)},fm=(e,t)=>e.splitText(t),gm=e=>{let t=e.startContainer,n=e.startOffset,o=e.endContainer,r=e.endOffset;return t===o&&No(t)?n>0&&n<t.nodeValue.length&&(o=fm(t,n),t=o.previousSibling,r>n?(r-=n,t=o=fm(o,r).previousSibling,r=o.nodeValue.length,n=0):r=0):(No(t)&&n>0&&n<t.nodeValue.length&&(t=fm(t,n),n=0),No(o)&&r>0&&r<o.nodeValue.length&&(o=fm(o,r).previousSibling,r=o.nodeValue.length)),{startContainer:t,startOffset:n,endContainer:o,endOffset:r}},pm=e=>({walk:(t,n)=>fu(e,t,n),split:gm,normalize:t=>mm(e,t).fold(L,(e=>(t.setStart(e.startContainer,e.startOffset),t.setEnd(e.endContainer,e.endOffset),!0)))});pm.compareRanges=om,pm.getCaretRangeFromPoint=nm,pm.getSelectedNode=va,pm.getNode=ya;const hm=((e,t)=>{const n=t=>{const n=(e=>{const t=e.dom;return zn(e)?t.getBoundingClientRect().height:t.offsetHeight})(t);if(n<=0||null===n){const n=$n(t,e);return parseFloat(n)||0}return n},o=(e,t)=>Y(t,((t,n)=>{const o=$n(e,n),r=void 0===o?0:parseInt(o,10);return isNaN(r)?t:t+r}),0);return{set:(t,n)=>{if(!w(n)&&!n.match(/^[0-9]+$/))throw new Error(e+".set accepts only positive integer values. Value was "+n);const o=t.dom;an(o)&&(o.style[e]=n+"px")},get:n,getOuter:n,aggregate:o,max:(e,t,n)=>{const r=o(e,n);return t>r?t-r:0}}})("height"),bm=()=>mn(document),vm=(e,t)=>e.view(t).fold(N([]),(t=>{const n=e.owner(t),o=vm(e,n);return[t].concat(o)}));var ym=Object.freeze({__proto__:null,view:e=>{var t;return(e.dom===document?M.none():M.from(null===(t=e.dom.defaultView)||void 0===t?void 0:t.frameElement)).map(mn)},owner:e=>Cn(e)});const Cm=e=>"textarea"===Mt(e),xm=(e,t)=>{const n=(e=>{const t=e.dom.ownerDocument,n=t.body,o=t.defaultView,r=t.documentElement;if(n===e.dom)return lo(n.offsetLeft,n.offsetTop);const s=co(null==o?void 0:o.pageYOffset,r.scrollTop),a=co(null==o?void 0:o.pageXOffset,r.scrollLeft),i=co(r.clientTop,n.clientTop),l=co(r.clientLeft,n.clientLeft);return uo(e).translate(a-l,s-i)})(e),o=(e=>hm.get(e))(e);return{element:e,bottom:n.top+o,height:o,pos:n,cleanup:t}},wm=(e,t,n,o)=>{Em(e,((r,s)=>Sm(e,t,n,o)),n)},km=(e,t,n,o,r)=>{const s={elm:o.element.dom,alignToTop:r};((e,t)=>e.dispatch("ScrollIntoView",t).isDefaultPrevented())(e,s)||(n(t,mo(t).top,o,r),((e,t)=>{e.dispatch("AfterScrollIntoView",t)})(e,s))},Sm=(e,t,n,o)=>{const r=mn(e.getBody()),s=mn(e.getDoc());r.dom.offsetWidth;const a=((e,t)=>{const n=((e,t)=>{const n=Nn(e);if(0===n.length||Cm(e))return{element:e,offset:t};if(t<n.length&&!Cm(n[t]))return{element:n[t],offset:0};{const o=n[n.length-1];return Cm(o)?{element:e,offset:t}:"img"===Mt(o)?{element:o,offset:1}:zt(o)?{element:o,offset:Eu(o).length}:{element:o,offset:Nn(o).length}}})(e,t),o=dn('<span data-mce-bogus="all" style="display: inline-block;">\ufeff</span>');return Yn(n.element,o),xm(o,(()=>to(o)))})(mn(n.startContainer),n.startOffset);km(e,s,t,a,o),a.cleanup()},_m=(e,t,n,o)=>{const r=mn(e.getDoc());km(e,r,n,(e=>xm(mn(e),S))(t),o)},Em=(e,t,n)=>{const o=n.startContainer,r=n.startOffset,s=n.endContainer,a=n.endOffset;t(mn(o),mn(s));const i=e.dom.createRng();i.setStart(o,r),i.setEnd(s,a),e.selection.setRng(n)},Nm=(e,t,n,o)=>{const r=e.pos;if(n)fo(r.left,r.top,o);else{const n=r.top-t+e.height;fo(r.left,n,o)}},Rm=(e,t,n,o,r)=>{const s=n+t,a=o.pos.top,i=o.bottom,l=i-a>=n;a<t?Nm(o,n,!1!==r,e):a>s?Nm(o,n,l?!1!==r:!0===r,e):i>s&&!l&&Nm(o,n,!0===r,e)},Am=(e,t,n,o)=>{const r=e.dom.defaultView.innerHeight;Rm(e,t,r,n,o)},Om=(e,t,n,o)=>{const r=e.dom.defaultView.innerHeight;Rm(e,t,r,n,o);const s=(e=>{const t=bm(),n=mo(t),o=((e,t)=>{const n=t.owner(e);return vm(t,n)})(e,ym),r=uo(e),s=G(o,((e,t)=>{const n=uo(t);return{left:e.left+n.left,top:e.top+n.top}}),{left:0,top:0});return lo(s.left+r.left+n.left,s.top+r.top+n.top)})(n.element),a=ho(window);s.top<a.y?go(n.element,!1!==o):s.top>a.bottom&&go(n.element,!0===o)},Tm=(e,t,n)=>wm(e,Am,t,n),Bm=(e,t,n)=>_m(e,t,Am,n),Dm=(e,t,n)=>wm(e,Om,t,n),Lm=(e,t,n)=>_m(e,t,Om,n),Pm=(e,t,n)=>{(e.inline?Tm:Dm)(e,t,n)},Mm=e=>e.dom.focus(),Im=e=>{const t=Pn(e).dom;return e.dom===t.activeElement},Fm=(e=bm())=>M.from(e.dom.activeElement).map(mn),Um=(e,t)=>{const n=zt(t)?Eu(t).length:Nn(t).length+1;return e>n?n:e<0?0:e},zm=e=>Xu.range(e.start,Um(e.soffset,e.start),e.finish,Um(e.foffset,e.finish)),jm=(e,t)=>!vo(t.dom)&&(vn(e,t)||bn(e,t)),Vm=e=>t=>jm(e,t.start)&&jm(e,t.finish),Hm=e=>Xu.range(mn(e.startContainer),e.startOffset,mn(e.endContainer),e.endOffset),$m=e=>{const t=document.createRange();try{return t.setStart(e.start.dom,e.soffset),t.setEnd(e.finish.dom,e.foffset),M.some(t)}catch(e){return M.none()}},qm=e=>{const t=(e=>e.inline)(e)?(n=mn(e.getBody()),(e=>{const t=e.getSelection();return(t&&0!==t.rangeCount?M.from(t.getRangeAt(0)):M.none()).map(Hm)})(xn(n).dom).filter(Vm(n))):M.none();var n;e.bookmark=t.isSome()?t:e.bookmark},Wm=e=>(e.bookmark?e.bookmark:M.none()).bind((t=>{return n=mn(e.getBody()),o=t,M.from(o).filter(Vm(n)).map(zm);var n,o})).bind($m),Km={isEditorUIElement:e=>{const t=e.className.toString();return-1!==t.indexOf("tox-")||-1!==t.indexOf("mce-")}},Gm={setEditorTimeout:(e,t,n)=>((e,t)=>(w(t)||(t=0),setTimeout(e,t)))((()=>{e.removed||t()}),n),setEditorInterval:(e,t,n)=>{const o=((e,t)=>(w(t)||(t=0),setInterval(e,t)))((()=>{e.removed?clearInterval(o):t()}),n);return o}};let Ym;const Xm=Is.DOM,Qm=(e,t)=>{const n=hl(e),o=Xm.getParent(t,(t=>(e=>Km.isEditorUIElement(e))(t)||!!n&&e.dom.is(t,n)));return null!==o},Jm=(e,t)=>{const n=t.editor;(e=>{const t=Ks((()=>{qm(e)}),0);e.on("init",(()=>{e.inline&&((e,t)=>{const n=()=>{t.throttle()};Is.DOM.bind(document,"mouseup",n),e.on("remove",(()=>{Is.DOM.unbind(document,"mouseup",n)}))})(e,t),((e,t)=>{((e,t)=>{e.on("mouseup touchend",(e=>{t.throttle()}))})(e,t),e.on("keyup NodeChange AfterSetSelectionRange",(t=>{(e=>"nodechange"===e.type&&e.selectionChange)(t)||qm(e)}))})(e,t)})),e.on("remove",(()=>{t.cancel()}))})(n),n.on("focusin",(()=>{const t=e.focusedEditor;t!==n&&(t&&t.dispatch("blur",{focusedEditor:n}),e.setActive(n),e.focusedEditor=n,n.dispatch("focus",{blurredEditor:t}),n.focus(!0))})),n.on("focusout",(()=>{Gm.setEditorTimeout(n,(()=>{const t=e.focusedEditor;Qm(n,(e=>{try{const t=Pn(mn(e.getElement()));return Fm(t).fold((()=>document.body),(e=>e.dom))}catch(e){return document.body}})(n))||t!==n||(n.dispatch("blur",{focusedEditor:null}),e.focusedEditor=null)}))})),Ym||(Ym=t=>{const n=e.activeEditor;n&&Fn(t).each((t=>{t.ownerDocument===document&&(t===document.body||Qm(n,t)||e.focusedEditor!==n||(n.dispatch("blur",{focusedEditor:null}),e.focusedEditor=null))}))},Xm.bind(document,"focusin",Ym))},Zm=(e,t)=>{e.focusedEditor===t.editor&&(e.focusedEditor=null),e.activeEditor||(Xm.unbind(document,"focusin",Ym),Ym=null)},ef=(e,t)=>{((e,t)=>(e=>e.collapsed?M.from(ya(e.startContainer,e.startOffset)).map(mn):M.none())(t).bind((t=>sr(t)?M.some(t):!1===vn(e,t)?M.some(e):M.none())))(mn(e.getBody()),t).bind((e=>uc(e.dom))).fold((()=>{e.selection.normalize()}),(t=>e.selection.setRng(t.toRange())))},tf=e=>{if(e.setActive)try{e.setActive()}catch(t){e.focus()}else e.focus()},nf=e=>e.inline?(e=>{const t=e.getBody();return t&&(n=mn(t),Im(n)||(o=n,Fm(Pn(o)).filter((e=>o.dom.contains(e.dom)))).isSome());var n,o})(e):(e=>e.iframeElement&&Im(mn(e.iframeElement)))(e),of=e=>e.editorManager.setActive(e),rf=(e,t,n,o,r)=>{const s=n?t.startContainer:t.endContainer,a=n?t.startOffset:t.endOffset;return M.from(s).map(mn).map((e=>o&&t.collapsed?e:Rn(e,r(e,a)).getOr(e))).bind((e=>Ut(e)?M.some(e):wn(e).filter(Ut))).map((e=>e.dom)).getOr(e)},sf=(e,t,n)=>rf(e,t,!0,n,((e,t)=>Math.min(Tn(e),t))),af=(e,t,n)=>rf(e,t,!1,n,((e,t)=>t>0?t-1:t)),lf=(e,t)=>{const n=e;for(;e&&No(e)&&0===e.length;)e=t?e.nextSibling:e.previousSibling;return e||n},df=(e,t)=>H(t,(t=>{const n=e.dispatch("GetSelectionRange",{range:t});return n.range!==t?n.range:t})),cf=["img","br"],uf=e=>{const t=Nu(e).filter((e=>0!==e.trim().length||e.indexOf(dr)>-1)).isSome();return t||j(cf,Mt(e))},mf="[data-mce-autocompleter]",ff=(e,t)=>{if(gf(mn(e.getBody())).isNone()){const o=dn('<span data-mce-autocompleter="1" data-mce-bogus="1"></span>',e.getDoc());Jn(o,mn(t.extractContents())),t.insertNode(o.dom),wn(o).each((e=>e.dom.normalize())),(n=o,((e,t)=>{const n=e=>{const o=Nn(e);for(let e=o.length-1;e>=0;e--){const r=o[e];if(t(r))return M.some(r);const s=n(r);if(s.isSome())return s}return M.none()};return n(e)})(n,uf)).map((t=>{e.selection.setCursorLocation(t.dom,(e=>"img"===Mt(e)?1:Nu(e).fold((()=>Nn(e).length),(e=>e.length)))(t))}))}var n},gf=e=>Wo(e,mf),pf={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11},hf=(e,t,n)=>{const o=n?"lastChild":"firstChild",r=n?"prev":"next";if(e[o])return e[o];if(e!==t){let n=e[r];if(n)return n;for(let o=e.parent;o&&o!==t;o=o.parent)if(n=o[r],n)return n}},bf=e=>{if(!Fr(e.value))return!1;const t=e.parent;return!t||"span"===t.name&&!t.attr("style")||!/^[ ]+$/.test(e.value)},vf=e=>{const 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};class yf{constructor(e,t){this.name=e,this.type=t,1===t&&(this.attributes=[],this.attributes.map={})}static create(e,t){const n=new yf(e,pf[e]||1);return t&&fe(t,((e,t)=>{n.attr(t,e)})),n}replace(e){const t=this;return e.parent&&e.remove(),t.insert(e,t),t.remove(),t}attr(e,t){const n=this;let o;if("string"!=typeof e)return null!=e&&fe(e,((e,t)=>{n.attr(t,e)})),n;if(o=n.attributes){if(void 0!==t){if(null===t){if(e in o.map){delete o.map[e];let t=o.length;for(;t--;)if(o[t].name===e)return o.splice(t,1),n}return n}if(e in o.map){let n=o.length;for(;n--;)if(o[n].name===e){o[n].value=t;break}}else o.push({name:e,value:t});return o.map[e]=t,n}return o.map[e]}}clone(){const e=this,t=new yf(e.name,e.type);let n;if(n=e.attributes){const e=[];e.map={};for(let t=0,o=n.length;t<o;t++){const o=n[t];"id"!==o.name&&(e[e.length]={name:o.name,value:o.value},e.map[o.name]=o.value)}t.attributes=e}return t.value=e.value,t}wrap(e){const t=this;return t.parent.insert(e,t),e.append(t),t}unwrap(){const e=this;for(let t=e.firstChild;t;){const n=t.next;e.insert(t,e,!0),t=n}e.remove()}remove(){const e=this,t=e.parent,n=e.next,o=e.prev;return t&&(t.firstChild===e?(t.firstChild=n,n&&(n.prev=null)):o.next=n,t.lastChild===e?(t.lastChild=o,o&&(o.next=null)):n.prev=o,e.parent=e.next=e.prev=null),e}append(e){const t=this;e.parent&&e.remove();const n=t.lastChild;return n?(n.next=e,e.prev=n,t.lastChild=e):t.lastChild=t.firstChild=e,e.parent=t,e}insert(e,t,n){e.parent&&e.remove();const o=t.parent||this;return n?(t===o.firstChild?o.firstChild=e:t.prev.next=e,e.prev=t.prev,e.next=t,t.prev=e):(t===o.lastChild?o.lastChild=e:t.next.prev=e,e.next=t.next,e.prev=t,t.next=e),e.parent=o,e}getAll(e){const t=this,n=[];for(let o=t.firstChild;o;o=hf(o,t))o.name===e&&n.push(o);return n}children(){const e=[];for(let t=this.firstChild;t;t=t.next)e.push(t);return e}empty(){const e=this;if(e.firstChild){const t=[];for(let n=e.firstChild;n;n=hf(n,e))t.push(n);let n=t.length;for(;n--;){const e=t[n];e.parent=e.firstChild=e.lastChild=e.next=e.prev=null}}return e.firstChild=e.lastChild=null,e}isEmpty(e,t={},n){const o=this;let r=o.firstChild;if(vf(o))return!1;if(r)do{if(1===r.type){if(r.attr("data-mce-bogus"))continue;if(e[r.name])return!1;if(vf(r))return!1}if(8===r.type)return!1;if(3===r.type&&!bf(r))return!1;if(3===r.type&&r.parent&&t[r.parent.name]&&Fr(r.value))return!1;if(n&&n(r))return!1}while(r=hf(r,o));return!0}walk(e){return hf(this,null,e)}}const Cf=(e,t,n=0)=>{const o=e.toLowerCase();if(-1!==o.indexOf("[if ",n)&&((e,t)=>/^\s*\[if [\w\W]+\]>.*<!\[endif\](--!?)?>/.test(e.substr(t)))(o,n)){const e=o.indexOf("[endif]",n);return o.indexOf(">",e)}if(t){const e=o.indexOf(">",n);return-1!==e?e:o.length}{const t=/--!?>/g;t.lastIndex=n;const r=t.exec(e);return r?r.index+r[0].length:o.length}},xf=(e,t,n)=>{const o=/<([!?\/])?([A-Za-z0-9\-_:.]+)/g,r=/(?:\s(?:[^'">]+(?:"[^"]*"|'[^']*'))*[^"'>]*(?:"[^">]*|'[^'>]*)?|\s*|\/)>/g,s=e.getVoidElements();let a=1,i=n;for(;0!==a;)for(o.lastIndex=i;;){const e=o.exec(t);if(null===e)return i;if("!"===e[1]){i=ze(e[2],"--")?Cf(t,!1,e.index+"!--".length):Cf(t,!0,e.index+1);break}{r.lastIndex=o.lastIndex;const n=r.exec(t);if(h(n)||n.index!==o.lastIndex)continue;"/"===e[1]?a-=1:we(s,e[2])||(a+=1),i=o.lastIndex+n[0].length;break}}return i},wf=(e,t)=>{const n=/<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g,o=e.schema;let r=((e,t)=>{const n=new RegExp(["\\s?("+e.join("|")+')="[^"]+"'].join("|"),"gi");return t.replace(n,"")})(e.getTempAttrs(),t);const s=o.getVoidElements();let a;for(;a=n.exec(r);){const e=n.lastIndex,t=a[0].length;let i;i=s[a[1]]?e:xf(o,r,e),r=r.substring(0,e-t)+r.substring(i),n.lastIndex=e-t}return fr(r)},kf=wf,Sf=Bt.each,_f=e=>({compare:(t,n)=>{if(t.nodeName!==n.nodeName)return!1;const o=t=>{const n={};return Sf(e.getAttribs(t),(o=>{const r=o.nodeName.toLowerCase();0!==r.indexOf("_")&&"style"!==r&&0!==r.indexOf("data-")&&(n[r]=e.getAttrib(t,r))})),n},r=(e,t)=>{let n,o;for(o in e)if(we(e,o)){if(n=t[o],void 0===n)return!1;if(e[o]!==n)return!1;delete t[o]}for(o in t)if(we(t,o))return!1;return!0};return!(!r(o(t),o(n))||!r(e.parseStyle(e.getAttrib(t,"style")),e.parseStyle(e.getAttrib(n,"style")))||_c(t)||_c(n))}}),Ef=Bt.makeMap,Nf=e=>{const t=[],n=(e=e||{}).indent,o=Ef(e.indent_before||""),r=Ef(e.indent_after||""),s=ls.getEncodeFunc(e.entity_encoding||"raw",e.entities),a="xhtml"!==e.element_format;return{start:(e,i,l)=>{let d,c,u,m;if(n&&o[e]&&t.length>0&&(m=t[t.length-1],m.length>0&&"\n"!==m&&t.push("\n")),t.push("<",e),i)for(d=0,c=i.length;d<c;d++)u=i[d],t.push(" ",u.name,'="',s(u.value,!0),'"');t[t.length]=!l||a?">":" />",l&&n&&r[e]&&t.length>0&&(m=t[t.length-1],m.length>0&&"\n"!==m&&t.push("\n"))},end:e=>{let o;t.push("</",e,">"),n&&r[e]&&t.length>0&&(o=t[t.length-1],o.length>0&&"\n"!==o&&t.push("\n"))},text:(e,n)=>{e.length>0&&(t[t.length]=n?e:s(e))},cdata:e=>{t.push("<![CDATA[",e,"]]>")},comment:e=>{t.push("\x3c!--",e,"--\x3e")},pi:(e,o)=>{o?t.push("<?",e," ",s(o),"?>"):t.push("<?",e,"?>"),n&&t.push("\n")},doctype:e=>{t.push("<!DOCTYPE",e,">",n?"\n":"")},reset:()=>{t.length=0},getContent:()=>t.join("").replace(/\n$/,"")}},Rf=(e,t=vs())=>{const n=Nf(e);return(e=e||{}).validate=!("validate"in e)||e.validate,{serialize:o=>{const r=e.validate,s={3:e=>{n.text(e.value,e.raw)},8:e=>{n.comment(e.value)},7:e=>{n.pi(e.name,e.value)},10:e=>{n.doctype(e.value)},4:e=>{n.cdata(e.value)},11:e=>{if(e=e.firstChild)do{a(e)}while(e=e.next)}};n.reset();const a=e=>{const o=s[e.type];if(o)o(e);else{const o=e.name,s=o in t.getVoidElements();let i=e.attributes;if(r&&i&&i.length>1){const n=[];n.map={};const o=t.getElementRule(e.name);if(o){for(let e=0,t=o.attributesOrder.length;e<t;e++){const t=o.attributesOrder[e];if(t in i.map){const e=i.map[t];n.map[t]=e,n.push({name:t,value:e})}}for(let e=0,t=i.length;e<t;e++){const t=i[e].name;if(!(t in n.map)){const e=i.map[t];n.map[t]=e,n.push({name:t,value:e})}}i=n}}if(n.start(o,i,s),!s){let t=e.firstChild;if(t){"pre"!==o&&"textarea"!==o||3!==t.type||"\n"!==t.value[0]||n.text("\n",!0);do{a(t)}while(t=t.next)}n.end(o)}}};return 1!==o.type||e.inner?3===o.type?s[3](o):s[11](o):a(o),n.getContent()}}},Af=new Set;$(["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"],(e=>{Af.add(e)}));const Of=["font","text-decoration","text-emphasis"],Tf=(e,t)=>ue(e.parseStyle(e.getAttrib(t,"style"))),Bf=(e,t,n)=>{const o=Tf(e,t),r=Tf(e,n),s=o=>{var r,s;const a=null!==(r=e.getStyle(t,o))&&void 0!==r?r:"",i=null!==(s=e.getStyle(n,o))&&void 0!==s?s:"";return We(a)&&We(i)&&a!==i};return V(o,(e=>{const t=t=>V(t,(t=>t===e));if(!t(r)&&t(Of)){const e=K(r,(e=>V(Of,(t=>ze(e,t)))));return V(e,s)}return s(e)}))},Df=(e,t,n)=>M.from(n.container()).filter(No).exists((o=>{const r=e?0:-1;return t(o.data.charAt(n.offset()+r))})),Lf=O(Df,!0,Nc),Pf=O(Df,!1,Nc),Mf=e=>{const t=e.container();return No(t)&&(0===t.data.length||mr(t.data)&&Tu.isBookmarkNode(t.parentNode))},If=(e,t)=>n=>M.from(Bd(e?0:-1,n)).filter(t).isSome(),Ff=e=>Lo(e)&&"block"===$n(mn(e),"display"),Uf=e=>Mo(e)&&!(e=>yo(e)&&"all"===e.getAttribute("data-mce-bogus"))(e),zf=If(!0,Ff),jf=If(!1,Ff),Vf=If(!0,Fo),Hf=If(!1,Fo),$f=If(!0,So),qf=If(!1,So),Wf=If(!0,Uf),Kf=If(!1,Uf),Gf=e=>{eo(e),Jn(e,dn('<br data-mce-bogus="1">'))},Yf=e=>{On(e).each((t=>{kn(t).each((n=>{Zo(e)&&tr(t)&&Zo(n)&&to(t)}))}))},Xf=(e,t)=>((e,t,n)=>{return vn(t,e)?(o=((e,t)=>{const n=x(t)?t:L;let o=e.dom;const r=[];for(;null!==o.parentNode&&void 0!==o.parentNode;){const e=o.parentNode,t=mn(e);if(r.push(t),!0===n(t))break;o=e}return r})(e,(e=>n(e)||bn(e,t))),o.slice(0,-1)):[];var o})(e,t,L),Qf=(e,t)=>[e].concat(Xf(e,t)),Jf=(e,t,n)=>ic(e,t,n,Mf),Zf=(e,t)=>Q(Qf(mn(t.container()),e),Zo),eg=(e,t,n)=>Jf(e,t.dom,n).forall((e=>Zf(t,n).fold((()=>!1===Td(e,n,t.dom)),(o=>!1===Td(e,n,t.dom)&&vn(o,mn(e.container())))))),tg=(e,t,n)=>Zf(t,n).fold((()=>Jf(e,t.dom,n).forall((e=>!1===Td(e,n,t.dom)))),(t=>Jf(e,t.dom,n).isNone())),ng=O(tg,!1),og=O(tg,!0),rg=O(eg,!1),sg=O(eg,!0),ag=e=>jd(e).exists(tr),ig=(e,t,n)=>{const o=K(Qf(mn(n.container()),t),Zo),r=ie(o).getOr(t);return sc(e,r.dom,n).filter(ag)},lg=(e,t)=>jd(t).exists(tr)||ig(!0,e,t).isSome(),dg=(e,t)=>(e=>M.from(e.getNode(!0)).map(mn))(t).exists(tr)||ig(!1,e,t).isSome(),cg=O(ig,!1),ug=O(ig,!0),mg=e=>Ua.isTextPosition(e)&&!e.isAtStart()&&!e.isAtEnd(),fg=(e,t)=>{const n=K(Qf(mn(t.container()),e),Zo);return ie(n).getOr(e)},gg=(e,t)=>mg(t)?Pf(t):Pf(t)||cc(fg(e,t).dom,t).exists(Pf),pg=(e,t)=>mg(t)?Lf(t):Lf(t)||dc(fg(e,t).dom,t).exists(Lf),hg=e=>jd(e).bind((e=>$o(e,Ut))).exists((e=>(e=>j(["pre","pre-wrap"],e))($n(e,"white-space")))),bg=(e,t)=>!hg(t)&&(ng(e,t)||rg(e,t)||dg(e,t)||gg(e,t)),vg=(e,t)=>!hg(t)&&(og(e,t)||sg(e,t)||lg(e,t)||pg(e,t)),yg=(e,t)=>bg(e,t)||vg(e,(e=>{const t=e.container(),n=e.offset();return No(t)&&n<t.data.length?Ua(t,n+1):e})(t)),Cg=(e,t)=>Ec(e.charAt(t)),xg=e=>{const t=e.container();return No(t)&&Ue(t.data,dr)},wg=(e,t)=>M.some(t).filter(xg).bind((t=>{const n=t.container(),o=((e,t)=>{const n=t.data,o=Ua(t,0);return!(!Cg(n,0)||yg(e,o)||(t.data=" "+n.slice(1),0))})(e,n)||(e=>{const t=e.data,n=(e=>{const t=e.split("");return H(t,((e,n)=>Ec(e)&&n>0&&n<t.length-1&&Rc(t[n-1])&&Rc(t[n+1])?" ":e)).join("")})(t);return n!==t&&(e.data=n,!0)})(n)||((e,t)=>{const n=t.data,o=Ua(t,n.length-1);return!(!Cg(n,n.length-1)||yg(e,o)||(t.data=n.slice(0,-1)+" ",0))})(e,n);return o?M.some(t):M.none()})),kg=(e,t,n)=>{if(0===n)return;const o=mn(e),r=Ho(o,Zo).getOr(o),s=e.data.slice(t,t+n),a=t+n>=e.data.length&&vg(r,Ua(e,e.data.length)),i=0===t&&bg(r,Ua(e,0));e.replaceData(t,n,zr(s,4,i,a))},Sg=(e,t)=>{const n=e.data.slice(t),o=n.length-$e(n).length;kg(e,t,o)},_g=(e,t)=>{const n=e.data.slice(0,t),o=n.length-qe(n).length;kg(e,t-o,o)},Eg=(e,t,n,o=!0)=>{const r=qe(e.data).length,s=o?e:t,a=o?t:e;return o?s.appendData(a.data):s.insertData(0,a.data),to(mn(a)),n&&Sg(s,r),s},Ng=(e,t)=>((e,t)=>{const n=e.container(),o=e.offset();return!1===Ua.isTextPosition(e)&&n===t.parentNode&&o>Ua.before(t).offset()})(t,e)?Ua(t.container(),t.offset()-1):t,Rg=e=>{return Lr(e.previousSibling)?M.some((t=e.previousSibling,No(t)?Ua(t,t.data.length):Ua.after(t))):e.previousSibling?mc(e.previousSibling):M.none();var t},Ag=e=>{return Lr(e.nextSibling)?M.some((t=e.nextSibling,No(t)?Ua(t,0):Ua.before(t))):e.nextSibling?uc(e.nextSibling):M.none();var t},Og=(e,t,n)=>((e,t,n)=>e?((e,t)=>Ag(t).orThunk((()=>Rg(t))).orThunk((()=>((e,t)=>dc(e,Ua.after(t)).fold((()=>cc(e,Ua.before(t))),M.some))(e,t))))(t,n):((e,t)=>Rg(t).orThunk((()=>Ag(t))).orThunk((()=>((e,t)=>{const n=Ua.before(t.previousSibling?t.previousSibling:t.parentNode);return cc(e,n).fold((()=>dc(e,Ua.after(t))),M.some)})(e,t))))(t,n))(e,t,n).map(O(Ng,n)),Tg=(e,t,n)=>{n.fold((()=>{e.focus()}),(n=>{e.selection.setRng(n.toRange(),t)}))},Bg=(e,t)=>t&&we(e.schema.getBlockElements(),Mt(t)),Dg=e=>{if(qr(e)){const t=dn('<br data-mce-bogus="1">');return eo(e),Jn(e,t),M.some(Ua.before(t.dom))}return M.none()},Lg=(e,t,n,o=!0)=>{const r=Og(t,e.getBody(),n.dom),s=Ho(n,O(Bg,e),(a=e.getBody(),e=>e.dom===a));var a;const i=((e,t,n)=>{const o=kn(e).filter(zt),r=Sn(e).filter(zt);return to(e),(s=o,a=r,i=t,l=(e,t,o)=>{const r=e.dom,s=t.dom,a=r.data.length;return Eg(r,s,n),o.container()===s?Ua(r,a):o},s.isSome()&&a.isSome()&&i.isSome()?M.some(l(s.getOrDie(),a.getOrDie(),i.getOrDie())):M.none()).orThunk((()=>(n&&(o.each((e=>_g(e.dom,e.dom.length))),r.each((e=>Sg(e.dom,0)))),t)));var s,a,i,l})(n,r,((e,t)=>we(e.schema.getTextInlineElements(),Mt(t)))(e,n));e.dom.isEmpty(e.getBody())?(e.setContent(""),e.selection.setCursorLocation()):s.bind(Dg).fold((()=>{o&&Tg(e,t,i)}),(n=>{o&&Tg(e,t,M.some(n))}))},Pg=e=>Xs(e,"td,th"),Mg=(e,t)=>({start:e,end:t}),Ig=ci([{singleCellTable:["rng","cell"]},{fullTable:["table"]},{partialTable:["cells","outsideDetails"]},{multiTable:["startTableCells","endTableCells","betweenRng"]}]),Fg=(e,t)=>Ko(mn(e),"td,th",t),Ug=e=>!bn(e.start,e.end),zg=(e,t)=>bu(e.start,t).bind((n=>bu(e.end,t).bind((e=>Pt(bn(n,e),n))))),jg=e=>t=>zg(t,e).map((e=>((e,t,n)=>({rng:e,table:t,cells:n}))(t,e,Pg(e)))),Vg=(e,t,n,o)=>{if(n.collapsed||!e.forall(Ug))return M.none();if(t.isSameTable){const t=e.bind(jg(o));return M.some({start:t,end:t})}{const e=Fg(n.startContainer,o),t=Fg(n.endContainer,o),r=e.bind((e=>t=>bu(t,e).bind((e=>le(Pg(e)).map((e=>Mg(t,e))))))(o)).bind(jg(o)),s=t.bind((e=>t=>bu(t,e).bind((e=>ie(Pg(e)).map((e=>Mg(e,t))))))(o)).bind(jg(o));return M.some({start:r,end:s})}},Hg=(e,t)=>J(e,(e=>bn(e,t))),$g=e=>Lt(Hg(e.cells,e.rng.start),Hg(e.cells,e.rng.end),((t,n)=>e.cells.slice(t,n+1))),qg=(e,t)=>{const{startTable:n,endTable:o}=t,r=e.cloneRange();return n.each((e=>r.setStartAfter(e.dom))),o.each((e=>r.setEndBefore(e.dom))),r},Wg=(e,t)=>{const n=(e=>t=>bn(e,t))(e),o=((e,t)=>{const n=Fg(e.startContainer,t),o=Fg(e.endContainer,t);return Lt(n,o,Mg)})(t,n),r=((e,t)=>{const n=e=>bu(mn(e),t),o=n(e.startContainer),r=n(e.endContainer),s=o.isSome(),a=r.isSome(),i=Lt(o,r,bn).getOr(!1);return{startTable:o,endTable:r,isStartInTable:s,isEndInTable:a,isSameTable:i,isMultiTable:!i&&s&&a}})(t,n);return((e,t,n)=>e.exists((e=>((e,t)=>!Ug(e)&&zg(e,t).exists((e=>{const t=e.dom.rows;return 1===t.length&&1===t[0].cells.length})))(e,n)&&Cu(e.start,t))))(o,t,n)?o.map((e=>Ig.singleCellTable(t,e.start))):r.isMultiTable?((e,t,n,o)=>Vg(e,t,n,o).bind((({start:e,end:o})=>{const r=e.bind($g).getOr([]),s=o.bind($g).getOr([]);if(r.length>0&&s.length>0){const e=qg(n,t);return M.some(Ig.multiTable(r,s,e))}return M.none()})))(o,r,t,n):((e,t,n,o)=>Vg(e,t,n,o).bind((({start:e,end:t})=>e.or(t))).bind((e=>{const{isSameTable:o}=t,r=$g(e).getOr([]);if(o&&e.cells.length===r.length)return M.some(Ig.fullTable(e.table));if(r.length>0){if(o)return M.some(Ig.partialTable(r,M.none()));{const e=qg(n,t);return M.some(Ig.partialTable(r,M.some({...t,rng:e})))}}return M.none()})))(o,r,t,n)},Kg=e=>{var t;return(8===It(t=e)||"#comment"===Mt(t)?kn(e):On(e)).bind(Kg).orThunk((()=>M.some(e)))},Gg=e=>$(e,(e=>{Yt(e,"contenteditable"),Gf(e)})),Yg=(e,t,n,o)=>{const r=n.cloneRange();o?(r.setStart(n.startContainer,n.startOffset),r.setEndAfter(t.dom.lastChild)):(r.setStartBefore(t.dom.firstChild),r.setEnd(n.endContainer,n.endOffset)),Zg(e,r,t,!1).each((e=>e()))},Xg=e=>{const t=hu(e),n=mn(e.selection.getNode());Io(n.dom)&&qr(n)?e.selection.setCursorLocation(n.dom,0):e.selection.collapse(!0),t.length>1&&V(t,(e=>bn(e,n)))&&$t(n,"data-mce-selected","1")},Qg=(e,t,n)=>M.some((()=>{const o=e.selection.getRng(),r=n.bind((({rng:n,isStartInTable:r})=>{const s=((e,t)=>M.from(e.dom.getParent(t,e.dom.isBlock)).map(mn))(e,r?n.endContainer:n.startContainer);n.deleteContents(),((e,t,n)=>{n.each((n=>{t?to(n):(Gf(n),e.selection.setCursorLocation(n.dom,0))}))})(e,r,s.filter(qr));const a=r?t[0]:t[t.length-1];return Yg(e,a,o,r),qr(a)?M.none():M.some(r?t.slice(1):t.slice(0,-1))})).getOr(t);Gg(r),Xg(e)})),Jg=(e,t,n,o)=>M.some((()=>{const r=e.selection.getRng(),s=t[0],a=n[n.length-1];Yg(e,s,r,!0),Yg(e,a,r,!1);const i=qr(s)?t:t.slice(1),l=qr(a)?n:n.slice(0,-1);Gg(i.concat(l)),o.deleteContents(),Xg(e)})),Zg=(e,t,n,o=!0)=>M.some((()=>{t.deleteContents();const r=Kg(n).getOr(n),s=mn(e.dom.getParent(r.dom,e.dom.isBlock));if(qr(s)&&(Gf(s),o&&e.selection.setCursorLocation(s.dom,0)),!bn(n,s)){const e=Dt(wn(s),n)?[]:wn(a=s).map(Nn).map((e=>K(e,(e=>!bn(a,e))))).getOr([]);$(e.concat(Nn(n)),(e=>{bn(e,s)||vn(e,s)||!qr(e)||to(e)}))}var a})),ep=(e,t)=>M.some((()=>Lg(e,!1,t))),tp=(e,t)=>Q(Qf(t,e),ar),np=(e,t)=>Q(Qf(t,e),("caption",e=>Ut(e)&&"caption"===Mt(e))),op=(e,t)=>M.some((()=>{Gf(t),e.selection.setCursorLocation(t.dom,0)})),rp=(e,t)=>e?$f(t):qf(t),sp=(e,t,n)=>{const o=mn(e.getBody());return np(o,n).fold((()=>((e,t,n,o)=>{const r=Ua.fromRangeStart(e.selection.getRng());return tp(n,o).bind((o=>qr(o)?op(e,o):((e,t,n,o,r)=>ac(n,e.getBody(),r).bind((e=>tp(t,mn(e.getNode())).bind((e=>bn(e,o)?M.none():M.some(S))))))(e,n,t,o,r)))})(e,t,o,n).orThunk((()=>Pt(((e,t)=>{const n=Ua.fromRangeStart(e.selection.getRng());return rp(t,n)||sc(t,e.getBody(),n).exists((e=>rp(t,e)))})(e,t),S)))),(n=>((e,t,n,o)=>{const r=Ua.fromRangeStart(e.selection.getRng());return qr(o)?op(e,o):((e,t,n,o,r)=>ac(n,e.getBody(),r).fold((()=>M.some(S)),(s=>((e,t,n,o)=>uc(e.dom).bind((r=>mc(e.dom).map((e=>t?n.isEqual(r)&&o.isEqual(e):n.isEqual(e)&&o.isEqual(r))))).getOr(!0))(o,n,r,s)?((e,t)=>op(e,t))(e,o):((e,t,n)=>np(e,mn(n.getNode())).fold((()=>M.some(S)),(e=>Pt(!bn(e,t),S))))(t,o,s))))(e,n,t,o,r)})(e,t,o,n)))},ap=(e,t)=>{const n=mn(e.selection.getStart(!0)),o=hu(e);return e.selection.isCollapsed()&&0===o.length?sp(e,t,n):((e,t,n)=>{const o=mn(e.getBody()),r=e.selection.getRng();return 0!==n.length?Qg(e,n,M.none()):((e,t,n,o)=>np(t,o).fold((()=>((e,t,n)=>Wg(t,n).bind((t=>t.fold(O(Zg,e),O(ep,e),O(Qg,e),O(Jg,e)))))(e,t,n)),(t=>((e,t)=>op(e,t))(e,t))))(e,o,r,t)})(e,n,o)},ip=(e,t)=>{for(;t&&t!==e;){if(Po(t)||Mo(t))return t;t=t.parentNode}return null},lp=(e,t)=>{t(e),e.firstChild&&lp(e.firstChild,t),e.next&&lp(e.next,t)},dp=(e,t,n,o)=>{const r=n.name;for(let t=0,s=e.length;t<s;t++){const s=e[t];if(s.name===r){const e=o.nodes[r];e?e.nodes.push(n):o.nodes[r]={filter:s,nodes:[n]}}}if(n.attributes)for(let e=0,r=t.length;e<r;e++){const r=t[e],s=r.name;if(s in n.attributes.map){const e=o.attributes[s];e?e.nodes.push(n):o.attributes[s]={filter:r,nodes:[n]}}}},cp=(e,t)=>{const n=e=>{fe(e,(e=>{const n=K(e.nodes,(e=>C(e.parent)));$(e.filter.callbacks,(o=>{o(n,e.filter.name,t)}))}))};n(e.nodes),n(e.attributes)},up=(e,t,n,o={})=>{const r=((e,t,n)=>{const o={nodes:{},attributes:{}};return n.firstChild&&lp(n.firstChild,(n=>{dp(e,t,n,o)})),o})(e,t,n);cp(r,o)},mp=(e,t,n,o)=>{t.insert&&n[o.name]?o.empty().append(new yf("br",1)):o.empty().append(new yf("#text",3)).value=dr},fp=(e,t)=>e&&e.firstChild&&e.firstChild===e.lastChild&&e.firstChild.name===t,gp=(e,t,n,o)=>o.isEmpty(t,n,(t=>((e,t)=>{const n=e.getElementRule(t.name);return n&&n.paddEmpty})(e,t))),pp=(e,t,n=e.parent)=>{if(t.getSpecialElements()[e.name])e.empty().remove();else{const o=e.children();for(const e of o)t.isValidChild(n.name,e.name)||pp(e,t,n);e.unwrap()}},hp=(e,t,n=S)=>{const o=t.getTextBlockElements(),r=t.getNonEmptyElements(),s=t.getWhitespaceElements(),a=Bt.makeMap("tr,td,th,tbody,thead,tfoot,table"),i=new Set;for(let l=0;l<e.length;l++){const d=e[l];let c,u,m;if(!d.parent||i.has(d))continue;if(o[d.name]&&"li"===d.parent.name){let e=d.next;for(;e&&o[e.name];)e.name="li",i.add(e),d.parent.insert(e,d.parent),e=e.next;d.unwrap();continue}const f=[d];for(c=d.parent;c&&!t.isValidChild(c.name,d.name)&&!a[c.name];c=c.parent)f.push(c);if(c&&f.length>1)if(t.isValidChild(c.name,d.name)){f.reverse(),u=f[0].clone(),n(u);let e=u;for(let o=0;o<f.length-1;o++){t.isValidChild(e.name,f[o].name)?(m=f[o].clone(),n(m),e.append(m)):m=e;for(let e=f[o].firstChild;e&&e!==f[o+1];){const t=e.next;m.append(e),e=t}e=m}gp(t,r,s,u)?c.insert(d,f[0],!0):(c.insert(u,f[0],!0),c.insert(d,u)),c=f[0],(gp(t,r,s,c)||fp(c,"br"))&&c.empty().remove()}else pp(d,t);else if(d.parent){if("li"===d.name){let e=d.prev;if(e&&("ul"===e.name||"ol"===e.name)){e.append(d);continue}if(e=d.next,e&&("ul"===e.name||"ol"===e.name)){e.insert(d,e.firstChild,!0);continue}const t=new yf("ul",1);n(t),d.wrap(t);continue}if(t.isValidChild(d.parent.name,"div")&&t.isValidChild("div",d.name)){const e=new yf("div",1);n(e),d.wrap(e)}else pp(d,t)}}},bp=e=>e.collapsed?e:(e=>{const t=Ua.fromRangeStart(e),n=Ua.fromRangeEnd(e),o=e.commonAncestorContainer;return sc(!1,o,n).map((r=>!Td(t,n,o)&&Td(t,r,o)?((e,t,n,o)=>{const r=document.createRange();return r.setStart(e,t),r.setEnd(n,o),r})(t.container(),t.offset(),r.container(),r.offset()):e)).getOr(e)})(e),vp=(e,t)=>{let n=t.firstChild,o=t.lastChild;return n&&"meta"===n.name&&(n=n.next),o&&"mce_marker"===o.attr("id")&&(o=o.prev),((e,t)=>{const n=e.getNonEmptyElements();return t&&(t.isEmpty(n)||((e,t)=>e.getBlockElements()[t.name]&&(e=>e.firstChild&&e.firstChild===e.lastChild)(t)&&(e=>"br"===e.name||e.value===dr)(t.firstChild))(e,t))})(e,o)&&(o=o.prev),!(!n||n!==o||"ul"!==n.name&&"ol"!==n.name)},yp=e=>{return e.length>0&&(!(n=e[e.length-1]).firstChild||(t=n)&&t.firstChild&&t.firstChild===t.lastChild&&(e=>e.data===dr||Do(e))(t.firstChild))?e.slice(0,-1):e;var t,n},Cp=(e,t)=>{const n=e.getParent(t,e.isBlock);return n&&"LI"===n.nodeName?n:null},xp=(e,t)=>{const n=Ua.after(e),o=tc(t).prev(n);return o?o.toRange():null},wp=(e,t,n,o)=>{const r=((e,t,n)=>{const o=t.serialize(n);return(e=>{const t=e.firstChild,n=e.lastChild;return t&&"META"===t.nodeName&&t.parentNode.removeChild(t),n&&"mce_marker"===n.id&&n.parentNode.removeChild(n),e})(e.createFragment(o))})(t,e,o),s=Cp(t,n.startContainer),a=yp((i=r.firstChild,K(i.childNodes,(e=>"LI"===e.nodeName))));var i;const l=t.getRoot(),d=e=>{const o=Ua.fromRangeStart(n),r=tc(t.getRoot()),a=1===e?r.prev(o):r.next(o);return!a||Cp(t,a.getNode())!==s};return d(1)?((e,t,n)=>{const o=e.parentNode;return Bt.each(t,(t=>{o.insertBefore(t,e)})),((e,t)=>{const n=Ua.before(e),o=tc(t).next(n);return o?o.toRange():null})(e,n)})(s,a,l):d(2)?((e,t,n,o)=>(o.insertAfter(t.reverse(),e),xp(t[0],n)))(s,a,l,t):((e,t,n,o)=>{const r=((e,t)=>{const n=t.cloneRange(),o=t.cloneRange();return n.setStartBefore(e),o.setEndAfter(e),[n.cloneContents(),o.cloneContents()]})(e,o),s=e.parentNode;return s.insertBefore(r[0],e),Bt.each(t,(t=>{s.insertBefore(t,e)})),s.insertBefore(r[1],e),s.removeChild(e),xp(t[t.length-1],n)})(s,a,l,n)},kp=Io,Sp=(e,t,n)=>{let o,r,s;const a=e.selection,i=e.dom,l=e.parser,d=n.merge,c=Rf({validate:!0},e.schema),u='<span id="mce_marker" data-mce-type="bookmark">&#xFEFF;</span>';-1===t.indexOf("{$caret}")&&(t+="{$caret}"),t=t.replace(/\{\$caret\}/,u),r=a.getRng();const m=r.startContainer||(r.parentElement?r.parentElement():null),f=e.getBody();m===f&&a.isCollapsed()&&i.isBlock(f.firstChild)&&((e,t)=>t&&!e.schema.getVoidElements()[t.nodeName])(e,f.firstChild)&&i.isEmpty(f.firstChild)&&(r=i.createRng(),r.setStart(f.firstChild,0),r.setEnd(f.firstChild,0),a.setRng(r)),a.isCollapsed()||(e=>{const t=e.dom,n=bp(e.selection.getRng());e.selection.setRng(n);const o=t.getParent(n.startContainer,kp);((e,t,n)=>null!==n&&n===e.getParent(t.endContainer,kp)&&Cu(mn(n),t))(t,n,o)?Zg(e,n,mn(o)):e.getDoc().execCommand("Delete",!1,null)})(e),o=a.getNode();const g={context:o.nodeName.toLowerCase(),data:n.data,insert:!0},p=l.parse(t,g);if(!0===n.paste&&vp(e.schema,p)&&((e,t)=>!!Cp(e,t))(i,o))return r=wp(c,i,a.getRng(),p),a.setRng(r),t;if((e=>{let t=e;for(;t=t.walk();)1===t.type&&t.attr("data-mce-fragment","1")})(p),s=p.lastChild,"mce_marker"===s.attr("id")){const t=s;for(s=s.prev;s;s=s.walk(!0))if(3===s.type||!i.isBlock(s.name)){e.schema.isValidChild(s.parent.name,"span")&&s.parent.insert(t,s,"br"===s.name);break}}if(e._selectionOverrides.showBlockCaretContainer(o),g.invalid){e.selection.setContent(u),o=a.getNode();const n=e.getBody();for(9===o.nodeType?o=s=n:s=o;s!==n;)o=s,s=s.parentNode;t=o===n?n.innerHTML:i.getOuterHTML(o);const r=l.parse(t);for(let e=r;e;e=e.walk())if("mce_marker"===e.attr("id")){e.replace(p);break}const d=p.children(),m=p.parent.name;p.unwrap();const f=K(d,(t=>!e.schema.isValidChild(m,t.name)));hp(f,e.schema),up(l.getNodeFilters(),l.getAttributeFilters(),r),t=c.serialize(r),o===n?i.setHTML(n,t):i.setOuterHTML(o,t)}else t=c.serialize(p),((e,t,n)=>{if("all"===n.getAttribute("data-mce-bogus"))n.parentNode.insertBefore(e.dom.createFragment(t),n);else{const o=n.firstChild,r=n.lastChild;!o||o===r&&"BR"===o.nodeName?e.dom.setHTML(n,t):e.selection.setContent(t,{no_events:!0})}})(e,t,o);var h;return((e,t)=>{const n=e.schema.getTextInlineElements(),o=e.dom;if(t){const t=e.getBody(),r=_f(o);Bt.each(o.select("*[data-mce-fragment]"),(e=>{if(C(n[e.nodeName.toLowerCase()])&&((e,t)=>te(Tf(e,t),(e=>!(e=>Af.has(e))(e))))(o,e))for(let n=e.parentNode;C(n)&&n!==t&&!Bf(o,e,n);n=n.parentNode)if(r.compare(n,e)){o.remove(e,!0);break}}))}})(e,d),((e,t)=>{let n;const o=e.dom,r=e.selection;if(!t)return;r.scrollIntoView(t);const s=ip(e.getBody(),t);if("false"===o.getContentEditable(s))return o.remove(t),void r.select(s);let a=o.createRng();const i=t.previousSibling;if(No(i)){a.setStart(i,i.nodeValue.length);const e=t.nextSibling;No(e)&&(i.appendData(e.data),e.parentNode.removeChild(e))}else a.setStartBefore(t),a.setEndBefore(t);const l=o.getParent(t,o.isBlock);o.remove(t),l&&o.isEmpty(l)&&(eo(mn(l)),a.setStart(l,0),a.setEnd(l,0),kp(l)||(e=>!!e.getAttribute("data-mce-fragment"))(l)||!(n=(t=>{let n=Ua.fromRangeStart(t);if(n=tc(e.getBody()).next(n),n)return n.toRange()})(a))?o.add(l,o.create("br",{"data-mce-bogus":"1"})):(a=n,o.remove(l))),r.setRng(a)})(e,i.get("mce_marker")),h=e.getBody(),Bt.each(h.getElementsByTagName("*"),(e=>{e.removeAttribute("data-mce-fragment")})),((e,t)=>{M.from(e.getParent(t,"td,th")).map(mn).each(Yf)})(i,a.getStart()),t},_p=e=>e instanceof yf,Ep=(e,t,n)=>{e.dom.setHTML(e.getBody(),t),!0!==n&&(e=>{nf(e)&&uc(e.getBody()).each((t=>{const n=t.getNode(),o=So(n)?uc(n).getOr(t):t;e.selection.setRng(o.toRange())}))})(e)},Np=(e,t)=>((e,t)=>{const n=e.dom;return n.parentNode?((e,t)=>Q(e.dom.childNodes,(e=>t(mn(e)))).map(mn))(mn(n.parentNode),(n=>!bn(e,n)&&t(n))):M.none()})(e,t).isSome(),Rp=e=>x(e)?e:L,Ap=(e,t,n)=>{const o=t(e),r=Rp(n);return o.orThunk((()=>r(e)?M.none():((e,t,n)=>{let o=e.dom;const r=Rp(n);for(;o.parentNode;){o=o.parentNode;const e=mn(o),n=t(e);if(n.isSome())return n;if(r(e))break}return M.none()})(e,t,r)))},Op=Hc,Tp=(e,t,n)=>{const o=e.formatter.get(n);if(o)for(let n=0;n<o.length;n++){const r=o[n];if(Yc(r)&&!1===r.inherit&&e.dom.is(t,r.selector))return!0}return!1},Bp=(e,t,n,o,r)=>{const s=e.dom.getRoot();return t!==s&&(t=e.dom.getParent(t,(t=>!!Tp(e,t,n)||t.parentNode===s||!!Pp(e,t,n,o,!0))),!!Pp(e,t,n,o,r))},Dp=(e,t,n)=>!(!Xc(n)||!Op(t,n.inline))||!(!Gc(n)||!Op(t,n.block))||!!Yc(n)&&yo(t)&&e.is(t,n.selector),Lp=(e,t,n,o,r,s)=>{const a=n[o];if(x(n.onmatch))return n.onmatch(t,n,o);if(a)if(v(a.length)){for(const i in a)if(we(a,i)){const l="attributes"===o?e.getAttrib(t,i):qc(e,t,i),d=Vc(a[i],s),c=y(l)||Ke(l);if(c&&y(d))continue;if(r&&c&&!n.exact)return!1;if((!r||n.exact)&&!Op(l,$c(d,i)))return!1}}else for(let n=0;n<a.length;n++)if("attributes"===o?e.getAttrib(t,a[n]):qc(e,t,a[n]))return!0;return!0},Pp=(e,t,n,o,r)=>{const s=e.formatter.get(n),a=e.dom;if(s&&t)for(let n=0;n<s.length;n++){const i=s[n];if(Dp(e.dom,t,i)&&Lp(a,t,i,"attributes",r,o)&&Lp(a,t,i,"styles",r,o)){const n=i.classes;if(n)for(let r=0;r<n.length;r++)if(!e.dom.hasClass(t,Vc(n[r],o)))return;return i}}},Mp=(e,t,n,o,r)=>{if(o)return Bp(e,o,t,n,r);if(o=e.selection.getNode(),Bp(e,o,t,n,r))return!0;const s=e.selection.getStart();return!(s===o||!Bp(e,s,t,n,r))},Ip=ur,Fp="_mce_caret",Up=e=>(e=>{const t=[];for(;e;){if(3===e.nodeType&&e.nodeValue!==Ip||e.childNodes.length>1)return[];1===e.nodeType&&t.push(e),e=e.firstChild}return t})(e).length>0,zp=e=>{if(e){const t=new Xo(e,e);for(e=t.current();e;e=t.next())if(No(e))return e}return null},jp=e=>{const t=cn("span");return qt(t,{id:Fp,"data-mce-bogus":"1","data-mce-type":"format-caret"}),e&&Jn(t,un(Ip)),t},Vp=(e,t,n=!0)=>{const o=e.dom,r=e.selection;if(Up(t))Lg(e,!1,mn(t),n);else{const e=r.getRng(),n=o.getParent(t,o.isBlock),s=e.startContainer,a=e.startOffset,i=e.endContainer,l=e.endOffset,d=(e=>{const t=zp(e);return t&&t.nodeValue.charAt(0)===Ip&&t.deleteData(0,1),t})(t);o.remove(t,!0),s===d&&a>0&&e.setStart(d,a-1),i===d&&l>0&&e.setEnd(d,l-1),n&&o.isEmpty(n)&&Gf(mn(n)),r.setRng(e)}},Hp=(e,t,n=!0)=>{const o=e.dom,r=e.selection;if(t)Vp(e,t,n);else if(!(t=pc(e.getBody(),r.getStart())))for(;t=o.get(Fp);)Vp(e,t,!1)},$p=(e,t)=>(e.appendChild(t),t),qp=(e,t)=>{const n=G(e,((e,t)=>$p(e,t.cloneNode(!1))),t);return $p(n,n.ownerDocument.createTextNode(Ip))},Wp=(e,t,n,o)=>{const a=e.dom,i=e.selection;let l,d,c;const u=[],m=i.getRng(),f=m.startContainer,g=m.startOffset;for(d=f,3===f.nodeType&&(g!==f.nodeValue.length&&(l=!0),d=d.parentNode);d;){if(Pp(e,d,t,n,o)){c=d;break}d.nextSibling&&(l=!0),u.push(d),d=d.parentNode}if(c)if(l){const r=i.getBookmark();m.collapse(!0);let s=mu(e,m,e.formatter.get(t),!0);s=gm(s),e.formatter.remove(t,n,s,o),i.moveToBookmark(r)}else{const l=pc(e.getBody(),c),d=jp(!1).dom;((e,t,n)=>{const o=e.dom,r=o.getParent(n,O(Uc,e));r&&o.isEmpty(r)?n.parentNode.replaceChild(t,n):((e=>{const t=Xs(e,"br"),n=K((e=>{const t=[];let n=e.dom;for(;n;)t.push(mn(n)),n=n.lastChild;return t})(e).slice(-1),tr);t.length===n.length&&$(n,to)})(mn(n)),o.isEmpty(n)?n.parentNode.replaceChild(t,n):o.insertAfter(t,n))})(e,d,null!==l?l:c);const m=((e,t,n,o,a,i)=>{const l=e.formatter,d=e.dom,c=K(ue(l.get()),(e=>e!==o&&!Ue(e,"removeformat"))),u=((e,t,n)=>Y(n,((n,o)=>{const r=((e,t)=>V(e.formatter.get(t),(e=>{const t=e=>e.length>1&&"%"===e.charAt(0);return V(["styles","attributes"],(n=>xe(e,n).exists((e=>{const n=p(e)?e:Ce(e);return V(n,t)}))))})))(e,o);return e.formatter.matchNode(t,o,{},r)?n.concat([o]):n}),[]))(e,n,c);if(K(u,(t=>!((e,t,n)=>{const o=["inline","block","selector","attributes","styles","classes"],a=e=>ve(e,((e,t)=>V(o,(e=>e===t))));return V(e.formatter.get(t),(t=>{const o=a(t);return V(e.formatter.get(n),(e=>{const t=a(e);return((e,t,n=s)=>r(n).eq(e,t))(o,t)}))}))})(e,t,o))).length>0){const e=n.cloneNode(!1);return d.add(t,e),l.remove(o,a,e,i),d.remove(e),M.some(e)}return M.none()})(e,d,c,t,n,o),f=qp(u.concat(m.toArray()),d);Vp(e,l,!1),i.setCursorLocation(f,1),a.isEmpty(c)&&a.remove(c)}},Kp=(e,t)=>{const n=e.schema.getTextInlineElements();return we(n,Mt(t))&&!gc(t.dom)&&!ko(t.dom)},Gp={},Yp=Re,Xp=Ee;Gp.pre||(Gp.pre=[]),Gp.pre.push((e=>{const t=e.selection.getRng();let n;const o=e=>r(e.previousSibling)&&-1!==Ae(n,e.previousSibling),r=Co(["pre"]);t.collapsed||(n=e.selection.getSelectedBlocks(),Xp(Yp(Yp(n,r),o),(e=>{((e,t)=>{const n=mn(t),o=Cn(n).dom;to(n),Zn(mn(e),[cn("br",o),cn("br",o),...Nn(n)])})(e.previousSibling,e)})))}));const Qp=Bt.each,Jp=e=>yo(e)&&!_c(e)&&!gc(e)&&!ko(e),Zp=(e,t)=>{for(let n=e;n;n=n[t]){if(No(n)&&We(n.data))return e;if(yo(n)&&!_c(n))return n}return e},eh=(e,t,n)=>{const o=_f(e);if(t&&n&&(t=Zp(t,"previousSibling"),n=Zp(n,"nextSibling"),o.compare(t,n))){for(let e=t.nextSibling;e&&e!==n;){const n=e;e=e.nextSibling,t.appendChild(n)}return e.remove(n),Bt.each(Bt.grep(n.childNodes),(e=>{t.appendChild(e)})),t}return n},th=(e,t,n,o)=>{if(o&&!1!==t.merge_siblings){const t=eh(e,Fc(o),o);eh(e,t,Fc(t,!0))}},nh=(e,t,n)=>{Qp(e.childNodes,(e=>{Jp(e)&&(t(e)&&n(e),e.hasChildNodes()&&nh(e,t,n))}))},oh=(e,t)=>n=>!(!n||!qc(e,n,t)),rh=(e,t,n)=>o=>{e.setStyle(o,t,n),""===o.getAttribute("style")&&o.removeAttribute("style"),((e,t)=>{"SPAN"===t.nodeName&&0===e.getAttribs(t).length&&e.remove(t,!0)})(e,o)},sh=ci([{keep:[]},{rename:["name"]},{removed:[]}]),ah=/^(src|href|style)$/,ih=Bt.each,lh=Hc,dh=(e,t,n)=>e.isChildOf(t,n)&&t!==n&&!e.isBlock(n),ch=(e,t,n)=>{let o=t[n?"startContainer":"endContainer"],r=t[n?"startOffset":"endOffset"];if(yo(o)){const e=o.childNodes.length-1;!n&&r&&r--,o=o.childNodes[r>e?e:r]}return No(o)&&n&&r>=o.nodeValue.length&&(o=new Xo(o,e.getBody()).next()||o),No(o)&&!n&&0===r&&(o=new Xo(o,e.getBody()).prev()||o),o},uh=(e,t)=>{const n=t?"firstChild":"lastChild";if((e=>/^(TR|TH|TD)$/.test(e.nodeName))(e)&&e[n]){const t=e[n];return"TR"===e.nodeName&&t[n]||t}return e},mh=(e,t,n,o)=>{const r=e.create(n,o);return t.parentNode.insertBefore(r,t),r.appendChild(t),r},fh=(e,t,n,o,r)=>{const s=mn(t),a=mn(e.create(o,r)),i=n?En(s):_n(s);return Zn(a,i),n?(Yn(s,a),Qn(a,s)):(Xn(s,a),Jn(a,s)),a.dom},gh=(e,t,n,o,r)=>{let s;const a=e.dom;if(!Dp(a,o,t)&&!((e,t)=>t.links&&"A"===e.nodeName)(o,t))return sh.keep();const i=o;if(Xc(t)&&"all"===t.remove&&p(t.preserve_attributes)){const e=K(a.getAttribs(i),(e=>j(t.preserve_attributes,e.name.toLowerCase())));if(a.removeAllAttribs(i),$(e,(e=>a.setAttrib(i,e.name,e.value))),e.length>0)return sh.rename("span")}if("all"!==t.remove){ih(t.styles,((e,o)=>{e=$c(Vc(e,n),o+""),w(o)&&(o=e,r=null),(t.remove_similar||!r||lh(qc(a,r,o),e))&&a.setStyle(i,o,""),s=!0})),s&&""===a.getAttrib(i,"style")&&(i.removeAttribute("style"),i.removeAttribute("data-mce-style")),ih(t.attributes,((e,o)=>{let s;if(e=Vc(e,n),w(o)&&(o=e,r=null),t.remove_similar||!r||lh(a.getAttrib(r,o),e)){if("class"===o&&(e=a.getAttrib(i,o))&&(s="",$(e.split(/\s+/),(e=>{/mce\-\w+/.test(e)&&(s+=(s?" ":"")+e)})),s))return void a.setAttrib(i,o,s);if(ah.test(o)&&i.removeAttribute("data-mce-"+o),"style"===o&&Co(["li"])(i)&&"none"===a.getStyle(i,"list-style-type"))return i.removeAttribute(o),void a.setStyle(i,"list-style-type","none");"class"===o&&i.removeAttribute("className"),i.removeAttribute(o)}})),ih(t.classes,(e=>{e=Vc(e,n),r&&!a.hasClass(r,e)||a.removeClass(i,e)}));const e=a.getAttribs(i);for(let t=0;t<e.length;t++){const n=e[t].nodeName;if(0!==n.indexOf("_")&&0!==n.indexOf("data-"))return sh.keep()}}return"none"!==t.remove?(((e,t,n)=>{const o=t.parentNode;let r;const s=e.dom,a=Ti(e);Gc(n)&&o===s.getRoot()&&(n.list_block&&lh(t,n.list_block)||$(de(t.childNodes),(t=>{zc(e,a,t.nodeName.toLowerCase())?r?r.appendChild(t):(r=mh(s,t,a),s.setAttribs(r,Bi(e))):r=null}))),(e=>Yc(e)&&Xc(e)&&Dt(xe(e,"mixed"),!0))(n)&&!lh(n.inline,t)||s.remove(t,!0)})(e,i,t),sh.removed()):sh.keep()},ph=(e,t,n,o,r)=>gh(e,t,n,o,r).fold(L,(t=>(e.dom.rename(o,t),!0)),P),hh=(e,t,n,o)=>gh(e,t,n,o,o).fold(N(o),(t=>(e.dom.createFragment().appendChild(o),e.dom.rename(o,t))),N(null)),bh=(e,t,n,o,r)=>{const s=e.formatter.get(t),a=s[0];let i=!0;const l=e.dom,d=e.selection,c=o=>{const i=((e,t,n,o,r)=>{let s;return $(Kc(e.dom,t.parentNode).reverse(),(t=>{if(!s&&"_start"!==t.id&&"_end"!==t.id){const a=Pp(e,t,n,o,r);a&&!1!==a.split&&(s=t)}})),s})(e,o,t,n,r);return((e,t,n,o,r,s,a,i)=>{let l,d,c;const u=e.dom;if(n){const s=n.parentNode;for(let n=o.parentNode;n&&n!==s;n=n.parentNode){l=u.clone(n,!1);for(let n=0;n<t.length&&(l=hh(e,t[n],i,l),null!==l);n++);l&&(d&&l.appendChild(d),c||(c=l),d=l)}a.mixed&&u.isBlock(n)||(o=u.split(n,o)),d&&(r.parentNode.insertBefore(d,r),c.appendChild(r),Xc(a)&&th(u,a,0,d))}return o})(e,s,i,o,o,0,a,n)},u=t=>V(s,(o=>ph(e,o,n,t,t))),m=t=>{let n=!0,o=!1;yo(t)&&l.getContentEditable(t)&&(n=i,i="true"===l.getContentEditable(t),o=!0);const r=de(t.childNodes);if(i&&!o){const e=u(t)||V(s,(e=>Dp(l,t,e))),n=t.parentNode;!e&&C(n)&&Qc(a)&&u(n)}if(a.deep&&r.length){for(let e=0;e<r.length;e++)m(r[e]);o&&(i=n)}$(["underline","line-through","overline"],(n=>{yo(t)&&e.dom.getStyle(t,"text-decoration")===n&&t.parentNode&&Wc(l,t.parentNode)===n&&ph(e,{deep:!1,exact:!0,inline:"span",styles:{textDecoration:n}},null,t)}))},f=e=>{const t=l.get(e?"_start":"_end");let n=t[e?"firstChild":"lastChild"];return(e=>_c(e)&&yo(e)&&("_start"===e.id||"_end"===e.id))(n)&&(n=n[e?"firstChild":"lastChild"]),No(n)&&0===n.data.length&&(n=e?t.previousSibling||t.nextSibling:t.nextSibling||t.previousSibling),l.remove(t,!0),n},g=t=>{let n,o,r=mu(e,t,s,t.collapsed);if(a.split){if(r=gm(r),n=ch(e,r,!0),o=ch(e,r),n!==o){if(n=uh(n,!0),o=uh(o,!1),dh(l,n,o)){const e=M.from(n.firstChild).getOr(n);return c(fh(l,e,!0,"span",{id:"_start","data-mce-type":"bookmark"})),void f(!0)}if(dh(l,o,n)){const e=M.from(o.lastChild).getOr(o);return c(fh(l,e,!1,"span",{id:"_end","data-mce-type":"bookmark"})),void f(!1)}n=mh(l,n,"span",{id:"_start","data-mce-type":"bookmark"}),o=mh(l,o,"span",{id:"_end","data-mce-type":"bookmark"});const e=l.createRng();e.setStartAfter(n),e.setEndBefore(o),fu(l,e,(e=>{$(e,(e=>{_c(e)||_c(e.parentNode)||c(e)}))})),c(n),c(o),n=f(!0),o=f()}else n=o=c(n);r.startContainer=n.parentNode?n.parentNode:n,r.startOffset=l.nodeIndex(n),r.endContainer=o.parentNode?o.parentNode:o,r.endOffset=l.nodeIndex(o)+1}fu(l,r,(e=>{$(e,m)}))};if(o){if(Mc(o)){const e=l.createRng();e.setStartBefore(o),e.setEndAfter(o),g(e)}else g(o);Pu(e,t,o,n)}else if("false"!==l.getContentEditable(d.getNode()))d.isCollapsed()&&Xc(a)&&!hu(e).length?Wp(e,t,n,r):(Su(d,!0,(()=>{ku(e,g)})),Xc(a)&&Mp(e,t,n,d.getStart())&&Ic(l,d,d.getRng()),e.nodeChanged()),Pu(e,t,o,n);else{o=d.getNode();for(let t=0;t<s.length&&(!s[t].ceFalseOverride||!ph(e,s[t],n,o,o));t++);Pu(e,t,o,n)}},vh=Bt.each,yh=Bt.each,Ch=e=>yo(e)&&!_c(e)&&!gc(e)&&!ko(e),xh=(e,t,n,o)=>{const r=e.formatter.get(t),s=r[0],a=!o&&e.selection.isCollapsed(),i=e.dom,l=e.selection,d=(e,t=s)=>{if(x(t.onformat)&&t.onformat(e,t,n,o),yh(t.styles,((t,o)=>{i.setStyle(e,o,Vc(t,n))})),t.styles){const t=i.getAttrib(e,"style");t&&i.setAttrib(e,"data-mce-style",t)}yh(t.attributes,((t,o)=>{i.setAttrib(e,o,Vc(t,n))})),yh(t.classes,(t=>{t=Vc(t,n),i.hasClass(e,t)||i.addClass(e,t)}))},c=(e,t)=>{let n=!1;return yh(e,(e=>!!Yc(e)&&(C(e.collapsed)&&e.collapsed!==a?void 0:i.is(t,e.selector)&&!gc(t)?(d(t,e),n=!0,!1):void 0))),n},u=e=>{if(m(e)){const t=i.create(e);return d(t),t}return null},f=(o,a,i)=>{const l=[];let m=!0;const f=s.inline||s.block,g=u(f);fu(o,a,(a=>{let u;const p=a=>{let h=!1,b=m;const v=a.nodeName.toLowerCase(),y=a.parentNode,x=y.nodeName.toLowerCase();if(yo(a)&&o.getContentEditable(a)&&(b=m,m="true"===o.getContentEditable(a),h=!0),Do(a)&&!((e,t,n,o)=>{if(pl(e)&&Xc(t)){const t={...e.schema.getTextBlockElements(),td:{},th:{},li:{},dt:{},dd:{},figcaption:{},caption:{},details:{},summary:{}},r=Np(mn(n),(e=>gc(e.dom)));return ke(t,o)&&qr(mn(n.parentNode),!1)&&!r}return!1})(e,s,a,x))return u=null,void(Gc(s)&&o.remove(a));if(Gc(s)&&s.wrapper&&Pp(e,a,t,n))u=null;else{if(m&&!h&&Gc(s)&&!s.wrapper&&Uc(e,v)&&zc(e,x,f)){const e=o.rename(a,f);return d(e),l.push(e),void(u=null)}if(Yc(s)){let e=c(r,a);if(!e&&C(y)&&Qc(s)&&(e=c(r,y)),!Xc(s)||e)return void(u=null)}!m||h||!zc(e,f,v)||!zc(e,x,f)||!i&&No(a)&&mr(a.data)||gc(a)||Xc(s)&&o.isBlock(a)?(u=null,$(de(a.childNodes),p),h&&(m=b),u=null):(u||(u=o.clone(g,!1),a.parentNode.insertBefore(u,a),l.push(u)),u.appendChild(a))}};$(a,p)})),!0===s.links&&$(l,(e=>{const t=e=>{"A"===e.nodeName&&d(e,s),$(de(e.childNodes),t)};t(e)})),$(l,(a=>{const i=(e=>{let t=0;return $(e.childNodes,(e=>{(e=>C(e)&&No(e)&&0===e.length)(e)||_c(e)||t++})),t})(a);!(l.length>1)&&o.isBlock(a)||0!==i?(Xc(s)||Gc(s)&&s.wrapper)&&(s.exact||1!==i||(a=(e=>{const t=Q(e.childNodes,Ch).filter((e=>Dp(o,e,s)));return t.map((t=>{const n=o.clone(t,!1);return d(n),o.replace(n,e,!0),o.remove(t,!0),n})).getOr(e)})(a)),((e,t,n,o)=>{vh(t,(t=>{Xc(t)&&vh(e.dom.select(t.inline,o),(o=>{Jp(o)&&ph(e,t,n,o,t.exact?o:null)})),((e,t,n)=>{if(t.clear_child_styles){const o=t.links?"*:not(a)":"*";Qp(e.select(o,n),(n=>{Jp(n)&&Qp(t.styles,((t,o)=>{e.setStyle(n,o,"")}))}))}})(e.dom,t,o)}))})(e,r,n,a),((e,t,n,o,r)=>{Pp(e,r.parentNode,n,o)&&ph(e,t,o,r)||t.merge_with_parents&&e.dom.getParent(r.parentNode,(s=>{if(Pp(e,s,n,o))return ph(e,t,o,r),!0}))})(e,s,t,n,a),((e,t,n,o)=>{t.styles&&t.styles.backgroundColor&&nh(o,oh(e,"fontSize"),rh(e,"backgroundColor",Vc(t.styles.backgroundColor,n)))})(o,s,n,a),((e,t,n,o)=>{const r=t=>{if(1===t.nodeType&&t.parentNode&&1===t.parentNode.nodeType){const n=Wc(e,t.parentNode);e.getStyle(t,"color")&&n?e.setStyle(t,"text-decoration",n):e.getStyle(t,"text-decoration")===n&&e.setStyle(t,"text-decoration",null)}};t.styles&&(t.styles.color||t.styles.textDecoration)&&(Bt.walk(o,r,"childNodes"),r(o))})(o,s,0,a),((e,t,n,o)=>{!Xc(t)||"sub"!==t.inline&&"sup"!==t.inline||(nh(o,oh(e,"fontSize"),rh(e,"fontSize","")),e.remove(e.select("sup"===t.inline?"sub":"sup",o),!0))})(o,s,0,a),th(o,s,0,a)):o.remove(a,!0)}))};if("false"!==i.getContentEditable(l.getNode())){if(s){if(o)if(Mc(o)){if(!c(r,o)){const t=i.createRng();t.setStartBefore(o),t.setEndAfter(o),f(i,mu(e,t,r),!0)}}else f(i,o,!0);else a&&Xc(s)&&!hu(e).length?((e,t,n)=>{let o,r;const s=e.selection,a=s.getRng();let i=a.startOffset;const l=a.startContainer.nodeValue;o=pc(e.getBody(),s.getStart()),o&&(r=zp(o));const d=/[^\s\u00a0\u00ad\u200b\ufeff]/;if(l&&i>0&&i<l.length&&d.test(l.charAt(i))&&d.test(l.charAt(i-1))){const o=s.getBookmark();a.collapse(!0);let r=mu(e,a,e.formatter.get(t));r=gm(r),e.formatter.apply(t,n,r),s.moveToBookmark(o)}else o&&r.nodeValue===Ip||(c=e.getDoc(),u=jp(!0).dom,o=c.importNode(u,!0),r=o.firstChild,a.insertNode(o),i=1),e.formatter.apply(t,n,o),s.setCursorLocation(r,i);var c,u})(e,t,n):(l.setRng(bp(l.getRng())),Su(l,!0,(()=>{ku(e,((t,n)=>{const o=n?t:mu(e,t,r);f(i,o,!1)}))})),Ic(i,l,l.getRng()),e.nodeChanged());((e,t)=>{Xp(Gp[e],(e=>{e(t)}))})(t,e)}Lu(e,t,o,n)}else{o=l.getNode();for(let e=0,t=r.length;e<t;e++){const t=r[e];if(t.ceFalseOverride&&Yc(t)&&i.is(o,t.selector)){d(o,t);break}}Lu(e,t,o,n)}},wh=e=>we(e,"vars"),kh=e=>e.selection.getStart(),Sh=(e,t,n,o,r)=>X(t,(t=>{const s=e.formatter.matchNode(t,n,null!=r?r:{},o);return!v(s)}),(t=>!!Tp(e,t,n)||!o&&C(e.formatter.matchNode(t,n,r,!0)))),_h=(e,t)=>{const n=null!=t?t:kh(e);return K(Kc(e.dom,n),(e=>yo(e)&&!ko(e)))},Eh=(e,t,n)=>{const o=_h(e,t);fe(n,((n,r)=>{const s=n=>{const s=Sh(e,o,r,n.similar,wh(n)?n.vars:void 0),a=s.isSome();if(n.state.get()!==a){n.state.set(a);const e=s.getOr(t);wh(n)?n.callback(a,{node:e,format:r,parents:o}):$(n.callbacks,(t=>t(a,{node:e,format:r,parents:o})))}};$([n.withSimilar,n.withoutSimilar],s),$(n.withVars,s)}))};var Nh=Object.hasOwnProperty,Rh=Object.setPrototypeOf,Ah=Object.isFrozen,Oh=Object.getPrototypeOf,Th=Object.getOwnPropertyDescriptor,Bh=Object.freeze,Dh=Object.seal,Lh=Object.create,Ph="undefined"!=typeof Reflect&&Reflect,Mh=Ph.apply,Ih=Ph.construct;Mh||(Mh=function(e,t,n){return e.apply(t,n)}),Bh||(Bh=function(e){return e}),Dh||(Dh=function(e){return e}),Ih||(Ih=function(e,t){return new(Function.prototype.bind.apply(e,[null].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(t))))});var Fh,Uh=Yh(Array.prototype.forEach),zh=Yh(Array.prototype.pop),jh=Yh(Array.prototype.push),Vh=Yh(String.prototype.toLowerCase),Hh=Yh(String.prototype.match),$h=Yh(String.prototype.replace),qh=Yh(String.prototype.indexOf),Wh=Yh(String.prototype.trim),Kh=Yh(RegExp.prototype.test),Gh=(Fh=TypeError,function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return Ih(Fh,t)});function Yh(e){return function(t){for(var n=arguments.length,o=Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return Mh(e,t,o)}}function Xh(e,t){Rh&&Rh(e,null);for(var n=t.length;n--;){var o=t[n];if("string"==typeof o){var r=Vh(o);r!==o&&(Ah(t)||(t[n]=r),o=r)}e[o]=!0}return e}function Qh(e){var t=Lh(null),n=void 0;for(n in e)Mh(Nh,e,[n])&&(t[n]=e[n]);return t}function Jh(e,t){for(;null!==e;){var n=Th(e,t);if(n){if(n.get)return Yh(n.get);if("function"==typeof n.value)return Yh(n.value)}e=Oh(e)}return function(e){return console.warn("fallback value for",e),null}}var Zh=Bh(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),eb=Bh(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),tb=Bh(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),nb=Bh(["animate","color-profile","cursor","discard","fedropshadow","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),ob=Bh(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),rb=Bh(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),sb=Bh(["#text"]),ab=Bh(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),ib=Bh(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),lb=Bh(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),db=Bh(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),cb=Dh(/\{\{[\s\S]*|[\s\S]*\}\}/gm),ub=Dh(/<%[\s\S]*|[\s\S]*%>/gm),mb=Dh(/^data-[\-\w.\u00B7-\uFFFF]/),fb=Dh(/^aria-[\-\w]+$/),gb=Dh(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),pb=Dh(/^(?:\w+script|data):/i),hb=Dh(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),bb=Dh(/^html$/i),vb="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function yb(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var Cb=function(){return"undefined"==typeof window?null:window},xb=function(e,t){if("object"!==(void 0===e?"undefined":vb(e))||"function"!=typeof e.createPolicy)return null;var n=null,o="data-tt-policy-suffix";t.currentScript&&t.currentScript.hasAttribute(o)&&(n=t.currentScript.getAttribute(o));var r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}},wb=function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Cb(),n=function(t){return e(t)};if(n.version="2.3.6",n.removed=[],!t||!t.document||9!==t.document.nodeType)return n.isSupported=!1,n;var o=t.document,r=t.document,s=t.DocumentFragment,a=t.HTMLTemplateElement,i=t.Node,l=t.Element,d=t.NodeFilter,c=t.NamedNodeMap,u=void 0===c?t.NamedNodeMap||t.MozNamedAttrMap:c,m=t.HTMLFormElement,f=t.DOMParser,g=t.trustedTypes,p=l.prototype,h=Jh(p,"cloneNode"),b=Jh(p,"nextSibling"),v=Jh(p,"childNodes"),y=Jh(p,"parentNode");if("function"==typeof a){var C=r.createElement("template");C.content&&C.content.ownerDocument&&(r=C.content.ownerDocument)}var x=xb(g,o),w=x?x.createHTML(""):"",k=r,S=k.implementation,_=k.createNodeIterator,E=k.createDocumentFragment,N=k.getElementsByTagName,R=o.importNode,A={};try{A=Qh(r).documentMode?r.documentMode:{}}catch(e){}var O={};n.isSupported="function"==typeof y&&S&&void 0!==S.createHTMLDocument&&9!==A;var T=cb,B=ub,D=mb,L=fb,P=pb,M=hb,I=gb,F=null,U=Xh({},[].concat(yb(Zh),yb(eb),yb(tb),yb(ob),yb(sb))),z=null,j=Xh({},[].concat(yb(ab),yb(ib),yb(lb),yb(db))),V=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),H=null,$=null,q=!0,W=!0,K=!1,G=!1,Y=!1,X=!1,Q=!1,J=!1,Z=!1,ee=!1,te=!0,ne=!0,oe=!1,re={},se=null,ae=Xh({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),ie=null,le=Xh({},["audio","video","img","source","image","track"]),de=null,ce=Xh({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ue="http://www.w3.org/1998/Math/MathML",me="http://www.w3.org/2000/svg",fe="http://www.w3.org/1999/xhtml",ge=fe,pe=!1,he=void 0,be=["application/xhtml+xml","text/html"],ve="text/html",ye=void 0,Ce=null,xe=r.createElement("form"),we=function(e){return e instanceof RegExp||e instanceof Function},ke=function(e){Ce&&Ce===e||(e&&"object"===(void 0===e?"undefined":vb(e))||(e={}),e=Qh(e),F="ALLOWED_TAGS"in e?Xh({},e.ALLOWED_TAGS):U,z="ALLOWED_ATTR"in e?Xh({},e.ALLOWED_ATTR):j,de="ADD_URI_SAFE_ATTR"in e?Xh(Qh(ce),e.ADD_URI_SAFE_ATTR):ce,ie="ADD_DATA_URI_TAGS"in e?Xh(Qh(le),e.ADD_DATA_URI_TAGS):le,se="FORBID_CONTENTS"in e?Xh({},e.FORBID_CONTENTS):ae,H="FORBID_TAGS"in e?Xh({},e.FORBID_TAGS):{},$="FORBID_ATTR"in e?Xh({},e.FORBID_ATTR):{},re="USE_PROFILES"in e&&e.USE_PROFILES,q=!1!==e.ALLOW_ARIA_ATTR,W=!1!==e.ALLOW_DATA_ATTR,K=e.ALLOW_UNKNOWN_PROTOCOLS||!1,G=e.SAFE_FOR_TEMPLATES||!1,Y=e.WHOLE_DOCUMENT||!1,J=e.RETURN_DOM||!1,Z=e.RETURN_DOM_FRAGMENT||!1,ee=e.RETURN_TRUSTED_TYPE||!1,Q=e.FORCE_BODY||!1,te=!1!==e.SANITIZE_DOM,ne=!1!==e.KEEP_CONTENT,oe=e.IN_PLACE||!1,I=e.ALLOWED_URI_REGEXP||I,ge=e.NAMESPACE||fe,e.CUSTOM_ELEMENT_HANDLING&&we(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(V.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&we(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(V.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(V.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),he=he=-1===be.indexOf(e.PARSER_MEDIA_TYPE)?ve:e.PARSER_MEDIA_TYPE,ye="application/xhtml+xml"===he?function(e){return e}:Vh,G&&(W=!1),Z&&(J=!0),re&&(F=Xh({},[].concat(yb(sb))),z=[],!0===re.html&&(Xh(F,Zh),Xh(z,ab)),!0===re.svg&&(Xh(F,eb),Xh(z,ib),Xh(z,db)),!0===re.svgFilters&&(Xh(F,tb),Xh(z,ib),Xh(z,db)),!0===re.mathMl&&(Xh(F,ob),Xh(z,lb),Xh(z,db))),e.ADD_TAGS&&(F===U&&(F=Qh(F)),Xh(F,e.ADD_TAGS)),e.ADD_ATTR&&(z===j&&(z=Qh(z)),Xh(z,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&Xh(de,e.ADD_URI_SAFE_ATTR),e.FORBID_CONTENTS&&(se===ae&&(se=Qh(se)),Xh(se,e.FORBID_CONTENTS)),ne&&(F["#text"]=!0),Y&&Xh(F,["html","head","body"]),F.table&&(Xh(F,["tbody"]),delete H.tbody),Bh&&Bh(e),Ce=e)},Se=Xh({},["mi","mo","mn","ms","mtext"]),_e=Xh({},["foreignobject","desc","title","annotation-xml"]),Ee=Xh({},["title","style","font","a","script"]),Ne=Xh({},eb);Xh(Ne,tb),Xh(Ne,nb);var Re=Xh({},ob);Xh(Re,rb);var Ae=function(e){var t=y(e);t&&t.tagName||(t={namespaceURI:fe,tagName:"template"});var n=Vh(e.tagName),o=Vh(t.tagName);return e.namespaceURI===me?t.namespaceURI===fe?"svg"===n:t.namespaceURI===ue?"svg"===n&&("annotation-xml"===o||Se[o]):Boolean(Ne[n]):e.namespaceURI===ue?t.namespaceURI===fe?"math"===n:t.namespaceURI===me?"math"===n&&_e[o]:Boolean(Re[n]):e.namespaceURI===fe&&!(t.namespaceURI===me&&!_e[o])&&!(t.namespaceURI===ue&&!Se[o])&&!Re[n]&&(Ee[n]||!Ne[n])},Oe=function(e){jh(n.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=w}catch(t){e.remove()}}},Te=function(e,t){try{jh(n.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){jh(n.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!z[e])if(J||Z)try{Oe(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},Be=function(e){var t=void 0,n=void 0;if(Q)e="<remove></remove>"+e;else{var o=Hh(e,/^[\r\n\t ]+/);n=o&&o[0]}"application/xhtml+xml"===he&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");var s=x?x.createHTML(e):e;if(ge===fe)try{t=(new f).parseFromString(s,he)}catch(e){}if(!t||!t.documentElement){t=S.createDocument(ge,"template",null);try{t.documentElement.innerHTML=pe?"":s}catch(e){}}var a=t.body||t.documentElement;return e&&n&&a.insertBefore(r.createTextNode(n),a.childNodes[0]||null),ge===fe?N.call(t,Y?"html":"body")[0]:Y?t.documentElement:a},De=function(e){return _.call(e.ownerDocument||e,e,d.SHOW_ELEMENT|d.SHOW_COMMENT|d.SHOW_TEXT,null,!1)},Le=function(e){return e instanceof m&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof u)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore)},Pe=function(e){return"object"===(void 0===i?"undefined":vb(i))?e instanceof i:e&&"object"===(void 0===e?"undefined":vb(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Me=function(e,t,o){O[e]&&Uh(O[e],(function(e){e.call(n,t,o,Ce)}))},Ie=function(e){var t=void 0;if(Me("beforeSanitizeElements",e,null),Le(e))return Oe(e),!0;if(Kh(/[\u0080-\uFFFF]/,e.nodeName))return Oe(e),!0;var o=ye(e.nodeName);if(Me("uponSanitizeElement",e,{tagName:o,allowedTags:F}),e.hasChildNodes()&&!Pe(e.firstElementChild)&&(!Pe(e.content)||!Pe(e.content.firstElementChild))&&Kh(/<[/\w]/g,e.innerHTML)&&Kh(/<[/\w]/g,e.textContent))return Oe(e),!0;if("select"===o&&Kh(/<template/i,e.innerHTML))return Oe(e),!0;if(!F[o]||H[o]){if(!H[o]&&Ue(o)){if(V.tagNameCheck instanceof RegExp&&Kh(V.tagNameCheck,o))return!1;if(V.tagNameCheck instanceof Function&&V.tagNameCheck(o))return!1}if(ne&&!se[o]){var r=y(e)||e.parentNode,s=v(e)||e.childNodes;if(s&&r)for(var a=s.length-1;a>=0;--a)r.insertBefore(h(s[a],!0),b(e))}return Oe(e),!0}return e instanceof l&&!Ae(e)?(Oe(e),!0):"noscript"!==o&&"noembed"!==o||!Kh(/<\/no(script|embed)/i,e.innerHTML)?(G&&3===e.nodeType&&(t=e.textContent,t=$h(t,T," "),t=$h(t,B," "),e.textContent!==t&&(jh(n.removed,{element:e.cloneNode()}),e.textContent=t)),Me("afterSanitizeElements",e,null),!1):(Oe(e),!0)},Fe=function(e,t,n){if(te&&("id"===t||"name"===t)&&(n in r||n in xe))return!1;if(W&&!$[t]&&Kh(D,t));else if(q&&Kh(L,t));else if(!z[t]||$[t]){if(!(Ue(e)&&(V.tagNameCheck instanceof RegExp&&Kh(V.tagNameCheck,e)||V.tagNameCheck instanceof Function&&V.tagNameCheck(e))&&(V.attributeNameCheck instanceof RegExp&&Kh(V.attributeNameCheck,t)||V.attributeNameCheck instanceof Function&&V.attributeNameCheck(t))||"is"===t&&V.allowCustomizedBuiltInElements&&(V.tagNameCheck instanceof RegExp&&Kh(V.tagNameCheck,n)||V.tagNameCheck instanceof Function&&V.tagNameCheck(n))))return!1}else if(de[t]);else if(Kh(I,$h(n,M,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==qh(n,"data:")||!ie[e])if(K&&!Kh(P,$h(n,M,"")));else if(n)return!1;return!0},Ue=function(e){return e.indexOf("-")>0},ze=function(e){var t=void 0,n=void 0,o=void 0,r=void 0;Me("beforeSanitizeAttributes",e,null);var s=e.attributes;if(s){var a={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:z};for(r=s.length;r--;){var i=t=s[r],l=i.name,d=i.namespaceURI;n=Wh(t.value),o=ye(l);var c=n;if(a.attrName=o,a.attrValue=n,a.keepAttr=!0,a.forceKeepAttr=void 0,Me("uponSanitizeAttribute",e,a),n=a.attrValue,!a.forceKeepAttr)if(a.keepAttr)if(Kh(/\/>/i,n))Te(l,e);else{G&&(n=$h(n,T," "),n=$h(n,B," "));var u=ye(e.nodeName);if(Fe(u,o,n)){if(n!==c)try{d?e.setAttributeNS(d,l,n):e.setAttribute(l,n)}catch(t){Te(l,e)}}else Te(l,e)}else Te(l,e)}Me("afterSanitizeAttributes",e,null)}},je=function e(t){var n=void 0,o=De(t);for(Me("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)Me("uponSanitizeShadowNode",n,null),Ie(n)||(n.content instanceof s&&e(n.content),ze(n));Me("afterSanitizeShadowDOM",t,null)};return n.sanitize=function(e,r){var a=void 0,l=void 0,d=void 0,c=void 0,u=void 0;if((pe=!e)&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Pe(e)){if("function"!=typeof e.toString)throw Gh("toString is not a function");if("string"!=typeof(e=e.toString()))throw Gh("dirty is not a string, aborting")}if(!n.isSupported){if("object"===vb(t.toStaticHTML)||"function"==typeof t.toStaticHTML){if("string"==typeof e)return t.toStaticHTML(e);if(Pe(e))return t.toStaticHTML(e.outerHTML)}return e}if(X||ke(r),n.removed=[],"string"==typeof e&&(oe=!1),oe){if(e.nodeName){var m=ye(e.nodeName);if(!F[m]||H[m])throw Gh("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof i)1===(l=(a=Be("\x3c!----\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===l.nodeName||"HTML"===l.nodeName?a=l:a.appendChild(l);else{if(!J&&!G&&!Y&&-1===e.indexOf("<"))return x&&ee?x.createHTML(e):e;if(!(a=Be(e)))return J?null:ee?w:""}a&&Q&&Oe(a.firstChild);for(var f=De(oe?e:a);d=f.nextNode();)3===d.nodeType&&d===c||Ie(d)||(d.content instanceof s&&je(d.content),ze(d),c=d);if(c=null,oe)return e;if(J){if(Z)for(u=E.call(a.ownerDocument);a.firstChild;)u.appendChild(a.firstChild);else u=a;return z.shadowroot&&(u=R.call(o,u,!0)),u}var g=Y?a.outerHTML:a.innerHTML;return Y&&F["!doctype"]&&a.ownerDocument&&a.ownerDocument.doctype&&a.ownerDocument.doctype.name&&Kh(bb,a.ownerDocument.doctype.name)&&(g="<!DOCTYPE "+a.ownerDocument.doctype.name+">\n"+g),G&&(g=$h(g,T," "),g=$h(g,B," ")),x&&ee?x.createHTML(g):g},n.setConfig=function(e){ke(e),X=!0},n.clearConfig=function(){Ce=null,X=!1},n.isValidAttribute=function(e,t,n){Ce||ke({});var o=ye(e),r=ye(t);return Fe(o,r,n)},n.addHook=function(e,t){"function"==typeof t&&(O[e]=O[e]||[],jh(O[e],t))},n.removeHook=function(e){O[e]&&zh(O[e])},n.removeHooks=function(e){O[e]&&(O[e]=[])},n.removeAllHooks=function(){O={}},n}();const kb=(e,t,n)=>{const o=ys();t.convert_fonts_to_spans&&((e,t,n)=>{e.addNodeFilter("font",(e=>{$(e,(e=>{const o=t.parse(e.attr("style")),r=e.attr("color"),s=e.attr("face"),a=e.attr("size");r&&(o.color=r),s&&(o["font-family"]=s),a&&(o["font-size"]=n[parseInt(e.attr("size"),10)-1]),e.name="span",e.attr("style",t.serialize(o)),((e,t)=>{$(["color","face","size"],(t=>{e.attr(t,null)}))})(e)}))}))})(e,o,Bt.explode(t.font_size_legacy_values)),((e,t,n)=>{e.addNodeFilter("strike",(e=>{const o="html4"!==t.type;$(e,(e=>{if(o)e.name="s";else{const t=n.parse(e.attr("style"));t["text-decoration"]="line-through",e.name="span",e.attr("style",n.serialize(t))}}))}))})(e,n,o)},Sb=e=>{let t;const n=decodeURIComponent(e).split(","),o=/data:([^;]+)/.exec(n[0]);return o&&(t=o[1]),{type:t,data:n[1]}},_b=(e,t)=>{let n;try{n=atob(t)}catch(e){return M.none()}const o=new Uint8Array(n.length);for(let e=0;e<o.length;e++)o[e]=n.charCodeAt(e);return M.some(new Blob([o],{type:e}))},Eb=e=>{return 0===e.indexOf("blob:")?(e=>new Promise(((t,n)=>{const o=()=>{n("Cannot convert "+e+" to Blob. Resource might not exist or is inaccessible.")};try{const n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="blob",n.onload=()=>{200===n.status?t(n.response):o()},n.onerror=o,n.send()}catch(e){o()}})))(e):0===e.indexOf("data:")?(t=e,new Promise((e=>{const{type:n,data:o}=Sb(t);_b(n,o).fold((()=>e(new Blob([]))),e)}))):null;var t},Nb=e=>new Promise((t=>{const n=new FileReader;n.onloadend=()=>{t(n.result)},n.readAsDataURL(e)}));let Rb=0;const Ab=e=>(e||"blobid")+Rb++,Ob=Bt.each,Tb=Bt.trim,Bb="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),Db={ftp:21,http:80,https:443,mailto:25},Lb=["img","video"],Pb=(e,t,n)=>{const o=(e=>{try{return decodeURIComponent(e)}catch(t){return unescape(e)}})(t);return!e.allow_script_urls&&(!!/((java|vb)script|mhtml):/i.test(o)||!e.allow_html_data_urls&&(/^data:image\//i.test(o)?((e,t)=>C(e)?!e:!C(t)||!j(Lb,t))(e.allow_svg_data_urls,n)&&/^data:image\/svg\+xml/i.test(o):/^data:/i.test(o)))};class Mb{constructor(e,t){e=Tb(e),this.settings=t||{};const n=this.settings.base_uri,o=this;if(/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e))return void(o.source=e);const r=0===e.indexOf("//");if(0!==e.indexOf("/")||r||(e=(n&&n.protocol||"http")+"://mce_host"+e),!/^[\w\-]*:?\/\//.test(e)){const t=this.settings.base_uri?this.settings.base_uri.path:new Mb(document.location.href).directory;if(this.settings.base_uri&&""==this.settings.base_uri.protocol)e="//mce_host"+o.toAbsPath(t,e);else{const r=/([^#?]*)([#?]?.*)/.exec(e);e=(n&&n.protocol||"http")+"://mce_host"+o.toAbsPath(t,r[1])+r[2]}}e=e.replace(/@@/g,"(mce_at)");const s=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?(\[[a-zA-Z0-9:.%]+\]|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);Ob(Bb,((e,t)=>{let n=s[t];n&&(n=n.replace(/\(mce_at\)/g,"@@")),o[e]=n})),n&&(o.protocol||(o.protocol=n.protocol),o.userInfo||(o.userInfo=n.userInfo),o.port||"mce_host"!==o.host||(o.port=n.port),o.host&&"mce_host"!==o.host||(o.host=n.host),o.source=""),r&&(o.protocol="")}static parseDataUri(e){let t;const n=decodeURIComponent(e).split(","),o=/data:([^;]+)/.exec(n[0]);return o&&(t=o[1]),{type:t,data:n[1]}}static isDomSafe(e,t,n={}){if(n.allow_script_urls)return!0;{const o=ls.decode(e).replace(/[\s\u0000-\u001F]+/g,"");return!Pb(n,o,t)}}static getDocumentBaseUrl(e){let t;return t=0!==e.protocol.indexOf("http")&&"file:"!==e.protocol?e.href:e.protocol+"//"+e.host+e.pathname,/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),t}setPath(e){const t=/^(.*?)\/?(\w+)?$/.exec(e);this.path=t[0],this.directory=t[1],this.file=t[2],this.source="",this.getURI()}toRelative(e){let t;if("./"===e)return e;const n=new Mb(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();const o=this.getURI(),r=n.getURI();return o===r||"/"===o.charAt(o.length-1)&&o.substr(0,o.length-1)===r?o:(t=this.toRelPath(this.path,n.path),n.query&&(t+="?"+n.query),n.anchor&&(t+="#"+n.anchor),t)}toAbsolute(e,t){const n=new Mb(e,{base_uri:this});return n.getURI(t&&this.isSameOrigin(n))}isSameOrigin(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;const t=Db[this.protocol];if(t&&(this.port||t)==(e.port||t))return!0}return!1}toRelPath(e,t){let n,o,r=0,s="";const a=e.substring(0,e.lastIndexOf("/")).split("/"),i=t.split("/");if(a.length>=i.length)for(n=0,o=a.length;n<o;n++)if(n>=i.length||a[n]!==i[n]){r=n+1;break}if(a.length<i.length)for(n=0,o=i.length;n<o;n++)if(n>=a.length||a[n]!==i[n]){r=n+1;break}if(1===r)return t;for(n=0,o=a.length-(r-1);n<o;n++)s+="../";for(n=r-1,o=i.length;n<o;n++)s+=n!==r-1?"/"+i[n]:i[n];return s}toAbsPath(e,t){let n,o,r=0,s=[];const a=/\/$/.test(t)?"/":"";let i=e.split("/");const l=t.split("/");for(Ob(i,(e=>{e&&s.push(e)})),i=s,n=l.length-1,s=[];n>=0;n--)0!==l[n].length&&"."!==l[n]&&(".."!==l[n]?r>0?r--:s.push(l[n]):r++);return n=i.length-r,o=n<=0?ne(s).join("/"):i.slice(0,n).join("/")+"/"+ne(s).join("/"),0!==o.indexOf("/")&&(o="/"+o),a&&o.lastIndexOf("/")!==o.length-1&&(o+=a),o}getURI(e=!1){let t;return 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}}const Ib=Bt.makeMap,Fb=Bt.each,Ub=Bt.explode,zb=Bt.extend,jb={IN_PLACE:!0,ALLOW_UNKNOWN_PROTOCOLS:!0,ALLOWED_TAGS:["#comment","#cdata-section","body"],ALLOWED_ATTR:[]},Vb=Bt.makeMap("src,href,data,background,action,formaction,poster,xlink:href"),Hb="data-mce-type",$b=(e,t)=>{const n=wb(),o=e.validate;let r=0;return n.addHook("uponSanitizeElement",((n,s)=>{var a,i;8===n.nodeType&&!e.allow_conditional_comments&&/^\[if/i.test(n.nodeValue)&&(n.nodeValue=" "+n.nodeValue);const l=s.tagName;if(1!==n.nodeType||"body"===l)return;const d=mn(n),c=Gt(d,Hb),u=Wt(d,"data-mce-bogus");if(!c&&m(u))return void("all"===u?to(d):no(d));const f=t.getElementRule(l.toLowerCase());if(!o||f){if(s.allowedTags[l]=!0,o&&!c){if($(null!==(a=f.attributesForced)&&void 0!==a?a:[],(e=>{$t(d,e.name,"{$uid}"===e.value?"mce_"+r++:e.value)})),$(null!==(i=f.attributesDefault)&&void 0!==i?i:[],(e=>{Gt(d,e.name)||$t(d,e.name,"{$uid}"===e.value?"mce_"+r++:e.value)})),f.attributesRequired&&!V(f.attributesRequired,(e=>Gt(d,e))))return void no(d);if(f.removeEmptyAttrs&&(e=>{const t=e.dom.attributes;return null==t||0===t.length})(d))return void no(d);f.outputName&&f.outputName!==l.toLowerCase()&&((e,t)=>{const n=((e,t)=>{const n=cn(t),o=Xt(e);return qt(n,o),n})(e,t);Xn(e,n);const o=Nn(e);Zn(n,o),to(e)})(d,f.outputName)}}else no(d)})),n.addHook("uponSanitizeAttribute",((n,r)=>{const s=n.tagName.toLowerCase(),{attrName:a,attrValue:i}=r;r.keepAttr=!o||t.isValid(s,a)||ze(a,"data-")||ze(a,"aria-"),a in Vb&&Pb(e,i,s)&&(r.keepAttr=!1),r.keepAttr?(r.allowedAttributes[a]=!0,a in t.getBoolAttrs()&&(r.attrValue=a),e.allow_svg_data_urls&&ze(i,"data:image/svg+xml")&&(r.forceKeepAttr=!0)):!n.hasAttribute(Hb)||"id"!==a&&"class"!==a&&"style"!==a||(r.forceKeepAttr=!0)})),n},qb=(e,t,n)=>{const o=e.name,r=o in n&&"title"!==o&&"textarea"!==o,s=t.childNodes;for(let t=0,o=s.length;t<o;t++){const o=s[t],a=new yf(o.nodeName.toLowerCase(),o.nodeType);if(yo(o)){const e=o.attributes;for(let t=0,n=e.length;t<n;t++){const n=e[t];a.attr(n.name,n.value)}}else No(o)?(a.value=o.data,r&&(a.raw=!0)):(Oo(o)||Ro(o)||Ao(o))&&(a.value=o.data);qb(a,o,n),e.append(a)}},Wb=(e={},t=vs())=>{const n={},o=[],r={validate:!0,root_name:"body",...e},s=new DOMParser,a=$b(r,t),i=()=>{const e=[];for(const t in n)we(n,t)&&e.push({name:t,callbacks:n[t]});return e},l={schema:t,addAttributeFilter:(e,t)=>{Fb(Ub(e),(e=>{let n;for(n=0;n<o.length;n++)if(o[n].name===e)return void o[n].callbacks.push(t);o.push({name:e,callbacks:[t]})}))},getAttributeFilters:()=>[].concat(o),addNodeFilter:(e,t)=>{Fb(Ub(e),(e=>{let o=n[e];o||(n[e]=o=[]),o.push(t)}))},getNodeFilters:i,parse:(e,n={})=>{var l;const d=r.validate,c=null!==(l=n.context)&&void 0!==l?l:r.root_name,u=((e,n,o="html")=>{const i="xhtml"===o?"application/xhtml+xml":"text/html",l=we(t.getSpecialElements(),n.toLowerCase()),d=l?`<${n}>${e}</${n}>`:e,c="xhtml"===o?`<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>${d}</body></html>`:`<body>${d}</body>`,u=s.parseFromString(c,i).body;return a.sanitize(u,((e,t)=>{const n={...jb};return n.PARSER_MEDIA_TYPE=t,e.allow_script_urls?n.ALLOWED_URI_REGEXP=/.*/:e.allow_html_data_urls&&(n.ALLOWED_URI_REGEXP=/^(?!(\w+script|mhtml):)/i),n})(r,i)),a.removed=[],l?u.firstChild:u})(e,c,n.format),m=new yf(c,11);qb(m,u,t.getSpecialElements());const[f,g]=((e,t,n,o)=>{const r=n.validate,s=t.getNonEmptyElements(),a=t.getWhitespaceElements(),i=zb(Ib("script,style,head,html,body,title,meta,param"),t.getBlockElements()),l=/[ \t\r\n]+/g,d=/^[ \t\r\n]+/,c=/[ \t\r\n]+$/,u=e=>{for(e=e.parent;C(e);){if(e.name in a)return!0;e=e.parent}return!1},m=(t,n)=>{const r=n?t.prev:t.next;return!C(r)&&t.parent.name in i&&(t.parent!==e||o.isRootContent)};return[e=>{if(3===e.type&&!u(e)){let t=e.value;t=t.replace(l," "),(((e,t)=>e&&(e.name in t||"br"===e.name))(e.prev,i)||m(e,!0))&&(t=t.replace(d,"")),0===t.length?e.remove():e.value=t}},e=>{var n;if(1===e.type){const n=t.getElementRule(e.name);if(r&&n){const r=gp(t,s,a,e);n.removeEmpty&&r?i[e.name]?e.remove():e.unwrap():n.paddEmpty&&(r||(e=>fp(e,"#text")&&e.firstChild.value===dr)(e))&&mp(0,o,i,e)}}else if(3===e.type&&!u(e)){let t=e.value;(i[null===(n=e.next)||void 0===n?void 0:n.name]||m(e,!1))&&(t=t.replace(c,"")),0===t.length?e.remove():e.value=t}}]})(m,t,r,n),p=[],h=d?e=>((e,n)=>{const o=e.parent;o&&t.children[e.name]&&!t.isValidChild(o.name,e.name)&&n.push(e)})(e,p):S,b=i(),v={nodes:{},attributes:{}},x=e=>dp(b,o,e,v);if(((e,t,n)=>{const o=[];for(let n=e,r=n;C(n);r=n,n=n.walk())$(t,(e=>e(n))),y(n.parent)&&n!==e?n=r:o.push(n);for(let e=o.length-1;e>=0;e--){const t=o[e];$(n,(e=>e(t)))}})(m,[f,x],[g,h]),p.reverse(),d&&p.length>0)if(n.context){const{pass:e,fail:o}=W(p,(e=>e.parent===m));hp(o,t,x),n.invalid=e.length>0}else hp(p,t,x);const w=((e,t)=>{var n;const o=null!==(n=t.forced_root_block)&&void 0!==n?n:e.forced_root_block;return!1===o?"":!0===o?"p":o})(r,n);return w&&("body"===m.name||n.isRootContent)&&((e,n)=>{const o=zb(Ib("script,style,head,html,body,title,meta,param"),t.getBlockElements()),s=/^[ \t\r\n]+/,a=/[ \t\r\n]+$/;let i=e.firstChild,l=null;const d=e=>{e&&(i=e.firstChild,i&&3===i.type&&(i.value=i.value.replace(s,"")),i=e.lastChild,i&&3===i.type&&(i.value=i.value.replace(a,"")))};if(t.isValidChild(e.name,n.toLowerCase())){for(;i;){const t=i.next;3===i.type||1===i.type&&"p"!==i.name&&!o[i.name]&&!i.attr(Hb)?(l||(l=new yf(n,1),l.attr(r.forced_root_block_attrs),e.insert(l,i)),l.append(i)):(d(l),l=null),i=t}d(l)}})(m,w),n.invalid||cp(v,n),m}};return((e,t)=>{const n=e.schema;t.remove_trailing_brs&&e.addNodeFilter("br",((e,t,o)=>{const r=Bt.extend({},n.getBlockElements()),s=n.getNonEmptyElements(),a=n.getWhitespaceElements();r.body=1;for(let t=0,i=e.length;t<i;t++){let i=e[t],l=i.parent;if(r[i.parent.name]&&i===l.lastChild){let e=i.prev;for(;e;){const t=e.name;if("span"!==t||"bookmark"!==e.attr("data-mce-type")){"br"===t&&(i=null);break}e=e.prev}if(i&&(i.remove(),gp(n,s,a,l))){const e=n.getElementRule(l.name);e&&(e.removeEmpty?l.remove():e.paddEmpty&&mp(0,o,r,l))}}else{let e=i;for(;l&&l.firstChild===e&&l.lastChild===e&&(e=l,!r[l.name]);)l=l.parent;if(e===l){const e=new yf("#text",3);e.value=dr,i.replace(e)}}}})),e.addAttributeFilter("href",(e=>{let n=e.length;const o=e=>{const t=e?Bt.trim(e):"";return/\b(noopener)\b/g.test(t)?t:(e=>e.split(" ").filter((e=>e.length>0)).concat(["noopener"]).sort().join(" "))(t)};if(!t.allow_unsafe_link_target)for(;n--;){const t=e[n];"a"===t.name&&"_blank"===t.attr("target")&&t.attr("rel",o(t.attr("rel")))}})),t.allow_html_in_named_anchor||e.addAttributeFilter("id,name",(e=>{let t,n,o,r,s=e.length;for(;s--;)if(r=e[s],"a"===r.name&&r.firstChild&&!r.attr("href")){o=r.parent,t=r.lastChild;do{n=t.prev,o.insert(t,r),t=n}while(t)}})),t.fix_list_elements&&e.addNodeFilter("ul,ol",(e=>{let t,n,o=e.length;for(;o--;)if(t=e[o],n=t.parent,"ul"===n.name||"ol"===n.name)if(t.prev&&"li"===t.prev.name)t.prev.append(t);else{const e=new yf("li",1);e.attr("style","list-style-type: none"),t.wrap(e)}})),t.validate&&n.getValidClasses()&&e.addAttributeFilter("class",(e=>{const t=n.getValidClasses();let o=e.length;for(;o--;){const n=e[o],r=n.attr("class").split(" ");let s="";for(let e=0;e<r.length;e++){const o=r[e];let a=!1,i=t["*"];i&&i[o]&&(a=!0),i=t[n.name],!a&&i&&i[o]&&(a=!0),a&&(s&&(s+=" "),s+=o)}s.length||(s=null),n.attr("class",s)}})),((e,t)=>{const{blob_cache:n}=t,o=e=>{const t=e.attr("src");(e=>e.attr("src")===Nt.transparentSrc||C(e.attr("data-mce-placeholder")))(e)||(e=>C(e.attr("data-mce-bogus")))(e)||(e=>{const t=/data:([^;]+);base64,([a-z0-9\+\/=\s]+)/i.exec(e);return t?M.some({type:t[1],data:decodeURIComponent(t[2])}):M.none()})(t).bind((({type:e,data:t})=>M.from(n.getByData(t,e)).orThunk((()=>_b(e,t).map((e=>{const o=n.create(Ab(),e,t);return n.add(o),o})))))).each((t=>{e.attr("src",t.blobUri())}))};n&&e.addAttributeFilter("src",(e=>$(e,o)))})(e,t)})(l,r),((e,t,n)=>{t.inline_styles&&kb(e,t,n)})(l,r,t),l},Kb=(e,t)=>{const n=(e=>_p(e)?Rf({validate:!1}).serialize(e):e)(e),o=t(n);if(o.isDefaultPrevented())return o;if(_p(e)){if(o.content!==n){const t=Wb({validate:!1,forced_root_block:!1}).parse(o.content,{context:e.name});return{...o,content:t}}return{...o,content:e}}return o},Gb=(e,t)=>{if(t.no_events)return di.value(t);{const n=((e,t)=>e.dispatch("BeforeGetContent",t))(e,t);return n.isDefaultPrevented()?di.error(Iu(e,{content:"",...n}).content):di.value(n)}},Yb=(e,t,n)=>n.no_events?t:Kb(t,(t=>Iu(e,{...n,content:t}))).content,Xb=(e,t)=>{if(t.no_events)return di.value(t);{const n=Kb(t.content,(n=>((e,t)=>e.dispatch("BeforeSetContent",t))(e,{...t,content:n})));return n.isDefaultPrevented()?(Mu(e,n),di.error(void 0)):di.value(n)}},Qb=(e,t,n)=>{n.no_events||Mu(e,{...n,content:t})},Jb=(e,t,n)=>({element:e,width:t,rows:n}),Zb=(e,t)=>({element:e,cells:t}),ev=(e,t)=>({x:e,y:t}),tv=(e,t)=>{const n=parseInt(Wt(e,t),10);return isNaN(n)?1:n},nv=(e,t,n)=>{const o=e.rows;return!!(o[n]?o[n].cells:[])[t]},ov=e=>Y(e,((e,t)=>t.cells.length>e?t.cells.length:e),0),rv=(e,t)=>{const n=e.rows;for(let e=0;e<n.length;e++){const o=n[e].cells;for(let n=0;n<o.length;n++)if(bn(o[n],t))return M.some(ev(n,e))}return M.none()},sv=(e,t,n,o,r)=>{const s=[],a=e.rows;for(let e=n;e<=r;e++){const n=a[e].cells,r=t<o?n.slice(t,o+1):n.slice(o,t+1);s.push(Zb(a[e].element,r))}return s},av=e=>((e,t)=>{const n=ia(e.element),o=cn("tbody");return Zn(o,t),Jn(n,o),n})(e,(e=>H(e.rows,(e=>{const t=H(e.cells,(e=>{const t=la(e);return Yt(t,"colspan"),Yt(t,"rowspan"),t})),n=ia(e.element);return Zn(n,t),n})))(e)),iv=(e,t)=>{const n=mn(t.commonAncestorContainer),o=Qf(n,e),r=K(o,(e=>er(e)||Jo(e))),s=((e,t)=>Q(e,(e=>"li"===Mt(e)&&Cu(e,t))).fold(N([]),(t=>(e=>Q(e,(e=>"ul"===Mt(e)||"ol"===Mt(e))))(e).map((e=>{const t=cn(Mt(e)),n=ve(Kn(e),((e,t)=>ze(t,"list-style")));return Hn(t,n),[cn("li"),t]})).getOr([]))))(o,t),a=r.concat(s.length?s:(e=>rr(e)?wn(e).filter(or).fold(N([]),(t=>[e,t])):or(e)?[e]:[])(n));return H(a,ia)},lv=()=>em([]),dv=(e,t)=>((e,t)=>qo(t,"table",O(bn,e)))(e,t[0]).bind((e=>{const n=t[0],o=t[t.length-1],r=(e=>{const t=Jb(ia(e),0,[]);return $(Xs(e,"tr"),((e,n)=>{$(Xs(e,"td,th"),((o,r)=>{((e,t,n,o,r)=>{const s=tv(r,"rowspan"),a=tv(r,"colspan"),i=e.rows;for(let e=n;e<n+s;e++){i[e]||(i[e]=Zb(la(o),[]));for(let o=t;o<t+a;o++)i[e].cells[o]=e===n&&o===t?r:ia(r)}})(t,((e,t,n)=>{for(;nv(e,t,n);)t++;return t})(t,r,n),n,e,o)}))})),Jb(t.element,ov(t.rows),t.rows)})(e);return((e,t,n)=>rv(e,t).bind((t=>rv(e,n).map((n=>((e,t,n)=>{const o=t.x,r=t.y,s=n.x,a=n.y,i=r<a?sv(e,o,r,s,a):sv(e,o,a,s,r);return Jb(e.element,ov(i),i)})(e,t,n))))))(r,n,o).map((e=>em([av(e)])))})).getOrThunk(lv),cv=(e,t)=>{const n=pu(t,e);return n.length>0?dv(e,n):((e,t)=>t.length>0&&t[0].collapsed?lv():((e,t)=>((e,t)=>{const n=Y(t,((e,t)=>(Jn(t,e),t)),e);return t.length>0?em([n]):n})(mn(t.cloneContents()),iv(e,t)))(e,t[0]))(e,t)},uv=(e,t)=>t>=0&&t<e.length&&Nc(e.charAt(t)),mv=e=>fr(e.innerText),fv=e=>yo(e)?e.outerHTML:No(e)?ls.encodeRaw(e.data,!1):Oo(e)?"\x3c!--"+e.data+"--\x3e":"",gv=(e,t)=>(((e,t)=>{let n=0;$(e,(e=>{0===e[0]?n++:1===e[0]?(((e,t,n)=>{const o=(e=>{let t;const n=document.createElement("div"),o=document.createDocumentFragment();for(e&&(n.innerHTML=e);t=n.firstChild;)o.appendChild(t);return o})(t);if(e.hasChildNodes()&&n<e.childNodes.length){const t=e.childNodes[n];t.parentNode.insertBefore(o,t)}else e.appendChild(o)})(t,e[1],n),n++):2===e[0]&&((e,t)=>{if(e.hasChildNodes()&&t<e.childNodes.length){const n=e.childNodes[t];n.parentNode.removeChild(n)}})(t,n)}))})(((e,t)=>{const n=e.length+t.length+2,o=new Array(n),r=new Array(n),s=(n,o,r,a,l)=>{const d=i(n,o,r,a);if(null===d||d.start===o&&d.diag===o-a||d.end===n&&d.diag===n-r){let s=n,i=r;for(;s<o||i<a;)s<o&&i<a&&e[s]===t[i]?(l.push([0,e[s]]),++s,++i):o-n>a-r?(l.push([2,e[s]]),++s):(l.push([1,t[i]]),++i)}else{s(n,d.start,r,d.start-d.diag,l);for(let t=d.start;t<d.end;++t)l.push([0,e[t]]);s(d.end,o,d.end-d.diag,a,l)}},a=(n,o,r,s)=>{let a=n;for(;a-o<s&&a<r&&e[a]===t[a-o];)++a;return((e,t,n)=>({start:e,end:t,diag:n}))(n,a,o)},i=(n,s,i,l)=>{const d=s-n,c=l-i;if(0===d||0===c)return null;const u=d-c,m=c+d,f=(m%2==0?m:m+1)/2;let g,p,h,b,v;for(o[1+f]=n,r[1+f]=s+1,g=0;g<=f;++g){for(p=-g;p<=g;p+=2){for(h=p+f,p===-g||p!==g&&o[h-1]<o[h+1]?o[h]=o[h+1]:o[h]=o[h-1]+1,b=o[h],v=b-n+i-p;b<s&&v<l&&e[b]===t[v];)o[h]=++b,++v;if(u%2!=0&&u-g<=p&&p<=u+g&&r[h-u]<=o[h])return a(r[h-u],p+n-i,s,l)}for(p=u-g;p<=u+g;p+=2){for(h=p+f-u,p===u-g||p!==u+g&&r[h+1]<=r[h-1]?r[h]=r[h+1]-1:r[h]=r[h-1],b=r[h]-1,v=b-n+i-p;b>=n&&v>=i&&e[b]===t[v];)r[h]=b--,v--;if(u%2==0&&-g<=p&&p<=g&&r[h]<=o[h+u])return a(r[h],p+n-i,s,l)}}},l=[];return s(0,e.length,0,t.length,l),l})(H(de(t.childNodes),fv),e),t),t),pv=De((()=>document.implementation.createHTMLDocument("undo"))),hv=e=>{const t=(n=e.getBody(),K(H(de(n.childNodes),fv),(e=>e.length>0)));var n;const o=ee(t,(t=>{const n=wf(e.serializer,t);return n.length>0?[n]:[]})),r=o.join("");return(e=>-1!==e.indexOf("</iframe>"))(r)?(e=>({type:"fragmented",fragments:e,content:"",bookmark:null,beforeBookmark:null}))(o):(e=>({type:"complete",fragments:null,content:e,bookmark:null,beforeBookmark:null}))(r)},bv=(e,t,n)=>{const o=n?t.beforeBookmark:t.bookmark;"fragmented"===t.type?gv(t.fragments,e.getBody()):e.setContent(t.content,{format:"raw",no_selection:!C(o)||!hc(o)||!o.isFakeCaret}),e.selection.moveToBookmark(o)},vv=e=>"fragmented"===e.type?e.fragments.join(""):e.content,yv=e=>{const t=cn("body",pv());return ro(t,vv(e)),$(Xs(t,"*[data-mce-bogus]"),no),oo(t)},Cv=(e,t)=>!(!e||!t)&&(!!((e,t)=>vv(e)===vv(t))(e,t)||((e,t)=>yv(e)===yv(t))(e,t)),xv=e=>0===e.get(),wv=(e,t,n)=>{xv(n)&&(e.typing=t)},kv=(e,t)=>{e.typing&&(wv(e,!1,t),e.add())},Sv=e=>({init:{bindEvents:S},undoManager:{beforeChange:(t,n)=>((e,t,n)=>{xv(t)&&n.set(ai(e.selection))})(e,t,n),add:(t,n,o,r,s,a)=>((e,t,n,o,r,s,a)=>{const i=hv(e);if(s=s||{},s=Bt.extend(s,i),!1===xv(o)||e.removed)return null;const l=t.data[n.get()];if(e.dispatch("BeforeAddUndo",{level:s,lastLevel:l,originalEvent:a}).isDefaultPrevented())return null;if(l&&Cv(l,s))return null;t.data[n.get()]&&r.get().each((e=>{t.data[n.get()].beforeBookmark=e}));const d=wl(e);if(d&&t.data.length>d){for(let e=0;e<t.data.length-1;e++)t.data[e]=t.data[e+1];t.data.length--,n.set(t.data.length)}s.bookmark=ai(e.selection),n.get()<t.data.length-1&&(t.data.length=n.get()+1),t.data.push(s),n.set(t.data.length-1);const c={level:s,lastLevel:l,originalEvent:a};return n.get()>0?(e.setDirty(!0),e.dispatch("AddUndo",c),e.dispatch("change",c)):e.dispatch("AddUndo",c),s})(e,t,n,o,r,s,a),undo:(t,n,o)=>((e,t,n,o)=>{let r;return t.typing&&(t.add(),t.typing=!1,wv(t,!1,n)),o.get()>0&&(o.set(o.get()-1),r=t.data[o.get()],bv(e,r,!0),e.setDirty(!0),e.dispatch("Undo",{level:r})),r})(e,t,n,o),redo:(t,n)=>((e,t,n)=>{let o;return t.get()<n.length-1&&(t.set(t.get()+1),o=n[t.get()],bv(e,o,!1),e.setDirty(!0),e.dispatch("Redo",{level:o})),o})(e,t,n),clear:(t,n)=>((e,t,n)=>{t.data=[],n.set(0),t.typing=!1,e.dispatch("ClearUndos")})(e,t,n),reset:e=>(e=>{e.clear(),e.add()})(e),hasUndo:(t,n)=>((e,t,n)=>n.get()>0||t.typing&&t.data[0]&&!Cv(hv(e),t.data[0]))(e,t,n),hasRedo:(e,t)=>((e,t)=>t.get()<e.data.length-1&&!e.typing)(e,t),transact:(e,t,n)=>((e,t,n)=>(kv(e,t),e.beforeChange(),e.ignore(n),e.add()))(e,t,n),ignore:(e,t)=>((e,t)=>{try{e.set(e.get()+1),t()}finally{e.set(e.get()-1)}})(e,t),extra:(t,n,o,r)=>((e,t,n,o,r)=>{if(t.transact(o)){const o=t.data[n.get()].bookmark,s=t.data[n.get()-1];bv(e,s,!0),t.transact(r)&&(t.data[n.get()-1].beforeBookmark=o)}})(e,t,n,o,r)},formatter:{match:(t,n,o,r)=>Mp(e,t,n,o,r),matchAll:(t,n)=>((e,t,n)=>{const o=[],r={},s=e.selection.getStart();return e.dom.getParent(s,(s=>{for(let a=0;a<t.length;a++){const i=t[a];!r[i]&&Pp(e,s,i,n)&&(r[i]=!0,o.push(i))}}),e.dom.getRoot()),o})(e,t,n),matchNode:(t,n,o,r)=>Pp(e,t,n,o,r),canApply:t=>((e,t)=>{const n=e.formatter.get(t),o=e.dom;if(n){const t=e.selection.getStart(),r=Kc(o,t);for(let e=n.length-1;e>=0;e--){const t=n[e];if(!Yc(t))return!0;for(let e=r.length-1;e>=0;e--)if(o.is(r[e],t.selector))return!0}}return!1})(e,t),closest:t=>((e,t)=>{const n=t=>bn(t,mn(e.getBody()));return M.from(e.selection.getStart(!0)).bind((o=>Ap(mn(o),(n=>ce(t,(t=>((t,n)=>Pp(e,t.dom,n)?M.some(n):M.none())(n,t)))),n))).getOrNull()})(e,t),apply:(t,n,o)=>xh(e,t,n,o),remove:(t,n,o,r)=>bh(e,t,n,o,r),toggle:(t,n,o)=>((e,t,n,o)=>{const r=e.formatter.get(t);!Mp(e,t,n,o)||"toggle"in r[0]&&!r[0].toggle?xh(e,t,n,o):bh(e,t,n,o)})(e,t,n,o),formatChanged:(t,n,o,r,s)=>((e,t,n,o,r,s)=>(null===t.get()&&((e,t)=>{e.set({}),t.on("NodeChange",(n=>{Eh(t,n.element,e.get())})),t.on("FormatApply FormatRemove",(n=>{const o=M.from(n.node).map((e=>Mc(e)?e:e.startContainer)).bind((e=>yo(e)?M.some(e):M.from(e.parentElement))).getOrThunk((()=>kh(t)));Eh(t,o,e.get())}))})(t,e),((e,t,n,o,r,s)=>{const a=t.get();$(n.split(","),(t=>{const n=xe(a,t).getOrThunk((()=>{const e={withSimilar:{state:zs(!1),similar:!0,callbacks:[]},withoutSimilar:{state:zs(!1),similar:!1,callbacks:[]},withVars:[]};return a[t]=e,e})),i=()=>{const n=_h(e);return Sh(e,n,t,r,s).isSome()};if(v(s)){const e=r?n.withSimilar:n.withoutSimilar;e.callbacks.push(o),1===e.callbacks.length&&e.state.set(i())}else n.withVars.push({state:zs(i()),similar:r,vars:s,callback:o})})),t.set(a)})(e,t,n,o,r,s),{unbind:()=>((e,t,n)=>{const o=e.get();$(t.split(","),(e=>xe(o,e).each((t=>{o[e]={withSimilar:{...t.withSimilar,callbacks:K(t.withSimilar.callbacks,(e=>e!==n))},withoutSimilar:{...t.withoutSimilar,callbacks:K(t.withoutSimilar.callbacks,(e=>e!==n))},withVars:K(t.withVars,(e=>e.callback!==n))}})))),e.set(o)})(t,n,o)}))(e,t,n,o,r,s)},editor:{getContent:t=>((e,t)=>M.from(e.getBody()).fold(N("tree"===t.format?new yf("body",11):""),(n=>((e,t,n)=>{let o;return o="raw"===t.format?Bt.trim(kf(e.serializer,n.innerHTML)):"text"===t.format?e.dom.isEmpty(n)?"":fr(n.innerText||n.textContent):"tree"===t.format?e.serializer.serialize(n,t):((e,t)=>{const n=Ti(e),o=new RegExp(`^(<${n}[^>]*>(&nbsp;|&#160;|\\s|\xa0|<br \\/>|)<\\/${n}>[\r\n]*|<br \\/>[\r\n]*)$`);return t.replace(o,"")})(e,e.serializer.serialize(n,t)),"text"!==t.format&&!ir(mn(n))&&m(o)?Bt.trim(o):o})(e,t,n))))(e,t),setContent:(t,n)=>((e,t,n)=>M.from(e.getBody()).map((o=>_p(t)?((e,t,n,o)=>{up(e.parser.getNodeFilters(),e.parser.getAttributeFilters(),n);const r=Rf({validate:!1},e.schema).serialize(n),s=ir(mn(t))?r:Bt.trim(r);return Ep(e,s,o.no_selection),{content:n,html:s}})(e,o,t,n):((e,t,n,o)=>{if(0===n.length||/^\s+$/.test(n)){const r='<br data-mce-bogus="1">';"TABLE"===t.nodeName?n="<tr><td>"+r+"</td></tr>":/^(UL|OL)$/.test(t.nodeName)&&(n="<li>"+r+"</li>");const s=Ti(e);return e.schema.isValidChild(t.nodeName.toLowerCase(),s.toLowerCase())?(n=r,n=e.dom.createHTML(s,Bi(e),n)):n||(n=r),Ep(e,n,o.no_selection),{content:n,html:n}}{"raw"!==o.format&&(n=Rf({validate:!1},e.schema).serialize(e.parser.parse(n,{isRootContent:!0,insert:!0})));const r=ir(mn(t))?n:Bt.trim(n);return Ep(e,r,o.no_selection),{content:r,html:r}}})(e,o,t,n))).getOr({content:t,html:_p(n.content)?"":n.content}))(e,t,n),insertContent:(t,n)=>Sp(e,t,n),addVisual:t=>((e,t)=>{const n=e.dom,o=C(t)?t:e.getBody();v(e.hasVisual)&&(e.hasVisual=Al(e)),$(n.select("table,a",o),(t=>{switch(t.nodeName){case"TABLE":const o=Ol(e),r=n.getAttrib(t,"border");r&&"0"!==r||!e.hasVisual?n.removeClass(t,o):n.addClass(t,o);break;case"A":if(!n.getAttrib(t,"href")){const o=n.getAttrib(t,"name")||t.id,r=Tl(e);o&&e.hasVisual?n.addClass(t,r):n.removeClass(t,r)}}})),e.dispatch("VisualAid",{element:t,hasVisual:e.hasVisual})})(e,t)},selection:{getContent:(t,n)=>((e,t,n={})=>{const o=((e,t)=>({...e,format:t,get:!0,selection:!0,getInner:!0}))(n,t);return Gb(e,o).fold(R,(t=>{const n=((e,t)=>{if("text"===t.format)return(e=>M.from(e.selection.getRng()).map((t=>{const n=M.from(e.dom.getParent(t.commonAncestorContainer,e.dom.isBlock)),o=e.getBody(),r=(e=>e.map((e=>e.nodeName)).getOr("div").toLowerCase())(n),s=e.dom.add(o,r,{"data-mce-bogus":"all",style:"overflow: hidden; opacity: 0;"},t.cloneContents()),a=mv(s),i=fr(s.textContent);if(e.dom.remove(s),uv(i,0)||uv(i,i.length-1)){const e=n.getOr(o),t=mv(e),r=t.indexOf(a);return-1===r?a:(uv(t,r-1)?" ":"")+a+(uv(t,r+a.length)?" ":"")}return a})).getOr(""))(e);{const n=((e,t)=>{const n=e.selection.getRng(),o=e.dom.create("body"),r=e.selection.getSel(),s=df(e,gu(r)),a=t.contextual?cv(mn(e.getBody()),s).dom:n.cloneContents();return a&&o.appendChild(a),e.selection.serializer.serialize(o,t)})(e,t);return"tree"===t.format?n:e.selection.isCollapsed()?"":n}})(e,t);return Yb(e,n,t)}))})(e,t,n)},autocompleter:{addDecoration:t=>ff(e,t),removeDecoration:()=>((e,t)=>gf(t).each((t=>{const n=e.selection.getBookmark();no(t),e.selection.moveToBookmark(n)})))(e,mn(e.getBody()))},raw:{getModel:()=>M.none()}}),_v=e=>we(e.plugins,"rtc"),Ev=e=>e.rtcInstance?e.rtcInstance:Sv(e),Nv=e=>{const t=e.rtcInstance;if(t)return t;throw new Error("Failed to get RTC instance not yet initialized.")},Rv=e=>Nv(e).init.bindEvents(),Av=e=>0===e.dom.length?(to(e),M.none()):M.some(e),Ov=(e,t,n,o)=>{e.bind((e=>((o?_g:Sg)(e.dom,o?e.dom.length:0),t.filter(zt).map((t=>((e,t,n,o)=>{const r=e.dom,s=t.dom,a=o?r.length:s.length;o?(Eg(r,s,!1,!o),n.setStart(s,a)):(Eg(s,r,!1,!o),n.setEnd(s,a))})(e,t,n,o)))))).orThunk((()=>{const e=((e,t)=>e.filter((e=>Tu.isBookmarkNode(e.dom))).bind(t?Sn:kn))(t,o).or(t).filter(zt);return e.map((e=>((e,t)=>{wn(e).each((n=>{const o=e.dom;t&&bg(n,Ua(o,0))?Sg(o,0):!t&&vg(n,Ua(o,o.length))&&_g(o,o.length)}))})(e,o)))}))},Tv=(e,t,n)=>{if(e&&we(e,t)){const o=K(e[t],(e=>e!==n));0===o.length?delete e[t]:e[t]=o}},Bv=e=>!(!e||!e.ownerDocument)&&vn(mn(e.ownerDocument),mn(e)),Dv=(e,t,n,o)=>{let r,s;const{selectorChangedWithUnbind:a}=((e,t)=>{let n,o;const r=(t,n)=>Q(n,(n=>e.is(n,t))),s=t=>e.getParents(t,null,e.getRoot());return{selectorChangedWithUnbind:(e,a)=>(n||(n={},o={},t.on("NodeChange",(e=>{const t=e.element,a=s(t),i={};Bt.each(n,((e,t)=>{r(t,a).each((n=>{o[t]||($(e,(e=>{e(!0,{node:n,selector:t,parents:a})})),o[t]=e),i[t]=e}))})),Bt.each(o,((e,n)=>{i[n]||(delete o[n],Bt.each(e,(e=>{e(!1,{node:t,selector:n,parents:a})})))}))}))),n[e]||(n[e]=[]),n[e].push(a),r(e,s(t.selection.getStart())).each((()=>{o[e]=n[e]})),{unbind:()=>{Tv(n,e,a),Tv(o,e,a)}})}})(e,o),i=(e,t)=>((e,t,n={})=>{const o=((e,t)=>({format:"html",...e,set:!0,selection:!0,content:t}))(n,t);Xb(e,o).each((t=>{const n=((e,t)=>{if("raw"!==t.format){const n=e.selection.getRng(),o=e.dom.getParent(n.commonAncestorContainer,e.dom.isBlock),r=o?{context:o.nodeName.toLowerCase()}:{},s=e.parser.parse(t.content,{forced_root_block:!1,...r,...t});return Rf({validate:!1},e.schema).serialize(s)}return t.content})(e,t),o=e.selection.getRng();((e,t)=>{const n=M.from(t.firstChild).map(mn),o=M.from(t.lastChild).map(mn);e.deleteContents(),e.insertNode(t);const r=n.bind(kn).filter(zt).bind(Av),s=o.bind(Sn).filter(zt).bind(Av);Ov(r,n,e,!0),Ov(s,o,e,!1),e.collapse(!1)})(o,o.createContextualFragment(n)),e.selection.setRng(o),Pm(e,o),Qb(e,n,t)}))})(o,e,t),l=e=>{const t=c();t.collapse(!!e),u(t)},d=()=>t.getSelection?t.getSelection():t.document.selection,c=()=>{let n,a,i;const l=(e,t,n)=>{try{return t.compareBoundaryPoints(e,n)}catch(e){return-1}},c=t.document;if(void 0!==o.bookmark&&!1===nf(o)){const e=Wm(o);if(e.isSome())return e.map((e=>df(o,[e])[0])).getOr(c.createRange())}try{(n=d())&&!vo(n.anchorNode)&&(a=n.rangeCount>0?n.getRangeAt(0):n.createRange?n.createRange():c.createRange(),a=df(o,[a])[0])}catch(e){}return a||(a=c.createRange()),a.setStart&&9===a.startContainer.nodeType&&a.collapsed&&(i=e.getRoot(),a.setStart(i,0),a.setEnd(i,0)),r&&s&&(0===l(a.START_TO_START,a,r)&&0===l(a.END_TO_END,a,r)?a=s:(r=null,s=null)),a},u=(e,t)=>{let n;if(!(e=>!!e&&Bv(e.startContainer)&&Bv(e.endContainer))(e))return;const a=d();if(e=o.dispatch("SetSelectionRange",{range:e,forward:t}).range,a){s=e;try{a.removeAllRanges(),a.addRange(e)}catch(e){}!1===t&&a.extend&&(a.collapse(e.endContainer,e.endOffset),a.extend(e.startContainer,e.startOffset)),r=a.rangeCount>0?a.getRangeAt(0):null}!e.collapsed&&e.startContainer===e.endContainer&&a.setBaseAndExtent&&e.endOffset-e.startOffset<2&&e.startContainer.hasChildNodes()&&(n=e.startContainer.childNodes[e.startOffset],n&&"IMG"===n.tagName&&(a.setBaseAndExtent(e.startContainer,e.startOffset,e.endContainer,e.endOffset),a.anchorNode===e.startContainer&&a.focusNode===e.endContainer||a.setBaseAndExtent(n,0,n,1))),o.dispatch("AfterSetSelectionRange",{range:e,forward:t})},m=()=>{const t=d(),n=null==t?void 0:t.anchorNode,o=null==t?void 0:t.focusNode;if(!t||!n||!o||vo(n)||vo(o))return!0;const r=e.createRng();r.setStart(n,t.anchorOffset),r.collapse(!0);const s=e.createRng();return s.setStart(o,t.focusOffset),s.collapse(!0),r.compareBoundaryPoints(r.START_TO_START,s)<=0},f={bookmarkManager:null,controlSelection:null,dom:e,win:t,serializer:n,editor:o,collapse:l,setCursorLocation:(t,n)=>{const r=e.createRng();C(t)&&C(n)?(r.setStart(t,n),r.setEnd(t,n),u(r),l(!1)):(xu(e,r,o.getBody(),!0),u(r))},getContent:e=>((e,t={})=>((e,t,n)=>Nv(e).selection.getContent(t,n))(e,t.format?t.format:"html",t))(o,e),setContent:i,getBookmark:(e,t)=>g.getBookmark(e,t),moveToBookmark:e=>g.moveToBookmark(e),select:(t,n)=>(((e,t,n)=>M.from(t).map((t=>{const o=e.nodeIndex(t),r=e.createRng();return r.setStart(t.parentNode,o),r.setEnd(t.parentNode,o+1),n&&(xu(e,r,t,!0),xu(e,r,t,!1)),r})))(e,t,n).each(u),t),isCollapsed:()=>{const e=c(),t=d();return!(!e||e.item)&&(e.compareEndPoints?0===e.compareEndPoints("StartToEnd",e):!t||e.collapsed)},isForward:m,setNode:t=>(i(e.getOuterHTML(t)),t),getNode:()=>((e,t)=>{let n,o,r;if(!t)return e;o=t.startContainer,r=t.endContainer;const s=t.startOffset,a=t.endOffset;return n=t.commonAncestorContainer,!t.collapsed&&(o===r&&a-s<2&&o.hasChildNodes()&&(n=o.childNodes[s]),3===o.nodeType&&3===r.nodeType&&(o=o.length===s?lf(o.nextSibling,!0):o.parentNode,r=0===a?lf(r.previousSibling,!1):r.parentNode,o&&o===r))?o:n&&3===n.nodeType?n.parentNode:n})(o.getBody(),c()),getSel:d,setRng:u,getRng:c,getStart:e=>sf(o.getBody(),c(),e),getEnd:e=>af(o.getBody(),c(),e),getSelectedBlocks:(t,n)=>((e,t,n,o)=>{let r;const s=[],a=e.getRoot();if(n=e.getParent(n||sf(a,t,t.collapsed),e.isBlock),o=e.getParent(o||af(a,t,t.collapsed),e.isBlock),n&&n!==a&&s.push(n),n&&o&&n!==o){r=n;const t=new Xo(n,a);for(;(r=t.next())&&r!==o;)e.isBlock(r)&&s.push(r)}return o&&n!==o&&o!==a&&s.push(o),s})(e,c(),t,n),normalize:()=>{const t=c(),n=d();if(!(gu(n).length>1)&&wu(o)){const n=mm(e,t);return n.each((e=>{u(e,m())})),n.getOr(t)}return t},selectorChanged:(e,t)=>(a(e,t),f),selectorChangedWithUnbind:a,getScrollContainer:()=>{let t,n=e.getRoot();for(;n&&"BODY"!==n.nodeName;){if(n.scrollHeight>n.clientHeight){t=n;break}n=n.parentNode}return t},scrollIntoView:(e,t)=>{C(e)?((e,t,n)=>{(e.inline?Bm:Lm)(e,t,n)})(o,e,t):Pm(o,c(),t)},placeCaretAt:(e,t)=>u(nm(e,t,o.getDoc())),getBoundingClientRect:()=>{const e=c();return e.collapsed?Ua.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:()=>{t=r=s=null,p.destroy()}},g=Tu(f),p=zu(f,o);return f.bookmarkManager=g,f.controlSelection=p,f},Lv=(e,t,n)=>{-1===Bt.inArray(t,n)&&(e.addAttributeFilter(n,((e,t)=>{let n=e.length;for(;n--;)e[n].attr(t,null)})),t.push(n))},Pv=(e,t)=>{const n=["data-mce-selected"],o=t&&t.dom?t.dom:Is.DOM,r=t&&t.schema?t.schema:vs(e);e.entity_encoding=e.entity_encoding||"named",e.remove_trailing_brs=!("remove_trailing_brs"in e)||e.remove_trailing_brs;const s=Wb(e,r);return((e,t,n)=>{e.addAttributeFilter("data-mce-tabindex",((e,t)=>{let n=e.length;for(;n--;){const o=e[n];o.attr("tabindex",o.attr("data-mce-tabindex")),o.attr(t,null)}})),e.addAttributeFilter("src,href,style",((e,o)=>{const r="data-mce-"+o,s=t.url_converter,a=t.url_converter_scope;let i=e.length;for(;i--;){const t=e[i];let l=t.attr(r);void 0!==l?(t.attr(o,l.length>0?l:null),t.attr(r,null)):(l=t.attr(o),"style"===o?l=n.serializeStyle(n.parseStyle(l),t.name):s&&(l=s.call(a,l,o,t.name)),t.attr(o,l.length>0?l:null))}})),e.addAttributeFilter("class",(e=>{let t=e.length;for(;t--;){const n=e[t];let o=n.attr("class");o&&(o=n.attr("class").replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),n.attr("class",o.length>0?o:null))}})),e.addAttributeFilter("data-mce-type",((e,t,n)=>{let o=e.length;for(;o--;){const t=e[o];if("bookmark"===t.attr("data-mce-type")&&!n.cleanup){const e=M.from(t.firstChild).exists((e=>!mr(e.value)));e?t.unwrap():t.remove()}}})),e.addNodeFilter("noscript",(e=>{let t=e.length;for(;t--;){const n=e[t].firstChild;n&&(n.value=ls.decode(n.value))}})),e.addNodeFilter("script,style",((e,n)=>{const o=e=>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,"");let r=e.length;for(;r--;){const s=e[r],a=s.firstChild?s.firstChild.value:"";if("script"===n){const e=s.attr("type");e&&s.attr("type","mce-no/type"===e?null:e.replace(/^mce\-/,"")),"xhtml"===t.element_format&&a.length>0&&(s.firstChild.value="// <![CDATA[\n"+o(a)+"\n// ]]>")}else"xhtml"===t.element_format&&a.length>0&&(s.firstChild.value="\x3c!--\n"+o(a)+"\n--\x3e")}})),e.addNodeFilter("#comment",(e=>{let o=e.length;for(;o--;){const r=e[o];t.preserve_cdata&&0===r.value.indexOf("[CDATA[")?(r.name="#cdata",r.type=4,r.value=n.decode(r.value.replace(/^\[CDATA\[|\]\]$/g,""))):0===r.value.indexOf("mce:protected ")&&(r.name="#text",r.type=3,r.raw=!0,r.value=unescape(r.value).substr(14))}})),e.addNodeFilter("xml:namespace,input",((e,t)=>{let n=e.length;for(;n--;){const o=e[n];7===o.type?o.remove():1===o.type&&("input"!==t||o.attr("type")||o.attr("type","text"))}})),e.addAttributeFilter("data-mce-type",(t=>{$(t,(t=>{"format-caret"===t.attr("data-mce-type")&&(t.isEmpty(e.schema.getNonEmptyElements())?t.remove():t.unwrap())}))})),e.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",((e,t)=>{let n=e.length;for(;n--;)e[n].attr(t,null)}))})(s,e,o),{schema:r,addNodeFilter:s.addNodeFilter,addAttributeFilter:s.addAttributeFilter,serialize:(n,a={})=>{const i={format:"html",...a},l=((e,t,n)=>((e,t)=>e&&e.hasEventListeners("PreProcess")&&!t.no_events)(e,n)?((e,t,n)=>{let o;const r=e.dom;let s=t.cloneNode(!0);const a=document.implementation;if(a.createHTMLDocument){const e=a.createHTMLDocument("");Bt.each("BODY"===s.nodeName?s.childNodes:[s],(t=>{e.body.appendChild(e.importNode(t,!0))})),s="BODY"!==s.nodeName?e.body.firstChild:e.body,o=r.doc,r.doc=e}return((e,t)=>{e.dispatch("PreProcess",t)})(e,{...n,node:s}),o&&(r.doc=o),s})(e,t,n):t)(t,n,i),d=((e,t,n)=>{const o=fr(n.getInner?t.innerHTML:e.getOuterHTML(t));return n.selection||ir(mn(t))?o:Bt.trim(o)})(o,l,i),c=((e,t,n)=>{const o=n.selection?{forced_root_block:!1,...n}:n,r=e.parse(t,o);return(e=>{const t=e=>e&&"br"===e.name,n=e.lastChild;if(t(n)){const e=n.prev;t(e)&&(n.remove(),e.remove())}})(r),r})(s,d,i);return"tree"===i.format?c:((e,t,n,o,r)=>{const s=((e,t,n)=>Rf(e,t).serialize(n))(t,n,o);return((e,t,n)=>{if(!t.no_events&&e){const o=((e,t)=>e.dispatch("PostProcess",t))(e,{...t,content:n});return o.content}return n})(e,r,s)})(t,e,r,c,i)},addRules:r.addValidElements,setRules:r.setValidElements,addTempAttr:O(Lv,s,n),getTempAttrs:N(n),getNodeFilters:s.getNodeFilters,getAttributeFilters:s.getAttributeFilters}},Mv=(e,t)=>{const n=Pv(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}},Iv=(e,t,n={})=>{const o=((e,t)=>({format:"html",...e,set:!0,content:t}))(n,t);return Xb(e,o).map((t=>{const n=((e,t,n)=>Ev(e).editor.setContent(t,n))(e,t.content,t);return Qb(e,n.html,t),n.content})).getOr(t)},Fv="autoresize_on_init,content_editable_state,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,tabfocus_elements,table_responsive_width,text_block_elements,text_inline_elements,toolbar_drawer,types,validate,whitespace_elements,paste_enable_default_filters,paste_filter_drop,paste_word_valid_elements,paste_retain_style_properties,paste_convert_word_fake_lists".split(","),Uv="bbcode,colorpicker,contextmenu,fullpage,legacyoutput,spellchecker,textcolor".split(","),zv=e=>{const t=K(Fv,(t=>we(e,t))),n=e.forced_root_block;return!1!==n&&""!==n||t.push("forced_root_block (false only)"),se(t)},jv=e=>{const t=Bt.makeMap(e.plugins," "),n=K(Uv,(e=>we(t,e)));return se(n)},Vv=Is.DOM,Hv=e=>M.from(e).each((e=>e.destroy())),$v=(()=>{const e={};return{add:(t,n)=>{e[t]=n},get:t=>e[t]?e[t]:{icons:{}},has:t=>we(e,t)}})(),qv=qs.ModelManager,Wv=(e,t)=>t.dom[e],Kv=(e,t)=>parseInt($n(t,e),10),Gv=O(Wv,"clientWidth"),Yv=O(Wv,"clientHeight"),Xv=O(Kv,"margin-top"),Qv=O(Kv,"margin-left"),Jv=e=>{const t=[],n=()=>{const t=e.theme;return t&&t.getNotificationManagerImpl?t.getNotificationManagerImpl():(()=>{const e=()=>{throw new Error("Theme did not provide a NotificationManager implementation.")};return{open:e,close:e,getArgs:e}})()},o=()=>M.from(t[0]),r=()=>{$(t,(e=>{e.reposition()}))},s=e=>{J(t,(t=>t===e)).each((e=>{t.splice(e,1)}))},a=(a,i=!0)=>{if(!e.removed&&(e=>{return(t=e.inline?e.getBody():e.getContentAreaContainer(),M.from(t).map(mn)).map(zn).getOr(!1);var t})(e))return i&&e.dispatch("BeforeOpenNotification",{notification:a}),Q(t,(e=>{return t=n().getArgs(e),o=a,!(t.type!==o.type||t.text!==o.text||t.progressBar||t.timeout||o.progressBar||o.timeout);var t,o})).getOrThunk((()=>{e.editorManager.setActive(e);const i=n().open(a,(()=>{s(i),r(),o().fold((()=>e.focus()),(e=>Mm(mn(e.getEl()))))}));return(e=>{t.push(e)})(i),r(),e.dispatch("OpenNotification",{notification:{...i}}),i}))},i=N(t);return(e=>{e.on("SkinLoaded",(()=>{const t=il(e);t&&a({text:t,type:"warning",timeout:0},!1),r()})),e.on("show ResizeEditor ResizeWindow NodeChange",(()=>{requestAnimationFrame(r)})),e.on("remove",(()=>{$(t.slice(),(e=>{n().close(e)}))}))})(e),{open:a,close:()=>{o().each((e=>{n().close(e),s(e),r()}))},getNotifications:i}},Zv=qs.PluginManager,ey=qs.ThemeManager,ty=e=>{let t=[];const n=()=>{const t=e.theme;return t&&t.getWindowManagerImpl?t.getWindowManagerImpl():(()=>{const e=()=>{throw new Error("Theme did not provide a WindowManager implementation.")};return{open:e,openUrl:e,alert:e,confirm:e,close:e,getParams:e,setParams:e}})()},o=(e,t)=>(...n)=>t?t.apply(e,n):void 0,r=n=>{(t=>{e.dispatch("CloseWindow",{dialog:t})})(n),t=K(t,(e=>e!==n)),0===t.length&&e.focus()},s=n=>{e.editorManager.setActive(e),qm(e),e.ui.show();const o=n();return(n=>{t.push(n),(t=>{e.dispatch("OpenWindow",{dialog:t})})(n)})(o),o};return e.on("remove",(()=>{$(t,(e=>{n().close(e)}))})),{open:(e,t)=>s((()=>n().open(e,t,r))),openUrl:e=>s((()=>n().openUrl(e,r))),alert:(e,t,r)=>{const s=n();s.alert(e,o(r||s,t))},confirm:(e,t,r)=>{const s=n();s.confirm(e,o(r||s,t))},close:()=>{M.from(t[t.length-1]).each((e=>{n().close(e),r(e)}))}}},ny=(e,t)=>{e.notificationManager.open({type:"error",text:t})},oy=(e,t)=>{e._skinLoaded?ny(e,t):e.on("SkinLoaded",(()=>{ny(e,t)}))},ry=(e,t,n)=>{Du(e,t,{message:n}),console.error(n)},sy=(e,t,n)=>n?`Failed to load ${e}: ${n} from url ${t}`:`Failed to load ${e} url: ${t}`,ay=(e,...t)=>{const n=window.console;n&&(n.error?n.error(e,...t):n.log(e,...t))},iy=(e,t)=>{const n=e.editorManager.baseURL+"/skins/content",o=`content${e.editorManager.suffix}.css`,r=!0===e.inline;return H(t,(t=>(e=>/^[a-z0-9\-]+$/i.test(e))(t)&&!r?`${n}/${t}/${o}`:e.documentBaseURI.toAbsolute(t)))},ly=P,dy=()=>{let e={};const t=(e,t)=>({status:e,resultUri:t}),n=t=>t in e;return{hasBlobUri:n,getResultUri:t=>{const n=e[t];return n?n.resultUri:null},isPending:t=>!!n(t)&&1===e[t].status,isUploaded:t=>!!n(t)&&2===e[t].status,markPending:n=>{e[n]=t(1,null)},markUploaded:(n,o)=>{e[n]=t(2,o)},removeFailed:t=>{delete e[t]},destroy:()=>{e={}}}};let cy=0;const uy=(e,t)=>{const n={},o=(e,n)=>new Promise(((o,r)=>{const s=new XMLHttpRequest;s.open("POST",t.url),s.withCredentials=t.credentials,s.upload.onprogress=e=>{n(e.loaded/e.total*100)},s.onerror=()=>{r("Image upload failed due to a XHR Transport error. Code: "+s.status)},s.onload=()=>{if(s.status<200||s.status>=300)return void r("HTTP Error: "+s.status);const e=JSON.parse(s.responseText);var n,a;e&&m(e.location)?o((n=t.basePath,a=e.location,n?n.replace(/\/$/,"")+"/"+a.replace(/^\//,""):a)):r("Invalid JSON: "+s.responseText)};const a=new FormData;a.append("file",e.blob(),e.filename()),s.send(a)})),r=(e,t)=>({url:t,blobInfo:e,status:!0}),s=(e,t)=>({url:"",blobInfo:e,status:!1,error:t}),a=(e,t)=>{Bt.each(n[e],(e=>{e(t)})),delete n[e]};return!1===x(t.handler)&&(t.handler=o),{upload:(i,l)=>t.url||t.handler!==o?((o,i)=>(o=Bt.grep(o,(t=>!e.isUploaded(t.blobUri()))),Promise.all(Bt.map(o,(o=>e.isPending(o.blobUri())?(e=>{const t=e.blobUri();return new Promise((e=>{n[t]=n[t]||[],n[t].push(e)}))})(o):((t,n,o)=>(e.markPending(t.blobUri()),new Promise((i=>{let l,d;try{const c=()=>{l&&(l.close(),d=S)},u=n=>{c(),e.markUploaded(t.blobUri(),n),a(t.blobUri(),r(t,n)),i(r(t,n))},f=n=>{c(),e.removeFailed(t.blobUri()),a(t.blobUri(),s(t,n)),i(s(t,n))};d=e=>{e<0||e>100||M.from(l).orThunk((()=>M.from(o).map(B))).each((t=>{l=t,t.progressBar.value(e)}))},n(t,d).then(u,(e=>{f(m(e)?{message:e}:e)}))}catch(e){i(s(t,e))}}))))(o,t.handler,i))))))(i,l):new Promise((e=>{e([])}))}},my=e=>()=>e.notificationManager.open({text:e.translate("Image uploading..."),type:"info",timeout:-1,progressBar:!0}),fy=(e,t)=>uy(t,{url:Vi(e),basePath:Hi(e),credentials:$i(e),handler:qi(e)}),gy=e=>{const t=(()=>{let e=[];const t=e=>{if(!e.blob||!e.base64)throw new Error("blob and base64 representations of the image are required for BlobInfo to be created");const t=e.id||"blobid"+cy+++(()=>{const e=()=>Math.round(4294967295*Math.random()).toString(36);return"s"+(new Date).getTime().toString(36)+e()+e()+e()})(),n=e.name||t,o=e.blob;var r;return{id:N(t),name:N(n),filename:N(e.filename||n+"."+(r=o.type,{"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.toLowerCase()]||"dat")),blob:N(o),base64:N(e.base64),blobUri:N(e.blobUri||URL.createObjectURL(o)),uri:N(e.uri)}},n=t=>Q(e,t).getOrUndefined(),o=e=>n((t=>t.id()===e));return{create:(e,n,o,r,s)=>{if(m(e))return t({id:e,name:r,filename:s,blob:n,base64:o});if(f(e))return t(e);throw new Error("Unknown input type")},add:t=>{o(t.id())||e.push(t)},get:o,getByUri:e=>n((t=>t.blobUri()===e)),getByData:(e,t)=>n((n=>n.base64()===e&&n.blob().type===t)),findFirst:n,removeByUri:t=>{e=K(e,(e=>e.blobUri()!==t||(URL.revokeObjectURL(e.blobUri()),!1)))},destroy:()=>{$(e,(e=>{URL.revokeObjectURL(e.blobUri())})),e=[]}}})();let n,o;const r=dy(),s=[],a=(e=>{const t=zs(null);return e.on("change AddUndo",(e=>{t.set({...e.level})})),{fireIfChanged:()=>{const n=e.undoManager.data;le(n).filter((e=>!Cv(t.get(),e))).each((t=>{e.setDirty(!0),e.dispatch("change",{level:t,lastLevel:ae(n,n.length-2).getOrNull()})}))}}})(e),i=t=>n=>e.selection?t(n):[],l=(e,t,n)=>{let o=0;do{o=e.indexOf(t,o),-1!==o&&(e=e.substring(0,o)+n+e.substr(o+t.length),o+=n.length-t.length+1)}while(-1!==o);return e},d=(e,t,n)=>{const o=`src="${n}"${n===Nt.transparentSrc?' data-mce-placeholder="1"':""}`;return e=l(e,`src="${t}"`,o),l(e,'data-mce-src="'+t+'"','data-mce-src="'+n+'"')},c=(t,n)=>{$(e.undoManager.data,(e=>{"fragmented"===e.type?e.fragments=H(e.fragments,(e=>d(e,t,n))):e.content=d(e.content,t,n)}))},u=()=>(n||(n=fy(e,r)),h().then(i((o=>{const r=H(o,(e=>e.blobInfo));return n.upload(r,my(e)).then(i((n=>{const r=[],s=H(n,((n,s)=>{const a=o[s].blobInfo,i=o[s].image;let l=!1;return n.status&&Ui(e)?(t.removeByUri(i.src),_v(e)||((t,n)=>{const o=e.convertURL(n,"src");var r;c(t.src,n),qt(mn(t),{src:Fi(e)?(r=n,r+(-1===r.indexOf("?")?"?":"&")+(new Date).getTime()):n,"data-mce-src":o})})(i,n.url)):n.error&&(n.error.remove&&(c(i.getAttribute("src"),Nt.transparentSrc),r.push(i),l=!0),((e,t)=>{oy(e,$s.translate(["Failed to upload image: {0}",t]))})(e,n.error.message)),{element:i,status:n.status,uploadUri:n.url,blobInfo:a,removed:l}}));return s.length>0&&a.fireIfChanged(),r.length>0&&!_v(e)&&e.undoManager.transact((()=>{$(r,(n=>{e.dom.remove(n),t.removeByUri(n.src)}))})),s})))})))),g=()=>Ii(e)?u():Promise.resolve([]),p=e=>te(s,(t=>t(e))),h=()=>(o||(o=((e,t)=>{const n={};return{findAll:(o,r)=>{r||(r=P);const s=K((e=>e?de(e.getElementsByTagName("img")):[])(o),(t=>{const n=t.src;return!t.hasAttribute("data-mce-bogus")&&!t.hasAttribute("data-mce-placeholder")&&!(!n||n===Nt.transparentSrc)&&(0===n.indexOf("blob:")?!e.isUploaded(n)&&r(t):0===n.indexOf("data:")&&r(t))})),a=H(s,(e=>{if(void 0!==n[e.src])return new Promise((t=>{n[e.src].then((n=>{if("string"==typeof n)return n;t({image:e,blobInfo:n.blobInfo})}))}));const o=new Promise(((n,o)=>{((e,t,n,o)=>{let r,s;if(0===t.src.indexOf("blob:"))return s=e.getByUri(t.src),void(s?n({image:t,blobInfo:s}):Eb(t.src).then((o=>{Nb(o).then((a=>{r=Sb(a).data,s=e.create(Ab(),o,r),e.add(s),n({image:t,blobInfo:s})}))}),(e=>{o(e)})));const{data:a,type:i}=Sb(t.src);r=a,s=e.getByData(r,i),s?n({image:t,blobInfo:s}):Eb(t.src).then((o=>{s=e.create(Ab(),o,r),e.add(s),n({image:t,blobInfo:s})}),(e=>{o(e)}))})(t,e,n,o)})).then((e=>(delete n[e.image.src],e))).catch((t=>(delete n[e.src],t)));return n[e.src]=o,o}));return Promise.all(a)}}})(r,t)),o.findAll(e.getBody(),p).then(i((t=>(t=K(t,(t=>"string"!=typeof t||(oy(e,t),!1))),_v(e)||$(t,(e=>{c(e.image.src,e.blobInfo.blobUri()),e.image.src=e.blobInfo.blobUri(),e.image.removeAttribute("data-mce-src")})),t))))),b=n=>n.replace(/src="(blob:[^"]+)"/g,((n,o)=>{const s=r.getResultUri(o);if(s)return'src="'+s+'"';let a=t.getByUri(o);return a||(a=Y(e.editorManager.get(),((e,t)=>e||t.editorUpload&&t.editorUpload.blobCache.getByUri(o)),null)),a?'src="data:'+a.blob().type+";base64,"+a.base64()+'"':n}));return e.on("SetContent",(()=>{Ii(e)?g():h()})),e.on("RawSaveContent",(e=>{e.content=b(e.content)})),e.on("GetContent",(e=>{e.source_view||"raw"===e.format||"tree"===e.format||(e.content=b(e.content))})),e.on("PostRender",(()=>{e.parser.addNodeFilter("img",(e=>{$(e,(e=>{const n=e.attr("src");if(t.getByUri(n))return;const o=r.getResultUri(n);o&&e.attr("src",o)}))}))})),{blobCache:t,addFilter:e=>{s.push(e)},uploadImages:u,uploadImagesAuto:g,scanForImages:h,destroy:()=>{t.destroy(),r.destroy(),o=n=null}}},py={remove_similar:!0,inherit:!1},hy={selector:"td,th",...py},by={tablecellbackgroundcolor:{styles:{backgroundColor:"%value"},...hy},tablecellverticalalign:{styles:{"vertical-align":"%value"},...hy},tablecellbordercolor:{styles:{borderColor:"%value"},...hy},tablecellclass:{classes:["%value"],...hy},tableclass:{selector:"table",classes:["%value"],...py},tablecellborderstyle:{styles:{borderStyle:"%value"},...hy},tablecellborderwidth:{styles:{borderWidth:"%value"},...hy}},vy=N(by),yy=Bt.each,Cy=Is.DOM,xy=(e,t)=>{let n,o,r;const s=t&&t.schema||vs({}),a=e=>{o="string"==typeof e?{name:e,classes:[],attrs:{}}:e;const t=Cy.create(o.name);return((e,t)=>{t.classes.length&&Cy.addClass(e,t.classes.join(" ")),Cy.setAttribs(e,t.attrs)})(t,o),t},i=(e,t,n)=>{let o,r;const l=t.length>0&&t[0],d=l&&l.name,c=((e,t)=>{const n="string"!=typeof e?e.nodeName.toLowerCase():e,o=s.getElementRule(n),r=o&&o.parentsRequired;return!(!r||!r.length)&&(t&&-1!==Bt.inArray(r,t)?t:r[0])})(e,d);if(c)d===c?(r=t[0],t=t.slice(1)):r=c;else if(l)r=t[0],t=t.slice(1);else if(!n)return e;return r&&(o=a(r),o.appendChild(e)),n&&(o||(o=Cy.create("div"),o.appendChild(e)),Bt.each(n,(t=>{const n=a(t);o.insertBefore(n,e)}))),i(o,t,r&&r.siblings)};return e&&e.length?(o=e[0],n=a(o),r=Cy.create("div"),r.appendChild(i(n,e.slice(1),o.siblings)),r):""},wy=e=>{let t;const n={classes:[],attrs:{}};return"*"!==(e=n.selector=Bt.trim(e))&&(t=e.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,((e,t,o,r,s)=>{switch(t){case"#":n.attrs.id=o;break;case".":n.classes.push(o);break;case":":-1!==Bt.inArray("checked disabled enabled read-only required".split(" "),o)&&(n.attrs[o]=o)}if("["===r){const e=s.match(/([\w\-]+)(?:\=\"([^\"]+))?/);e&&(n.attrs[e[1]]=e[2])}return""}))),n.name=t||"div",n},ky=(e,t)=>{let n,o,r,s="",a=gl(e);if(""===a)return"";const i=e=>e.replace(/%(\w+)/g,"");if("string"==typeof t){if(!(t=e.formatter.get(t)))return;t=t[0]}if("preview"in t){const e=xe(t,"preview");if(Dt(e,!1))return"";a=e.getOr(a)}n=t.block||t.inline||"span";const l=(d=t.selector)&&"string"==typeof d?(d=(d=d.split(/\s*,\s*/)[0]).replace(/\s*(~\+|~|\+|>)\s*/g,"$1"),Bt.map(d.split(/(?:>|\s+(?![^\[\]]+\]))/),(e=>{const t=Bt.map(e.split(/(?:~\+|~|\+)/),wy),n=t.pop();return t.length&&(n.siblings=t),n})).reverse()):[];var d;l.length?(l[0].name||(l[0].name=n),n=t.selector,o=xy(l,e)):o=xy([n],e);const c=Cy.select(n,o)[0]||o.firstChild;return yy(t.styles,((e,t)=>{const n=i(e);n&&Cy.setStyle(c,t,n)})),yy(t.attributes,((e,t)=>{const n=i(e);n&&Cy.setAttrib(c,t,n)})),yy(t.classes,(e=>{const t=i(e);Cy.hasClass(c,t)||Cy.addClass(c,t)})),e.dispatch("PreviewFormats"),Cy.setStyles(o,{position:"absolute",left:-65535}),e.getBody().appendChild(o),r=Cy.getStyle(e.getBody(),"fontSize",!0),r=/px$/.test(r)?parseInt(r,10):0,yy(a.split(" "),(t=>{let n=Cy.getStyle(c,t,!0);if(!("background-color"===t&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(n)&&(n=Cy.getStyle(e.getBody(),t,!0),"#ffffff"===Pc(n).toLowerCase())||"color"===t&&"#000000"===Pc(n).toLowerCase())){if("font-size"===t&&/em|%$/.test(n)){if(0===r)return;n=parseFloat(n)/(/%$/.test(n)?100:1)*r+"px"}"border"===t&&n&&(s+="padding:0 2px;"),s+=t+":"+n+";"}})),e.dispatch("AfterPreviewFormats"),Cy.remove(o),s},Sy=e=>{const t=(e=>{const t={},n=(e,o)=>{e&&(m(e)?(p(o)||(o=[o]),$(o,(e=>{v(e.deep)&&(e.deep=!Yc(e)),v(e.split)&&(e.split=!Yc(e)||Xc(e)),v(e.remove)&&Yc(e)&&!Xc(e)&&(e.remove="none"),Yc(e)&&Xc(e)&&(e.mixed=!0,e.block_expand=!0),m(e.classes)&&(e.classes=e.classes.split(/\s+/))})),t[e]=o):fe(e,((e,t)=>{n(t,e)})))};return n((e=>{const t=e.dom,n=e.schema.type,o={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},{selector:"img,audio,video",collapsed:!1,styles:{float:"left"},preview:"font-family font-size"},{selector:"table",collapsed:!1,styles:{marginLeft:"0px",marginRight:"auto"},onformat:e=>{t.setStyle(e,"float",null)},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"},{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"},{selector:"img,audio,video",collapsed:!1,styles:{float:"right"},preview:"font-family font-size"},{selector:"table",collapsed:!1,styles:{marginRight:"0px",marginLeft:"auto"},onformat:e=>{t.setStyle(e,"float",null)},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,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:(()=>{const e={inline:"span",styles:{textDecoration:"line-through"},exact:!0},t={inline:"strike",remove:"all",preserve_attributes:["class","style"]},o={inline:"s",remove:"all",preserve_attributes:["class","style"]};return"html4"!==n?[o,e,t]:[e,o,t]})(),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",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:(e,t,n)=>yo(e)&&e.hasAttribute("href"),onformat:(e,n,o)=>{Bt.each(o,((n,o)=>{t.setAttrib(e,o,n)}))}},lang:{inline:"span",clear_child_styles:!0,remove_similar:!0,attributes:{lang:"%value","data-mce-lang":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}]};return Bt.each("p h1 h2 h3 h4 h5 h6 div address pre dt dd samp".split(/\s/),(e=>{o[e]={block:e,remove:"all"}})),o})(e)),n(vy()),n(fl(e)),{get:e=>C(e)?t[e]:t,has:e=>we(t,e),register:n,unregister:e=>(e&&t[e]&&delete t[e],t)}})(e),n=zs(null);return(e=>{e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(let 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"])})(e),(e=>{e.on("mouseup keydown",(t=>{((e,t)=>{const n=e.selection,o=e.getBody();Hp(e,null,!1),8!==t&&46!==t||!n.isCollapsed()||n.getStart().innerHTML!==Ip||Hp(e,pc(o,n.getStart())),37!==t&&39!==t||Hp(e,pc(o,n.getStart()))})(e,t.keyCode)}))})(e),{get:t.get,has:t.has,register:t.register,unregister:t.unregister,apply:(t,n,o)=>{((e,t,n,o)=>{Nv(e).formatter.apply(t,n,o)})(e,t,n,o)},remove:(t,n,o,r)=>{((e,t,n,o,r)=>{Nv(e).formatter.remove(t,n,o,r)})(e,t,n,o,r)},toggle:(t,n,o)=>{((e,t,n,o)=>{Nv(e).formatter.toggle(t,n,o)})(e,t,n,o)},match:(t,n,o,r)=>((e,t,n,o,r)=>Nv(e).formatter.match(t,n,o,r))(e,t,n,o,r),closest:t=>((e,t)=>Nv(e).formatter.closest(t))(e,t),matchAll:(t,n)=>((e,t,n)=>Nv(e).formatter.matchAll(t,n))(e,t,n),matchNode:(t,n,o,r)=>((e,t,n,o,r)=>Nv(e).formatter.matchNode(t,n,o,r))(e,t,n,o,r),canApply:t=>((e,t)=>Nv(e).formatter.canApply(t))(e,t),formatChanged:(t,o,r,s)=>((e,t,n,o,r,s)=>Nv(e).formatter.formatChanged(t,n,o,r,s))(e,n,t,o,r,s),getCssText:O(ky,e)}},_y=e=>{switch(e.toLowerCase()){case"undo":case"redo":case"mcefocus":return!0;default:return!1}},Ey=e=>{const t=Ws(),n=zs(0),o=zs(0),r={data:[],typing:!1,beforeChange:()=>{((e,t,n)=>{Nv(e).undoManager.beforeChange(t,n)})(e,n,t)},add:(s,a)=>((e,t,n,o,r,s,a)=>Nv(e).undoManager.add(t,n,o,r,s,a))(e,r,o,n,t,s,a),undo:()=>((e,t,n,o)=>Nv(e).undoManager.undo(t,n,o))(e,r,n,o),redo:()=>((e,t,n)=>Nv(e).undoManager.redo(t,n))(e,o,r.data),clear:()=>{((e,t,n)=>{Nv(e).undoManager.clear(t,n)})(e,r,o)},reset:()=>{((e,t)=>{Nv(e).undoManager.reset(t)})(e,r)},hasUndo:()=>((e,t,n)=>Nv(e).undoManager.hasUndo(t,n))(e,r,o),hasRedo:()=>((e,t,n)=>Nv(e).undoManager.hasRedo(t,n))(e,r,o),transact:t=>((e,t,n,o)=>Nv(e).undoManager.transact(t,n,o))(e,r,n,t),ignore:t=>{((e,t,n)=>{Nv(e).undoManager.ignore(t,n)})(e,n,t)},extra:(t,n)=>{((e,t,n,o,r)=>{Nv(e).undoManager.extra(t,n,o,r)})(e,r,o,t,n)}};return _v(e)||((e,t,n)=>{const o=zs(!1),r=e=>{wv(t,!1,n),t.add({},e)};e.on("init",(()=>{t.add()})),e.on("BeforeExecCommand",(e=>{const o=e.command;_y(o)||(kv(t,n),t.beforeChange())})),e.on("ExecCommand",(e=>{const t=e.command;_y(t)||r(e)})),e.on("ObjectResizeStart cut",(()=>{t.beforeChange()})),e.on("SaveContent ObjectResized blur",r),e.on("dragend",r),e.on("keyup",(n=>{const s=n.keyCode;n.isDefaultPrevented()||((s>=33&&s<=36||s>=37&&s<=40||45===s||n.ctrlKey)&&(r(),e.nodeChanged()),46!==s&&8!==s||e.nodeChanged(),o.get()&&t.typing&&!1===Cv(hv(e),t.data[0])&&(!1===e.isDirty()&&e.setDirty(!0),e.dispatch("TypingUndo"),o.set(!1),e.nodeChanged()))})),e.on("keydown",(e=>{const s=e.keyCode;if(e.isDefaultPrevented())return;if(s>=33&&s<=36||s>=37&&s<=40||45===s)return void(t.typing&&r(e));const a=e.ctrlKey&&!e.altKey||e.metaKey;!(s<16||s>20)||224===s||91===s||t.typing||a||(t.beforeChange(),wv(t,!0,n),t.add({},e),o.set(!0))})),e.on("mousedown",(e=>{t.typing&&r(e)})),e.on("input",(e=>{var t;e.inputType&&("insertReplacementText"===e.inputType||"insertText"===(t=e).inputType&&null===t.data||(e=>"insertFromPaste"===e.inputType||"insertFromDrop"===e.inputType)(e))&&r(e)})),e.on("AddUndo Undo Redo ClearUndos",(t=>{t.isDefaultPrevented()||e.nodeChanged()}))})(e,r,n),(e=>{e.addShortcut("meta+z","","Undo"),e.addShortcut("meta+y,meta+shift+z","","Redo")})(e),r},Ny=[9,27,Uu.HOME,Uu.END,19,20,44,144,145,33,34,45,16,17,18,91,92,93,Uu.DOWN,Uu.UP,Uu.LEFT,Uu.RIGHT].concat(Nt.browser.isFirefox()?[224]:[]),Ry="data-mce-placeholder",Ay=e=>"keydown"===e.type||"keyup"===e.type,Oy=e=>{const t=e.keyCode;return t===Uu.BACKSPACE||t===Uu.DELETE},Ty=/[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/,By=(e,t)=>pn(mn(t),nl(e)),Dy=(e,t,n)=>{const o=((e,t,n)=>K(Is.DOM.getParents(n.container(),"*",t),e))(e,t,n);return M.from(o[o.length-1])},Ly=(e,t)=>{if(!t)return t;const n=t.container(),o=t.offset();return e?br(n)?No(n.nextSibling)?Ua(n.nextSibling,0):Ua.after(n):Cr(t)?Ua(n,o+1):t:br(n)?No(n.previousSibling)?Ua(n.previousSibling,n.previousSibling.data.length):Ua.before(n):xr(t)?Ua(n,o-1):t},Py=O(Ly,!0),My=O(Ly,!1),Iy=(e,t)=>{const n=e=>e.stopImmediatePropagation();e.on("beforeinput input",n,!0),e.getDoc().execCommand(t),e.off("beforeinput input",n)},Fy=e=>Iy(e,"Delete"),Uy=e=>nr(e)||rr(e),zy=(e,t)=>vn(e,t)?$o(t,Uy,(e=>t=>bn(e,mn(t.dom.parentNode)))(e)):M.none(),jy=e=>{e.dom.isEmpty(e.getBody())&&(e.setContent(""),(e=>{const t=e.getBody(),n=t.firstChild&&e.dom.isBlock(t.firstChild)?t.firstChild:t;e.selection.setCursorLocation(n,0)})(e))},Vy=(e,t)=>({from:e,to:t}),Hy=(e,t)=>{const n=mn(e),o=mn(t.container());return zy(n,o).map((e=>((e,t)=>({block:e,position:t}))(e,t)))},$y=e=>{const t=Nn(e);return J(t,Zo).fold(N(t),(e=>t.slice(0,e)))},qy=e=>{const t=$y(e);return $(t,to),t},Wy=(e,t)=>{const n=Qf(t,e);return Q(n.reverse(),(e=>qr(e))).each(to)},Ky=(e,t,n,o)=>{if(qr(n))return Gf(n),uc(n.dom);0===K(_n(o),(e=>!qr(e))).length&&qr(t)&&Yn(o,cn("br"));const r=cc(n.dom,Ua.before(o.dom));return $(qy(t),(e=>{Yn(o,e)})),Wy(e,t),r},Gy=(e,t,n)=>{if(qr(n))return to(n),qr(t)&&Gf(t),uc(t.dom);const o=mc(n.dom);return $(qy(t),(e=>{Jn(n,e)})),Wy(e,t),o},Yy=(e,t)=>{lc(e,t.dom).map((e=>e.getNode())).map(mn).filter(tr).each(to)},Xy=(e,t,n)=>(Yy(!0,t),Yy(!1,n),((e,t)=>vn(t,e)?((e,t)=>{const n=Qf(t,e);return M.from(n[n.length-1])})(t,e):M.none())(t,n).fold(O(Gy,e,t,n),O(Ky,e,t,n))),Qy=(e,t,n,o)=>t?Xy(e,o,n):Xy(e,n,o),Jy=(e,t)=>{const n=mn(e.getBody()),o=((e,t,n)=>n.collapsed?((e,t,n)=>{const o=Hy(e,Ua.fromRangeStart(n)),r=o.bind((n=>sc(t,e,n.position).bind((n=>Hy(e,n).map((n=>((e,t,n)=>Do(n.position.getNode())&&!1===qr(n.block)?lc(!1,n.block.dom).bind((o=>o.isEqual(n.position)?sc(t,e,o).bind((t=>Hy(e,t))):M.some(n))).getOr(n):n)(e,t,n)))))));return Lt(o,r,Vy).filter((e=>(e=>!1===bn(e.from.block,e.to.block))(e)&&(e=>wn(e.from.block).bind((t=>wn(e.to.block).filter((e=>bn(t,e))))).isSome())(e)&&(e=>!1===Mo(e.from.block.dom)&&!1===Mo(e.to.block.dom))(e)))})(e,t,n):M.none())(n.dom,t,e.selection.getRng()).map((o=>()=>{Qy(n,t,o.from.block,o.to.block).each((t=>{e.selection.setRng(t.toRange())}))}));return o},Zy=(e,t)=>{const n=mn(t),o=O(bn,e);return Ho(n,ar,o).isSome()},eC=e=>{const t=mn(e.getBody());return((e,t)=>{const n=cc(e.dom,Ua.fromRangeStart(t)).isNone(),o=dc(e.dom,Ua.fromRangeEnd(t)).isNone();return!((e,t)=>Zy(e,t.startContainer)||Zy(e,t.endContainer))(e,t)&&n&&o})(t,e.selection.getRng())?(e=>M.some((()=>{e.setContent(""),e.selection.setCursorLocation()})))(e):((e,t)=>{const n=t.getRng();return Lt(zy(e,mn(n.startContainer)),zy(e,mn(n.endContainer)),((o,r)=>!1===bn(o,r)?M.some((()=>{n.deleteContents(),Qy(e,!0,o,r).each((e=>{t.setRng(e.toRange())}))})):M.none())).getOr(M.none())})(t,e.selection)},tC=(e,t)=>e.selection.isCollapsed()?M.none():eC(e),nC=Po,oC=Mo,rC=(e,t,n,o,r)=>M.from(t._selectionOverrides.showCaret(e,n,o,r)),sC=(e,t)=>e.dispatch("BeforeObjectSelected",{target:t}).isDefaultPrevented()?M.none():M.some((e=>{const t=e.ownerDocument.createRange();return t.selectNode(e),t})(t)),aC=(e,t,n)=>t.collapsed?((e,t,n)=>{const o=Fd(1,e.getBody(),t),r=Ua.fromRangeStart(o),s=r.getNode();if(hd(s))return rC(1,e,s,!r.isAtEnd(),!1);const a=r.getNode(!0);if(hd(a))return rC(1,e,a,!1,!1);const i=e.dom.getParent(r.getNode(),(e=>oC(e)||nC(e)));return hd(i)?rC(1,e,i,!1,n):M.none()})(e,t,n).getOr(t):t,iC=e=>Wf(e)||Vf(e),lC=e=>Kf(e)||Hf(e),dC=(e,t,n,o,r,s)=>{rC(o,e,s.getNode(!r),r,!0).each((n=>{if(t.collapsed){const e=t.cloneRange();r?e.setEnd(n.startContainer,n.startOffset):e.setStart(n.endContainer,n.endOffset),e.deleteContents()}else t.deleteContents();e.selection.setRng(n)})),((e,t)=>{No(t)&&0===t.data.length&&e.remove(t)})(e.dom,n)},cC=(e,t)=>((e,t)=>{const n=e.selection.getRng();if(!No(n.commonAncestorContainer))return M.none();const o=t?$d.Forwards:$d.Backwards,r=tc(e.getBody()),s=O(Vd,t?r.next:r.prev),a=t?iC:lC,i=zd(o,e.getBody(),n),l=Ly(t,s(i));if(!l||!Hd(i,l))return M.none();if(a(l))return M.some((()=>dC(e,n,i.getNode(),o,t,l)));const d=s(l);return d&&a(d)&&Hd(l,d)?M.some((()=>dC(e,n,i.getNode(),o,t,d))):M.none()})(e,t),uC=ci([{remove:["element"]},{moveToElement:["element"]},{moveToPosition:["position"]}]),mC=(e,t,n)=>sc(t,e,n).bind((o=>{return r=o.getNode(),ar(mn(r))||rr(mn(r))||((e,t,n,o)=>{const r=t=>er(mn(t))&&!Td(n,o,e);return Ud(!t,n).fold((()=>Ud(t,o).fold(L,r)),r)})(e,t,n,o)?M.none():t&&Mo(o.getNode())||!1===t&&Mo(o.getNode(!0))?((e,t,n,o)=>{const r=o.getNode(!1===t);return zy(mn(e),mn(n.getNode())).map((e=>qr(e)?uC.remove(e.dom):uC.moveToElement(r))).orThunk((()=>M.some(uC.moveToElement(r))))})(e,t,n,o):t&&Kf(n)||!1===t&&Wf(n)?M.some(uC.moveToPosition(o)):M.none();var r})),fC=(e,t)=>M.from(ip(e.getBody(),t)),gC=(e,t)=>{const n=e.selection.getNode();return fC(e,n).filter(Mo).fold((()=>((e,t,n)=>{const o=Fd(t?1:-1,e,n),r=Ua.fromRangeStart(o),s=mn(e);return!1===t&&Kf(r)?M.some(uC.remove(r.getNode(!0))):t&&Wf(r)?M.some(uC.remove(r.getNode())):!1===t&&Wf(r)&&dg(s,r)?cg(s,r).map((e=>uC.remove(e.getNode()))):t&&Kf(r)&&lg(s,r)?ug(s,r).map((e=>uC.remove(e.getNode()))):((e,t,n)=>((e,t)=>{const n=t.getNode(!1===e),o=e?"after":"before";return yo(n)&&n.getAttribute("data-mce-caret")===o})(t,n)?((e,t)=>e&&Mo(t.nextSibling)?M.some(uC.moveToElement(t.nextSibling)):!1===e&&Mo(t.previousSibling)?M.some(uC.moveToElement(t.previousSibling)):M.none())(t,n.getNode(!1===t)).fold((()=>mC(e,t,n)),M.some):mC(e,t,n).bind((t=>((e,t,n)=>n.fold((e=>M.some(uC.remove(e))),(e=>M.some(uC.moveToElement(e))),(n=>Td(t,n,e)?M.none():M.some(uC.moveToPosition(n)))))(e,n,t))))(e,t,r)})(e.getBody(),t,e.selection.getRng()).map((n=>()=>n.fold(((e,t)=>n=>(e._selectionOverrides.hideFakeCaret(),Lg(e,t,mn(n)),!0))(e,t),((e,t)=>n=>{const o=t?Ua.before(n):Ua.after(n);return e.selection.setRng(o.toRange()),!0})(e,t),(e=>t=>(e.selection.setRng(t.toRange()),!0))(e))))),(()=>M.some(S)))},pC=e=>{const t=e.dom,n=e.selection,o=ip(e.getBody(),n.getNode());if(Po(o)&&t.isBlock(o)&&t.isEmpty(o)){const e=t.create("br",{"data-mce-bogus":"1"});t.setHTML(o,""),o.appendChild(e),n.setRng(Ua.before(e).toRange())}return!0},hC=(e,t)=>e.selection.isCollapsed()?gC(e,t):((e,t)=>{const n=e.selection.getNode();return Mo(n)&&!Io(n)?fC(e,n.parentNode).filter(Mo).fold((()=>M.some((()=>{var n;n=mn(e.getBody()),$(Xs(n,".mce-offscreen-selection"),to),Lg(e,t,mn(e.selection.getNode())),jy(e)}))),(()=>M.some(S))):M.none()})(e,t),bC=(e,t)=>e.selection.isCollapsed()?((e,t)=>{const n=Ua.fromRangeStart(e.selection.getRng());return sc(t,e.getBody(),n).filter((e=>t?zf(e):jf(e))).bind((e=>M.from(Bd(t?0:-1,e)))).map((t=>()=>e.selection.select(t)))})(e,t):M.none(),vC=No,yC=e=>vC(e)&&e.data[0]===ur,CC=e=>vC(e)&&e.data[e.data.length-1]===ur,xC=e=>e.ownerDocument.createTextNode(ur),wC=(e,t)=>e?(e=>{if(vC(e.previousSibling))return CC(e.previousSibling)||e.previousSibling.appendData(ur),e.previousSibling;if(vC(e))return yC(e)||e.insertData(0,ur),e;{const t=xC(e);return e.parentNode.insertBefore(t,e),t}})(t):(e=>{if(vC(e.nextSibling))return yC(e.nextSibling)||e.nextSibling.insertData(0,ur),e.nextSibling;if(vC(e))return CC(e)||e.appendData(ur),e;{const t=xC(e);return e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t}})(t),kC=O(wC,!0),SC=O(wC,!1),_C=(e,t)=>No(e.container())?wC(t,e.container()):wC(t,e.getNode()),EC=(e,t)=>{const n=t.get();return n&&e.container()===n&&br(n)},NC=(e,t)=>t.fold((t=>{dd(e.get());const n=kC(t);return e.set(n),M.some(Ua(n,n.length-1))}),(t=>uc(t).map((t=>{if(EC(t,e))return Ua(e.get(),1);{dd(e.get());const n=_C(t,!0);return e.set(n),Ua(n,1)}}))),(t=>mc(t).map((t=>{if(EC(t,e))return Ua(e.get(),e.get().length-1);{dd(e.get());const n=_C(t,!1);return e.set(n),Ua(n,n.length-1)}}))),(t=>{dd(e.get());const n=SC(t);return e.set(n),M.some(Ua(n,1))})),RC=(e,t)=>{for(let n=0;n<e.length;n++){const o=e[n].apply(null,t);if(o.isSome())return o}return M.none()},AC=ci([{before:["element"]},{start:["element"]},{end:["element"]},{after:["element"]}]),OC=(e,t)=>Od(t,e)||e,TC=(e,t,n)=>{const o=Py(n),r=OC(t,o.container());return Dy(e,r,o).fold((()=>dc(r,o).bind(O(Dy,e,r)).map((e=>AC.before(e)))),M.none)},BC=(e,t)=>null===pc(e,t),DC=(e,t,n)=>Dy(e,t,n).filter(O(BC,t)),LC=(e,t,n)=>{const o=My(n);return DC(e,t,o).bind((e=>cc(e,o).isNone()?M.some(AC.start(e)):M.none()))},PC=(e,t,n)=>{const o=Py(n);return DC(e,t,o).bind((e=>dc(e,o).isNone()?M.some(AC.end(e)):M.none()))},MC=(e,t,n)=>{const o=My(n),r=OC(t,o.container());return Dy(e,r,o).fold((()=>cc(r,o).bind(O(Dy,e,r)).map((e=>AC.after(e)))),M.none)},IC=e=>{return!1===(t=UC(e),"rtl"===Is.DOM.getStyle(t,"direction",!0)||(e=>Ty.test(e))(t.textContent));var t},FC=(e,t,n)=>RC([TC,LC,PC,MC],[e,t,n]).filter(IC),UC=e=>e.fold(R,R,R,R),zC=e=>e.fold(N("before"),N("start"),N("end"),N("after")),jC=e=>e.fold(AC.before,AC.before,AC.after,AC.after),VC=e=>e.fold(AC.start,AC.start,AC.end,AC.end),HC=(e,t,n,o,r,s)=>Lt(Dy(t,n,o),Dy(t,n,r),((t,o)=>t!==o&&((e,t,n)=>{const o=Od(t,e),r=Od(n,e);return o&&o===r})(n,t,o)?AC.after(e?t:o):s)).getOr(s),$C=(e,t)=>e.fold(P,(e=>{return o=t,!(zC(n=e)===zC(o)&&UC(n)===UC(o));var n,o})),qC=(e,t)=>e?t.fold(_(M.some,AC.start),M.none,_(M.some,AC.after),M.none):t.fold(M.none,_(M.some,AC.before),M.none,_(M.some,AC.end)),WC=(e,t,n)=>{const o=e?1:-1;return t.setRng(Ua(n.container(),n.offset()+o).toRange()),t.getSel().modify("move",e?"forward":"backward","word"),!0};var KC;!function(e){e[e.Br=0]="Br",e[e.Block=1]="Block",e[e.Wrap=2]="Wrap",e[e.Eol=3]="Eol"}(KC||(KC={}));const GC=(e,t)=>e===$d.Backwards?ne(t):t,YC=(e,t,n)=>e===$d.Forwards?t.next(n):t.prev(n),XC=(e,t,n,o)=>Do(o.getNode(t===$d.Forwards))?KC.Br:!1===Td(n,o)?KC.Block:KC.Wrap,QC=(e,t,n,o)=>{const r=tc(n);let s=o;const a=[];for(;s;){const n=YC(t,r,s);if(!n)break;if(Do(n.getNode(!1)))return t===$d.Forwards?{positions:GC(t,a).concat([n]),breakType:KC.Br,breakAt:M.some(n)}:{positions:GC(t,a),breakType:KC.Br,breakAt:M.some(n)};if(n.isVisible()){if(e(s,n)){const e=XC(0,t,s,n);return{positions:GC(t,a),breakType:e,breakAt:M.some(n)}}a.push(n),s=n}else s=n}return{positions:GC(t,a),breakType:KC.Eol,breakAt:M.none()}},JC=(e,t,n,o)=>t(n,o).breakAt.map((o=>{const r=t(n,o).positions;return e===$d.Backwards?r.concat(o):[o].concat(r)})).getOr([]),ZC=(e,t)=>Y(e,((e,n)=>e.fold((()=>M.some(n)),(o=>Lt(ie(o.getClientRects()),ie(n.getClientRects()),((e,r)=>{const s=Math.abs(t-e.left);return Math.abs(t-r.left)<=s?n:o})).or(e)))),M.none()),ex=(e,t)=>ie(t.getClientRects()).bind((t=>ZC(e,t.left))),tx=O(QC,Ua.isAbove,-1),nx=O(QC,Ua.isBelow,1),ox=O(JC,-1,tx),rx=O(JC,1,nx),sx=Mo,ax=(e,t)=>Math.abs(e.left-t),ix=(e,t)=>Math.abs(e.right-t),lx=(e,t)=>Oe(e,((e,n)=>{const o=Math.min(ax(e,t),ix(e,t)),r=Math.min(ax(n,t),ix(n,t));return r===o&&ke(n,"node")&&sx(n.node)||r<o?n:e})),dx=e=>{const t=t=>H(t,(t=>{const n=ma(t);return n.node=e,n}));if(yo(e))return t(e.getClientRects());if(No(e)){const n=e.ownerDocument.createRange();return n.setStart(e,0),n.setEnd(e,e.data.length),t(n.getClientRects())}return[]},cx=e=>ee(e,dx);var ux;!function(e){e[e.Up=-1]="Up",e[e.Down=1]="Down"}(ux||(ux={}));const mx=(e,t,n,o,r,s)=>{let a=0;const i=[],l=o=>{let s=cx([o]);-1===e&&(s=s.reverse());for(let e=0;e<s.length;e++){const o=s[e];if(!n(o,d)){if(i.length>0&&t(o,Be(i))&&a++,o.line=a,r(o))return!0;i.push(o)}}},d=Be(s.getClientRects());if(!d)return i;const c=s.getNode();return l(c),((e,t,n,o)=>{for(;o=Ad(o,e,Mr,t);)if(n(o))return})(e,o,l,c),i},fx=O(mx,ux.Up,pa,ha),gx=O(mx,ux.Down,ha,pa),px=e=>t=>((e,t)=>t.line>e)(e,t),hx=e=>t=>((e,t)=>t.line===e)(e,t),bx=(e,t)=>{e.selection.setRng(t),Pm(e,e.selection.getRng())},vx=(e,t,n)=>M.some(aC(e,t,n)),yx=(e,t,n,o,r,s)=>{const a=t===$d.Forwards,i=tc(e.getBody()),l=O(Vd,a?i.next:i.prev),d=a?o:r;if(!n.collapsed){const o=va(n);if(s(o))return rC(t,e,o,t===$d.Backwards,!1)}const c=zd(t,e.getBody(),n);if(d(c))return sC(e,c.getNode(!a));const u=Ly(a,l(c)),m=_r(n);if(!u)return m?M.some(n):M.none();if(d(u))return rC(t,e,u.getNode(!a),a,!1);const f=l(u);return f&&d(f)&&Hd(u,f)?rC(t,e,f.getNode(!a),a,!1):m?vx(e,u.toRange(),!1):M.none()},Cx=(e,t,n,o,r,s)=>{const a=zd(t,e.getBody(),n),i=Be(a.getClientRects()),l=t===ux.Down;if(!i)return M.none();const d=(l?gx:fx)(e.getBody(),px(1),a),c=K(d,hx(1)),u=i.left,m=lx(c,u);if(m&&s(m.node)){const n=Math.abs(u-m.left),o=Math.abs(u-m.right);return rC(t,e,m.node,n<o,!1)}let f;if(f=o(a)?a.getNode():r(a)?a.getNode(!0):va(n),f){const n=((e,t,n,o)=>{const r=tc(t);let s,a,i,l;const d=[];let c=0;const u=e=>Be(e.getClientRects());1===e?(s=r.next,a=ha,i=pa,l=Ua.after(o)):(s=r.prev,a=pa,i=ha,l=Ua.before(o));const m=u(l);do{if(!l.isVisible())continue;const e=u(l);if(i(e,m))continue;d.length>0&&a(e,Be(d))&&c++;const t=ma(e);if(t.position=l,t.line=c,n(t))return d;d.push(t)}while(l=s(l));return d})(t,e.getBody(),px(1),f);let o=lx(K(n,hx(1)),u);if(o)return vx(e,o.position.toRange(),!1);if(o=Be(K(n,hx(0))),o)return vx(e,o.position.toRange(),!1)}return 0===c.length?xx(e,l).filter(l?r:o).map((t=>aC(e,t.toRange(),!1))):M.none()},xx=(e,t)=>{const n=e.selection.getRng(),o=t?Ua.fromRangeEnd(n):Ua.fromRangeStart(n),r=(s=o.container(),a=e.getBody(),Ho(mn(s),(e=>vd(e.dom)),(e=>e.dom===a)).map((e=>e.dom)).getOr(a));var s,a;if(t){const e=nx(r,o);return le(e.positions)}{const e=tx(r,o);return ie(e.positions)}},wx=(e,t,n)=>xx(e,t).filter(n).exists((t=>(e.selection.setRng(t.toRange()),!0))),kx=(e,t)=>{const n=e.dom.createRng();n.setStart(t.container(),t.offset()),n.setEnd(t.container(),t.offset()),e.selection.setRng(n)},Sx=(e,t)=>{e?t.setAttribute("data-mce-selected","inline-boundary"):t.removeAttribute("data-mce-selected")},_x=(e,t,n)=>NC(t,n).map((t=>(kx(e,t),n))),Ex=(e,t,n)=>!!ml(e)&&((e,t,n)=>{const o=e.getBody(),r=Ua.fromRangeStart(e.selection.getRng());return((e,t,n,o)=>{const r=Ly(e,o),s=FC(t,n,r);return FC(t,n,r).bind(O(qC,e)).orThunk((()=>((e,t,n,o,r)=>{const s=Ly(e,r);return sc(e,n,s).map(O(Ly,e)).fold((()=>o.map(jC)),(r=>FC(t,n,r).map(O(HC,e,t,n,s,r)).filter(O($C,o)))).filter(IC)})(e,t,n,s,o)))})(n,O(By,e),o,r).bind((n=>_x(e,t,n)))})(e,t,n).isSome(),Nx=(e,t,n)=>!!ml(t)&&((e,t)=>{const n=t.selection.getRng(),o=e?Ua.fromRangeEnd(n):Ua.fromRangeStart(n);return!!(e=>x(e.selection.getSel().modify))(t)&&(e&&Cr(o)?WC(!0,t.selection,o):!(e||!xr(o))&&WC(!1,t.selection,o))})(e,t),Rx=e=>{const t=zs(null),n=O(By,e);return e.on("NodeChange",(o=>{ml(e)&&(((e,t,n)=>{const o=H(Xs(mn(t.getRoot()),'*[data-mce-selected="inline-boundary"]'),(e=>e.dom)),r=K(o,e),s=K(n,e);$(oe(r,s),O(Sx,!1)),$(oe(s,r),O(Sx,!0))})(n,e.dom,o.parents),((e,t)=>{if(e.selection.isCollapsed()&&!0!==e.composing&&t.get()){const n=Ua.fromRangeStart(e.selection.getRng());Ua.isTextPosition(n)&&!1===(e=>Cr(e)||xr(e))(n)&&(kx(e,ld(t.get(),n)),t.set(null))}})(e,t),((e,t,n,o)=>{if(t.selection.isCollapsed()){const r=K(o,e);$(r,(o=>{const r=Ua.fromRangeStart(t.selection.getRng());FC(e,t.getBody(),r).bind((e=>_x(t,n,e)))}))}})(n,e,t,o.parents))})),t},Ax=O(Nx,!0),Ox=O(Nx,!1),Tx=(e,t,n)=>{if(ml(e)){const o=xx(e,t).getOrThunk((()=>{const n=e.selection.getRng();return t?Ua.fromRangeEnd(n):Ua.fromRangeStart(n)}));return FC(O(By,e),e.getBody(),o).exists((t=>{const o=jC(t);return NC(n,o).exists((t=>(kx(e,t),!0)))}))}return!1},Bx=(e,t)=>n=>NC(t,n).map((t=>()=>kx(e,t))),Dx=(e,t,n,o)=>{const r=e.getBody(),s=O(By,e);e.undoManager.ignore((()=>{e.selection.setRng(((e,t)=>{const n=document.createRange();return n.setStart(e.container(),e.offset()),n.setEnd(t.container(),t.offset()),n})(n,o)),Fy(e),FC(s,r,Ua.fromRangeStart(e.selection.getRng())).map(VC).bind(Bx(e,t)).each(D)})),e.nodeChanged()},Lx=(e,t,n)=>{if(e.selection.isCollapsed()&&ml(e)){const o=Ua.fromRangeStart(e.selection.getRng());return((e,t,n,o)=>{const r=((e,t)=>Od(t,e)||e)(e.getBody(),o.container()),s=O(By,e),a=FC(s,r,o);return a.bind((e=>n?e.fold(N(M.some(VC(e))),M.none,N(M.some(jC(e))),M.none):e.fold(M.none,N(M.some(jC(e))),M.none,N(M.some(VC(e)))))).map(Bx(e,t)).getOrThunk((()=>{const i=ac(n,r,o),l=i.bind((e=>FC(s,r,e)));return Lt(a,l,(()=>Dy(s,r,o).bind((t=>(e=>Lt(uc(e),mc(e),((t,n)=>{const o=Ly(!0,t),r=Ly(!1,n);return dc(e,o).forall((e=>e.isEqual(r)))})).getOr(!0))(t)?M.some((()=>{Lg(e,n,mn(t))})):M.none())))).getOrThunk((()=>l.bind((()=>i.map((r=>()=>{n?Dx(e,t,o,r):Dx(e,t,r,o)}))))))}))})(e,t,n,o)}return M.none()},Px=e=>1===Tn(e),Mx=(e,t)=>{const n=mn(e.getBody()),o=mn(e.selection.getStart()),r=K(((e,t)=>{const n=Qf(t,e);return J(n,Zo).fold(N(n),(e=>n.slice(0,e)))})(n,o),Px);return le(r).bind((n=>{const o=Ua.fromRangeStart(e.selection.getRng());return!((e,t,n)=>Lt(uc(n),mc(n),((o,r)=>{const s=Ly(!0,o),a=Ly(!1,r),i=Ly(!1,t);return e?dc(n,i).exists((e=>e.isEqual(a)&&t.isEqual(s))):cc(n,i).exists((e=>e.isEqual(s)&&t.isEqual(a)))})).getOr(!0))(t,o,n.dom)||gc((s=n).dom)&&Up(s.dom)?M.none():M.some((()=>((e,t,n,o)=>{const r=O(Kp,t),s=H(K(o,r),(e=>e.dom));if(0===s.length)Lg(t,e,n);else{const e=((e,t)=>{const n=jp(!1),o=qp(t,n.dom);return Yn(mn(e),n),to(mn(e)),Ua(o,0)})(n.dom,s);t.selection.setRng(e.toRange())}})(t,e,n,r)));var s}))},Ix=(e,t)=>e.selection.isCollapsed()?Mx(e,t):M.none(),Fx=(e,t,n)=>M.some((()=>{e._selectionOverrides.hideFakeCaret(),Lg(e,t,mn(n))})),Ux=(e,t)=>e.selection.isCollapsed()?((e,t)=>{const n=t?Vf:Hf,o=t?$d.Forwards:$d.Backwards,r=zd(o,e.getBody(),e.selection.getRng());return n(r)?Fx(e,t,r.getNode(!t)):M.from(Ly(t,r)).filter((e=>n(e)&&Hd(r,e))).map((n=>()=>Fx(e,t,n.getNode(!t))))})(e,t):((e,t)=>{const n=e.selection.getNode();return Fo(n)?Fx(e,t,n):M.none()})(e,t),zx=e=>{const t=parseInt(e,10);return isNaN(t)?0:t},jx=(e,t)=>(e||"table"===Mt(t)?"margin":"padding")+("rtl"===$n(t,"direction")?"-right":"-left"),Vx=e=>{const t=$x(e);return!e.mode.isReadOnly()&&(t.length>1||((e,t)=>te(t,(t=>{const n=jx(Xi(e),t),o=Wn(t,n).map(zx).getOr(0);return"false"!==e.dom.getContentEditable(t.dom)&&o>0})))(e,t))},Hx=e=>or(e)||rr(e),$x=e=>{return K((t=e.selection.getSelectedBlocks(),H(t,mn)),(e=>!Hx(e)&&!(e=>wn(e).exists(Hx))(e)&&$o(e,(e=>Po(e.dom)||Mo(e.dom))).exists((e=>Po(e.dom)))));var t},qx=(e,t)=>{const{dom:n}=e,o=Qi(e),r=/[a-z%]+$/i.exec(o)[0],s=parseInt(o,10),a=Xi(e);$($x(e),(e=>{((e,t,n,o,r,s)=>{const a=jx(n,mn(s));if("outdent"===t){const t=Math.max(0,zx(s.style[a])-o);e.setStyle(s,a,t?t+r:"")}else{const t=zx(s.style[a])+o+r;e.setStyle(s,a,t)}})(n,t,a,s,r,e.dom)}))},Wx=e=>qx(e,"outdent"),Kx=e=>{if(e.selection.isCollapsed()&&Vx(e)){const t=e.dom,n=e.selection.getRng(),o=Ua.fromRangeStart(n),r=t.getParent(n.startContainer,t.isBlock);if(null!==r&&ng(mn(r),o))return M.some((()=>Wx(e)))}return M.none()},Gx=(e,t,n)=>ce([Kx,hC,cC,(e,n)=>Lx(e,t,n),Jy,ap,bC,Ux,tC,Ix],(t=>t(e,n))),Yx=(e,t)=>{e.addCommand("delete",(()=>{((e,t)=>{Gx(e,t,!1).fold((()=>{Fy(e),jy(e)}),D)})(e,t)})),e.addCommand("forwardDelete",(()=>{((e,t)=>{Gx(e,t,!0).fold((()=>(e=>Iy(e,"ForwardDelete"))(e)),D)})(e,t)}))},Xx=e=>void 0===e.touches||1!==e.touches.length?M.none():M.some(e.touches[0]),Qx=(e,t)=>we(e,t.nodeName),Jx=(e,t)=>!!No(t)||!!yo(t)&&!Qx(e,t)&&!_c(t),Zx=(e,t)=>{if(No(t)){if(0===t.nodeValue.length)return!0;if(/^\s+$/.test(t.nodeValue)&&(!t.nextSibling||Qx(e,t.nextSibling)))return!0}return!1},ew=e=>{const t=e.dom,n=e.selection,o=e.schema,r=o.getBlockElements();let s=n.getStart();const a=e.getBody();let i,l,d;const c=Ti(e);if(!s||!yo(s))return;const u=a.nodeName.toLowerCase();if(!o.isValidChild(u,c.toLowerCase())||((e,t,n)=>V(Xf(mn(n),mn(t)),(t=>Qx(e,t.dom))))(r,a,s))return;const m=n.getRng(),f=m.startContainer,g=m.startOffset,p=m.endContainer,h=m.endOffset,b=nf(e);for(s=a.firstChild;s;)if(Jx(r,s)){if(Zx(r,s)){l=s,s=s.nextSibling,t.remove(l);continue}i||(i=t.create(c,Bi(e)),s.parentNode.insertBefore(i,s),d=!0),l=s,s=s.nextSibling,i.appendChild(l)}else i=null,s=s.nextSibling;d&&b&&(m.setStart(f,g),m.setEnd(p,h),n.setRng(m),e.nodeChanged())},tw=e=>t=>-1!==(" "+t.attr("class")+" ").indexOf(e),nw=(e,t,n)=>function(o){const r=arguments,s=r[r.length-2],a=s>0?t.charAt(s-1):"";if('"'===a)return o;if(">"===a){const e=t.lastIndexOf("<",s);if(-1!==e&&-1!==t.substring(e,s).indexOf('contenteditable="false"'))return o}return'<span class="'+n+'" data-mce-content="'+e.dom.encode(r[0])+'">'+e.dom.encode("string"==typeof r[1]?r[1]:r[0])+"</span>"},ow=(e,t)=>{t.hasAttribute("data-mce-caret")&&(Sr(t),e.selection.setRng(e.selection.getRng()),e.selection.scrollIntoView(t))},rw=(e,t)=>{const n=(e=>Wo(mn(e.getBody()),"*[data-mce-caret]").map((e=>e.dom)).getOrNull())(e);if(n)return"compositionstart"===t.type?(t.preventDefault(),t.stopPropagation(),void ow(e,n)):void(yr(n)&&(ow(e,n),e.undoManager.add()))},sw=Mo,aw=(e,t,n)=>{const o=tc(e.getBody()),r=O(Vd,1===t?o.next:o.prev);if(n.collapsed){const o=e.dom.getParent(n.startContainer,"PRE");if(!o)return;if(!r(Ua.fromRangeStart(n))){const n=mn((e=>{const t=e.dom.create(Ti(e));return t.innerHTML='<br data-mce-bogus="1">',t})(e));1===t?Xn(mn(o),n):Yn(mn(o),n),e.selection.select(n.dom,!0),e.selection.collapse()}}},iw=(e,t)=>((e,t)=>{const n=t?$d.Forwards:$d.Backwards,o=e.selection.getRng();return((e,t,n)=>yx(t,e,n,Wf,Kf,sw))(n,e,o).orThunk((()=>(aw(e,n,o),M.none())))})(e,t).exists((t=>(bx(e,t),!0))),lw=(e,t)=>((e,t)=>{const n=t?1:-1,o=e.selection.getRng();return((e,t,n)=>Cx(t,e,n,(e=>Wf(e)||$f(e)),(e=>Kf(e)||qf(e)),sw))(n,e,o).orThunk((()=>(aw(e,n,o),M.none())))})(e,t).exists((t=>(bx(e,t),!0))),dw=(e,t)=>wx(e,t,t?Kf:Wf),cw=e=>j(["figcaption"],Mt(e)),uw=(e,t)=>{const n=mn(e.getBody()),o=Ua.fromRangeStart(e.selection.getRng()),r=Ti(e),s=Bi(e);return((e,t)=>{const n=O(bn,t);return $o(mn(e.container()),Zo,n).filter(cw)})(o,n).exists((()=>{if(((e,t,n)=>t?((e,t)=>nx(e,t).breakAt.isNone())(e.dom,n):((e,t)=>tx(e,t).breakAt.isNone())(e.dom,n))(n,t,o)){const o=((e,t,n,o)=>{const r=cn(n),s=cn("br");return qt(r,o),Jn(r,s),((e,t,n)=>{n?Jn(e,t):Qn(e,t)})(e,r,t),(e=>{const t=document.createRange();return t.setStartBefore(e.dom),t.setEndBefore(e.dom),t})(s)})(n,t,r,s);return e.selection.setRng(o),!0}return!1}))},mw=(e,t)=>!!e.selection.isCollapsed()&&uw(e,t),fw={shiftKey:!1,altKey:!1,ctrlKey:!1,metaKey:!1,keyCode:0},gw=(e,t)=>t.keyCode===e.keyCode&&t.shiftKey===e.shiftKey&&t.altKey===e.altKey&&t.ctrlKey===e.ctrlKey&&t.metaKey===e.metaKey,pw=(e,...t)=>()=>e.apply(null,t),hw=(e,t)=>Q(((e,t)=>ee((e=>H(e,(e=>({...fw,action:S,...e}))))(e),(e=>gw(e,t)?[e]:[])))(e,t),(e=>e.action())),bw=(e,t)=>ce(((e,t)=>ee((e=>H(e,(e=>({...fw,action:()=>M.none(),...e}))))(e),(e=>gw(e,t)?[e]:[])))(e,t),(e=>e.action())),vw=(e,t)=>{const n=t?$d.Forwards:$d.Backwards,o=e.selection.getRng();return yx(e,n,o,Vf,Hf,Fo).exists((t=>(bx(e,t),!0)))},yw=(e,t)=>{const n=t?1:-1,o=e.selection.getRng();return Cx(e,n,o,Vf,Hf,Fo).exists((t=>(bx(e,t),!0)))},Cw=(e,t)=>wx(e,t,t?Hf:Vf),xw=ci([{none:["current"]},{first:["current"]},{middle:["current","target"]},{last:["current"]}]),ww={...xw,none:e=>xw.none(e)},kw=(e,t,n)=>ee(Nn(e),(e=>pn(e,t)?n(e)?[e]:[]:kw(e,t,n))),Sw=(e,t)=>Ko(e,"table",t),_w=(e,t,n,o,r=P)=>{const s=1===o;if(!s&&n<=0)return ww.first(e[0]);if(s&&n>=e.length-1)return ww.last(e[e.length-1]);{const s=n+o,a=e[s];return r(a)?ww.middle(t,a):_w(e,t,s,o,r)}},Ew=(e,t)=>Sw(e,t).bind((t=>{const n=kw(t,"th,td",P);return J(n,(t=>bn(e,t))).map((e=>({index:e,all:n})))})),Nw=(e,t=!1)=>{return zn(e)?e.dom.isContentEditable:(n=e,Ko(n,"[contenteditable]")).fold(N(t),(e=>"true"===Rw(e)));var n},Rw=e=>e.dom.contentEditable,Aw=(e,t,n,o,r)=>{const s=Xs(mn(n),"td,th,caption").map((e=>e.dom)),a=K(((e,t)=>ee(t,(t=>{const n=((e,t)=>({left:e.left-t,top:e.top-t,right:e.right+-2,bottom:e.bottom+-2,width:e.width+t,height:e.height+t}))(ma(t.getBoundingClientRect()),-1);return[{x:n.left,y:e(n),cell:t},{x:n.right,y:e(n),cell:t}]})))(e,s),(e=>t(e,r)));return((e,t,n)=>Y(e,((e,o)=>e.fold((()=>M.some(o)),(e=>{const r=Math.sqrt(Math.abs(e.x-t)+Math.abs(e.y-n)),s=Math.sqrt(Math.abs(o.x-t)+Math.abs(o.y-n));return M.some(s<r?o:e)}))),M.none()))(a,o,r).map((e=>e.cell))},Ow=O(Aw,(e=>e.bottom),((e,t)=>e.y<t)),Tw=O(Aw,(e=>e.top),((e,t)=>e.y>t)),Bw=(e,t,n)=>{const o=e(t,n);return(e=>e.breakType===KC.Wrap&&0===e.positions.length)(o)||!Do(n.getNode())&&(e=>e.breakType===KC.Br&&1===e.positions.length)(o)?!((e,t,n)=>n.breakAt.exists((n=>e(t,n).breakAt.isSome())))(e,t,o):o.breakAt.isNone()},Dw=O(Bw,tx),Lw=O(Bw,nx),Pw=(e,t,n,o)=>{const r=e.selection.getRng(),s=t?1:-1;return!(!pd()||!((e,t,n)=>{const o=Ua.fromRangeStart(t);return lc(!e,n).exists((e=>e.isEqual(o)))})(t,r,n)||(rC(s,e,n,!t,!1).each((t=>{bx(e,t)})),0))},Mw=(e,t,n)=>{const o=((e,t)=>{const n=t.getNode(e);return yo(n)&&"TABLE"===n.nodeName?M.some(n):M.none()})(!!t,n),r=!1===t;o.fold((()=>bx(e,n.toRange())),(o=>lc(r,e.getBody()).filter((e=>e.isEqual(n))).fold((()=>bx(e,n.toRange())),(n=>((e,t,n)=>{const o=Ti(t);t.undoManager.transact((()=>{const r=cn(o);qt(r,Bi(t)),Jn(r,cn("br")),e?Xn(mn(n),r):Yn(mn(n),r);const s=t.dom.createRng();s.setStart(r.dom,0),s.setEnd(r.dom,0),bx(t,s)}))})(t,e,o)))))},Iw=(e,t,n,o)=>{const r=e.selection.getRng(),s=Ua.fromRangeStart(r),a=e.getBody();if(!t&&Dw(o,s)){const o=((e,t,n)=>((e,t)=>ie(t.getClientRects()).bind((t=>Ow(e,t.left,t.top))).bind((e=>{return ex(mc(n=e).map((e=>tx(n,e).positions.concat(e))).getOr([]),t);var n})))(t,n).orThunk((()=>ie(n.getClientRects()).bind((n=>ZC(ox(e,Ua.before(t)),n.left))))).getOr(Ua.before(t)))(a,n,s);return Mw(e,t,o),!0}if(t&&Lw(o,s)){const o=((e,t,n)=>((e,t)=>le(t.getClientRects()).bind((t=>Tw(e,t.left,t.top))).bind((e=>{return ex(uc(n=e).map((e=>[e].concat(nx(n,e).positions))).getOr([]),t);var n})))(t,n).orThunk((()=>ie(n.getClientRects()).bind((n=>ZC(rx(e,Ua.after(t)),n.left))))).getOr(Ua.after(t)))(a,n,s);return Mw(e,t,o),!0}return!1},Fw=(e,t,n)=>M.from(e.dom.getParent(e.selection.getNode(),"td,th")).bind((o=>M.from(e.dom.getParent(o,"table")).map((r=>n(e,t,r,o))))).getOr(!1),Uw=(e,t)=>Fw(e,t,Pw),zw=(e,t)=>Fw(e,t,Iw),jw=(e,t,n)=>n.fold(M.none,M.none,((e,t)=>{return(n=t,((e,t)=>{const n=e=>{for(let o=0;o<e.childNodes.length;o++){const r=mn(e.childNodes[o]);if(t(r))return M.some(r);const s=n(e.childNodes[o]);if(s.isSome())return s}return M.none()};return n(e.dom)})(n,uf)).map((e=>(e=>{const t=Xu.exact(e,0,e,0);return tm(t)})(e)));var n}),(n=>(e.execCommand("mceTableInsertRowAfter"),Vw(e,t,n)))),Vw=(e,t,n)=>{return jw(e,t,(r=Nw,Ew(o=n,void 0).fold((()=>ww.none(o)),(e=>_w(e.all,o,e.index,1,r)))));var o,r},Hw=(e,t,n)=>{return jw(e,t,(r=Nw,Ew(o=n,void 0).fold((()=>ww.none()),(e=>_w(e.all,o,e.index,-1,r)))));var o,r},$w=(e,t)=>{const n=["table","li","dl"],o=mn(e.getBody()),r=e=>{const t=Mt(e);return bn(e,o)||j(n,t)},s=e.selection.getRng();return((e,t)=>((e,t,n=L)=>n(t)?M.none():j(e,Mt(t))?M.some(t):qo(t,e.join(","),(e=>pn(e,"table")||n(e))))(["td","th"],e,t))(mn(t?s.endContainer:s.startContainer),r).map((n=>(Sw(n,r).each((t=>{e.model.table.clearSelectedCells(t.dom)})),e.selection.collapse(!t),(t?Vw:Hw)(e,r,n).each((t=>{e.selection.setRng(t)})),!0))).getOr(!1)},qw=(e,t)=>({container:e,offset:t}),Ww=Is.DOM,Kw=e=>t=>e===t?-1:0,Gw=(e,t,n)=>{if(No(e)&&t>=0)return M.some(qw(e,t));{const o=ca(Ww);return M.from(o.backwards(e,t,Kw(e),n)).map((e=>qw(e.container,e.container.data.length)))}},Yw=(e,t,n)=>{if(!No(e))return M.none();const o=e.textContent;if(t>=0&&t<=o.length)return M.some(qw(e,t));{const o=ca(Ww);return M.from(o.backwards(e,t,Kw(e),n)).bind((e=>{const o=e.container.data;return Yw(e.container,t+o.length,n)}))}},Xw=(e,t,n)=>{if(!No(e))return M.none();const o=e.textContent;if(t<=o.length)return M.some(qw(e,t));{const r=ca(Ww);return M.from(r.forwards(e,t,Kw(e),n)).bind((e=>Xw(e.container,t-o.length,n)))}},Qw=(e,t,n,o,r)=>{const s=ca(e,(e=>t=>e.isBlock(t)||j(["BR","IMG","HR","INPUT"],t.nodeName)||"false"===e.getContentEditable(t))(e));return M.from(s.backwards(t,n,o,r))},Jw=e=>e.toString().replace(/\u00A0/g," ").replace(/\uFEFF/g,""),Zw=e=>""!==e&&-1!==" \xa0\f\n\r\t\v".indexOf(e),ek=(e,t)=>e.substring(t.length),tk=(e,t,n,o=0)=>{return(r=mn(t.startContainer),Ko(r,mf)).fold((()=>((e,t,n,o=0)=>{if(!(r=t).collapsed||3!==r.startContainer.nodeType)return M.none();var r;const s=e.getParent(t.startContainer,e.isBlock)||e.getRoot();return Qw(e,t.startContainer,t.startOffset,((e,t,o)=>((e,t,n)=>{let o;for(o=t-1;o>=0;o--){const t=e.charAt(o);if(Zw(t))return M.none();if(t===n)break}return M.some(o)})(o,t,n).getOr(t)),s).bind((e=>{const r=t.cloneRange();if(r.setStart(e.container,e.offset),r.setEnd(t.endContainer,t.endOffset),r.collapsed)return M.none();const s=Jw(r);return 0!==s.lastIndexOf(n)||ek(s,n).length<o?M.none():M.some({text:ek(s,n),range:r,triggerChar:n})}))})(e,t,n,o)),(t=>{const o=e.createRng();o.selectNode(t.dom);const r=Jw(o);return M.some({range:o,text:ek(r,n),triggerChar:n})}));var r},nk=e=>{if((e=>3===e.nodeType)(e))return qw(e,e.data.length);{const t=e.childNodes;return t.length>0?nk(t[t.length-1]):qw(e,t.length)}},ok=(e,t)=>{const n=e.childNodes;return n.length>0&&t<n.length?ok(n[t],0):n.length>0&&(e=>1===e.nodeType)(e)&&n.length===t?nk(n[n.length-1]):qw(e,t)},rk=(e,t,n,o={})=>{const r=t(),s=e.selection.getRng().startContainer.nodeValue,a=K(r.lookupByChar(n.triggerChar),(t=>n.text.length>=t.minChars&&t.matches.getOrThunk((()=>(e=>t=>{const n=ok(t.startContainer,t.startOffset);return!((e,t)=>Qw(e,t.container,t.offset,((e,t)=>0===t?-1:t),e.getRoot()).filter((e=>{const t=e.container.data.charAt(e.offset-1);return!Zw(t)})).isSome())(e,n)})(e.dom)))(n.range,s,n.text)));if(0===a.length)return M.none();const i=Promise.all(H(a,(e=>e.fetch(n.text,e.maxResults,o).then((t=>({matchText:n.text,items:t,columns:e.columns,onAction:e.onAction,highlightOn:e.highlightOn}))))));return M.some({lookupData:i,context:n})};var sk;!function(e){e[e.Error=0]="Error",e[e.Value=1]="Value"}(sk||(sk={}));const ak=(e,t,n)=>e.stype===sk.Error?t(e.serror):n(e.svalue),ik=e=>({stype:sk.Value,svalue:e}),lk=e=>({stype:sk.Error,serror:e}),dk=ak,ck=e=>f(e)&&ue(e).length>100?" removed due to size":JSON.stringify(e,null,2),uk=(e,t)=>lk([{path:e,getErrorInfo:t}]),mk=(e,t)=>({extract:(n,o)=>xe(o,e).fold((()=>((e,t)=>uk(e,(()=>'Choice schema did not contain choice key: "'+t+'"')))(n,e)),(e=>((e,t,n,o)=>xe(n,o).fold((()=>((e,t,n)=>uk(e,(()=>'The chosen schema: "'+n+'" did not exist in branches: '+ck(t))))(e,n,o)),(n=>n.extract(e.concat(["branch: "+o]),t))))(n,o,t,e))),toString:()=>"chooseOn("+e+"). Possible values: "+ue(t)}),fk=e=>(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const n={};for(let o=0;o<t.length;o++){const r=t[o];for(const t in r)we(r,t)&&(n[t]=e(n[t],r[t]))}return n},gk=fk(((e,t)=>g(e)&&g(t)?gk(e,t):t)),pk=(fk(((e,t)=>t)),e=>({tag:"defaultedThunk",process:N(e)})),hk=e=>{const t=(e=>{const t=[],n=[];return $(e,(e=>{ak(e,(e=>n.push(e)),(e=>t.push(e)))})),{values:t,errors:n}})(e);return t.errors.length>0?(n=t.errors,_(lk,Z)(n)):ik(t.values);var n},bk=(e,t,n)=>{switch(e.tag){case"field":return t(e.key,e.newKey,e.presence,e.prop);case"custom":return n(e.newKey,e.instantiator)}},vk=e=>({extract:(t,n)=>{return o=e(n),r=e=>((e,t)=>uk(e,N(t)))(t,e),o.stype===sk.Error?r(o.serror):o;var o,r},toString:N("val")}),yk=vk(ik),Ck=(e,t,n,o)=>o(xe(e,t).getOrThunk((()=>n(e)))),xk=(e,t,n,o,r)=>{const s=e=>r.extract(t.concat([o]),e),a=e=>e.fold((()=>ik(M.none())),(e=>{const n=r.extract(t.concat([o]),e);return s=n,a=M.some,s.stype===sk.Value?{stype:sk.Value,svalue:a(s.svalue)}:s;var s,a}));switch(e.tag){case"required":return((e,t,n,o)=>xe(t,n).fold((()=>((e,t,n)=>uk(e,(()=>'Could not find valid *required* value for "'+t+'" in '+ck(n))))(e,n,t)),o))(t,n,o,s);case"defaultedThunk":return Ck(n,o,e.process,s);case"option":return((e,t,n)=>n(xe(e,t)))(n,o,a);case"defaultedOptionThunk":return((e,t,n,o)=>o(xe(e,t).map((t=>!0===t?n(e):t))))(n,o,e.process,a);case"mergeWithThunk":return Ck(n,o,N({}),(t=>{const o=gk(e.process(n),t);return s(o)}))}},wk=e=>({extract:(t,n)=>((e,t,n)=>{const o={},r=[];for(const s of n)bk(s,((n,s,a,i)=>{const l=xk(a,e,t,n,i);dk(l,(e=>{r.push(...e)}),(e=>{o[s]=e}))}),((e,n)=>{o[e]=n(t)}));return r.length>0?lk(r):ik(o)})(t,n,e),toString:()=>{const t=H(e,(e=>bk(e,((e,t,n,o)=>e+" -> "+o.toString()),((e,t)=>"state("+e+")"))));return"obj{\n"+t.join("\n")+"}"}}),kk=e=>({extract:(t,n)=>{const o=H(n,((n,o)=>e.extract(t.concat(["["+o+"]"]),n)));return hk(o)},toString:()=>"array("+e.toString()+")"}),Sk=(e,t,n)=>{return o=((e,t,n)=>((e,t)=>e.stype===sk.Error?{stype:sk.Error,serror:t(e.serror)}:e)(t.extract([e],n),(e=>({input:n,errors:e}))))(e,t,n),ak(o,di.error,di.value);var o},_k=(e,t)=>mk(e,ge(t,wk)),Ek=N(yk),Nk=(e,t)=>vk((n=>{const o=typeof n;return e(n)?ik(n):lk(`Expected type: ${t} but got: ${o}`)})),Rk=Nk(w,"number"),Ak=Nk(m,"string"),Ok=Nk(b,"boolean"),Tk=Nk(x,"function"),Bk=(e,t,n,o)=>({tag:"field",key:e,newKey:t,presence:n,prop:o}),Dk=(e,t)=>({tag:"custom",newKey:e,instantiator:t}),Lk=(e,t)=>Bk(e,e,{tag:"required",process:{}},t),Pk=e=>Lk(e,Ak),Mk=e=>Lk(e,Tk),Ik=(e,t)=>Bk(e,e,{tag:"option",process:{}},t),Fk=e=>Ik(e,Ak),Uk=(e,t,n)=>Bk(e,e,pk(t),n),zk=(e,t)=>Uk(e,t,Rk),jk=(e,t,n)=>Uk(e,t,(e=>{return t=t=>j(e,t)?di.value(t):di.error(`Unsupported value: "${t}", choose one of "${e.join(", ")}".`),vk((e=>t(e).fold(lk,ik)));var t})(n)),Vk=(e,t)=>Uk(e,t,Ok),Hk=(e,t)=>Uk(e,t,Tk),$k=Pk("type"),qk=Mk("fetch"),Wk=Mk("onAction"),Kk=Hk("onSetup",(()=>S)),Gk=Fk("text"),Yk=Fk("icon"),Xk=Fk("tooltip"),Qk=Fk("label"),Jk=Vk("active",!1),Zk=Vk("enabled",!0),eS=Vk("primary",!1),tS=e=>((e,t)=>Uk("type",t,Ak))(0,e),nS=wk([$k,Pk("ch"),zk("minChars",1),(1,((e,t)=>Bk(e,e,pk(1),Ek()))("columns")),zk("maxResults",10),("matches",Ik("matches",Tk)),qk,Wk,(oS=Ak,Uk("highlightOn",[],kk(oS)))]);var oS;const rS=[Zk,Xk,Yk,Gk,Kk],sS=[Jk].concat(rS),aS=[Hk("predicate",L),jk("scope","node",["node","editor"]),jk("position","selection",["node","selection","line"])],iS=rS.concat([tS("contextformbutton"),eS,Wk,Dk("original",R)]),lS=sS.concat([tS("contextformbutton"),eS,Wk,Dk("original",R)]),dS=rS.concat([tS("contextformbutton")]),cS=sS.concat([tS("contextformtogglebutton")]),uS=_k("type",{contextformbutton:iS,contextformtogglebutton:lS});wk([tS("contextform"),Hk("initValue",N("")),Qk,((e,t)=>Bk(e,e,{tag:"required",process:{}},kk(t)))("commands",uS),Ik("launch",_k("type",{contextformbutton:dS,contextformtogglebutton:cS}))].concat(aS));const mS=e=>{const t=e.ui.registry.getAll().popups,n=ge(t,(e=>{return(t=e,Sk("Autocompleter",nS,t)).fold((e=>{throw new Error("Errors: \n"+(e=>{const t=e.length>10?e.slice(0,10).concat([{path:[],getErrorInfo:N("... (only showing first ten failures)")}]):e;return H(t,(e=>"Failed path: ("+e.path.join(" > ")+")\n"+e.getErrorInfo()))})((t=e).errors).join("\n")+"\n\nInput object: "+ck(t.input));var t}),R);var t})),o=Se(ye(n,(e=>e.ch))),r=Ce(n);return{dataset:n,triggerChars:o,lookupByChar:e=>K(r,(t=>t.ch===e))}},fS=e=>{const t=Ws(),n=zs(!1),o=t.isSet,r=()=>{o()&&((e=>{Nv(e).autocompleter.removeDecoration()})(e),(e=>{e.dispatch("AutocompleterEnd")})(e),n.set(!1),t.clear())},s=De((()=>mS(e))),a=a=>{(n=>t.get().map((t=>tk(e.dom,e.selection.getRng(),t.triggerChar).bind((t=>rk(e,s,t,n))))).getOrThunk((()=>((e,t)=>{const n=t(),o=e.selection.getRng();return((e,t,n)=>ce(n.triggerChars,(n=>tk(e,t,n))))(e.dom,o,n).bind((n=>rk(e,t,n)))})(e,s))))(a).fold(r,(s=>{(n=>{o()||(((e,t)=>{Nv(e).autocompleter.addDecoration(t)})(e,n.range),t.set({triggerChar:n.triggerChar,matchLength:n.text.length}))})(s.context),s.lookupData.then((o=>{t.get().map((a=>{const i=s.context;a.triggerChar===i.triggerChar&&(i.text.length-a.matchLength>=10?r():(t.set({...a,matchLength:i.text.length}),n.get()?((e,t)=>{e.dispatch("AutocompleterUpdate",t)})(e,{lookupData:o}):(n.set(!0),((e,t)=>{e.dispatch("AutocompleterStart",t)})(e,{lookupData:o}))))}))}))}))};e.addCommand("mceAutocompleterReload",((e,t)=>{const n=f(t)?t.fetchOptions:{};a(n)})),e.addCommand("mceAutocompleterClose",r),((e,t)=>{const n=Gs(t.load,50);e.on("keypress compositionend",(e=>{27!==e.which&&n.throttle()})),e.on("keydown",(e=>{const o=e.which;8===o?n.throttle():27===o&&t.cancelIfNecessary()})),e.on("remove",n.cancel)})(e,{cancelIfNecessary:r,load:a})},gS=e=>(t,n,o={})=>{const r=t.getBody(),s={bubbles:!0,composed:!0,data:null,isComposing:!1,detail:0,view:null,target:r,currentTarget:r,eventPhase:Event.AT_TARGET,originalTarget:r,explicitOriginalTarget:r,isTrusted:!1,srcElement:r,cancelable:!1,preventDefault:S,inputType:n},a=xs(new InputEvent(e));return t.dispatch(e,{...a,...s,...o})},pS=gS("input"),hS=gS("beforeinput"),bS=(e,t)=>{let n,o=t;const r=e.dom,s=e.schema.getMoveCaretBeforeOnEnterElements();if(!t)return;if(/^(LI|DT|DD)$/.test(t.nodeName)){const e=(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);e&&/^(UL|OL|DL)$/.test(e.nodeName)&&t.insertBefore(r.doc.createTextNode(dr),t.firstChild)}const a=r.createRng();if(t.normalize(),t.hasChildNodes()){const e=new Xo(t,t);for(;n=e.current();){if(No(n)){a.setStart(n,0),a.setEnd(n,0);break}if(s[n.nodeName.toLowerCase()]){a.setStartBefore(n),a.setEndBefore(n);break}o=n,n=e.next()}n||(a.setStart(o,0),a.setEnd(o,0))}else Do(t)?t.nextSibling&&r.isBlock(t.nextSibling)?(a.setStartBefore(t),a.setEndBefore(t)):(a.setStartAfter(t),a.setEndAfter(t)):(a.setStart(t,0),a.setEnd(t,0));e.selection.setRng(a),Pm(e,a)},vS=e=>M.from(e.dom.getParent(e.selection.getStart(!0),e.dom.isBlock)),yS=(e,t)=>e&&e.parentNode&&e.parentNode.nodeName===t,CS=e=>e&&/^(OL|UL|LI)$/.test(e.nodeName),xS=e=>{const t=e.parentNode;return/^(LI|DT|DD)$/.test(t.nodeName)?t:e},wS=(e,t,n)=>{let o=e[n?"firstChild":"lastChild"];for(;o&&!yo(o);)o=o[n?"nextSibling":"previousSibling"];return o===t},kS=(e,t)=>t&&"A"===t.nodeName&&e.isEmpty(t),SS=e=>{e.innerHTML='<br data-mce-bogus="1">'},_S=(e,t)=>e.nodeName===t||e.previousSibling&&e.previousSibling.nodeName===t,ES=(e,t)=>t&&e.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&!/^(fixed|absolute)/i.test(t.style.position)&&"true"!==e.getContentEditable(t),NS=(e,t,n)=>!1===No(t)?n:e?1===n&&t.data.charAt(n-1)===ur?0:n:n===t.data.length-1&&t.data.charAt(n)===ur?t.data.length:n,RS=(e,t)=>{const n=e.getRoot();let o,r;for(o=t;o!==n&&"false"!==e.getContentEditable(o);)"true"===e.getContentEditable(o)&&(r=o),o=o.parentNode;return o!==n?r:n},AS=(e,t)=>{Ti(e).toLowerCase()===t.tagName.toLowerCase()&&((e,t,n)=>{const o=e.dom;M.from(n.style).map(o.parseStyle).each((e=>{const n={...Kn(mn(t)),...e};o.setStyles(t,n)}));const r=M.from(n.class).map((e=>e.split(/\s+/))),s=M.from(t.className).map((e=>K(e.split(/\s+/),(e=>""!==e))));Lt(r,s,((e,n)=>{const r=K(n,(t=>!j(e,t))),s=[...e,...r];o.setAttrib(t,"class",s.join(" "))}));const a=["style","class"],i=ve(n,((e,t)=>!j(a,t)));o.setAttribs(t,i)})(e,t,Bi(e))},OS=(e,t)=>{let n,o,r,s,a,i,l,d,c;const u=e.dom,m=e.schema,f=m.getNonEmptyElements(),g=e.selection.getRng(),p=Ti(e),h=t=>{let n,r,a,i=o;const l=m.getTextInlineElements();if(n=t||"TABLE"===d||"HR"===d?u.create(t||p):s.cloneNode(!1),a=n,!1===Pi(e))u.setAttrib(n,"style",null),u.setAttrib(n,"class",null);else do{if(l[i.nodeName]){if(gc(i)||_c(i))continue;r=i.cloneNode(!1),u.setAttrib(r,"id",""),n.hasChildNodes()?(r.appendChild(n.firstChild),n.appendChild(r)):(a=r,n.appendChild(r))}}while((i=i.parentNode)&&i!==x);return AS(e,n),SS(a),n},b=e=>{let t,n;const a=NS(e,o,r);if(No(o)&&(e?a>0:a<o.nodeValue.length))return!1;if(o.parentNode===s&&c&&!e)return!0;if(e&&yo(o)&&o===s.firstChild)return!0;if(_S(o,"TABLE")||_S(o,"HR"))return c&&!e||!c&&e;const i=new Xo(o,s);for(No(o)&&(e&&0===a?i.prev():e||a!==o.nodeValue.length||i.next());t=i.current();){if(yo(t)){if(!t.getAttribute("data-mce-bogus")&&(n=t.nodeName.toLowerCase(),f[n]&&"br"!==n))return!1}else if(No(t)&&!Fr(t.nodeValue))return!1;e?i.prev():i.next()}return!0},v=()=>{a=/^(H[1-6]|PRE|FIGURE)$/.test(d)&&"HGROUP"!==w?h(p):h(),Mi(e)&&ES(u,l)&&u.isEmpty(s)?a=u.split(l,s):u.insertAfter(a,s),bS(e,a)};mm(u,g).each((e=>{g.setStart(e.startContainer,e.startOffset),g.setEnd(e.endContainer,e.endOffset)})),o=g.startContainer,r=g.startOffset;const y=!(!t||!t.shiftKey),C=!(!t||!t.ctrlKey);yo(o)&&o.hasChildNodes()&&(c=r>o.childNodes.length-1,o=o.childNodes[Math.min(r,o.childNodes.length-1)]||o,r=c&&No(o)?o.nodeValue.length:0);const x=RS(u,o);if(!x)return;y||(o=((e,t,n,o,r)=>{let s,a,i,l,d,c;const u=e.dom,m=RS(u,o);if(a=u.getParent(o,u.isBlock),!a||!ES(u,a)){if(a=a||m,c=a===e.getBody()||(e=>e&&/^(TD|TH|CAPTION)$/.test(e.nodeName))(a)?a.nodeName.toLowerCase():a.parentNode.nodeName.toLowerCase(),!a.hasChildNodes())return s=u.create(t),AS(e,s),a.appendChild(s),n.setStart(s,0),n.setEnd(s,0),s;for(l=o;l.parentNode!==a;)l=l.parentNode;for(;l&&!u.isBlock(l);)i=l,l=l.previousSibling;if(i&&e.schema.isValidChild(c,t.toLowerCase())){for(s=u.create(t),AS(e,s),i.parentNode.insertBefore(s,i),l=i;l&&!u.isBlock(l);)d=l.nextSibling,s.appendChild(l),l=d;n.setStart(o,r),n.setEnd(o,r)}}return o})(e,p,g,o,r)),s=u.getParent(o,u.isBlock),l=s?u.getParent(s.parentNode,u.isBlock):null,d=s?s.nodeName.toUpperCase():"";const w=l?l.nodeName.toUpperCase():"";"LI"!==w||C||(s=l,l=l.parentNode,d=w),/^(LI|DT|DD)$/.test(d)&&u.isEmpty(s)?((e,t,n,o,r)=>{const s=e.dom,a=e.selection.getRng();if(n===e.getBody())return;var i;CS(i=n)&&CS(i.parentNode)&&(r="LI");let l=t(r);if(wS(n,o,!0)&&wS(n,o,!1))if(yS(n,"LI")){const e=xS(n);s.insertAfter(l,e),(e=>{var t;return(null===(t=e.parentNode)||void 0===t?void 0:t.firstChild)===e})(n)?s.remove(e):s.remove(n)}else s.replace(l,n);else if(wS(n,o,!0))yS(n,"LI")?(s.insertAfter(l,xS(n)),l.appendChild(s.doc.createTextNode(" ")),l.appendChild(n)):n.parentNode.insertBefore(l,n),s.remove(o);else if(wS(n,o,!1))s.insertAfter(l,xS(n)),s.remove(o);else{n=xS(n);const e=a.cloneRange();e.setStartAfter(o),e.setEndAfter(n);const t=e.extractContents();"LI"===r&&((e,t)=>e.firstChild&&"LI"===e.firstChild.nodeName)(t)?(l=t.firstChild,s.insertAfter(t,n)):(s.insertAfter(t,n),s.insertAfter(l,n)),s.remove(o)}bS(e,l)})(e,h,l,s,p):s!==e.getBody()&&(hr(s)?(a=Sr(s),u.isEmpty(s)&&SS(s),AS(e,a),bS(e,a)):b()?v():b(!0)?(a=s.parentNode.insertBefore(h(),s),bS(e,_S(s,"HR")?a:s)):(n=(e=>{const t=e.cloneRange();return t.setStart(e.startContainer,NS(!0,e.startContainer,e.startOffset)),t.setEnd(e.endContainer,NS(!1,e.endContainer,e.endOffset)),t})(g).cloneRange(),n.setEndAfter(s),i=n.extractContents(),(e=>{$(Ys(mn(e),zt),(e=>{const t=e.dom;t.nodeValue=fr(t.nodeValue)}))})(i),(e=>{do{No(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild}while(e)})(i),a=i.firstChild,u.insertAfter(i,s),((e,t,n)=>{let o=n;const r=[];let s;if(o){for(;o=o.firstChild;){if(e.isBlock(o))return;yo(o)&&!t[o.nodeName.toLowerCase()]&&r.push(o)}for(s=r.length;s--;)o=r[s],(!o.hasChildNodes()||o.firstChild===o.lastChild&&""===o.firstChild.nodeValue||kS(e,o))&&e.remove(o)}})(u,f,a),((e,t)=>{t.normalize();const n=t.lastChild;n&&!/^(left|right)$/gi.test(e.getStyle(n,"float",!0))||e.add(t,"br")})(u,s),u.isEmpty(s)&&SS(s),a.normalize(),u.isEmpty(a)?(u.remove(a),v()):(AS(e,a),bS(e,a))),u.setAttrib(a,"id",""),e.dispatch("NewBlock",{newBlock:a}))},TS=(e,t,n)=>{const o=e.dom.createRng();n?(o.setStartBefore(t),o.setEndBefore(t)):(o.setStartAfter(t),o.setEndAfter(t)),e.selection.setRng(o),Pm(e,o)},BS=(e,t)=>{const n=cn("br");Yn(mn(t),n),e.undoManager.add()},DS=(e,t)=>{LS(e.getBody(),t)||Xn(mn(t),cn("br"));const n=cn("br");Xn(mn(t),n),TS(e,n.dom,!1),e.undoManager.add()},LS=(e,t)=>{return n=Ua.after(t),!!Do(n.getNode())||dc(e,Ua.after(t)).map((e=>Do(e.getNode()))).getOr(!1);var n},PS=e=>e&&"A"===e.nodeName&&"href"in e,MS=e=>e.fold(L,PS,PS,L),IS=(e,t)=>{t.fold(S,O(BS,e),O(DS,e),S)},FS=(e,t)=>{const n=(e=>{const t=O(By,e),n=Ua.fromRangeStart(e.selection.getRng());return FC(t,e.getBody(),n).filter(MS)})(e);n.isSome()?n.each(O(IS,e)):((e,t)=>{const n=e.selection,o=e.dom,r=n.getRng();let s,a;mm(o,r).each((e=>{r.setStart(e.startContainer,e.startOffset),r.setEnd(e.endContainer,e.endOffset)}));let i=r.startOffset,l=r.startContainer;if(1===l.nodeType&&l.hasChildNodes()){const e=i>l.childNodes.length-1;l=l.childNodes[Math.min(i,l.childNodes.length-1)]||l,i=e&&3===l.nodeType?l.nodeValue.length:0}let d=o.getParent(l,o.isBlock);const c=d?o.getParent(d.parentNode,o.isBlock):null,u=c?c.nodeName.toUpperCase():"",m=!(!t||!t.ctrlKey);"LI"!==u||m||(d=c),l&&3===l.nodeType&&i>=l.nodeValue.length&&(((e,t,n)=>{const o=new Xo(t,n);let r;const s=e.getNonEmptyElements();for(;r=o.next();)if(s[r.nodeName.toLowerCase()]||r.length>0)return!0})(e.schema,l,d)||(s=o.create("br"),r.insertNode(s),r.setStartAfter(s),r.setEndAfter(s),a=!0)),s=o.create("br"),ja(o,r,s),TS(e,s,a),e.undoManager.add()})(e,t)},US=(e,t)=>vS(e).filter((e=>t.length>0&&pn(mn(e),t))).isSome(),zS=ci([{br:[]},{block:[]},{none:[]}]),jS=(e,t)=>(e=>US(e,Li(e)))(e),VS=e=>(t,n)=>(e=>vS(e).filter((e=>rr(mn(e)))).isSome())(t)===e,HS=(e,t)=>(n,o)=>{const r=(e=>vS(e).fold(N(""),(e=>e.nodeName.toUpperCase())))(n)===e.toUpperCase();return r===t},$S=e=>HS("pre",e),qS=e=>(t,n)=>Oi(t)===e,WS=(e,t)=>(e=>US(e,Di(e)))(e),KS=(e,t)=>t,GS=e=>{const t=Ti(e),n=((e,t)=>{const n=e.getRoot();let o,r;for(o=t;o!==n&&"false"!==e.getContentEditable(o);)"true"===e.getContentEditable(o)&&(r=o),o=o.parentNode;return o!==n?r:n})(e.dom,e.selection.getStart());return n&&e.schema.isValidChild(n.nodeName,t)},YS=(e,t)=>(n,o)=>Y(e,((e,t)=>e&&t(n,o)),!0)?M.some(t):M.none(),XS=(e,t)=>{((e,t)=>RC([YS([jS],zS.none()),YS([HS("summary",!0)],zS.br()),YS([$S(!0),qS(!1),KS],zS.br()),YS([$S(!0),qS(!1)],zS.block()),YS([$S(!0),qS(!0),KS],zS.block()),YS([$S(!0),qS(!0)],zS.br()),YS([VS(!0),KS],zS.br()),YS([VS(!0)],zS.block()),YS([WS],zS.br()),YS([KS],zS.br()),YS([GS],zS.block())],[e,!(!t||!t.shiftKey)]).getOr(zS.none()))(e,t).fold((()=>{C(t)&&hS(e,"insertLineBreak").isDefaultPrevented()||(FS(e,t),C(t)&&pS(e,"insertLineBreak"))}),(()=>{C(t)&&hS(e,"insertParagraph").isDefaultPrevented()||(OS(e,t),C(t)&&pS(e,"insertParagraph"))}),S)},QS=Ct(),JS=e=>e.stopImmediatePropagation(),ZS=e=>e.keyCode===Uu.PAGE_UP||e.keyCode===Uu.PAGE_DOWN,e_=(e,t,n)=>{n&&!e.get()?t.on("NodeChange",JS,!0):!n&&e.get()&&t.off("NodeChange",JS),e.set(n)},t_=(e,t)=>{const n=t.container(),o=t.offset();return No(n)?(n.insertData(o,e),M.some(Ua(n,o+e.length))):jd(t).map((n=>{const o=un(e);return t.isAtEnd()?Xn(n,o):Yn(n,o),Ua(o.dom,e.length)}))},n_=O(t_,dr),o_=O(t_," "),r_=(e,t)=>n=>((e,t)=>!hg(t)&&(((e,t)=>((e,t)=>cc(e.dom,t).isNone())(e,t)||((e,t)=>dc(e.dom,t).isNone())(e,t)||ng(e,t)||og(e,t)||dg(e,t)||lg(e,t))(e,t)||gg(e,t)||pg(e,t)))(e,n)?n_(t):o_(t),s_=e=>{const t=Ua.fromRangeStart(e.selection.getRng()),n=mn(e.getBody());if(e.selection.isCollapsed()){const o=O(By,e),r=Ua.fromRangeStart(e.selection.getRng());return FC(o,e.getBody(),r).bind((e=>t=>t.fold((t=>cc(e.dom,Ua.before(t))),(e=>uc(e)),(e=>mc(e)),(t=>dc(e.dom,Ua.after(t)))))(n)).map((o=>()=>r_(n,t)(o).each((e=>t=>(e.selection.setRng(t.toRange()),e.nodeChanged(),!0))(e))))}return M.none()},a_=e=>td(e)?[{keyCode:Uu.TAB,action:pw($w,e,!0)},{keyCode:Uu.TAB,shiftKey:!0,action:pw($w,e,!1)}]:[],i_=e=>{if(e.addShortcut("Meta+P","","mcePrint"),fS(e),_v(e))return zs(null);{const t=Rx(e);return(e=>{e.on("keyup compositionstart",O(rw,e))})(e),((e,t)=>{e.on("keydown",(n=>{!1===n.isDefaultPrevented()&&((e,t,n)=>{const o=Ct().os;hw([{keyCode:Uu.RIGHT,action:pw(iw,e,!0)},{keyCode:Uu.LEFT,action:pw(iw,e,!1)},{keyCode:Uu.UP,action:pw(lw,e,!1)},{keyCode:Uu.DOWN,action:pw(lw,e,!0)},{keyCode:Uu.RIGHT,action:pw(Uw,e,!0)},{keyCode:Uu.LEFT,action:pw(Uw,e,!1)},{keyCode:Uu.UP,action:pw(zw,e,!1)},{keyCode:Uu.DOWN,action:pw(zw,e,!0)},{keyCode:Uu.RIGHT,action:pw(vw,e,!0)},{keyCode:Uu.LEFT,action:pw(vw,e,!1)},{keyCode:Uu.UP,action:pw(yw,e,!1)},{keyCode:Uu.DOWN,action:pw(yw,e,!0)},{keyCode:Uu.RIGHT,action:pw(Ex,e,t,!0)},{keyCode:Uu.LEFT,action:pw(Ex,e,t,!1)},{keyCode:Uu.RIGHT,ctrlKey:!o.isMacOS(),altKey:o.isMacOS(),action:pw(Ax,e,t)},{keyCode:Uu.LEFT,ctrlKey:!o.isMacOS(),altKey:o.isMacOS(),action:pw(Ox,e,t)},{keyCode:Uu.UP,action:pw(mw,e,!1)},{keyCode:Uu.DOWN,action:pw(mw,e,!0)}],n).each((e=>{n.preventDefault()}))})(e,t,n)}))})(e,t),((e,t)=>{e.on("keydown",(n=>{!1===n.isDefaultPrevented()&&((e,t,n)=>{const o=n.keyCode===Uu.BACKSPACE?"deleteContentBackward":"deleteContentForward";bw([{keyCode:Uu.BACKSPACE,action:pw(Kx,e)},{keyCode:Uu.BACKSPACE,action:pw(hC,e,!1)},{keyCode:Uu.DELETE,action:pw(hC,e,!0)},{keyCode:Uu.BACKSPACE,action:pw(cC,e,!1)},{keyCode:Uu.DELETE,action:pw(cC,e,!0)},{keyCode:Uu.BACKSPACE,action:pw(Lx,e,t,!1)},{keyCode:Uu.DELETE,action:pw(Lx,e,t,!0)},{keyCode:Uu.BACKSPACE,action:pw(ap,e,!1)},{keyCode:Uu.DELETE,action:pw(ap,e,!0)},{keyCode:Uu.BACKSPACE,action:pw(bC,e,!1)},{keyCode:Uu.DELETE,action:pw(bC,e,!0)},{keyCode:Uu.BACKSPACE,action:pw(Ux,e,!1)},{keyCode:Uu.DELETE,action:pw(Ux,e,!0)},{keyCode:Uu.BACKSPACE,action:pw(tC,e,!1)},{keyCode:Uu.DELETE,action:pw(tC,e,!0)},{keyCode:Uu.BACKSPACE,action:pw(Jy,e,!1)},{keyCode:Uu.DELETE,action:pw(Jy,e,!0)},{keyCode:Uu.BACKSPACE,action:pw(Ix,e,!1)},{keyCode:Uu.DELETE,action:pw(Ix,e,!0)}],n).each((t=>{n.preventDefault(),hS(e,o).isDefaultPrevented()||(t(),pS(e,o))}))})(e,t,n)})),e.on("keyup",(t=>{!1===t.isDefaultPrevented()&&((e,t)=>{hw([{keyCode:Uu.BACKSPACE,action:pw(pC,e)},{keyCode:Uu.DELETE,action:pw(pC,e)}],t)})(e,t)}))})(e,t),(e=>{e.on("keydown",(t=>{t.keyCode===Uu.ENTER&&((e,t)=>{var n;t.isDefaultPrevented()||(t.preventDefault(),(n=e.undoManager).typing&&(n.typing=!1,n.add()),e.undoManager.transact((()=>{!1===e.selection.isCollapsed()&&Fy(e),XS(e,t)})))})(e,t)}))})(e),(e=>{e.on("keydown",(t=>{!1===t.isDefaultPrevented()&&((e,t)=>{bw([{keyCode:Uu.SPACEBAR,action:pw(s_,e)}],t).each((n=>{t.preventDefault(),hS(e,"insertText",{data:" "}).isDefaultPrevented()||(n(),pS(e,"insertText",{data:" "}))}))})(e,t)}))})(e),(e=>{e.on("input",(t=>{!1===t.isComposing&&(e=>{const t=mn(e.getBody());e.selection.isCollapsed()&&wg(t,Ua.fromRangeStart(e.selection.getRng())).each((t=>{e.selection.setRng(t.toRange())}))})(e)}))})(e),(e=>{e.on("keydown",(t=>{!1===t.isDefaultPrevented()&&((e,t)=>{hw([...a_(e)],t).each((e=>{t.preventDefault()}))})(e,t)}))})(e),((e,t)=>{e.on("keydown",(n=>{!1===n.isDefaultPrevented()&&((e,t,n)=>{hw([{keyCode:Uu.END,action:pw(dw,e,!0)},{keyCode:Uu.HOME,action:pw(dw,e,!1)},{keyCode:Uu.END,action:pw(Cw,e,!0)},{keyCode:Uu.HOME,action:pw(Cw,e,!1)},{keyCode:Uu.END,action:pw(Tx,e,!0,t)},{keyCode:Uu.HOME,action:pw(Tx,e,!1,t)}],n).each((e=>{n.preventDefault()}))})(e,t,n)}))})(e,t),((e,t)=>{if(QS.os.isMacOS())return;const n=zs(!1);e.on("keydown",(t=>{ZS(t)&&e_(n,e,!0)})),e.on("keyup",(o=>{!1===o.isDefaultPrevented()&&((e,t,n)=>{hw([{keyCode:Uu.PAGE_UP,action:pw(Tx,e,!1,t)},{keyCode:Uu.PAGE_DOWN,action:pw(Tx,e,!0,t)}],n)})(e,t,o),ZS(o)&&n.get()&&(e_(n,e,!1),e.nodeChanged())}))})(e,t),t}};class l_{constructor(e){let t;this.lastPath=[],this.editor=e;const n=this;"onselectionchange"in e.getDoc()||e.on("NodeChange click mouseup keyup focus",(n=>{const o=e.selection.getRng(),r={startContainer:o.startContainer,startOffset:o.startOffset,endContainer:o.endContainer,endOffset:o.endOffset};"nodechange"!==n.type&&om(r,t)||e.dispatch("SelectionChange"),t=r})),e.on("contextmenu",(()=>{e.dispatch("SelectionChange")})),e.on("SelectionChange",(()=>{const t=e.selection.getStart(!0);t&&wu(e)&&!n.isSameElementPath(t)&&e.dom.isChildOf(t,e.getBody())&&e.nodeChanged({selectionChange:!0})})),e.on("mouseup",(t=>{!t.isDefaultPrevented()&&wu(e)&&("IMG"===e.selection.getNode().nodeName?Gm.setEditorTimeout(e,(()=>{e.nodeChanged()})):e.nodeChanged())}))}nodeChanged(e){const t=this.editor.selection;let n,o,r;this.editor.initialized&&t&&!kl(this.editor)&&!this.editor.mode.isReadOnly()&&(r=this.editor.getBody(),n=t.getStart(!0)||r,n.ownerDocument===this.editor.getDoc()&&this.editor.dom.isChildOf(n,r)||(n=r),o=[],this.editor.dom.getParent(n,(e=>{if(e===r)return!0;o.push(e)})),(e=e||{}).element=n,e.parents=o,this.editor.dispatch("NodeChange",e))}isSameElementPath(e){let t;const n=this.editor,o=ne(n.dom.getParents(e,P,n.getBody()));if(o.length===this.lastPath.length){for(t=o.length;t>=0&&o[t]===this.lastPath[t];t--);if(-1===t)return this.lastPath=o,!0}return this.lastPath=o,!1}}const d_=N("x-tinymce/html"),c_="\x3c!-- x-tinymce/html --\x3e",u_=e=>c_+e,m_=e=>-1!==e.indexOf(c_),f_="%MCEPASTEBIN%",g_=e=>e.dom.get("mcepastebin"),p_=e=>e&&"mcepastebin"===e.id,h_=e=>e===f_,b_=(e,t)=>(Bt.each(t,(t=>{e=u(t,RegExp)?e.replace(t,""):e.replace(t[0],t[1])})),e),v_=e=>b_(e,[/^[\s\S]*<body[^>]*>\s*|\s*<\/body[^>]*>[\s\S]*$/gi,/<!--StartFragment-->|<!--EndFragment-->/g,[/( ?)<span class="Apple-converted-space">\u00a0<\/span>( ?)/g,(e,t,n)=>t||n?dr:" "],/<br class="Apple-interchange-newline">/g,/<br>$/i]),y_=(e,t)=>({content:e,cancelled:t}),C_=(e,t)=>(e.insertContent(t,{merge:ql(e),paste:!0}),!0),x_=e=>/^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(e),w_=(e,t,n)=>!(e.selection.isCollapsed()||!x_(t))&&((e,t,n)=>(e.undoManager.extra((()=>{n(e,t)}),(()=>{e.execCommand("mceInsertLink",!1,t)})),!0))(e,t,n),k_=(e,t,n)=>!!((e,t)=>x_(t)&&V(ed(e),(e=>je(t.toLowerCase(),`.${e.toLowerCase()}`))))(e,t)&&((e,t,n)=>(e.undoManager.extra((()=>{n(e,t)}),(()=>{e.insertContent('<img src="'+t+'">')})),!0))(e,t,n),S_=(e=>{let t=0;return()=>"mceclip"+t++})(),__=(e,t,n,o)=>{const r=((e,t,n)=>((e,t,n)=>{const o=((e,t,n)=>e.dispatch("PastePreProcess",{content:t,internal:n}))(e,t,n),r=((e,t)=>{const n=Wb({},e.schema);n.addNodeFilter("meta",(e=>{Bt.each(e,(e=>{e.remove()}))}));const o=n.parse(t,{forced_root_block:!1,isRootContent:!0});return Rf({validate:!0},e.schema).serialize(o)})(e,o.content);return e.hasEventListeners("PastePostProcess")&&!o.isDefaultPrevented()?((e,t,n)=>{const o=e.dom.create("div",{style:"display:none"},t),r=((e,t,n)=>e.dispatch("PastePostProcess",{node:t,internal:n}))(e,o,n);return y_(r.node.innerHTML,r.isDefaultPrevented())})(e,r,n):y_(r,o.isDefaultPrevented())})(e,t,n))(e,t,n);!1===r.cancelled&&((e,t,n)=>{n||!Wl(e)?C_(e,t):((e,t)=>{Bt.each([w_,k_,C_],(n=>!0!==n(e,t,C_)))})(e,t)})(e,r.content,o)},E_=(e,t,n)=>{const o=n||m_(t);__(e,(e=>e.replace(c_,""))(t),o,!1)},N_=(e,t)=>{const n=e.dom.encode(t).replace(/\r\n/g,"\n"),o=((e,t,n)=>{const o=e.split(/\n\n/),r=((e,t)=>{let n="<"+e;const o=ye(t,((e,t)=>t+'="'+ls.encodeAllRaw(e)+'"'));return o.length&&(n+=" "+o.join(" ")),n+">"})(t,n),s="</"+t+">",a=H(o,(e=>e.split(/\n/).join("<br />")));return 1===a.length?a[0]:H(a,(e=>r+e+s)).join("")})(zr(n,Gl(e)),Ti(e),Bi(e));__(e,o,!1,!0)},R_=e=>{const t={};if(e&&e.types)for(let n=0;n<e.types.length;n++){const o=e.types[n];try{t[o]=e.getData(o)}catch(e){t[o]=""}}return t},A_=(e,t)=>t in e&&e[t].length>0,O_=e=>A_(e,"text/html")||A_(e,"text/plain"),T_=(e,t,n)=>{const o="paste"===t.type?t.clipboardData:t.dataTransfer;var r;if(zl(e)&&o){const s=((e,t)=>{const n=t.items?ee(de(t.items),(e=>"file"===e.kind?[e.getAsFile()]:[])):[],o=t.files?de(t.files):[];return K(n.length>0?n:o,(e=>{const t=ed(e);return e=>ze(e.type,"image/")&&V(t,(t=>(e=>{const t=e.toLowerCase(),n={jpg:"jpeg",jpe:"jpeg",jfi:"jpeg",jif:"jpeg",jfif:"jpeg",pjpeg:"jpeg",pjp:"jpeg",svg:"svg+xml"};return Bt.hasOwn(n,t)?"image/"+n[t]:"image/"+t})(t)===e.type))})(e))})(e,o);if(s.length>0)return t.preventDefault(),(r=s,Promise.all(H(r,(e=>Nb(e).then((t=>({file:e,uri:t}))))))).then((t=>{n&&e.selection.setRng(n),$(t,(t=>{((e,t)=>{const{data:n,type:o}=Sb(t.uri),r=t.file,s=e.editorUpload.blobCache,a=s.getByData(n,o),i=null!=a?a:((e,t,n,o)=>{const r=S_(),s=Fi(e)&&C(n.name),a=s?((e,t)=>{const n=t.match(/([\s\S]+?)(?:\.[a-z0-9.]+)$/i);return C(n)?e.dom.encode(n[1]):null})(e,n.name):r,i=s?n.name:void 0,l=t.create(r,n,o,a,i);return t.add(l),l})(e,s,r,n);E_(e,`<img src="${i.blobUri()}">`,!1)})(e,t)}))})),!0}return!1},B_=(e,t,n,o)=>{let r=v_(n);const s=A_(t,d_())||m_(n),a=!s&&(e=>!/<(?:\/?(?!(?:div|p|br|span)>)\w+|(?:(?!(?:span style="white-space:\s?pre;?">)|br\s?\/>))\w+\s[^>]+)>/i.test(e))(r),i=x_(r);(h_(r)||!r.length||a&&!i)&&(o=!0),(o||i)&&(r=A_(t,"text/plain")&&a?t["text/plain"]:(e=>{const t=vs(),n=Wb({},t);let o="";const r=t.getVoidElements(),s=Bt.makeMap("script noscript style textarea video audio iframe object"," "),a=t.getBlockElements(),i=e=>{const n=e.name,l=e;if("br"!==n){if("wbr"!==n)if(r[n]&&(o+=" "),s[n])o+=" ";else{if(3===e.type&&(o+=e.value),!(e.name in t.getVoidElements())&&(e=e.firstChild))do{i(e)}while(e=e.next);a[n]&&l.next&&(o+="\n","p"===n&&(o+="\n"))}}else o+="\n"};return e=b_(e,[/<!\[[^\]]+\]>/g]),i(n.parse(e)),o})(r)),h_(r)||(o?N_(e,r):E_(e,r,s))},D_=(e,t,n)=>{((e,t,n)=>{let o;e.on("keydown",(e=>{(e=>Uu.metaKeyPressed(e)&&86===e.keyCode||e.shiftKey&&45===e.keyCode)(e)&&!e.isDefaultPrevented()&&(o=e.shiftKey&&86===e.keyCode)})),e.on("paste",(r=>{if(r.isDefaultPrevented()||(e=>{var t,n;return Nt.os.isAndroid()&&0===(null===(n=null===(t=e.clipboardData)||void 0===t?void 0:t.items)||void 0===n?void 0:n.length)})(r))return;const s="text"===n.get()||o;o=!1;const a=R_(r.clipboardData);!O_(a)&&T_(e,r,t.getLastRng()||e.selection.getRng())||(A_(a,"text/html")?(r.preventDefault(),B_(e,a,a["text/html"],s)):(t.create(),Gm.setEditorTimeout(e,(()=>{const n=t.getHtml();t.remove(),B_(e,a,n,s)}),0)))}))})(e,t,n),(e=>{const t=e=>ze(e,"webkit-fake-url"),n=e=>ze(e,"data:");e.parser.addNodeFilter("img",((o,r,s)=>{if(!zl(e)&&(e=>{var t;return!0===(null===(t=e.data)||void 0===t?void 0:t.paste)})(s))for(const r of o){const o=r.attr("src");m(o)&&!r.attr("data-mce-object")&&o!==Nt.transparentSrc&&(t(o)||!Yl(e)&&n(o))&&r.remove()}}))})(e)},L_=(e,t,n,o)=>{((e,t,n)=>{try{return e.clearData(),e.setData("text/html",t),e.setData("text/plain",n),e.setData(d_(),t),!0}catch(e){return!1}})(e.clipboardData,t.html,t.text)?(e.preventDefault(),o()):n(t.html,o)},P_=e=>(t,n)=>{const{dom:o,selection:r}=e,s=o.create("div",{contenteditable:"false","data-mce-bogus":"all"}),a=o.create("div",{contenteditable:"true"},t);o.setStyles(s,{position:"fixed",top:"0",left:"-3000px",width:"1000px",overflow:"hidden"}),s.appendChild(a),o.add(e.getBody(),s);const i=r.getRng();a.focus();const l=o.createRng();l.selectNodeContents(a),r.setRng(l),Gm.setEditorTimeout(e,(()=>{r.setRng(i),o.remove(s),n()}),0)},M_=e=>({html:u_(e.selection.getContent({contextual:!0})),text:e.selection.getContent({format:"text"})}),I_=e=>!e.selection.isCollapsed()||(e=>!!e.dom.getParent(e.selection.getStart(),"td[data-mce-selected],th[data-mce-selected]",e.getBody()))(e),F_=(e,t)=>{var n,o;return pm.getCaretRangeFromPoint(null!==(n=t.clientX)&&void 0!==n?n:0,null!==(o=t.clientY)&&void 0!==o?o:0,e.getDoc())},U_=(e,t)=>{e.focus(),t&&e.selection.setRng(t)},z_=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,j_=e=>Bt.trim(e).replace(z_,Pc).toLowerCase(),V_=(e,t,n)=>{const o=Hl(e);if(n||"all"===o||!$l(e))return t;const r=o?o.split(/[, ]/):[];if(r&&"none"!==o){const n=e.dom,o=e.selection.getNode();t=t.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,((e,t,s,a)=>{const i=n.parseStyle(n.decode(s)),l={};for(let e=0;e<r.length;e++){const t=i[r[e]];let s=t,a=n.getStyle(o,r[e],!0);/color/.test(r[e])&&(s=j_(s),a=j_(a)),a!==s&&(l[r[e]]=t)}const d=n.serializeStyle(l,"span");return d?t+' style="'+d+'"'+a:t+a}))}else t=t.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,"$1$3");return t=t.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi,((e,t,n,o)=>t+' style="'+n+'"'+o)),t},H_=e=>{const t=zs(!1),n=zs(Kl(e)?"text":"html"),o=(e=>{const t=zs(null);return{create:()=>((e,t)=>{const{dom:n,selection:o}=e,r=e.getBody();t.set(o.getRng());const s=n.add(e.getBody(),"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"},f_);Nt.browser.isFirefox()&&n.setStyle(s,"left","rtl"===n.getStyle(r,"direction",!0)?65535:-65535),n.bind(s,"beforedeactivate focusin focusout",(e=>{e.stopPropagation()})),s.focus(),o.select(s,!0)})(e,t),remove:()=>((e,t)=>{const n=e.dom;if(g_(e)){let o;const r=t.get();for(;o=g_(e);)n.remove(o),n.unbind(o);r&&e.selection.setRng(r)}t.set(null)})(e,t),getEl:()=>g_(e),getHtml:()=>(e=>{const t=e.dom,n=(e,n)=>{e.appendChild(n),t.remove(n,!0)},[o,...r]=K(e.getBody().childNodes,p_);$(r,(e=>{n(o,e)}));const s=t.select("div[id=mcepastebin]",o);for(let e=s.length-1;e>=0;e--){const r=t.create("div");o.insertBefore(r,s[e]),n(r,s[e])}return o?o.innerHTML:""})(e),getLastRng:t.get}})(e);(e=>{(Nt.browser.isChromium()||Nt.browser.isSafari())&&((e,t)=>{e.on("PastePreProcess",(n=>{n.content=t(e,n.content,n.internal)}))})(e,V_)})(e),((e,t)=>{e.addCommand("mceTogglePlainTextPaste",(()=>{((e,t)=>{"text"===t.get()?(t.set("html"),Fu(e,!1)):(t.set("text"),Fu(e,!0)),e.focus()})(e,t)})),e.addCommand("mceInsertClipboardContent",((t,n)=>{n.html&&E_(e,n.html,n.internal),n.text&&N_(e,n.text)}))})(e,n),(e=>{const t=t=>n=>{t(e,n)},n=jl(e);x(n)&&e.on("PastePreProcess",t(n));const o=Vl(e);x(o)&&e.on("PastePostProcess",t(o))})(e),e.on("PreInit",(()=>{(e=>{e.on("cut",(e=>t=>{!t.isDefaultPrevented()&&I_(e)&&L_(t,M_(e),P_(e),(()=>{if(Nt.browser.isChromium()||Nt.browser.isFirefox()){const t=e.selection.getRng();Gm.setEditorTimeout(e,(()=>{e.selection.setRng(t),e.execCommand("Delete")}),0)}else e.execCommand("Delete")}))})(e)),e.on("copy",(e=>t=>{!t.isDefaultPrevented()&&I_(e)&&L_(t,M_(e),P_(e),S)})(e))})(e),((e,t)=>{Ul(e)&&e.on("dragend dragover draggesture dragdrop drop drag",(e=>{e.preventDefault(),e.stopPropagation()})),zl(e)||e.on("drop",(e=>{const t=e.dataTransfer;t&&(e=>V(e.files,(e=>/^image\//.test(e.type))))(t)&&e.preventDefault()})),e.on("drop",(n=>{if(n.isDefaultPrevented()||t.get())return;const o=F_(e,n);if(y(o))return;const r=R_(n.dataTransfer),s=A_(r,d_());if((!O_(r)||(e=>{const t=e["text/plain"];return!!t&&0===t.indexOf("file://")})(r))&&T_(e,n,o))return;const a=r[d_()],i=a||r["text/html"]||r["text/plain"];i&&(n.preventDefault(),Gm.setEditorTimeout(e,(()=>{e.undoManager.transact((()=>{a&&e.execCommand("Delete"),U_(e,o);const t=v_(i);r["text/html"]?E_(e,t,s):N_(e,t)}))})))})),e.on("dragstart",(e=>{t.set(!0)})),e.on("dragover dragend",(n=>{zl(e)&&!1===t.get()&&(n.preventDefault(),U_(e,F_(e,n))),"dragend"===n.type&&t.set(!1)}))})(e,t),D_(e,o,n)}))},$_=e=>yo(e)&&nr(mn(e));var q_;!function(e){e.Before="before",e.After="after"}(q_||(q_={}));const W_=(e,t)=>Math.abs(e.left-t),K_=(e,t)=>Math.abs(e.right-t),G_=(e,t)=>(e=>Y(e,((e,t)=>e.fold((()=>M.some(t)),(e=>{const n=Math.min(t.left,e.left),o=Math.min(t.top,e.top),r=Math.max(t.right,e.right),s=Math.max(t.bottom,e.bottom);return M.some({top:o,right:r,bottom:s,left:n,width:r-n,height:s-o})}))),M.none()))(K(e,(e=>{return(n=t)>=(o=e).top&&n<=o.bottom;var n,o}))).fold((()=>[[],e]),(t=>{const{pass:n,fail:o}=W(e,(e=>((e,t)=>{const n=((e,t)=>Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)))(e,t)/Math.min(e.height,t.height);return((e,t)=>e.top<t.bottom&&e.bottom>t.top)(e,t)&&n>.5})(e,t)));return[n,o]})),Y_=(e,t,n)=>t>e.left&&t<e.right?0:Math.min(Math.abs(e.left-t),Math.abs(e.right-t)),X_=(e,t,n)=>{const o=e=>Lr(e.node)?M.some(e):yo(e.node)?X_(de(e.node.childNodes),t,n):M.none(),r=(e,r)=>{const s=se(e,((e,o)=>r(e,t,n)-r(o,t,n)));return((e,r)=>{if(e.length>=2){const s=o(e[0]).getOr(e[0]),a=o(e[1]).getOr(e[1]);if(Math.abs(r(s,t,n)-r(a,t,n))<2){if(No(s.node))return M.some(s);if(No(a.node))return M.some(a)}}return M.none()})(s,r).orThunk((()=>ce(s,o)))},[s,a]=G_(cx(e),n),{pass:i,fail:l}=W(a,(e=>e.top<n));return r(s,Y_).orThunk((()=>r(l,ba))).orThunk((()=>r(i,ba)))},Q_=(e,t,n)=>((e,t,n)=>{const o=mn(e),r=Cn(o),s=fn(r,t,n).filter((e=>vn(o,e))).getOr(o);return((e,t,n,o)=>{const r=(t,s)=>s.fold((()=>X_(de(t.dom.childNodes),n,o)),(e=>{const r=K(de(t.dom.childNodes),(t=>t!==e.dom));return X_(r,n,o)})).orThunk((()=>{var n;return(bn(t,e)?M.none():(n=t,M.from(n.dom.parentElement).map(mn))).bind((e=>r(e,M.some(t))))}));return r(t,M.none())})(o,s,t,n)})(e,t,n).filter((e=>bd(e.node))).map((e=>((e,t)=>({node:e.node,position:W_(e,t)<K_(e,t)?q_.Before:q_.After}))(e,t))),J_=e=>{const t=e.getBoundingClientRect(),n=e.ownerDocument,o=n.documentElement,r=n.defaultView;return{top:t.top+r.pageYOffset-o.clientTop,left:t.left+r.pageXOffset-o.clientLeft}},Z_=Mo,eE=Po,tE=(e,t,n,o)=>{const r=e.dom,s=t.cloneNode(!0);r.setStyles(s,{width:n,height:o}),r.setAttrib(s,"data-mce-selected",null);const a=r.create("div",{class:"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return r.setStyles(a,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:n,height:o}),r.setStyles(s,{margin:0,boxSizing:"border-box"}),a.appendChild(s),a},nE=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)},oE=e=>{e.on((e=>{nE(e.ghost)})),e.clear()},rE=e=>{const t=Ws(),n=Is.DOM,o=document,r=((e,t)=>n=>{if((e=>0===e.button)(n)){const s=Q(t.dom.getParents(n.target),((...e)=>t=>{for(let n=0;n<e.length;n++)if(e[n](t))return!0;return!1})(Z_,eE)).getOr(null);if(o=t.getBody(),Z_(r=s)&&r!==o){const o=t.dom.getPos(s),r=t.getBody(),a=t.getDoc().documentElement;e.set({element:s,dragging:!1,screenX:n.screenX,screenY:n.screenY,maxX:(t.inline?r.scrollWidth:a.offsetWidth)-2,maxY:(t.inline?r.scrollHeight:a.offsetHeight)-2,relX:n.pageX-o.x,relY:n.pageY-o.y,width:s.offsetWidth,height:s.offsetHeight,ghost:tE(t,s,s.offsetWidth,s.offsetHeight)})}}var o,r})(t,e),s=((e,t)=>{const n=Ks(((e,n)=>{t._selectionOverrides.hideFakeCaret(),t.selection.placeCaretAt(e,n)}),0);return t.on("remove",n.cancel),o=>e.on((e=>{const r=Math.max(Math.abs(o.screenX-e.screenX),Math.abs(o.screenY-e.screenY));if(!e.dragging&&r>10){if(t.dispatch("dragstart",{target:e.element}).isDefaultPrevented())return;e.dragging=!0,t.focus()}if(e.dragging){const r=((e,t)=>({pageX:t.pageX-e.relX,pageY:t.pageY+5}))(e,((e,t)=>{return n=(e=>e.inline?J_(e.getBody()):{left:0,top:0})(e),o=(e=>{const t=e.getBody();return e.inline?{left:t.scrollLeft,top:t.scrollTop}:{left:0,top:0}})(e),r=((e,t)=>{if(t.target.ownerDocument!==e.getDoc()){const n=J_(e.getContentAreaContainer()),o=(e=>{const t=e.getBody(),n=e.getDoc().documentElement,o={left:t.scrollLeft,top:t.scrollTop},r={left:t.scrollLeft||n.scrollLeft,top:t.scrollTop||n.scrollTop};return e.inline?o:r})(e);return{left:t.pageX-n.left+o.left,top:t.pageY-n.top+o.top}}return{left:t.pageX,top:t.pageY}})(e,t),{pageX:r.left-n.left+o.left,pageY:r.top-n.top+o.top};var n,o,r})(t,o));s=e.ghost,a=t.getBody(),s.parentNode!==a&&a.appendChild(s),((e,t,n,o,r,s)=>{let a=0,i=0;e.style.left=t.pageX+"px",e.style.top=t.pageY+"px",t.pageX+n>r&&(a=t.pageX+n-r),t.pageY+o>s&&(i=t.pageY+o-s),e.style.width=n-a+"px",e.style.height=o-i+"px"})(e.ghost,r,e.width,e.height,e.maxX,e.maxY),n.throttle(o.clientX,o.clientY)}var s,a}))})(t,e),a=((e,t)=>n=>{e.on((e=>{if(e.dragging){if(((e,t,n)=>t!==n&&!e.dom.isChildOf(t,n)&&!Z_(t))(t,(e=>{const t=e.getSel().getRangeAt(0).startContainer;return 3===t.nodeType?t.parentNode:t})(t.selection),e.element)){const o=(e=>{const t=e.cloneNode(!0);return t.removeAttribute("data-mce-selected"),t})(e.element);t.dispatch("drop",{clientX:n.clientX,clientY:n.clientY}).isDefaultPrevented()||t.undoManager.transact((()=>{nE(e.element),t.insertContent(t.dom.getOuterHTML(o)),t._selectionOverrides.hideFakeCaret()}))}t.dispatch("dragend")}})),oE(e)})(t,e),i=((e,t)=>()=>{e.on((e=>{e.dragging&&t.dispatch("dragend")})),oE(e)})(t,e);e.on("mousedown",r),e.on("mousemove",s),e.on("mouseup",a),n.bind(o,"mousemove",s),n.bind(o,"mouseup",i),e.on("remove",(()=>{n.unbind(o,"mousemove",s),n.unbind(o,"mouseup",i)})),e.on("keydown",(e=>{e.keyCode===Uu.ESC&&i()}))},sE=Mo,aE=(e,t)=>ip(e.getBody(),t),iE=e=>{const t=e.selection,n=e.dom,o=n.isBlock,r=e.getBody(),s=gd(e,r,o,(()=>nf(e))),a="sel-"+n.uniqueId(),i="data-mce-selected";let l;const d=e=>e!==r&&(sE(e)||Fo(e))&&n.isChildOf(e,r),c=(n,o,r,a=!0)=>e.dispatch("ShowCaret",{target:o,direction:n,before:r}).isDefaultPrevented()?null:(a&&t.scrollIntoView(o,-1===n),s.show(r,o)),u=e=>vr(e)||wr(e)||kr(e),m=e=>u(e.startContainer)||u(e.endContainer),f=t=>{const o=e.schema.getVoidElements(),r=n.createRng(),s=t.startContainer,a=t.startOffset,i=t.endContainer,l=t.endOffset;return we(o,s.nodeName.toLowerCase())?0===a?r.setStartBefore(s):r.setStartAfter(s):r.setStart(s,a),we(o,i.nodeName.toLowerCase())?0===l?r.setEndBefore(i):r.setEndAfter(i):r.setEnd(i,l),r},g=(o,s)=>{if(!o)return null;if(o.collapsed){if(!m(o)){const e=s?1:-1,t=zd(e,r,o),n=t.getNode(!s);if(bd(n))return c(e,n,!!s&&!t.isAtEnd(),!1);const a=t.getNode(s);if(bd(a))return c(e,a,!s&&!t.isAtEnd(),!1)}return null}let u=o.startContainer,f=o.startOffset;const g=o.endOffset;if(3===u.nodeType&&0===f&&sE(u.parentNode)&&(u=u.parentNode,f=n.nodeIndex(u),u=u.parentNode),1!==u.nodeType)return null;if(g===f+1&&u===o.endContainer){const o=u.childNodes[f];if(d(o))return(o=>{const r=o.cloneNode(!0),s=e.dispatch("ObjectSelected",{target:o,targetClone:r});if(s.isDefaultPrevented())return null;const d=((o,r)=>{const s=mn(e.getBody()),i=e.getDoc(),l=Wo(s,"#"+a).getOrThunk((()=>{const e=dn('<div data-mce-bogus="all" class="mce-offscreen-selection"></div>',i);return $t(e,"id",a),Jn(s,e),e})),d=n.createRng();eo(l),Zn(l,[un(dr,i),mn(r),un(dr,i)]),d.setStart(l.dom.firstChild,1),d.setEnd(l.dom.lastChild,0),Hn(l,{top:n.getPos(o,e.getBody()).y+"px"}),Mm(l);const c=t.getSel();return c.removeAllRanges(),c.addRange(d),d})(o,s.targetClone),c=mn(o);return $(Xs(mn(e.getBody()),"*[data-mce-selected]"),(e=>{bn(c,e)||Yt(e,i)})),n.getAttrib(o,i)||o.setAttribute(i,"1"),l=o,h(),d})(o)}return null},p=()=>{l&&l.removeAttribute(i),Wo(mn(e.getBody()),"#"+a).each(to),l=null},h=()=>{s.hide()};return _v(e)||(e.on("click",(t=>{const n=aE(e,t.target);n&&sE(n)&&(t.preventDefault(),e.focus())})),e.on("blur NewBlock",p),e.on("ResizeWindow FullscreenStateChanged",s.reposition),e.on("tap",(t=>{const n=t.target,o=aE(e,n);sE(o)?(t.preventDefault(),sC(e,o).each(g)):d(n)&&sC(e,n).each(g)}),!0),e.on("mousedown",(o=>{const s=o.target;if(s!==r&&"HTML"!==s.nodeName&&!n.isChildOf(s,r))return;if(!1===((e,t,n)=>{const o=mn(e.getBody()),r=e.inline?o:mn(Cn(o).dom.documentElement),s=((e,t,n,o)=>{const r=(e=>e.dom.getBoundingClientRect())(t);return{x:n-(e?r.left+t.dom.clientLeft+Qv(t):0),y:o-(e?r.top+t.dom.clientTop+Xv(t):0)}})(e.inline,r,t,n);return((e,t,n)=>{const o=Gv(e),r=Yv(e);return t>=0&&n>=0&&t<=o&&n<=r})(r,s.x,s.y)})(e,o.clientX,o.clientY))return;p(),h();const a=aE(e,s);sE(a)?(o.preventDefault(),sC(e,a).each(g)):Q_(r,o.clientX,o.clientY).each((n=>{var r;o.preventDefault(),(r=c(1,n.node,n.position===q_.Before,!1))&&t.setRng(r),yo(a)?a.focus():e.getBody().focus()}))})),e.on("keypress",(e=>{Uu.modifierPressed(e)||sE(t.getNode())&&e.preventDefault()})),e.on("GetSelectionRange",(e=>{let t=e.range;if(l){if(!l.parentNode)return void(l=null);t=t.cloneRange(),t.selectNode(l),e.range=t}})),e.on("SetSelectionRange",(e=>{e.range=f(e.range);const t=g(e.range,e.forward);t&&(e.range=t)})),e.on("AfterSetSelectionRange",(e=>{const t=e.range,o=t.startContainer.parentNode;var r;m(t)||"mcepastebin"===o.id||h(),r=o,n.hasClass(r,"mce-offscreen-selection")||p()})),(e=>{rE(e),Rl(e)&&(e=>{const t=t=>{if(!t.isDefaultPrevented()){const n=t.dataTransfer;n&&(j(n.types,"Files")||n.files.length>0)&&(t.preventDefault(),"drop"===t.type&&oy(e,"Dropped file type is not supported"))}},n=n=>{Qm(e,n.target)&&t(n)},o=()=>{const o=Is.DOM,r=e.dom,s=document,a=e.inline?e.getBody():e.getDoc(),i=["drop","dragover"];$(i,(e=>{o.bind(s,e,n),r.bind(a,e,t)})),e.on("remove",(()=>{$(i,(e=>{o.unbind(s,e,n),r.unbind(a,e,t)}))}))};e.on("init",(()=>{Gm.setEditorTimeout(e,o,0)}))})(e)})(e),(e=>{const t=Ks((()=>{if(!e.removed&&e.getBody().contains(document.activeElement)){const t=e.selection.getRng();if(t.collapsed){const n=aC(e,t,!1);e.selection.setRng(n)}}}),0);e.on("focus",(()=>{t.throttle()})),e.on("blur",(()=>{t.cancel()}))})(e),(e=>{e.on("init",(()=>{e.on("focusin",(t=>{const n=t.target;if(Fo(n)){const t=ip(e.getBody(),n),o=Mo(t)?t:n;e.selection.getNode()!==o&&sC(e,o).each((t=>e.selection.setRng(t)))}}))}))})(e)),{showCaret:c,showBlockCaretContainer:e=>{e.hasAttribute("data-mce-caret")&&(Sr(e),t.scrollIntoView(e))},hideFakeCaret:h,destroy:()=>{s.destroy(),l=null}}},lE=(e,t,n)=>{if(No(t)&&(n<0||n>t.data.length))return[];const o=[n];let r=t;for(;r!==e&&r.parentNode;){const e=r.parentNode;for(let t=0;t<e.childNodes.length;t++)if(e.childNodes[t]===r){o.push(t);break}r=e}return r===e?o.reverse():[]},dE=(e,t,n,o,r)=>({start:lE(e,t,n),end:lE(e,o,r)}),cE=(e,t)=>{const n=t.slice(),o=n.pop();return Y(n,((e,t)=>e.bind((e=>M.from(e.childNodes[t])))),M.some(e)).bind((e=>No(e)&&(o<0||o>e.data.length)?M.none():M.some({node:e,offset:o})))},uE=(e,t)=>cE(e,t.start).bind((({node:n,offset:o})=>cE(e,t.end).map((({node:e,offset:t})=>{const r=document.createRange();return r.setStart(n,o),r.setEnd(e,t),r})))),mE=(e,t,n)=>{if(t&&e.isEmpty(t)&&!n(t)){const o=t.parentNode;e.remove(t),mE(e,o,n)}},fE=(e,t,n,o=!0)=>{const r=t.startContainer.parentNode,s=t.endContainer.parentNode;t.deleteContents(),o&&!n(t.startContainer)&&(No(t.startContainer)&&0===t.startContainer.data.length&&e.remove(t.startContainer),No(t.endContainer)&&0===t.endContainer.data.length&&e.remove(t.endContainer),mE(e,r,n),r!==s&&mE(e,s,n))},gE=(e,t)=>M.from(e.dom.getParent(t.startContainer,e.dom.isBlock)),pE=(e,t,n)=>{((e,t,n)=>{if(No(e)&&0>=e.length)return M.some(qw(e,0));{const t=ca(Ww);return M.from(t.forwards(e,0,Kw(e),n)).map((e=>qw(e.container,0)))}})(t,0,t).each((o=>{const r=o.container;Xw(r,n.start.length,t).each((n=>{const o=e.createRng();o.setStart(r,0),o.setEnd(n.container,n.offset),fE(e,o,(e=>e===t))}))}))},hE=(e,t)=>e.create("span",{"data-mce-type":"bookmark",id:t}),bE=(e,t)=>{const n=e.createRng();return n.setStartAfter(t.start),n.setEndBefore(t.end),n},vE=(e,t,n)=>{const o=uE(e.getRoot(),n).getOrDie("Unable to resolve path range"),r=o.startContainer,s=o.endContainer,a=0===o.endOffset?s:s.splitText(o.endOffset),i=0===o.startOffset?r:r.splitText(o.startOffset);return{prefix:t,end:a.parentNode.insertBefore(hE(e,t+"-end"),a),start:i.parentNode.insertBefore(hE(e,t+"-start"),i)}},yE=(e,t,n)=>{mE(e,e.get(t.prefix+"-end"),n),mE(e,e.get(t.prefix+"-start"),n)},CE=e=>0===e.start.length,xE=(e,t,n,o)=>{const r=t.start;var s;return Qw(e,o.container,o.offset,(s=r,(e,t)=>{const n=e.data.substring(0,t),o=n.lastIndexOf(s.charAt(s.length-1)),r=n.lastIndexOf(s);return-1!==r?r+s.length:-1!==o?o+1:-1}),n).bind((o=>{if(o.offset>=r.length){const t=e.createRng();return t.setStart(o.container,o.offset-r.length),t.setEnd(o.container,o.offset),M.some(t)}{const s=o.offset-r.length;return Yw(o.container,s,n).map((t=>{const n=e.createRng();return n.setStart(t.container,t.offset),n.setEnd(o.container,o.offset),n})).filter((e=>e.toString()===r)).orThunk((()=>xE(e,t,n,qw(o.container,0))))}}))},wE=(e,t,n)=>{const o=e.dom,r=o.getRoot(),s=n.pattern,a=n.position.container,i=n.position.offset;return Yw(a,i-n.pattern.end.length,t).bind((l=>{const d=dE(r,l.container,l.offset,a,i);if(CE(s))return M.some({matches:[{pattern:s,startRng:d,endRng:d}],position:l});{const a=kE(e,n.remainingPatterns,l.container,l.offset,t),i=a.getOr({matches:[],position:l}),c=i.position,u=((e,t,n,o,r,s=!1)=>{if(0===t.start.length&&!s){const t=e.createRng();return t.setStart(n,o),t.setEnd(n,o),M.some(t)}return Gw(n,o,r).bind((n=>xE(e,t,r,n).bind((e=>{if(s){if(e.endContainer===n.container&&e.endOffset===n.offset)return M.none();if(0===n.offset&&e.endContainer.textContent.length===e.endOffset)return M.none()}return M.some(e)}))))})(o,s,c.container,c.offset,t,a.isNone());return u.map((e=>{const t=((e,t)=>dE(e,t.startContainer,t.startOffset,t.endContainer,t.endOffset))(r,e);return{matches:i.matches.concat([{pattern:s,startRng:t,endRng:d}]),position:qw(e.startContainer,e.startOffset)}}))}}))},kE=(e,t,n,o,r)=>{const s=e.dom;return Gw(n,o,s.getRoot()).bind((a=>{const i=s.createRng();i.setStart(r,0),i.setEnd(n,o);const l=i.toString();for(let n=0;n<t.length;n++){const o=t[n];if(!je(l,o.end))continue;const s=t.slice();s.splice(n,1);const i=wE(e,r,{pattern:o,remainingPatterns:s,position:a});if(i.isSome())return i}return M.none()}))},SE=(e,t,n)=>{e.selection.setRng(n),"inline-format"===t.type?$(t.format,(t=>{e.formatter.apply(t)})):e.execCommand(t.cmd,!1,t.value)},_E=(e,t,n)=>{const o=e.selection.getRng();return!1===o.collapsed?[]:gE(e,o).bind((r=>{const s=Math.max(0,o.startOffset-(n?1:0));return kE(e,t,o.startContainer,s,r)})).fold((()=>[]),(e=>e.matches))},EE=(e,t)=>{if(0===t.length)return;const n=e.dom,o=e.selection.getBookmark(),r=((e,t)=>{const n=sa("mce_textpattern"),o=G(t,((t,o)=>{const r=vE(e,n+`_end${t.length}`,o.endRng);return t.concat([{...o,endMarker:r}])}),[]);return G(o,((t,r)=>{const s=o.length-t.length-1,a=CE(r.pattern)?r.endMarker:vE(e,n+`_start${s}`,r.startRng);return t.concat([{...r,startMarker:a}])}),[])})(n,t);$(r,(t=>{const o=n.getParent(t.startMarker.start,n.isBlock),r=e=>e===o;CE(t.pattern)?((e,t,n,o)=>{const r=bE(e.dom,n);fE(e.dom,r,o),SE(e,t,r)})(e,t.pattern,t.endMarker,r):((e,t,n,o,r)=>{const s=e.dom,a=bE(s,o),i=bE(s,n);fE(s,i,r),fE(s,a,r);const l={prefix:n.prefix,start:n.end,end:o.start},d=bE(s,l);SE(e,t,d)})(e,t.pattern,t.startMarker,t.endMarker,r),yE(n,t.endMarker,r),yE(n,t.startMarker,r)})),e.selection.moveToBookmark(o)},NE=(e,t)=>{if(!e.selection.isCollapsed()||!(e=>e.inlinePatterns.length>0||e.blockPatterns.length>0)(t))return!1;const n=_E(e,t.inlinePatterns,!1),o=((e,t)=>{const n=e.dom,o=e.selection.getRng();return gE(e,o).filter((t=>{const o=Ti(e),r=n.is(t,o);return null!==t&&r})).bind((e=>{const o=e.textContent,r=((e,t)=>{const n=t.replace(dr," ");return Q(e,(e=>0===t.indexOf(e.start)||0===n.indexOf(e.start)))})(t,o);return r.map((t=>Bt.trim(o).length===t.start.length?[]:[{pattern:t,range:dE(n.getRoot(),e,0,e,0)}]))})).getOr([])})(e,t.blockPatterns);return(o.length>0||n.length>0)&&(e.undoManager.add(),e.undoManager.extra((()=>{e.execCommand("mceInsertNewLine")}),(()=>{e.insertContent(lr),EE(e,n),((e,t)=>{if(0===t.length)return;const n=e.selection.getBookmark();$(t,(t=>((e,t)=>{const n=e.dom,o=t.pattern,r=uE(n.getRoot(),t.range).getOrDie("Unable to resolve path range");return gE(e,r).each((t=>{"block-format"===o.type?((e,t)=>{const n=t.get(e);return p(n)&&ie(n).exists((e=>we(e,"block")))})(o.format,e.formatter)&&e.undoManager.transact((()=>{pE(e.dom,t,o),e.formatter.apply(o.format)})):"block-command"===o.type&&e.undoManager.transact((()=>{pE(e.dom,t,o),e.execCommand(o.cmd,!1,o.value)}))})),!0})(e,t))),e.selection.moveToBookmark(n)})(e,o);const t=e.selection.getRng(),r=Gw(t.startContainer,t.startOffset,e.dom.getRoot());e.execCommand("mceInsertNewLine"),r.each((t=>{const n=t.container;n.data.charAt(t.offset-1)===lr&&(n.deleteData(t.offset-1,1),mE(e.dom,n.parentNode,(t=>t===e.dom.getRoot())))}))})),!0)},RE=(e,t)=>{if(t.length>0){const n=_E(e,t,!0);n.length>0&&e.undoManager.transact((()=>{EE(e,n)}))}},AE=(e,t,n)=>{for(let o=0;o<e.length;o++)if(n(e[o],t))return!0;return!1},OE=e=>{const t=[",",".",";",":","!","?"],n=[32],o=()=>pi(Xl(e));e.on("keydown",(t=>{var n;13!==t.keyCode||Uu.modifierPressed(t)||NE(e,(n=Xl(e),{inlinePatterns:pi(n),blockPatterns:gi(n)}))&&t.preventDefault()}),!0),e.on("keyup",(t=>{AE(n,t,((e,t)=>e===t.keyCode&&!1===Uu.modifierPressed(t)))&&RE(e,o())})),e.on("keypress",(n=>{AE(t,n,((e,t)=>e.charCodeAt(0)===t.charCode))&&Gm.setEditorTimeout(e,(()=>{RE(e,o())}))}))},TE=e=>{const t=Bt.each,n=Uu.BACKSPACE,o=Uu.DELETE,r=e.dom,s=e.selection,a=e.parser,i=Nt.browser,l=i.isFirefox(),d=i.isChromium()||i.isSafari(),c=Nt.deviceType.isiPhone()||Nt.deviceType.isiPad(),u=Nt.os.isMacOS()||Nt.os.isiOS(),m=(t,n)=>{try{e.getDoc().execCommand(t,!1,n)}catch(e){}},f=e=>e.isDefaultPrevented(),g=()=>{e.shortcuts.add("meta+a",null,"SelectAll")},p=()=>{e.inline||r.bind(e.getDoc(),"mousedown mouseup",(t=>{let n;if(t.target===e.getDoc().documentElement)if(n=s.getRng(),e.getBody().focus(),"mousedown"===t.type){if(vr(n.startContainer))return;s.placeCaretAt(t.clientX,t.clientY)}else s.setRng(n)}))},h=()=>{Range.prototype.getClientRects||e.on("mousedown",(t=>{if(!f(t)&&"HTML"===t.target.nodeName){const t=e.getBody();t.blur(),Gm.setEditorTimeout(e,(()=>{t.focus()}))}}))},b=()=>{const t=Tl(e);e.on("click",(n=>{const o=n.target;/^(IMG|HR)$/.test(o.nodeName)&&"false"!==r.getContentEditableParent(o)&&(n.preventDefault(),e.selection.select(o),e.nodeChanged()),"A"===o.nodeName&&r.hasClass(o,t)&&0===o.childNodes.length&&(n.preventDefault(),s.select(o))}))},v=()=>{e.on("keydown",(e=>{if(!f(e)&&e.keyCode===n&&s.isCollapsed()&&0===s.getRng().startOffset){const t=s.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}}))},y=()=>{Sl(e)||e.on("BeforeExecCommand mousedown",(()=>{m("StyleWithCSS",!1),m("enableInlineTableEditing",!1),ol(e)||m("enableObjectResizing",!1)}))},C=()=>{e.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")},x=()=>{e.inline||e.on("keydown",(()=>{document.activeElement===document.body&&e.getWin().focus()}))},w=()=>{e.inline||(e.contentStyles.push("body {min-height: 150px}"),e.on("click",(t=>{let n;"HTML"===t.target.nodeName&&(n=e.selection.getRng(),e.getBody().focus(),e.selection.setRng(n),e.selection.normalize(),e.nodeChanged())})))},k=()=>{u&&e.on("keydown",(t=>{!Uu.metaKeyPressed(t)||t.shiftKey||37!==t.keyCode&&39!==t.keyCode||(t.preventDefault(),e.selection.getSel().modify("move",37===t.keyCode?"backward":"forward","lineboundary"))}))},_=()=>{e.on("click",(e=>{let t=e.target;do{if("A"===t.tagName)return void e.preventDefault()}while(t=t.parentNode)})),e.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")},E=()=>{e.on("init",(()=>{e.dom.bind(e.getBody(),"submit",(e=>{e.preventDefault()}))}))},N=S;return _v(e)?(d&&(p(),b(),E(),g(),c&&(x(),w(),_())),l&&(h(),y(),C(),k())):(e.on("keydown",(t=>{let n,o;if(f(t)||t.keyCode!==Uu.BACKSPACE)return;n=s.getRng();const a=n.startContainer,i=n.startOffset,l=r.getRoot();if(o=a,n.collapsed&&0===i){for(;o&&o.parentNode&&o.parentNode.firstChild===o&&o.parentNode!==l;)o=o.parentNode;"BLOCKQUOTE"===o.tagName&&(e.formatter.toggle("blockquote",null,o),n=r.createRng(),n.setStart(a,0),n.setEnd(a,0),s.setRng(n))}})),(()=>{const t=e=>{const t=r.create("body"),n=e.cloneContents();return t.appendChild(n),s.serializer.serialize(t,{format:"html"})};e.on("keydown",(s=>{const a=s.keyCode;let i,l;if(!f(s)&&(a===o||a===n)){if(i=e.selection.isCollapsed(),l=e.getBody(),i&&!r.isEmpty(l))return;if(!i&&!(n=>{const o=t(n),s=r.createRng();return s.selectNode(e.getBody()),o===t(s)})(e.selection.getRng()))return;s.preventDefault(),e.setContent(""),l.firstChild&&r.isBlock(l.firstChild)?e.selection.setCursorLocation(l.firstChild,0):e.selection.setCursorLocation(l,0),e.nodeChanged()}}))})(),Nt.windowsPhone||e.on("keyup focusin mouseup",(e=>{Uu.modifierPressed(e)||s.normalize()}),!0),d&&(p(),b(),e.on("init",(()=>{m("DefaultParagraphSeparator",Ti(e))})),E(),v(),a.addNodeFilter("br",(e=>{let t=e.length;for(;t--;)"Apple-interchange-newline"===e[t].attr("class")&&e[t].remove()})),c?(x(),w(),_()):g()),l&&(e.on("keydown",(t=>{if(!f(t)&&t.keyCode===n){if(!e.getBody().getElementsByTagName("hr").length)return;if(s.isCollapsed()&&0===s.getRng().startOffset){const e=s.getNode(),n=e.previousSibling;if("HR"===e.nodeName)return r.remove(e),void t.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(r.remove(n),t.preventDefault())}}})),h(),(()=>{const n=()=>{const n=r.getAttribs(s.getStart().cloneNode(!1));return()=>{const o=s.getStart();o!==e.getBody()&&(r.setAttrib(o,"style",null),t(n,(e=>{o.setAttributeNode(e.cloneNode(!0))})))}},o=()=>!s.isCollapsed()&&r.getParent(s.getStart(),r.isBlock)!==r.getParent(s.getEnd(),r.isBlock);e.on("keypress",(t=>{let r;if(!f(t)&&(8===t.keyCode||46===t.keyCode)&&o())return r=n(),e.getDoc().execCommand("delete",!1,null),r(),t.preventDefault(),!1})),r.bind(e.getDoc(),"cut",(t=>{let r;!f(t)&&o()&&(r=n(),Gm.setEditorTimeout(e,(()=>{r()})))}))})(),y(),e.on("SetContent ExecCommand",(e=>{"setcontent"!==e.type&&"mceInsertLink"!==e.command||t(r.select("a"),(e=>{let t=e.parentNode;const n=r.getRoot();if(t.lastChild===e){for(;t&&!r.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}r.add(t,"br",{"data-mce-bogus":1})}}))})),C(),k(),v())),{refreshContentEditable:N,isHidden:()=>{if(!l||e.removed)return!1;const t=e.selection.getSel();return!t||!t.rangeCount||0===t.rangeCount}}},BE=Is.DOM,DE=e=>e.inline?e.getElement().nodeName.toLowerCase():void 0,LE=e=>ve(e,(e=>!1===v(e))),PE=e=>{const t=e.options.get,n=e.editorUpload.blobCache;return LE({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"),preserve_cdata:t("preserve_cdata"),remove_trailing_brs:t("remove_trailing_brs"),inline_styles:t("inline_styles"),root_name:DE(e),validate:!0,blob_cache:n,document:e.getDoc()})},ME=e=>{const t=e.options.get;return LE({custom_elements:t("custom_elements"),extended_valid_elements:t("extended_valid_elements"),invalid_elements:t("invalid_elements"),invalid_styles:t("invalid_styles"),schema:t("schema"),valid_children:t("valid_children"),valid_classes:t("valid_classes"),valid_elements:t("valid_elements"),valid_styles:t("valid_styles"),verify_html:t("verify_html")})},IE=e=>e.inline?e.ui.styleSheetLoader:e.dom.styleSheetLoader,FE=e=>{const t=IE(e),n=el(e),o=e.contentCSS,r=()=>{t.unloadAll(o),e.inline||e.ui.styleSheetLoader.unloadAll(n)},s=()=>{e.removed?r():e.on("remove",r)};if(e.contentStyles.length>0){let t="";Bt.each(e.contentStyles,(e=>{t+=e+"\r\n"})),e.dom.addStyle(t)}const a=Promise.all(((e,t,n)=>{const o=[IE(e).loadAll(t)];return e.inline?o:o.concat([e.ui.styleSheetLoader.loadAll(n)])})(e,o,n)).then(s).catch(s),i=Zi(e);return i&&((e,t)=>{const n=mn(e.getBody()),o=Mn(Pn(n)),r=cn("style");$t(r,"type","text/css"),Jn(r,un(t)),Jn(o,r),e.on("remove",(()=>{to(r)}))})(e,i),a},UE=e=>{!0!==e.removed&&((e=>{_v(e)||e.load({initial:!0,format:"html"}),e.startContent=e.getContent({format:"raw"})})(e),(e=>{e.bindPendingEventDelegates(),e.initialized=!0,(e=>{e.dispatch("Init")})(e),e.focus(!0),(e=>{const t=e.dom.getRoot();e.inline||wu(e)&&e.selection.getStart(!0)!==t||uc(t).each((t=>{const n=t.getNode(),o=So(n)?uc(n).getOr(t):t;e.selection.setRng(o.toRange())}))})(e),e.nodeChanged({initial:!0});const t=Ll(e);x(t)&&t.call(e,e),(e=>{const t=Ml(e);t&&Gm.setEditorTimeout(e,(()=>{let n;n=!0===t?e:e.editorManager.get(t),n.destroyed||n.focus()}),100)})(e)})(e))},zE=e=>{const t=e.getElement();let n=e.getDoc();e.inline&&(BE.addClass(t,"mce-content-body"),e.contentDocument=n=document,e.contentWindow=window,e.bodyElement=t,e.contentAreaContainer=t);const o=e.getBody();o.disabled=!0,e.readonly=Sl(e),e.readonly||(e.inline&&"static"===BE.getStyle(o,"position",!0)&&(o.style.position="relative"),o.contentEditable="true"),o.disabled=!1,e.editorUpload=gy(e),e.schema=vs(ME(e)),e.dom=Is(n,{keep_values:!0,url_converter:e.convertURL,url_converter_scope:e,update_styles:!0,root_element:e.inline?e.getBody():null,collect:()=>e.inline,schema:e.schema,contentCssCors:Wi(e),referrerPolicy:Ki(e),onSetAttrib:t=>{e.dispatch("SetAttrib",t)}}),e.parser=(e=>{const t=Wb(PE(e),e.schema);return t.addAttributeFilter("src,href,style,tabindex",((t,n)=>{let o,r,s=t.length;const a=e.dom,i="data-mce-"+n;for(;s--;)if(o=t[s],r=o.attr(n),r&&!o.attr(i)){if(0===r.indexOf("data:")||0===r.indexOf("blob:"))continue;"style"===n?(r=a.serializeStyle(a.parseStyle(r),o.name),r.length||(r=null),o.attr(i,r),o.attr(n,r)):"tabindex"===n?(o.attr(i,r),o.attr(n,null)):o.attr(i,e.convertURL(r,n,o.name))}})),t.addNodeFilter("script",(e=>{let t=e.length;for(;t--;){const n=e[t],o=n.attr("type")||"no/type";0!==o.indexOf("mce-")&&n.attr("type","mce-"+o)}})),e.options.get("preserve_cdata")&&t.addNodeFilter("#cdata",(t=>{let n=t.length;for(;n--;){const o=t[n];o.type=8,o.name="#comment",o.value="[CDATA["+e.dom.encode(o.value)+"]]"}})),t.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",(t=>{let n=t.length;const o=e.schema.getNonEmptyElements();for(;n--;){const e=t[n];e.isEmpty(o)&&0===e.getAll("br").length&&e.append(new yf("br",1))}})),t})(e),e.serializer=Mv((e=>{const t=e.options.get;return{...PE(e),...ME(e),...LE({url_converter:t("url_converter"),url_converter_scope:t("url_converter_scope"),element_format:t("element_format"),entities:t("entities"),entity_encoding:t("entity_encoding"),indent:t("indent"),indent_after:t("indent_after"),indent_before:t("indent_before")})}})(e),e),e.selection=Dv(e.dom,e.getWin(),e.serializer,e),e.annotator=Ou(e),e.formatter=Sy(e),e.undoManager=Ey(e),e._nodeChangeDispatcher=new l_(e),e._selectionOverrides=iE(e),(e=>{const t=Ws(),n=zs(!1),o=Gs((t=>{e.dispatch("longpress",{...t,type:"longpress"}),n.set(!0)}),400);e.on("touchstart",(e=>{Xx(e).each((r=>{o.cancel();const s={x:r.clientX,y:r.clientY,target:e.target};o.throttle(e),n.set(!1),t.set(s)}))}),!0),e.on("touchmove",(r=>{o.cancel(),Xx(r).each((o=>{t.on((r=>{((e,t)=>{const n=Math.abs(e.clientX-t.x),o=Math.abs(e.clientY-t.y);return n>5||o>5})(o,r)&&(t.clear(),n.set(!1),e.dispatch("longpresscancel"))}))}))}),!0),e.on("touchend touchcancel",(r=>{o.cancel(),"touchcancel"!==r.type&&t.get().filter((e=>e.target.isEqualNode(r.target))).each((()=>{n.get()?r.preventDefault():e.dispatch("tap",{...r,type:"tap"})}))}),!0)})(e),(e=>{(e=>{e.on("click",(t=>{e.dom.getParent(t.target,"details")&&t.preventDefault()}))})(e),(e=>{e.parser.addNodeFilter("details",(e=>{$(e,(e=>{e.attr("data-mce-open",e.attr("open")),e.attr("open","open")}))})),e.serializer.addNodeFilter("details",(e=>{$(e,(e=>{const t=e.attr("data-mce-open");e.attr("open",m(t)?t:null),e.attr("data-mce-open",null)}))}))})(e)})(e),(e=>{const t="contenteditable",n=" "+Bt.trim(Jl(e))+" ",o=" "+Bt.trim(Ql(e))+" ",r=tw(n),s=tw(o),a=Zl(e);a.length>0&&e.on("BeforeSetContent",(t=>{((e,t,n)=>{let o=t.length,r=n.content;if("raw"!==n.format){for(;o--;)r=r.replace(t[o],nw(e,r,Ql(e)));n.content=r}})(e,a,t)})),e.parser.addAttributeFilter("class",(e=>{let n=e.length;for(;n--;){const o=e[n];r(o)?o.attr(t,"true"):s(o)&&o.attr(t,"false")}})),e.serializer.addAttributeFilter(t,(e=>{let n=e.length;for(;n--;){const o=e[n];(r(o)||s(o))&&(a.length>0&&o.attr("data-mce-content")?(o.name="#text",o.type=3,o.raw=!0,o.value=o.attr("data-mce-content")):o.attr(t,null))}}))})(e),_v(e)||((e=>{e.on("click",(t=>{t.detail>=3&&(e=>{const t=e.selection.getRng(),n=Ua.fromRangeStart(t),o=Ua.fromRangeEnd(t);if(Ua.isElementPosition(n)){const e=n.container();$_(e)&&uc(e).each((e=>t.setStart(e.container(),e.offset())))}if(Ua.isElementPosition(o)){const e=n.container();$_(e)&&mc(e).each((e=>t.setEnd(e.container(),e.offset())))}e.selection.setRng(bp(t))})(e)}))})(e),(e=>{OE(e)})(e));const r=i_(e);Yx(e,r),(e=>{e.on("NodeChange",O(ew,e))})(e),(e=>{const t=e.dom,n=Ti(e),o=sl(e),r=(s,a)=>{if((e=>{if(Ay(e)){const t=e.keyCode;return!Oy(e)&&(Uu.metaKeyPressed(e)||e.altKey||t>=112&&t<=123||j(Ny,t))}return!1})(s))return;const i=e.getBody(),l=!(e=>Ay(e)&&!(Oy(e)||"keyup"===e.type&&229===e.keyCode))(s)&&((e,t,n)=>{if(qr(mn(t),!1)){const o=t.firstElementChild;return!o||!e.getStyle(t.firstElementChild,"padding-left")&&!e.getStyle(t.firstElementChild,"padding-right")&&n===o.nodeName.toLowerCase()}return!1})(t,i,n);(""!==t.getAttrib(i,Ry)!==l||a)&&(t.setAttrib(i,Ry,l?o:null),t.setAttrib(i,"aria-placeholder",l?o:null),((e,t)=>{e.dispatch("PlaceholderToggle",{state:t})})(e,l),e.on(l?"keydown":"keyup",r),e.off(l?"keyup":"keydown",r))};o&&e.on("init",(t=>{r(t,!0),e.on("change SetContent ExecCommand",r),e.on("paste",(t=>Gm.setEditorTimeout(e,(()=>r(t)))))}))})(e),H_(e);const s=(e=>{const t=e;return(e=>xe(e.plugins,"rtc").bind((e=>M.from(e.setup))))(e).fold((()=>(t.rtcInstance=Sv(e),M.none())),(e=>(t.rtcInstance=(()=>{const e=N(null),t=N("");return{init:{bindEvents:S},undoManager:{beforeChange:S,add:e,undo:e,redo:e,clear:S,reset:S,hasUndo:L,hasRedo:L,transact:e,ignore:S,extra:S},formatter:{match:L,matchAll:N([]),matchNode:N(void 0),canApply:L,closest:t,apply:S,remove:S,toggle:S,formatChanged:N({unbind:S})},editor:{getContent:t,setContent:N({content:"",html:""}),insertContent:N(""),addVisual:S},selection:{getContent:t},autocompleter:{addDecoration:S,removeDecoration:S},raw:{getModel:N(M.none())}}})(),M.some((()=>e().then((e=>(t.rtcInstance=(e=>{const t=e=>f(e)?e:{},{init:n,undoManager:o,formatter:r,editor:s,selection:a,autocompleter:i,raw:l}=e;return{init:{bindEvents:n.bindEvents},undoManager:{beforeChange:o.beforeChange,add:o.add,undo:o.undo,redo:o.redo,clear:o.clear,reset:o.reset,hasUndo:o.hasUndo,hasRedo:o.hasRedo,transact:(e,t,n)=>o.transact(n),ignore:(e,t)=>o.ignore(t),extra:(e,t,n,r)=>o.extra(n,r)},formatter:{match:(e,n,o,s)=>r.match(e,t(n),s),matchAll:r.matchAll,matchNode:r.matchNode,canApply:e=>r.canApply(e),closest:e=>r.closest(e),apply:(e,n,o)=>r.apply(e,t(n)),remove:(e,n,o,s)=>r.remove(e,t(n)),toggle:(e,n,o)=>r.toggle(e,t(n)),formatChanged:(e,t,n,o,s)=>r.formatChanged(t,n,o,s)},editor:{getContent:e=>s.getContent(e),setContent:(e,t)=>({content:s.setContent(e,t),html:""}),insertContent:(e,t)=>(s.insertContent(e),""),addVisual:s.addVisual},selection:{getContent:(e,t)=>a.getContent(t)},autocompleter:{addDecoration:i.addDecoration,removeDecoration:i.removeDecoration},raw:{getModel:()=>M.some(l.getRawModel())}}})(e),e.rtc.isRemote))))))))})(e);(e=>{const t=e.getDoc(),n=e.getBody();(e=>{e.dispatch("PreInit")})(e),Il(e)||(t.body.spellcheck=!1,BE.setAttrib(n,"spellcheck","false")),e.quirks=TE(e),(e=>{e.dispatch("PostRender")})(e);const o=tl(e);void 0!==o&&(n.dir=o);const r=Fl(e);r&&e.on("BeforeSetContent",(e=>{Bt.each(r,(t=>{e.content=e.content.replace(t,(e=>"\x3c!--mce:protected "+escape(e)+"--\x3e"))}))})),e.on("SetContent",(()=>{e.addVisual(e.getBody())})),e.on("compositionstart compositionend",(t=>{e.composing="compositionstart"===t.type}))})(e),s.fold((()=>{FE(e).then((()=>UE(e)))}),(t=>{e.setProgressState(!0),FE(e).then((()=>{t().then((t=>{e.setProgressState(!1),UE(e),Rv(e)}),(t=>{e.notificationManager.open({type:"error",text:String(t)}),UE(e),Rv(e)}))}))}))},jE=(e,t)=>{if(e.inline||(e.getElement().style.visibility=e.orgVisibility),t||e.inline)zE(e);else{const t=e.iframeElement,o=(n=mn(t),so(n,"load",ly,(()=>{o.unbind(),e.contentDocument=t.contentDocument,zE(e)})));t.srcdoc=e.iframeHTML}var n},VE=Is.DOM,HE=Is.DOM,$E=e=>({editorContainer:e,iframeContainer:e,api:{}}),qE=e=>{const t=e.getElement();return e.orgDisplay=t.style.display,m(ll(e))?(e=>e.theme.renderUI())(e):x(ll(e))?(e=>{const t=e.getElement(),n=ll(e)(e,t);return n.editorContainer.nodeType&&(n.editorContainer.id=n.editorContainer.id||e.id+"_parent"),n.iframeContainer&&n.iframeContainer.nodeType&&(n.iframeContainer.id=n.iframeContainer.id||e.id+"_iframecontainer"),n.height=n.iframeHeight?n.iframeHeight:t.offsetHeight,n})(e):(e=>{const t=e.getElement();return e.inline?$E(null):(e=>{const t=HE.create("div");return HE.insertAfter(t,e),$E(t)})(t)})(e)},WE=e=>{e.dispatch("ScriptsLoaded"),(e=>{const t=Bt.trim(zi(e)),n=e.ui.registry.getAll().icons,o={...$v.get("default").icons,...$v.get(t).icons};fe(o,((t,o)=>{we(n,o)||e.ui.registry.addIcon(o,t)}))})(e),(e=>{const t=ll(e);if(m(t)){const n=ey.get(t);e.theme=n(e,ey.urls[t])||{},x(e.theme.init)&&e.theme.init(e,ey.urls[t]||e.documentBaseUrl.replace(/\/$/,""))}else e.theme={}})(e),(e=>{const t=cl(e),n=qv.get(t);e.model=n(e,qv.urls[t])})(e),(e=>{const t=[];$(El(e),(n=>{((e,t,n)=>{const o=Zv.get(n),r=Zv.urls[n]||e.documentBaseUrl.replace(/\/$/,"");if(n=Bt.trim(n),o&&-1===Bt.inArray(t,n)){if(e.plugins[n])return;try{const s=o(e,r)||{};e.plugins[n]=s,x(s.init)&&(s.init(e,r),t.push(n))}catch(t){((e,t,n)=>{const o=$s.translate(["Failed to initialize plugin: {0}",t]);Du(e,"PluginLoadError",{message:o}),ay(o,n),oy(e,o)})(e,n,t)}}})(e,t,(e=>e.replace(/^\-/,""))(n))}))})(e);const t=qE(e);((e,t)=>{const n={show:M.from(t.show).getOr(S),hide:M.from(t.hide).getOr(S),isEnabled:M.from(t.isEnabled).getOr(P),setEnabled:n=>{e.mode.isReadOnly()||M.from(t.setEnabled).each((e=>e(n)))}};e.ui={...e.ui,...n}})(e,M.from(t.api).getOr({}));const n={editorContainer:t.editorContainer,iframeContainer:t.iframeContainer};return e.editorContainer=n.editorContainer?n.editorContainer:null,(e=>{e.contentCSS=e.contentCSS.concat((e=>iy(e,Ji(e)))(e),(e=>iy(e,el(e)))(e))})(e),e.inline?jE(e):((e,t)=>{((e,t)=>{const n=e.translate("Rich Text Area"),o=Kt(mn(e.getElement()),"tabindex").bind(Ge),r=((e,t,n,o)=>{const r=cn("iframe");return o.each((e=>$t(r,"tabindex",e))),qt(r,n),qt(r,{id:e+"_ifr",frameBorder:"0",allowTransparency:"true",title:t}),nn(r,"tox-edit-area__iframe"),r})(e.id,n,Si(e),o).dom;r.onload=()=>{r.onload=null,e.dispatch("load")},e.contentAreaContainer=t.iframeContainer,e.iframeElement=r,e.iframeHTML=(e=>{let t=_i(e)+"<html><head>";Ei(e)!==e.documentBaseUrl&&(t+='<base href="'+e.documentBaseURI.getURI()+'" />'),t+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';const n=Ni(e),o=Ri(e),r=e.translate(Bl(e));return Ai(e)&&(t+='<meta http-equiv="Content-Security-Policy" content="'+Ai(e)+'" />'),t+=`</head><body id="${n}" class="mce-content-body ${o}" data-id="${e.id}" aria-label="${r}"><br></body></html>`,t})(e),VE.add(t.iframeContainer,r)})(e,t),t.editorContainer&&(VE.get(t.editorContainer).style.display=e.orgDisplay,e.hidden=VE.isHidden(t.editorContainer)),e.getElement().style.display="none",VE.setAttrib(e.id,"aria-hidden","true"),jE(e)})(e,n)},KE=Is.DOM,GE=e=>"-"===e.charAt(0),YE=(e,t,n)=>M.from(t).filter((e=>We(e)&&!$v.has(e))).map((t=>({url:`${e.editorManager.baseURL}/icons/${t}/icons${n}.js`,name:M.some(t)}))),XE=(e,t)=>{const n=Us.ScriptLoader,o=()=>{!e.removed&&(e=>{const t=ll(e);return!m(t)||C(ey.get(t))})(e)&&(e=>{const t=cl(e);return C(qv.get(t))})(e)&&WE(e)};((e,t)=>{const n=ll(e);if(m(n)&&!GE(n)&&!we(ey.urls,n)){const o=dl(e),r=o?e.documentBaseURI.toAbsolute(o):`themes/${n}/theme${t}.js`;ey.load(n,r).catch((()=>{((e,t,n)=>{ry(e,"ThemeLoadError",sy("theme",t,n))})(e,r,n)}))}})(e,t),((e,t)=>{const n=cl(e);if("plugin"!==n&&!we(qv.urls,n)){const o=ul(e),r=m(o)?e.documentBaseURI.toAbsolute(o):`models/${n}/model${t}.js`;qv.load(n,r).catch((()=>{((e,t,n)=>{ry(e,"ModelLoadError",sy("model",t,n))})(e,r,n)}))}})(e,t),((e,t)=>{const n=Gi(t),o=Yi(t);if(!1===$s.hasCode(n)&&"en"!==n){const r=We(o)?o:`${t.editorManager.baseURL}/langs/${n}.js`;e.add(r).catch((()=>{((e,t,n)=>{ry(e,"LanguageLoadError",sy("language",t,n))})(t,r,n)}))}})(n,e),((e,t,n)=>{const o=YE(t,"default",n),r=(e=>M.from(ji(e)).filter(We).map((e=>({url:e,name:M.none()}))))(t).orThunk((()=>YE(t,zi(t),"")));$((e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t<e.length;t++)e[t].each(n);return t})([o,r]),(n=>{e.add(n.url).catch((()=>{((e,t,n)=>{ry(e,"IconsLoadError",sy("icons",t,n))})(t,n.url,n.name.getOrUndefined())}))}))})(n,e,t),((e,t)=>{const n=(t,n)=>{Zv.load(t,n).catch((()=>{((e,t,n)=>{ry(e,"PluginLoadError",sy("plugin",t,n))})(e,n,t)}))};fe(Nl(e),((t,o)=>{n(o,t),e.options.set("plugins",El(e).concat(o))})),$(El(e),(e=>{!(e=Bt.trim(e))||Zv.urls[e]||GE(e)||n(e,`plugins/${e}/plugin${t}.js`)}))})(e,t),n.loadQueue().then(o,o)},QE=Ct().deviceType,JE=QE.isPhone(),ZE=QE.isTablet(),eN=e=>{if(y(e))return[];{const t=p(e)?e:e.split(/[ ,]/),n=H(t,He);return K(n,We)}},tN=(e,t)=>{const n=((t,n)=>{const o={},r={};return be(t,((t,n)=>j(e,n)),he(o),he(r)),{t:o,f:r}})(t);return o=n.t,r=n.f,{sections:N(o),options:N(r)};var o,r},nN=(e,t)=>we(e.sections(),t),oN=(e,t)=>({table_grid:!1,object_resizing:!1,resize:!1,toolbar_mode:xe(e,"toolbar_mode").getOr("scrolling"),toolbar_sticky:!1,...t?{menubar:!1}:{}}),rN=(e,t)=>{var n;const o=null!==(n=t.external_plugins)&&void 0!==n?n:{};return e&&e.external_plugins?Bt.extend({},e.external_plugins,o):o},sN=(e,t,n,o,r)=>{var s;const a=e?{mobile:oN(null!==(s=r.mobile)&&void 0!==s?s:{},t)}:{},i=tN(["mobile"],gk(a,r)),l=Bt.extend(n,o,i.options(),((e,t)=>e&&nN(t,"mobile"))(e,i)?((e,t,n={})=>{const o=e.sections(),r=xe(o,t).getOr({});return Bt.extend({},n,r)})(i,"mobile"):{},{external_plugins:rN(o,i.options())});return((e,t,n,o)=>{const r=eN(n.forced_plugins),s=eN(o.plugins),a=((e,t)=>nN(e,t)?e.sections()[t]:{})(t,"mobile"),i=((e,t,n,o)=>e&&nN(t,"mobile")?o:n)(e,t,s,a.plugins?eN(a.plugins):s),l=((e,t)=>[].concat(eN(e)).concat(eN(t)))(r,i);return Bt.extend(o,{forced_plugins:r,plugins:l})})(e,i,o,l)},aN=e=>{(e=>{const t=t=>()=>{$("left,center,right,justify".split(","),(n=>{t!==n&&e.formatter.remove("align"+n)})),"none"!==t&&((t,n)=>{e.formatter.toggle(t,void 0),e.nodeChanged()})("align"+t)};e.editorCommands.addCommands({JustifyLeft:t("left"),JustifyCenter:t("center"),JustifyRight:t("right"),JustifyFull:t("justify"),JustifyNone:t("none")})})(e),(e=>{const t=t=>()=>{const n=e.selection,o=n.isCollapsed()?[e.dom.getParent(n.getNode(),e.dom.isBlock)]:n.getSelectedBlocks();return V(o,(n=>C(e.formatter.matchNode(n,t))))};e.editorCommands.addCommands({JustifyLeft:t("alignleft"),JustifyCenter:t("aligncenter"),JustifyRight:t("alignright"),JustifyFull:t("alignjustify")},"state")})(e)},iN=(e,t)=>{const n=e.selection,o=e.dom;return/^ | $/.test(t)?((e,t,n)=>{const o=mn(e.getRoot());return n=bg(o,Ua.fromRangeStart(t))?n.replace(/^ /,"&nbsp;"):n.replace(/^&nbsp;/," "),vg(o,Ua.fromRangeEnd(t))?n.replace(/(&nbsp;| )(<br( \/)>)?$/,"&nbsp;"):n.replace(/&nbsp;(<br( \/)?>)?$/," ")})(o,n.getRng(),t):t},lN=(e,t)=>{const{content:n,details:o}=(e=>{if("string"!=typeof e){const t=Bt.extend({paste:e.paste,data:{paste:e.paste}},e);return{content:e.content,details:t}}return{content:e,details:{}}})(t);Xb(e,{content:iN(e,n),format:"html",set:!1,selection:!0,paste:o.paste}).each((t=>{const n=((e,t,n)=>Ev(e).editor.insertContent(t,n))(e,t.content,o);Qb(e,n,t),e.addVisual()}))},dN={"font-size":"size","font-family":"face"},cN=e=>(t,n)=>M.from(n).map(mn).filter(Ut).bind((n=>((e,t,n)=>Ap(mn(n),(t=>(t=>Wn(t,e).orThunk((()=>"font"===Mt(t)?xe(dN,e).bind((e=>Kt(t,e))):M.none())))(t)),(e=>bn(mn(t),e))))(e,t,n.dom).or(((e,t)=>M.from(Is.DOM.getStyle(t,e,!0)))(e,n.dom)))).getOr(""),uN=cN("font-size"),mN=_((e=>e.replace(/[\'\"\\]/g,"").replace(/,\s+/g,",")),cN("font-family")),fN=e=>uc(e.getBody()).map((e=>{const t=e.container();return No(t)?t.parentNode:t})),gN=(e,t)=>((e,t)=>(e=>M.from(e.selection.getRng()).bind((t=>{const n=e.getBody();return t.startContainer===n&&0===t.startOffset?M.none():M.from(e.selection.getStart(!0))})))(e).orThunk(O(fN,e)).map(mn).filter(Ut).bind(t))(e,E(M.some,t)),pN=(e,t)=>{if(/^[0-9.]+$/.test(t)){const n=parseInt(t,10);if(n>=1&&n<=7){const o=(e=>Bt.explode(e.options.get("font_size_style_values")))(e),r=(e=>Bt.explode(e.options.get("font_size_classes")))(e);return r?r[n-1]||t:o[n-1]||t}return t}return t},hN=e=>{const t=e.split(/\s*,\s*/);return H(t,(e=>-1===e.indexOf(" ")||ze(e,'"')||ze(e,"'")?e:`'${e}'`)).join(",")},bN=e=>{aN(e),(e=>{e.editorCommands.addCommands({"Cut,Copy,Paste":t=>{const n=e.getDoc();let o;try{n.execCommand(t)}catch(e){o=!0}if("paste"!==t||n.queryCommandEnabled(t)||(o=!0),o||!n.queryCommandSupported(t)){let t=e.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");(Nt.os.isMacOS()||Nt.os.isiOS())&&(t=t.replace(/Ctrl\+/g,"\u2318+")),e.notificationManager.open({text:t,type:"error"})}}})})(e),(e=>{e.editorCommands.addCommands({mceAddUndoLevel:()=>{e.undoManager.add()},mceEndUndoLevel:()=>{e.undoManager.add()},Undo:()=>{e.undoManager.undo()},Redo:()=>{e.undoManager.redo()}})})(e),(e=>{e.editorCommands.addCommands({mceSelectNodeDepth:(t,n,o)=>{let r=0;e.dom.getParent(e.selection.getNode(),(t=>{if(1===t.nodeType&&r++===o)return e.selection.select(t),!1}),e.getBody())},mceSelectNode:(t,n,o)=>{e.selection.select(o)},selectAll:()=>{const t=e.dom.getParent(e.selection.getStart(),Po);if(t){const n=e.dom.createRng();n.selectNodeContents(t),e.selection.setRng(n)}}})})(e),(e=>{e.editorCommands.addCommands({mceCleanup:()=>{const t=e.selection.getBookmark();e.setContent(e.getContent()),e.selection.moveToBookmark(t)},insertImage:(t,n,o)=>{lN(e,e.dom.createHTML("img",{src:o}))},insertHorizontalRule:()=>{e.execCommand("mceInsertContent",!1,"<hr>")},insertText:(t,n,o)=>{lN(e,e.dom.encode(o))},insertHTML:(t,n,o)=>{lN(e,o)},mceInsertContent:(t,n,o)=>{lN(e,o)},mceSetContent:(t,n,o)=>{e.setContent(o)},mceReplaceContent:(t,n,o)=>{e.execCommand("mceInsertContent",!1,o.replace(/\{\$selection\}/g,e.selection.getContent({format:"text"})))},mceNewDocument:()=>{e.setContent("")}})})(e),(e=>{const t=(t,n,o)=>{const r=m(o)?{href:o}:o,s=e.dom.getParent(e.selection.getNode(),"a");f(r)&&m(r.href)&&(r.href=r.href.replace(/ /g,"%20"),s&&r.href||e.formatter.remove("link"),r.href&&e.formatter.apply("link",r,s))};e.editorCommands.addCommands({unlink:()=>{if(e.selection.isCollapsed()){const t=e.dom.getParent(e.selection.getStart(),"a");t&&e.dom.remove(t,!0)}else e.formatter.remove("link")},mceInsertLink:t,createLink:t})})(e),(e=>{e.editorCommands.addCommands({Indent:()=>{(e=>{qx(e,"indent")})(e)},Outdent:()=>{Wx(e)}}),e.editorCommands.addCommands({Outdent:()=>Vx(e)},"state")})(e),(e=>{e.editorCommands.addCommands({insertParagraph:()=>{XS(e)},mceInsertNewLine:(t,n,o)=>{XS(e,o)},InsertLineBreak:(t,n,o)=>{FS(e,o)}})})(e),(e=>{(e=>{e.editorCommands.addCommands({"InsertUnorderedList,InsertOrderedList":t=>{e.getDoc().execCommand(t);const n=e.dom.getParent(e.selection.getNode(),"ol,ul");if(n){const t=n.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(t.nodeName)){const o=e.selection.getBookmark();e.dom.split(t,n),e.selection.moveToBookmark(o)}}}})})(e),(e=>{e.editorCommands.addCommands({"InsertUnorderedList,InsertOrderedList":t=>{const n=e.dom.getParent(e.selection.getNode(),"ul,ol");return n&&("insertunorderedlist"===t&&"UL"===n.tagName||"insertorderedlist"===t&&"OL"===n.tagName)}},"state")})(e)})(e),(e=>{(e=>{const t=(t,n)=>{e.formatter.toggle(t,n),e.nodeChanged()};e.editorCommands.addCommands({"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":e=>{t(e)},"ForeColor,HiliteColor":(e,n,o)=>{t(e,{value:o})},BackColor:(e,n,o)=>{t("hilitecolor",{value:o})},FontName:(t,n,o)=>{((e,t)=>{const n=pN(e,t);e.formatter.toggle("fontname",{value:hN(n)}),e.nodeChanged()})(e,o)},FontSize:(t,n,o)=>{((e,t)=>{e.formatter.toggle("fontsize",{value:pN(e,t)}),e.nodeChanged()})(e,o)},LineHeight:(t,n,o)=>{((e,t)=>{e.formatter.toggle("lineheight",{value:String(t)}),e.nodeChanged()})(e,o)},Lang:(e,n,o)=>{t(e,{value:o.code,customValue:o.customCode})},RemoveFormat:t=>{e.formatter.remove(t)},mceBlockQuote:()=>{t("blockquote")},FormatBlock:(e,n,o)=>{t(m(o)?o:"p")},mceToggleFormat:(e,n,o)=>{t(o)}})})(e),(e=>{const t=t=>e.formatter.match(t);e.editorCommands.addCommands({"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":e=>t(e),mceBlockQuote:()=>t("blockquote")},"state"),e.editorCommands.addQueryValueHandler("FontName",(()=>(e=>gN(e,(t=>mN(e.getBody(),t.dom))).getOr(""))(e))),e.editorCommands.addQueryValueHandler("FontSize",(()=>(e=>gN(e,(t=>uN(e.getBody(),t.dom))).getOr(""))(e))),e.editorCommands.addQueryValueHandler("LineHeight",(()=>(e=>gN(e,(t=>{const n=mn(e.getBody()),o=Ap(t,(e=>Wn(e,"line-height")),O(bn,n));return o.getOrThunk((()=>{const e=parseFloat($n(t,"line-height")),n=parseFloat($n(t,"font-size"));return String(e/n)}))})).getOr(""))(e)))})(e)})(e),(e=>{e.editorCommands.addCommands({mceRemoveNode:(t,n,o)=>{const r=null!=o?o:e.selection.getNode();if(r!==e.getBody()){const t=e.selection.getBookmark();e.dom.remove(r,!0),e.selection.moveToBookmark(t)}},mcePrint:()=>{e.getWin().print()},mceFocus:(t,n,o)=>{((e,t)=>{e.removed||(t?of(e):(e=>{const t=e.selection,n=e.getBody();let o=t.getRng();e.quirks.refreshContentEditable(),void 0!==e.bookmark&&!1===nf(e)&&Wm(e).each((t=>{e.selection.setRng(t),o=t}));const r=((e,t)=>e.dom.getParent(t,(t=>"true"===e.dom.getContentEditable(t))))(e,t.getNode());if(e.dom.isChildOf(r,n))return tf(r),ef(e,o),void of(e);e.inline||(Nt.browser.isOpera()||tf(n),e.getWin().focus()),(Nt.browser.isFirefox()||e.inline)&&(tf(n),ef(e,o)),of(e)})(e))})(e,o)},mceToggleVisualAid:()=>{e.hasVisual=!e.hasVisual,e.addVisual()}})})(e)};class vN{constructor(e){this.commands={state:{},exec:{},value:{}},this.editor=e}execCommand(e,t,n,o){const r=this.editor,s=e.toLowerCase(),a=null==o?void 0:o.skip_focus;if(r.removed)return!1;if("mcefocus"!==s&&(/^(mceAddUndoLevel|mceEndUndoLevel)$/i.test(s)||a?(e=>{Wm(e).each((t=>e.selection.setRng(t)))})(r):r.focus()),r.dispatch("BeforeExecCommand",{command:e,ui:t,value:n}).isDefaultPrevented())return!1;const i=this.commands.exec[s];return!!x(i)&&(i(s,t,n),r.dispatch("ExecCommand",{command:e,ui:t,value:n}),!0)}queryCommandState(e){if(this.editor.quirks.isHidden()||this.editor.removed)return!1;const t=e.toLowerCase(),n=this.commands.state[t];return!!x(n)&&n(t)}queryCommandValue(e){if(this.editor.quirks.isHidden()||this.editor.removed)return"";const t=e.toLowerCase(),n=this.commands.value[t];return x(n)?n(t):""}addCommands(e,t="exec"){const n=this.commands;fe(e,((e,o)=>{$(o.toLowerCase().split(","),(o=>{n[t][o]=e}))}))}addCommand(e,t,n){const o=e.toLowerCase();this.commands.exec[o]=(e,o,r)=>t.call(null!=n?n:this.editor,o,r)}queryCommandSupported(e){const t=e.toLowerCase();return!!this.commands.exec[t]}addQueryStateHandler(e,t,n){this.commands.state[e.toLowerCase()]=()=>t.call(null!=n?n:this.editor)}addQueryValueHandler(e,t,n){this.commands.value[e.toLowerCase()]=()=>t.call(null!=n?n:this.editor)}}const yN="data-mce-contenteditable",CN=(e,t,n)=>{try{e.getDoc().execCommand(t,!1,String(n))}catch(e){}},xN=(e,t)=>{e.dom.contentEditable=t?"true":"false"},wN=(e,t)=>{const n=mn(e.getBody());((e,t,n)=>{sn(e,t)&&!1===n?rn(e,t):n&&nn(e,t)})(n,"mce-content-readonly",t),t?(e.selection.controlSelection.hideResizeRect(),e._selectionOverrides.hideFakeCaret(),(e=>{M.from(e.selection.getNode()).each((e=>{e.removeAttribute("data-mce-selected")}))})(e),e.readonly=!0,xN(n,!1),$(Xs(n,'*[contenteditable="true"]'),(e=>{$t(e,yN,"true"),xN(e,!1)}))):(e.readonly=!1,xN(n,!0),$(Xs(n,'*[data-mce-contenteditable="true"]'),(e=>{Yt(e,yN),xN(e,!0)})),CN(e,"StyleWithCSS",!1),CN(e,"enableInlineTableEditing",!1),CN(e,"enableObjectResizing",!1),(e=>nf(e)||(e=>{const t=Pn(mn(e.getElement()));return Fm(t).filter((t=>!(e=>{const t=e.classList;return void 0!==t&&(t.contains("tox-edit-area")||t.contains("tox-edit-area__iframe")||t.contains("mce-content-body"))})(t.dom)&&Qm(e,t.dom))).isSome()})(e))(e)&&e.focus(),(e=>{e.selection.setRng(e.selection.getRng())})(e),e.nodeChanged())},kN=e=>e.readonly,SN=e=>{e.parser.addAttributeFilter("contenteditable",(t=>{kN(e)&&$(t,(e=>{e.attr(yN,e.attr("contenteditable")),e.attr("contenteditable","false")}))})),e.serializer.addAttributeFilter(yN,(t=>{kN(e)&&$(t,(e=>{e.attr("contenteditable",e.attr(yN))}))})),e.serializer.addTempAttr(yN)},_N=Bt.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"," ");class EN{constructor(e){this.bindings={},this.settings=e||{},this.scope=this.settings.scope||this,this.toggleEvent=this.settings.toggleEvent||L}static isNative(e){return!!_N[e.toLowerCase()]}fire(e,t){return this.dispatch(e,t)}dispatch(e,t){const n=e.toLowerCase(),o=ws(n,null!=t?t:{},this.scope);this.settings.beforeFire&&this.settings.beforeFire(o);const r=this.bindings[n];if(r)for(let e=0,t=r.length;e<t;e++){const t=r[e];if(!t.removed){if(t.once&&this.off(n,t.func),o.isImmediatePropagationStopped())return o;if(!1===t.func.call(this.scope,o))return o.preventDefault(),o}}return o}on(e,t,n,o){if(!1===t&&(t=L),t){const r={func:t,removed:!1};o&&Bt.extend(r,o);const s=e.toLowerCase().split(" ");let a=s.length;for(;a--;){const e=s[a];let t=this.bindings[e];t||(t=[],this.toggleEvent(e,!0)),t=n?[r,...t]:[...t,r],this.bindings[e]=t}}return this}off(e,t){if(e){const n=e.toLowerCase().split(" ");let o=n.length;for(;o--;){const r=n[o];let s=this.bindings[r];if(!r)return fe(this.bindings,((e,t)=>{this.toggleEvent(t,!1),delete this.bindings[t]})),this;if(s){if(t){const e=W(s,(e=>e.func===t));s=e.fail,this.bindings[r]=s,$(e.pass,(e=>{e.removed=!0}))}else s.length=0;s.length||(this.toggleEvent(e,!1),delete this.bindings[r])}}}else fe(this.bindings,((e,t)=>{this.toggleEvent(t,!1)})),this.bindings={};return this}once(e,t,n){return this.on(e,t,n,{once:!0})}has(e){return e=e.toLowerCase(),!(!this.bindings[e]||0===this.bindings[e].length)}}const NN=e=>(e._eventDispatcher||(e._eventDispatcher=new EN({scope:e,toggleEvent:(t,n)=>{EN.isNative(t)&&e.toggleNativeEvent&&e.toggleNativeEvent(t,n)}})),e._eventDispatcher),RN={fire(e,t,n){return this.dispatch(e,t,n)},dispatch(e,t,n){const o=this;if(o.removed&&"remove"!==e&&"detach"!==e)return ws(e.toLowerCase(),null!=t?t:{},o);const r=NN(o).dispatch(e,t);if(!1!==n&&o.parent){let t=o.parent();for(;t&&!r.isPropagationStopped();)t.dispatch(e,r,!1),t=t.parent()}return r},on(e,t,n){return NN(this).on(e,t,n)},off(e,t){return NN(this).off(e,t)},once(e,t){return NN(this).once(e,t)},hasEventListeners(e){return NN(this).has(e)}},AN=Is.DOM;let ON;const TN=(e,t)=>{if("selectionchange"===t)return e.getDoc();if(!e.inline&&/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(t))return e.getDoc().documentElement;const n=al(e);return n?(e.eventRoot||(e.eventRoot=AN.select(n)[0]),e.eventRoot):e.getBody()},BN=(e,t,n)=>{(e=>!e.hidden&&!kN(e))(e)?e.dispatch(t,n):kN(e)&&((e,t)=>{if((e=>"click"===e.type)(t)&&!Uu.metaKeyPressed(t)){const n=mn(t.target);((e,t)=>Ko(t,"a",(t=>bn(t,mn(e.getBody())))).bind((e=>Kt(e,"href"))))(e,n).each((n=>{if(t.preventDefault(),/^#/.test(n)){const t=e.dom.select(`${n},[name="${o=n,ze(o,"#")?((e,t)=>e.substring(t))(o,"#".length):o}"]`);t.length&&e.selection.scrollIntoView(t[0],!0)}else window.open(n,"_blank","rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes");var o}))}})(e,n)},DN=(e,t)=>{let n;if(e.delegates||(e.delegates={}),e.delegates[t]||e.removed)return;const o=TN(e,t);if(al(e)){if(ON||(ON={},e.editorManager.on("removeEditor",(()=>{e.editorManager.activeEditor||ON&&(fe(ON,((t,n)=>{e.dom.unbind(TN(e,n))})),ON=null)}))),ON[t])return;n=n=>{const o=n.target,r=e.editorManager.get();let s=r.length;for(;s--;){const e=r[s].getBody();(e===o||AN.isChildOf(o,e))&&BN(r[s],t,n)}},ON[t]=n,AN.bind(o,t,n)}else n=n=>{BN(e,t,n)},AN.bind(o,t,n),e.delegates[t]=n},LN={...RN,bindPendingEventDelegates(){const e=this;Bt.each(e._pendingNativeEvents,(t=>{DN(e,t)}))},toggleNativeEvent(e,t){const n=this;"focus"!==e&&"blur"!==e&&(n.removed||(t?n.initialized?DN(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&(n.dom.unbind(TN(n,e),e,n.delegates[e]),delete n.delegates[e])))},unbindAllNativeEvents(){const e=this,t=e.getBody(),n=e.dom;e.delegates&&(fe(e.delegates,((t,n)=>{e.dom.unbind(TN(e,n),n,t)})),delete e.delegates),!e.inline&&t&&n&&(t.onload=null,n.unbind(e.getWin()),n.unbind(e.getDoc())),n&&(n.unbind(t),n.unbind(e.getContainer()))}},PN=e=>m(e)?{value:e.split(/[ ,]/),valid:!0}:k(e,m)?{value:e,valid:!0}:{valid:!1,message:"The value must be a string[] or a comma/space separated string."},MN=(e,t)=>e+(Ke(t.message)?"":`. ${t.message}`),IN=e=>e.valid,FN=(e,t,n="")=>{const o=t(e);return b(o)?o?{value:e,valid:!0}:{valid:!1,message:n}:o},UN=["design","readonly"],zN=(e,t,n,o)=>{const r=n[t.get()],s=n[o];try{s.activate()}catch(e){return void console.error(`problem while activating editor mode ${o}:`,e)}r.deactivate(),r.editorReadOnly!==s.editorReadOnly&&wN(e,s.editorReadOnly),t.set(o),((e,t)=>{e.dispatch("SwitchMode",{mode:t})})(e,o)},jN=Bt.each,VN=Bt.explode,HN={f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123},$N=Bt.makeMap("alt,ctrl,shift,meta,access"),qN=e=>{let t;const n={},o=Nt.os.isMacOS()||Nt.os.isiOS();jN(VN(e.toLowerCase(),"+"),(e=>{e in $N?n[e]=!0:/^[0-9]{2,}$/.test(e)?n.keyCode=parseInt(e,10):(n.charCode=e.charCodeAt(0),n.keyCode=HN[e]||e.toUpperCase().charCodeAt(0))}));const r=[n.keyCode];for(t in $N)n[t]?r.push(t):n[t]=!1;return n.id=r.join(","),n.access&&(n.alt=!0,o?n.ctrl=!0:n.shift=!0),n.meta&&(o?n.meta=!0:(n.ctrl=!0,n.meta=!1)),n};class WN{constructor(e){this.shortcuts={},this.pendingPatterns=[],this.editor=e;const t=this;e.on("keyup keypress keydown",(e=>{!t.hasModifier(e)&&!t.isFunctionKey(e)||e.isDefaultPrevented()||(jN(t.shortcuts,(n=>{if(t.matchShortcut(e,n))return t.pendingPatterns=n.subpatterns.slice(0),"keydown"===e.type&&t.executeShortcutAction(n),!0})),t.matchShortcut(e,t.pendingPatterns[0])&&(1===t.pendingPatterns.length&&"keydown"===e.type&&t.executeShortcutAction(t.pendingPatterns[0]),t.pendingPatterns.shift()))}))}add(e,t,n,o){const r=this,s=r.normalizeCommandFunc(n);return jN(VN(Bt.trim(e)),(e=>{const n=r.createShortcut(e,t,s,o);r.shortcuts[n.id]=n})),!0}remove(e){const t=this.createShortcut(e);return!!this.shortcuts[t.id]&&(delete this.shortcuts[t.id],!0)}normalizeCommandFunc(e){const t=this,n=e;return"string"==typeof n?()=>{t.editor.execCommand(n,!1,null)}:Bt.isArray(n)?()=>{t.editor.execCommand(n[0],n[1],n[2])}:n}createShortcut(e,t,n,o){const r=Bt.map(VN(e,">"),qN);return r[r.length-1]=Bt.extend(r[r.length-1],{func:n,scope:o||this.editor}),Bt.extend(r[0],{desc:this.editor.translate(t),subpatterns:r.slice(1)})}hasModifier(e){return e.altKey||e.ctrlKey||e.metaKey}isFunctionKey(e){return"keydown"===e.type&&e.keyCode>=112&&e.keyCode<=123}matchShortcut(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)}executeShortcutAction(e){return e.func?e.func.call(e.scope):null}}const KN=()=>{const e=(()=>{const e={},t={},n={},o={},r={},s={},a={},i=(e,t)=>(n,o)=>e[n.toLowerCase()]={...o,type:t};return{addButton:i(e,"button"),addGroupToolbarButton:i(e,"grouptoolbarbutton"),addToggleButton:i(e,"togglebutton"),addMenuButton:i(e,"menubutton"),addSplitButton:i(e,"splitbutton"),addMenuItem:i(t,"menuitem"),addNestedMenuItem:i(t,"nestedmenuitem"),addToggleMenuItem:i(t,"togglemenuitem"),addAutocompleter:i(n,"autocompleter"),addContextMenu:i(r,"contextmenu"),addContextToolbar:i(s,"contexttoolbar"),addContextForm:i(s,"contextform"),addSidebar:i(a,"sidebar"),addIcon:(e,t)=>o[e.toLowerCase()]=t,getAll:()=>({buttons:e,menuItems:t,icons:o,popups:n,contextMenus:r,contextToolbars:s,sidebars:a})}})();return{addAutocompleter:e.addAutocompleter,addButton:e.addButton,addContextForm:e.addContextForm,addContextMenu:e.addContextMenu,addContextToolbar:e.addContextToolbar,addIcon:e.addIcon,addMenuButton:e.addMenuButton,addMenuItem:e.addMenuItem,addNestedMenuItem:e.addNestedMenuItem,addSidebar:e.addSidebar,addSplitButton:e.addSplitButton,addToggleButton:e.addToggleButton,addGroupToolbarButton:e.addGroupToolbarButton,addToggleMenuItem:e.addToggleMenuItem,getAll:e.getAll}},GN=Is.DOM,YN=Bt.extend,XN=Bt.each;class QN{constructor(e,t,n){this.plugins={},this.contentCSS=[],this.contentStyles=[],this.loadedCSS={},this.isNotDirty=!1,this.editorManager=n,this.documentBaseUrl=n.documentBaseURL,YN(this,LN);const o=this;this.id=e,this.hidden=!1;const r=((e,t)=>sN(JE||ZE,JE,t,e,t))(n.defaultOptions,t);this.options=((e,t)=>{const n={},o={},r=(e,t,n)=>{const r=FN(t,n);return IN(r)?(o[e]=r.value,!0):(console.warn(MN(`Invalid value passed for the ${e} option`,r)),!1)},s=e=>we(n,e);return{register:(e,s)=>{const a=(e=>m(e.processor))(s)?(e=>{const t=(()=>{switch(e){case"array":return p;case"boolean":return b;case"function":return x;case"number":return w;case"object":return f;case"string":return m;case"string[]":return PN;case"object[]":return e=>k(e,f);case"regexp":return e=>u(e,RegExp)}})();return n=>FN(n,t,`The value must be a ${e}.`)})(s.processor):s.processor,i=((e,t,n)=>{if(!v(t)){const o=FN(t,n);if(IN(o))return o.value;console.error(MN(`Invalid default value passed for the "${e}" option`,o))}})(e,s.default,a);n[e]={...s,default:i,processor:a},xe(o,e).orThunk((()=>xe(t,e))).each((t=>r(e,t,a)))},isRegistered:s,get:e=>xe(o,e).orThunk((()=>xe(n,e).map((e=>e.default)))).getOrUndefined(),set:(e,t)=>{if(s(e)){const o=n[e];return o.immutable?(console.error(`"${e}" is an immutable option and cannot be updated`),!1):r(e,t,o.processor)}return console.warn(`"${e}" is not a registered option. Ensure the option has been registered before setting a value.`),!1},unset:e=>{const t=s(e);return t&&delete o[e],t},isSet:e=>we(o,e)}})(0,r),(e=>{const t=e.options.register;t("id",{processor:"string",default:e.id}),t("selector",{processor:"string"}),t("target",{processor:"object"}),t("suffix",{processor:"string"}),t("cache_suffix",{processor:"string"}),t("base_url",{processor:"string"}),t("referrer_policy",{processor:"string",default:""}),t("language_load",{processor:"boolean"}),t("inline",{processor:"boolean",default:!1}),t("iframe_attrs",{processor:"object",default:{}}),t("doctype",{processor:"string",default:"<!DOCTYPE html>"}),t("document_base_url",{processor:"string",default:e.documentBaseUrl}),t("body_id",{processor:ki(e,"tinymce"),default:"tinymce"}),t("body_class",{processor:ki(e),default:""}),t("content_security_policy",{processor:"string",default:""}),t("br_in_pre",{processor:"boolean",default:!0}),t("forced_root_block",{processor:e=>{const t=m(e)&&We(e);return t?{value:e,valid:t}:{valid:!1,message:"Must be a non-empty string."}},default:"p"}),t("forced_root_block_attrs",{processor:"object",default:{}}),t("br_newline_selector",{processor:"string",default:".mce-toc h2,figcaption,caption"}),t("no_newline_selector",{processor:"string",default:""}),t("keep_styles",{processor:"boolean",default:!0}),t("end_container_on_empty_block",{processor:"boolean",default:!1}),t("font_size_style_values",{processor:"string",default:"xx-small,x-small,small,medium,large,x-large,xx-large"}),t("font_size_legacy_values",{processor:"string",default:"xx-small,small,medium,large,x-large,xx-large,300%"}),t("font_size_classes",{processor:"string",default:""}),t("automatic_uploads",{processor:"boolean",default:!0}),t("images_reuse_filename",{processor:"boolean",default:!1}),t("images_replace_blob_uris",{processor:"boolean",default:!0}),t("icons",{processor:"string",default:""}),t("icons_url",{processor:"string",default:""}),t("images_upload_url",{processor:"string",default:""}),t("images_upload_base_path",{processor:"string",default:""}),t("images_upload_base_path",{processor:"string",default:""}),t("images_upload_credentials",{processor:"boolean",default:!1}),t("images_upload_handler",{processor:"function"}),t("language",{processor:"string",default:"en"}),t("language_url",{processor:"string",default:""}),t("entity_encoding",{processor:"string",default:"named"}),t("indent",{processor:"boolean",default:!0}),t("indent_before",{processor:"string",default:"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"}),t("indent_after",{processor:"string",default:"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"}),t("indent_use_margin",{processor:"boolean",default:!1}),t("indentation",{processor:"string",default:"40px"}),t("content_css",{processor:e=>{const t=!1===e||m(e)||k(e,m);return t?m(e)?{value:H(e.split(","),He),valid:t}:p(e)?{value:e,valid:t}:!1===e?{value:[],valid:t}:{value:e,valid:t}:{valid:!1,message:"Must be false, a string or an array of strings."}},default:bl(e)?[]:["default"]}),t("content_style",{processor:"string"}),t("content_css_cors",{processor:"boolean",default:!1}),t("font_css",{processor:e=>{const t=m(e)||k(e,m);return t?{value:p(e)?e:H(e.split(","),He),valid:t}:{valid:!1,message:"Must be a string or an array of strings."}},default:[]}),t("inline_boundaries",{processor:"boolean",default:!0}),t("inline_boundaries_selector",{processor:"string",default:"a[href],code,.mce-annotation"}),t("object_resizing",{processor:e=>{const t=b(e)||m(e);return t?!1===e||bi.isiPhone()||bi.isiPad()?{value:"",valid:t}:{value:!0===e?"table,img,figure.image,div,video,iframe":e,valid:t}:{valid:!1,message:"Must be boolean or a string"}},default:!vi}),t("resize_img_proportional",{processor:"boolean",default:!0}),t("event_root",{processor:"object"}),t("service_message",{processor:"string"}),t("theme",{processor:e=>!1===e||m(e)||x(e),default:"silver"}),t("theme_url",{processor:"string"}),t("formats",{processor:"object"}),t("format_empty_lines",{processor:"boolean",default:!1}),t("preview_styles",{processor:e=>{const t=!1===e||m(e);return t?{value:!1===e?"":e,valid:t}:{valid:!1,message:"Must be false or a string"}},default:"font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow"}),t("custom_ui_selector",{processor:"string",default:""}),t("hidden_input",{processor:"boolean",default:!0}),t("submit_patch",{processor:"boolean",default:!0}),t("encoding",{processor:"string"}),t("add_form_submit_trigger",{processor:"boolean",default:!0}),t("add_unload_trigger",{processor:"boolean",default:!0}),t("custom_undo_redo_levels",{processor:"number",default:0}),t("disable_nodechange",{processor:"boolean",default:!1}),t("readonly",{processor:"boolean",default:!1}),t("plugins",{processor:"string[]",default:[]}),t("external_plugins",{processor:"object"}),t("forced_plugins",{processor:"string[]"}),t("model",{processor:"string",default:e.hasPlugin("rtc")?"plugin":"dom"}),t("model_url",{processor:"string"}),t("block_unsupported_drop",{processor:"boolean",default:!0}),t("visual",{processor:"boolean",default:!0}),t("visual_table_class",{processor:"string",default:"mce-item-table"}),t("visual_anchor_class",{processor:"string",default:"mce-item-anchor"}),t("iframe_aria_text",{processor:"string",default:"Rich Text Area. Press ALT-0 for help."}),t("setup",{processor:"function"}),t("init_instance_callback",{processor:"function"}),t("url_converter",{processor:"function",default:e.convertURL}),t("url_converter_scope",{processor:"object",default:e}),t("urlconverter_callback",{processor:"function"}),t("allow_conditional_comments",{processor:"boolean",default:!1}),t("allow_html_data_urls",{processor:"boolean",default:!1}),t("allow_svg_data_urls",{processor:"boolean"}),t("allow_html_in_named_anchor",{processor:"boolean",default:!1}),t("allow_script_urls",{processor:"boolean",default:!1}),t("allow_unsafe_link_target",{processor:"boolean",default:!1}),t("convert_fonts_to_spans",{processor:"boolean",default:!0,deprecated:!0}),t("fix_list_elements",{processor:"boolean",default:!1}),t("preserve_cdata",{processor:"boolean",default:!1}),t("remove_trailing_brs",{processor:"boolean"}),t("inline_styles",{processor:"boolean",default:!0,deprecated:!0}),t("element_format",{processor:"string",default:"html"}),t("entities",{processor:"string"}),t("schema",{processor:"string",default:"html5"}),t("convert_urls",{processor:"boolean",default:!0}),t("relative_urls",{processor:"boolean",default:!0}),t("remove_script_host",{processor:"boolean",default:!0}),t("custom_elements",{processor:"string"}),t("extended_valid_elements",{processor:"string"}),t("invalid_elements",{processor:"string"}),t("invalid_styles",{processor:wi}),t("valid_children",{processor:"string"}),t("valid_classes",{processor:wi}),t("valid_elements",{processor:"string"}),t("valid_styles",{processor:wi}),t("verify_html",{processor:"boolean",default:!0}),t("auto_focus",{processor:e=>m(e)||!0===e}),t("browser_spellcheck",{processor:"boolean",default:!1}),t("protect",{processor:"array"}),t("images_file_types",{processor:"string",default:"jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp"}),t("deprecation_warnings",{processor:"boolean",default:!0}),t("a11y_advanced_options",{processor:"boolean",default:!1}),t("api_key",{processor:"string"}),t("paste_block_drop",{processor:"boolean",default:!1}),t("paste_data_images",{processor:"boolean",default:!0}),t("paste_preprocess",{processor:"function"}),t("paste_postprocess",{processor:"function"}),t("paste_webkit_styles",{processor:"string",default:"none"}),t("paste_remove_styles_if_webkit",{processor:"boolean",default:!0}),t("paste_merge_formats",{processor:"boolean",default:!0}),t("smart_paste",{processor:"boolean",default:!0}),t("paste_as_text",{processor:"boolean",default:!1}),t("paste_tab_spaces",{processor:"number",default:4}),t("text_patterns",{processor:e=>k(e,f)||!1===e?{value:hi(!1===e?[]:e),valid:!0}:{valid:!1,message:"Must be an array of objects or false."},default:[{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"}]}),t("noneditable_class",{processor:"string",default:"mceNonEditable"}),t("editable_class",{processor:"string",default:"mceEditable"}),t("noneditable_regexp",{processor:e=>k(e,Ci)?{value:e,valid:!0}:Ci(e)?{value:[e],valid:!0}:{valid:!1,message:"Must be a RegExp or an array of RegExp."},default:[]}),t("table_tab_navigation",{processor:"boolean",default:!0}),e.on("ScriptsLoaded",(()=>{t("directionality",{processor:"string",default:$s.isRtl()?"rtl":void 0}),t("placeholder",{processor:"string",default:yi.getAttrib(e.getElement(),"placeholder")})}))})(o);const s=this.options.get;s("deprecation_warnings")&&((e,t)=>{((e,t)=>{const n=zv(e),o=jv(t),r=o.length>0,s=n.length>0,a="mobile"===t.theme;if(r||s||a){const e="\n- ",t=a?`\n\nThemes:${e}mobile`:"",i=r?`\n\nPlugins:${e}${o.join(e)}`:"",l=s?`\n\nOptions:${e}${n.join(e)}`:"";console.warn("The following deprecated features are currently enabled and have been removed in TinyMCE 6.0. These features will no longer work and should be removed from the TinyMCE configuration. See https://www.tiny.cloud/docs/tinymce/6/migration-from-5x/ for more information."+t+i+l)}})(e,t)})(t,r);const a=s("suffix");a&&(n.suffix=a),this.suffix=n.suffix;const i=s("base_url");i&&n._setBaseUrl(i),this.baseUri=n.baseURI;const l=Ki(o);l&&(Us.ScriptLoader._setReferrerPolicy(l),Is.DOM.styleSheetLoader._setReferrerPolicy(l)),qs.languageLoad=s("language_load"),qs.baseURL=n.baseURL,this.setDirty(!1),this.documentBaseURI=new Mb(Ei(o),{base_uri:this.baseUri}),this.baseURI=this.baseUri,this.inline=bl(o),this.shortcuts=new WN(this),this.editorCommands=new vN(this),bN(this);const d=s("cache_suffix");d&&(Nt.cacheSuffix=d.replace(/^[\?\&]+/,"")),this.ui={registry:KN(),styleSheetLoader:void 0,show:S,hide:S,setEnabled:S,isEnabled:P},this.mode=(e=>{const t=zs("design"),n=zs({design:{activate:S,deactivate:S,editorReadOnly:!1},readonly:{activate:S,deactivate:S,editorReadOnly:!0}});return(e=>{e.serializer?SN(e):e.on("PreInit",(()=>{SN(e)}))})(e),(e=>{e.on("ShowCaret",(t=>{kN(e)&&t.preventDefault()})),e.on("ObjectSelected",(t=>{kN(e)&&t.preventDefault()}))})(e),{isReadOnly:()=>kN(e),set:o=>((e,t,n,o)=>{if(o!==n.get()){if(!we(t,o))throw new Error(`Editor mode '${o}' is invalid`);e.initialized?zN(e,n,t,o):e.on("init",(()=>zN(e,n,t,o)))}})(e,n.get(),t,o),get:()=>t.get(),register:(e,t)=>{n.set(((e,t,n)=>{if(j(UN,t))throw new Error(`Cannot override default mode ${t}`);return{...e,[t]:{...n,deactivate:()=>{try{n.deactivate()}catch(e){console.error(`problem while deactivating editor mode ${t}:`,e)}}}}})(n.get(),e,t))}}})(o),n.dispatch("SetupEditor",{editor:this});const c=Dl(o);x(c)&&c.call(o,o)}render(){(e=>{const t=e.id;$s.setCode(Gi(e));const n=()=>{KE.unbind(window,"ready",n),e.render()};if(!Rs.Event.domLoaded)return void KE.bind(window,"ready",n);if(!e.getElement())return;const o=mn(e.getElement()),r=Xt(o);e.on("remove",(()=>{q(o.dom.attributes,(e=>Yt(o,e.name))),qt(o,r)})),e.ui.styleSheetLoader=((e,t)=>Yo.forElement(e,{contentCssCors:_l(t),referrerPolicy:Ki(t)}))(o,e),bl(e)?e.inline=!0:(e.orgVisibility=e.getElement().style.visibility,e.getElement().style.visibility="hidden");const s=e.getElement().form||KE.getParent(t,"form");s&&(e.formElement=s,vl(e)&&!Eo(e.getElement())&&(KE.insertAfter(KE.create("input",{type:"hidden",name:t}),t),e.hasHiddenInput=!0),e.formEventDelegate=t=>{e.dispatch(t.type,t)},KE.bind(s,"submit reset",e.formEventDelegate),e.on("reset",(()=>{e.resetContent()})),!yl(e)||s.submit.nodeType||s.submit.length||s._mceOldSubmit||(s._mceOldSubmit=s.submit,s.submit=()=>(e.editorManager.triggerSave(),e.setDirty(!1),s._mceOldSubmit(s)))),e.windowManager=ty(e),e.notificationManager=Jv(e),(e=>"xml"===e.options.get("encoding"))(e)&&e.on("GetContent",(e=>{e.save&&(e.content=KE.encode(e.content))})),Cl(e)&&e.on("submit",(()=>{e.initialized&&e.save()})),xl(e)&&(e._beforeUnload=()=>{!e.initialized||e.destroyed||e.isHidden()||e.save({format:"raw",no_events:!0,set_dirty:!1})},e.editorManager.on("BeforeUnload",e._beforeUnload)),e.editorManager.add(e),XE(e,e.suffix)})(this)}focus(e){this.execCommand("mceFocus",!1,e)}hasFocus(){return nf(this)}translate(e){return $s.translate(e)}getParam(e,t,n){const o=this.options;return o.isRegistered(e)||(C(n)?o.register(e,{processor:n,default:t}):o.register(e,{processor:P,default:t})),o.isSet(e)||v(t)?o.get(e):t}hasPlugin(e,t){return!(!j(El(this),e)||t&&void 0===Zv.get(e))}nodeChanged(e){this._nodeChangeDispatcher.nodeChanged(e)}addCommand(e,t,n){this.editorCommands.addCommand(e,t,n)}addQueryStateHandler(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)}addQueryValueHandler(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)}addShortcut(e,t,n,o){this.shortcuts.add(e,t,n,o)}execCommand(e,t,n,o){return this.editorCommands.execCommand(e,t,n,o)}queryCommandState(e){return this.editorCommands.queryCommandState(e)}queryCommandValue(e){return this.editorCommands.queryCommandValue(e)}queryCommandSupported(e){return this.editorCommands.queryCommandSupported(e)}show(){const e=this;e.hidden&&(e.hidden=!1,e.inline?e.getBody().contentEditable="true":(GN.show(e.getContainer()),GN.hide(e.id)),e.load(),e.dispatch("show"))}hide(){const e=this;e.hidden||(e.save(),e.inline?(e.getBody().contentEditable="false",e===e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(GN.hide(e.getContainer()),GN.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.dispatch("hide"))}isHidden(){return this.hidden}setProgressState(e,t){this.dispatch("ProgressState",{state:e,time:t})}load(e){const t=this;let n,o=t.getElement();if(t.removed)return"";if(o){(e=e||{}).load=!0;const r=Eo(o)?o.value:o.innerHTML;return n=t.setContent(r,e),e.element=o,e.no_events||t.dispatch("LoadContent",e),e.element=o=null,n}}save(e){const t=this;let n,o,r=t.getElement();if(r&&t.initialized&&!t.removed)return(e=e||{}).save=!0,e.element=r,n=e.content=t.getContent(e),e.no_events||t.dispatch("SaveContent",e),"raw"===e.format&&t.dispatch("RawSaveContent",e),n=e.content,Eo(r)?r.value=n:(!e.is_removing&&t.inline||(r.innerHTML=n),(o=GN.getParent(t.id,"form"))&&XN(o.elements,(e=>{if(e.name===t.id)return e.value=n,!1}))),e.element=r=null,!1!==e.set_dirty&&t.setDirty(!1),n}setContent(e,t){return Iv(this,e,t)}getContent(e){return((e,t={})=>{const n=((e,t)=>({...e,format:t,get:!0,getInner:!0}))(t,t.format?t.format:"html");return Gb(e,n).fold(R,(t=>{const n=((e,t)=>Ev(e).editor.getContent(t))(e,t);return Yb(e,n,t)}))})(this,e)}insertContent(e,t){t&&(e=YN({content:e},t)),this.execCommand("mceInsertContent",!1,e)}resetContent(e){void 0===e?Iv(this,this.startContent,{format:"raw"}):Iv(this,e),this.undoManager.reset(),this.setDirty(!1),this.nodeChanged()}isDirty(){return!this.isNotDirty}setDirty(e){const t=!this.isNotDirty;this.isNotDirty=!e,e&&e!==t&&this.dispatch("dirty")}getContainer(){const e=this;return e.container||(e.container=GN.get(e.editorContainer||e.id+"_parent")),e.container}getContentAreaContainer(){return this.contentAreaContainer}getElement(){return this.targetElm||(this.targetElm=GN.get(this.id)),this.targetElm}getWin(){const e=this;let t;return e.contentWindow||(t=e.iframeElement,t&&(e.contentWindow=t.contentWindow)),e.contentWindow}getDoc(){const e=this;let t;return e.contentDocument||(t=e.getWin(),t&&(e.contentDocument=t.document)),e.contentDocument}getBody(){const e=this.getDoc();return this.bodyElement||(e?e.body:null)}convertURL(e,t,n){const o=this,r=o.options.get,s=Pl(o);return x(s)?s.call(o,e,n,!0,t):!r("convert_urls")||n&&"LINK"===n.nodeName||0===e.indexOf("file:")||0===e.length?e:r("relative_urls")?o.documentBaseURI.toRelative(e):e=o.documentBaseURI.toAbsolute(e,r("remove_script_host"))}addVisual(e){((e,t)=>{((e,t)=>{Nv(e).editor.addVisual(t)})(e,t)})(this,e)}remove(){(e=>{if(!e.removed){const{_selectionOverrides:t,editorUpload:n}=e,o=e.getBody(),r=e.getElement();o&&e.save({is_removing:!0}),e.removed=!0,e.unbindAllNativeEvents(),e.hasHiddenInput&&r&&Vv.remove(r.nextSibling),(e=>{e.dispatch("remove")})(e),e.editorManager.remove(e),!e.inline&&o&&(e=>{Vv.setStyle(e.id,"display",e.orgDisplay)})(e),(e=>{e.dispatch("detach")})(e),Vv.remove(e.getContainer()),Hv(t),Hv(n),e.destroy()}})(this)}destroy(e){((e,t)=>{const{selection:n,dom:o}=e;e.destroyed||(t||e.removed?(t||(e.editorManager.off("beforeunload",e._beforeUnload),e.theme&&e.theme.destroy&&e.theme.destroy(),Hv(n),Hv(o)),(e=>{const t=e.formElement;t&&(t._mceOldSubmit&&(t.submit=t._mceOldSubmit,t._mceOldSubmit=null),Vv.unbind(t,"submit reset",e.formEventDelegate))})(e),(e=>{e.contentAreaContainer=e.formElement=e.container=e.editorContainer=null,e.bodyElement=e.contentDocument=e.contentWindow=null,e.iframeElement=e.targetElm=null,e.selection&&(e.selection=e.selection.win=e.selection.dom=e.selection.dom.doc=null)})(e),e.destroyed=!0):e.remove())})(this,e)}uploadImages(){return this.editorUpload.uploadImages()}_scanForImages(){return this.editorUpload.scanForImages()}}const JN=Is.DOM,ZN=Bt.each;let eR,tR=!1,nR=[];const oR=e=>{const t=e.type;ZN(iR.get(),(n=>{switch(t){case"scroll":n.dispatch("ScrollWindow",e);break;case"resize":n.dispatch("ResizeWindow",e)}}))},rR=e=>{if(e!==tR){const t=Is.DOM;e?(t.bind(window,"resize",oR),t.bind(window,"scroll",oR)):(t.unbind(window,"resize",oR),t.unbind(window,"scroll",oR)),tR=e}},sR=e=>{const t=nR;return nR=K(nR,(t=>e!==t)),iR.activeEditor===e&&(iR.activeEditor=nR.length>0?nR[0]:null),iR.focusedEditor===e&&(iR.focusedEditor=null),t.length!==nR.length},aR="CSS1Compat"!==document.compatMode,iR={...RN,baseURI:null,baseURL:null,defaultOptions:{},documentBaseURL:null,suffix:null,majorVersion:"6",minorVersion:"0.2",releaseDate:"2022-04-27",i18n:$s,activeEditor:null,focusedEditor:null,setup(){const e=this;let t,n,o="";n=Mb.getDocumentBaseUrl(document.location),/^[^:]+:\/\/\/?[^\/]+\//.test(n)&&(n=n.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(n)||(n+="/"));const r=window.tinymce||window.tinyMCEPreInit;if(r)t=r.base||r.baseURL,o=r.suffix;else{const e=document.getElementsByTagName("script");for(let n=0;n<e.length;n++){const r=e[n].src||"";if(""===r)continue;const s=r.substring(r.lastIndexOf("/"));if(/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(r)){-1!==s.indexOf(".min")&&(o=".min"),t=r.substring(0,r.lastIndexOf("/"));break}}if(!t&&document.currentScript){const e=document.currentScript.src;-1!==e.indexOf(".min")&&(o=".min"),t=e.substring(0,e.lastIndexOf("/"))}}var s;e.baseURL=new Mb(n).toAbsolute(t),e.documentBaseURL=n,e.baseURI=new Mb(e.baseURL),e.suffix=o,(s=e).on("AddEditor",O(Jm,s)),s.on("RemoveEditor",O(Zm,s))},overrideDefaults(e){const t=e.base_url;t&&this._setBaseUrl(t);const n=e.suffix;e.suffix&&(this.suffix=n),this.defaultOptions=e;const o=e.plugin_base_urls;void 0!==o&&fe(o,((e,t)=>{qs.PluginManager.urls[t]=e}))},init(e){const t=this;let n;const o=Bt.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"," ");let r=e=>{n=e};const s=()=>{let n=0;const a=[];let i;JN.unbind(window,"ready",s),(n=>{const o=e.onpageload;o&&o.apply(t,[])})(),i=((e,t)=>{const n=[],o=x(t)?e=>V(n,(n=>t(n,e))):e=>j(n,e);for(let t=0,r=e.length;t<r;t++){const r=e[t];o(r)||n.push(r)}return n})((e=>Nt.browser.isIE()||Nt.browser.isEdge()?(ay("TinyMCE does not support the browser you are using. For a list of supported browsers please see: https://www.tiny.cloud/docs/tinymce/6/support/#supportedwebbrowsers"),[]):aR?(ay("Failed to initialize the editor as the document is not in standards mode. TinyMCE requires standards mode."),[]):m(e.selector)?JN.select(e.selector):C(e.target)?[e.target]:[])(e)),Bt.each(i,(e=>{var n;(n=t.get(e.id))&&n.initialized&&!(n.getContainer()||n.getBody()).parentNode&&(sR(n),n.unbindAllNativeEvents(),n.destroy(!0),n.removed=!0,n=null)})),i=Bt.grep(i,(e=>!t.get(e.id))),0===i.length?r([]):ZN(i,(s=>{((e,t)=>e.inline&&t.tagName.toLowerCase()in o)(e,s)?ay("Could not initialize inline editor on invalid inline target element",s):((e,o,s)=>{const l=new QN(e,o,t);a.push(l),l.on("init",(()=>{++n===i.length&&r(a)})),l.targetElm=l.targetElm||s,l.render()})((e=>{let t=e.id;return t||(t=xe(e,"name").filter((e=>!JN.get(e))).getOrThunk(JN.uniqueId),e.setAttribute("id",t)),t})(s),e,s)}))};return JN.bind(window,"ready",s),new Promise((e=>{n?e(n):r=t=>{e(t)}}))},get(e){return 0===arguments.length?nR.slice(0):m(e)?Q(nR,(t=>t.id===e)).getOr(null):w(e)&&nR[e]?nR[e]:null},add(e){const t=this,n=t.get(e.id);return n===e||(null===n&&nR.push(e),rR(!0),t.activeEditor=e,t.dispatch("AddEditor",{editor:e}),eR||(eR=e=>{const n=t.dispatch("BeforeUnload");if(n.returnValue)return e.preventDefault(),e.returnValue=n.returnValue,n.returnValue},window.addEventListener("beforeunload",eR))),e},createEditor(e,t){return this.add(new QN(e,t,this))},remove(e){const t=this;let n,o;if(e){if(!m(e))return o=e,h(t.get(o.id))?null:(sR(o)&&t.dispatch("RemoveEditor",{editor:o}),0===nR.length&&window.removeEventListener("beforeunload",eR),o.remove(),rR(nR.length>0),o);ZN(JN.select(e),(e=>{o=t.get(e.id),o&&t.remove(o)}))}else for(n=nR.length-1;n>=0;n--)t.remove(nR[n])},execCommand(e,t,n){var o;const r=this,s=f(n)?null!==(o=n.id)&&void 0!==o?o:n.index:n;switch(e){case"mceAddEditor":if(!r.get(s)){const e=n.options;new QN(s,e,r).render()}return!0;case"mceRemoveEditor":{const e=r.get(s);return e&&e.remove(),!0}case"mceToggleEditor":{const e=r.get(s);return e?(e.isHidden()?e.show():e.hide(),!0):(r.execCommand("mceAddEditor",!1,n),!0)}}return!!r.activeEditor&&r.activeEditor.execCommand(e,t,n)},triggerSave:()=>{ZN(nR,(e=>{e.save()}))},addI18n:(e,t)=>{$s.add(e,t)},translate:e=>$s.translate(e),setActive(e){const t=this.activeEditor;this.activeEditor!==e&&(t&&t.dispatch("deactivate",{relatedTarget:e}),e.dispatch("activate",{relatedTarget:t})),this.activeEditor=e},_setBaseUrl(e){this.baseURL=new Mb(this.documentBaseURL).toAbsolute(e.replace(/\/+$/,"")),this.baseURI=new Mb(this.baseURL)}};iR.setup();const lR=(()=>{const e=Ws();return{FakeClipboardItem:e=>({items:e,types:ue(e),getType:t=>xe(e,t).getOrUndefined()}),write:t=>{e.set(t)},read:()=>e.get().getOrUndefined(),clear:e.clear}})(),dR=Math.min,cR=Math.max,uR=Math.round,mR=(e,t,n)=>{let o=t.x,r=t.y;const s=e.w,a=e.h,i=t.w,l=t.h,d=(n||"").split("");return"b"===d[0]&&(r+=l),"r"===d[1]&&(o+=i),"c"===d[0]&&(r+=uR(l/2)),"c"===d[1]&&(o+=uR(i/2)),"b"===d[3]&&(r-=a),"r"===d[4]&&(o-=s),"c"===d[3]&&(r-=uR(a/2)),"c"===d[4]&&(o-=uR(s/2)),fR(o,r,s,a)},fR=(e,t,n,o)=>({x:e,y:t,w:n,h:o}),gR={inflate:(e,t,n)=>fR(e.x-t,e.y-n,e.w+2*t,e.h+2*n),relativePosition:mR,findBestRelativePosition:(e,t,n,o)=>{let r,s;for(s=0;s<o.length;s++)if(r=mR(e,t,o[s]),r.x>=n.x&&r.x+r.w<=n.w+n.x&&r.y>=n.y&&r.y+r.h<=n.h+n.y)return o[s];return null},intersect:(e,t)=>{const n=cR(e.x,t.x),o=cR(e.y,t.y),r=dR(e.x+e.w,t.x+t.w),s=dR(e.y+e.h,t.y+t.h);return r-n<0||s-o<0?null:fR(n,o,r-n,s-o)},clamp:(e,t,n)=>{let o=e.x,r=e.y,s=e.x+e.w,a=e.y+e.h;const i=t.x+t.w,l=t.y+t.h,d=cR(0,t.x-o),c=cR(0,t.y-r),u=cR(0,s-i),m=cR(0,a-l);return o+=d,r+=c,n&&(s+=d,a+=c,o-=u,r-=m),s-=u,a-=m,fR(o,r,s-o,a-r)},create:fR,fromClientRect:e=>fR(e.left,e.top,e.width,e.height)},pR=(()=>{const e={},t={};return{load:(n,o)=>{const r=`Script at URL "${o}" failed to load`,s=`Script at URL "${o}" did not call \`tinymce.Resource.add('${n}', data)\` within 1 second`;if(void 0!==e[n])return e[n];{const a=new Promise(((e,a)=>{const i=((e,t,n=1e3)=>{let o=!1,r=null;const s=e=>(...t)=>{o||(o=!0,null!==r&&(clearTimeout(r),r=null),e.apply(null,t))},a=s(e),i=s(t);return{start:(...e)=>{o||null!==r||(r=setTimeout((()=>i.apply(null,e)),n))},resolve:a,reject:i}})(e,a);t[n]=i.resolve,Us.ScriptLoader.loadScript(o).then((()=>i.start(s)),(()=>i.reject(r)))}));return e[n]=a,a}},add:(n,o)=>{void 0!==t[n]&&(t[n](o),delete t[n]),e[n]=Promise.resolve(o)},unload:t=>{delete e[t]}}})();let hR;try{const e="__storage_test__";hR=window.localStorage,hR.setItem(e,e),hR.removeItem(e)}catch(e){hR=(()=>{let e={},t=[];const n={getItem:t=>e[t]||null,setItem:(n,o)=>{t.push(n),e[n]=String(o)},key:e=>t[e],removeItem:n=>{t=t.filter((e=>e===n)),delete e[n]},clear:()=>{t=[],e={}},length:0};return Object.defineProperty(n,"length",{get:()=>t.length,configurable:!1,enumerable:!1}),n})()}const bR={geom:{Rect:gR},util:{Delay:Gm,Tools:Bt,VK:Uu,URI:Mb,EventDispatcher:EN,Observable:RN,I18n:$s,LocalStorage:hR,ImageUploader:e=>{const t=dy(),n=fy(e,t);return{upload:(t,o=!0)=>n.upload(t,o?my(e):void 0)}}},dom:{EventUtils:Rs,TreeWalker:Xo,TextSeeker:ca,DOMUtils:Is,ScriptLoader:Us,RangeUtils:pm,Serializer:Mv,StyleSheetLoader:Go,ControlSelection:zu,BookmarkManager:Tu,Selection:Dv,Event:Rs.Event},html:{Styles:ys,Entities:ls,Node:yf,Schema:vs,DomParser:Wb,Writer:Nf,Serializer:Rf},Env:Nt,AddOnManager:qs,Annotator:Ou,Formatter:Sy,UndoManager:Ey,EditorCommands:vN,WindowManager:ty,NotificationManager:Jv,EditorObservable:LN,Shortcuts:WN,Editor:QN,FocusManager:Km,EditorManager:iR,DOM:Is.DOM,ScriptLoader:Us.ScriptLoader,PluginManager:Zv,ThemeManager:ey,ModelManager:qv,IconManager:$v,Resource:pR,FakeClipboard:lR,trim:Bt.trim,isArray:Bt.isArray,is:Bt.is,toArray:Bt.toArray,makeMap:Bt.makeMap,each:Bt.each,map:Bt.map,grep:Bt.grep,inArray:Bt.inArray,extend:Bt.extend,walk:Bt.walk,resolve:Bt.resolve,explode:Bt.explode,_addCacheSuffix:Bt._addCacheSuffix},vR=Bt.extend(iR,bR);(e=>{window.tinymce=e,window.tinyMCE=e})(vR),(e=>{if("object"==typeof module)try{module.exports=e}catch(e){}})(vR)}();
\ No newline at end of file
+!function(){"use strict";var e=function(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},t=function(e){return{eq:e}},n=t((function(e,t){return e===t})),o=function(e){return t((function(t,n){if(t.length!==n.length)return!1;for(var o=t.length,r=0;r<o;r++)if(!e.eq(t[r],n[r]))return!1;return!0}))},r=function(e){return t((function(r,s){var a=Object.keys(r),i=Object.keys(s);if(!function(e,n){return function(e,n){return t((function(t,o){return e.eq(n(t),n(o))}))}(o(e),(function(e){return function(e,t){return Array.prototype.slice.call(e).sort(t)}(e,n)}))}(n).eq(a,i))return!1;for(var l=a.length,d=0;d<l;d++){var c=a[d];if(!e.eq(r[c],s[c]))return!1}return!0}))},s=t((function(t,n){if(t===n)return!0;var a=e(t);return a===e(n)&&(function(e){return-1!==["undefined","boolean","number","string","function","xml","null"].indexOf(e)}(a)?t===n:"array"===a?o(s).eq(t,n):"object"===a&&r(s).eq(t,n))}));const a=Object.getPrototypeOf,i=(e,t,n)=>{var o;return!!n(e,t.prototype)||(null===(o=e.constructor)||void 0===o?void 0:o.name)===t.name},l=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&i(e,String,((e,t)=>t.isPrototypeOf(e)))?"string":t})(t)===e,d=e=>t=>typeof t===e,c=e=>t=>e===t,u=(e,t)=>f(e)&&i(e,t,((e,t)=>a(e)===t)),m=l("string"),f=l("object"),g=e=>u(e,Object),p=l("array"),h=c(null),b=d("boolean"),v=c(void 0),y=e=>null==e,C=e=>!y(e),x=d("function"),w=d("number"),k=(e,t)=>{if(p(e)){for(let n=0,o=e.length;n<o;++n)if(!t(e[n]))return!1;return!0}return!1},S=()=>{},_=(e,t)=>(...n)=>e(t.apply(null,n)),E=(e,t)=>n=>e(t(n)),N=e=>()=>e,R=e=>e,A=(e,t)=>e===t;function O(e,...t){return(...n)=>{const o=t.concat(n);return e.apply(null,o)}}const T=e=>t=>!e(t),B=e=>e(),D=e=>{e()},L=N(!1),P=N(!0);class M{constructor(e,t){this.tag=e,this.value=t}static some(e){return new M(!0,e)}static none(){return M.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?M.some(e(this.value)):M.none()}bind(e){return this.tag?e(this.value):M.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:M.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return C(e)?M.some(e):M.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}M.singletonNone=new M(!1);const I=Array.prototype.slice,F=Array.prototype.indexOf,U=Array.prototype.push,z=(e,t)=>F.call(e,t),j=(e,t)=>z(e,t)>-1,V=(e,t)=>{for(let n=0,o=e.length;n<o;n++)if(t(e[n],n))return!0;return!1},H=(e,t)=>{const n=e.length,o=new Array(n);for(let r=0;r<n;r++){const n=e[r];o[r]=t(n,r)}return o},$=(e,t)=>{for(let n=0,o=e.length;n<o;n++)t(e[n],n)},q=(e,t)=>{for(let n=e.length-1;n>=0;n--)t(e[n],n)},W=(e,t)=>{const n=[],o=[];for(let r=0,s=e.length;r<s;r++){const s=e[r];(t(s,r)?n:o).push(s)}return{pass:n,fail:o}},K=(e,t)=>{const n=[];for(let o=0,r=e.length;o<r;o++){const r=e[o];t(r,o)&&n.push(r)}return n},G=(e,t,n)=>(q(e,((e,o)=>{n=t(n,e,o)})),n),Y=(e,t,n)=>($(e,((e,o)=>{n=t(n,e,o)})),n),X=(e,t,n)=>{for(let o=0,r=e.length;o<r;o++){const r=e[o];if(t(r,o))return M.some(r);if(n(r,o))break}return M.none()},Q=(e,t)=>X(e,t,L),J=(e,t)=>{for(let n=0,o=e.length;n<o;n++)if(t(e[n],n))return M.some(n);return M.none()},Z=e=>{const t=[];for(let n=0,o=e.length;n<o;++n){if(!p(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);U.apply(t,e[n])}return t},ee=(e,t)=>Z(H(e,t)),te=(e,t)=>{for(let n=0,o=e.length;n<o;++n)if(!0!==t(e[n],n))return!1;return!0},ne=e=>{const t=I.call(e,0);return t.reverse(),t},oe=(e,t)=>K(e,(e=>!j(t,e))),re=(e,t)=>{const n={};for(let o=0,r=e.length;o<r;o++){const r=e[o];n[String(r)]=t(r,o)}return n},se=(e,t)=>{const n=I.call(e,0);return n.sort(t),n},ae=(e,t)=>t>=0&&t<e.length?M.some(e[t]):M.none(),ie=e=>ae(e,0),le=e=>ae(e,e.length-1),de=x(Array.from)?Array.from:e=>I.call(e),ce=(e,t)=>{for(let n=0;n<e.length;n++){const o=t(e[n],n);if(o.isSome())return o}return M.none()},ue=Object.keys,me=Object.hasOwnProperty,fe=(e,t)=>{const n=ue(e);for(let o=0,r=n.length;o<r;o++){const r=n[o];t(e[r],r)}},ge=(e,t)=>pe(e,((e,n)=>({k:n,v:t(e,n)}))),pe=(e,t)=>{const n={};return fe(e,((e,o)=>{const r=t(e,o);n[r.k]=r.v})),n},he=e=>(t,n)=>{e[n]=t},be=(e,t,n,o)=>(fe(e,((e,r)=>{(t(e,r)?n:o)(e,r)})),{}),ve=(e,t)=>{const n={};return be(e,t,he(n),S),n},ye=(e,t)=>{const n=[];return fe(e,((e,o)=>{n.push(t(e,o))})),n},Ce=e=>ye(e,R),xe=(e,t)=>we(e,t)?M.from(e[t]):M.none(),we=(e,t)=>me.call(e,t),ke=(e,t)=>we(e,t)&&void 0!==e[t]&&null!==e[t],Se=e=>{const t={};return $(e,(e=>{t[e]={}})),ue(t)},_e=Array.isArray,Ee=(e,t,n)=>{let o,r;if(!e)return!1;if(n=n||e,void 0!==e.length){for(o=0,r=e.length;o<r;o++)if(!1===t.call(n,e[o],o,e))return!1}else for(o in e)if(we(e,o)&&!1===t.call(n,e[o],o,e))return!1;return!0},Ne=(e,t)=>{const n=[];return Ee(e,((o,r)=>{n.push(t(o,r,e))})),n},Re=(e,t)=>{const n=[];return Ee(e,((o,r)=>{t&&!t(o,r,e)||n.push(o)})),n},Ae=(e,t)=>{if(e)for(let n=0,o=e.length;n<o;n++)if(e[n]===t)return n;return-1},Oe=(e,t,n,o)=>{let r=v(n)?e[0]:n;for(let n=0;n<e.length;n++)r=t.call(o,r,e[n],n);return r},Te=(e,t,n)=>{let o,r;for(o=0,r=e.length;o<r;o++)if(t.call(n,e[o],o,e))return o;return-1},Be=e=>e[e.length-1],De=e=>{let t,n=!1;return(...o)=>(n||(n=!0,t=e.apply(null,o)),t)},Le=()=>Pe(0,0),Pe=(e,t)=>({major:e,minor:t}),Me={nu:Pe,detect:(e,t)=>{const n=String(t).toLowerCase();return 0===e.length?Le():((e,t)=>{const n=((e,t)=>{for(let n=0;n<e.length;n++){const o=e[n];if(o.test(t))return o}})(e,t);if(!n)return{major:0,minor:0};const o=e=>Number(t.replace(n,"$"+e));return Pe(o(1),o(2))})(e,n)},unknown:Le},Ie=(e,t)=>{const n=String(t).toLowerCase();return Q(e,(e=>e.search(n)))},Fe=(e,t,n)=>""===t||e.length>=t.length&&e.substr(n,n+t.length)===t,Ue=(e,t)=>-1!==e.indexOf(t),ze=(e,t)=>Fe(e,t,0),je=(e,t)=>Fe(e,t,e.length-t.length),Ve=e=>t=>t.replace(e,""),He=Ve(/^\s+|\s+$/g),$e=Ve(/^\s+/g),qe=Ve(/\s+$/g),We=e=>e.length>0,Ke=e=>!We(e),Ge=(e,t=10)=>{const n=parseInt(e,t);return isNaN(n)?M.none():M.some(n)},Ye=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,Xe=e=>t=>Ue(t,e),Qe=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>Ue(e,"edge/")&&Ue(e,"chrome")&&Ue(e,"safari")&&Ue(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,Ye],search:e=>Ue(e,"chrome")&&!Ue(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>Ue(e,"msie")||Ue(e,"trident")},{name:"Opera",versionRegexes:[Ye,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Xe("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Xe("firefox")},{name:"Safari",versionRegexes:[Ye,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(Ue(e,"safari")||Ue(e,"mobile/"))&&Ue(e,"applewebkit")}],Je=[{name:"Windows",search:Xe("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>Ue(e,"iphone")||Ue(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Xe("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:Xe("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Xe("linux"),versionRegexes:[]},{name:"Solaris",search:Xe("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Xe("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:Xe("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],Ze={browsers:N(Qe),oses:N(Je)},et="Edge",tt="Chromium",nt="Opera",ot="Firefox",rt="Safari",st=e=>{const t=e.current,n=e.version,o=e=>()=>t===e;return{current:t,version:n,isEdge:o(et),isChromium:o(tt),isIE:o("IE"),isOpera:o(nt),isFirefox:o(ot),isSafari:o(rt)}},at=()=>st({current:void 0,version:Me.unknown()}),it=st,lt=(N(et),N(tt),N("IE"),N(nt),N(ot),N(rt),"Windows"),dt="Android",ct="Linux",ut="macOS",mt="Solaris",ft="FreeBSD",gt="ChromeOS",pt=e=>{const t=e.current,n=e.version,o=e=>()=>t===e;return{current:t,version:n,isWindows:o(lt),isiOS:o("iOS"),isAndroid:o(dt),isMacOS:o(ut),isLinux:o(ct),isSolaris:o(mt),isFreeBSD:o(ft),isChromeOS:o(gt)}},ht=()=>pt({current:void 0,version:Me.unknown()}),bt=pt,vt=(N(lt),N("iOS"),N(dt),N(ct),N(ut),N(mt),N(ft),N(gt),e=>window.matchMedia(e).matches);let yt=De((()=>((e,t,n)=>{const o=Ze.browsers(),r=Ze.oses(),s=t.bind((e=>((e,t)=>ce(t.brands,(t=>{const n=t.brand.toLowerCase();return Q(e,(e=>{var t;return n===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:Me.nu(parseInt(t.version,10),0)})))})))(o,e))).orThunk((()=>((e,t)=>Ie(e,t).map((e=>{const n=Me.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(o,e))).fold(at,it),a=((e,t)=>Ie(e,t).map((e=>{const n=Me.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(r,e).fold(ht,bt),i=((e,t,n,o)=>{const r=e.isiOS()&&!0===/ipad/i.test(n),s=e.isiOS()&&!r,a=e.isiOS()||e.isAndroid(),i=a||o("(pointer:coarse)"),l=r||!s&&a&&o("(min-device-width:768px)"),d=s||a&&!l,c=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(n),u=!d&&!l&&!c;return{isiPad:N(r),isiPhone:N(s),isTablet:N(l),isPhone:N(d),isTouch:N(i),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:N(c),isDesktop:N(u)}})(a,s,e,n);return{browser:s,os:a,deviceType:i}})(navigator.userAgent,M.from(navigator.userAgentData),vt)));const Ct=()=>yt(),xt=navigator.userAgent,wt=Ct(),kt=wt.browser,St=wt.os,_t=wt.deviceType,Et=-1!==xt.indexOf("Windows Phone"),Nt={transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",documentMode:kt.isIE()?document.documentMode||7:10,cacheSuffix:null,container:null,canHaveCSP:!kt.isIE(),windowsPhone:Et,browser:{current:kt.current,version:kt.version,isChromium:kt.isChromium,isEdge:kt.isEdge,isFirefox:kt.isFirefox,isIE:kt.isIE,isOpera:kt.isOpera,isSafari:kt.isSafari},os:{current:St.current,version:St.version,isAndroid:St.isAndroid,isChromeOS:St.isChromeOS,isFreeBSD:St.isFreeBSD,isiOS:St.isiOS,isLinux:St.isLinux,isMacOS:St.isMacOS,isSolaris:St.isSolaris,isWindows:St.isWindows},deviceType:{isDesktop:_t.isDesktop,isiPad:_t.isiPad,isiPhone:_t.isiPhone,isPhone:_t.isPhone,isTablet:_t.isTablet,isTouch:_t.isTouch,isWebView:_t.isWebView}},Rt=/^\s*|\s*$/g,At=e=>null==e?"":(""+e).replace(Rt,""),Ot=(e,t)=>t?!("array"!==t||!_e(e))||typeof e===t:void 0!==e,Tt=function(e,t,n,o){o=o||this,e&&(n&&(e=e[n]),Ee(e,((e,r)=>{if(!1===t.call(o,e,r,n))return!1;Tt(e,t,n,o)})))},Bt={trim:At,isArray:_e,is:Ot,toArray:e=>{if(_e(e))return e;{const t=[];for(let n=0,o=e.length;n<o;n++)t[n]=e[n];return t}},makeMap:(e,t,n)=>{let o;for(t=t||",","string"==typeof(e=e||[])&&(e=e.split(t)),n=n||{},o=e.length;o--;)n[e[o]]={};return n},each:Ee,map:Ne,grep:Re,inArray:Ae,hasOwn:we,extend:(e,...t)=>{for(let n=0;n<t.length;n++){const o=t[n];for(const t in o)if(we(o,t)){const n=o[t];void 0!==n&&(e[t]=n)}}return e},walk:Tt,resolve:(e,t)=>{let n,o;for(t=t||window,n=0,o=(e=e.split(".")).length;n<o&&(t=t[e[n]]);n++);return t},explode:(e,t)=>!e||Ot(e,"array")?e:Ne(e.split(t||","),At),_addCacheSuffix:e=>{const t=Nt.cacheSuffix;return t&&(e+=(-1===e.indexOf("?")?"?":"&")+t),e}},Dt=(e,t,n=A)=>e.exists((e=>n(e,t))),Lt=(e,t,n)=>e.isSome()&&t.isSome()?M.some(n(e.getOrDie(),t.getOrDie())):M.none(),Pt=(e,t)=>e?M.some(t):M.none();"undefined"!=typeof window?window:Function("return this;")();const Mt=e=>e.dom.nodeName.toLowerCase(),It=e=>e.dom.nodeType,Ft=e=>t=>It(t)===e,Ut=Ft(1),zt=Ft(3),jt=Ft(9),Vt=Ft(11),Ht=(e,t,n)=>{if(!(m(n)||b(n)||w(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+"")},$t=(e,t,n)=>{Ht(e.dom,t,n)},qt=(e,t)=>{const n=e.dom;fe(t,((e,t)=>{Ht(n,t,e)}))},Wt=(e,t)=>{const n=e.dom.getAttribute(t);return null===n?void 0:n},Kt=(e,t)=>M.from(Wt(e,t)),Gt=(e,t)=>{const n=e.dom;return!(!n||!n.hasAttribute)&&n.hasAttribute(t)},Yt=(e,t)=>{e.dom.removeAttribute(t)},Xt=e=>Y(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}),Qt=(e,t)=>{const n=Wt(e,t);return void 0===n||""===n?[]:n.split(" ")},Jt=e=>void 0!==e.dom.classList,Zt=e=>Qt(e,"class"),en=(e,t)=>((e,t,n)=>{const o=Qt(e,t).concat([n]);return $t(e,t,o.join(" ")),!0})(e,"class",t),tn=(e,t)=>((e,t,n)=>{const o=K(Qt(e,t),(e=>e!==n));return o.length>0?$t(e,t,o.join(" ")):Yt(e,t),!1})(e,"class",t),nn=(e,t)=>{Jt(e)?e.dom.classList.add(t):en(e,t)},on=e=>{0===(Jt(e)?e.dom.classList:Zt(e)).length&&Yt(e,"class")},rn=(e,t)=>{Jt(e)?e.dom.classList.remove(t):tn(e,t),on(e)},sn=(e,t)=>Jt(e)&&e.dom.classList.contains(t),an=e=>void 0!==e.style&&x(e.style.getPropertyValue),ln=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},dn=(e,t)=>{const n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||n.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return ln(n.childNodes[0])},cn=(e,t)=>{const n=(t||document).createElement(e);return ln(n)},un=(e,t)=>{const n=(t||document).createTextNode(e);return ln(n)},mn=ln,fn=(e,t,n)=>M.from(e.dom.elementFromPoint(t,n)).map(ln),gn=(e,t)=>{const n=[],o=e=>(n.push(e),t(e));let r=t(e);do{r=r.bind(o)}while(r.isSome());return n},pn=(e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},hn=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,bn=(e,t)=>e.dom===t.dom,vn=(e,t)=>{const n=e.dom,o=t.dom;return n!==o&&n.contains(o)},yn=e=>mn(e.dom.ownerDocument),Cn=e=>jt(e)?e:yn(e),xn=e=>mn(Cn(e).dom.defaultView),wn=e=>M.from(e.dom.parentNode).map(mn),kn=e=>M.from(e.dom.previousSibling).map(mn),Sn=e=>M.from(e.dom.nextSibling).map(mn),_n=e=>ne(gn(e,kn)),En=e=>gn(e,Sn),Nn=e=>H(e.dom.childNodes,mn),Rn=(e,t)=>{const n=e.dom.childNodes;return M.from(n[t]).map(mn)},An=e=>Rn(e,0),On=e=>Rn(e,e.dom.childNodes.length-1),Tn=e=>e.dom.childNodes.length,Bn=e=>Vt(e)&&C(e.dom.host),Dn=x(Element.prototype.attachShadow)&&x(Node.prototype.getRootNode),Ln=N(Dn),Pn=Dn?e=>mn(e.dom.getRootNode()):Cn,Mn=e=>Bn(e)?e:(e=>{const t=e.dom.head;if(null==t)throw new Error("Head is not available yet");return mn(t)})(Cn(e)),In=e=>mn(e.dom.host),Fn=e=>{if(Ln()&&C(e.target)){const t=mn(e.target);if(Ut(t)&&Un(t)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return ie(t)}}return M.from(e.target)},Un=e=>C(e.dom.shadowRoot),zn=e=>{const t=zt(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const n=t.ownerDocument;return(e=>{const t=Pn(e);return Bn(t)?M.some(t):M.none()})(mn(t)).fold((()=>n.body.contains(t)),E(zn,In))},jn=(e,t,n)=>{if(!m(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);an(e)&&e.style.setProperty(t,n)},Vn=(e,t,n)=>{const o=e.dom;jn(o,t,n)},Hn=(e,t)=>{const n=e.dom;fe(t,((e,t)=>{jn(n,t,e)}))},$n=(e,t)=>{const n=e.dom,o=window.getComputedStyle(n).getPropertyValue(t);return""!==o||zn(e)?o:qn(n,t)},qn=(e,t)=>an(e)?e.style.getPropertyValue(t):"",Wn=(e,t)=>{const n=e.dom,o=qn(n,t);return M.from(o).filter((e=>e.length>0))},Kn=e=>{const t={},n=e.dom;if(an(n))for(let e=0;e<n.style.length;e++){const o=n.style.item(e);t[o]=n.style[o]}return t},Gn=(e,t)=>{((e,t)=>{an(e)&&e.style.removeProperty(t)})(e.dom,t),Dt(Kt(e,"style").map(He),"")&&Yt(e,"style")},Yn=(e,t)=>{wn(e).each((n=>{n.dom.insertBefore(t.dom,e.dom)}))},Xn=(e,t)=>{Sn(e).fold((()=>{wn(e).each((e=>{Jn(e,t)}))}),(e=>{Yn(e,t)}))},Qn=(e,t)=>{An(e).fold((()=>{Jn(e,t)}),(n=>{e.dom.insertBefore(t.dom,n.dom)}))},Jn=(e,t)=>{e.dom.appendChild(t.dom)},Zn=(e,t)=>{$(t,(t=>{Jn(e,t)}))},eo=e=>{e.dom.textContent="",$(Nn(e),(e=>{to(e)}))},to=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},no=e=>{const t=Nn(e);var n,o;t.length>0&&(n=e,$(o=t,((e,t)=>{const r=0===t?n:o[t-1];Xn(r,e)}))),to(e)},oo=e=>e.dom.innerHTML,ro=(e,t)=>{const n=yn(e).dom,o=mn(n.createDocumentFragment()),r=((e,t)=>{const n=(t||document).createElement("div");return n.innerHTML=e,Nn(mn(n))})(t,n);Zn(o,r),eo(e),Jn(e,o)},so=(e,t,n,o)=>((e,t,n,o,r)=>{const s=((e,t)=>n=>{e(n)&&t((e=>{const t=mn(Fn(e).getOr(e.target)),n=()=>e.stopPropagation(),o=()=>e.preventDefault(),r=_(o,n);return((e,t,n,o,r,s,a)=>({target:e,x:t,y:n,stop:o,prevent:r,kill:s,raw:a}))(t,e.clientX,e.clientY,n,o,r,e)})(n))})(n,o);return e.dom.addEventListener(t,s,false),{unbind:O(ao,e,t,s,false)}})(e,t,n,o),ao=(e,t,n,o)=>{e.dom.removeEventListener(t,n,o)},io=(e,t)=>({left:e,top:t,translate:(n,o)=>io(e+n,t+o)}),lo=io,co=(e,t)=>void 0!==e?e:void 0!==t?t:0,uo=e=>{const t=e.dom,n=t.ownerDocument.body;return n===t?lo(n.offsetLeft,n.offsetTop):zn(e)?(e=>{const t=e.getBoundingClientRect();return lo(t.left,t.top)})(t):lo(0,0)},mo=e=>{const t=void 0!==e?e.dom:document,n=t.body.scrollLeft||t.documentElement.scrollLeft,o=t.body.scrollTop||t.documentElement.scrollTop;return lo(n,o)},fo=(e,t,n)=>{const o=(void 0!==n?n.dom:document).defaultView;o&&o.scrollTo(e,t)},go=(e,t)=>{Ct().browser.isSafari()&&x(e.dom.scrollIntoViewIfNeeded)?e.dom.scrollIntoViewIfNeeded(!1):e.dom.scrollIntoView(t)},po=(e,t,n,o)=>({x:e,y:t,width:n,height:o,right:e+n,bottom:t+o}),ho=e=>{const t=void 0===e?window:e,n=t.document,o=mo(mn(n));return(e=>{const t=void 0===e?window:e;return Ct().browser.isFirefox()?M.none():M.from(t.visualViewport)})(t).fold((()=>{const e=t.document.documentElement,n=e.clientWidth,r=e.clientHeight;return po(o.left,o.top,n,r)}),(e=>po(Math.max(e.pageLeft,o.left),Math.max(e.pageTop,o.top),e.width,e.height)))},bo=e=>t=>!!t&&t.nodeType===e,vo=e=>!!e&&!Object.getPrototypeOf(e),yo=bo(1),Co=e=>{const t=e.map((e=>e.toLowerCase()));return e=>{if(e&&e.nodeName){const n=e.nodeName.toLowerCase();return j(t,n)}return!1}},xo=(e,t)=>{const n=t.toLowerCase().split(" ");return t=>{if(yo(t))for(let o=0;o<n.length;o++){const r=t.ownerDocument.defaultView.getComputedStyle(t,null);if((r?r.getPropertyValue(e):null)===n[o])return!0}return!1}},wo=e=>t=>yo(t)&&t.hasAttribute(e),ko=e=>yo(e)&&e.hasAttribute("data-mce-bogus"),So=e=>yo(e)&&"TABLE"===e.tagName,_o=e=>t=>{if(yo(t)){if(t.contentEditable===e)return!0;if(t.getAttribute("data-mce-contenteditable")===e)return!0}return!1},Eo=Co(["textarea","input"]),No=bo(3),Ro=bo(4),Ao=bo(7),Oo=bo(8),To=bo(9),Bo=bo(11),Do=Co(["br"]),Lo=Co(["img"]),Po=_o("true"),Mo=_o("false"),Io=Co(["td","th"]),Fo=Co(["video","audio","object","embed"]),Uo=Ct().browser,zo=e=>Q(e,Ut),jo=(e,t)=>e.children&&j(e.children,t);var Vo=(e,t,n,o,r)=>e(n,o)?M.some(n):x(r)&&r(n)?M.none():t(n,o,r);const Ho=(e,t,n)=>{let o=e.dom;const r=x(n)?n:L;for(;o.parentNode;){o=o.parentNode;const e=mn(o);if(t(e))return M.some(e);if(r(e))break}return M.none()},$o=(e,t,n)=>Vo(((e,t)=>t(e)),Ho,e,t,n),qo=(e,t,n)=>Ho(e,(e=>pn(e,t)),n),Wo=(e,t)=>((e,t)=>{const n=void 0===t?document:t.dom;return hn(n)?M.none():M.from(n.querySelector(e)).map(mn)})(t,e),Ko=(e,t,n)=>Vo(((e,t)=>pn(e,t)),qo,e,t,n),Go=(e,t={})=>{let n=0;const o={},r=mn(e),s=Cn(r),a=t.maxLoadTime||5e3,i=i=>new Promise(((l,d)=>{let c;const u=Bt._addCacheSuffix(i),m=(e=>xe(o,e).getOrThunk((()=>({id:"mce-u"+n++,passed:[],failed:[],count:0}))))(u);o[u]=m,m.count++;const f=(e,t)=>{$(e,D),m.status=t,m.passed=[],m.failed=[],c&&(c.onload=null,c.onerror=null,c=null)},g=()=>f(m.passed,2),p=()=>f(m.failed,3),h=()=>{var t;t=h,(()=>{const t=e.styleSheets;let n=t.length;for(;n--;){const e=t[n].ownerNode;if(e&&e.id===c.id)return g(),!0}return!1})()||(Date.now()-v<a?setTimeout(t):p())};if(l&&m.passed.push(l),d&&m.failed.push(d),1===m.status)return;if(2===m.status)return void g();if(3===m.status)return void p();m.status=1;const b=cn("link",s.dom);qt(b,{rel:"stylesheet",type:"text/css",id:m.id});const v=Date.now();var y;t.contentCssCors&&$t(b,"crossOrigin","anonymous"),t.referrerPolicy&&$t(b,"referrerpolicy",t.referrerPolicy),c=b.dom,c.onload=h,c.onerror=p,y=b,Jn(Mn(r),y),$t(b,"href",u)})),l=e=>{const t=Bt._addCacheSuffix(e);xe(o,t).each((e=>{0==--e.count&&(delete o[t],(e=>{const t=Mn(r);Wo(t,"#"+e).each(to)})(e.id))}))};return{load:i,loadAll:e=>Promise.allSettled(H(e,(e=>i(e).then(N(e))))).then((e=>{const t=W(e,(e=>"fulfilled"===e.status));return t.fail.length>0?Promise.reject(H(t.fail,(e=>e.reason))):H(t.pass,(e=>e.value))})),unload:l,unloadAll:e=>{$(e,(e=>{l(e)}))},_setReferrerPolicy:e=>{t.referrerPolicy=e}}},Yo=(()=>{const e=new WeakMap;return{forElement:(t,n)=>{const o=Pn(t).dom;return M.from(e.get(o)).getOrThunk((()=>{const t=Go(o,n);return e.set(o,t),t}))}}})();class Xo{constructor(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)}current(){return this.node}next(e){return this.node=this.findSibling(this.node,"firstChild","nextSibling",e),this.node}prev(e){return this.node=this.findSibling(this.node,"lastChild","previousSibling",e),this.node}prev2(e){return this.node=this.findPreviousNode(this.node,"lastChild","previousSibling",e),this.node}findSibling(e,t,n,o){let r,s;if(e){if(!o&&e[t])return e[t];if(e!==this.rootNode){if(r=e[n],r)return r;for(s=e.parentNode;s&&s!==this.rootNode;s=s.parentNode)if(r=s[n],r)return r}}}findPreviousNode(e,t,n,o){let r,s,a;if(e){if(r=e[n],this.rootNode&&r===this.rootNode)return;if(r){if(!o)for(a=r[t];a;a=a[t])if(!a[t])return a;return r}if(s=e.parentNode,s&&s!==this.rootNode)return s}}}const Qo=e=>{let t;return n=>(t=t||re(e,P),we(t,Mt(n)))},Jo=Qo(["h1","h2","h3","h4","h5","h6"]),Zo=Qo(["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"]),er=e=>Ut(e)&&!Zo(e),tr=e=>Ut(e)&&"br"===Mt(e),nr=Qo(["h1","h2","h3","h4","h5","h6","p","div","address","pre","form","blockquote","center","dir","fieldset","header","footer","article","section","hgroup","aside","nav","figure"]),or=Qo(["ul","ol","dl"]),rr=Qo(["li","dd","dt"]),sr=Qo(["thead","tbody","tfoot"]),ar=Qo(["td","th"]),ir=Qo(["pre","script","textarea","style"]),lr="\ufeff",dr="\xa0",cr=e=>e===lr,ur=lr,mr=cr,fr=e=>e.replace(/\uFEFF/g,""),gr=yo,pr=No,hr=e=>(pr(e)&&(e=e.parentNode),gr(e)&&e.hasAttribute("data-mce-caret")),br=e=>pr(e)&&mr(e.data),vr=e=>hr(e)||br(e),yr=e=>e.firstChild!==e.lastChild||!Do(e.firstChild),Cr=e=>{const t=e.container();return!!No(t)&&(t.data.charAt(e.offset())===ur||e.isAtStart()&&br(t.previousSibling))},xr=e=>{const t=e.container();return!!No(t)&&(t.data.charAt(e.offset()-1)===ur||e.isAtEnd()&&br(t.nextSibling))},wr=e=>pr(e)&&e.data[0]===ur,kr=e=>pr(e)&&e.data[e.data.length-1]===ur,Sr=e=>e&&e.hasAttribute("data-mce-caret")?((e=>{const t=e.getElementsByTagName("br"),n=t[t.length-1];ko(n)&&n.parentNode.removeChild(n)})(e),e.removeAttribute("data-mce-caret"),e.removeAttribute("data-mce-bogus"),e.removeAttribute("style"),e.removeAttribute("data-mce-style"),e.removeAttribute("_moz_abspos"),e):null,_r=e=>hr(e.startContainer),Er=Po,Nr=Mo,Rr=Do,Ar=No,Or=Co(["script","style","textarea"]),Tr=Co(["img","input","textarea","hr","iframe","video","audio","object","embed"]),Br=Co(["table"]),Dr=vr,Lr=e=>!Dr(e)&&(Ar(e)?!Or(e.parentNode):Tr(e)||Rr(e)||Br(e)||Pr(e)),Pr=e=>!1===(e=>yo(e)&&"true"===e.getAttribute("unselectable"))(e)&&Nr(e),Mr=(e,t)=>Lr(e)&&((e,t)=>{for(e=e.parentNode;e&&e!==t;e=e.parentNode){if(Pr(e))return!1;if(Er(e))return!0}return!0})(e,t),Ir=/^[ \t\r\n]*$/,Fr=e=>Ir.test(e),Ur=e=>"\n"===e||"\r"===e,zr=(e,t=4,n=!0,o=!0)=>{const r=((e,t)=>t<=0?"":new Array(t+1).join(" "))(0,t),s=e.replace(/\t/g,r),a=Y(s,((e,t)=>(e=>-1!==" \f\t\v".indexOf(e))(t)||t===dr?e.pcIsSpace||""===e.str&&n||e.str.length===s.length-1&&o||((e,t)=>t<e.length&&t>=0&&Ur(e[t]))(s,e.str.length+1)?{pcIsSpace:!1,str:e.str+dr}:{pcIsSpace:!0,str:e.str+" "}:{pcIsSpace:Ur(t),str:e.str+t}),{pcIsSpace:!1,str:""});return a.str},jr=(e,t)=>Lr(e)&&!1===((e,t)=>No(e)&&Fr(e.data)&&!1===((e,t)=>{const n=mn(t);return o=mn(e),r=O(bn,n),qo(o,"pre,code",r).isSome();var o,r})(e,t))(e,t)||(e=>yo(e)&&"A"===e.nodeName&&!e.hasAttribute("href")&&(e.hasAttribute("name")||e.hasAttribute("id")))(e)||Vr(e),Vr=wo("data-mce-bookmark"),Hr=wo("data-mce-bogus"),$r=("data-mce-bogus","all",e=>yo(e)&&"all"===e.getAttribute("data-mce-bogus"));const qr=(e,t=!0)=>((e,t)=>{let n=0;if(jr(e,e))return!1;{let o=e.firstChild;if(!o)return!0;const r=new Xo(o,e);do{if(t){if($r(o)){o=r.next(!0);continue}if(Hr(o)){o=r.next();continue}}if(Do(o))n++,o=r.next();else{if(jr(o,e))return!1;o=r.next()}}while(o);return n<=1}})(e.dom,t),Wr=(e,t)=>C(e)&&(jr(e,t)||er(mn(e))),Kr=e=>(e=>"span"===e.nodeName.toLowerCase())(e)&&"bookmark"===e.getAttribute("data-mce-type"),Gr=(e,t,n)=>{const o=n||t;if(yo(t)&&Kr(t))return t;const r=t.childNodes;for(let t=r.length-1;t>=0;t--)Gr(e,r[t],o);if(yo(t)){const e=t.childNodes;1===e.length&&Kr(e[0])&&t.parentNode.insertBefore(e[0],t)}return(e=>Bo(e)||To(e))(t)||jr(t,o)||(e=>!!yo(e)&&e.childNodes.length>0)(t)||((e,t)=>No(e)&&e.data.length>0&&((e,t)=>{const n=new Xo(e,t).prev(!1),o=new Xo(e,t).next(!1),r=v(n)||Wr(n,t),s=v(o)||Wr(o,t);return r&&s})(e,t))(t,o)||e.remove(t),t},Yr=Bt.makeMap,Xr=/[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Qr=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Jr=/[<>&\"\']/g,Zr=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,es={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"},ts={'"':"&quot;","'":"&#39;","<":"&lt;",">":"&gt;","&":"&amp;","`":"&#96;"},ns={"&lt;":"<","&gt;":">","&amp;":"&","&quot;":'"',"&apos;":"'"},os=(e,t)=>{let n,o,r;const s={};if(e){for(e=e.split(","),t=t||10,n=0;n<e.length;n+=2)o=String.fromCharCode(parseInt(e[n],t)),ts[o]||(r="&"+e[n+1]+";",s[o]=r,s[r]=o);return s}},rs=os("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),ss=(e,t)=>e.replace(t?Xr:Qr,(e=>ts[e]||e)),as=(e,t)=>e.replace(t?Xr:Qr,(e=>e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":ts[e]||"&#"+e.charCodeAt(0)+";")),is=(e,t,n)=>(n=n||rs,e.replace(t?Xr:Qr,(e=>ts[e]||n[e]||e))),ls={encodeRaw:ss,encodeAllRaw:e=>(""+e).replace(Jr,(e=>ts[e]||e)),encodeNumeric:as,encodeNamed:is,getEncodeFunc:(e,t)=>{const n=os(t)||rs,o=Yr(e.replace(/\+/g,","));return o.named&&o.numeric?(e,t)=>e.replace(t?Xr:Qr,(e=>void 0!==ts[e]?ts[e]:void 0!==n[e]?n[e]:e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":"&#"+e.charCodeAt(0)+";")):o.named?t?(e,t)=>is(e,t,n):is:o.numeric?as:ss},decode:e=>e.replace(Zr,((e,t)=>t?(t="x"===t.charAt(0).toLowerCase()?parseInt(t.substr(1),16):parseInt(t,10))>65535?(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t))):es[t]||String.fromCharCode(t):ns[e]||rs[e]||(e=>{const t=cn("div").dom;return t.innerHTML=e,t.textContent||t.innerText||e})(e)))},ds={},cs={},us=Bt.makeMap,ms=Bt.each,fs=Bt.extend,gs=Bt.explode,ps=Bt.inArray,hs=(e,t)=>(e=Bt.trim(e))?e.split(t||" "):[],bs=(e,t)=>{const n=us(e," ",us(e.toUpperCase()," "));return fs(n,t)},vs=e=>bs("td th li dt dd figcaption caption details summary",e.getTextBlockElements()),ys=(e,t)=>{let n;return e&&(n={},"string"==typeof e&&(e={"*":e}),ms(e,((e,o)=>{n[o]=n[o.toUpperCase()]="map"===t?us(e,/[, ]/):gs(e,/[, ]/)}))),n},Cs=e=>{var t;const n={},o={};let r=[];const s={},a={},i=(t,n,o)=>{let r=e[t];return r?r=us(r,/[, ]/,us(r.toUpperCase(),/[, ]/)):(r=ds[t],r||(r=bs(n,o),ds[t]=r)),r},l=null!==(t=(e=e||{}).schema)&&void 0!==t?t:"html5",d=(e=>{const t={};let n,o,r,s,a,i;const l=(e,o="",r="")=>{const s=hs(r),a=hs(e);let i=a.length;for(;i--;){const e=hs([n,o].join(" "));t[a[i]]={attributes:re(e,(()=>({}))),attributesOrder:e,children:re(s,N(cs))}}},d=(e,n)=>{const o=hs(e),r=hs(n);let s=o.length;for(;s--;){const e=t[o[s]];for(let t=0,n=r.length;t<n;t++)e.attributes[r[t]]={},e.attributesOrder.push(r[t])}};return ds[e]?ds[e]:(n="id accesskey class dir lang style tabindex title role",o="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"!==e&&(n+=" contenteditable contextmenu draggable dropzone hidden spellcheck translate",o+=" 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"!==e&&(n+=" xml:lang",i="acronym applet basefont big font strike tt",r=[r,i].join(" "),ms(hs(i),(e=>{l(e,"",r)})),a="center dir isindex noframes",o=[o,a].join(" "),s=[o,r].join(" "),ms(hs(a),(e=>{l(e,"",s)}))),s=s||[o,r].join(" "),l("html","manifest","head body"),l("head","","base command link meta noscript script style title"),l("title hr noscript br"),l("base","href target"),l("link","href rel media hreflang type sizes hreflang"),l("meta","name http-equiv content charset"),l("style","media type scoped"),l("script","src async defer type charset"),l("body","onafterprint onbeforeprint onbeforeunload onblur onerror onfocus onhashchange onload onmessage onoffline ononline onpagehide onpageshow onpopstate onresize onscroll onstorage onunload",s),l("address dt dd div caption","",s),l("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),l("blockquote","cite",s),l("ol","reversed start type","li"),l("ul","","li"),l("li","value",s),l("dl","","dt dd"),l("a","href target rel media hreflang type",r),l("q","cite",r),l("ins del","cite datetime",s),l("img","src sizes srcset alt usemap ismap width height"),l("iframe","src name width height",s),l("embed","src type width height"),l("object","data type typemustmatch name usemap form width height",[s,"param"].join(" ")),l("param","name value"),l("map","name",[s,"area"].join(" ")),l("area","alt coords shape href target rel media hreflang type"),l("table","border","caption colgroup thead tfoot tbody tr"+("html4"===e?" col":"")),l("colgroup","span","col"),l("col","span"),l("tbody thead tfoot","","tr"),l("tr","","td th"),l("td","colspan rowspan headers",s),l("th","colspan rowspan headers scope abbr",s),l("form","accept-charset action autocomplete enctype method name novalidate target",s),l("fieldset","disabled form name",[s,"legend"].join(" ")),l("label","form for",r),l("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"),l("button","disabled form formaction formenctype formmethod formnovalidate formtarget name type value","html4"===e?s:r),l("select","disabled form multiple name required size","option optgroup"),l("optgroup","disabled label","option"),l("option","disabled label selected value"),l("textarea","cols dirname disabled form maxlength name readonly required rows wrap"),l("menu","type label",[s,"li"].join(" ")),l("noscript","",s),"html4"!==e&&(l("wbr"),l("ruby","",[r,"rt rp"].join(" ")),l("figcaption","",s),l("mark rt rp summary bdi","",r),l("canvas","width height",s),l("video","src crossorigin poster preload autoplay mediagroup loop muted controls width height buffered",[s,"track source"].join(" ")),l("audio","src crossorigin preload autoplay mediagroup loop muted controls buffered volume",[s,"track source"].join(" ")),l("picture","","img source"),l("source","src srcset type media sizes"),l("track","kind src srclang label default"),l("datalist","",[r,"option"].join(" ")),l("article section nav aside main header footer","",s),l("hgroup","","h1 h2 h3 h4 h5 h6"),l("figure","",[s,"figcaption"].join(" ")),l("time","datetime",r),l("dialog","open",s),l("command","type label icon disabled checked radiogroup command"),l("output","for form name",r),l("progress","value max",r),l("meter","value min max low high optimum",r),l("details","open",[s,"summary"].join(" ")),l("keygen","autofocus challenge disabled form keytype name")),"html5-strict"!==e&&(d("script","language xml:space"),d("style","xml:space"),d("object","declare classid code codebase codetype archive standby align border hspace vspace"),d("embed","align name hspace vspace"),d("param","valuetype type"),d("a","charset name rev shape coords"),d("br","clear"),d("applet","codebase archive code object alt name width height align hspace vspace"),d("img","name longdesc align border hspace vspace"),d("iframe","longdesc frameborder marginwidth marginheight scrolling align"),d("font basefont","size color face"),d("input","usemap align"),d("select"),d("textarea"),d("h1 h2 h3 h4 h5 h6 div p legend caption","align"),d("ul","type compact"),d("li","type"),d("ol dl menu dir","compact"),d("pre","width xml:space"),d("hr","align noshade size width"),d("isindex","prompt"),d("table","summary width frame rules cellspacing cellpadding align bgcolor"),d("col","width align char charoff valign"),d("colgroup","width align char charoff valign"),d("thead","align char charoff valign"),d("tr","align char charoff valign bgcolor"),d("th","axis align char charoff valign nowrap bgcolor width height"),d("form","accept"),d("td","abbr axis scope align char charoff valign nowrap bgcolor width height"),d("tfoot","align char charoff valign"),d("tbody","align char charoff valign"),d("area","nohref"),d("body","background bgcolor text link vlink alink")),"html4"!==e&&(d("input button select textarea","autofocus"),d("input textarea","placeholder"),d("a","download"),d("link script img","crossorigin"),d("img","loading"),d("iframe","sandbox seamless allowfullscreen loading")),"html4"!==e&&$([t.video,t.audio],(e=>{delete e.children.audio,delete e.children.video})),ms(hs("a form meter progress dfn"),(e=>{t[e]&&delete t[e].children[e]})),delete t.caption.children.table,delete t.script,ds[e]=t,t)})(l);!1===e.verify_html&&(e.valid_elements="*[*]");const c=ys(e.valid_styles),u=ys(e.invalid_styles,"map"),m=ys(e.valid_classes,"map"),f=i("whitespace_elements","pre script noscript style textarea video audio iframe object code"),g=i("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr"),p=i("void_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr track"),h=i("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls allowfullscreen"),b="td th iframe video audio object script code",v=i("non_empty_elements",b+" pre",p),y=i("move_caret_before_on_enter_elements",b+" table",p),C=i("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"),x=i("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",C),w=i("text_inline_elements","span strong b em i font s strike u var cite dfn code mark q sup sub samp");ms("script noscript iframe noframes noembed title style textarea xmp plaintext".split(" "),(e=>{a[e]=new RegExp("</"+e+"[^>]*>","gi")}));const k=e=>new RegExp("^"+e.replace(/([?+*])/g,".$1")+"$"),S=e=>{let t,o,s,a,i,l,d,c,u,m,f,g,p,h,b,v,y,C;const x=/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)])?$/,w=/^([!\-])?(\w+[\\:]:\w+|[^=~<]+)?(?:([=~<])(.*))?$/,S=/[*?+]/;if(e){const _=hs(e,",");for(n["@"]&&(v=n["@"].attributes,y=n["@"].attributesOrder),t=0,o=_.length;t<o;t++)if(i=x.exec(_[t]),i){if(h=i[1],u=i[2],b=i[3],c=i[5],g={},p=[],l={attributes:g,attributesOrder:p},"#"===h&&(l.paddEmpty=!0),"-"===h&&(l.removeEmpty=!0),"!"===i[4]&&(l.removeEmptyAttrs=!0),v&&(fe(v,((e,t)=>{g[t]=e})),p.push.apply(p,y)),c)for(c=hs(c,"|"),s=0,a=c.length;s<a;s++)if(i=w.exec(c[s]),i){if(d={},f=i[1],m=i[2].replace(/[\\:]:/g,":"),h=i[3],C=i[4],"!"===f&&(l.attributesRequired=l.attributesRequired||[],l.attributesRequired.push(m),d.required=!0),"-"===f){delete g[m],p.splice(ps(p,m),1);continue}h&&("="===h&&(l.attributesDefault=l.attributesDefault||[],l.attributesDefault.push({name:m,value:C}),d.defaultValue=C),"~"===h&&(l.attributesForced=l.attributesForced||[],l.attributesForced.push({name:m,value:C}),d.forcedValue=C),"<"===h&&(d.validValues=us(C,"?"))),S.test(m)?(l.attributePatterns=l.attributePatterns||[],d.pattern=k(m),l.attributePatterns.push(d)):(g[m]||p.push(m),g[m]=d)}v||"@"!==u||(v=g,y=p),b&&(l.outputName=u,n[b]=l),S.test(u)?(l.pattern=k(u),r.push(l)):n[u]=l}}},_=e=>{r=[],$(ue(n),(e=>{delete n[e]})),S(e),ms(d,((e,t)=>{o[t]=e.children}))},E=e=>{const t=/^(~)?(.+)$/;e&&(ds.text_block_elements=ds.block_elements=null,ms(hs(e,","),(e=>{const r=t.exec(e),a="~"===r[1],i=a?"span":"div",l=r[2];if(o[l]=o[i],s[l]=i,a||(x[l.toUpperCase()]={},x[l]={}),!n[l]){let e=n[i];e=fs({},e),delete e.removeEmptyAttrs,delete e.removeEmpty,n[l]=e}ms(o,((e,t)=>{e[i]&&(o[t]=e=fs({},o[t]),e[l]=e[i])}))})))},R=e=>{const t=/^([+\-]?)([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]+)\[([^\]]+)]$/;ds[l]=null,e&&ms(hs(e,","),(e=>{const n=t.exec(e);let r,s;n&&(s=n[1],r=s?o[n[2]]:o[n[2]]={"#comment":{}},r=o[n[2]],ms(hs(n[3],"|"),(e=>{"-"===s?delete r[e]:r[e]={}})))}))},A=e=>{let t,o=n[e];if(o)return o;for(t=r.length;t--;)if(o=r[t],o.pattern.test(e))return o};e.valid_elements?_(e.valid_elements):(ms(d,((e,t)=>{n[t]={attributes:e.attributes,attributesOrder:e.attributesOrder},o[t]=e.children})),ms(hs("strong/b em/i"),(e=>{const t=hs(e,"/");n[t[1]].outputName=t[0]})),ms(w,((t,o)=>{n[o]&&(e.padd_empty_block_inline_children&&(n[o].paddInEmptyBlock=!0),n[o].removeEmpty=!0)})),ms(hs("ol ul blockquote a table tbody"),(e=>{n[e]&&(n[e].removeEmpty=!0)})),ms(hs("p h1 h2 h3 h4 h5 h6 th td pre div address caption li"),(e=>{n[e].paddEmpty=!0})),ms(hs("span"),(e=>{n[e].removeEmptyAttrs=!0}))),E(e.custom_elements),R(e.valid_children),S(e.extended_valid_elements),R("+ol[ul|ol],+ul[ul|ol]"),ms({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"},((e,t)=>{n[t]&&(n[t].parentsRequired=hs(e))})),e.invalid_elements&&ms(gs(e.invalid_elements),(e=>{n[e]&&delete n[e]})),A("span")||S("span[!data-mce-type|*]");const O=N(c),T=N(u),B=N(m),D=N(h),L=N(x),P=N(C),M=N(w),I=N(Object.seal(p)),F=N(g),U=N(v),z=N(y),j=N(f),V=N(Object.seal(a)),H=N(s);return{type:l,children:o,elements:n,getValidStyles:O,getValidClasses:B,getBlockElements:L,getInvalidStyles:T,getVoidElements:I,getTextBlockElements:P,getTextInlineElements:M,getBoolAttrs:D,getElementRule:A,getSelfClosingElements:F,getNonEmptyElements:U,getMoveCaretBeforeOnEnterElements:z,getWhitespaceElements:j,getSpecialElements:V,isValidChild:(e,t)=>{const n=o[e.toLowerCase()];return!(!n||!n[t.toLowerCase()])},isValid:(e,t)=>{let n,o;const r=A(e);if(r){if(!t)return!0;if(r.attributes[t])return!0;if(n=r.attributePatterns,n)for(o=n.length;o--;)if(n[o].pattern.test(t))return!0}return!1},getCustomElements:H,addValidElements:S,setValidElements:_,addCustomElements:E,addValidChildren:R}},xs=(e,t)=>{const n=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,o=/\s*([^:]+):\s*([^;]+);?/g,r=/\s+$/;let s;const a={};let i,l;e=e||{},t&&(i=t.getValidStyles(),l=t.getInvalidStyles());const d="\\\" \\' \\; \\: ; : \ufeff".split(" ");for(s=0;s<d.length;s++)a[d[s]]="\ufeff"+s,a["\ufeff"+s]=d[s];const c={parse:t=>{const i={};let l,d,u,m;const f=e.url_converter,g=e.url_converter_scope||c,p=(e,t,n)=>{const o=i[e+"-top"+t];if(!o)return;const r=i[e+"-right"+t];if(!r)return;const a=i[e+"-bottom"+t];if(!a)return;const l=i[e+"-left"+t];if(!l)return;const d=[o,r,a,l];for(s=d.length-1;s--&&d[s]===d[s+1];);s>-1&&n||(i[e+t]=-1===s?d[0]:d.join(" "),delete i[e+"-top"+t],delete i[e+"-right"+t],delete i[e+"-bottom"+t],delete i[e+"-left"+t])},h=e=>{let t,n=i[e];if(n){for(n=n.split(" "),t=n.length;t--;)if(n[t]!==n[0])return!1;return i[e]=n[0],!0}},b=e=>(m=!0,a[e]),v=(e,t)=>(m&&(e=e.replace(/\uFEFF[0-9]/g,(e=>a[e]))),t||(e=e.replace(/\\([\'\";:])/g,"$1")),e),y=e=>String.fromCharCode(parseInt(e.slice(1),16)),C=e=>e.replace(/\\[0-9a-f]+/gi,y),x=(t,n,o,r,s,a)=>{if(s=s||a)return"'"+(s=v(s)).replace(/\'/g,"\\'")+"'";if(n=v(n||o||r),!e.allow_script_urls){const t=n.replace(/[\s\r\n]+/g,"");if(/(java|vb)script:/i.test(t))return"";if(!e.allow_svg_data_urls&&/^data:image\/svg/i.test(t))return""}return f&&(n=f.call(g,n,"style")),"url('"+n.replace(/\'/g,"\\'")+"')"};if(t){for(t=(t=t.replace(/[\u0000-\u001F]/g,"")).replace(/\\[\"\';:\uFEFF]/g,b).replace(/\"[^\"]+\"|\'[^\']+\'/g,(e=>e.replace(/[;:]/g,b)));l=o.exec(t);)if(o.lastIndex=l.index+l[0].length,d=l[1].replace(r,"").toLowerCase(),u=l[2].replace(r,""),d&&u){if(d=C(d),u=C(u),-1!==d.indexOf("\ufeff")||-1!==d.indexOf('"'))continue;if(!e.allow_script_urls&&("behavior"===d||/expression\s*\(|\/\*|\*\//.test(u)))continue;"font-weight"===d&&"700"===u?u="bold":"color"!==d&&"background-color"!==d||(u=u.toLowerCase()),u=u.replace(n,x),i[d]=m?v(u,!0):u}p("border","",!0),p("border","-width"),p("border","-color"),p("border","-style"),p("padding",""),p("margin",""),"border",k="border-style",S="border-color",h(w="border-width")&&h(k)&&h(S)&&(i.border=i[w]+" "+i[k]+" "+i[S],delete i[w],delete i[k],delete i[S]),"medium none"===i.border&&delete i.border,"none"===i["border-image"]&&delete i["border-image"]}var w,k,S;return i},serialize:(e,t)=>{let n="";const o=t=>{let o;const r=i[t];if(r)for(let s=0,a=r.length;s<a;s++)t=r[s],o=e[t],o&&(n+=(n.length>0?" ":"")+t+": "+o+";")};return t&&i?(o("*"),o(t)):fe(e,((e,o)=>{!e||l&&!((e,t)=>{let n=l["*"];return!(n&&n[e]||(n=l[t],n&&n[e]))})(o,t)||(n+=(n.length>0?" ":"")+o+": "+e+";")})),n}};return c},ws={keyLocation:!0,layerX:!0,layerY:!0,returnValue:!0,webkitMovementX:!0,webkitMovementY:!0,keyIdentifier:!0,mozPressure:!0},ks=(e,t)=>{const n=null!=t?t:{};for(const t in e)we(ws,t)||(n[t]=e[t]);return C(n.composedPath)&&(n.composedPath=()=>e.composedPath()),n},Ss=(e,t,n,o)=>{var r;const s=ks(t,o);return s.type=e,y(s.target)&&(s.target=null!==(r=s.srcElement)&&void 0!==r?r:n),(e=>y(e.preventDefault)||(e=>e instanceof Event||x(e.initEvent))(e))(t)&&(s.preventDefault=()=>{s.defaultPrevented=!0,s.isDefaultPrevented=P,x(t.preventDefault)&&t.preventDefault()},s.stopPropagation=()=>{s.cancelBubble=!0,s.isPropagationStopped=P,x(t.stopPropagation)&&t.stopPropagation()},s.stopImmediatePropagation=()=>{s.isImmediatePropagationStopped=P,s.stopPropagation()},(e=>e.isDefaultPrevented===P||e.isDefaultPrevented===L)(s)||(s.isDefaultPrevented=!0===s.defaultPrevented?P:L,s.isPropagationStopped=!0===s.cancelBubble?P:L,s.isImmediatePropagationStopped=L)),s},_s=/^(?:mouse|contextmenu)|click/,Es=(e,t,n,o)=>{e.addEventListener?e.addEventListener(t,n,o||!1):e.attachEvent&&e.attachEvent("on"+t,n)},Ns=(e,t,n,o)=>{e.removeEventListener?e.removeEventListener(t,n,o||!1):e.detachEvent&&e.detachEvent("on"+t,n)},Rs=(e,t)=>{const n=Ss(e.type,e,document,t);if((e=>C(e)&&_s.test(e.type))(e)&&v(e.pageX)&&!v(e.clientX)){const t=n.target.ownerDocument||document,o=t.documentElement,r=t.body,s=n;s.pageX=e.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),s.pageY=e.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)}return n},As=(e,t,n)=>{const o=e.document,r={type:"ready"};if(n.domLoaded)return void t(r);const s=()=>{Ns(e,"DOMContentLoaded",s),Ns(e,"load",s),n.domLoaded||(n.domLoaded=!0,t(r)),e=null};"complete"===o.readyState||"interactive"===o.readyState&&o.body?s():Es(e,"DOMContentLoaded",s),n.domLoaded||Es(e,"load",s)};class Os{constructor(){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}bind(e,t,n,o){const r=this;let s,a,i,l,d,c,u;const m=window,f=e=>{r.executeHandlers(Rs(e||m.event),s)};if(!e||3===e.nodeType||8===e.nodeType)return;e[r.expando]?s=e[r.expando]:(s=r.count++,e[r.expando]=s,r.events[s]={}),o=o||e;const g=t.split(" ");for(i=g.length;i--;)l=g[i],c=f,d=u=!1,"DOMContentLoaded"===l&&(l="ready"),r.domLoaded&&"ready"===l&&"complete"===e.readyState?n.call(o,Rs({type:l})):(r.hasMouseEnterLeave||(d=r.mouseEnterLeave[l],d&&(c=e=>{const t=e.currentTarget;let n=e.relatedTarget;if(n&&t.contains)n=t.contains(n);else for(;n&&n!==t;)n=n.parentNode;n||((e=Rs(e||m.event)).type="mouseout"===e.type?"mouseleave":"mouseenter",e.target=t,r.executeHandlers(e,s))})),r.hasFocusIn||"focusin"!==l&&"focusout"!==l||(u=!0,d="focusin"===l?"focus":"blur",c=e=>{(e=Rs(e||m.event)).type="focus"===e.type?"focusin":"focusout",r.executeHandlers(e,s)}),a=r.events[s][l],a?"ready"===l&&r.domLoaded?n(Rs({type:l})):a.push({func:n,scope:o}):(r.events[s][l]=a=[{func:n,scope:o}],a.fakeName=d,a.capture=u,a.nativeHandler=c,"ready"===l?As(e,c,r):Es(e,d||l,c,u)));return e=a=null,n}unbind(e,t,n){let o,r,s,a,i;if(!e||3===e.nodeType||8===e.nodeType)return this;const l=e[this.expando];if(l){if(i=this.events[l],t){const l=t.split(" ");for(r=l.length;r--;)if(a=l[r],o=i[a],o){if(n)for(s=o.length;s--;)if(o[s].func===n){const e=o.nativeHandler,t=o.fakeName,n=o.capture;o=o.slice(0,s).concat(o.slice(s+1)),o.nativeHandler=e,o.fakeName=t,o.capture=n,i[a]=o}n&&0!==o.length||(delete i[a],Ns(e,o.fakeName||a,o.nativeHandler,o.capture))}}else fe(i,((t,n)=>{Ns(e,t.fakeName||n,t.nativeHandler,t.capture)})),i={};for(a in i)if(we(i,a))return this;delete this.events[l];try{delete e[this.expando]}catch(t){e[this.expando]=null}}return this}fire(e,t,n){return this.dispatch(e,t,n)}dispatch(e,t,n){let o;if(!e||3===e.nodeType||8===e.nodeType)return this;const r=Rs({type:t,target:e},n);do{o=e[this.expando],o&&this.executeHandlers(r,o),e=e.parentNode||e.ownerDocument||e.defaultView||e.parentWindow}while(e&&!r.isPropagationStopped());return this}clean(e){let t,n;if(!e||3===e.nodeType||8===e.nodeType)return this;if(e[this.expando]&&this.unbind(e),e.getElementsByTagName||(e=e.document),e&&e.getElementsByTagName)for(this.unbind(e),n=e.getElementsByTagName("*"),t=n.length;t--;)(e=n[t])[this.expando]&&this.unbind(e);return this}destroy(){this.events={}}cancel(e){return e&&(e.preventDefault(),e.stopImmediatePropagation()),!1}executeHandlers(e,t){const n=this.events[t],o=n&&n[e.type];if(o)for(let t=0,n=o.length;t<n;t++){const n=o[t];if(n&&!1===n.func.call(n.scope,e)&&e.preventDefault(),e.isImmediatePropagationStopped())return}}}Os.Event=new Os;const Ts=Bt.each,Bs=Bt.grep,Ds="data-mce-style",Ls=(e,t,n)=>{y(n)||""===n?Yt(e,t):$t(e,t,n)},Ps=(e,t)=>{const n=Wt(t,"style"),o=e.serialize(e.parse(n),Mt(t));Ls(t,Ds,o)},Ms=(e,t)=>{let n,o,r=0;if(e)for(n=e.nodeType,e=e.previousSibling;e;e=e.previousSibling)o=e.nodeType,(!t||3!==o||o!==n&&e.nodeValue.length)&&(r++,n=o);return r},Is=Bt.makeMap("fill-opacity font-weight line-height opacity orphans widows z-index zoom"," "),Fs=e=>e.replace(/[A-Z]/g,(e=>"-"+e.toLowerCase())),Us=(e,t={})=>{const n={},o=window,r={};let s=0;const a=Yo.forElement(mn(e),{contentCssCors:t.contentCssCors,referrerPolicy:t.referrerPolicy}),i=[],l=t.schema?t.schema:Cs({}),d=xs({url_converter:t.url_converter,url_converter_scope:t.url_converter_scope},t.schema),c=t.ownEvents?new Os:Os.Event,u=l.getBlockElements(),g=t=>t&&e&&m(t)?e.getElementById(t):t,h=e=>{const t=g(e);return C(t)?mn(t):null},b=(e,t,n)=>{let o;const r=h(e);if(C(r)&&Ut(r)){const e=J[t];o=e&&e.get?e.get(r.dom,t):Wt(r,t)}return C(o)?o:null!=n?n:""},v=e=>{const t=g(e);return y(t)?[]:t.attributes},k=(e,n,o)=>{L(e,(e=>{if(yo(e)){const r=mn(e);""===o&&(o=null);const s=Wt(r,n),a=J[n];a&&a.set?a.set(r.dom,o,n):Ls(r,n,o),s!==o&&t.onSetAttrib&&t.onSetAttrib({attrElm:r,attrName:n,attrValue:o})}}))},_=()=>t.root_element||e.body,E=(t,n)=>((e,t,n)=>{let o=0,r=0;const s=e.ownerDocument;if(n=n||e,t){if(n===e&&t.getBoundingClientRect&&"static"===$n(mn(e),"position")){const n=t.getBoundingClientRect();return o=n.left+(s.documentElement.scrollLeft||e.scrollLeft)-s.documentElement.clientLeft,r=n.top+(s.documentElement.scrollTop||e.scrollTop)-s.documentElement.clientTop,{x:o,y:r}}let a=t;for(;a&&a!==n&&a.nodeType&&!jo(a,n);){const e=a;o+=e.offsetLeft||0,r+=e.offsetTop||0,a=e.offsetParent}for(a=t.parentNode;a&&a!==n&&a.nodeType&&!jo(a,n);)o-=a.scrollLeft||0,r-=a.scrollTop||0,a=a.parentNode;r+=(e=>Uo.isFirefox()&&"table"===Mt(e)?zo(Nn(e)).filter((e=>"caption"===Mt(e))).bind((e=>zo(En(e)).map((t=>{const n=t.dom.offsetTop,o=e.dom.offsetTop,r=e.dom.offsetHeight;return n<=o?-r:0})))).getOr(0):0)(mn(t))}return{x:o,y:r}})(e.body,g(t),n),R=(e,n,o)=>{const r=(e,t)=>m(e)?e:w(e)?we(Is,t)?e+"":e+"px":ge(e,r),s=(e,t,n)=>{const o=Fs(t);y(n)||""===n?Gn(e,o):Vn(e,o,r(n,o))};L(e,(e=>{const r=mn(e);m(n)?s(r,n,o):fe(n,((e,t)=>{s(r,t,e)})),t.update_styles&&Ps(d,r)}))},A=(e,t,n)=>{const o=g(e);if(!y(o)&&yo(o))return n?$n(mn(o),Fs(t)):("float"===(t=t.replace(/-(\D)/g,((e,t)=>t.toUpperCase())))&&(t="cssFloat"),o.style?o.style[t]:void 0)},O=e=>{let t,n;const o=g(e);return t=A(o,"width"),n=A(o,"height"),-1===t.indexOf("px")&&(t=0),-1===n.indexOf("px")&&(n=0),{w:parseInt(t,10)||o.offsetWidth||o.clientWidth,h:parseInt(n,10)||o.offsetHeight||o.clientHeight}},T=(e,t)=>{if(!e)return!1;const n=p(e)?e:[e];return V(n,(e=>pn(mn(e),t)))},B=(e,t,n,o)=>{const r=[];let s,a=g(e);for(o=void 0===o,n=n||("BODY"!==_().nodeName?_().parentNode:null),m(t)&&(s=t,t="*"===t?yo:e=>T(e,s));a&&!(a===n||y(a.nodeType)||To(a)||Bo(a));){if(!t||t(a)){if(!o)return[a];r.push(a)}a=a.parentNode}return o?r:null},D=(e,t,n)=>{let o=t;if(e)for(m(t)&&(o=e=>T(e,t)),e=e[n];e;e=e[n])if(x(o)&&o(e))return e;return null},L=function(e,t,n){const o=null!=n?n:this,r=m(e)?g(e):e;if(!r)return!1;if(p(r)&&(r.length||0===r.length)){const e=[];return Ts(r,((n,r)=>{n&&e.push(t.call(o,m(n)?g(n):n,r))})),e}return t.call(o,r)},P=(e,t)=>{L(e,(e=>{fe(t,((t,n)=>{k(e,n,t)}))}))},M=(e,t)=>{L(e,(e=>{const n=mn(e);ro(n,t)}))},I=(t,n,o,r,s)=>L(t,(t=>{const a=m(n)?e.createElement(n):n;return C(o)&&P(a,o),r&&(!m(r)&&r.nodeType?a.appendChild(r):m(r)&&M(a,r)),s?a:t.appendChild(a)})),F=(t,n,o)=>I(e.createElement(t),t,n,o,!0),U=ls.encodeAllRaw,z=(e,t)=>L(e,(e=>{const n=mn(e);return t&&$(Nn(n),(e=>{zt(e)&&0===e.dom.length?to(e):Yn(n,e)})),to(n),n.dom})),H=(e,t,n)=>{L(e,(e=>{if(yo(e)){const o=mn(e),r=t.split(" ");$(r,(e=>{C(n)?(n?nn:rn)(o,e):((e,t)=>{const n=Jt(e)?e.dom.classList.toggle(t):((e,t)=>j(Zt(e),t)?tn(e,t):en(e,t))(e,t);on(e)})(o,e)}))}}))},q=(e,t,n)=>L(t,(t=>(p(t)&&(e=e.cloneNode(!0)),n&&Ts(Bs(t.childNodes),(t=>{e.appendChild(t)})),t.parentNode.replaceChild(e,t)))),W=e=>{if(yo(e)){const t="a"===e.nodeName.toLowerCase()&&!b(e,"href")&&b(e,"id");if(b(e,"name")||b(e,"data-mce-bookmark")||t)return!0}return!1},K=()=>e.createRange(),G=(n,r,s,a)=>{if(p(n)){let e=n.length;const t=[];for(;e--;)t[e]=G(n[e],r,s,a);return t}return!t.collect||n!==e&&n!==o||i.push([n,r,s,a]),c.bind(n,r,s,a||Q)},Y=(t,n,r)=>{if(p(t)){let e=t.length;const o=[];for(;e--;)o[e]=Y(t[e],n,r);return o}if(i.length>0&&(t===e||t===o)){let e=i.length;for(;e--;){const o=i[e];t!==o[0]||n&&n!==o[1]||r&&r!==o[2]||c.unbind(o[0],o[1],o[2])}}return c.unbind(t,n,r)},X=e=>{if(e&&yo(e)){const t=e.getAttribute("data-mce-contenteditable");return t&&"inherit"!==t?t:"inherit"!==e.contentEditable?e.contentEditable:null}return null},Q={doc:e,settings:t,win:o,files:r,stdMode:!0,boxModel:!0,styleSheetLoader:a,boundEvents:i,styles:d,schema:l,events:c,isBlock:e=>m(e)?we(u,e):yo(e)&&we(u,e.nodeName),root:null,clone:(e,t)=>e.cloneNode(t),getRoot:_,getViewPort:e=>{const t=ho(e);return{x:t.x,y:t.y,w:t.width,h:t.height}},getRect:e=>{const t=g(e),n=E(t),o=O(t);return{x:n.x,y:n.y,w:o.w,h:o.h}},getSize:O,getParent:(e,t,n)=>{const o=B(e,t,n,!1);return o&&o.length>0?o[0]:null},getParents:B,get:g,getNext:(e,t)=>D(e,t,"nextSibling"),getPrev:(e,t)=>D(e,t,"previousSibling"),select:(n,o)=>{var r,s;const a=null!==(s=null!==(r=g(o))&&void 0!==r?r:t.root_element)&&void 0!==s?s:e;return de(a.querySelectorAll(n))},is:T,add:I,create:F,createHTML:(e,t,n="")=>{let o,r="";for(o in r+="<"+e,t)ke(t,o)&&(r+=" "+o+'="'+U(t[o])+'"');return Ke(n)&&we(l.getVoidElements(),e)?r+" />":r+">"+n+"</"+e+">"},createFragment:t=>{let n;const o=e.createElement("div"),r=e.createDocumentFragment();for(r.appendChild(o),t&&(o.innerHTML=t);n=o.firstChild;)r.appendChild(n);return r.removeChild(o),r},remove:z,setStyle:R,getStyle:A,setStyles:(e,t)=>{R(e,t)},removeAllAttribs:e=>L(e,(e=>{const t=e.attributes;for(let n=t.length-1;n>=0;n--)e.removeAttributeNode(t.item(n))})),setAttrib:k,setAttribs:P,getAttrib:b,getPos:E,parseStyle:e=>d.parse(e),serializeStyle:(e,t)=>d.serialize(e,t),addStyle:t=>{let o,r;if(Q!==Us.DOM&&e===document){if(n[t])return;n[t]=!0}r=e.getElementById("mceDefaultStyles"),r||(r=e.createElement("style"),r.id="mceDefaultStyles",r.type="text/css",o=e.getElementsByTagName("head")[0],o.firstChild?o.insertBefore(r,o.firstChild):o.appendChild(r)),r.styleSheet?r.styleSheet.cssText+=t:r.appendChild(e.createTextNode(t))},loadCSS:e=>{e||(e=""),$(e.split(","),(e=>{r[e]=!0,a.load(e).catch(S)}))},addClass:(e,t)=>{H(e,t,!0)},removeClass:(e,t)=>{H(e,t,!1)},hasClass:(e,t)=>{const n=h(e),o=t.split(" ");return te(o,(e=>sn(n,e)))},toggleClass:H,show:e=>{L(e,(e=>Gn(mn(e),"display")))},hide:e=>{L(e,(e=>Vn(mn(e),"display","none")))},isHidden:e=>{const t=h(e);return Dt(Wn(t,"display"),"none")},uniqueId:e=>(e||"mce_")+s++,setHTML:M,getOuterHTML:e=>{const t=h(e);return yo(t.dom)?t.dom.outerHTML:(e=>{const t=cn("div"),n=mn(e.dom.cloneNode(!0));return Jn(t,n),oo(t)})(t)},setOuterHTML:(e,t)=>{L(e,(e=>{yo(e)&&(e.outerHTML=t)}))},decode:ls.decode,encode:U,insertAfter:(e,t)=>{const n=g(t);return L(e,(e=>{const t=n.parentNode,o=n.nextSibling;return o?t.insertBefore(e,o):t.appendChild(e),e}))},replace:q,rename:(e,t)=>{let n;return e.nodeName!==t.toUpperCase()&&(n=F(t),Ts(v(e),(t=>{k(n,t.nodeName,b(e,t.nodeName))})),q(n,e,!0)),n||e},findCommonAncestor:(e,t)=>{let n,o=e;for(;o;){for(n=t;n&&o!==n;)n=n.parentNode;if(o===n)break;o=o.parentNode}return!o&&e.ownerDocument?e.ownerDocument.documentElement:o},run:L,getAttribs:v,isEmpty:(e,t)=>{let n,o,r=0;if(W(e))return!1;if(e=e.firstChild){const s=new Xo(e,e.parentNode),a=l?l.getWhitespaceElements():{};t=t||(l?l.getNonEmptyElements():null);do{if(n=e.nodeType,yo(e)){const n=e.getAttribute("data-mce-bogus");if(n){e=s.next("all"===n);continue}if(o=e.nodeName.toLowerCase(),t&&t[o]){if("br"===o){r++,e=s.next();continue}return!1}if(W(e))return!1}if(8===n)return!1;if(3===n&&!Fr(e.nodeValue))return!1;if(3===n&&e.parentNode&&a[e.parentNode.nodeName]&&Fr(e.nodeValue))return!1;e=s.next()}while(e)}return r<=1},createRng:K,nodeIndex:Ms,split:(e,t,n)=>{let o,r,s,a=K();if(e&&t)return a.setStart(e.parentNode,Ms(e)),a.setEnd(t.parentNode,Ms(t)),o=a.extractContents(),a=K(),a.setStart(t.parentNode,Ms(t)+1),a.setEnd(e.parentNode,Ms(e)+1),r=a.extractContents(),s=e.parentNode,s.insertBefore(Gr(Q,o),e),n?s.insertBefore(n,e):s.insertBefore(t,e),s.insertBefore(Gr(Q,r),e),z(e),n||t},bind:G,unbind:Y,fire:(e,t,n)=>c.dispatch(e,t,n),dispatch:(e,t,n)=>c.dispatch(e,t,n),getContentEditable:X,getContentEditableParent:e=>{const t=_();let n=null;for(;e&&e!==t&&(n=X(e),null===n);e=e.parentNode);return n},destroy:()=>{if(i.length>0){let e=i.length;for(;e--;){const t=i[e];c.unbind(t[0],t[1],t[2])}}fe(r,((e,t)=>{a.unload(t),delete r[t]}))},isChildOf:(e,t)=>e===t||t.contains(e),dumpRng:e=>"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset},J=((e,t,n)=>{const o=t.keep_values,r={set:(e,o,r)=>{const s=mn(e);x(t.url_converter)&&C(o)&&(o=t.url_converter.call(t.url_converter_scope||n(),o,r,e[0])),Ls(s,"data-mce-"+r,o),Ls(s,r,o)},get:(e,t)=>{const n=mn(e);return Wt(n,"data-mce-"+t)||Wt(n,t)}},s={style:{set:(t,n)=>{const r=mn(t);f(n)?Hn(r,n):(o&&Ls(r,Ds,n),Yt(r,"style"),m(n)&&Hn(r,e.parse(n)))},get:t=>{const n=mn(t),o=Wt(n,Ds)||Wt(n,"style");return e.serialize(e.parse(o),Mt(n))}}};return o&&(s.href=s.src=r),s})(d,t,N(Q));return Q};Us.DOM=Us(document),Us.nodeIndex=Ms;const zs=Us.DOM;class js{constructor(e={}){this.states={},this.queue=[],this.scriptLoadedCallbacks={},this.queueLoadedCallbacks=[],this.loading=!1,this.settings=e}_setReferrerPolicy(e){this.settings.referrerPolicy=e}loadScript(e){return new Promise(((t,n)=>{const o=zs;let r;const s=()=>{o.remove(a),r&&(r.onerror=r.onload=r=null)},a=o.uniqueId();r=document.createElement("script"),r.id=a,r.type="text/javascript",r.src=Bt._addCacheSuffix(e),this.settings.referrerPolicy&&o.setAttrib(r,"referrerpolicy",this.settings.referrerPolicy),r.onload=()=>{s(),t()},r.onerror=()=>{s(),n("Failed to load script: "+e)},(document.getElementsByTagName("head")[0]||document.body).appendChild(r)}))}isDone(e){return 2===this.states[e]}markDone(e){this.states[e]=2}add(e){const t=this;return t.queue.push(e),void 0===t.states[e]&&(t.states[e]=0),new Promise(((n,o)=>{t.scriptLoadedCallbacks[e]||(t.scriptLoadedCallbacks[e]=[]),t.scriptLoadedCallbacks[e].push({resolve:n,reject:o})}))}load(e){return this.add(e)}remove(e){delete this.states[e],delete this.scriptLoadedCallbacks[e]}loadQueue(){const e=this.queue;return this.queue=[],this.loadScripts(e)}loadScripts(e){const t=this,n=(e,n)=>{xe(t.scriptLoadedCallbacks,n).each((t=>{$(t,(t=>t[e](n)))})),delete t.scriptLoadedCallbacks[n]},o=e=>{const t=K(e,(e=>"rejected"===e.status));return t.length>0?Promise.reject(ee(t,(({reason:e})=>p(e)?e:[e]))):Promise.resolve()},r=e=>Promise.allSettled(H(e,(e=>2===t.states[e]?(n("resolve",e),Promise.resolve()):3===t.states[e]?(n("reject",e),Promise.reject(e)):(t.states[e]=1,t.loadScript(e).then((()=>{t.states[e]=2,n("resolve",e);const s=t.queue;if(s.length>0)return t.queue=[],r(s).then(o)}),(()=>(t.states[e]=3,n("reject",e),Promise.reject(e)))))))),s=e=>(t.loading=!0,r(e).then((e=>{t.loading=!1;const n=t.queueLoadedCallbacks.shift();return M.from(n).each(D),o(e)}))),a=Se(e);return t.loading?new Promise(((e,n)=>{t.queueLoadedCallbacks.push((()=>s(a).then(e,n)))})):s(a)}}js.ScriptLoader=new js;const Vs=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},Hs={},$s=Vs("en"),qs=()=>xe(Hs,$s.get()),Ws={getData:()=>ge(Hs,(e=>({...e}))),setCode:e=>{e&&$s.set(e)},getCode:()=>$s.get(),add:(e,t)=>{let n=Hs[e];n||(Hs[e]=n={}),fe(t,((e,t)=>{n[t.toLowerCase()]=e}))},translate:e=>{const t=qs().getOr({}),n=e=>x(e)?Object.prototype.toString.call(e):o(e)?"":""+e,o=e=>""===e||null==e,r=e=>{const o=n(e);return xe(t,o.toLowerCase()).map(n).getOr(o)},s=e=>e.replace(/{context:\w+}$/,"");if(o(e))return"";if(f(a=e)&&we(a,"raw"))return n(e.raw);var a;if((e=>p(e)&&e.length>1)(e)){const t=e.slice(1);return s(r(e[0]).replace(/\{([0-9]+)\}/g,((e,o)=>we(t,o)?n(t[o]):e)))}return s(r(e))},isRtl:()=>qs().bind((e=>xe(e,"_dir"))).exists((e=>"rtl"===e)),hasCode:e=>we(Hs,e)},Ks=()=>{const e=[],t={},n={},o=[],r=(e,t)=>{const n=K(o,(n=>n.name===e&&n.state===t));$(n,(e=>e.resolve()))},s=e=>we(t,e),a=(e,n)=>{const o=Ws.getCode();!o||n&&-1===(","+(n||"")+",").indexOf(","+o+",")||js.ScriptLoader.add(t[e]+"/langs/"+o+".js")},i=(e,t="added")=>"added"===t&&(e=>we(n,e))(e)||"loaded"===t&&s(e)?Promise.resolve():new Promise((n=>{o.push({name:e,state:t,resolve:n})}));return{items:e,urls:t,lookup:n,get:e=>{if(n[e])return n[e].instance},requireLangPack:(e,t)=>{!1!==Ks.languageLoad&&(s(e)?a(e,t):i(e,"loaded").then((()=>a(e,t))))},add:(t,o)=>(e.push(o),n[t]={instance:o},r(t,"added"),o),remove:e=>{delete t[e],delete n[e]},createUrl:(e,t)=>m(t)?m(e)?{prefix:"",resource:t,suffix:""}:{prefix:e.prefix,resource:t,suffix:e.suffix}:t,load:(e,o)=>{if(t[e])return Promise.resolve();let s=m(o)?o:o.prefix+o.resource+o.suffix;0!==s.indexOf("/")&&-1===s.indexOf("://")&&(s=Ks.baseURL+"/"+s),t[e]=s.substring(0,s.lastIndexOf("/"));const a=()=>(r(e,"loaded"),Promise.resolve());return n[e]?a():js.ScriptLoader.add(s).then(a)},waitFor:i}};Ks.languageLoad=!0,Ks.baseURL="",Ks.PluginManager=Ks(),Ks.ThemeManager=Ks(),Ks.ModelManager=Ks();const Gs=()=>{const e=(e=>{const t=Vs(M.none()),n=()=>t.get().each(e);return{clear:()=>{n(),t.set(M.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{n(),t.set(M.some(e))}}})(S);return{...e,on:t=>e.get().each(t)}},Ys=(e,t)=>{let n=null;return{cancel:()=>{h(n)||(clearTimeout(n),n=null)},throttle:(...o)=>{h(n)&&(n=setTimeout((()=>{n=null,e.apply(null,o)}),t))}}},Xs=(e,t)=>{let n=null;const o=()=>{h(n)||(clearTimeout(n),n=null)};return{cancel:o,throttle:(...r)=>{o(),n=setTimeout((()=>{n=null,e.apply(null,r)}),t)}}},Qs=(e,t)=>{let n=[];return $(Nn(e),(e=>{t(e)&&(n=n.concat([e])),n=n.concat(Qs(e,t))})),n},Js=(e,t)=>((e,t)=>{const n=void 0===t?document:t.dom;return hn(n)?[]:H(n.querySelectorAll(e),mn)})(t,e),Zs=N("mce-annotation"),ea=N("data-mce-annotation"),ta=N("data-mce-annotation-uid"),na=N("data-mce-annotation-active"),oa=(e,t)=>{const n=e.selection.getRng(),o=mn(n.startContainer),r=mn(e.getBody()),s=t.fold((()=>"."+Zs()),(e=>`[${ea()}="${e}"]`)),a=Rn(o,n.startOffset).getOr(o),i=Ko(a,s,(e=>bn(e,r))),l=(e,t)=>Gt(e,t)?M.some(Wt(e,t)):M.none();return i.bind((t=>l(t,`${ta()}`).bind((n=>l(t,`${ea()}`).map((t=>{const o=ra(e,n);return{uid:n,name:t,elements:o}}))))))},ra=(e,t)=>{const n=mn(e.getBody());return Js(n,`[${ta()}="${t}"]`)},sa=(e,t)=>{const n=mn(e.getBody()),o=Js(n,`[${ea()}="${t}"]`),r={};return $(o,(e=>{const t=Wt(e,ta()),n=xe(r,t).getOr([]);r[t]=n.concat([e])})),r};let aa=0;const ia=e=>{const t=(new Date).getTime(),n=Math.floor(1e9*Math.random());return aa++,e+"_"+n+aa+String(t)},la=(e,t)=>mn(e.dom.cloneNode(t)),da=e=>la(e,!1),ca=e=>la(e,!0),ua=(e,t,n=L)=>{const o=new Xo(e,t),r=e=>{let t;do{t=o[e]()}while(t&&!No(t)&&!n(t));return M.from(t).filter(No)};return{current:()=>M.from(o.current()).filter(No),next:()=>r("next"),prev:()=>r("prev"),prev2:()=>r("prev2")}},ma=(e,t)=>{const n=t||(t=>e.isBlock(t)||Do(t)||Mo(t)),o=(e,t,n,r)=>{if(No(e)){const n=r(e,t,e.data);if(-1!==n)return M.some({container:e,offset:n})}return n().bind((e=>o(e.container,e.offset,n,r)))};return{backwards:(e,t,r,s)=>{const a=ua(e,s,n);return o(e,t,(()=>a.prev().map((e=>({container:e,offset:e.length})))),r).getOrNull()},forwards:(e,t,r,s)=>{const a=ua(e,s,n);return o(e,t,(()=>a.next().map((e=>({container:e,offset:0})))),r).getOrNull()}}},fa=Math.round,ga=e=>e?{left:fa(e.left),top:fa(e.top),bottom:fa(e.bottom),right:fa(e.right),width:fa(e.width),height:fa(e.height)}:{left:0,top:0,bottom:0,right:0,width:0,height:0},pa=(e,t)=>(e=ga(e),t||(e.left=e.left+e.width),e.right=e.left,e.width=0,e),ha=(e,t,n)=>e>=0&&e<=Math.min(t.height,n.height)/2,ba=(e,t)=>{const n=Math.min(t.height/2,e.height/2);return e.bottom-n<t.top||!(e.top>t.bottom)&&ha(t.top-e.bottom,e,t)},va=(e,t)=>e.top>t.bottom||!(e.bottom<t.top)&&ha(t.bottom-e.top,e,t),ya=(e,t,n)=>{const o=Math.max(Math.min(t,e.left+e.width),e.left),r=Math.max(Math.min(n,e.top+e.height),e.top);return Math.sqrt((t-o)*(t-o)+(n-r)*(n-r))},Ca=e=>{const t=e.startContainer,n=e.startOffset;return t.hasChildNodes()&&e.endOffset===n+1?t.childNodes[n]:null},xa=(e,t)=>{if(yo(e)&&e.hasChildNodes()){const n=e.childNodes,o=((e,t,n)=>Math.min(Math.max(e,0),n))(t,0,n.length-1);return n[o]}return e},wa=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]"),ka=e=>"string"==typeof e&&e.charCodeAt(0)>=768&&wa.test(e),Sa=yo,_a=Lr,Ea=xo("display","block table"),Na=xo("float","left right"),Ra=((...e)=>t=>{for(let n=0;n<e.length;n++)if(!e[n](t))return!1;return!0})(Sa,_a,T(Na)),Aa=T(xo("white-space","pre pre-line pre-wrap")),Oa=No,Ta=Do,Ba=Us.nodeIndex,Da=(e,t)=>t<0&&yo(e)&&e.hasChildNodes()?void 0:xa(e,t),La=e=>"createRange"in e?e.createRange():Us.DOM.createRng(),Pa=e=>e&&/[\r\n\t ]/.test(e),Ma=e=>!!e.setStart&&!!e.setEnd,Ia=e=>{const t=e.startContainer,n=e.startOffset;if(Pa(e.toString())&&Aa(t.parentNode)&&No(t)){const e=t.data;if(Pa(e[n-1])||Pa(e[n+1]))return!0}return!1},Fa=e=>0===e.left&&0===e.right&&0===e.top&&0===e.bottom,Ua=e=>{let t;const n=e.getClientRects();return t=n.length>0?ga(n[0]):ga(e.getBoundingClientRect()),!Ma(e)&&Ta(e)&&Fa(t)?(e=>{const t=e.ownerDocument,n=La(t),o=t.createTextNode(dr),r=e.parentNode;r.insertBefore(o,e),n.setStart(o,0),n.setEnd(o,1);const s=ga(n.getBoundingClientRect());return r.removeChild(o),s})(e):Fa(t)&&Ma(e)?(e=>{const t=e.startContainer,n=e.endContainer,o=e.startOffset,r=e.endOffset;if(t===n&&No(n)&&0===o&&1===r){const t=e.cloneRange();return t.setEndAfter(n),Ua(t)}return null})(e):t},za=(e,t)=>{const n=pa(e,t);return n.width=1,n.right=n.left+1,n},ja=(e,t,n)=>{const o=()=>(n||(n=(e=>{const t=[],n=e=>{var n,o;0!==e.height&&(t.length>0&&(n=e,o=t[t.length-1],n.left===o.left&&n.top===o.top&&n.bottom===o.bottom&&n.right===o.right)||t.push(e))},o=(e,o)=>{const r=La(e.ownerDocument);if(o<e.data.length){if(ka(e.data[o]))return t;if(ka(e.data[o-1])&&(r.setStart(e,o),r.setEnd(e,o+1),!Ia(r)))return n(za(Ua(r),!1)),t}o>0&&(r.setStart(e,o-1),r.setEnd(e,o),Ia(r)||n(za(Ua(r),!1))),o<e.data.length&&(r.setStart(e,o),r.setEnd(e,o+1),Ia(r)||n(za(Ua(r),!0)))},r=e.container(),s=e.offset();if(Oa(r))return o(r,s),t;if(Sa(r))if(e.isAtEnd()){const e=Da(r,s);Oa(e)&&o(e,e.data.length),Ra(e)&&!Ta(e)&&n(za(Ua(e),!1))}else{const a=Da(r,s);if(Oa(a)&&o(a,0),Ra(a)&&e.isAtEnd())return n(za(Ua(a),!1)),t;const i=Da(e.container(),e.offset()-1);Ra(i)&&!Ta(i)&&(Ea(i)||Ea(a)||!Ra(a))&&n(za(Ua(i),!1)),Ra(a)&&n(za(Ua(a),!0))}return t})(ja(e,t))),n);return{container:N(e),offset:N(t),toRange:()=>{const n=La(e.ownerDocument);return n.setStart(e,t),n.setEnd(e,t),n},getClientRects:o,isVisible:()=>o().length>0,isAtStart:()=>(Oa(e),0===t),isAtEnd:()=>Oa(e)?t>=e.data.length:t>=e.childNodes.length,isEqual:n=>n&&e===n.container()&&t===n.offset(),getNode:n=>Da(e,n?t-1:t)}};ja.fromRangeStart=e=>ja(e.startContainer,e.startOffset),ja.fromRangeEnd=e=>ja(e.endContainer,e.endOffset),ja.after=e=>ja(e.parentNode,Ba(e)+1),ja.before=e=>ja(e.parentNode,Ba(e)),ja.isAbove=(e,t)=>Lt(ie(t.getClientRects()),le(e.getClientRects()),ba).getOr(!1),ja.isBelow=(e,t)=>Lt(le(t.getClientRects()),ie(e.getClientRects()),va).getOr(!1),ja.isAtStart=e=>!!e&&e.isAtStart(),ja.isAtEnd=e=>!!e&&e.isAtEnd(),ja.isTextPosition=e=>!!e&&No(e.container()),ja.isElementPosition=e=>!1===ja.isTextPosition(e);const Va=(e,t)=>{No(t)&&0===t.data.length&&e.remove(t)},Ha=(e,t,n)=>{Bo(n)?((e,t,n)=>{const o=M.from(n.firstChild),r=M.from(n.lastChild);t.insertNode(n),o.each((t=>Va(e,t.previousSibling))),r.each((t=>Va(e,t.nextSibling)))})(e,t,n):((e,t,n)=>{t.insertNode(n),Va(e,n.previousSibling),Va(e,n.nextSibling)})(e,t,n)},$a=No,qa=ko,Wa=Us.nodeIndex,Ka=e=>{const t=e.parentNode;return qa(t)?Ka(t):t},Ga=e=>e?Oe(e.childNodes,((e,t)=>(qa(t)&&"BR"!==t.nodeName?e=e.concat(Ga(t)):e.push(t),e)),[]):[],Ya=e=>t=>e===t,Xa=e=>{let t;return t=$a(e)?"text()":e.nodeName.toLowerCase(),t+"["+(e=>{let t,n;t=Ga(Ka(e)),n=Te(t,Ya(e),e),t=t.slice(0,n+1);const o=Oe(t,((e,n,o)=>($a(n)&&$a(t[o-1])&&e++,e)),0);return t=Re(t,Co([e.nodeName])),n=Te(t,Ya(e),e),n-o})(e)+"]"},Qa=(e,t)=>{let n,o,r,s,a,i=[];return n=t.container(),o=t.offset(),$a(n)?r=((e,t)=>{for(;(e=e.previousSibling)&&$a(e);)t+=e.data.length;return t})(n,o):(s=n.childNodes,o>=s.length?(r="after",o=s.length-1):r="before",n=s[o]),i.push(Xa(n)),a=((e,t,n)=>{const o=[];for(t=t.parentNode;t!==e;t=t.parentNode)o.push(t);return o})(e,n),a=Re(a,T(ko)),i=i.concat(Ne(a,(e=>Xa(e)))),i.reverse().join("/")+","+r},Ja=(e,t)=>{let n;if(!t)return null;const o=t.split(","),r=o[0].split("/");n=o.length>1?o[1]:"before";const s=Oe(r,((e,t)=>{const n=/([\w\-\(\)]+)\[([0-9]+)\]/.exec(t);return n?("text()"===n[1]&&(n[1]="#text"),((e,t,n)=>{let o=Ga(e);return o=Re(o,((e,t)=>!$a(e)||!$a(o[t-1]))),o=Re(o,Co([t])),o[n]})(e,n[1],parseInt(n[2],10))):null}),e);return s?$a(s)?((e,t)=>{let n,o=e,r=0;for(;$a(o);){if(n=o.data.length,t>=r&&t<=r+n){e=o,t-=r;break}if(!$a(o.nextSibling)){e=o,t=n;break}r+=n,o=o.nextSibling}return $a(e)&&t>e.data.length&&(t=e.data.length),ja(e,t)})(s,parseInt(n,10)):(n="after"===n?Wa(s)+1:Wa(s),ja(s.parentNode,n)):null},Za=Mo,ei=(e,t,n,o,r)=>{let s=o[r?"startContainer":"endContainer"],a=o[r?"startOffset":"endOffset"];const i=[];let l,d=0;const c=e.getRoot();for(No(s)?i.push(n?((e,t,n)=>{let o,r;for(r=e(t.data.slice(0,n)).length,o=t.previousSibling;o&&No(o);o=o.previousSibling)r+=e(o.data).length;return r})(t,s,a):a):(l=s.childNodes,a>=l.length&&l.length&&(d=1,a=Math.max(0,l.length-1)),i.push(e.nodeIndex(l[a],n)+d));s&&s!==c;s=s.parentNode)i.push(e.nodeIndex(s,n));return i},ti=(e,t,n)=>{let o=0;return Bt.each(e.select(t),(e=>{if("all"!==e.getAttribute("data-mce-bogus"))return e!==n&&void o++})),o},ni=(e,t)=>{let n,o,r;const s=t?"start":"end";n=e[s+"Container"],o=e[s+"Offset"],yo(n)&&"TR"===n.nodeName&&(r=n.childNodes,n=r[Math.min(t?o:o-1,r.length-1)],n&&(o=t?0:n.childNodes.length,e["set"+(t?"Start":"End")](n,o)))},oi=e=>(ni(e,!0),ni(e,!1),e),ri=(e,t)=>{let n;if(yo(e)&&(e=xa(e,t),Za(e)))return e;if(vr(e)){if(No(e)&&hr(e)&&(e=e.parentNode),n=e.previousSibling,Za(n))return n;if(n=e.nextSibling,Za(n))return n}},si=(e,t,n)=>{const o=n.getNode();let r=o?o.nodeName:null;const s=n.getRng();if(Za(o)||"IMG"===r)return{name:r,index:ti(n.dom,r,o)};const a=(e=>ri(e.startContainer,e.startOffset)||ri(e.endContainer,e.endOffset))(s);return a?(r=a.tagName,{name:r,index:ti(n.dom,r,a)}):((e,t,n,o)=>{const r=t.dom,s={};return s.start=ei(r,e,n,o,!0),t.isCollapsed()||(s.end=ei(r,e,n,o,!1)),_r(o)&&(s.isFakeCaret=!0),s})(e,n,t,s)},ai=(e,t,n)=>{const o={"data-mce-type":"bookmark",id:t,style:"overflow:hidden;line-height:0px"};return n?e.create("span",o,"&#xFEFF;"):e.create("span",o)},ii=(e,t)=>{const n=e.dom;let o=e.getRng();const r=n.uniqueId(),s=e.isCollapsed(),a=e.getNode(),i=a.nodeName;if("IMG"===i)return{name:i,index:ti(n,i,a)};const l=oi(o.cloneRange());if(!s){l.collapse(!1);const e=ai(n,r+"_end",t);Ha(n,l,e)}o=oi(o),o.collapse(!0);const d=ai(n,r+"_start",t);return Ha(n,o,d),e.moveToBookmark({id:r,keep:!0}),{id:r}},li=O(si,R,!0),di=e=>{const t=t=>t(e),n=N(e),o=()=>r,r={tag:!0,inner:e,fold:(t,n)=>n(e),isValue:P,isError:L,map:t=>ui.value(t(e)),mapError:o,bind:t,exists:t,forall:t,getOr:n,or:o,getOrThunk:n,orThunk:o,getOrDie:n,each:t=>{t(e)},toOptional:()=>M.some(e)};return r},ci=e=>{const t=()=>n,n={tag:!1,inner:e,fold:(t,n)=>t(e),isValue:L,isError:P,map:t,mapError:t=>ui.error(t(e)),bind:t,exists:L,forall:P,getOr:R,or:R,getOrThunk:B,orThunk:B,getOrDie:(o=String(e),()=>{throw new Error(o)}),each:S,toOptional:M.none};var o;return n},ui={value:di,error:ci,fromOption:(e,t)=>e.fold((()=>ci(t)),di)},mi=e=>{if(!p(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],n={};return $(e,((o,r)=>{const s=ue(o);if(1!==s.length)throw new Error("one and only one name per case");const a=s[0],i=o[a];if(void 0!==n[a])throw new Error("duplicate key detected:"+a);if("cata"===a)throw new Error("cannot have a case named cata (sorry)");if(!p(i))throw new Error("case arguments must be an array");t.push(a),n[a]=(...n)=>{const o=n.length;if(o!==i.length)throw new Error("Wrong number of arguments to case "+a+". Expected "+i.length+" ("+i+"), got "+o);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[r].apply(null,n)},match:e=>{const o=ue(e);if(t.length!==o.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+o.join(","));if(!te(t,(e=>j(o,e))))throw new Error("Not all branches were specified when using match. Specified: "+o.join(", ")+"\nRequired: "+t.join(", "));return e[a].apply(null,n)},log:e=>{console.log(e,{constructors:t,constructor:a,params:n})}}}})),n};mi([{bothErrors:["error1","error2"]},{firstError:["error1","value2"]},{secondError:["value1","error2"]},{bothValues:["value1","value2"]}]);const fi=e=>"inline-command"===e.type||"inline-format"===e.type,gi=e=>"block-command"===e.type||"block-format"===e.type,pi=e=>{const t=t=>ui.error({message:t,pattern:e}),n=(n,o,r)=>{if(void 0!==e.format){let r;if(p(e.format)){if(!te(e.format,m))return t(n+" pattern has non-string items in the `format` array");r=e.format}else{if(!m(e.format))return t(n+" pattern has non-string `format` parameter");r=[e.format]}return ui.value(o(r))}return void 0!==e.cmd?m(e.cmd)?ui.value(r(e.cmd,e.value)):t(n+" pattern has non-string `cmd` parameter"):t(n+" pattern is missing both `format` and `cmd` parameters")};if(!f(e))return t("Raw pattern is not an object");if(!m(e.start))return t("Raw pattern is missing `start` parameter");if(void 0!==e.end){if(!m(e.end))return t("Inline pattern has non-string `end` parameter");if(0===e.start.length&&0===e.end.length)return t("Inline pattern has empty `start` and `end` parameters");let o=e.start,r=e.end;return 0===r.length&&(r=o,o=""),n("Inline",(e=>({type:"inline-format",start:o,end:r,format:e})),((e,t)=>({type:"inline-command",start:o,end:r,cmd:e,value:t})))}return void 0!==e.replacement?m(e.replacement)?0===e.start.length?t("Replacement pattern has empty `start` parameter"):ui.value({type:"inline-command",start:"",end:e.start,cmd:"mceInsertContent",value:e.replacement}):t("Replacement pattern has non-string `replacement` parameter"):0===e.start.length?t("Block pattern has empty `start` parameter"):n("Block",(t=>({type:"block-format",start:e.start,format:t[0]})),((t,n)=>({type:"block-command",start:e.start,cmd:t,value:n})))},hi=e=>(e=>se(e,((e,t)=>e.start.length===t.start.length?0:e.start.length>t.start.length?-1:1)))(K(e,gi)),bi=e=>K(e,fi),vi=e=>{const t=(e=>{const t=[],n=[];return $(e,(e=>{e.fold((e=>{t.push(e)}),(e=>{n.push(e)}))})),{errors:t,values:n}})(H(e,pi));return $(t.errors,(e=>console.error(e.message,e.pattern))),t.values},yi=Ct().deviceType,Ci=yi.isTouch(),xi=Us.DOM,wi=e=>u(e,RegExp),ki=e=>t=>t.options.get(e),Si=e=>m(e)||f(e),_i=(e,t="")=>n=>{const o=m(n);if(o){if(-1!==n.indexOf("=")){const r=(e=>{const t=e.indexOf("=")>0?e.split(/[;,](?![^=;,]*(?:[;,]|$))/):e.split(",");return Y(t,((e,t)=>{const n=t.split("="),o=n[0],r=n.length>1?n[1]:o;return e[He(o)]=He(r),e}),{})})(n);return{value:xe(r,e.id).getOr(t),valid:o}}return{value:n,valid:o}}return{valid:!1,message:"Must be a string."}},Ei=ki("iframe_attrs"),Ni=ki("doctype"),Ri=ki("document_base_url"),Ai=ki("body_id"),Oi=ki("body_class"),Ti=ki("content_security_policy"),Bi=ki("br_in_pre"),Di=ki("forced_root_block"),Li=ki("forced_root_block_attrs"),Pi=ki("br_newline_selector"),Mi=ki("no_newline_selector"),Ii=ki("keep_styles"),Fi=ki("end_container_on_empty_block"),Ui=ki("automatic_uploads"),zi=ki("images_reuse_filename"),ji=ki("images_replace_blob_uris"),Vi=ki("icons"),Hi=ki("icons_url"),$i=ki("images_upload_url"),qi=ki("images_upload_base_path"),Wi=ki("images_upload_credentials"),Ki=ki("images_upload_handler"),Gi=ki("content_css_cors"),Yi=ki("referrer_policy"),Xi=ki("language"),Qi=ki("language_url"),Ji=ki("indent_use_margin"),Zi=ki("indentation"),el=ki("content_css"),tl=ki("content_style"),nl=ki("font_css"),ol=ki("directionality"),rl=ki("inline_boundaries_selector"),sl=ki("object_resizing"),al=ki("resize_img_proportional"),il=ki("placeholder"),ll=ki("event_root"),dl=ki("service_message"),cl=ki("theme"),ul=ki("theme_url"),ml=ki("model"),fl=ki("model_url"),gl=ki("inline_boundaries"),pl=ki("formats"),hl=ki("preview_styles"),bl=ki("format_empty_lines"),vl=ki("custom_ui_selector"),yl=ki("inline"),Cl=ki("hidden_input"),xl=ki("submit_patch"),wl=ki("add_form_submit_trigger"),kl=ki("add_unload_trigger"),Sl=ki("custom_undo_redo_levels"),_l=ki("disable_nodechange"),El=ki("readonly"),Nl=ki("content_css_cors"),Rl=ki("plugins"),Al=ki("external_plugins"),Ol=ki("block_unsupported_drop"),Tl=ki("visual"),Bl=ki("visual_table_class"),Dl=ki("visual_anchor_class"),Ll=ki("iframe_aria_text"),Pl=ki("setup"),Ml=ki("init_instance_callback"),Il=ki("urlconverter_callback"),Fl=ki("auto_focus"),Ul=ki("browser_spellcheck"),zl=ki("protect"),jl=ki("paste_block_drop"),Vl=ki("paste_data_images"),Hl=ki("paste_preprocess"),$l=ki("paste_postprocess"),ql=ki("paste_webkit_styles"),Wl=ki("paste_remove_styles_if_webkit"),Kl=ki("paste_merge_formats"),Gl=ki("smart_paste"),Yl=ki("paste_as_text"),Xl=ki("paste_tab_spaces"),Ql=ki("allow_html_data_urls"),Jl=ki("text_patterns"),Zl=ki("noneditable_class"),ed=ki("editable_class"),td=ki("noneditable_regexp"),nd=e=>Bt.explode(e.options.get("images_file_types")),od=ki("table_tab_navigation"),rd=yo,sd=No,ad=e=>{const t=e.parentNode;t&&t.removeChild(e)},id=e=>{const t=fr(e);return{count:e.length-t.length,text:t}},ld=e=>{let t;for(;-1!==(t=e.data.lastIndexOf(ur));)e.deleteData(t,1)},dd=(e,t)=>(ud(e),t),cd=(e,t)=>ja.isTextPosition(t)?((e,t)=>sd(e)&&t.container()===e?((e,t)=>{const n=id(e.data.substr(0,t.offset())),o=id(e.data.substr(t.offset()));return(n.text+o.text).length>0?(ld(e),ja(e,t.offset()-n.count)):t})(e,t):dd(e,t))(e,t):((e,t)=>t.container()===e.parentNode?((e,t)=>{const n=t.container(),o=((e,t)=>{const n=z(e,t);return-1===n?M.none():M.some(n)})(de(n.childNodes),e).map((e=>e<t.offset()?ja(n,t.offset()-1):t)).getOr(t);return ud(e),o})(e,t):dd(e,t))(e,t),ud=e=>{rd(e)&&vr(e)&&(yr(e)?e.removeAttribute("data-mce-caret"):ad(e)),sd(e)&&(ld(e),0===e.data.length&&ad(e))},md=Mo,fd=Fo,gd=Io,pd=(e,t,n)=>{const o=pa(t.getBoundingClientRect(),n);let r,s;if("BODY"===e.tagName){const t=e.ownerDocument.documentElement;r=e.scrollLeft||t.scrollLeft,s=e.scrollTop||t.scrollTop}else{const t=e.getBoundingClientRect();r=e.scrollLeft-t.left,s=e.scrollTop-t.top}o.left+=r,o.right+=r,o.top+=s,o.bottom+=s,o.width=1;let a=t.offsetWidth-t.clientWidth;return a>0&&(n&&(a*=-1),o.left+=a,o.right+=a),o},hd=(e,t,n,o)=>{const r=Gs();let s,a;const i=Di(e),l=e.dom,d=()=>{(e=>{const t=Js(mn(e),"*[contentEditable=false],video,audio,embed,object");for(let e=0;e<t.length;e++){const n=t[e].dom;let o=n.previousSibling;if(kr(o)){const e=o.data;1===e.length?o.parentNode.removeChild(o):o.deleteData(e.length-1,1)}o=n.nextSibling,wr(o)&&(1===o.data.length?o.parentNode.removeChild(o):o.deleteData(0,1))}})(t),a&&(ud(a),a=null),r.on((e=>{l.remove(e.caret),r.clear()})),s&&(clearInterval(s),s=void 0)};return{show:(e,c)=>{let u;if(d(),gd(c))return null;if(!n(c))return a=((e,t)=>{const n=e.ownerDocument.createTextNode(ur),o=e.parentNode;if(t){const t=e.previousSibling;if(pr(t)){if(vr(t))return t;if(kr(t))return t.splitText(t.data.length-1)}o.insertBefore(n,e)}else{const t=e.nextSibling;if(pr(t)){if(vr(t))return t;if(wr(t))return t.splitText(1),t}e.nextSibling?o.insertBefore(n,e.nextSibling):o.appendChild(n)}return n})(c,e),u=c.ownerDocument.createRange(),vd(a.nextSibling)?(u.setStart(a,0),u.setEnd(a,0)):(u.setStart(a,1),u.setEnd(a,1)),u;{a=((e,t,n)=>{const o=t.ownerDocument.createElement(e);o.setAttribute("data-mce-caret",n?"before":"after"),o.setAttribute("data-mce-bogus","all"),o.appendChild((()=>{const e=document.createElement("br");return e.setAttribute("data-mce-bogus","1"),e})());const r=t.parentNode;return n?r.insertBefore(o,t):t.nextSibling?r.insertBefore(o,t.nextSibling):r.appendChild(o),o})(i,c,e);const n=pd(t,c,e);l.setStyle(a,"top",n.top);const d=l.create("div",{class:"mce-visual-caret","data-mce-bogus":"all"});l.setStyles(d,{...n}),l.add(t,d),r.set({caret:d,element:c,before:e}),e&&l.addClass(d,"mce-visual-caret-before"),s=setInterval((()=>{r.on((e=>{o()?l.toggleClass(e.caret,"mce-visual-caret-hidden"):l.addClass(e.caret,"mce-visual-caret-hidden")}))}),500),u=c.ownerDocument.createRange(),u.setStart(a,0),u.setEnd(a,0)}return u},hide:d,getCss:()=>".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:()=>{r.on((e=>{const n=pd(t,e.element,e.before);l.setStyles(e.caret,{...n})}))},destroy:()=>clearInterval(s)}},bd=()=>Nt.browser.isFirefox(),vd=e=>md(e)||fd(e),yd=e=>vd(e)||So(e)&&bd(),Cd=Po,xd=Mo,wd=Fo,kd=xo("display","block table table-cell table-caption list-item"),Sd=vr,_d=hr,Ed=yo,Nd=Lr,Rd=e=>e>0,Ad=e=>e<0,Od=(e,t)=>{let n;for(;n=e(t);)if(!_d(n))return n;return null},Td=(e,t,n,o,r)=>{const s=new Xo(e,o),a=xd(e)||_d(e);if(Ad(t)){if(a&&n(e=Od(s.prev.bind(s),!0)))return e;for(;e=Od(s.prev.bind(s),r);)if(n(e))return e}if(Rd(t)){if(a&&n(e=Od(s.next.bind(s),!0)))return e;for(;e=Od(s.next.bind(s),r);)if(n(e))return e}return null},Bd=(e,t)=>{for(;e&&e!==t;){if(kd(e))return e;e=e.parentNode}return null},Dd=(e,t,n)=>Bd(e.container(),n)===Bd(t.container(),n),Ld=(e,t)=>{if(!t)return null;const n=t.container(),o=t.offset();return Ed(n)?n.childNodes[o+e]:null},Pd=(e,t)=>{const n=t.ownerDocument.createRange();return e?(n.setStartBefore(t),n.setEndBefore(t)):(n.setStartAfter(t),n.setEndAfter(t)),n},Md=(e,t,n)=>Bd(t,e)===Bd(n,e),Id=(e,t,n)=>{const o=e?"previousSibling":"nextSibling";for(;n&&n!==t;){let e=n[o];if(Sd(e)&&(e=e[o]),xd(e)||wd(e)){if(Md(t,e,n))return e;break}if(Nd(e))break;n=n.parentNode}return null},Fd=O(Pd,!0),Ud=O(Pd,!1),zd=(e,t,n)=>{let o;const r=O(Id,!0,t),s=O(Id,!1,t);let a=n.startContainer;const i=n.startOffset;if(hr(a)){Ed(a)||(a=a.parentNode);const e=a.getAttribute("data-mce-caret");if("before"===e&&(o=a.nextSibling,yd(o)))return Fd(o);if("after"===e&&(o=a.previousSibling,yd(o)))return Ud(o)}if(!n.collapsed)return n;if(No(a)){if(Sd(a)){if(1===e){if(o=s(a),o)return Fd(o);if(o=r(a),o)return Ud(o)}if(-1===e){if(o=r(a),o)return Ud(o);if(o=s(a),o)return Fd(o)}return n}if(kr(a)&&i>=a.data.length-1)return 1===e&&(o=s(a),o)?Fd(o):n;if(wr(a)&&i<=1)return-1===e&&(o=r(a),o)?Ud(o):n;if(i===a.data.length)return o=s(a),o?Fd(o):n;if(0===i)return o=r(a),o?Ud(o):n}return n},jd=(e,t)=>M.from(Ld(e?0:-1,t)).filter(xd),Vd=(e,t,n)=>{const o=zd(e,t,n);return-1===e?ja.fromRangeStart(o):ja.fromRangeEnd(o)},Hd=e=>M.from(e.getNode()).map(mn),$d=(e,t)=>{for(;t=e(t);)if(t.isVisible())return t;return t},qd=(e,t)=>{const n=Dd(e,t);return!(n||!Do(e.getNode()))||n};var Wd;!function(e){e[e.Backwards=-1]="Backwards",e[e.Forwards=1]="Forwards"}(Wd||(Wd={}));const Kd=Mo,Gd=No,Yd=yo,Xd=Do,Qd=Lr,Jd=e=>Tr(e)||(e=>!!Pr(e)&&!0!==Y(de(e.getElementsByTagName("*")),((e,t)=>e||Er(t)),!1))(e),Zd=Mr,ec=(e,t)=>e.hasChildNodes()&&t<e.childNodes.length?e.childNodes[t]:null,tc=(e,t)=>{if(Rd(e)){if(Qd(t.previousSibling)&&!Gd(t.previousSibling))return ja.before(t);if(Gd(t))return ja(t,0)}if(Ad(e)){if(Qd(t.nextSibling)&&!Gd(t.nextSibling))return ja.after(t);if(Gd(t))return ja(t,t.data.length)}return Ad(e)?Xd(t)?ja.before(t):ja.after(t):ja.before(t)},nc=(e,t,n)=>{let o,r,s,a;if(!Yd(n)||!t)return null;if(t.isEqual(ja.after(n))&&n.lastChild){if(a=ja.after(n.lastChild),Ad(e)&&Qd(n.lastChild)&&Yd(n.lastChild))return Xd(n.lastChild)?ja.before(n.lastChild):a}else a=t;const i=a.container();let l=a.offset();if(Gd(i)){if(Ad(e)&&l>0)return ja(i,--l);if(Rd(e)&&l<i.length)return ja(i,++l);o=i}else{if(Ad(e)&&l>0&&(r=ec(i,l-1),Qd(r)))return!Jd(r)&&(s=Td(r,e,Zd,r),s)?Gd(s)?ja(s,s.data.length):ja.after(s):Gd(r)?ja(r,r.data.length):ja.before(r);if(Rd(e)&&l<i.childNodes.length&&(r=ec(i,l),Qd(r)))return Xd(r)?((e,t)=>{const n=t.nextSibling;return n&&Qd(n)?Gd(n)?ja(n,0):ja.before(n):nc(Wd.Forwards,ja.after(t),e)})(n,r):!Jd(r)&&(s=Td(r,e,Zd,r),s)?Gd(s)?ja(s,0):ja.before(s):Gd(r)?ja(r,0):ja.after(r);o=r||a.getNode()}if((Rd(e)&&a.isAtEnd()||Ad(e)&&a.isAtStart())&&(o=Td(o,e,P,n,!0),Zd(o,n)))return tc(e,o);r=Td(o,e,Zd,n);const d=Be(K(((e,t)=>{const n=[];for(;e&&e!==t;)n.push(e),e=e.parentNode;return n})(i,n),Kd));return!d||r&&d.contains(r)?r?tc(e,r):null:(a=Rd(e)?ja.after(d):ja.before(d),a)},oc=e=>({next:t=>nc(Wd.Forwards,t,e),prev:t=>nc(Wd.Backwards,t,e)}),rc=e=>ja.isTextPosition(e)?0===e.offset():Lr(e.getNode()),sc=e=>{if(ja.isTextPosition(e)){const t=e.container();return e.offset()===t.data.length}return Lr(e.getNode(!0))},ac=(e,t)=>!ja.isTextPosition(e)&&!ja.isTextPosition(t)&&e.getNode()===t.getNode(!0),ic=(e,t,n)=>{const o=oc(t);return M.from(e?o.next(n):o.prev(n))},lc=(e,t,n)=>ic(e,t,n).bind((o=>Dd(n,o,t)&&((e,t,n)=>{return e?!ac(t,n)&&(o=t,!(!ja.isTextPosition(o)&&Do(o.getNode())))&&sc(t)&&rc(n):!ac(n,t)&&rc(t)&&sc(n);var o})(e,n,o)?ic(e,t,o):M.some(o))),dc=(e,t,n,o)=>lc(e,t,n).bind((n=>o(n)?dc(e,t,n,o):M.some(n))),cc=(e,t)=>{const n=e?t.firstChild:t.lastChild;return No(n)?M.some(ja(n,e?0:n.data.length)):n?Lr(n)?M.some(e?ja.before(n):Do(o=n)?ja.before(o):ja.after(o)):((e,t,n)=>{const o=e?ja.before(n):ja.after(n);return ic(e,t,o)})(e,t,n):M.none();var o},uc=O(ic,!0),mc=O(ic,!1),fc=O(cc,!0),gc=O(cc,!1),pc="_mce_caret",hc=e=>yo(e)&&e.id===pc,bc=(e,t)=>{for(;t&&t!==e;){if(t.id===pc)return t;t=t.parentNode}return null},vc=e=>Bt.isArray(e.start),yc=(e,t)=>(yo(t)&&e.isBlock(t)&&!t.innerHTML&&(t.innerHTML='<br data-mce-bogus="1" />'),t),Cc=(e,t)=>gc(e).fold(L,(e=>(t.setStart(e.container(),e.offset()),t.setEnd(e.container(),e.offset()),!0))),xc=(e,t,n)=>!(!(e=>!1===e.hasChildNodes())(t)||!bc(e,t)||(((e,t)=>{const n=e.ownerDocument.createTextNode(ur);e.appendChild(n),t.setStart(n,0),t.setEnd(n,0)})(t,n),0)),wc=(e,t,n,o)=>{const r=n[t?"start":"end"];let s,a,i,l;const d=e.getRoot();if(r){for(i=r[0],a=d,s=r.length-1;s>=1;s--){if(l=a.childNodes,xc(d,a,o))return!0;if(r[s]>l.length-1)return!!xc(d,a,o)||Cc(a,o);a=l[r[s]]}3===a.nodeType&&(i=Math.min(r[0],a.nodeValue.length)),1===a.nodeType&&(i=Math.min(r[0],a.childNodes.length)),t?o.setStart(a,i):o.setEnd(a,i)}return!0},kc=e=>No(e)&&e.data.length>0,Sc=(e,t,n)=>{let o,r,s,a,i=e.get(n.id+"_"+t);const l=n.keep;let d,c;if(i){if(o=i.parentNode,"start"===t?(l?i.hasChildNodes()?(o=i.firstChild,r=1):kc(i.nextSibling)?(o=i.nextSibling,r=0):kc(i.previousSibling)?(o=i.previousSibling,r=i.previousSibling.data.length):(o=i.parentNode,r=e.nodeIndex(i)+1):r=e.nodeIndex(i),d=o,c=r):(l?i.hasChildNodes()?(o=i.firstChild,r=1):kc(i.previousSibling)?(o=i.previousSibling,r=i.previousSibling.data.length):(o=i.parentNode,r=e.nodeIndex(i)):r=e.nodeIndex(i),d=o,c=r),!l){for(a=i.previousSibling,s=i.nextSibling,Bt.each(Bt.grep(i.childNodes),(e=>{No(e)&&(e.nodeValue=e.nodeValue.replace(/\uFEFF/g,""))}));i=e.get(n.id+"_"+t);)e.remove(i,!0);a&&s&&a.nodeType===s.nodeType&&No(a)&&!Nt.browser.isOpera()&&(r=a.nodeValue.length,a.appendData(s.nodeValue),e.remove(s),d=a,c=r)}return M.some(ja(d,c))}return M.none()},_c=(e,t,n)=>((e,t,n)=>2===t?si(fr,n,e):3===t?(e=>{const t=e.getRng();return{start:Qa(e.dom.getRoot(),ja.fromRangeStart(t)),end:Qa(e.dom.getRoot(),ja.fromRangeEnd(t))}})(e):t?(e=>({rng:e.getRng()}))(e):ii(e,!1))(e,t,n),Ec=(e,t)=>{((e,t)=>{const n=e.dom;if(t){if(vc(t))return((e,t)=>{const n=e.createRng();return wc(e,!0,t,n)&&wc(e,!1,t,n)?M.some(n):M.none()})(n,t);if((e=>m(e.start))(t))return M.some(((e,t)=>{let n;const o=e.createRng();return n=Ja(e.getRoot(),t.start),o.setStart(n.container(),n.offset()),n=Ja(e.getRoot(),t.end),o.setEnd(n.container(),n.offset()),o})(n,t));if((e=>we(e,"id"))(t))return((e,t)=>{const n=Sc(e,"start",t),o=Sc(e,"end",t);return Lt(n,o.or(n),((t,n)=>{const o=e.createRng();return o.setStart(yc(e,t.container()),t.offset()),o.setEnd(yc(e,n.container()),n.offset()),o}))})(n,t);if((e=>we(e,"name"))(t))return((e,t)=>M.from(e.select(t.name)[t.index]).map((t=>{const n=e.createRng();return n.selectNode(t),n})))(n,t);if((e=>we(e,"rng"))(t))return M.some(t.rng)}return M.none()})(e,t).each((t=>{e.setRng(t)}))},Nc=e=>yo(e)&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type"),Rc=(dr,e=>"\xa0"===e);const Ac=e=>""!==e&&-1!==" \f\n\r\t\v".indexOf(e),Oc=e=>!Ac(e)&&!Rc(e)&&!cr(e),Tc=e=>{const t=e.toString(16);return(1===t.length?"0"+t:t).toUpperCase()},Bc=e=>(e=>({value:e}))(Tc(e.red)+Tc(e.green)+Tc(e.blue)),Dc=/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/i,Lc=/^\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?(?:\.\d+)?)\s*\)\s*$/i,Pc=(e,t,n,o)=>({red:e,green:t,blue:n,alpha:o}),Mc=(e,t,n,o)=>{const r=parseInt(e,10),s=parseInt(t,10),a=parseInt(n,10),i=parseFloat(o);return Pc(r,s,a,i)},Ic=e=>(e=>{if("transparent"===e)return M.some(Pc(0,0,0,0));const t=Dc.exec(e);if(null!==t)return M.some(Mc(t[1],t[2],t[3],"1"));const n=Lc.exec(e);return null!==n?M.some(Mc(n[1],n[2],n[3],n[4])):M.none()})(e).map(Bc).map((e=>"#"+e.value)).getOr(e),Fc=e=>!!e.nodeType,Uc=(e,t,n)=>{const o=n.startOffset;let r=n.startContainer;var s;if((r!==n.endContainer||!(s=r.childNodes[o])||!/^(IMG)$/.test(s.nodeName))&&yo(r)){const s=r.childNodes;let a;o<s.length?(r=s[o],a=new Xo(r,e.getParent(r,e.isBlock))):(r=s[s.length-1],a=new Xo(r,e.getParent(r,e.isBlock)),a.next(!0));for(let e=a.current();e;e=a.next())if(No(e)&&!Hc(e))return n.setStart(e,0),void t.setRng(n)}},zc=(e,t,n)=>{if(e){const o=t?"nextSibling":"previousSibling";for(e=n?e:e[o];e;e=e[o])if(yo(e)||!Hc(e))return e}},jc=(e,t)=>(Fc(t)&&(t=t.nodeName),!!e.schema.getTextBlockElements()[t.toLowerCase()]),Vc=(e,t,n)=>e.schema.isValidChild(t,n),Hc=(e,t=!1)=>{if(C(e)&&No(e)){const n=t?e.data.replace(/ /g,"\xa0"):e.data;return Fr(n)}return!1},$c=(e,t)=>(x(e)?e=e(t):C(t)&&(e=e.replace(/%(\w+)/g,((e,n)=>t[n]||e))),e),qc=(e,t)=>(t=t||"",e=""+((e=e||"").nodeName||e),t=""+(t.nodeName||t),e.toLowerCase()===t.toLowerCase()),Wc=(e,t)=>("color"!==t&&"backgroundColor"!==t||(e=Ic(e)),"fontWeight"===t&&700===e&&(e="bold"),"fontFamily"===t&&(e=e.replace(/[\'\"]/g,"").replace(/,\s+/g,",")),""+e),Kc=(e,t,n)=>Wc(e.getStyle(t,n),n),Gc=(e,t)=>{let n;return e.getParent(t,(t=>(n=e.getStyle(t,"text-decoration"),n&&"none"!==n))),n},Yc=(e,t,n)=>e.getParents(t,n,e.getRoot()),Xc=e=>ke(e,"block"),Qc=e=>ke(e,"selector"),Jc=e=>ke(e,"inline"),Zc=e=>Qc(e)&&!1!==e.expand&&!Jc(e),eu=Nc,tu=Yc,nu=Hc,ou=jc,ru=(e,t)=>{let n=t;for(;n;){if(yo(n)&&e.getContentEditable(n))return"false"===e.getContentEditable(n)?n:t;n=n.parentNode}return t},su=(e,t,n,o)=>{const r=t.data;for(let t=n;e?t>=0:t<r.length;e?t--:t++)if(o(r.charAt(t)))return e?t+1:t;return-1},au=(e,t,n)=>su(e,t,n,(e=>Rc(e)||Ac(e))),iu=(e,t,n)=>su(e,t,n,Oc),lu=(e,t,n,o,r,s)=>{let a;const i=e.getParent(n,e.isBlock)||t,l=(t,n,o)=>{const s=ma(e),l=r?s.backwards:s.forwards;return M.from(l(t,n,((e,t)=>eu(e.parentNode)?-1:(a=e,o(r,e,t))),i))};return l(n,o,au).bind((e=>s?l(e.container,e.offset+(r?-1:0),iu):M.some(e))).orThunk((()=>a?M.some({container:a,offset:r?0:a.length}):M.none()))},du=(e,t,n,o,r)=>{No(o)&&Ke(o.data)&&o[r]&&(o=o[r]);const s=tu(e,o);for(let o=0;o<s.length;o++)for(let r=0;r<t.length;r++){const a=t[r];if((!C(a.collapsed)||a.collapsed===n.collapsed)&&Qc(a)&&e.is(s[o],a.selector))return s[o]}return o},cu=(e,t,n,o)=>{let r=n;const s=e.dom,a=s.getRoot(),i=t[0];if(Xc(i)&&(r=i.wrapper?null:s.getParent(n,i.block,a)),!r){const t=s.getParent(n,"LI,TD,TH");r=s.getParent(No(n)?n.parentNode:n,(t=>t!==a&&ou(e,t)),t)}if(r&&Xc(i)&&i.wrapper&&(r=tu(s,r,"ul,ol").reverse()[0]||r),!r)for(r=n;r[o]&&!s.isBlock(r[o])&&(r=r[o],!qc(r,"br")););return r||n},uu=(e,t,n,o)=>{const r=n.parentNode;return!C(n[o])&&(!(r!==t&&!y(r)&&!e.isBlock(r))||uu(e,t,r,o))},mu=(e,t,n,o,r)=>{let s=n;const a=r?"previousSibling":"nextSibling",i=e.getRoot();if(No(n)&&!nu(n)&&(r?o>0:o<n.data.length))return n;for(;;){if(!t[0].block_expand&&e.isBlock(s))return s;for(let t=s[a];t;t=t[a]){const n=No(t)&&!uu(e,i,t,a);if(!eu(t)&&(!Do(l=t)||!l.getAttribute("data-mce-bogus")||l.nextSibling)&&!nu(t,n))return s}if(s===i||s.parentNode===i){n=s;break}s=s.parentNode}var l;return n},fu=e=>eu(e.parentNode)||eu(e),gu=(e,t,n,o=!1)=>{let{startContainer:r,startOffset:s,endContainer:a,endOffset:i}=t;const l=e.dom,d=n[0];return yo(r)&&r.hasChildNodes()&&(r=xa(r,s),No(r)&&(s=0)),yo(a)&&a.hasChildNodes()&&(a=xa(a,t.collapsed?i:i-1),No(a)&&(i=a.nodeValue.length)),r=ru(l,r),a=ru(l,a),fu(r)&&(r=eu(r)?r:r.parentNode,r=t.collapsed?r.previousSibling||r:r.nextSibling||r,No(r)&&(s=t.collapsed?r.length:0)),fu(a)&&(a=eu(a)?a:a.parentNode,a=t.collapsed?a.nextSibling||a:a.previousSibling||a,No(a)&&(i=t.collapsed?0:a.length)),t.collapsed&&(lu(l,e.getBody(),r,s,!0,o).each((({container:e,offset:t})=>{r=e,s=t})),lu(l,e.getBody(),a,i,!1,o).each((({container:e,offset:t})=>{a=e,i=t}))),(Jc(d)||d.block_expand)&&(Jc(d)&&No(r)&&0!==s||(r=mu(l,n,r,s,!0)),Jc(d)&&No(a)&&i!==a.nodeValue.length||(a=mu(l,n,a,i,!1))),Zc(d)&&(r=du(l,n,t,r,"previousSibling"),a=du(l,n,t,a,"nextSibling")),(Xc(d)||Qc(d))&&(r=cu(e,n,r,"previousSibling"),a=cu(e,n,a,"nextSibling"),Xc(d)&&(l.isBlock(r)||(r=mu(l,n,r,s,!0)),l.isBlock(a)||(a=mu(l,n,a,i,!1)))),yo(r)&&(s=l.nodeIndex(r),r=r.parentNode),yo(a)&&(i=l.nodeIndex(a)+1,a=a.parentNode),{startContainer:r,startOffset:s,endContainer:a,endOffset:i}},pu=(e,t,n)=>{const o=t.startOffset,r=xa(t.startContainer,o),s=t.endOffset,a=xa(t.endContainer,s-1),i=e=>{const t=e[0];No(t)&&t===r&&o>=t.data.length&&e.splice(0,1);const n=e[e.length-1];return 0===s&&e.length>0&&n===a&&No(n)&&e.splice(e.length-1,1),e},l=(e,t,n)=>{const o=[];for(;e&&e!==n;e=e[t])o.push(e);return o},d=(t,n)=>e.getParent(t,(e=>e.parentNode===n),n),c=(e,t,o)=>{const r=o?"nextSibling":"previousSibling";for(let s=e,a=s.parentNode;s&&s!==t;s=a){a=s.parentNode;const t=l(s===e?s:s[r],r);t.length&&(o||t.reverse(),n(i(t)))}};if(r===a)return n(i([r]));const u=e.findCommonAncestor(r,a);if(e.isChildOf(r,a))return c(r,u,!0);if(e.isChildOf(a,r))return c(a,u);const m=d(r,u)||r,f=d(a,u)||a;c(r,m,!0);const g=l(m===r?m:m.nextSibling,"nextSibling",f===a?f.nextSibling:f);g.length&&n(i(g)),c(a,f)},hu=e=>{const t=[];if(e)for(let n=0;n<e.rangeCount;n++)t.push(e.getRangeAt(n));return t},bu=(e,t)=>{const n=Js(t,"td[data-mce-selected],th[data-mce-selected]");return n.length>0?n:(e=>K((e=>ee(e,(e=>{const t=Ca(e);return t?[mn(t)]:[]})))(e),ar))(e)},vu=e=>bu(hu(e.selection.getSel()),mn(e.getBody())),yu=(e,t)=>qo(e,"table",t),Cu=e=>An(e).fold(N([e]),(t=>[e].concat(Cu(t)))),xu=e=>On(e).fold(N([e]),(t=>"br"===Mt(t)?kn(t).map((t=>[e].concat(xu(t)))).getOr([]):[e].concat(xu(t)))),wu=(e,t)=>Lt((e=>{const t=e.startContainer,n=e.startOffset;return No(t)?0===n?M.some(mn(t)):M.none():M.from(t.childNodes[n]).map(mn)})(t),(e=>{const t=e.endContainer,n=e.endOffset;return No(t)?n===t.data.length?M.some(mn(t)):M.none():M.from(t.childNodes[n-1]).map(mn)})(t),((t,n)=>{const o=Q(Cu(e),O(bn,t)),r=Q(xu(e),O(bn,n));return o.isSome()&&r.isSome()})).getOr(!1),ku=(e,t,n,o)=>{const r=n,s=new Xo(n,r),a=ve(e.schema.getMoveCaretBeforeOnEnterElements(),((e,t)=>!j(["td","th","table"],t.toLowerCase())));do{if(No(n)&&0!==Bt.trim(n.nodeValue).length)return void(o?t.setStart(n,0):t.setEnd(n,n.nodeValue.length));if(a[n.nodeName])return void(o?t.setStartBefore(n):"BR"===n.nodeName?t.setEndBefore(n):t.setEndAfter(n))}while(n=o?s.next():s.prev());"BODY"===r.nodeName&&(o?t.setStart(r,0):t.setEnd(r,r.childNodes.length))},Su=e=>{const t=e.selection.getSel();return t&&t.rangeCount>0},_u=(e,t)=>{const n=vu(e);n.length>0?$(n,(n=>{const o=n.dom,r=e.dom.createRng();r.setStartBefore(o),r.setEndAfter(o),t(r,!0)})):t(e.selection.getRng(),!1)},Eu=(e,t,n)=>{const o=ii(e,t);n(o),e.moveToBookmark(o)},Nu=((e,t)=>{const n=t=>e(t)?M.from(t.dom.nodeValue):M.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return n(t).getOr("")},getOption:n,set:(t,n)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=n}}})(zt),Ru=e=>Nu.get(e),Au=e=>Nu.getOption(e),Ou=(e,{uid:t=ia("mce-annotation"),...n},o,r)=>{const s=cn("span",e);nn(s,Zs()),$t(s,`${ta()}`,t),$t(s,`${ea()}`,o);const{attributes:a={},classes:i=[]}=r(t,n);return qt(s,a),((e,t)=>{$(t,(t=>{nn(e,t)}))})(s,i),s},Tu=(e,t,n,o,r)=>{const s=[],a=Ou(e.getDoc(),r,n,o),i=Gs(),l=()=>{i.clear()},d=e=>{$(e,c)},c=t=>{switch(((e,t,n,o)=>wn(t).fold((()=>"skipping"),(r=>"br"===o||(e=>zt(e)&&Ru(e)===ur)(t)?"valid":(e=>Ut(e)&&sn(e,Zs()))(t)?"existing":hc(t.dom)?"caret":Vc(e,n,o)&&Vc(e,Mt(r),n)?"valid":"invalid-child")))(e,t,"span",Mt(t))){case"invalid-child":{l();const e=Nn(t);d(e),l();break}case"valid":{const e=i.get().getOrThunk((()=>{const e=da(a);return s.push(e),i.set(e),e}));((e,t)=>{Yn(e,t),Jn(t,e)})(t,e);break}}};return pu(e.dom,t,(e=>{l(),(e=>{const t=H(e,mn);d(t)})(e)})),s},Bu=e=>{const t=(()=>{const e={};return{register:(t,n)=>{e[t]={name:t,settings:n}},lookup:t=>xe(e,t).map((e=>e.settings)),getNames:()=>ue(e)}})();((e,t)=>{e.serializer.addTempAttr(na()),e.serializer.addNodeFilter("span",(e=>{$(e,(e=>{(e=>M.from(e.attr(ea())).bind(t.lookup))(e).each((t=>{!1===t.persistent&&e.unwrap()}))}))}))})(e,t);const n=((e,t)=>{const n=Vs({}),o=()=>({listeners:[],previous:Gs()}),r=(e,t)=>{s(e,(e=>(t(e),e)))},s=(e,t)=>{const r=n.get(),s=t(xe(r,e).getOrThunk(o));r[e]=s,n.set(r)},a=(t,n)=>{$(ra(e,t),(e=>{n?$t(e,na(),"true"):Yt(e,na())}))},i=Xs((()=>{const n=se(t.getNames());$(n,(t=>{s(t,(n=>{const o=n.previous.get();return oa(e,M.some(t)).fold((()=>{o.each((e=>{(e=>{r(e,(t=>{$(t.listeners,(t=>t(!1,e)))}))})(t),n.previous.clear(),a(e,!1)}))}),(({uid:e,name:t,elements:s})=>{Dt(o,e)||(o.each((e=>a(e,!1))),((e,t,n)=>{r(e,(o=>{$(o.listeners,(o=>o(!0,e,{uid:t,nodes:H(n,(e=>e.dom))})))}))})(t,e,s),n.previous.set(e),a(e,!0))})),{previous:n.previous,listeners:n.listeners}}))}))}),30);return e.on("remove",(()=>{i.cancel()})),e.on("NodeChange",(()=>{i.throttle()})),{addListener:(e,t)=>{s(e,(e=>({previous:e.previous,listeners:e.listeners.concat([t])})))}}})(e,t);return{register:(e,n)=>{t.register(e,n)},annotate:(n,o)=>{t.lookup(n).each((t=>{((e,t,n,o)=>{e.undoManager.transact((()=>{const r=e.selection,s=r.getRng(),a=vu(e).length>0;if(s.collapsed&&!a&&((e,t)=>{const n=gu(e,t,[{inline:"span"}]);t.setStart(n.startContainer,n.startOffset),t.setEnd(n.endContainer,n.endOffset),e.selection.setRng(t)})(e,s),r.getRng().collapsed&&!a){const s=Ou(e.getDoc(),o,t,n.decorate);ro(s,dr),r.getRng().insertNode(s.dom),r.select(s.dom)}else Eu(r,!1,(()=>{_u(e,(r=>{Tu(e,r,t,n.decorate,o)}))}))}))})(e,n,t,o)}))},annotationChanged:(e,t)=>{n.addListener(e,t)},remove:t=>{const n=e.selection.getBookmark();oa(e,M.some(t)).each((({elements:e})=>{$(e,no)})),e.selection.moveToBookmark(n)},removeAll:t=>{const n=e.selection.getBookmark();fe(sa(e,t),((e,t)=>$(e,no))),e.selection.moveToBookmark(n)},getAll:t=>{const n=sa(e,t);return ge(n,(e=>H(e,(e=>e.dom))))}}},Du=e=>({getBookmark:O(_c,e),moveToBookmark:O(Ec,e)});Du.isBookmarkNode=Nc;const Lu=(e,t,n)=>!n.collapsed&&V(n.getClientRects(),(n=>((e,t,n)=>t>=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom)(n,e,t))),Pu=(e,t,n)=>e.dispatch(t,n),Mu=(e,t,n,o)=>e.dispatch("FormatApply",{format:t,node:n,vars:o}),Iu=(e,t,n,o)=>e.dispatch("FormatRemove",{format:t,node:n,vars:o}),Fu=(e,t)=>e.dispatch("SetContent",t),Uu=(e,t)=>e.dispatch("GetContent",t),zu=(e,t)=>e.dispatch("PastePlainTextToggle",{state:t}),ju={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:e=>e.shiftKey||e.ctrlKey||e.altKey||ju.metaKeyPressed(e),metaKeyPressed:e=>Nt.os.isMacOS()||Nt.os.isiOS()?e.metaKey:e.ctrlKey&&!e.altKey},Vu=(e,t)=>{const n="data-mce-selected",o=t.dom,r=Bt.each;let s,a,i,l,d,c,u,m,f,g,p,h,b;const v=t.getDoc(),y=document,x=Math.abs,w=Math.round,k=t.getBody();let S,_;const E={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]},N=e=>C(e)&&(Lo(e)||t.dom.is(e,"figure.image")),R=e=>Fo(e)||o.hasClass(e,"mce-preview-object"),A=e=>{const n=e.target;((e,t)=>{if("longpress"===e.type||0===e.type.indexOf("touch")){const n=e.touches[0];return N(e.target)&&!Lu(n.clientX,n.clientY,t)}return N(e.target)&&!Lu(e.clientX,e.clientY,t)})(e,t.selection.getRng())&&!e.isDefaultPrevented()&&t.selection.select(n)},O=e=>o.is(e,"figure.image")?[e.querySelector("img")]:o.hasClass(e,"mce-preview-object")&&C(e.firstElementChild)?[e,e.firstElementChild]:[e],T=e=>{const n=sl(t);return!!n&&"false"!==e.getAttribute("data-mce-resize")&&e!==t.getBody()&&(o.hasClass(e,"mce-preview-object")?pn(mn(e.firstElementChild),n):pn(mn(e),n))},B=(e,n,r)=>{if(C(r)){const s=O(e);$(s,(e=>{e.style[n]||!t.schema.isValid(e.nodeName.toLowerCase(),n)?o.setStyle(e,n,r):o.setAttrib(e,n,""+r)}))}},D=(e,t,n)=>{B(e,"width",t),B(e,"height",n)},L=e=>{let n,r,d,v,y;n=e.screenX-c,r=e.screenY-u,h=n*l[2]+m,b=r*l[3]+f,h=h<5?5:h,b=b<5?5:b,d=(N(s)||R(s))&&!1!==al(t)?!ju.modifierPressed(e):ju.modifierPressed(e),d&&(x(n)>x(r)?(b=w(h*g),h=w(b/g)):(h=w(b/g),b=w(h*g))),D(a,h,b),v=l.startPos.x+n,y=l.startPos.y+r,v=v>0?v:0,y=y>0?y:0,o.setStyles(i,{left:v,top:y,display:"block"}),i.innerHTML=h+" &times; "+b,l[2]<0&&a.clientWidth<=h&&o.setStyle(a,"left",void 0+(m-h)),l[3]<0&&a.clientHeight<=b&&o.setStyle(a,"top",void 0+(f-b)),n=k.scrollWidth-S,r=k.scrollHeight-_,n+r!==0&&o.setStyles(i,{left:v-n,top:y-r}),p||(((e,t,n,o,r)=>{e.dispatch("ObjectResizeStart",{target:t,width:n,height:o,origin:r})})(t,s,m,f,"corner-"+l.name),p=!0)},P=()=>{const e=p;p=!1,e&&(B(s,"width",h),B(s,"height",b)),o.unbind(v,"mousemove",L),o.unbind(v,"mouseup",P),y!==v&&(o.unbind(y,"mousemove",L),o.unbind(y,"mouseup",P)),o.remove(a),o.remove(i),o.remove(d),M(s),e&&(((e,t,n,o,r)=>{e.dispatch("ObjectResized",{target:t,width:n,height:o,origin:r})})(t,s,h,b,"corner-"+l.name),o.setAttrib(s,"style",o.getAttrib(s,"style"))),t.nodeChanged()},M=e=>{U();const p=o.getPos(e,k),C=p.x,x=p.y,w=e.getBoundingClientRect(),N=w.width||w.right-w.left,A=w.height||w.bottom-w.top;s!==e&&(I(),s=e,h=b=0);const B=t.dispatch("ObjectSelected",{target:e}),M=o.getAttrib(s,n,"1");T(e)&&!B.isDefaultPrevented()?r(E,((e,t)=>{let r;r=o.get("mceResizeHandle"+t),r&&o.remove(r),r=o.add(k,"div",{id:"mceResizeHandle"+t,"data-mce-bogus":"all",class:"mce-resizehandle",unselectable:!0,style:"cursor:"+t+"-resize; margin:0; padding:0"}),o.bind(r,"mousedown",(r=>{r.stopImmediatePropagation(),r.preventDefault(),(r=>{const p=O(s)[0];var h;c=r.screenX,u=r.screenY,m=p.clientWidth,f=p.clientHeight,g=f/m,l=e,l.name=t,l.startPos={x:N*e[0]+C,y:A*e[1]+x},S=k.scrollWidth,_=k.scrollHeight,d=o.add(k,"div",{class:"mce-resize-backdrop","data-mce-bogus":"all"}),o.setStyles(d,{position:"fixed",left:"0",top:"0",width:"100%",height:"100%"}),a=R(h=s)?o.create("img",{src:Nt.transparentSrc}):h.cloneNode(!0),o.addClass(a,"mce-clonedresizable"),o.setAttrib(a,"data-mce-bogus","all"),a.contentEditable="false",o.setStyles(a,{left:C,top:x,margin:0}),D(a,N,A),a.removeAttribute(n),k.appendChild(a),o.bind(v,"mousemove",L),o.bind(v,"mouseup",P),y!==v&&(o.bind(y,"mousemove",L),o.bind(y,"mouseup",P)),i=o.add(k,"div",{class:"mce-resize-helper","data-mce-bogus":"all"},m+" &times; "+f)})(r)})),e.elm=r,o.setStyles(r,{left:N*e[0]+C-r.offsetWidth/2,top:A*e[1]+x-r.offsetHeight/2})})):I(),o.getAttrib(s,n)||s.setAttribute(n,M)},I=()=>{U(),s&&s.removeAttribute(n),fe(E,((e,t)=>{const n=o.get("mceResizeHandle"+t);n&&(o.unbind(n),o.remove(n))}))},F=s=>{var a;let i,l;const d=(e,t)=>{if(e)do{if(e===t)return!0}while(e=e.parentNode)};p||t.removed||(r(o.select("img[data-mce-selected],hr[data-mce-selected]"),(e=>{e.removeAttribute(n)})),l="mousedown"===s.type?s.target:e.getNode(),l=null===(a=Ko(mn(l),"table,img,figure.image,hr,video,span.mce-preview-object").getOrUndefined())||void 0===a?void 0:a.dom,d(l,k)&&(z(),i=e.getStart(!0),d(i,l)&&d(e.getEnd(!0),l))?M(l):I())},U=()=>{fe(E,(e=>{e.elm&&(o.unbind(e.elm),delete e.elm)}))},z=()=>{try{t.getDoc().execCommand("enableObjectResizing",!1,"false")}catch(e){}};return t.on("init",(()=>{z();const e=Ys((e=>{t.composing||F(e)}),0);t.on("nodechange ResizeEditor ResizeWindow ResizeContent drop FullscreenStateChanged",e.throttle),t.on("keyup compositionend",(t=>{s&&"TABLE"===s.nodeName&&e.throttle(t)})),t.on("hide blur",I),t.on("contextmenu longpress",A,!0)})),t.on("remove",U),{isResizable:T,showResizeRect:M,hideResizeRect:I,updateResizeRect:F,destroy:()=>{s=a=d=null}}},Hu=(e,t,n)=>{const o=e.document.createRange();var r;return r=o,t.fold((e=>{r.setStartBefore(e.dom)}),((e,t)=>{r.setStart(e.dom,t)}),(e=>{r.setStartAfter(e.dom)})),((e,t)=>{t.fold((t=>{e.setEndBefore(t.dom)}),((t,n)=>{e.setEnd(t.dom,n)}),(t=>{e.setEndAfter(t.dom)}))})(o,n),o},$u=(e,t,n,o,r)=>{const s=e.document.createRange();return s.setStart(t.dom,n),s.setEnd(o.dom,r),s},qu=mi([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]),Wu=(e,t,n)=>t(mn(n.startContainer),n.startOffset,mn(n.endContainer),n.endOffset);qu.ltr,qu.rtl;const Ku=(e,t,n,o)=>({start:e,soffset:t,finish:n,foffset:o}),Gu=document.caretPositionFromPoint?(e,t,n)=>{var o,r;return M.from(null===(r=(o=e.dom).caretPositionFromPoint)||void 0===r?void 0:r.call(o,t,n)).bind((t=>{if(null===t.offsetNode)return M.none();const n=e.dom.createRange();return n.setStart(t.offsetNode,t.offset),n.collapse(),M.some(n)}))}:document.caretRangeFromPoint?(e,t,n)=>{var o,r;return M.from(null===(r=(o=e.dom).caretRangeFromPoint)||void 0===r?void 0:r.call(o,t,n))}:M.none,Yu=mi([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Xu={before:Yu.before,on:Yu.on,after:Yu.after,cata:(e,t,n,o)=>e.fold(t,n,o),getStart:e=>e.fold(R,R,R)},Qu=mi([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Ju={domRange:Qu.domRange,relative:Qu.relative,exact:Qu.exact,exactFromRange:e=>Qu.exact(e.start,e.soffset,e.finish,e.foffset),getWin:e=>{const t=(e=>e.match({domRange:e=>mn(e.startContainer),relative:(e,t)=>Xu.getStart(e),exact:(e,t,n,o)=>e}))(e);return xn(t)},range:Ku},Zu=(e,t)=>{const n=Mt(e);return"input"===n?Xu.after(e):j(["br","img"],n)?0===t?Xu.before(e):Xu.after(e):Xu.on(e,t)},em=(e,t)=>{const n=e.fold(Xu.before,Zu,Xu.after),o=t.fold(Xu.before,Zu,Xu.after);return Ju.relative(n,o)},tm=(e,t,n,o)=>{const r=Zu(e,t),s=Zu(n,o);return Ju.relative(r,s)},nm=(e,t)=>{const n=(t||document).createDocumentFragment();return $(e,(e=>{n.appendChild(e.dom)})),mn(n)},om=e=>{const t=Ju.getWin(e).dom,n=(e,n,o,r)=>$u(t,e,n,o,r),o=(e=>e.match({domRange:e=>{const t=mn(e.startContainer),n=mn(e.endContainer);return tm(t,e.startOffset,n,e.endOffset)},relative:em,exact:tm}))(e);return((e,t)=>{const n=((e,t)=>t.match({domRange:e=>({ltr:N(e),rtl:M.none}),relative:(t,n)=>({ltr:De((()=>Hu(e,t,n))),rtl:De((()=>M.some(Hu(e,n,t))))}),exact:(t,n,o,r)=>({ltr:De((()=>$u(e,t,n,o,r))),rtl:De((()=>M.some($u(e,o,r,t,n))))})}))(e,t);return((e,t)=>{const n=t.ltr();return n.collapsed?t.rtl().filter((e=>!1===e.collapsed)).map((e=>qu.rtl(mn(e.endContainer),e.endOffset,mn(e.startContainer),e.startOffset))).getOrThunk((()=>Wu(0,qu.ltr,n))):Wu(0,qu.ltr,n)})(0,n)})(t,o).match({ltr:n,rtl:n})},rm=(e,t,n)=>{return(o=n.defaultView,r=e,s=t,((e,t,n)=>{const o=mn(e.document);return Gu(o,t,n).map((e=>Ku(mn(e.startContainer),e.startOffset,mn(e.endContainer),e.endOffset)))})(o,r,s)).map((e=>{const t=n.createRange();return t.setStart(e.start.dom,e.soffset),t.setEnd(e.finish.dom,e.foffset),t})).getOrUndefined();var o,r,s},sm=(e,t)=>e&&t&&e.startContainer===t.startContainer&&e.startOffset===t.startOffset&&e.endContainer===t.endContainer&&e.endOffset===t.endOffset,am=(e,t,n)=>null!==((e,t,n)=>{for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null})(e,t,n),im=(e,t,n)=>am(e,t,(e=>e.nodeName===n)),lm=e=>e&&"TABLE"===e.nodeName,dm=e=>e&&/^(TD|TH|CAPTION)$/.test(e.nodeName),cm=(e,t)=>vr(e)&&!1===am(e,t,hc),um=(e,t,n)=>{const o=new Xo(t,e.getParent(t.parentNode,e.isBlock)||e.getRoot());for(;t=o[n?"prev":"next"]();)if(Do(t))return!0},mm=(e,t,n,o,r)=>{let s;const a=e.getRoot();let i;const l=e.schema.getNonEmptyElements(),d=e.getParent(r.parentNode,e.isBlock)||a;if(o&&Do(r)&&t&&e.isEmpty(d))return M.some(ja(r.parentNode,e.nodeIndex(r)));const c=new Xo(r,d);for(;i=c[o?"prev":"next"]();){if("false"===e.getContentEditableParent(i)||cm(i,a))return M.none();if(No(i)&&i.nodeValue.length>0)return!1===im(i,a,"A")?M.some(ja(i,o?i.nodeValue.length:0)):M.none();if(e.isBlock(i)||l[i.nodeName.toLowerCase()])return M.none();s=i}return n&&s?M.some(ja(s,0)):M.none()},fm=(e,t,n,o)=>{let r,s;const a=e.getRoot();let i,l,d=!1;r=o[(n?"start":"end")+"Container"],s=o[(n?"start":"end")+"Offset"];const c=yo(r)&&s===r.childNodes.length,u=e.schema.getNonEmptyElements();if(l=n,vr(r))return M.none();if(yo(r)&&s>r.childNodes.length-1&&(l=!1),To(r)&&(r=a,s=0),r===a){if(l&&(i=r.childNodes[s>0?s-1:0],i)){if(vr(i))return M.none();if(u[i.nodeName]||lm(i))return M.none()}if(r.hasChildNodes()){if(s=Math.min(!l&&s>0?s-1:s,r.childNodes.length-1),r=r.childNodes[s],s=No(r)&&c?r.data.length:0,!t&&r===a.lastChild&&lm(r))return M.none();if(((e,t)=>{for(;t&&t!==e;){if(Mo(t))return!0;t=t.parentNode}return!1})(a,r)||vr(r))return M.none();if(r.hasChildNodes()&&!1===lm(r)){i=r;const t=new Xo(r,a);do{if(Mo(i)||vr(i)){d=!1;break}if(No(i)&&i.nodeValue.length>0){s=l?0:i.nodeValue.length,r=i,d=!0;break}if(u[i.nodeName.toLowerCase()]&&!dm(i)){s=e.nodeIndex(i),r=i.parentNode,l||s++,d=!0;break}}while(i=l?t.next():t.prev())}}}return t&&(No(r)&&0===s&&mm(e,c,t,!0,r).each((e=>{r=e.container(),s=e.offset(),d=!0})),yo(r)&&(i=r.childNodes[s],i||(i=r.childNodes[s-1]),!i||!Do(i)||((e,t)=>e.previousSibling&&"A"===e.previousSibling.nodeName)(i)||um(e,i,!1)||um(e,i,!0)||mm(e,c,t,!0,i).each((e=>{r=e.container(),s=e.offset(),d=!0})))),l&&!t&&No(r)&&s===r.nodeValue.length&&mm(e,c,t,!1,r).each((e=>{r=e.container(),s=e.offset(),d=!0})),d?M.some(ja(r,s)):M.none()},gm=(e,t)=>{const n=t.collapsed,o=t.cloneRange(),r=ja.fromRangeStart(t);return fm(e,n,!0,o).each((e=>{n&&ja.isAbove(r,e)||o.setStart(e.container(),e.offset())})),n||fm(e,n,!1,o).each((e=>{o.setEnd(e.container(),e.offset())})),n&&o.collapse(!0),sm(t,o)?M.none():M.some(o)},pm=(e,t)=>e.splitText(t),hm=e=>{let t=e.startContainer,n=e.startOffset,o=e.endContainer,r=e.endOffset;return t===o&&No(t)?n>0&&n<t.nodeValue.length&&(o=pm(t,n),t=o.previousSibling,r>n?(r-=n,t=o=pm(o,r).previousSibling,r=o.nodeValue.length,n=0):r=0):(No(t)&&n>0&&n<t.nodeValue.length&&(t=pm(t,n),n=0),No(o)&&r>0&&r<o.nodeValue.length&&(o=pm(o,r).previousSibling,r=o.nodeValue.length)),{startContainer:t,startOffset:n,endContainer:o,endOffset:r}},bm=e=>({walk:(t,n)=>pu(e,t,n),split:hm,normalize:t=>gm(e,t).fold(L,(e=>(t.setStart(e.startContainer,e.startOffset),t.setEnd(e.endContainer,e.endOffset),!0)))});bm.compareRanges=sm,bm.getCaretRangeFromPoint=rm,bm.getSelectedNode=Ca,bm.getNode=xa;const vm=((e,t)=>{const n=t=>{const n=(e=>{const t=e.dom;return zn(e)?t.getBoundingClientRect().height:t.offsetHeight})(t);if(n<=0||null===n){const n=$n(t,e);return parseFloat(n)||0}return n},o=(e,t)=>Y(t,((t,n)=>{const o=$n(e,n),r=void 0===o?0:parseInt(o,10);return isNaN(r)?t:t+r}),0);return{set:(t,n)=>{if(!w(n)&&!n.match(/^[0-9]+$/))throw new Error(e+".set accepts only positive integer values. Value was "+n);const o=t.dom;an(o)&&(o.style[e]=n+"px")},get:n,getOuter:n,aggregate:o,max:(e,t,n)=>{const r=o(e,n);return t>r?t-r:0}}})("height"),ym=()=>mn(document),Cm=(e,t)=>e.view(t).fold(N([]),(t=>{const n=e.owner(t),o=Cm(e,n);return[t].concat(o)}));var xm=Object.freeze({__proto__:null,view:e=>{var t;return(e.dom===document?M.none():M.from(null===(t=e.dom.defaultView)||void 0===t?void 0:t.frameElement)).map(mn)},owner:e=>Cn(e)});const wm=e=>"textarea"===Mt(e),km=(e,t)=>{const n=(e=>{const t=e.dom.ownerDocument,n=t.body,o=t.defaultView,r=t.documentElement;if(n===e.dom)return lo(n.offsetLeft,n.offsetTop);const s=co(null==o?void 0:o.pageYOffset,r.scrollTop),a=co(null==o?void 0:o.pageXOffset,r.scrollLeft),i=co(r.clientTop,n.clientTop),l=co(r.clientLeft,n.clientLeft);return uo(e).translate(a-l,s-i)})(e),o=(e=>vm.get(e))(e);return{element:e,bottom:n.top+o,height:o,pos:n,cleanup:t}},Sm=(e,t,n,o)=>{Rm(e,((r,s)=>Em(e,t,n,o)),n)},_m=(e,t,n,o,r)=>{const s={elm:o.element.dom,alignToTop:r};((e,t)=>e.dispatch("ScrollIntoView",t).isDefaultPrevented())(e,s)||(n(t,mo(t).top,o,r),((e,t)=>{e.dispatch("AfterScrollIntoView",t)})(e,s))},Em=(e,t,n,o)=>{const r=mn(e.getBody()),s=mn(e.getDoc());r.dom.offsetWidth;const a=((e,t)=>{const n=((e,t)=>{const n=Nn(e);if(0===n.length||wm(e))return{element:e,offset:t};if(t<n.length&&!wm(n[t]))return{element:n[t],offset:0};{const o=n[n.length-1];return wm(o)?{element:e,offset:t}:"img"===Mt(o)?{element:o,offset:1}:zt(o)?{element:o,offset:Ru(o).length}:{element:o,offset:Nn(o).length}}})(e,t),o=dn('<span data-mce-bogus="all" style="display: inline-block;">\ufeff</span>');return Yn(n.element,o),km(o,(()=>to(o)))})(mn(n.startContainer),n.startOffset);_m(e,s,t,a,o),a.cleanup()},Nm=(e,t,n,o)=>{const r=mn(e.getDoc());_m(e,r,n,(e=>km(mn(e),S))(t),o)},Rm=(e,t,n)=>{const o=n.startContainer,r=n.startOffset,s=n.endContainer,a=n.endOffset;t(mn(o),mn(s));const i=e.dom.createRng();i.setStart(o,r),i.setEnd(s,a),e.selection.setRng(n)},Am=(e,t,n,o)=>{const r=e.pos;if(n)fo(r.left,r.top,o);else{const n=r.top-t+e.height;fo(r.left,n,o)}},Om=(e,t,n,o,r)=>{const s=n+t,a=o.pos.top,i=o.bottom,l=i-a>=n;a<t?Am(o,n,!1!==r,e):a>s?Am(o,n,l?!1!==r:!0===r,e):i>s&&!l&&Am(o,n,!0===r,e)},Tm=(e,t,n,o)=>{const r=e.dom.defaultView.innerHeight;Om(e,t,r,n,o)},Bm=(e,t,n,o)=>{const r=e.dom.defaultView.innerHeight;Om(e,t,r,n,o);const s=(e=>{const t=ym(),n=mo(t),o=((e,t)=>{const n=t.owner(e);return Cm(t,n)})(e,xm),r=uo(e),s=G(o,((e,t)=>{const n=uo(t);return{left:e.left+n.left,top:e.top+n.top}}),{left:0,top:0});return lo(s.left+r.left+n.left,s.top+r.top+n.top)})(n.element),a=ho(window);s.top<a.y?go(n.element,!1!==o):s.top>a.bottom&&go(n.element,!0===o)},Dm=(e,t,n)=>Sm(e,Tm,t,n),Lm=(e,t,n)=>Nm(e,t,Tm,n),Pm=(e,t,n)=>Sm(e,Bm,t,n),Mm=(e,t,n)=>Nm(e,t,Bm,n),Im=(e,t,n)=>{(e.inline?Dm:Pm)(e,t,n)},Fm=e=>e.dom.focus(),Um=e=>{const t=Pn(e).dom;return e.dom===t.activeElement},zm=(e=ym())=>M.from(e.dom.activeElement).map(mn),jm=(e,t)=>{const n=zt(t)?Ru(t).length:Nn(t).length+1;return e>n?n:e<0?0:e},Vm=e=>Ju.range(e.start,jm(e.soffset,e.start),e.finish,jm(e.foffset,e.finish)),Hm=(e,t)=>!vo(t.dom)&&(vn(e,t)||bn(e,t)),$m=e=>t=>Hm(e,t.start)&&Hm(e,t.finish),qm=e=>Ju.range(mn(e.startContainer),e.startOffset,mn(e.endContainer),e.endOffset),Wm=e=>{const t=document.createRange();try{return t.setStart(e.start.dom,e.soffset),t.setEnd(e.finish.dom,e.foffset),M.some(t)}catch(e){return M.none()}},Km=e=>{const t=(e=>e.inline)(e)?(n=mn(e.getBody()),(e=>{const t=e.getSelection();return(t&&0!==t.rangeCount?M.from(t.getRangeAt(0)):M.none()).map(qm)})(xn(n).dom).filter($m(n))):M.none();var n;e.bookmark=t.isSome()?t:e.bookmark},Gm=e=>(e.bookmark?e.bookmark:M.none()).bind((t=>{return n=mn(e.getBody()),o=t,M.from(o).filter($m(n)).map(Vm);var n,o})).bind(Wm),Ym={isEditorUIElement:e=>{const t=e.className.toString();return-1!==t.indexOf("tox-")||-1!==t.indexOf("mce-")}},Xm={setEditorTimeout:(e,t,n)=>((e,t)=>(w(t)||(t=0),setTimeout(e,t)))((()=>{e.removed||t()}),n),setEditorInterval:(e,t,n)=>{const o=((e,t)=>(w(t)||(t=0),setInterval(e,t)))((()=>{e.removed?clearInterval(o):t()}),n);return o}};let Qm;const Jm=Us.DOM,Zm=(e,t)=>{const n=vl(e),o=Jm.getParent(t,(t=>(e=>Ym.isEditorUIElement(e))(t)||!!n&&e.dom.is(t,n)));return null!==o},ef=(e,t)=>{const n=t.editor;(e=>{const t=Ys((()=>{Km(e)}),0);e.on("init",(()=>{e.inline&&((e,t)=>{const n=()=>{t.throttle()};Us.DOM.bind(document,"mouseup",n),e.on("remove",(()=>{Us.DOM.unbind(document,"mouseup",n)}))})(e,t),((e,t)=>{((e,t)=>{e.on("mouseup touchend",(e=>{t.throttle()}))})(e,t),e.on("keyup NodeChange AfterSetSelectionRange",(t=>{(e=>"nodechange"===e.type&&e.selectionChange)(t)||Km(e)}))})(e,t)})),e.on("remove",(()=>{t.cancel()}))})(n),n.on("focusin",(()=>{const t=e.focusedEditor;t!==n&&(t&&t.dispatch("blur",{focusedEditor:n}),e.setActive(n),e.focusedEditor=n,n.dispatch("focus",{blurredEditor:t}),n.focus(!0))})),n.on("focusout",(()=>{Xm.setEditorTimeout(n,(()=>{const t=e.focusedEditor;Zm(n,(e=>{try{const t=Pn(mn(e.getElement()));return zm(t).fold((()=>document.body),(e=>e.dom))}catch(e){return document.body}})(n))||t!==n||(n.dispatch("blur",{focusedEditor:null}),e.focusedEditor=null)}))})),Qm||(Qm=t=>{const n=e.activeEditor;n&&Fn(t).each((t=>{t.ownerDocument===document&&(t===document.body||Zm(n,t)||e.focusedEditor!==n||(n.dispatch("blur",{focusedEditor:null}),e.focusedEditor=null))}))},Jm.bind(document,"focusin",Qm))},tf=(e,t)=>{e.focusedEditor===t.editor&&(e.focusedEditor=null),e.activeEditor||(Jm.unbind(document,"focusin",Qm),Qm=null)},nf=(e,t)=>{((e,t)=>(e=>e.collapsed?M.from(xa(e.startContainer,e.startOffset)).map(mn):M.none())(t).bind((t=>sr(t)?M.some(t):!1===vn(e,t)?M.some(e):M.none())))(mn(e.getBody()),t).bind((e=>fc(e.dom))).fold((()=>{e.selection.normalize()}),(t=>e.selection.setRng(t.toRange())))},of=e=>{if(e.setActive)try{e.setActive()}catch(t){e.focus()}else e.focus()},rf=e=>e.inline?(e=>{const t=e.getBody();return t&&(n=mn(t),Um(n)||(o=n,zm(Pn(o)).filter((e=>o.dom.contains(e.dom)))).isSome());var n,o})(e):(e=>e.iframeElement&&Um(mn(e.iframeElement)))(e),sf=e=>e.editorManager.setActive(e),af=(e,t,n,o,r)=>{const s=n?t.startContainer:t.endContainer,a=n?t.startOffset:t.endOffset;return M.from(s).map(mn).map((e=>o&&t.collapsed?e:Rn(e,r(e,a)).getOr(e))).bind((e=>Ut(e)?M.some(e):wn(e).filter(Ut))).map((e=>e.dom)).getOr(e)},lf=(e,t,n)=>af(e,t,!0,n,((e,t)=>Math.min(Tn(e),t))),df=(e,t,n)=>af(e,t,!1,n,((e,t)=>t>0?t-1:t)),cf=(e,t)=>{const n=e;for(;e&&No(e)&&0===e.length;)e=t?e.nextSibling:e.previousSibling;return e||n},uf=(e,t)=>H(t,(t=>{const n=e.dispatch("GetSelectionRange",{range:t});return n.range!==t?n.range:t})),mf=["img","br"],ff=e=>{const t=Au(e).filter((e=>0!==e.trim().length||e.indexOf(dr)>-1)).isSome();return t||j(mf,Mt(e))},gf="[data-mce-autocompleter]",pf=(e,t)=>{if(hf(mn(e.getBody())).isNone()){const o=dn('<span data-mce-autocompleter="1" data-mce-bogus="1"></span>',e.getDoc());Jn(o,mn(t.extractContents())),t.insertNode(o.dom),wn(o).each((e=>e.dom.normalize())),(n=o,((e,t)=>{const n=e=>{const o=Nn(e);for(let e=o.length-1;e>=0;e--){const r=o[e];if(t(r))return M.some(r);const s=n(r);if(s.isSome())return s}return M.none()};return n(e)})(n,ff)).map((t=>{e.selection.setCursorLocation(t.dom,(e=>"img"===Mt(e)?1:Au(e).fold((()=>Nn(e).length),(e=>e.length)))(t))}))}var n},hf=e=>Wo(e,gf),bf={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11},vf=(e,t,n)=>{const o=n?"lastChild":"firstChild",r=n?"prev":"next";if(e[o])return e[o];if(e!==t){let n=e[r];if(n)return n;for(let o=e.parent;o&&o!==t;o=o.parent)if(n=o[r],n)return n}},yf=e=>{if(!Fr(e.value))return!1;const t=e.parent;return!t||"span"===t.name&&!t.attr("style")||!/^[ ]+$/.test(e.value)},Cf=e=>{const 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};class xf{constructor(e,t){this.name=e,this.type=t,1===t&&(this.attributes=[],this.attributes.map={})}static create(e,t){const n=new xf(e,bf[e]||1);return t&&fe(t,((e,t)=>{n.attr(t,e)})),n}replace(e){const t=this;return e.parent&&e.remove(),t.insert(e,t),t.remove(),t}attr(e,t){const n=this;let o;if("string"!=typeof e)return null!=e&&fe(e,((e,t)=>{n.attr(t,e)})),n;if(o=n.attributes){if(void 0!==t){if(null===t){if(e in o.map){delete o.map[e];let t=o.length;for(;t--;)if(o[t].name===e)return o.splice(t,1),n}return n}if(e in o.map){let n=o.length;for(;n--;)if(o[n].name===e){o[n].value=t;break}}else o.push({name:e,value:t});return o.map[e]=t,n}return o.map[e]}}clone(){const e=this,t=new xf(e.name,e.type);let n;if(n=e.attributes){const e=[];e.map={};for(let t=0,o=n.length;t<o;t++){const o=n[t];"id"!==o.name&&(e[e.length]={name:o.name,value:o.value},e.map[o.name]=o.value)}t.attributes=e}return t.value=e.value,t}wrap(e){const t=this;return t.parent.insert(e,t),e.append(t),t}unwrap(){const e=this;for(let t=e.firstChild;t;){const n=t.next;e.insert(t,e,!0),t=n}e.remove()}remove(){const e=this,t=e.parent,n=e.next,o=e.prev;return t&&(t.firstChild===e?(t.firstChild=n,n&&(n.prev=null)):o.next=n,t.lastChild===e?(t.lastChild=o,o&&(o.next=null)):n.prev=o,e.parent=e.next=e.prev=null),e}append(e){const t=this;e.parent&&e.remove();const n=t.lastChild;return n?(n.next=e,e.prev=n,t.lastChild=e):t.lastChild=t.firstChild=e,e.parent=t,e}insert(e,t,n){e.parent&&e.remove();const o=t.parent||this;return n?(t===o.firstChild?o.firstChild=e:t.prev.next=e,e.prev=t.prev,e.next=t,t.prev=e):(t===o.lastChild?o.lastChild=e:t.next.prev=e,e.next=t.next,e.prev=t,t.next=e),e.parent=o,e}getAll(e){const t=this,n=[];for(let o=t.firstChild;o;o=vf(o,t))o.name===e&&n.push(o);return n}children(){const e=[];for(let t=this.firstChild;t;t=t.next)e.push(t);return e}empty(){const e=this;if(e.firstChild){const t=[];for(let n=e.firstChild;n;n=vf(n,e))t.push(n);let n=t.length;for(;n--;){const e=t[n];e.parent=e.firstChild=e.lastChild=e.next=e.prev=null}}return e.firstChild=e.lastChild=null,e}isEmpty(e,t={},n){const o=this;let r=o.firstChild;if(Cf(o))return!1;if(r)do{if(1===r.type){if(r.attr("data-mce-bogus"))continue;if(e[r.name])return!1;if(Cf(r))return!1}if(8===r.type)return!1;if(3===r.type&&!yf(r))return!1;if(3===r.type&&r.parent&&t[r.parent.name]&&Fr(r.value))return!1;if(n&&n(r))return!1}while(r=vf(r,o));return!0}walk(e){return vf(this,null,e)}}const wf=(e,t,n=0)=>{const o=e.toLowerCase();if(-1!==o.indexOf("[if ",n)&&((e,t)=>/^\s*\[if [\w\W]+\]>.*<!\[endif\](--!?)?>/.test(e.substr(t)))(o,n)){const e=o.indexOf("[endif]",n);return o.indexOf(">",e)}if(t){const e=o.indexOf(">",n);return-1!==e?e:o.length}{const t=/--!?>/g;t.lastIndex=n;const r=t.exec(e);return r?r.index+r[0].length:o.length}},kf=(e,t,n)=>{const o=/<([!?\/])?([A-Za-z0-9\-_:.]+)/g,r=/(?:\s(?:[^'">]+(?:"[^"]*"|'[^']*'))*[^"'>]*(?:"[^">]*|'[^'>]*)?|\s*|\/)>/g,s=e.getVoidElements();let a=1,i=n;for(;0!==a;)for(o.lastIndex=i;;){const e=o.exec(t);if(null===e)return i;if("!"===e[1]){i=ze(e[2],"--")?wf(t,!1,e.index+"!--".length):wf(t,!0,e.index+1);break}{r.lastIndex=o.lastIndex;const n=r.exec(t);if(h(n)||n.index!==o.lastIndex)continue;"/"===e[1]?a-=1:we(s,e[2])||(a+=1),i=o.lastIndex+n[0].length;break}}return i},Sf=(e,t)=>{const n=/<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g,o=e.schema;let r=((e,t)=>{const n=new RegExp(["\\s?("+e.join("|")+')="[^"]+"'].join("|"),"gi");return t.replace(n,"")})(e.getTempAttrs(),t);const s=o.getVoidElements();let a;for(;a=n.exec(r);){const e=n.lastIndex,t=a[0].length;let i;i=s[a[1]]?e:kf(o,r,e),r=r.substring(0,e-t)+r.substring(i),n.lastIndex=e-t}return fr(r)},_f=Sf,Ef=Bt.each,Nf=e=>({compare:(t,n)=>{if(t.nodeName!==n.nodeName)return!1;const o=t=>{const n={};return Ef(e.getAttribs(t),(o=>{const r=o.nodeName.toLowerCase();0!==r.indexOf("_")&&"style"!==r&&0!==r.indexOf("data-")&&(n[r]=e.getAttrib(t,r))})),n},r=(e,t)=>{let n,o;for(o in e)if(we(e,o)){if(n=t[o],void 0===n)return!1;if(e[o]!==n)return!1;delete t[o]}for(o in t)if(we(t,o))return!1;return!0};return!(!r(o(t),o(n))||!r(e.parseStyle(e.getAttrib(t,"style")),e.parseStyle(e.getAttrib(n,"style")))||Nc(t)||Nc(n))}}),Rf=Bt.makeMap,Af=e=>{const t=[],n=(e=e||{}).indent,o=Rf(e.indent_before||""),r=Rf(e.indent_after||""),s=ls.getEncodeFunc(e.entity_encoding||"raw",e.entities),a="xhtml"!==e.element_format;return{start:(e,i,l)=>{let d,c,u,m;if(n&&o[e]&&t.length>0&&(m=t[t.length-1],m.length>0&&"\n"!==m&&t.push("\n")),t.push("<",e),i)for(d=0,c=i.length;d<c;d++)u=i[d],t.push(" ",u.name,'="',s(u.value,!0),'"');t[t.length]=!l||a?">":" />",l&&n&&r[e]&&t.length>0&&(m=t[t.length-1],m.length>0&&"\n"!==m&&t.push("\n"))},end:e=>{let o;t.push("</",e,">"),n&&r[e]&&t.length>0&&(o=t[t.length-1],o.length>0&&"\n"!==o&&t.push("\n"))},text:(e,n)=>{e.length>0&&(t[t.length]=n?e:s(e))},cdata:e=>{t.push("<![CDATA[",e,"]]>")},comment:e=>{t.push("\x3c!--",e,"--\x3e")},pi:(e,o)=>{o?t.push("<?",e," ",s(o),"?>"):t.push("<?",e,"?>"),n&&t.push("\n")},doctype:e=>{t.push("<!DOCTYPE",e,">",n?"\n":"")},reset:()=>{t.length=0},getContent:()=>t.join("").replace(/\n$/,"")}},Of=(e,t=Cs())=>{const n=Af(e);return(e=e||{}).validate=!("validate"in e)||e.validate,{serialize:o=>{const r=e.validate,s={3:e=>{n.text(e.value,e.raw)},8:e=>{n.comment(e.value)},7:e=>{n.pi(e.name,e.value)},10:e=>{n.doctype(e.value)},4:e=>{n.cdata(e.value)},11:e=>{if(e=e.firstChild)do{a(e)}while(e=e.next)}};n.reset();const a=e=>{const o=s[e.type];if(o)o(e);else{const o=e.name,s=o in t.getVoidElements();let i=e.attributes;if(r&&i&&i.length>1){const n=[];n.map={};const o=t.getElementRule(e.name);if(o){for(let e=0,t=o.attributesOrder.length;e<t;e++){const t=o.attributesOrder[e];if(t in i.map){const e=i.map[t];n.map[t]=e,n.push({name:t,value:e})}}for(let e=0,t=i.length;e<t;e++){const t=i[e].name;if(!(t in n.map)){const e=i.map[t];n.map[t]=e,n.push({name:t,value:e})}}i=n}}if(n.start(o,i,s),!s){let t=e.firstChild;if(t){"pre"!==o&&"textarea"!==o||3!==t.type||"\n"!==t.value[0]||n.text("\n",!0);do{a(t)}while(t=t.next)}n.end(o)}}};return 1!==o.type||e.inner?3===o.type?s[3](o):s[11](o):a(o),n.getContent()}}},Tf=new Set;$(["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"],(e=>{Tf.add(e)}));const Bf=["font","text-decoration","text-emphasis"],Df=(e,t)=>ue(e.parseStyle(e.getAttrib(t,"style"))),Lf=(e,t,n)=>{const o=Df(e,t),r=Df(e,n),s=o=>{var r,s;const a=null!==(r=e.getStyle(t,o))&&void 0!==r?r:"",i=null!==(s=e.getStyle(n,o))&&void 0!==s?s:"";return We(a)&&We(i)&&a!==i};return V(o,(e=>{const t=t=>V(t,(t=>t===e));if(!t(r)&&t(Bf)){const e=K(r,(e=>V(Bf,(t=>ze(e,t)))));return V(e,s)}return s(e)}))},Pf=(e,t,n)=>M.from(n.container()).filter(No).exists((o=>{const r=e?0:-1;return t(o.data.charAt(n.offset()+r))})),Mf=O(Pf,!0,Ac),If=O(Pf,!1,Ac),Ff=e=>{const t=e.container();return No(t)&&(0===t.data.length||mr(t.data)&&Du.isBookmarkNode(t.parentNode))},Uf=(e,t)=>n=>M.from(Ld(e?0:-1,n)).filter(t).isSome(),zf=e=>Lo(e)&&"block"===$n(mn(e),"display"),jf=e=>Mo(e)&&!(e=>yo(e)&&"all"===e.getAttribute("data-mce-bogus"))(e),Vf=Uf(!0,zf),Hf=Uf(!1,zf),$f=Uf(!0,Fo),qf=Uf(!1,Fo),Wf=Uf(!0,So),Kf=Uf(!1,So),Gf=Uf(!0,jf),Yf=Uf(!1,jf),Xf=e=>{eo(e),Jn(e,dn('<br data-mce-bogus="1">'))},Qf=e=>{On(e).each((t=>{kn(t).each((n=>{Zo(e)&&tr(t)&&Zo(n)&&to(t)}))}))},Jf=(e,t)=>((e,t,n)=>{return vn(t,e)?(o=((e,t)=>{const n=x(t)?t:L;let o=e.dom;const r=[];for(;null!==o.parentNode&&void 0!==o.parentNode;){const e=o.parentNode,t=mn(e);if(r.push(t),!0===n(t))break;o=e}return r})(e,(e=>n(e)||bn(e,t))),o.slice(0,-1)):[];var o})(e,t,L),Zf=(e,t)=>[e].concat(Jf(e,t)),eg=(e,t,n)=>dc(e,t,n,Ff),tg=(e,t)=>Q(Zf(mn(t.container()),e),Zo),ng=(e,t,n)=>eg(e,t.dom,n).forall((e=>tg(t,n).fold((()=>!1===Dd(e,n,t.dom)),(o=>!1===Dd(e,n,t.dom)&&vn(o,mn(e.container())))))),og=(e,t,n)=>tg(t,n).fold((()=>eg(e,t.dom,n).forall((e=>!1===Dd(e,n,t.dom)))),(t=>eg(e,t.dom,n).isNone())),rg=O(og,!1),sg=O(og,!0),ag=O(ng,!1),ig=O(ng,!0),lg=e=>Hd(e).exists(tr),dg=(e,t,n)=>{const o=K(Zf(mn(n.container()),t),Zo),r=ie(o).getOr(t);return ic(e,r.dom,n).filter(lg)},cg=(e,t)=>Hd(t).exists(tr)||dg(!0,e,t).isSome(),ug=(e,t)=>(e=>M.from(e.getNode(!0)).map(mn))(t).exists(tr)||dg(!1,e,t).isSome(),mg=O(dg,!1),fg=O(dg,!0),gg=e=>ja.isTextPosition(e)&&!e.isAtStart()&&!e.isAtEnd(),pg=(e,t)=>{const n=K(Zf(mn(t.container()),e),Zo);return ie(n).getOr(e)},hg=(e,t)=>gg(t)?If(t):If(t)||mc(pg(e,t).dom,t).exists(If),bg=(e,t)=>gg(t)?Mf(t):Mf(t)||uc(pg(e,t).dom,t).exists(Mf),vg=e=>Hd(e).bind((e=>$o(e,Ut))).exists((e=>(e=>j(["pre","pre-wrap"],e))($n(e,"white-space")))),yg=(e,t)=>!vg(t)&&(rg(e,t)||ag(e,t)||ug(e,t)||hg(e,t)),Cg=(e,t)=>!vg(t)&&(sg(e,t)||ig(e,t)||cg(e,t)||bg(e,t)),xg=(e,t)=>yg(e,t)||Cg(e,(e=>{const t=e.container(),n=e.offset();return No(t)&&n<t.data.length?ja(t,n+1):e})(t)),wg=(e,t)=>Rc(e.charAt(t)),kg=e=>{const t=e.container();return No(t)&&Ue(t.data,dr)},Sg=(e,t)=>M.some(t).filter(kg).bind((t=>{const n=t.container(),o=((e,t)=>{const n=t.data,o=ja(t,0);return!(!wg(n,0)||xg(e,o)||(t.data=" "+n.slice(1),0))})(e,n)||(e=>{const t=e.data,n=(e=>{const t=e.split("");return H(t,((e,n)=>Rc(e)&&n>0&&n<t.length-1&&Oc(t[n-1])&&Oc(t[n+1])?" ":e)).join("")})(t);return n!==t&&(e.data=n,!0)})(n)||((e,t)=>{const n=t.data,o=ja(t,n.length-1);return!(!wg(n,n.length-1)||xg(e,o)||(t.data=n.slice(0,-1)+" ",0))})(e,n);return o?M.some(t):M.none()})),_g=(e,t,n)=>{if(0===n)return;const o=mn(e),r=Ho(o,Zo).getOr(o),s=e.data.slice(t,t+n),a=t+n>=e.data.length&&Cg(r,ja(e,e.data.length)),i=0===t&&yg(r,ja(e,0));e.replaceData(t,n,zr(s,4,i,a))},Eg=(e,t)=>{const n=e.data.slice(t),o=n.length-$e(n).length;_g(e,t,o)},Ng=(e,t)=>{const n=e.data.slice(0,t),o=n.length-qe(n).length;_g(e,t-o,o)},Rg=(e,t,n,o=!0)=>{const r=qe(e.data).length,s=o?e:t,a=o?t:e;return o?s.appendData(a.data):s.insertData(0,a.data),to(mn(a)),n&&Eg(s,r),s},Ag=(e,t)=>((e,t)=>{const n=e.container(),o=e.offset();return!1===ja.isTextPosition(e)&&n===t.parentNode&&o>ja.before(t).offset()})(t,e)?ja(t.container(),t.offset()-1):t,Og=e=>{return Lr(e.previousSibling)?M.some((t=e.previousSibling,No(t)?ja(t,t.data.length):ja.after(t))):e.previousSibling?gc(e.previousSibling):M.none();var t},Tg=e=>{return Lr(e.nextSibling)?M.some((t=e.nextSibling,No(t)?ja(t,0):ja.before(t))):e.nextSibling?fc(e.nextSibling):M.none();var t},Bg=(e,t,n)=>((e,t,n)=>e?((e,t)=>Tg(t).orThunk((()=>Og(t))).orThunk((()=>((e,t)=>uc(e,ja.after(t)).fold((()=>mc(e,ja.before(t))),M.some))(e,t))))(t,n):((e,t)=>Og(t).orThunk((()=>Tg(t))).orThunk((()=>((e,t)=>{const n=ja.before(t.previousSibling?t.previousSibling:t.parentNode);return mc(e,n).fold((()=>uc(e,ja.after(t))),M.some)})(e,t))))(t,n))(e,t,n).map(O(Ag,n)),Dg=(e,t,n)=>{n.fold((()=>{e.focus()}),(n=>{e.selection.setRng(n.toRange(),t)}))},Lg=(e,t)=>t&&we(e.schema.getBlockElements(),Mt(t)),Pg=e=>{if(qr(e)){const t=dn('<br data-mce-bogus="1">');return eo(e),Jn(e,t),M.some(ja.before(t.dom))}return M.none()},Mg=(e,t,n,o=!0)=>{const r=Bg(t,e.getBody(),n.dom),s=Ho(n,O(Lg,e),(a=e.getBody(),e=>e.dom===a));var a;const i=((e,t,n)=>{const o=kn(e).filter(zt),r=Sn(e).filter(zt);return to(e),(s=o,a=r,i=t,l=(e,t,o)=>{const r=e.dom,s=t.dom,a=r.data.length;return Rg(r,s,n),o.container()===s?ja(r,a):o},s.isSome()&&a.isSome()&&i.isSome()?M.some(l(s.getOrDie(),a.getOrDie(),i.getOrDie())):M.none()).orThunk((()=>(n&&(o.each((e=>Ng(e.dom,e.dom.length))),r.each((e=>Eg(e.dom,0)))),t)));var s,a,i,l})(n,r,((e,t)=>we(e.schema.getTextInlineElements(),Mt(t)))(e,n));e.dom.isEmpty(e.getBody())?(e.setContent(""),e.selection.setCursorLocation()):s.bind(Pg).fold((()=>{o&&Dg(e,t,i)}),(n=>{o&&Dg(e,t,M.some(n))}))},Ig=e=>Js(e,"td,th"),Fg=(e,t)=>({start:e,end:t}),Ug=mi([{singleCellTable:["rng","cell"]},{fullTable:["table"]},{partialTable:["cells","outsideDetails"]},{multiTable:["startTableCells","endTableCells","betweenRng"]}]),zg=(e,t)=>Ko(mn(e),"td,th",t),jg=e=>!bn(e.start,e.end),Vg=(e,t)=>yu(e.start,t).bind((n=>yu(e.end,t).bind((e=>Pt(bn(n,e),n))))),Hg=e=>t=>Vg(t,e).map((e=>((e,t,n)=>({rng:e,table:t,cells:n}))(t,e,Ig(e)))),$g=(e,t,n,o)=>{if(n.collapsed||!e.forall(jg))return M.none();if(t.isSameTable){const t=e.bind(Hg(o));return M.some({start:t,end:t})}{const e=zg(n.startContainer,o),t=zg(n.endContainer,o),r=e.bind((e=>t=>yu(t,e).bind((e=>le(Ig(e)).map((e=>Fg(t,e))))))(o)).bind(Hg(o)),s=t.bind((e=>t=>yu(t,e).bind((e=>ie(Ig(e)).map((e=>Fg(e,t))))))(o)).bind(Hg(o));return M.some({start:r,end:s})}},qg=(e,t)=>J(e,(e=>bn(e,t))),Wg=e=>Lt(qg(e.cells,e.rng.start),qg(e.cells,e.rng.end),((t,n)=>e.cells.slice(t,n+1))),Kg=(e,t)=>{const{startTable:n,endTable:o}=t,r=e.cloneRange();return n.each((e=>r.setStartAfter(e.dom))),o.each((e=>r.setEndBefore(e.dom))),r},Gg=(e,t)=>{const n=(e=>t=>bn(e,t))(e),o=((e,t)=>{const n=zg(e.startContainer,t),o=zg(e.endContainer,t);return Lt(n,o,Fg)})(t,n),r=((e,t)=>{const n=e=>yu(mn(e),t),o=n(e.startContainer),r=n(e.endContainer),s=o.isSome(),a=r.isSome(),i=Lt(o,r,bn).getOr(!1);return{startTable:o,endTable:r,isStartInTable:s,isEndInTable:a,isSameTable:i,isMultiTable:!i&&s&&a}})(t,n);return((e,t,n)=>e.exists((e=>((e,t)=>!jg(e)&&Vg(e,t).exists((e=>{const t=e.dom.rows;return 1===t.length&&1===t[0].cells.length})))(e,n)&&wu(e.start,t))))(o,t,n)?o.map((e=>Ug.singleCellTable(t,e.start))):r.isMultiTable?((e,t,n,o)=>$g(e,t,n,o).bind((({start:e,end:o})=>{const r=e.bind(Wg).getOr([]),s=o.bind(Wg).getOr([]);if(r.length>0&&s.length>0){const e=Kg(n,t);return M.some(Ug.multiTable(r,s,e))}return M.none()})))(o,r,t,n):((e,t,n,o)=>$g(e,t,n,o).bind((({start:e,end:t})=>e.or(t))).bind((e=>{const{isSameTable:o}=t,r=Wg(e).getOr([]);if(o&&e.cells.length===r.length)return M.some(Ug.fullTable(e.table));if(r.length>0){if(o)return M.some(Ug.partialTable(r,M.none()));{const e=Kg(n,t);return M.some(Ug.partialTable(r,M.some({...t,rng:e})))}}return M.none()})))(o,r,t,n)},Yg=e=>{var t;return(8===It(t=e)||"#comment"===Mt(t)?kn(e):On(e)).bind(Yg).orThunk((()=>M.some(e)))},Xg=e=>$(e,(e=>{Yt(e,"contenteditable"),Xf(e)})),Qg=(e,t,n,o)=>{const r=n.cloneRange();o?(r.setStart(n.startContainer,n.startOffset),r.setEndAfter(t.dom.lastChild)):(r.setStartBefore(t.dom.firstChild),r.setEnd(n.endContainer,n.endOffset)),tp(e,r,t,!1).each((e=>e()))},Jg=e=>{const t=vu(e),n=mn(e.selection.getNode());Io(n.dom)&&qr(n)?e.selection.setCursorLocation(n.dom,0):e.selection.collapse(!0),t.length>1&&V(t,(e=>bn(e,n)))&&$t(n,"data-mce-selected","1")},Zg=(e,t,n)=>M.some((()=>{const o=e.selection.getRng(),r=n.bind((({rng:n,isStartInTable:r})=>{const s=((e,t)=>M.from(e.dom.getParent(t,e.dom.isBlock)).map(mn))(e,r?n.endContainer:n.startContainer);n.deleteContents(),((e,t,n)=>{n.each((n=>{t?to(n):(Xf(n),e.selection.setCursorLocation(n.dom,0))}))})(e,r,s.filter(qr));const a=r?t[0]:t[t.length-1];return Qg(e,a,o,r),qr(a)?M.none():M.some(r?t.slice(1):t.slice(0,-1))})).getOr(t);Xg(r),Jg(e)})),ep=(e,t,n,o)=>M.some((()=>{const r=e.selection.getRng(),s=t[0],a=n[n.length-1];Qg(e,s,r,!0),Qg(e,a,r,!1);const i=qr(s)?t:t.slice(1),l=qr(a)?n:n.slice(0,-1);Xg(i.concat(l)),o.deleteContents(),Jg(e)})),tp=(e,t,n,o=!0)=>M.some((()=>{t.deleteContents();const r=Yg(n).getOr(n),s=mn(e.dom.getParent(r.dom,e.dom.isBlock));if(qr(s)&&(Xf(s),o&&e.selection.setCursorLocation(s.dom,0)),!bn(n,s)){const e=Dt(wn(s),n)?[]:wn(a=s).map(Nn).map((e=>K(e,(e=>!bn(a,e))))).getOr([]);$(e.concat(Nn(n)),(e=>{bn(e,s)||vn(e,s)||!qr(e)||to(e)}))}var a})),np=(e,t)=>M.some((()=>Mg(e,!1,t))),op=(e,t)=>Q(Zf(t,e),ar),rp=(e,t)=>Q(Zf(t,e),("caption",e=>Ut(e)&&"caption"===Mt(e))),sp=(e,t)=>M.some((()=>{Xf(t),e.selection.setCursorLocation(t.dom,0)})),ap=(e,t)=>e?Wf(t):Kf(t),ip=(e,t,n)=>{const o=mn(e.getBody());return rp(o,n).fold((()=>((e,t,n,o)=>{const r=ja.fromRangeStart(e.selection.getRng());return op(n,o).bind((o=>qr(o)?sp(e,o):((e,t,n,o,r)=>lc(n,e.getBody(),r).bind((e=>op(t,mn(e.getNode())).bind((e=>bn(e,o)?M.none():M.some(S))))))(e,n,t,o,r)))})(e,t,o,n).orThunk((()=>Pt(((e,t)=>{const n=ja.fromRangeStart(e.selection.getRng());return ap(t,n)||ic(t,e.getBody(),n).exists((e=>ap(t,e)))})(e,t),S)))),(n=>((e,t,n,o)=>{const r=ja.fromRangeStart(e.selection.getRng());return qr(o)?sp(e,o):((e,t,n,o,r)=>lc(n,e.getBody(),r).fold((()=>M.some(S)),(s=>((e,t,n,o)=>fc(e.dom).bind((r=>gc(e.dom).map((e=>t?n.isEqual(r)&&o.isEqual(e):n.isEqual(e)&&o.isEqual(r))))).getOr(!0))(o,n,r,s)?((e,t)=>sp(e,t))(e,o):((e,t,n)=>rp(e,mn(n.getNode())).fold((()=>M.some(S)),(e=>Pt(!bn(e,t),S))))(t,o,s))))(e,n,t,o,r)})(e,t,o,n)))},lp=(e,t)=>{const n=mn(e.selection.getStart(!0)),o=vu(e);return e.selection.isCollapsed()&&0===o.length?ip(e,t,n):((e,t,n)=>{const o=mn(e.getBody()),r=e.selection.getRng();return 0!==n.length?Zg(e,n,M.none()):((e,t,n,o)=>rp(t,o).fold((()=>((e,t,n)=>Gg(t,n).bind((t=>t.fold(O(tp,e),O(np,e),O(Zg,e),O(ep,e)))))(e,t,n)),(t=>((e,t)=>sp(e,t))(e,t))))(e,o,r,t)})(e,n,o)},dp=(e,t)=>{for(;t&&t!==e;){if(Po(t)||Mo(t))return t;t=t.parentNode}return null},cp=(e,t)=>{t(e),e.firstChild&&cp(e.firstChild,t),e.next&&cp(e.next,t)},up=(e,t,n,o)=>{const r=n.name;for(let t=0,s=e.length;t<s;t++){const s=e[t];if(s.name===r){const e=o.nodes[r];e?e.nodes.push(n):o.nodes[r]={filter:s,nodes:[n]}}}if(n.attributes)for(let e=0,r=t.length;e<r;e++){const r=t[e],s=r.name;if(s in n.attributes.map){const e=o.attributes[s];e?e.nodes.push(n):o.attributes[s]={filter:r,nodes:[n]}}}},mp=(e,t)=>{const n=e=>{fe(e,(e=>{const n=K(e.nodes,(e=>C(e.parent)));$(e.filter.callbacks,(o=>{o(n,e.filter.name,t)}))}))};n(e.nodes),n(e.attributes)},fp=(e,t,n,o={})=>{const r=((e,t,n)=>{const o={nodes:{},attributes:{}};return n.firstChild&&cp(n.firstChild,(n=>{up(e,t,n,o)})),o})(e,t,n);mp(r,o)},gp=(e,t,n,o)=>{t.insert&&n[o.name]?o.empty().append(new xf("br",1)):o.empty().append(new xf("#text",3)).value=dr},pp=(e,t)=>e&&e.firstChild&&e.firstChild===e.lastChild&&e.firstChild.name===t,hp=(e,t,n,o)=>o.isEmpty(t,n,(t=>((e,t)=>{const n=e.getElementRule(t.name);return n&&n.paddEmpty})(e,t))),bp=(e,t,n=e.parent)=>{if(t.getSpecialElements()[e.name])e.empty().remove();else{const o=e.children();for(const e of o)t.isValidChild(n.name,e.name)||bp(e,t,n);e.unwrap()}},vp=(e,t,n=S)=>{const o=t.getTextBlockElements(),r=t.getNonEmptyElements(),s=t.getWhitespaceElements(),a=Bt.makeMap("tr,td,th,tbody,thead,tfoot,table"),i=new Set;for(let l=0;l<e.length;l++){const d=e[l];let c,u,m;if(!d.parent||i.has(d))continue;if(o[d.name]&&"li"===d.parent.name){let e=d.next;for(;e&&o[e.name];)e.name="li",i.add(e),d.parent.insert(e,d.parent),e=e.next;d.unwrap();continue}const f=[d];for(c=d.parent;c&&!t.isValidChild(c.name,d.name)&&!a[c.name];c=c.parent)f.push(c);if(c&&f.length>1)if(t.isValidChild(c.name,d.name)){f.reverse(),u=f[0].clone(),n(u);let e=u;for(let o=0;o<f.length-1;o++){t.isValidChild(e.name,f[o].name)?(m=f[o].clone(),n(m),e.append(m)):m=e;for(let e=f[o].firstChild;e&&e!==f[o+1];){const t=e.next;m.append(e),e=t}e=m}hp(t,r,s,u)?c.insert(d,f[0],!0):(c.insert(u,f[0],!0),c.insert(d,u)),c=f[0],(hp(t,r,s,c)||pp(c,"br"))&&c.empty().remove()}else bp(d,t);else if(d.parent){if("li"===d.name){let e=d.prev;if(e&&("ul"===e.name||"ol"===e.name)){e.append(d);continue}if(e=d.next,e&&("ul"===e.name||"ol"===e.name)){e.insert(d,e.firstChild,!0);continue}const t=new xf("ul",1);n(t),d.wrap(t);continue}if(t.isValidChild(d.parent.name,"div")&&t.isValidChild("div",d.name)){const e=new xf("div",1);n(e),d.wrap(e)}else bp(d,t)}}},yp=e=>e.collapsed?e:(e=>{const t=ja.fromRangeStart(e),n=ja.fromRangeEnd(e),o=e.commonAncestorContainer;return ic(!1,o,n).map((r=>!Dd(t,n,o)&&Dd(t,r,o)?((e,t,n,o)=>{const r=document.createRange();return r.setStart(e,t),r.setEnd(n,o),r})(t.container(),t.offset(),r.container(),r.offset()):e)).getOr(e)})(e),Cp=(e,t)=>{let n=t.firstChild,o=t.lastChild;return n&&"meta"===n.name&&(n=n.next),o&&"mce_marker"===o.attr("id")&&(o=o.prev),((e,t)=>{const n=e.getNonEmptyElements();return t&&(t.isEmpty(n)||((e,t)=>e.getBlockElements()[t.name]&&(e=>e.firstChild&&e.firstChild===e.lastChild)(t)&&(e=>"br"===e.name||e.value===dr)(t.firstChild))(e,t))})(e,o)&&(o=o.prev),!(!n||n!==o||"ul"!==n.name&&"ol"!==n.name)},xp=e=>{return e.length>0&&(!(n=e[e.length-1]).firstChild||(t=n)&&t.firstChild&&t.firstChild===t.lastChild&&(e=>e.data===dr||Do(e))(t.firstChild))?e.slice(0,-1):e;var t,n},wp=(e,t)=>{const n=e.getParent(t,e.isBlock);return n&&"LI"===n.nodeName?n:null},kp=(e,t)=>{const n=ja.after(e),o=oc(t).prev(n);return o?o.toRange():null},Sp=(e,t,n,o)=>{const r=((e,t,n)=>{const o=t.serialize(n);return(e=>{const t=e.firstChild,n=e.lastChild;return t&&"META"===t.nodeName&&t.parentNode.removeChild(t),n&&"mce_marker"===n.id&&n.parentNode.removeChild(n),e})(e.createFragment(o))})(t,e,o),s=wp(t,n.startContainer),a=xp((i=r.firstChild,K(i.childNodes,(e=>"LI"===e.nodeName))));var i;const l=t.getRoot(),d=e=>{const o=ja.fromRangeStart(n),r=oc(t.getRoot()),a=1===e?r.prev(o):r.next(o);return!a||wp(t,a.getNode())!==s};return d(1)?((e,t,n)=>{const o=e.parentNode;return Bt.each(t,(t=>{o.insertBefore(t,e)})),((e,t)=>{const n=ja.before(e),o=oc(t).next(n);return o?o.toRange():null})(e,n)})(s,a,l):d(2)?((e,t,n,o)=>(o.insertAfter(t.reverse(),e),kp(t[0],n)))(s,a,l,t):((e,t,n,o)=>{const r=((e,t)=>{const n=t.cloneRange(),o=t.cloneRange();return n.setStartBefore(e),o.setEndAfter(e),[n.cloneContents(),o.cloneContents()]})(e,o),s=e.parentNode;return s.insertBefore(r[0],e),Bt.each(t,(t=>{s.insertBefore(t,e)})),s.insertBefore(r[1],e),s.removeChild(e),kp(t[t.length-1],n)})(s,a,l,n)},_p=Io,Ep=(e,t,n)=>{let o,r,s;const a=e.selection,i=e.dom,l=e.parser,d=n.merge,c=Of({validate:!0},e.schema),u='<span id="mce_marker" data-mce-type="bookmark">&#xFEFF;</span>';-1===t.indexOf("{$caret}")&&(t+="{$caret}"),t=t.replace(/\{\$caret\}/,u),r=a.getRng();const m=r.startContainer||(r.parentElement?r.parentElement():null),f=e.getBody();m===f&&a.isCollapsed()&&i.isBlock(f.firstChild)&&((e,t)=>t&&!e.schema.getVoidElements()[t.nodeName])(e,f.firstChild)&&i.isEmpty(f.firstChild)&&(r=i.createRng(),r.setStart(f.firstChild,0),r.setEnd(f.firstChild,0),a.setRng(r)),a.isCollapsed()||(e=>{const t=e.dom,n=yp(e.selection.getRng());e.selection.setRng(n);const o=t.getParent(n.startContainer,_p);((e,t,n)=>null!==n&&n===e.getParent(t.endContainer,_p)&&wu(mn(n),t))(t,n,o)?tp(e,n,mn(o)):e.getDoc().execCommand("Delete",!1,null)})(e),o=a.getNode();const g={context:o.nodeName.toLowerCase(),data:n.data,insert:!0},p=l.parse(t,g);if(!0===n.paste&&Cp(e.schema,p)&&((e,t)=>!!wp(e,t))(i,o))return r=Sp(c,i,a.getRng(),p),a.setRng(r),t;if((e=>{let t=e;for(;t=t.walk();)1===t.type&&t.attr("data-mce-fragment","1")})(p),s=p.lastChild,"mce_marker"===s.attr("id")){const t=s;for(s=s.prev;s;s=s.walk(!0))if(3===s.type||!i.isBlock(s.name)){e.schema.isValidChild(s.parent.name,"span")&&s.parent.insert(t,s,"br"===s.name);break}}if(e._selectionOverrides.showBlockCaretContainer(o),g.invalid){e.selection.setContent(u),o=a.getNode();const n=e.getBody();for(9===o.nodeType?o=s=n:s=o;s!==n;)o=s,s=s.parentNode;t=o===n?n.innerHTML:i.getOuterHTML(o);const r=l.parse(t);for(let e=r;e;e=e.walk())if("mce_marker"===e.attr("id")){e.replace(p);break}const d=p.children(),m=p.parent.name;p.unwrap();const f=K(d,(t=>!e.schema.isValidChild(m,t.name)));vp(f,e.schema),fp(l.getNodeFilters(),l.getAttributeFilters(),r),t=c.serialize(r),o===n?i.setHTML(n,t):i.setOuterHTML(o,t)}else t=c.serialize(p),((e,t,n)=>{if("all"===n.getAttribute("data-mce-bogus"))n.parentNode.insertBefore(e.dom.createFragment(t),n);else{const o=n.firstChild,r=n.lastChild;!o||o===r&&"BR"===o.nodeName?e.dom.setHTML(n,t):e.selection.setContent(t,{no_events:!0})}})(e,t,o);var h;return((e,t)=>{const n=e.schema.getTextInlineElements(),o=e.dom;if(t){const t=e.getBody(),r=Nf(o);Bt.each(o.select("*[data-mce-fragment]"),(e=>{if(C(n[e.nodeName.toLowerCase()])&&((e,t)=>te(Df(e,t),(e=>!(e=>Tf.has(e))(e))))(o,e))for(let n=e.parentNode;C(n)&&n!==t&&!Lf(o,e,n);n=n.parentNode)if(r.compare(n,e)){o.remove(e,!0);break}}))}})(e,d),((e,t)=>{let n;const o=e.dom,r=e.selection;if(!t)return;r.scrollIntoView(t);const s=dp(e.getBody(),t);if("false"===o.getContentEditable(s))return o.remove(t),void r.select(s);let a=o.createRng();const i=t.previousSibling;if(No(i)){a.setStart(i,i.nodeValue.length);const e=t.nextSibling;No(e)&&(i.appendData(e.data),e.parentNode.removeChild(e))}else a.setStartBefore(t),a.setEndBefore(t);const l=o.getParent(t,o.isBlock);o.remove(t),l&&o.isEmpty(l)&&(eo(mn(l)),a.setStart(l,0),a.setEnd(l,0),_p(l)||(e=>!!e.getAttribute("data-mce-fragment"))(l)||!(n=(t=>{let n=ja.fromRangeStart(t);if(n=oc(e.getBody()).next(n),n)return n.toRange()})(a))?o.add(l,o.create("br",{"data-mce-bogus":"1"})):(a=n,o.remove(l))),r.setRng(a)})(e,i.get("mce_marker")),h=e.getBody(),Bt.each(h.getElementsByTagName("*"),(e=>{e.removeAttribute("data-mce-fragment")})),((e,t)=>{M.from(e.getParent(t,"td,th")).map(mn).each(Qf)})(i,a.getStart()),t},Np=e=>e instanceof xf,Rp=(e,t,n)=>{e.dom.setHTML(e.getBody(),t),!0!==n&&(e=>{rf(e)&&fc(e.getBody()).each((t=>{const n=t.getNode(),o=So(n)?fc(n).getOr(t):t;e.selection.setRng(o.toRange())}))})(e)},Ap=(e,t)=>((e,t)=>{const n=e.dom;return n.parentNode?((e,t)=>Q(e.dom.childNodes,(e=>t(mn(e)))).map(mn))(mn(n.parentNode),(n=>!bn(e,n)&&t(n))):M.none()})(e,t).isSome(),Op=e=>x(e)?e:L,Tp=(e,t,n)=>{const o=t(e),r=Op(n);return o.orThunk((()=>r(e)?M.none():((e,t,n)=>{let o=e.dom;const r=Op(n);for(;o.parentNode;){o=o.parentNode;const e=mn(o),n=t(e);if(n.isSome())return n;if(r(e))break}return M.none()})(e,t,r)))},Bp=qc,Dp=(e,t,n)=>{const o=e.formatter.get(n);if(o)for(let n=0;n<o.length;n++){const r=o[n];if(Qc(r)&&!1===r.inherit&&e.dom.is(t,r.selector))return!0}return!1},Lp=(e,t,n,o,r)=>{const s=e.dom.getRoot();return t!==s&&(t=e.dom.getParent(t,(t=>!!Dp(e,t,n)||t.parentNode===s||!!Ip(e,t,n,o,!0))),!!Ip(e,t,n,o,r))},Pp=(e,t,n)=>!(!Jc(n)||!Bp(t,n.inline))||!(!Xc(n)||!Bp(t,n.block))||!!Qc(n)&&yo(t)&&e.is(t,n.selector),Mp=(e,t,n,o,r,s)=>{const a=n[o];if(x(n.onmatch))return n.onmatch(t,n,o);if(a)if(v(a.length)){for(const i in a)if(we(a,i)){const l="attributes"===o?e.getAttrib(t,i):Kc(e,t,i),d=$c(a[i],s),c=y(l)||Ke(l);if(c&&y(d))continue;if(r&&c&&!n.exact)return!1;if((!r||n.exact)&&!Bp(l,Wc(d,i)))return!1}}else for(let n=0;n<a.length;n++)if("attributes"===o?e.getAttrib(t,a[n]):Kc(e,t,a[n]))return!0;return!0},Ip=(e,t,n,o,r)=>{const s=e.formatter.get(n),a=e.dom;if(s&&t)for(let n=0;n<s.length;n++){const i=s[n];if(Pp(e.dom,t,i)&&Mp(a,t,i,"attributes",r,o)&&Mp(a,t,i,"styles",r,o)){const n=i.classes;if(n)for(let r=0;r<n.length;r++)if(!e.dom.hasClass(t,$c(n[r],o)))return;return i}}},Fp=(e,t,n,o,r)=>{if(o)return Lp(e,o,t,n,r);if(o=e.selection.getNode(),Lp(e,o,t,n,r))return!0;const s=e.selection.getStart();return!(s===o||!Lp(e,s,t,n,r))},Up=ur,zp="_mce_caret",jp=e=>(e=>{const t=[];for(;e;){if(3===e.nodeType&&e.nodeValue!==Up||e.childNodes.length>1)return[];1===e.nodeType&&t.push(e),e=e.firstChild}return t})(e).length>0,Vp=e=>{if(e){const t=new Xo(e,e);for(e=t.current();e;e=t.next())if(No(e))return e}return null},Hp=e=>{const t=cn("span");return qt(t,{id:zp,"data-mce-bogus":"1","data-mce-type":"format-caret"}),e&&Jn(t,un(Up)),t},$p=(e,t,n=!0)=>{const o=e.dom,r=e.selection;if(jp(t))Mg(e,!1,mn(t),n);else{const e=r.getRng(),n=o.getParent(t,o.isBlock),s=e.startContainer,a=e.startOffset,i=e.endContainer,l=e.endOffset,d=(e=>{const t=Vp(e);return t&&t.nodeValue.charAt(0)===Up&&t.deleteData(0,1),t})(t);o.remove(t,!0),s===d&&a>0&&e.setStart(d,a-1),i===d&&l>0&&e.setEnd(d,l-1),n&&o.isEmpty(n)&&Xf(mn(n)),r.setRng(e)}},qp=(e,t,n=!0)=>{const o=e.dom,r=e.selection;if(t)$p(e,t,n);else if(!(t=bc(e.getBody(),r.getStart())))for(;t=o.get(zp);)$p(e,t,!1)},Wp=(e,t)=>(e.appendChild(t),t),Kp=(e,t)=>{const n=G(e,((e,t)=>Wp(e,t.cloneNode(!1))),t);return Wp(n,n.ownerDocument.createTextNode(Up))},Gp=(e,t,n,o)=>{const a=e.dom,i=e.selection;let l,d,c;const u=[],m=i.getRng(),f=m.startContainer,g=m.startOffset;for(d=f,3===f.nodeType&&(g!==f.nodeValue.length&&(l=!0),d=d.parentNode);d;){if(Ip(e,d,t,n,o)){c=d;break}d.nextSibling&&(l=!0),u.push(d),d=d.parentNode}if(c)if(l){const r=i.getBookmark();m.collapse(!0);let s=gu(e,m,e.formatter.get(t),!0);s=hm(s),e.formatter.remove(t,n,s,o),i.moveToBookmark(r)}else{const l=bc(e.getBody(),c),d=Hp(!1).dom;((e,t,n)=>{const o=e.dom,r=o.getParent(n,O(jc,e));r&&o.isEmpty(r)?n.parentNode.replaceChild(t,n):((e=>{const t=Js(e,"br"),n=K((e=>{const t=[];let n=e.dom;for(;n;)t.push(mn(n)),n=n.lastChild;return t})(e).slice(-1),tr);t.length===n.length&&$(n,to)})(mn(n)),o.isEmpty(n)?n.parentNode.replaceChild(t,n):o.insertAfter(t,n))})(e,d,null!==l?l:c);const m=((e,t,n,o,a,i)=>{const l=e.formatter,d=e.dom,c=K(ue(l.get()),(e=>e!==o&&!Ue(e,"removeformat"))),u=((e,t,n)=>Y(n,((n,o)=>{const r=((e,t)=>V(e.formatter.get(t),(e=>{const t=e=>e.length>1&&"%"===e.charAt(0);return V(["styles","attributes"],(n=>xe(e,n).exists((e=>{const n=p(e)?e:Ce(e);return V(n,t)}))))})))(e,o);return e.formatter.matchNode(t,o,{},r)?n.concat([o]):n}),[]))(e,n,c);if(K(u,(t=>!((e,t,n)=>{const o=["inline","block","selector","attributes","styles","classes"],a=e=>ve(e,((e,t)=>V(o,(e=>e===t))));return V(e.formatter.get(t),(t=>{const o=a(t);return V(e.formatter.get(n),(e=>{const t=a(e);return((e,t,n=s)=>r(n).eq(e,t))(o,t)}))}))})(e,t,o))).length>0){const e=n.cloneNode(!1);return d.add(t,e),l.remove(o,a,e,i),d.remove(e),M.some(e)}return M.none()})(e,d,c,t,n,o),f=Kp(u.concat(m.toArray()),d);$p(e,l,!1),i.setCursorLocation(f,1),a.isEmpty(c)&&a.remove(c)}},Yp=(e,t)=>{const n=e.schema.getTextInlineElements();return we(n,Mt(t))&&!hc(t.dom)&&!ko(t.dom)},Xp={},Qp=Re,Jp=Ee;Xp.pre||(Xp.pre=[]),Xp.pre.push((e=>{const t=e.selection.getRng();let n;const o=e=>r(e.previousSibling)&&-1!==Ae(n,e.previousSibling),r=Co(["pre"]);t.collapsed||(n=e.selection.getSelectedBlocks(),Jp(Qp(Qp(n,r),o),(e=>{((e,t)=>{const n=mn(t),o=Cn(n).dom;to(n),Zn(mn(e),[cn("br",o),cn("br",o),...Nn(n)])})(e.previousSibling,e)})))}));const Zp=Bt.each,eh=e=>yo(e)&&!Nc(e)&&!hc(e)&&!ko(e),th=(e,t)=>{for(let n=e;n;n=n[t]){if(No(n)&&We(n.data))return e;if(yo(n)&&!Nc(n))return n}return e},nh=(e,t,n)=>{const o=Nf(e);if(t&&n&&(t=th(t,"previousSibling"),n=th(n,"nextSibling"),o.compare(t,n))){for(let e=t.nextSibling;e&&e!==n;){const n=e;e=e.nextSibling,t.appendChild(n)}return e.remove(n),Bt.each(Bt.grep(n.childNodes),(e=>{t.appendChild(e)})),t}return n},oh=(e,t,n,o)=>{if(o&&!1!==t.merge_siblings){const t=nh(e,zc(o),o);nh(e,t,zc(t,!0))}},rh=(e,t,n)=>{Zp(e.childNodes,(e=>{eh(e)&&(t(e)&&n(e),e.hasChildNodes()&&rh(e,t,n))}))},sh=(e,t)=>n=>!(!n||!Kc(e,n,t)),ah=(e,t,n)=>o=>{e.setStyle(o,t,n),""===o.getAttribute("style")&&o.removeAttribute("style"),((e,t)=>{"SPAN"===t.nodeName&&0===e.getAttribs(t).length&&e.remove(t,!0)})(e,o)},ih=mi([{keep:[]},{rename:["name"]},{removed:[]}]),lh=/^(src|href|style)$/,dh=Bt.each,ch=qc,uh=(e,t,n)=>e.isChildOf(t,n)&&t!==n&&!e.isBlock(n),mh=(e,t,n)=>{let o=t[n?"startContainer":"endContainer"],r=t[n?"startOffset":"endOffset"];if(yo(o)){const e=o.childNodes.length-1;!n&&r&&r--,o=o.childNodes[r>e?e:r]}return No(o)&&n&&r>=o.nodeValue.length&&(o=new Xo(o,e.getBody()).next()||o),No(o)&&!n&&0===r&&(o=new Xo(o,e.getBody()).prev()||o),o},fh=(e,t)=>{const n=t?"firstChild":"lastChild";if((e=>/^(TR|TH|TD)$/.test(e.nodeName))(e)&&e[n]){const t=e[n];return"TR"===e.nodeName&&t[n]||t}return e},gh=(e,t,n,o)=>{const r=e.create(n,o);return t.parentNode.insertBefore(r,t),r.appendChild(t),r},ph=(e,t,n,o,r)=>{const s=mn(t),a=mn(e.create(o,r)),i=n?En(s):_n(s);return Zn(a,i),n?(Yn(s,a),Qn(a,s)):(Xn(s,a),Jn(a,s)),a.dom},hh=(e,t,n,o,r)=>{let s;const a=e.dom;if(!Pp(a,o,t)&&!((e,t)=>t.links&&"A"===e.nodeName)(o,t))return ih.keep();const i=o;if(Jc(t)&&"all"===t.remove&&p(t.preserve_attributes)){const e=K(a.getAttribs(i),(e=>j(t.preserve_attributes,e.name.toLowerCase())));if(a.removeAllAttribs(i),$(e,(e=>a.setAttrib(i,e.name,e.value))),e.length>0)return ih.rename("span")}if("all"!==t.remove){dh(t.styles,((e,o)=>{e=Wc($c(e,n),o+""),w(o)&&(o=e,r=null),(t.remove_similar||!r||ch(Kc(a,r,o),e))&&a.setStyle(i,o,""),s=!0})),s&&""===a.getAttrib(i,"style")&&(i.removeAttribute("style"),i.removeAttribute("data-mce-style")),dh(t.attributes,((e,o)=>{let s;if(e=$c(e,n),w(o)&&(o=e,r=null),t.remove_similar||!r||ch(a.getAttrib(r,o),e)){if("class"===o&&(e=a.getAttrib(i,o))&&(s="",$(e.split(/\s+/),(e=>{/mce\-\w+/.test(e)&&(s+=(s?" ":"")+e)})),s))return void a.setAttrib(i,o,s);if(lh.test(o)&&i.removeAttribute("data-mce-"+o),"style"===o&&Co(["li"])(i)&&"none"===a.getStyle(i,"list-style-type"))return i.removeAttribute(o),void a.setStyle(i,"list-style-type","none");"class"===o&&i.removeAttribute("className"),i.removeAttribute(o)}})),dh(t.classes,(e=>{e=$c(e,n),r&&!a.hasClass(r,e)||a.removeClass(i,e)}));const e=a.getAttribs(i);for(let t=0;t<e.length;t++){const n=e[t].nodeName;if(0!==n.indexOf("_")&&0!==n.indexOf("data-"))return ih.keep()}}return"none"!==t.remove?(((e,t,n)=>{const o=t.parentNode;let r;const s=e.dom,a=Di(e);Xc(n)&&o===s.getRoot()&&(n.list_block&&ch(t,n.list_block)||$(de(t.childNodes),(t=>{Vc(e,a,t.nodeName.toLowerCase())?r?r.appendChild(t):(r=gh(s,t,a),s.setAttribs(r,Li(e))):r=null}))),(e=>Qc(e)&&Jc(e)&&Dt(xe(e,"mixed"),!0))(n)&&!ch(n.inline,t)||s.remove(t,!0)})(e,i,t),ih.removed()):ih.keep()},bh=(e,t,n,o,r)=>hh(e,t,n,o,r).fold(L,(t=>(e.dom.rename(o,t),!0)),P),vh=(e,t,n,o)=>hh(e,t,n,o,o).fold(N(o),(t=>(e.dom.createFragment().appendChild(o),e.dom.rename(o,t))),N(null)),yh=(e,t,n,o,r)=>{const s=e.formatter.get(t),a=s[0];let i=!0;const l=e.dom,d=e.selection,c=o=>{const i=((e,t,n,o,r)=>{let s;return $(Yc(e.dom,t.parentNode).reverse(),(t=>{if(!s&&"_start"!==t.id&&"_end"!==t.id){const a=Ip(e,t,n,o,r);a&&!1!==a.split&&(s=t)}})),s})(e,o,t,n,r);return((e,t,n,o,r,s,a,i)=>{let l,d,c;const u=e.dom;if(n){const s=n.parentNode;for(let n=o.parentNode;n&&n!==s;n=n.parentNode){l=u.clone(n,!1);for(let n=0;n<t.length&&(l=vh(e,t[n],i,l),null!==l);n++);l&&(d&&l.appendChild(d),c||(c=l),d=l)}a.mixed&&u.isBlock(n)||(o=u.split(n,o)),d&&(r.parentNode.insertBefore(d,r),c.appendChild(r),Jc(a)&&oh(u,a,0,d))}return o})(e,s,i,o,o,0,a,n)},u=t=>V(s,(o=>bh(e,o,n,t,t))),m=t=>{let n=!0,o=!1;yo(t)&&l.getContentEditable(t)&&(n=i,i="true"===l.getContentEditable(t),o=!0);const r=de(t.childNodes);if(i&&!o){const e=u(t)||V(s,(e=>Pp(l,t,e))),n=t.parentNode;!e&&C(n)&&Zc(a)&&u(n)}if(a.deep&&r.length){for(let e=0;e<r.length;e++)m(r[e]);o&&(i=n)}$(["underline","line-through","overline"],(n=>{yo(t)&&e.dom.getStyle(t,"text-decoration")===n&&t.parentNode&&Gc(l,t.parentNode)===n&&bh(e,{deep:!1,exact:!0,inline:"span",styles:{textDecoration:n}},null,t)}))},f=e=>{const t=l.get(e?"_start":"_end");let n=t[e?"firstChild":"lastChild"];return(e=>Nc(e)&&yo(e)&&("_start"===e.id||"_end"===e.id))(n)&&(n=n[e?"firstChild":"lastChild"]),No(n)&&0===n.data.length&&(n=e?t.previousSibling||t.nextSibling:t.nextSibling||t.previousSibling),l.remove(t,!0),n},g=t=>{let n,o,r=gu(e,t,s,t.collapsed);if(a.split){if(r=hm(r),n=mh(e,r,!0),o=mh(e,r),n!==o){if(n=fh(n,!0),o=fh(o,!1),uh(l,n,o)){const e=M.from(n.firstChild).getOr(n);return c(ph(l,e,!0,"span",{id:"_start","data-mce-type":"bookmark"})),void f(!0)}if(uh(l,o,n)){const e=M.from(o.lastChild).getOr(o);return c(ph(l,e,!1,"span",{id:"_end","data-mce-type":"bookmark"})),void f(!1)}n=gh(l,n,"span",{id:"_start","data-mce-type":"bookmark"}),o=gh(l,o,"span",{id:"_end","data-mce-type":"bookmark"});const e=l.createRng();e.setStartAfter(n),e.setEndBefore(o),pu(l,e,(e=>{$(e,(e=>{Nc(e)||Nc(e.parentNode)||c(e)}))})),c(n),c(o),n=f(!0),o=f()}else n=o=c(n);r.startContainer=n.parentNode?n.parentNode:n,r.startOffset=l.nodeIndex(n),r.endContainer=o.parentNode?o.parentNode:o,r.endOffset=l.nodeIndex(o)+1}pu(l,r,(e=>{$(e,m)}))};if(o){if(Fc(o)){const e=l.createRng();e.setStartBefore(o),e.setEndAfter(o),g(e)}else g(o);Iu(e,t,o,n)}else if("false"!==l.getContentEditable(d.getNode()))d.isCollapsed()&&Jc(a)&&!vu(e).length?Gp(e,t,n,r):(Eu(d,!0,(()=>{_u(e,g)})),Jc(a)&&Fp(e,t,n,d.getStart())&&Uc(l,d,d.getRng()),e.nodeChanged()),Iu(e,t,o,n);else{o=d.getNode();for(let t=0;t<s.length&&(!s[t].ceFalseOverride||!bh(e,s[t],n,o,o));t++);Iu(e,t,o,n)}},Ch=Bt.each,xh=Bt.each,wh=e=>yo(e)&&!Nc(e)&&!hc(e)&&!ko(e),kh=(e,t,n,o)=>{const r=e.formatter.get(t),s=r[0],a=!o&&e.selection.isCollapsed(),i=e.dom,l=e.selection,d=(e,t=s)=>{if(x(t.onformat)&&t.onformat(e,t,n,o),xh(t.styles,((t,o)=>{i.setStyle(e,o,$c(t,n))})),t.styles){const t=i.getAttrib(e,"style");t&&i.setAttrib(e,"data-mce-style",t)}xh(t.attributes,((t,o)=>{i.setAttrib(e,o,$c(t,n))})),xh(t.classes,(t=>{t=$c(t,n),i.hasClass(e,t)||i.addClass(e,t)}))},c=(e,t)=>{let n=!1;return xh(e,(e=>!!Qc(e)&&(C(e.collapsed)&&e.collapsed!==a?void 0:i.is(t,e.selector)&&!hc(t)?(d(t,e),n=!0,!1):void 0))),n},u=e=>{if(m(e)){const t=i.create(e);return d(t),t}return null},f=(o,a,i)=>{const l=[];let m=!0;const f=s.inline||s.block,g=u(f);pu(o,a,(a=>{let u;const p=a=>{let h=!1,b=m;const v=a.nodeName.toLowerCase(),y=a.parentNode,x=y.nodeName.toLowerCase();if(yo(a)&&o.getContentEditable(a)&&(b=m,m="true"===o.getContentEditable(a),h=!0),Do(a)&&!((e,t,n,o)=>{if(bl(e)&&Jc(t)){const t=vs(e.schema),r=Ap(mn(n),(e=>hc(e.dom)));return ke(t,o)&&qr(mn(n.parentNode),!1)&&!r}return!1})(e,s,a,x))return u=null,void(Xc(s)&&o.remove(a));if(Xc(s)&&s.wrapper&&Ip(e,a,t,n))u=null;else{if(m&&!h&&Xc(s)&&!s.wrapper&&jc(e,v)&&Vc(e,x,f)){const e=o.rename(a,f);return d(e),l.push(e),void(u=null)}if(Qc(s)){let e=c(r,a);if(!e&&C(y)&&Zc(s)&&(e=c(r,y)),!Jc(s)||e)return void(u=null)}!m||h||!Vc(e,f,v)||!Vc(e,x,f)||!i&&No(a)&&mr(a.data)||hc(a)||Jc(s)&&o.isBlock(a)?(u=null,$(de(a.childNodes),p),h&&(m=b),u=null):(u||(u=o.clone(g,!1),a.parentNode.insertBefore(u,a),l.push(u)),u.appendChild(a))}};$(a,p)})),!0===s.links&&$(l,(e=>{const t=e=>{"A"===e.nodeName&&d(e,s),$(de(e.childNodes),t)};t(e)})),$(l,(a=>{const i=(e=>{let t=0;return $(e.childNodes,(e=>{(e=>C(e)&&No(e)&&0===e.length)(e)||Nc(e)||t++})),t})(a);!(l.length>1)&&o.isBlock(a)||0!==i?(Jc(s)||Xc(s)&&s.wrapper)&&(s.exact||1!==i||(a=(e=>{const t=Q(e.childNodes,wh).filter((e=>Pp(o,e,s)));return t.map((t=>{const n=o.clone(t,!1);return d(n),o.replace(n,e,!0),o.remove(t,!0),n})).getOr(e)})(a)),((e,t,n,o)=>{Ch(t,(t=>{Jc(t)&&Ch(e.dom.select(t.inline,o),(o=>{eh(o)&&bh(e,t,n,o,t.exact?o:null)})),((e,t,n)=>{if(t.clear_child_styles){const o=t.links?"*:not(a)":"*";Zp(e.select(o,n),(n=>{eh(n)&&Zp(t.styles,((t,o)=>{e.setStyle(n,o,"")}))}))}})(e.dom,t,o)}))})(e,r,n,a),((e,t,n,o,r)=>{Ip(e,r.parentNode,n,o)&&bh(e,t,o,r)||t.merge_with_parents&&e.dom.getParent(r.parentNode,(s=>{if(Ip(e,s,n,o))return bh(e,t,o,r),!0}))})(e,s,t,n,a),((e,t,n,o)=>{t.styles&&t.styles.backgroundColor&&rh(o,sh(e,"fontSize"),ah(e,"backgroundColor",$c(t.styles.backgroundColor,n)))})(o,s,n,a),((e,t,n,o)=>{const r=t=>{if(1===t.nodeType&&t.parentNode&&1===t.parentNode.nodeType){const n=Gc(e,t.parentNode);e.getStyle(t,"color")&&n?e.setStyle(t,"text-decoration",n):e.getStyle(t,"text-decoration")===n&&e.setStyle(t,"text-decoration",null)}};t.styles&&(t.styles.color||t.styles.textDecoration)&&(Bt.walk(o,r,"childNodes"),r(o))})(o,s,0,a),((e,t,n,o)=>{!Jc(t)||"sub"!==t.inline&&"sup"!==t.inline||(rh(o,sh(e,"fontSize"),ah(e,"fontSize","")),e.remove(e.select("sup"===t.inline?"sub":"sup",o),!0))})(o,s,0,a),oh(o,s,0,a)):o.remove(a,!0)}))};if("false"!==i.getContentEditable(l.getNode())){if(s){if(o)if(Fc(o)){if(!c(r,o)){const t=i.createRng();t.setStartBefore(o),t.setEndAfter(o),f(i,gu(e,t,r),!0)}}else f(i,o,!0);else a&&Jc(s)&&!vu(e).length?((e,t,n)=>{let o,r;const s=e.selection,a=s.getRng();let i=a.startOffset;const l=a.startContainer.nodeValue;o=bc(e.getBody(),s.getStart()),o&&(r=Vp(o));const d=/[^\s\u00a0\u00ad\u200b\ufeff]/;if(l&&i>0&&i<l.length&&d.test(l.charAt(i))&&d.test(l.charAt(i-1))){const o=s.getBookmark();a.collapse(!0);let r=gu(e,a,e.formatter.get(t));r=hm(r),e.formatter.apply(t,n,r),s.moveToBookmark(o)}else o&&r.nodeValue===Up||(c=e.getDoc(),u=Hp(!0).dom,o=c.importNode(u,!0),r=o.firstChild,a.insertNode(o),i=1),e.formatter.apply(t,n,o),s.setCursorLocation(r,i);var c,u})(e,t,n):(l.setRng(yp(l.getRng())),Eu(l,!0,(()=>{_u(e,((t,n)=>{const o=n?t:gu(e,t,r);f(i,o,!1)}))})),Uc(i,l,l.getRng()),e.nodeChanged());((e,t)=>{Jp(Xp[e],(e=>{e(t)}))})(t,e)}Mu(e,t,o,n)}else{o=l.getNode();for(let e=0,t=r.length;e<t;e++){const t=r[e];if(t.ceFalseOverride&&Qc(t)&&i.is(o,t.selector)){d(o,t);break}}Mu(e,t,o,n)}},Sh=e=>we(e,"vars"),_h=e=>e.selection.getStart(),Eh=(e,t,n,o,r)=>X(t,(t=>{const s=e.formatter.matchNode(t,n,null!=r?r:{},o);return!v(s)}),(t=>!!Dp(e,t,n)||!o&&C(e.formatter.matchNode(t,n,r,!0)))),Nh=(e,t)=>{const n=null!=t?t:_h(e);return K(Yc(e.dom,n),(e=>yo(e)&&!ko(e)))},Rh=(e,t,n)=>{const o=Nh(e,t);fe(n,((n,r)=>{const s=n=>{const s=Eh(e,o,r,n.similar,Sh(n)?n.vars:void 0),a=s.isSome();if(n.state.get()!==a){n.state.set(a);const e=s.getOr(t);Sh(n)?n.callback(a,{node:e,format:r,parents:o}):$(n.callbacks,(t=>t(a,{node:e,format:r,parents:o})))}};$([n.withSimilar,n.withoutSimilar],s),$(n.withVars,s)}))};var Ah=Object.hasOwnProperty,Oh=Object.setPrototypeOf,Th=Object.isFrozen,Bh=Object.getPrototypeOf,Dh=Object.getOwnPropertyDescriptor,Lh=Object.freeze,Ph=Object.seal,Mh=Object.create,Ih="undefined"!=typeof Reflect&&Reflect,Fh=Ih.apply,Uh=Ih.construct;Fh||(Fh=function(e,t,n){return e.apply(t,n)}),Lh||(Lh=function(e){return e}),Ph||(Ph=function(e){return e}),Uh||(Uh=function(e,t){return new(Function.prototype.bind.apply(e,[null].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(t))))});var zh,jh=Qh(Array.prototype.forEach),Vh=Qh(Array.prototype.pop),Hh=Qh(Array.prototype.push),$h=Qh(String.prototype.toLowerCase),qh=Qh(String.prototype.match),Wh=Qh(String.prototype.replace),Kh=Qh(String.prototype.indexOf),Gh=Qh(String.prototype.trim),Yh=Qh(RegExp.prototype.test),Xh=(zh=TypeError,function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return Uh(zh,t)});function Qh(e){return function(t){for(var n=arguments.length,o=Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return Fh(e,t,o)}}function Jh(e,t){Oh&&Oh(e,null);for(var n=t.length;n--;){var o=t[n];if("string"==typeof o){var r=$h(o);r!==o&&(Th(t)||(t[n]=r),o=r)}e[o]=!0}return e}function Zh(e){var t=Mh(null),n=void 0;for(n in e)Fh(Ah,e,[n])&&(t[n]=e[n]);return t}function eb(e,t){for(;null!==e;){var n=Dh(e,t);if(n){if(n.get)return Qh(n.get);if("function"==typeof n.value)return Qh(n.value)}e=Bh(e)}return function(e){return console.warn("fallback value for",e),null}}var tb=Lh(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),nb=Lh(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),ob=Lh(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),rb=Lh(["animate","color-profile","cursor","discard","fedropshadow","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),sb=Lh(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),ab=Lh(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),ib=Lh(["#text"]),lb=Lh(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),db=Lh(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),cb=Lh(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),ub=Lh(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),mb=Ph(/\{\{[\s\S]*|[\s\S]*\}\}/gm),fb=Ph(/<%[\s\S]*|[\s\S]*%>/gm),gb=Ph(/^data-[\-\w.\u00B7-\uFFFF]/),pb=Ph(/^aria-[\-\w]+$/),hb=Ph(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),bb=Ph(/^(?:\w+script|data):/i),vb=Ph(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),yb=Ph(/^html$/i),Cb="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function xb(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var wb=function(){return"undefined"==typeof window?null:window},kb=function(e,t){if("object"!==(void 0===e?"undefined":Cb(e))||"function"!=typeof e.createPolicy)return null;var n=null,o="data-tt-policy-suffix";t.currentScript&&t.currentScript.hasAttribute(o)&&(n=t.currentScript.getAttribute(o));var r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}},Sb=function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:wb(),n=function(t){return e(t)};if(n.version="2.3.6",n.removed=[],!t||!t.document||9!==t.document.nodeType)return n.isSupported=!1,n;var o=t.document,r=t.document,s=t.DocumentFragment,a=t.HTMLTemplateElement,i=t.Node,l=t.Element,d=t.NodeFilter,c=t.NamedNodeMap,u=void 0===c?t.NamedNodeMap||t.MozNamedAttrMap:c,m=t.HTMLFormElement,f=t.DOMParser,g=t.trustedTypes,p=l.prototype,h=eb(p,"cloneNode"),b=eb(p,"nextSibling"),v=eb(p,"childNodes"),y=eb(p,"parentNode");if("function"==typeof a){var C=r.createElement("template");C.content&&C.content.ownerDocument&&(r=C.content.ownerDocument)}var x=kb(g,o),w=x?x.createHTML(""):"",k=r,S=k.implementation,_=k.createNodeIterator,E=k.createDocumentFragment,N=k.getElementsByTagName,R=o.importNode,A={};try{A=Zh(r).documentMode?r.documentMode:{}}catch(e){}var O={};n.isSupported="function"==typeof y&&S&&void 0!==S.createHTMLDocument&&9!==A;var T=mb,B=fb,D=gb,L=pb,P=bb,M=vb,I=hb,F=null,U=Jh({},[].concat(xb(tb),xb(nb),xb(ob),xb(sb),xb(ib))),z=null,j=Jh({},[].concat(xb(lb),xb(db),xb(cb),xb(ub))),V=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),H=null,$=null,q=!0,W=!0,K=!1,G=!1,Y=!1,X=!1,Q=!1,J=!1,Z=!1,ee=!1,te=!0,ne=!0,oe=!1,re={},se=null,ae=Jh({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),ie=null,le=Jh({},["audio","video","img","source","image","track"]),de=null,ce=Jh({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ue="http://www.w3.org/1998/Math/MathML",me="http://www.w3.org/2000/svg",fe="http://www.w3.org/1999/xhtml",ge=fe,pe=!1,he=void 0,be=["application/xhtml+xml","text/html"],ve="text/html",ye=void 0,Ce=null,xe=r.createElement("form"),we=function(e){return e instanceof RegExp||e instanceof Function},ke=function(e){Ce&&Ce===e||(e&&"object"===(void 0===e?"undefined":Cb(e))||(e={}),e=Zh(e),F="ALLOWED_TAGS"in e?Jh({},e.ALLOWED_TAGS):U,z="ALLOWED_ATTR"in e?Jh({},e.ALLOWED_ATTR):j,de="ADD_URI_SAFE_ATTR"in e?Jh(Zh(ce),e.ADD_URI_SAFE_ATTR):ce,ie="ADD_DATA_URI_TAGS"in e?Jh(Zh(le),e.ADD_DATA_URI_TAGS):le,se="FORBID_CONTENTS"in e?Jh({},e.FORBID_CONTENTS):ae,H="FORBID_TAGS"in e?Jh({},e.FORBID_TAGS):{},$="FORBID_ATTR"in e?Jh({},e.FORBID_ATTR):{},re="USE_PROFILES"in e&&e.USE_PROFILES,q=!1!==e.ALLOW_ARIA_ATTR,W=!1!==e.ALLOW_DATA_ATTR,K=e.ALLOW_UNKNOWN_PROTOCOLS||!1,G=e.SAFE_FOR_TEMPLATES||!1,Y=e.WHOLE_DOCUMENT||!1,J=e.RETURN_DOM||!1,Z=e.RETURN_DOM_FRAGMENT||!1,ee=e.RETURN_TRUSTED_TYPE||!1,Q=e.FORCE_BODY||!1,te=!1!==e.SANITIZE_DOM,ne=!1!==e.KEEP_CONTENT,oe=e.IN_PLACE||!1,I=e.ALLOWED_URI_REGEXP||I,ge=e.NAMESPACE||fe,e.CUSTOM_ELEMENT_HANDLING&&we(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(V.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&we(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(V.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(V.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),he=he=-1===be.indexOf(e.PARSER_MEDIA_TYPE)?ve:e.PARSER_MEDIA_TYPE,ye="application/xhtml+xml"===he?function(e){return e}:$h,G&&(W=!1),Z&&(J=!0),re&&(F=Jh({},[].concat(xb(ib))),z=[],!0===re.html&&(Jh(F,tb),Jh(z,lb)),!0===re.svg&&(Jh(F,nb),Jh(z,db),Jh(z,ub)),!0===re.svgFilters&&(Jh(F,ob),Jh(z,db),Jh(z,ub)),!0===re.mathMl&&(Jh(F,sb),Jh(z,cb),Jh(z,ub))),e.ADD_TAGS&&(F===U&&(F=Zh(F)),Jh(F,e.ADD_TAGS)),e.ADD_ATTR&&(z===j&&(z=Zh(z)),Jh(z,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&Jh(de,e.ADD_URI_SAFE_ATTR),e.FORBID_CONTENTS&&(se===ae&&(se=Zh(se)),Jh(se,e.FORBID_CONTENTS)),ne&&(F["#text"]=!0),Y&&Jh(F,["html","head","body"]),F.table&&(Jh(F,["tbody"]),delete H.tbody),Lh&&Lh(e),Ce=e)},Se=Jh({},["mi","mo","mn","ms","mtext"]),_e=Jh({},["foreignobject","desc","title","annotation-xml"]),Ee=Jh({},["title","style","font","a","script"]),Ne=Jh({},nb);Jh(Ne,ob),Jh(Ne,rb);var Re=Jh({},sb);Jh(Re,ab);var Ae=function(e){var t=y(e);t&&t.tagName||(t={namespaceURI:fe,tagName:"template"});var n=$h(e.tagName),o=$h(t.tagName);return e.namespaceURI===me?t.namespaceURI===fe?"svg"===n:t.namespaceURI===ue?"svg"===n&&("annotation-xml"===o||Se[o]):Boolean(Ne[n]):e.namespaceURI===ue?t.namespaceURI===fe?"math"===n:t.namespaceURI===me?"math"===n&&_e[o]:Boolean(Re[n]):e.namespaceURI===fe&&!(t.namespaceURI===me&&!_e[o])&&!(t.namespaceURI===ue&&!Se[o])&&!Re[n]&&(Ee[n]||!Ne[n])},Oe=function(e){Hh(n.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=w}catch(t){e.remove()}}},Te=function(e,t){try{Hh(n.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){Hh(n.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!z[e])if(J||Z)try{Oe(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},Be=function(e){var t=void 0,n=void 0;if(Q)e="<remove></remove>"+e;else{var o=qh(e,/^[\r\n\t ]+/);n=o&&o[0]}"application/xhtml+xml"===he&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");var s=x?x.createHTML(e):e;if(ge===fe)try{t=(new f).parseFromString(s,he)}catch(e){}if(!t||!t.documentElement){t=S.createDocument(ge,"template",null);try{t.documentElement.innerHTML=pe?"":s}catch(e){}}var a=t.body||t.documentElement;return e&&n&&a.insertBefore(r.createTextNode(n),a.childNodes[0]||null),ge===fe?N.call(t,Y?"html":"body")[0]:Y?t.documentElement:a},De=function(e){return _.call(e.ownerDocument||e,e,d.SHOW_ELEMENT|d.SHOW_COMMENT|d.SHOW_TEXT,null,!1)},Le=function(e){return e instanceof m&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof u)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore)},Pe=function(e){return"object"===(void 0===i?"undefined":Cb(i))?e instanceof i:e&&"object"===(void 0===e?"undefined":Cb(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Me=function(e,t,o){O[e]&&jh(O[e],(function(e){e.call(n,t,o,Ce)}))},Ie=function(e){var t=void 0;if(Me("beforeSanitizeElements",e,null),Le(e))return Oe(e),!0;if(Yh(/[\u0080-\uFFFF]/,e.nodeName))return Oe(e),!0;var o=ye(e.nodeName);if(Me("uponSanitizeElement",e,{tagName:o,allowedTags:F}),e.hasChildNodes()&&!Pe(e.firstElementChild)&&(!Pe(e.content)||!Pe(e.content.firstElementChild))&&Yh(/<[/\w]/g,e.innerHTML)&&Yh(/<[/\w]/g,e.textContent))return Oe(e),!0;if("select"===o&&Yh(/<template/i,e.innerHTML))return Oe(e),!0;if(!F[o]||H[o]){if(!H[o]&&Ue(o)){if(V.tagNameCheck instanceof RegExp&&Yh(V.tagNameCheck,o))return!1;if(V.tagNameCheck instanceof Function&&V.tagNameCheck(o))return!1}if(ne&&!se[o]){var r=y(e)||e.parentNode,s=v(e)||e.childNodes;if(s&&r)for(var a=s.length-1;a>=0;--a)r.insertBefore(h(s[a],!0),b(e))}return Oe(e),!0}return e instanceof l&&!Ae(e)?(Oe(e),!0):"noscript"!==o&&"noembed"!==o||!Yh(/<\/no(script|embed)/i,e.innerHTML)?(G&&3===e.nodeType&&(t=e.textContent,t=Wh(t,T," "),t=Wh(t,B," "),e.textContent!==t&&(Hh(n.removed,{element:e.cloneNode()}),e.textContent=t)),Me("afterSanitizeElements",e,null),!1):(Oe(e),!0)},Fe=function(e,t,n){if(te&&("id"===t||"name"===t)&&(n in r||n in xe))return!1;if(W&&!$[t]&&Yh(D,t));else if(q&&Yh(L,t));else if(!z[t]||$[t]){if(!(Ue(e)&&(V.tagNameCheck instanceof RegExp&&Yh(V.tagNameCheck,e)||V.tagNameCheck instanceof Function&&V.tagNameCheck(e))&&(V.attributeNameCheck instanceof RegExp&&Yh(V.attributeNameCheck,t)||V.attributeNameCheck instanceof Function&&V.attributeNameCheck(t))||"is"===t&&V.allowCustomizedBuiltInElements&&(V.tagNameCheck instanceof RegExp&&Yh(V.tagNameCheck,n)||V.tagNameCheck instanceof Function&&V.tagNameCheck(n))))return!1}else if(de[t]);else if(Yh(I,Wh(n,M,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==Kh(n,"data:")||!ie[e])if(K&&!Yh(P,Wh(n,M,"")));else if(n)return!1;return!0},Ue=function(e){return e.indexOf("-")>0},ze=function(e){var t=void 0,n=void 0,o=void 0,r=void 0;Me("beforeSanitizeAttributes",e,null);var s=e.attributes;if(s){var a={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:z};for(r=s.length;r--;){var i=t=s[r],l=i.name,d=i.namespaceURI;n=Gh(t.value),o=ye(l);var c=n;if(a.attrName=o,a.attrValue=n,a.keepAttr=!0,a.forceKeepAttr=void 0,Me("uponSanitizeAttribute",e,a),n=a.attrValue,!a.forceKeepAttr)if(a.keepAttr)if(Yh(/\/>/i,n))Te(l,e);else{G&&(n=Wh(n,T," "),n=Wh(n,B," "));var u=ye(e.nodeName);if(Fe(u,o,n)){if(n!==c)try{d?e.setAttributeNS(d,l,n):e.setAttribute(l,n)}catch(t){Te(l,e)}}else Te(l,e)}else Te(l,e)}Me("afterSanitizeAttributes",e,null)}},je=function e(t){var n=void 0,o=De(t);for(Me("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)Me("uponSanitizeShadowNode",n,null),Ie(n)||(n.content instanceof s&&e(n.content),ze(n));Me("afterSanitizeShadowDOM",t,null)};return n.sanitize=function(e,r){var a=void 0,l=void 0,d=void 0,c=void 0,u=void 0;if((pe=!e)&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Pe(e)){if("function"!=typeof e.toString)throw Xh("toString is not a function");if("string"!=typeof(e=e.toString()))throw Xh("dirty is not a string, aborting")}if(!n.isSupported){if("object"===Cb(t.toStaticHTML)||"function"==typeof t.toStaticHTML){if("string"==typeof e)return t.toStaticHTML(e);if(Pe(e))return t.toStaticHTML(e.outerHTML)}return e}if(X||ke(r),n.removed=[],"string"==typeof e&&(oe=!1),oe){if(e.nodeName){var m=ye(e.nodeName);if(!F[m]||H[m])throw Xh("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof i)1===(l=(a=Be("\x3c!----\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===l.nodeName||"HTML"===l.nodeName?a=l:a.appendChild(l);else{if(!J&&!G&&!Y&&-1===e.indexOf("<"))return x&&ee?x.createHTML(e):e;if(!(a=Be(e)))return J?null:ee?w:""}a&&Q&&Oe(a.firstChild);for(var f=De(oe?e:a);d=f.nextNode();)3===d.nodeType&&d===c||Ie(d)||(d.content instanceof s&&je(d.content),ze(d),c=d);if(c=null,oe)return e;if(J){if(Z)for(u=E.call(a.ownerDocument);a.firstChild;)u.appendChild(a.firstChild);else u=a;return z.shadowroot&&(u=R.call(o,u,!0)),u}var g=Y?a.outerHTML:a.innerHTML;return Y&&F["!doctype"]&&a.ownerDocument&&a.ownerDocument.doctype&&a.ownerDocument.doctype.name&&Yh(yb,a.ownerDocument.doctype.name)&&(g="<!DOCTYPE "+a.ownerDocument.doctype.name+">\n"+g),G&&(g=Wh(g,T," "),g=Wh(g,B," ")),x&&ee?x.createHTML(g):g},n.setConfig=function(e){ke(e),X=!0},n.clearConfig=function(){Ce=null,X=!1},n.isValidAttribute=function(e,t,n){Ce||ke({});var o=ye(e),r=ye(t);return Fe(o,r,n)},n.addHook=function(e,t){"function"==typeof t&&(O[e]=O[e]||[],Hh(O[e],t))},n.removeHook=function(e){O[e]&&Vh(O[e])},n.removeHooks=function(e){O[e]&&(O[e]=[])},n.removeAllHooks=function(){O={}},n}();const _b=(e,t,n)=>{const o=xs();t.convert_fonts_to_spans&&((e,t,n)=>{e.addNodeFilter("font",(e=>{$(e,(e=>{const o=t.parse(e.attr("style")),r=e.attr("color"),s=e.attr("face"),a=e.attr("size");r&&(o.color=r),s&&(o["font-family"]=s),a&&(o["font-size"]=n[parseInt(e.attr("size"),10)-1]),e.name="span",e.attr("style",t.serialize(o)),((e,t)=>{$(["color","face","size"],(t=>{e.attr(t,null)}))})(e)}))}))})(e,o,Bt.explode(t.font_size_legacy_values)),((e,t,n)=>{e.addNodeFilter("strike",(e=>{const o="html4"!==t.type;$(e,(e=>{if(o)e.name="s";else{const t=n.parse(e.attr("style"));t["text-decoration"]="line-through",e.name="span",e.attr("style",n.serialize(t))}}))}))})(e,n,o)},Eb=e=>{let t;const n=decodeURIComponent(e).split(","),o=/data:([^;]+)/.exec(n[0]);return o&&(t=o[1]),{type:t,data:n[1]}},Nb=(e,t)=>{let n;try{n=atob(t)}catch(e){return M.none()}const o=new Uint8Array(n.length);for(let e=0;e<o.length;e++)o[e]=n.charCodeAt(e);return M.some(new Blob([o],{type:e}))},Rb=e=>{return 0===e.indexOf("blob:")?(e=>new Promise(((t,n)=>{const o=()=>{n("Cannot convert "+e+" to Blob. Resource might not exist or is inaccessible.")};try{const n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="blob",n.onload=()=>{200===n.status?t(n.response):o()},n.onerror=o,n.send()}catch(e){o()}})))(e):0===e.indexOf("data:")?(t=e,new Promise((e=>{const{type:n,data:o}=Eb(t);Nb(n,o).fold((()=>e(new Blob([]))),e)}))):null;var t},Ab=e=>new Promise((t=>{const n=new FileReader;n.onloadend=()=>{t(n.result)},n.readAsDataURL(e)}));let Ob=0;const Tb=e=>(e||"blobid")+Ob++,Bb=Bt.each,Db=Bt.trim,Lb="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),Pb={ftp:21,http:80,https:443,mailto:25},Mb=["img","video"],Ib=(e,t,n)=>{const o=(e=>{try{return decodeURIComponent(e)}catch(t){return unescape(e)}})(t);return!e.allow_script_urls&&(!!/((java|vb)script|mhtml):/i.test(o)||!e.allow_html_data_urls&&(/^data:image\//i.test(o)?((e,t)=>C(e)?!e:!C(t)||!j(Mb,t))(e.allow_svg_data_urls,n)&&/^data:image\/svg\+xml/i.test(o):/^data:/i.test(o)))};class Fb{constructor(e,t){e=Db(e),this.settings=t||{};const n=this.settings.base_uri,o=this;if(/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e))return void(o.source=e);const r=0===e.indexOf("//");if(0!==e.indexOf("/")||r||(e=(n&&n.protocol||"http")+"://mce_host"+e),!/^[\w\-]*:?\/\//.test(e)){const t=this.settings.base_uri?this.settings.base_uri.path:new Fb(document.location.href).directory;if(this.settings.base_uri&&""==this.settings.base_uri.protocol)e="//mce_host"+o.toAbsPath(t,e);else{const r=/([^#?]*)([#?]?.*)/.exec(e);e=(n&&n.protocol||"http")+"://mce_host"+o.toAbsPath(t,r[1])+r[2]}}e=e.replace(/@@/g,"(mce_at)");const s=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?(\[[a-zA-Z0-9:.%]+\]|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);Bb(Lb,((e,t)=>{let n=s[t];n&&(n=n.replace(/\(mce_at\)/g,"@@")),o[e]=n})),n&&(o.protocol||(o.protocol=n.protocol),o.userInfo||(o.userInfo=n.userInfo),o.port||"mce_host"!==o.host||(o.port=n.port),o.host&&"mce_host"!==o.host||(o.host=n.host),o.source=""),r&&(o.protocol="")}static parseDataUri(e){let t;const n=decodeURIComponent(e).split(","),o=/data:([^;]+)/.exec(n[0]);return o&&(t=o[1]),{type:t,data:n[1]}}static isDomSafe(e,t,n={}){if(n.allow_script_urls)return!0;{const o=ls.decode(e).replace(/[\s\u0000-\u001F]+/g,"");return!Ib(n,o,t)}}static getDocumentBaseUrl(e){let t;return t=0!==e.protocol.indexOf("http")&&"file:"!==e.protocol?e.href:e.protocol+"//"+e.host+e.pathname,/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),t}setPath(e){const t=/^(.*?)\/?(\w+)?$/.exec(e);this.path=t[0],this.directory=t[1],this.file=t[2],this.source="",this.getURI()}toRelative(e){let t;if("./"===e)return e;const n=new Fb(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();const o=this.getURI(),r=n.getURI();return o===r||"/"===o.charAt(o.length-1)&&o.substr(0,o.length-1)===r?o:(t=this.toRelPath(this.path,n.path),n.query&&(t+="?"+n.query),n.anchor&&(t+="#"+n.anchor),t)}toAbsolute(e,t){const n=new Fb(e,{base_uri:this});return n.getURI(t&&this.isSameOrigin(n))}isSameOrigin(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;const t=Pb[this.protocol];if(t&&(this.port||t)==(e.port||t))return!0}return!1}toRelPath(e,t){let n,o,r=0,s="";const a=e.substring(0,e.lastIndexOf("/")).split("/"),i=t.split("/");if(a.length>=i.length)for(n=0,o=a.length;n<o;n++)if(n>=i.length||a[n]!==i[n]){r=n+1;break}if(a.length<i.length)for(n=0,o=i.length;n<o;n++)if(n>=a.length||a[n]!==i[n]){r=n+1;break}if(1===r)return t;for(n=0,o=a.length-(r-1);n<o;n++)s+="../";for(n=r-1,o=i.length;n<o;n++)s+=n!==r-1?"/"+i[n]:i[n];return s}toAbsPath(e,t){let n,o,r=0,s=[];const a=/\/$/.test(t)?"/":"";let i=e.split("/");const l=t.split("/");for(Bb(i,(e=>{e&&s.push(e)})),i=s,n=l.length-1,s=[];n>=0;n--)0!==l[n].length&&"."!==l[n]&&(".."!==l[n]?r>0?r--:s.push(l[n]):r++);return n=i.length-r,o=n<=0?ne(s).join("/"):i.slice(0,n).join("/")+"/"+ne(s).join("/"),0!==o.indexOf("/")&&(o="/"+o),a&&o.lastIndexOf("/")!==o.length-1&&(o+=a),o}getURI(e=!1){let t;return 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}}const Ub=Bt.makeMap,zb=Bt.each,jb=Bt.explode,Vb=Bt.extend,Hb={IN_PLACE:!0,ALLOW_UNKNOWN_PROTOCOLS:!0,ALLOWED_TAGS:["#comment","#cdata-section","body"],ALLOWED_ATTR:[]},$b=Bt.makeMap("src,href,data,background,action,formaction,poster,xlink:href"),qb="data-mce-type",Wb=(e,t)=>{const n=Sb(),o=e.validate;let r=0;return n.addHook("uponSanitizeElement",((n,s)=>{var a,i;8===n.nodeType&&!e.allow_conditional_comments&&/^\[if/i.test(n.nodeValue)&&(n.nodeValue=" "+n.nodeValue);const l=s.tagName;if(1!==n.nodeType||"body"===l)return;const d=mn(n),c=Gt(d,qb),u=Wt(d,"data-mce-bogus");if(!c&&m(u))return void("all"===u?to(d):no(d));const f=t.getElementRule(l.toLowerCase());if(!o||f){if(s.allowedTags[l]=!0,o&&!c){if($(null!==(a=f.attributesForced)&&void 0!==a?a:[],(e=>{$t(d,e.name,"{$uid}"===e.value?"mce_"+r++:e.value)})),$(null!==(i=f.attributesDefault)&&void 0!==i?i:[],(e=>{Gt(d,e.name)||$t(d,e.name,"{$uid}"===e.value?"mce_"+r++:e.value)})),f.attributesRequired&&!V(f.attributesRequired,(e=>Gt(d,e))))return void no(d);if(f.removeEmptyAttrs&&(e=>{const t=e.dom.attributes;return null==t||0===t.length})(d))return void no(d);f.outputName&&f.outputName!==l.toLowerCase()&&((e,t)=>{const n=((e,t)=>{const n=cn(t),o=Xt(e);return qt(n,o),n})(e,t);Xn(e,n);const o=Nn(e);Zn(n,o),to(e)})(d,f.outputName)}}else no(d)})),n.addHook("uponSanitizeAttribute",((n,r)=>{const s=n.tagName.toLowerCase(),{attrName:a,attrValue:i}=r;r.keepAttr=!o||t.isValid(s,a)||ze(a,"data-")||ze(a,"aria-"),a in $b&&Ib(e,i,s)&&(r.keepAttr=!1),r.keepAttr?(r.allowedAttributes[a]=!0,a in t.getBoolAttrs()&&(r.attrValue=a),e.allow_svg_data_urls&&ze(i,"data:image/svg+xml")&&(r.forceKeepAttr=!0)):!n.hasAttribute(qb)||"id"!==a&&"class"!==a&&"style"!==a||(r.forceKeepAttr=!0)})),n},Kb=(e,t,n)=>{const o=e.name,r=o in n&&"title"!==o&&"textarea"!==o,s=t.childNodes;for(let t=0,o=s.length;t<o;t++){const o=s[t],a=new xf(o.nodeName.toLowerCase(),o.nodeType);if(yo(o)){const e=o.attributes;for(let t=0,n=e.length;t<n;t++){const n=e[t];a.attr(n.name,n.value)}}else No(o)?(a.value=o.data,r&&(a.raw=!0)):(Oo(o)||Ro(o)||Ao(o))&&(a.value=o.data);Kb(a,o,n),e.append(a)}},Gb=(e={},t=Cs())=>{const n={},o=[],r={validate:!0,root_name:"body",...e},s=new DOMParser,a=Wb(r,t),i=()=>{const e=[];for(const t in n)we(n,t)&&e.push({name:t,callbacks:n[t]});return e},l={schema:t,addAttributeFilter:(e,t)=>{zb(jb(e),(e=>{let n;for(n=0;n<o.length;n++)if(o[n].name===e)return void o[n].callbacks.push(t);o.push({name:e,callbacks:[t]})}))},getAttributeFilters:()=>[].concat(o),addNodeFilter:(e,t)=>{zb(jb(e),(e=>{let o=n[e];o||(n[e]=o=[]),o.push(t)}))},getNodeFilters:i,parse:(e,n={})=>{var l;const d=r.validate,c=null!==(l=n.context)&&void 0!==l?l:r.root_name,u=((e,n,o="html")=>{const i="xhtml"===o?"application/xhtml+xml":"text/html",l=we(t.getSpecialElements(),n.toLowerCase()),d=l?`<${n}>${e}</${n}>`:e,c="xhtml"===o?`<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>${d}</body></html>`:`<body>${d}</body>`,u=s.parseFromString(c,i).body;return a.sanitize(u,((e,t)=>{const n={...Hb};return n.PARSER_MEDIA_TYPE=t,e.allow_script_urls?n.ALLOWED_URI_REGEXP=/.*/:e.allow_html_data_urls&&(n.ALLOWED_URI_REGEXP=/^(?!(\w+script|mhtml):)/i),n})(r,i)),a.removed=[],l?u.firstChild:u})(e,c,n.format),m=new xf(c,11);Kb(m,u,t.getSpecialElements());const[f,g]=((e,t,n,o)=>{const r=n.validate,s=t.getNonEmptyElements(),a=t.getWhitespaceElements(),i=Vb(Ub("script,style,head,html,body,title,meta,param"),t.getBlockElements()),l=vs(t),d=/[ \t\r\n]+/g,c=/^[ \t\r\n]+/,u=/[ \t\r\n]+$/,m=e=>{for(e=e.parent;C(e);){if(e.name in a)return!0;e=e.parent}return!1},f=(t,n)=>{const r=n?t.prev:t.next;return!C(r)&&t.parent.name in i&&(t.parent!==e||o.isRootContent)};return[e=>{if(3===e.type&&!m(e)){let t=e.value;t=t.replace(d," "),(((e,t)=>e&&(e.name in t||"br"===e.name))(e.prev,i)||f(e,!0))&&(t=t.replace(c,"")),0===t.length?e.remove():e.value=t}},e=>{var n;if(1===e.type){const n=t.getElementRule(e.name);if(r&&n){const r=hp(t,s,a,e);n.paddInEmptyBlock&&r&&(e=>{let n=e;for(;C(n);){if(n.name in l)return hp(t,s,a,n);n=n.parent}return!1})(e)?gp(0,o,i,e):n.removeEmpty&&r?i[e.name]?e.remove():e.unwrap():n.paddEmpty&&(r||(e=>pp(e,"#text")&&e.firstChild.value===dr)(e))&&gp(0,o,i,e)}}else if(3===e.type&&!m(e)){let t=e.value;(i[null===(n=e.next)||void 0===n?void 0:n.name]||f(e,!1))&&(t=t.replace(u,"")),0===t.length?e.remove():e.value=t}}]})(m,t,r,n),p=[],h=d?e=>((e,n)=>{const o=e.parent;o&&t.children[e.name]&&!t.isValidChild(o.name,e.name)&&n.push(e)})(e,p):S,b=i(),v={nodes:{},attributes:{}},x=e=>up(b,o,e,v);if(((e,t,n)=>{const o=[];for(let n=e,r=n;C(n);r=n,n=n.walk())$(t,(e=>e(n))),y(n.parent)&&n!==e?n=r:o.push(n);for(let e=o.length-1;e>=0;e--){const t=o[e];$(n,(e=>e(t)))}})(m,[f,x],[g,h]),p.reverse(),d&&p.length>0)if(n.context){const{pass:e,fail:o}=W(p,(e=>e.parent===m));vp(o,t,x),n.invalid=e.length>0}else vp(p,t,x);const w=((e,t)=>{var n;const o=null!==(n=t.forced_root_block)&&void 0!==n?n:e.forced_root_block;return!1===o?"":!0===o?"p":o})(r,n);return w&&("body"===m.name||n.isRootContent)&&((e,n)=>{const o=Vb(Ub("script,style,head,html,body,title,meta,param"),t.getBlockElements()),s=/^[ \t\r\n]+/,a=/[ \t\r\n]+$/;let i=e.firstChild,l=null;const d=e=>{e&&(i=e.firstChild,i&&3===i.type&&(i.value=i.value.replace(s,"")),i=e.lastChild,i&&3===i.type&&(i.value=i.value.replace(a,"")))};if(t.isValidChild(e.name,n.toLowerCase())){for(;i;){const t=i.next;3===i.type||1===i.type&&"p"!==i.name&&!o[i.name]&&!i.attr(qb)?(l||(l=new xf(n,1),l.attr(r.forced_root_block_attrs),e.insert(l,i)),l.append(i)):(d(l),l=null),i=t}d(l)}})(m,w),n.invalid||mp(v,n),m}};return((e,t)=>{const n=e.schema;t.remove_trailing_brs&&e.addNodeFilter("br",((e,t,o)=>{const r=Bt.extend({},n.getBlockElements()),s=n.getNonEmptyElements(),a=n.getWhitespaceElements();r.body=1;for(let t=0,i=e.length;t<i;t++){let i=e[t],l=i.parent;if(r[i.parent.name]&&i===l.lastChild){let e=i.prev;for(;e;){const t=e.name;if("span"!==t||"bookmark"!==e.attr("data-mce-type")){"br"===t&&(i=null);break}e=e.prev}if(i&&(i.remove(),hp(n,s,a,l))){const e=n.getElementRule(l.name);e&&(e.removeEmpty?l.remove():e.paddEmpty&&gp(0,o,r,l))}}else{let e=i;for(;l&&l.firstChild===e&&l.lastChild===e&&(e=l,!r[l.name]);)l=l.parent;if(e===l){const e=new xf("#text",3);e.value=dr,i.replace(e)}}}})),e.addAttributeFilter("href",(e=>{let n=e.length;const o=e=>{const t=e?Bt.trim(e):"";return/\b(noopener)\b/g.test(t)?t:(e=>e.split(" ").filter((e=>e.length>0)).concat(["noopener"]).sort().join(" "))(t)};if(!t.allow_unsafe_link_target)for(;n--;){const t=e[n];"a"===t.name&&"_blank"===t.attr("target")&&t.attr("rel",o(t.attr("rel")))}})),t.allow_html_in_named_anchor||e.addAttributeFilter("id,name",(e=>{let t,n,o,r,s=e.length;for(;s--;)if(r=e[s],"a"===r.name&&r.firstChild&&!r.attr("href")){o=r.parent,t=r.lastChild;do{n=t.prev,o.insert(t,r),t=n}while(t)}})),t.fix_list_elements&&e.addNodeFilter("ul,ol",(e=>{let t,n,o=e.length;for(;o--;)if(t=e[o],n=t.parent,"ul"===n.name||"ol"===n.name)if(t.prev&&"li"===t.prev.name)t.prev.append(t);else{const e=new xf("li",1);e.attr("style","list-style-type: none"),t.wrap(e)}})),t.validate&&n.getValidClasses()&&e.addAttributeFilter("class",(e=>{const t=n.getValidClasses();let o=e.length;for(;o--;){const n=e[o],r=n.attr("class").split(" ");let s="";for(let e=0;e<r.length;e++){const o=r[e];let a=!1,i=t["*"];i&&i[o]&&(a=!0),i=t[n.name],!a&&i&&i[o]&&(a=!0),a&&(s&&(s+=" "),s+=o)}s.length||(s=null),n.attr("class",s)}})),((e,t)=>{const{blob_cache:n}=t,o=e=>{const t=e.attr("src");(e=>e.attr("src")===Nt.transparentSrc||C(e.attr("data-mce-placeholder")))(e)||(e=>C(e.attr("data-mce-bogus")))(e)||(e=>{const t=/data:([^;]+);base64,([a-z0-9\+\/=\s]+)/i.exec(e);return t?M.some({type:t[1],data:decodeURIComponent(t[2])}):M.none()})(t).bind((({type:e,data:t})=>M.from(n.getByData(t,e)).orThunk((()=>Nb(e,t).map((e=>{const o=n.create(Tb(),e,t);return n.add(o),o})))))).each((t=>{e.attr("src",t.blobUri())}))};n&&e.addAttributeFilter("src",(e=>$(e,o)))})(e,t)})(l,r),((e,t,n)=>{t.inline_styles&&_b(e,t,n)})(l,r,t),l},Yb=(e,t)=>{const n=(e=>Np(e)?Of({validate:!1}).serialize(e):e)(e),o=t(n);if(o.isDefaultPrevented())return o;if(Np(e)){if(o.content!==n){const t=Gb({validate:!1,forced_root_block:!1}).parse(o.content,{context:e.name});return{...o,content:t}}return{...o,content:e}}return o},Xb=(e,t)=>{if(t.no_events)return ui.value(t);{const n=((e,t)=>e.dispatch("BeforeGetContent",t))(e,t);return n.isDefaultPrevented()?ui.error(Uu(e,{content:"",...n}).content):ui.value(n)}},Qb=(e,t,n)=>n.no_events?t:Yb(t,(t=>Uu(e,{...n,content:t}))).content,Jb=(e,t)=>{if(t.no_events)return ui.value(t);{const n=Yb(t.content,(n=>((e,t)=>e.dispatch("BeforeSetContent",t))(e,{...t,content:n})));return n.isDefaultPrevented()?(Fu(e,n),ui.error(void 0)):ui.value(n)}},Zb=(e,t,n)=>{n.no_events||Fu(e,{...n,content:t})},ev=(e,t,n)=>({element:e,width:t,rows:n}),tv=(e,t)=>({element:e,cells:t}),nv=(e,t)=>({x:e,y:t}),ov=(e,t)=>{const n=parseInt(Wt(e,t),10);return isNaN(n)?1:n},rv=(e,t,n)=>{const o=e.rows;return!!(o[n]?o[n].cells:[])[t]},sv=e=>Y(e,((e,t)=>t.cells.length>e?t.cells.length:e),0),av=(e,t)=>{const n=e.rows;for(let e=0;e<n.length;e++){const o=n[e].cells;for(let n=0;n<o.length;n++)if(bn(o[n],t))return M.some(nv(n,e))}return M.none()},iv=(e,t,n,o,r)=>{const s=[],a=e.rows;for(let e=n;e<=r;e++){const n=a[e].cells,r=t<o?n.slice(t,o+1):n.slice(o,t+1);s.push(tv(a[e].element,r))}return s},lv=e=>((e,t)=>{const n=da(e.element),o=cn("tbody");return Zn(o,t),Jn(n,o),n})(e,(e=>H(e.rows,(e=>{const t=H(e.cells,(e=>{const t=ca(e);return Yt(t,"colspan"),Yt(t,"rowspan"),t})),n=da(e.element);return Zn(n,t),n})))(e)),dv=(e,t)=>{const n=mn(t.commonAncestorContainer),o=Zf(n,e),r=K(o,(e=>er(e)||Jo(e))),s=((e,t)=>Q(e,(e=>"li"===Mt(e)&&wu(e,t))).fold(N([]),(t=>(e=>Q(e,(e=>"ul"===Mt(e)||"ol"===Mt(e))))(e).map((e=>{const t=cn(Mt(e)),n=ve(Kn(e),((e,t)=>ze(t,"list-style")));return Hn(t,n),[cn("li"),t]})).getOr([]))))(o,t),a=r.concat(s.length?s:(e=>rr(e)?wn(e).filter(or).fold(N([]),(t=>[e,t])):or(e)?[e]:[])(n));return H(a,da)},cv=()=>nm([]),uv=(e,t)=>((e,t)=>qo(t,"table",O(bn,e)))(e,t[0]).bind((e=>{const n=t[0],o=t[t.length-1],r=(e=>{const t=ev(da(e),0,[]);return $(Js(e,"tr"),((e,n)=>{$(Js(e,"td,th"),((o,r)=>{((e,t,n,o,r)=>{const s=ov(r,"rowspan"),a=ov(r,"colspan"),i=e.rows;for(let e=n;e<n+s;e++){i[e]||(i[e]=tv(ca(o),[]));for(let o=t;o<t+a;o++)i[e].cells[o]=e===n&&o===t?r:da(r)}})(t,((e,t,n)=>{for(;rv(e,t,n);)t++;return t})(t,r,n),n,e,o)}))})),ev(t.element,sv(t.rows),t.rows)})(e);return((e,t,n)=>av(e,t).bind((t=>av(e,n).map((n=>((e,t,n)=>{const o=t.x,r=t.y,s=n.x,a=n.y,i=r<a?iv(e,o,r,s,a):iv(e,o,a,s,r);return ev(e.element,sv(i),i)})(e,t,n))))))(r,n,o).map((e=>nm([lv(e)])))})).getOrThunk(cv),mv=(e,t)=>{const n=bu(t,e);return n.length>0?uv(e,n):((e,t)=>t.length>0&&t[0].collapsed?cv():((e,t)=>((e,t)=>{const n=Y(t,((e,t)=>(Jn(t,e),t)),e);return t.length>0?nm([n]):n})(mn(t.cloneContents()),dv(e,t)))(e,t[0]))(e,t)},fv=(e,t)=>t>=0&&t<e.length&&Ac(e.charAt(t)),gv=e=>fr(e.innerText),pv=e=>yo(e)?e.outerHTML:No(e)?ls.encodeRaw(e.data,!1):Oo(e)?"\x3c!--"+e.data+"--\x3e":"",hv=(e,t)=>(((e,t)=>{let n=0;$(e,(e=>{0===e[0]?n++:1===e[0]?(((e,t,n)=>{const o=(e=>{let t;const n=document.createElement("div"),o=document.createDocumentFragment();for(e&&(n.innerHTML=e);t=n.firstChild;)o.appendChild(t);return o})(t);if(e.hasChildNodes()&&n<e.childNodes.length){const t=e.childNodes[n];t.parentNode.insertBefore(o,t)}else e.appendChild(o)})(t,e[1],n),n++):2===e[0]&&((e,t)=>{if(e.hasChildNodes()&&t<e.childNodes.length){const n=e.childNodes[t];n.parentNode.removeChild(n)}})(t,n)}))})(((e,t)=>{const n=e.length+t.length+2,o=new Array(n),r=new Array(n),s=(n,o,r,a,l)=>{const d=i(n,o,r,a);if(null===d||d.start===o&&d.diag===o-a||d.end===n&&d.diag===n-r){let s=n,i=r;for(;s<o||i<a;)s<o&&i<a&&e[s]===t[i]?(l.push([0,e[s]]),++s,++i):o-n>a-r?(l.push([2,e[s]]),++s):(l.push([1,t[i]]),++i)}else{s(n,d.start,r,d.start-d.diag,l);for(let t=d.start;t<d.end;++t)l.push([0,e[t]]);s(d.end,o,d.end-d.diag,a,l)}},a=(n,o,r,s)=>{let a=n;for(;a-o<s&&a<r&&e[a]===t[a-o];)++a;return((e,t,n)=>({start:e,end:t,diag:n}))(n,a,o)},i=(n,s,i,l)=>{const d=s-n,c=l-i;if(0===d||0===c)return null;const u=d-c,m=c+d,f=(m%2==0?m:m+1)/2;let g,p,h,b,v;for(o[1+f]=n,r[1+f]=s+1,g=0;g<=f;++g){for(p=-g;p<=g;p+=2){for(h=p+f,p===-g||p!==g&&o[h-1]<o[h+1]?o[h]=o[h+1]:o[h]=o[h-1]+1,b=o[h],v=b-n+i-p;b<s&&v<l&&e[b]===t[v];)o[h]=++b,++v;if(u%2!=0&&u-g<=p&&p<=u+g&&r[h-u]<=o[h])return a(r[h-u],p+n-i,s,l)}for(p=u-g;p<=u+g;p+=2){for(h=p+f-u,p===u-g||p!==u+g&&r[h+1]<=r[h-1]?r[h]=r[h+1]-1:r[h]=r[h-1],b=r[h]-1,v=b-n+i-p;b>=n&&v>=i&&e[b]===t[v];)r[h]=b--,v--;if(u%2==0&&-g<=p&&p<=g&&r[h]<=o[h+u])return a(r[h],p+n-i,s,l)}}},l=[];return s(0,e.length,0,t.length,l),l})(H(de(t.childNodes),pv),e),t),t),bv=De((()=>document.implementation.createHTMLDocument("undo"))),vv=e=>{const t=(n=e.getBody(),K(H(de(n.childNodes),pv),(e=>e.length>0)));var n;const o=ee(t,(t=>{const n=Sf(e.serializer,t);return n.length>0?[n]:[]})),r=o.join("");return(e=>-1!==e.indexOf("</iframe>"))(r)?(e=>({type:"fragmented",fragments:e,content:"",bookmark:null,beforeBookmark:null}))(o):(e=>({type:"complete",fragments:null,content:e,bookmark:null,beforeBookmark:null}))(r)},yv=(e,t,n)=>{const o=n?t.beforeBookmark:t.bookmark;"fragmented"===t.type?hv(t.fragments,e.getBody()):e.setContent(t.content,{format:"raw",no_selection:!C(o)||!vc(o)||!o.isFakeCaret}),e.selection.moveToBookmark(o)},Cv=e=>"fragmented"===e.type?e.fragments.join(""):e.content,xv=e=>{const t=cn("body",bv());return ro(t,Cv(e)),$(Js(t,"*[data-mce-bogus]"),no),oo(t)},wv=(e,t)=>!(!e||!t)&&(!!((e,t)=>Cv(e)===Cv(t))(e,t)||((e,t)=>xv(e)===xv(t))(e,t)),kv=e=>0===e.get(),Sv=(e,t,n)=>{kv(n)&&(e.typing=t)},_v=(e,t)=>{e.typing&&(Sv(e,!1,t),e.add())},Ev=e=>({init:{bindEvents:S},undoManager:{beforeChange:(t,n)=>((e,t,n)=>{kv(t)&&n.set(li(e.selection))})(e,t,n),add:(t,n,o,r,s,a)=>((e,t,n,o,r,s,a)=>{const i=vv(e);if(s=s||{},s=Bt.extend(s,i),!1===kv(o)||e.removed)return null;const l=t.data[n.get()];if(e.dispatch("BeforeAddUndo",{level:s,lastLevel:l,originalEvent:a}).isDefaultPrevented())return null;if(l&&wv(l,s))return null;t.data[n.get()]&&r.get().each((e=>{t.data[n.get()].beforeBookmark=e}));const d=Sl(e);if(d&&t.data.length>d){for(let e=0;e<t.data.length-1;e++)t.data[e]=t.data[e+1];t.data.length--,n.set(t.data.length)}s.bookmark=li(e.selection),n.get()<t.data.length-1&&(t.data.length=n.get()+1),t.data.push(s),n.set(t.data.length-1);const c={level:s,lastLevel:l,originalEvent:a};return n.get()>0?(e.setDirty(!0),e.dispatch("AddUndo",c),e.dispatch("change",c)):e.dispatch("AddUndo",c),s})(e,t,n,o,r,s,a),undo:(t,n,o)=>((e,t,n,o)=>{let r;return t.typing&&(t.add(),t.typing=!1,Sv(t,!1,n)),o.get()>0&&(o.set(o.get()-1),r=t.data[o.get()],yv(e,r,!0),e.setDirty(!0),e.dispatch("Undo",{level:r})),r})(e,t,n,o),redo:(t,n)=>((e,t,n)=>{let o;return t.get()<n.length-1&&(t.set(t.get()+1),o=n[t.get()],yv(e,o,!1),e.setDirty(!0),e.dispatch("Redo",{level:o})),o})(e,t,n),clear:(t,n)=>((e,t,n)=>{t.data=[],n.set(0),t.typing=!1,e.dispatch("ClearUndos")})(e,t,n),reset:e=>(e=>{e.clear(),e.add()})(e),hasUndo:(t,n)=>((e,t,n)=>n.get()>0||t.typing&&t.data[0]&&!wv(vv(e),t.data[0]))(e,t,n),hasRedo:(e,t)=>((e,t)=>t.get()<e.data.length-1&&!e.typing)(e,t),transact:(e,t,n)=>((e,t,n)=>(_v(e,t),e.beforeChange(),e.ignore(n),e.add()))(e,t,n),ignore:(e,t)=>((e,t)=>{try{e.set(e.get()+1),t()}finally{e.set(e.get()-1)}})(e,t),extra:(t,n,o,r)=>((e,t,n,o,r)=>{if(t.transact(o)){const o=t.data[n.get()].bookmark,s=t.data[n.get()-1];yv(e,s,!0),t.transact(r)&&(t.data[n.get()-1].beforeBookmark=o)}})(e,t,n,o,r)},formatter:{match:(t,n,o,r)=>Fp(e,t,n,o,r),matchAll:(t,n)=>((e,t,n)=>{const o=[],r={},s=e.selection.getStart();return e.dom.getParent(s,(s=>{for(let a=0;a<t.length;a++){const i=t[a];!r[i]&&Ip(e,s,i,n)&&(r[i]=!0,o.push(i))}}),e.dom.getRoot()),o})(e,t,n),matchNode:(t,n,o,r)=>Ip(e,t,n,o,r),canApply:t=>((e,t)=>{const n=e.formatter.get(t),o=e.dom;if(n){const t=e.selection.getStart(),r=Yc(o,t);for(let e=n.length-1;e>=0;e--){const t=n[e];if(!Qc(t))return!0;for(let e=r.length-1;e>=0;e--)if(o.is(r[e],t.selector))return!0}}return!1})(e,t),closest:t=>((e,t)=>{const n=t=>bn(t,mn(e.getBody()));return M.from(e.selection.getStart(!0)).bind((o=>Tp(mn(o),(n=>ce(t,(t=>((t,n)=>Ip(e,t.dom,n)?M.some(n):M.none())(n,t)))),n))).getOrNull()})(e,t),apply:(t,n,o)=>kh(e,t,n,o),remove:(t,n,o,r)=>yh(e,t,n,o,r),toggle:(t,n,o)=>((e,t,n,o)=>{const r=e.formatter.get(t);!Fp(e,t,n,o)||"toggle"in r[0]&&!r[0].toggle?kh(e,t,n,o):yh(e,t,n,o)})(e,t,n,o),formatChanged:(t,n,o,r,s)=>((e,t,n,o,r,s)=>(null===t.get()&&((e,t)=>{e.set({}),t.on("NodeChange",(n=>{Rh(t,n.element,e.get())})),t.on("FormatApply FormatRemove",(n=>{const o=M.from(n.node).map((e=>Fc(e)?e:e.startContainer)).bind((e=>yo(e)?M.some(e):M.from(e.parentElement))).getOrThunk((()=>_h(t)));Rh(t,o,e.get())}))})(t,e),((e,t,n,o,r,s)=>{const a=t.get();$(n.split(","),(t=>{const n=xe(a,t).getOrThunk((()=>{const e={withSimilar:{state:Vs(!1),similar:!0,callbacks:[]},withoutSimilar:{state:Vs(!1),similar:!1,callbacks:[]},withVars:[]};return a[t]=e,e})),i=()=>{const n=Nh(e);return Eh(e,n,t,r,s).isSome()};if(v(s)){const e=r?n.withSimilar:n.withoutSimilar;e.callbacks.push(o),1===e.callbacks.length&&e.state.set(i())}else n.withVars.push({state:Vs(i()),similar:r,vars:s,callback:o})})),t.set(a)})(e,t,n,o,r,s),{unbind:()=>((e,t,n)=>{const o=e.get();$(t.split(","),(e=>xe(o,e).each((t=>{o[e]={withSimilar:{...t.withSimilar,callbacks:K(t.withSimilar.callbacks,(e=>e!==n))},withoutSimilar:{...t.withoutSimilar,callbacks:K(t.withoutSimilar.callbacks,(e=>e!==n))},withVars:K(t.withVars,(e=>e.callback!==n))}})))),e.set(o)})(t,n,o)}))(e,t,n,o,r,s)},editor:{getContent:t=>((e,t)=>M.from(e.getBody()).fold(N("tree"===t.format?new xf("body",11):""),(n=>((e,t,n)=>{let o;return o="raw"===t.format?Bt.trim(_f(e.serializer,n.innerHTML)):"text"===t.format?e.dom.isEmpty(n)?"":fr(n.innerText||n.textContent):"tree"===t.format?e.serializer.serialize(n,t):((e,t)=>{const n=Di(e),o=new RegExp(`^(<${n}[^>]*>(&nbsp;|&#160;|\\s|\xa0|<br \\/>|)<\\/${n}>[\r\n]*|<br \\/>[\r\n]*)$`);return t.replace(o,"")})(e,e.serializer.serialize(n,t)),"text"!==t.format&&!ir(mn(n))&&m(o)?Bt.trim(o):o})(e,t,n))))(e,t),setContent:(t,n)=>((e,t,n)=>M.from(e.getBody()).map((o=>Np(t)?((e,t,n,o)=>{fp(e.parser.getNodeFilters(),e.parser.getAttributeFilters(),n);const r=Of({validate:!1},e.schema).serialize(n),s=ir(mn(t))?r:Bt.trim(r);return Rp(e,s,o.no_selection),{content:n,html:s}})(e,o,t,n):((e,t,n,o)=>{if(0===n.length||/^\s+$/.test(n)){const r='<br data-mce-bogus="1">';"TABLE"===t.nodeName?n="<tr><td>"+r+"</td></tr>":/^(UL|OL)$/.test(t.nodeName)&&(n="<li>"+r+"</li>");const s=Di(e);return e.schema.isValidChild(t.nodeName.toLowerCase(),s.toLowerCase())?(n=r,n=e.dom.createHTML(s,Li(e),n)):n||(n=r),Rp(e,n,o.no_selection),{content:n,html:n}}{"raw"!==o.format&&(n=Of({validate:!1},e.schema).serialize(e.parser.parse(n,{isRootContent:!0,insert:!0})));const r=ir(mn(t))?n:Bt.trim(n);return Rp(e,r,o.no_selection),{content:r,html:r}}})(e,o,t,n))).getOr({content:t,html:Np(n.content)?"":n.content}))(e,t,n),insertContent:(t,n)=>Ep(e,t,n),addVisual:t=>((e,t)=>{const n=e.dom,o=C(t)?t:e.getBody();v(e.hasVisual)&&(e.hasVisual=Tl(e)),$(n.select("table,a",o),(t=>{switch(t.nodeName){case"TABLE":const o=Bl(e),r=n.getAttrib(t,"border");r&&"0"!==r||!e.hasVisual?n.removeClass(t,o):n.addClass(t,o);break;case"A":if(!n.getAttrib(t,"href")){const o=n.getAttrib(t,"name")||t.id,r=Dl(e);o&&e.hasVisual?n.addClass(t,r):n.removeClass(t,r)}}})),e.dispatch("VisualAid",{element:t,hasVisual:e.hasVisual})})(e,t)},selection:{getContent:(t,n)=>((e,t,n={})=>{const o=((e,t)=>({...e,format:t,get:!0,selection:!0,getInner:!0}))(n,t);return Xb(e,o).fold(R,(t=>{const n=((e,t)=>{if("text"===t.format)return(e=>M.from(e.selection.getRng()).map((t=>{const n=M.from(e.dom.getParent(t.commonAncestorContainer,e.dom.isBlock)),o=e.getBody(),r=(e=>e.map((e=>e.nodeName)).getOr("div").toLowerCase())(n),s=e.dom.add(o,r,{"data-mce-bogus":"all",style:"overflow: hidden; opacity: 0;"},t.cloneContents()),a=gv(s),i=fr(s.textContent);if(e.dom.remove(s),fv(i,0)||fv(i,i.length-1)){const e=n.getOr(o),t=gv(e),r=t.indexOf(a);return-1===r?a:(fv(t,r-1)?" ":"")+a+(fv(t,r+a.length)?" ":"")}return a})).getOr(""))(e);{const n=((e,t)=>{const n=e.selection.getRng(),o=e.dom.create("body"),r=e.selection.getSel(),s=uf(e,hu(r)),a=t.contextual?mv(mn(e.getBody()),s).dom:n.cloneContents();return a&&o.appendChild(a),e.selection.serializer.serialize(o,t)})(e,t);return"tree"===t.format?n:e.selection.isCollapsed()?"":n}})(e,t);return Qb(e,n,t)}))})(e,t,n)},autocompleter:{addDecoration:t=>pf(e,t),removeDecoration:()=>((e,t)=>hf(t).each((t=>{const n=e.selection.getBookmark();no(t),e.selection.moveToBookmark(n)})))(e,mn(e.getBody()))},raw:{getModel:()=>M.none()}}),Nv=e=>we(e.plugins,"rtc"),Rv=e=>e.rtcInstance?e.rtcInstance:Ev(e),Av=e=>{const t=e.rtcInstance;if(t)return t;throw new Error("Failed to get RTC instance not yet initialized.")},Ov=e=>Av(e).init.bindEvents(),Tv=e=>0===e.dom.length?(to(e),M.none()):M.some(e),Bv=(e,t,n,o)=>{e.bind((e=>((o?Ng:Eg)(e.dom,o?e.dom.length:0),t.filter(zt).map((t=>((e,t,n,o)=>{const r=e.dom,s=t.dom,a=o?r.length:s.length;o?(Rg(r,s,!1,!o),n.setStart(s,a)):(Rg(s,r,!1,!o),n.setEnd(s,a))})(e,t,n,o)))))).orThunk((()=>{const e=((e,t)=>e.filter((e=>Du.isBookmarkNode(e.dom))).bind(t?Sn:kn))(t,o).or(t).filter(zt);return e.map((e=>((e,t)=>{wn(e).each((n=>{const o=e.dom;t&&yg(n,ja(o,0))?Eg(o,0):!t&&Cg(n,ja(o,o.length))&&Ng(o,o.length)}))})(e,o)))}))},Dv=(e,t,n)=>{if(e&&we(e,t)){const o=K(e[t],(e=>e!==n));0===o.length?delete e[t]:e[t]=o}},Lv=e=>!(!e||!e.ownerDocument)&&vn(mn(e.ownerDocument),mn(e)),Pv=(e,t,n,o)=>{let r,s;const{selectorChangedWithUnbind:a}=((e,t)=>{let n,o;const r=(t,n)=>Q(n,(n=>e.is(n,t))),s=t=>e.getParents(t,null,e.getRoot());return{selectorChangedWithUnbind:(e,a)=>(n||(n={},o={},t.on("NodeChange",(e=>{const t=e.element,a=s(t),i={};Bt.each(n,((e,t)=>{r(t,a).each((n=>{o[t]||($(e,(e=>{e(!0,{node:n,selector:t,parents:a})})),o[t]=e),i[t]=e}))})),Bt.each(o,((e,n)=>{i[n]||(delete o[n],Bt.each(e,(e=>{e(!1,{node:t,selector:n,parents:a})})))}))}))),n[e]||(n[e]=[]),n[e].push(a),r(e,s(t.selection.getStart())).each((()=>{o[e]=n[e]})),{unbind:()=>{Dv(n,e,a),Dv(o,e,a)}})}})(e,o),i=(e,t)=>((e,t,n={})=>{const o=((e,t)=>({format:"html",...e,set:!0,selection:!0,content:t}))(n,t);Jb(e,o).each((t=>{const n=((e,t)=>{if("raw"!==t.format){const n=e.selection.getRng(),o=e.dom.getParent(n.commonAncestorContainer,e.dom.isBlock),r=o?{context:o.nodeName.toLowerCase()}:{},s=e.parser.parse(t.content,{forced_root_block:!1,...r,...t});return Of({validate:!1},e.schema).serialize(s)}return t.content})(e,t),o=e.selection.getRng();((e,t)=>{const n=M.from(t.firstChild).map(mn),o=M.from(t.lastChild).map(mn);e.deleteContents(),e.insertNode(t);const r=n.bind(kn).filter(zt).bind(Tv),s=o.bind(Sn).filter(zt).bind(Tv);Bv(r,n,e,!0),Bv(s,o,e,!1),e.collapse(!1)})(o,o.createContextualFragment(n)),e.selection.setRng(o),Im(e,o),Zb(e,n,t)}))})(o,e,t),l=e=>{const t=c();t.collapse(!!e),u(t)},d=()=>t.getSelection?t.getSelection():t.document.selection,c=()=>{let n,a,i;const l=(e,t,n)=>{try{return t.compareBoundaryPoints(e,n)}catch(e){return-1}},c=t.document;if(void 0!==o.bookmark&&!1===rf(o)){const e=Gm(o);if(e.isSome())return e.map((e=>uf(o,[e])[0])).getOr(c.createRange())}try{(n=d())&&!vo(n.anchorNode)&&(a=n.rangeCount>0?n.getRangeAt(0):n.createRange?n.createRange():c.createRange(),a=uf(o,[a])[0])}catch(e){}return a||(a=c.createRange()),a.setStart&&9===a.startContainer.nodeType&&a.collapsed&&(i=e.getRoot(),a.setStart(i,0),a.setEnd(i,0)),r&&s&&(0===l(a.START_TO_START,a,r)&&0===l(a.END_TO_END,a,r)?a=s:(r=null,s=null)),a},u=(e,t)=>{let n;if(!(e=>!!e&&Lv(e.startContainer)&&Lv(e.endContainer))(e))return;const a=d();if(e=o.dispatch("SetSelectionRange",{range:e,forward:t}).range,a){s=e;try{a.removeAllRanges(),a.addRange(e)}catch(e){}!1===t&&a.extend&&(a.collapse(e.endContainer,e.endOffset),a.extend(e.startContainer,e.startOffset)),r=a.rangeCount>0?a.getRangeAt(0):null}!e.collapsed&&e.startContainer===e.endContainer&&a.setBaseAndExtent&&e.endOffset-e.startOffset<2&&e.startContainer.hasChildNodes()&&(n=e.startContainer.childNodes[e.startOffset],n&&"IMG"===n.tagName&&(a.setBaseAndExtent(e.startContainer,e.startOffset,e.endContainer,e.endOffset),a.anchorNode===e.startContainer&&a.focusNode===e.endContainer||a.setBaseAndExtent(n,0,n,1))),o.dispatch("AfterSetSelectionRange",{range:e,forward:t})},m=()=>{const t=d(),n=null==t?void 0:t.anchorNode,o=null==t?void 0:t.focusNode;if(!t||!n||!o||vo(n)||vo(o))return!0;const r=e.createRng();r.setStart(n,t.anchorOffset),r.collapse(!0);const s=e.createRng();return s.setStart(o,t.focusOffset),s.collapse(!0),r.compareBoundaryPoints(r.START_TO_START,s)<=0},f={bookmarkManager:null,controlSelection:null,dom:e,win:t,serializer:n,editor:o,collapse:l,setCursorLocation:(t,n)=>{const r=e.createRng();C(t)&&C(n)?(r.setStart(t,n),r.setEnd(t,n),u(r),l(!1)):(ku(e,r,o.getBody(),!0),u(r))},getContent:e=>((e,t={})=>((e,t,n)=>Av(e).selection.getContent(t,n))(e,t.format?t.format:"html",t))(o,e),setContent:i,getBookmark:(e,t)=>g.getBookmark(e,t),moveToBookmark:e=>g.moveToBookmark(e),select:(t,n)=>(((e,t,n)=>M.from(t).map((t=>{const o=e.nodeIndex(t),r=e.createRng();return r.setStart(t.parentNode,o),r.setEnd(t.parentNode,o+1),n&&(ku(e,r,t,!0),ku(e,r,t,!1)),r})))(e,t,n).each(u),t),isCollapsed:()=>{const e=c(),t=d();return!(!e||e.item)&&(e.compareEndPoints?0===e.compareEndPoints("StartToEnd",e):!t||e.collapsed)},isForward:m,setNode:t=>(i(e.getOuterHTML(t)),t),getNode:()=>((e,t)=>{let n,o,r;if(!t)return e;o=t.startContainer,r=t.endContainer;const s=t.startOffset,a=t.endOffset;return n=t.commonAncestorContainer,!t.collapsed&&(o===r&&a-s<2&&o.hasChildNodes()&&(n=o.childNodes[s]),3===o.nodeType&&3===r.nodeType&&(o=o.length===s?cf(o.nextSibling,!0):o.parentNode,r=0===a?cf(r.previousSibling,!1):r.parentNode,o&&o===r))?o:n&&3===n.nodeType?n.parentNode:n})(o.getBody(),c()),getSel:d,setRng:u,getRng:c,getStart:e=>lf(o.getBody(),c(),e),getEnd:e=>df(o.getBody(),c(),e),getSelectedBlocks:(t,n)=>((e,t,n,o)=>{let r;const s=[],a=e.getRoot();if(n=e.getParent(n||lf(a,t,t.collapsed),e.isBlock),o=e.getParent(o||df(a,t,t.collapsed),e.isBlock),n&&n!==a&&s.push(n),n&&o&&n!==o){r=n;const t=new Xo(n,a);for(;(r=t.next())&&r!==o;)e.isBlock(r)&&s.push(r)}return o&&n!==o&&o!==a&&s.push(o),s})(e,c(),t,n),normalize:()=>{const t=c(),n=d();if(!(hu(n).length>1)&&Su(o)){const n=gm(e,t);return n.each((e=>{u(e,m())})),n.getOr(t)}return t},selectorChanged:(e,t)=>(a(e,t),f),selectorChangedWithUnbind:a,getScrollContainer:()=>{let t,n=e.getRoot();for(;n&&"BODY"!==n.nodeName;){if(n.scrollHeight>n.clientHeight){t=n;break}n=n.parentNode}return t},scrollIntoView:(e,t)=>{C(e)?((e,t,n)=>{(e.inline?Lm:Mm)(e,t,n)})(o,e,t):Im(o,c(),t)},placeCaretAt:(e,t)=>u(rm(e,t,o.getDoc())),getBoundingClientRect:()=>{const e=c();return e.collapsed?ja.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:()=>{t=r=s=null,p.destroy()}},g=Du(f),p=Vu(f,o);return f.bookmarkManager=g,f.controlSelection=p,f},Mv=(e,t,n)=>{-1===Bt.inArray(t,n)&&(e.addAttributeFilter(n,((e,t)=>{let n=e.length;for(;n--;)e[n].attr(t,null)})),t.push(n))},Iv=(e,t)=>{const n=["data-mce-selected"],o=t&&t.dom?t.dom:Us.DOM,r=t&&t.schema?t.schema:Cs(e);e.entity_encoding=e.entity_encoding||"named",e.remove_trailing_brs=!("remove_trailing_brs"in e)||e.remove_trailing_brs;const s=Gb(e,r);return((e,t,n)=>{e.addAttributeFilter("data-mce-tabindex",((e,t)=>{let n=e.length;for(;n--;){const o=e[n];o.attr("tabindex",o.attr("data-mce-tabindex")),o.attr(t,null)}})),e.addAttributeFilter("src,href,style",((e,o)=>{const r="data-mce-"+o,s=t.url_converter,a=t.url_converter_scope;let i=e.length;for(;i--;){const t=e[i];let l=t.attr(r);void 0!==l?(t.attr(o,l.length>0?l:null),t.attr(r,null)):(l=t.attr(o),"style"===o?l=n.serializeStyle(n.parseStyle(l),t.name):s&&(l=s.call(a,l,o,t.name)),t.attr(o,l.length>0?l:null))}})),e.addAttributeFilter("class",(e=>{let t=e.length;for(;t--;){const n=e[t];let o=n.attr("class");o&&(o=n.attr("class").replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),n.attr("class",o.length>0?o:null))}})),e.addAttributeFilter("data-mce-type",((e,t,n)=>{let o=e.length;for(;o--;){const t=e[o];if("bookmark"===t.attr("data-mce-type")&&!n.cleanup){const e=M.from(t.firstChild).exists((e=>!mr(e.value)));e?t.unwrap():t.remove()}}})),e.addNodeFilter("noscript",(e=>{let t=e.length;for(;t--;){const n=e[t].firstChild;n&&(n.value=ls.decode(n.value))}})),e.addNodeFilter("script,style",((e,n)=>{const o=e=>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,"");let r=e.length;for(;r--;){const s=e[r],a=s.firstChild?s.firstChild.value:"";if("script"===n){const e=s.attr("type");e&&s.attr("type","mce-no/type"===e?null:e.replace(/^mce\-/,"")),"xhtml"===t.element_format&&a.length>0&&(s.firstChild.value="// <![CDATA[\n"+o(a)+"\n// ]]>")}else"xhtml"===t.element_format&&a.length>0&&(s.firstChild.value="\x3c!--\n"+o(a)+"\n--\x3e")}})),e.addNodeFilter("#comment",(e=>{let o=e.length;for(;o--;){const r=e[o];t.preserve_cdata&&0===r.value.indexOf("[CDATA[")?(r.name="#cdata",r.type=4,r.value=n.decode(r.value.replace(/^\[CDATA\[|\]\]$/g,""))):0===r.value.indexOf("mce:protected ")&&(r.name="#text",r.type=3,r.raw=!0,r.value=unescape(r.value).substr(14))}})),e.addNodeFilter("xml:namespace,input",((e,t)=>{let n=e.length;for(;n--;){const o=e[n];7===o.type?o.remove():1===o.type&&("input"!==t||o.attr("type")||o.attr("type","text"))}})),e.addAttributeFilter("data-mce-type",(t=>{$(t,(t=>{"format-caret"===t.attr("data-mce-type")&&(t.isEmpty(e.schema.getNonEmptyElements())?t.remove():t.unwrap())}))})),e.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",((e,t)=>{let n=e.length;for(;n--;)e[n].attr(t,null)}))})(s,e,o),{schema:r,addNodeFilter:s.addNodeFilter,addAttributeFilter:s.addAttributeFilter,serialize:(n,a={})=>{const i={format:"html",...a},l=((e,t,n)=>((e,t)=>e&&e.hasEventListeners("PreProcess")&&!t.no_events)(e,n)?((e,t,n)=>{let o;const r=e.dom;let s=t.cloneNode(!0);const a=document.implementation;if(a.createHTMLDocument){const e=a.createHTMLDocument("");Bt.each("BODY"===s.nodeName?s.childNodes:[s],(t=>{e.body.appendChild(e.importNode(t,!0))})),s="BODY"!==s.nodeName?e.body.firstChild:e.body,o=r.doc,r.doc=e}return((e,t)=>{e.dispatch("PreProcess",t)})(e,{...n,node:s}),o&&(r.doc=o),s})(e,t,n):t)(t,n,i),d=((e,t,n)=>{const o=fr(n.getInner?t.innerHTML:e.getOuterHTML(t));return n.selection||ir(mn(t))?o:Bt.trim(o)})(o,l,i),c=((e,t,n)=>{const o=n.selection?{forced_root_block:!1,...n}:n,r=e.parse(t,o);return(e=>{const t=e=>e&&"br"===e.name,n=e.lastChild;if(t(n)){const e=n.prev;t(e)&&(n.remove(),e.remove())}})(r),r})(s,d,i);return"tree"===i.format?c:((e,t,n,o,r)=>{const s=((e,t,n)=>Of(e,t).serialize(n))(t,n,o);return((e,t,n)=>{if(!t.no_events&&e){const o=((e,t)=>e.dispatch("PostProcess",t))(e,{...t,content:n});return o.content}return n})(e,r,s)})(t,e,r,c,i)},addRules:r.addValidElements,setRules:r.setValidElements,addTempAttr:O(Mv,s,n),getTempAttrs:N(n),getNodeFilters:s.getNodeFilters,getAttributeFilters:s.getAttributeFilters}},Fv=(e,t)=>{const n=Iv(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}},Uv=(e,t,n={})=>{const o=((e,t)=>({format:"html",...e,set:!0,content:t}))(n,t);return Jb(e,o).map((t=>{const n=((e,t,n)=>Rv(e).editor.setContent(t,n))(e,t.content,t);return Zb(e,n.html,t),n.content})).getOr(t)},zv="autoresize_on_init,content_editable_state,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,tabfocus_elements,table_responsive_width,text_block_elements,text_inline_elements,toolbar_drawer,types,validate,whitespace_elements,paste_enable_default_filters,paste_filter_drop,paste_word_valid_elements,paste_retain_style_properties,paste_convert_word_fake_lists".split(","),jv="bbcode,colorpicker,contextmenu,fullpage,legacyoutput,spellchecker,textcolor".split(","),Vv=e=>{const t=K(zv,(t=>we(e,t))),n=e.forced_root_block;return!1!==n&&""!==n||t.push("forced_root_block (false only)"),se(t)},Hv=e=>{const t=Bt.makeMap(e.plugins," "),n=K(jv,(e=>we(t,e)));return se(n)},$v=Us.DOM,qv=e=>M.from(e).each((e=>e.destroy())),Wv=(()=>{const e={};return{add:(t,n)=>{e[t]=n},get:t=>e[t]?e[t]:{icons:{}},has:t=>we(e,t)}})(),Kv=Ks.ModelManager,Gv=(e,t)=>t.dom[e],Yv=(e,t)=>parseInt($n(t,e),10),Xv=O(Gv,"clientWidth"),Qv=O(Gv,"clientHeight"),Jv=O(Yv,"margin-top"),Zv=O(Yv,"margin-left"),ey=e=>{const t=[],n=()=>{const t=e.theme;return t&&t.getNotificationManagerImpl?t.getNotificationManagerImpl():(()=>{const e=()=>{throw new Error("Theme did not provide a NotificationManager implementation.")};return{open:e,close:e,getArgs:e}})()},o=()=>M.from(t[0]),r=()=>{$(t,(e=>{e.reposition()}))},s=e=>{J(t,(t=>t===e)).each((e=>{t.splice(e,1)}))},a=(a,i=!0)=>{if(!e.removed&&(e=>{return(t=e.inline?e.getBody():e.getContentAreaContainer(),M.from(t).map(mn)).map(zn).getOr(!1);var t})(e))return i&&e.dispatch("BeforeOpenNotification",{notification:a}),Q(t,(e=>{return t=n().getArgs(e),o=a,!(t.type!==o.type||t.text!==o.text||t.progressBar||t.timeout||o.progressBar||o.timeout);var t,o})).getOrThunk((()=>{e.editorManager.setActive(e);const i=n().open(a,(()=>{s(i),r(),o().fold((()=>e.focus()),(e=>Fm(mn(e.getEl()))))}));return(e=>{t.push(e)})(i),r(),e.dispatch("OpenNotification",{notification:{...i}}),i}))},i=N(t);return(e=>{e.on("SkinLoaded",(()=>{const t=dl(e);t&&a({text:t,type:"warning",timeout:0},!1),r()})),e.on("show ResizeEditor ResizeWindow NodeChange",(()=>{requestAnimationFrame(r)})),e.on("remove",(()=>{$(t.slice(),(e=>{n().close(e)}))}))})(e),{open:a,close:()=>{o().each((e=>{n().close(e),s(e),r()}))},getNotifications:i}},ty=Ks.PluginManager,ny=Ks.ThemeManager,oy=e=>{let t=[];const n=()=>{const t=e.theme;return t&&t.getWindowManagerImpl?t.getWindowManagerImpl():(()=>{const e=()=>{throw new Error("Theme did not provide a WindowManager implementation.")};return{open:e,openUrl:e,alert:e,confirm:e,close:e,getParams:e,setParams:e}})()},o=(e,t)=>(...n)=>t?t.apply(e,n):void 0,r=n=>{(t=>{e.dispatch("CloseWindow",{dialog:t})})(n),t=K(t,(e=>e!==n)),0===t.length&&e.focus()},s=n=>{e.editorManager.setActive(e),Km(e),e.ui.show();const o=n();return(n=>{t.push(n),(t=>{e.dispatch("OpenWindow",{dialog:t})})(n)})(o),o};return e.on("remove",(()=>{$(t,(e=>{n().close(e)}))})),{open:(e,t)=>s((()=>n().open(e,t,r))),openUrl:e=>s((()=>n().openUrl(e,r))),alert:(e,t,r)=>{const s=n();s.alert(e,o(r||s,t))},confirm:(e,t,r)=>{const s=n();s.confirm(e,o(r||s,t))},close:()=>{M.from(t[t.length-1]).each((e=>{n().close(e),r(e)}))}}},ry=(e,t)=>{e.notificationManager.open({type:"error",text:t})},sy=(e,t)=>{e._skinLoaded?ry(e,t):e.on("SkinLoaded",(()=>{ry(e,t)}))},ay=(e,t,n)=>{Pu(e,t,{message:n}),console.error(n)},iy=(e,t,n)=>n?`Failed to load ${e}: ${n} from url ${t}`:`Failed to load ${e} url: ${t}`,ly=(e,...t)=>{const n=window.console;n&&(n.error?n.error(e,...t):n.log(e,...t))},dy=(e,t)=>{const n=e.editorManager.baseURL+"/skins/content",o=`content${e.editorManager.suffix}.css`,r=!0===e.inline;return H(t,(t=>(e=>/^[a-z0-9\-]+$/i.test(e))(t)&&!r?`${n}/${t}/${o}`:e.documentBaseURI.toAbsolute(t)))},cy=P,uy=()=>{let e={};const t=(e,t)=>({status:e,resultUri:t}),n=t=>t in e;return{hasBlobUri:n,getResultUri:t=>{const n=e[t];return n?n.resultUri:null},isPending:t=>!!n(t)&&1===e[t].status,isUploaded:t=>!!n(t)&&2===e[t].status,markPending:n=>{e[n]=t(1,null)},markUploaded:(n,o)=>{e[n]=t(2,o)},removeFailed:t=>{delete e[t]},destroy:()=>{e={}}}};let my=0;const fy=(e,t)=>{const n={},o=(e,n)=>new Promise(((o,r)=>{const s=new XMLHttpRequest;s.open("POST",t.url),s.withCredentials=t.credentials,s.upload.onprogress=e=>{n(e.loaded/e.total*100)},s.onerror=()=>{r("Image upload failed due to a XHR Transport error. Code: "+s.status)},s.onload=()=>{if(s.status<200||s.status>=300)return void r("HTTP Error: "+s.status);const e=JSON.parse(s.responseText);var n,a;e&&m(e.location)?o((n=t.basePath,a=e.location,n?n.replace(/\/$/,"")+"/"+a.replace(/^\//,""):a)):r("Invalid JSON: "+s.responseText)};const a=new FormData;a.append("file",e.blob(),e.filename()),s.send(a)})),r=(e,t)=>({url:t,blobInfo:e,status:!0}),s=(e,t)=>({url:"",blobInfo:e,status:!1,error:t}),a=(e,t)=>{Bt.each(n[e],(e=>{e(t)})),delete n[e]};return!1===x(t.handler)&&(t.handler=o),{upload:(i,l)=>t.url||t.handler!==o?((o,i)=>(o=Bt.grep(o,(t=>!e.isUploaded(t.blobUri()))),Promise.all(Bt.map(o,(o=>e.isPending(o.blobUri())?(e=>{const t=e.blobUri();return new Promise((e=>{n[t]=n[t]||[],n[t].push(e)}))})(o):((t,n,o)=>(e.markPending(t.blobUri()),new Promise((i=>{let l,d;try{const c=()=>{l&&(l.close(),d=S)},u=n=>{c(),e.markUploaded(t.blobUri(),n),a(t.blobUri(),r(t,n)),i(r(t,n))},f=n=>{c(),e.removeFailed(t.blobUri()),a(t.blobUri(),s(t,n)),i(s(t,n))};d=e=>{e<0||e>100||M.from(l).orThunk((()=>M.from(o).map(B))).each((t=>{l=t,t.progressBar.value(e)}))},n(t,d).then(u,(e=>{f(m(e)?{message:e}:e)}))}catch(e){i(s(t,e))}}))))(o,t.handler,i))))))(i,l):new Promise((e=>{e([])}))}},gy=e=>()=>e.notificationManager.open({text:e.translate("Image uploading..."),type:"info",timeout:-1,progressBar:!0}),py=(e,t)=>fy(t,{url:$i(e),basePath:qi(e),credentials:Wi(e),handler:Ki(e)}),hy=e=>{const t=(()=>{let e=[];const t=e=>{if(!e.blob||!e.base64)throw new Error("blob and base64 representations of the image are required for BlobInfo to be created");const t=e.id||"blobid"+my+++(()=>{const e=()=>Math.round(4294967295*Math.random()).toString(36);return"s"+(new Date).getTime().toString(36)+e()+e()+e()})(),n=e.name||t,o=e.blob;var r;return{id:N(t),name:N(n),filename:N(e.filename||n+"."+(r=o.type,{"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.toLowerCase()]||"dat")),blob:N(o),base64:N(e.base64),blobUri:N(e.blobUri||URL.createObjectURL(o)),uri:N(e.uri)}},n=t=>Q(e,t).getOrUndefined(),o=e=>n((t=>t.id()===e));return{create:(e,n,o,r,s)=>{if(m(e))return t({id:e,name:r,filename:s,blob:n,base64:o});if(f(e))return t(e);throw new Error("Unknown input type")},add:t=>{o(t.id())||e.push(t)},get:o,getByUri:e=>n((t=>t.blobUri()===e)),getByData:(e,t)=>n((n=>n.base64()===e&&n.blob().type===t)),findFirst:n,removeByUri:t=>{e=K(e,(e=>e.blobUri()!==t||(URL.revokeObjectURL(e.blobUri()),!1)))},destroy:()=>{$(e,(e=>{URL.revokeObjectURL(e.blobUri())})),e=[]}}})();let n,o;const r=uy(),s=[],a=(e=>{const t=Vs(null);return e.on("change AddUndo",(e=>{t.set({...e.level})})),{fireIfChanged:()=>{const n=e.undoManager.data;le(n).filter((e=>!wv(t.get(),e))).each((t=>{e.setDirty(!0),e.dispatch("change",{level:t,lastLevel:ae(n,n.length-2).getOrNull()})}))}}})(e),i=t=>n=>e.selection?t(n):[],l=(e,t,n)=>{let o=0;do{o=e.indexOf(t,o),-1!==o&&(e=e.substring(0,o)+n+e.substr(o+t.length),o+=n.length-t.length+1)}while(-1!==o);return e},d=(e,t,n)=>{const o=`src="${n}"${n===Nt.transparentSrc?' data-mce-placeholder="1"':""}`;return e=l(e,`src="${t}"`,o),l(e,'data-mce-src="'+t+'"','data-mce-src="'+n+'"')},c=(t,n)=>{$(e.undoManager.data,(e=>{"fragmented"===e.type?e.fragments=H(e.fragments,(e=>d(e,t,n))):e.content=d(e.content,t,n)}))},u=()=>(n||(n=py(e,r)),h().then(i((o=>{const r=H(o,(e=>e.blobInfo));return n.upload(r,gy(e)).then(i((n=>{const r=[],s=H(n,((n,s)=>{const a=o[s].blobInfo,i=o[s].image;let l=!1;return n.status&&ji(e)?(t.removeByUri(i.src),Nv(e)||((t,n)=>{const o=e.convertURL(n,"src");var r;c(t.src,n),qt(mn(t),{src:zi(e)?(r=n,r+(-1===r.indexOf("?")?"?":"&")+(new Date).getTime()):n,"data-mce-src":o})})(i,n.url)):n.error&&(n.error.remove&&(c(i.getAttribute("src"),Nt.transparentSrc),r.push(i),l=!0),((e,t)=>{sy(e,Ws.translate(["Failed to upload image: {0}",t]))})(e,n.error.message)),{element:i,status:n.status,uploadUri:n.url,blobInfo:a,removed:l}}));return s.length>0&&a.fireIfChanged(),r.length>0&&!Nv(e)&&e.undoManager.transact((()=>{$(r,(n=>{e.dom.remove(n),t.removeByUri(n.src)}))})),s})))})))),g=()=>Ui(e)?u():Promise.resolve([]),p=e=>te(s,(t=>t(e))),h=()=>(o||(o=((e,t)=>{const n={};return{findAll:(o,r)=>{r||(r=P);const s=K((e=>e?de(e.getElementsByTagName("img")):[])(o),(t=>{const n=t.src;return!t.hasAttribute("data-mce-bogus")&&!t.hasAttribute("data-mce-placeholder")&&!(!n||n===Nt.transparentSrc)&&(0===n.indexOf("blob:")?!e.isUploaded(n)&&r(t):0===n.indexOf("data:")&&r(t))})),a=H(s,(e=>{if(void 0!==n[e.src])return new Promise((t=>{n[e.src].then((n=>{if("string"==typeof n)return n;t({image:e,blobInfo:n.blobInfo})}))}));const o=new Promise(((n,o)=>{((e,t,n,o)=>{let r,s;if(0===t.src.indexOf("blob:"))return s=e.getByUri(t.src),void(s?n({image:t,blobInfo:s}):Rb(t.src).then((o=>{Ab(o).then((a=>{r=Eb(a).data,s=e.create(Tb(),o,r),e.add(s),n({image:t,blobInfo:s})}))}),(e=>{o(e)})));const{data:a,type:i}=Eb(t.src);r=a,s=e.getByData(r,i),s?n({image:t,blobInfo:s}):Rb(t.src).then((o=>{s=e.create(Tb(),o,r),e.add(s),n({image:t,blobInfo:s})}),(e=>{o(e)}))})(t,e,n,o)})).then((e=>(delete n[e.image.src],e))).catch((t=>(delete n[e.src],t)));return n[e.src]=o,o}));return Promise.all(a)}}})(r,t)),o.findAll(e.getBody(),p).then(i((t=>(t=K(t,(t=>"string"!=typeof t||(sy(e,t),!1))),Nv(e)||$(t,(e=>{c(e.image.src,e.blobInfo.blobUri()),e.image.src=e.blobInfo.blobUri(),e.image.removeAttribute("data-mce-src")})),t))))),b=n=>n.replace(/src="(blob:[^"]+)"/g,((n,o)=>{const s=r.getResultUri(o);if(s)return'src="'+s+'"';let a=t.getByUri(o);return a||(a=Y(e.editorManager.get(),((e,t)=>e||t.editorUpload&&t.editorUpload.blobCache.getByUri(o)),null)),a?'src="data:'+a.blob().type+";base64,"+a.base64()+'"':n}));return e.on("SetContent",(()=>{Ui(e)?g():h()})),e.on("RawSaveContent",(e=>{e.content=b(e.content)})),e.on("GetContent",(e=>{e.source_view||"raw"===e.format||"tree"===e.format||(e.content=b(e.content))})),e.on("PostRender",(()=>{e.parser.addNodeFilter("img",(e=>{$(e,(e=>{const n=e.attr("src");if(t.getByUri(n))return;const o=r.getResultUri(n);o&&e.attr("src",o)}))}))})),{blobCache:t,addFilter:e=>{s.push(e)},uploadImages:u,uploadImagesAuto:g,scanForImages:h,destroy:()=>{t.destroy(),r.destroy(),o=n=null}}},by={remove_similar:!0,inherit:!1},vy={selector:"td,th",...by},yy={tablecellbackgroundcolor:{styles:{backgroundColor:"%value"},...vy},tablecellverticalalign:{styles:{"vertical-align":"%value"},...vy},tablecellbordercolor:{styles:{borderColor:"%value"},...vy},tablecellclass:{classes:["%value"],...vy},tableclass:{selector:"table",classes:["%value"],...by},tablecellborderstyle:{styles:{borderStyle:"%value"},...vy},tablecellborderwidth:{styles:{borderWidth:"%value"},...vy}},Cy=N(yy),xy=Bt.each,wy=Us.DOM,ky=(e,t)=>{let n,o,r;const s=t&&t.schema||Cs({}),a=e=>{o="string"==typeof e?{name:e,classes:[],attrs:{}}:e;const t=wy.create(o.name);return((e,t)=>{t.classes.length&&wy.addClass(e,t.classes.join(" ")),wy.setAttribs(e,t.attrs)})(t,o),t},i=(e,t,n)=>{let o,r;const l=t.length>0&&t[0],d=l&&l.name,c=((e,t)=>{const n="string"!=typeof e?e.nodeName.toLowerCase():e,o=s.getElementRule(n),r=o&&o.parentsRequired;return!(!r||!r.length)&&(t&&-1!==Bt.inArray(r,t)?t:r[0])})(e,d);if(c)d===c?(r=t[0],t=t.slice(1)):r=c;else if(l)r=t[0],t=t.slice(1);else if(!n)return e;return r&&(o=a(r),o.appendChild(e)),n&&(o||(o=wy.create("div"),o.appendChild(e)),Bt.each(n,(t=>{const n=a(t);o.insertBefore(n,e)}))),i(o,t,r&&r.siblings)};return e&&e.length?(o=e[0],n=a(o),r=wy.create("div"),r.appendChild(i(n,e.slice(1),o.siblings)),r):""},Sy=e=>{let t;const n={classes:[],attrs:{}};return"*"!==(e=n.selector=Bt.trim(e))&&(t=e.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,((e,t,o,r,s)=>{switch(t){case"#":n.attrs.id=o;break;case".":n.classes.push(o);break;case":":-1!==Bt.inArray("checked disabled enabled read-only required".split(" "),o)&&(n.attrs[o]=o)}if("["===r){const e=s.match(/([\w\-]+)(?:\=\"([^\"]+))?/);e&&(n.attrs[e[1]]=e[2])}return""}))),n.name=t||"div",n},_y=(e,t)=>{let n,o,r,s="",a=hl(e);if(""===a)return"";const i=e=>e.replace(/%(\w+)/g,"");if("string"==typeof t){if(!(t=e.formatter.get(t)))return;t=t[0]}if("preview"in t){const e=xe(t,"preview");if(Dt(e,!1))return"";a=e.getOr(a)}n=t.block||t.inline||"span";const l=(d=t.selector)&&"string"==typeof d?(d=(d=d.split(/\s*,\s*/)[0]).replace(/\s*(~\+|~|\+|>)\s*/g,"$1"),Bt.map(d.split(/(?:>|\s+(?![^\[\]]+\]))/),(e=>{const t=Bt.map(e.split(/(?:~\+|~|\+)/),Sy),n=t.pop();return t.length&&(n.siblings=t),n})).reverse()):[];var d;l.length?(l[0].name||(l[0].name=n),n=t.selector,o=ky(l,e)):o=ky([n],e);const c=wy.select(n,o)[0]||o.firstChild;return xy(t.styles,((e,t)=>{const n=i(e);n&&wy.setStyle(c,t,n)})),xy(t.attributes,((e,t)=>{const n=i(e);n&&wy.setAttrib(c,t,n)})),xy(t.classes,(e=>{const t=i(e);wy.hasClass(c,t)||wy.addClass(c,t)})),e.dispatch("PreviewFormats"),wy.setStyles(o,{position:"absolute",left:-65535}),e.getBody().appendChild(o),r=wy.getStyle(e.getBody(),"fontSize",!0),r=/px$/.test(r)?parseInt(r,10):0,xy(a.split(" "),(t=>{let n=wy.getStyle(c,t,!0);if(!("background-color"===t&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(n)&&(n=wy.getStyle(e.getBody(),t,!0),"#ffffff"===Ic(n).toLowerCase())||"color"===t&&"#000000"===Ic(n).toLowerCase())){if("font-size"===t&&/em|%$/.test(n)){if(0===r)return;n=parseFloat(n)/(/%$/.test(n)?100:1)*r+"px"}"border"===t&&n&&(s+="padding:0 2px;"),s+=t+":"+n+";"}})),e.dispatch("AfterPreviewFormats"),wy.remove(o),s},Ey=e=>{const t=(e=>{const t={},n=(e,o)=>{e&&(m(e)?(p(o)||(o=[o]),$(o,(e=>{v(e.deep)&&(e.deep=!Qc(e)),v(e.split)&&(e.split=!Qc(e)||Jc(e)),v(e.remove)&&Qc(e)&&!Jc(e)&&(e.remove="none"),Qc(e)&&Jc(e)&&(e.mixed=!0,e.block_expand=!0),m(e.classes)&&(e.classes=e.classes.split(/\s+/))})),t[e]=o):fe(e,((e,t)=>{n(t,e)})))};return n((e=>{const t=e.dom,n=e.schema.type,o={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},{selector:"img,audio,video",collapsed:!1,styles:{float:"left"},preview:"font-family font-size"},{selector:"table",collapsed:!1,styles:{marginLeft:"0px",marginRight:"auto"},onformat:e=>{t.setStyle(e,"float",null)},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"},{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"},{selector:"img,audio,video",collapsed:!1,styles:{float:"right"},preview:"font-family font-size"},{selector:"table",collapsed:!1,styles:{marginRight:"0px",marginLeft:"auto"},onformat:e=>{t.setStyle(e,"float",null)},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,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:(()=>{const e={inline:"span",styles:{textDecoration:"line-through"},exact:!0},t={inline:"strike",remove:"all",preserve_attributes:["class","style"]},o={inline:"s",remove:"all",preserve_attributes:["class","style"]};return"html4"!==n?[o,e,t]:[e,o,t]})(),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",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:(e,t,n)=>yo(e)&&e.hasAttribute("href"),onformat:(e,n,o)=>{Bt.each(o,((n,o)=>{t.setAttrib(e,o,n)}))}},lang:{inline:"span",clear_child_styles:!0,remove_similar:!0,attributes:{lang:"%value","data-mce-lang":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}]};return Bt.each("p h1 h2 h3 h4 h5 h6 div address pre dt dd samp".split(/\s/),(e=>{o[e]={block:e,remove:"all"}})),o})(e)),n(Cy()),n(pl(e)),{get:e=>C(e)?t[e]:t,has:e=>we(t,e),register:n,unregister:e=>(e&&t[e]&&delete t[e],t)}})(e),n=Vs(null);return(e=>{e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(let 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"])})(e),(e=>{e.on("mouseup keydown",(t=>{((e,t)=>{const n=e.selection,o=e.getBody();qp(e,null,!1),8!==t&&46!==t||!n.isCollapsed()||n.getStart().innerHTML!==Up||qp(e,bc(o,n.getStart())),37!==t&&39!==t||qp(e,bc(o,n.getStart()))})(e,t.keyCode)}))})(e),{get:t.get,has:t.has,register:t.register,unregister:t.unregister,apply:(t,n,o)=>{((e,t,n,o)=>{Av(e).formatter.apply(t,n,o)})(e,t,n,o)},remove:(t,n,o,r)=>{((e,t,n,o,r)=>{Av(e).formatter.remove(t,n,o,r)})(e,t,n,o,r)},toggle:(t,n,o)=>{((e,t,n,o)=>{Av(e).formatter.toggle(t,n,o)})(e,t,n,o)},match:(t,n,o,r)=>((e,t,n,o,r)=>Av(e).formatter.match(t,n,o,r))(e,t,n,o,r),closest:t=>((e,t)=>Av(e).formatter.closest(t))(e,t),matchAll:(t,n)=>((e,t,n)=>Av(e).formatter.matchAll(t,n))(e,t,n),matchNode:(t,n,o,r)=>((e,t,n,o,r)=>Av(e).formatter.matchNode(t,n,o,r))(e,t,n,o,r),canApply:t=>((e,t)=>Av(e).formatter.canApply(t))(e,t),formatChanged:(t,o,r,s)=>((e,t,n,o,r,s)=>Av(e).formatter.formatChanged(t,n,o,r,s))(e,n,t,o,r,s),getCssText:O(_y,e)}},Ny=e=>{switch(e.toLowerCase()){case"undo":case"redo":case"mcefocus":return!0;default:return!1}},Ry=e=>{const t=Gs(),n=Vs(0),o=Vs(0),r={data:[],typing:!1,beforeChange:()=>{((e,t,n)=>{Av(e).undoManager.beforeChange(t,n)})(e,n,t)},add:(s,a)=>((e,t,n,o,r,s,a)=>Av(e).undoManager.add(t,n,o,r,s,a))(e,r,o,n,t,s,a),undo:()=>((e,t,n,o)=>Av(e).undoManager.undo(t,n,o))(e,r,n,o),redo:()=>((e,t,n)=>Av(e).undoManager.redo(t,n))(e,o,r.data),clear:()=>{((e,t,n)=>{Av(e).undoManager.clear(t,n)})(e,r,o)},reset:()=>{((e,t)=>{Av(e).undoManager.reset(t)})(e,r)},hasUndo:()=>((e,t,n)=>Av(e).undoManager.hasUndo(t,n))(e,r,o),hasRedo:()=>((e,t,n)=>Av(e).undoManager.hasRedo(t,n))(e,r,o),transact:t=>((e,t,n,o)=>Av(e).undoManager.transact(t,n,o))(e,r,n,t),ignore:t=>{((e,t,n)=>{Av(e).undoManager.ignore(t,n)})(e,n,t)},extra:(t,n)=>{((e,t,n,o,r)=>{Av(e).undoManager.extra(t,n,o,r)})(e,r,o,t,n)}};return Nv(e)||((e,t,n)=>{const o=Vs(!1),r=e=>{Sv(t,!1,n),t.add({},e)};e.on("init",(()=>{t.add()})),e.on("BeforeExecCommand",(e=>{const o=e.command;Ny(o)||(_v(t,n),t.beforeChange())})),e.on("ExecCommand",(e=>{const t=e.command;Ny(t)||r(e)})),e.on("ObjectResizeStart cut",(()=>{t.beforeChange()})),e.on("SaveContent ObjectResized blur",r),e.on("dragend",r),e.on("keyup",(n=>{const s=n.keyCode;n.isDefaultPrevented()||((s>=33&&s<=36||s>=37&&s<=40||45===s||n.ctrlKey)&&(r(),e.nodeChanged()),46!==s&&8!==s||e.nodeChanged(),o.get()&&t.typing&&!1===wv(vv(e),t.data[0])&&(!1===e.isDirty()&&e.setDirty(!0),e.dispatch("TypingUndo"),o.set(!1),e.nodeChanged()))})),e.on("keydown",(e=>{const s=e.keyCode;if(e.isDefaultPrevented())return;if(s>=33&&s<=36||s>=37&&s<=40||45===s)return void(t.typing&&r(e));const a=e.ctrlKey&&!e.altKey||e.metaKey;!(s<16||s>20)||224===s||91===s||t.typing||a||(t.beforeChange(),Sv(t,!0,n),t.add({},e),o.set(!0))})),e.on("mousedown",(e=>{t.typing&&r(e)})),e.on("input",(e=>{var t;e.inputType&&("insertReplacementText"===e.inputType||"insertText"===(t=e).inputType&&null===t.data||(e=>"insertFromPaste"===e.inputType||"insertFromDrop"===e.inputType)(e))&&r(e)})),e.on("AddUndo Undo Redo ClearUndos",(t=>{t.isDefaultPrevented()||e.nodeChanged()}))})(e,r,n),(e=>{e.addShortcut("meta+z","","Undo"),e.addShortcut("meta+y,meta+shift+z","","Redo")})(e),r},Ay=[9,27,ju.HOME,ju.END,19,20,44,144,145,33,34,45,16,17,18,91,92,93,ju.DOWN,ju.UP,ju.LEFT,ju.RIGHT].concat(Nt.browser.isFirefox()?[224]:[]),Oy="data-mce-placeholder",Ty=e=>"keydown"===e.type||"keyup"===e.type,By=e=>{const t=e.keyCode;return t===ju.BACKSPACE||t===ju.DELETE},Dy=/[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/,Ly=(e,t)=>pn(mn(t),rl(e)),Py=(e,t,n)=>{const o=((e,t,n)=>K(Us.DOM.getParents(n.container(),"*",t),e))(e,t,n);return M.from(o[o.length-1])},My=(e,t)=>{if(!t)return t;const n=t.container(),o=t.offset();return e?br(n)?No(n.nextSibling)?ja(n.nextSibling,0):ja.after(n):Cr(t)?ja(n,o+1):t:br(n)?No(n.previousSibling)?ja(n.previousSibling,n.previousSibling.data.length):ja.before(n):xr(t)?ja(n,o-1):t},Iy=O(My,!0),Fy=O(My,!1),Uy=(e,t)=>{const n=e=>e.stopImmediatePropagation();e.on("beforeinput input",n,!0),e.getDoc().execCommand(t),e.off("beforeinput input",n)},zy=e=>Uy(e,"Delete"),jy=e=>nr(e)||rr(e),Vy=(e,t)=>vn(e,t)?$o(t,jy,(e=>t=>bn(e,mn(t.dom.parentNode)))(e)):M.none(),Hy=e=>{e.dom.isEmpty(e.getBody())&&(e.setContent(""),(e=>{const t=e.getBody(),n=t.firstChild&&e.dom.isBlock(t.firstChild)?t.firstChild:t;e.selection.setCursorLocation(n,0)})(e))},$y=(e,t)=>({from:e,to:t}),qy=(e,t)=>{const n=mn(e),o=mn(t.container());return Vy(n,o).map((e=>((e,t)=>({block:e,position:t}))(e,t)))},Wy=e=>{const t=Nn(e);return J(t,Zo).fold(N(t),(e=>t.slice(0,e)))},Ky=e=>{const t=Wy(e);return $(t,to),t},Gy=(e,t)=>{const n=Zf(t,e);return Q(n.reverse(),(e=>qr(e))).each(to)},Yy=(e,t,n,o)=>{if(qr(n))return Xf(n),fc(n.dom);0===K(_n(o),(e=>!qr(e))).length&&qr(t)&&Yn(o,cn("br"));const r=mc(n.dom,ja.before(o.dom));return $(Ky(t),(e=>{Yn(o,e)})),Gy(e,t),r},Xy=(e,t,n)=>{if(qr(n))return to(n),qr(t)&&Xf(t),fc(t.dom);const o=gc(n.dom);return $(Ky(t),(e=>{Jn(n,e)})),Gy(e,t),o},Qy=(e,t)=>{cc(e,t.dom).map((e=>e.getNode())).map(mn).filter(tr).each(to)},Jy=(e,t,n)=>(Qy(!0,t),Qy(!1,n),((e,t)=>vn(t,e)?((e,t)=>{const n=Zf(t,e);return M.from(n[n.length-1])})(t,e):M.none())(t,n).fold(O(Xy,e,t,n),O(Yy,e,t,n))),Zy=(e,t,n,o)=>t?Jy(e,o,n):Jy(e,n,o),eC=(e,t)=>{const n=mn(e.getBody()),o=((e,t,n)=>n.collapsed?((e,t,n)=>{const o=qy(e,ja.fromRangeStart(n)),r=o.bind((n=>ic(t,e,n.position).bind((n=>qy(e,n).map((n=>((e,t,n)=>Do(n.position.getNode())&&!1===qr(n.block)?cc(!1,n.block.dom).bind((o=>o.isEqual(n.position)?ic(t,e,o).bind((t=>qy(e,t))):M.some(n))).getOr(n):n)(e,t,n)))))));return Lt(o,r,$y).filter((e=>(e=>!1===bn(e.from.block,e.to.block))(e)&&(e=>wn(e.from.block).bind((t=>wn(e.to.block).filter((e=>bn(t,e))))).isSome())(e)&&(e=>!1===Mo(e.from.block.dom)&&!1===Mo(e.to.block.dom))(e)))})(e,t,n):M.none())(n.dom,t,e.selection.getRng()).map((o=>()=>{Zy(n,t,o.from.block,o.to.block).each((t=>{e.selection.setRng(t.toRange())}))}));return o},tC=(e,t)=>{const n=mn(t),o=O(bn,e);return Ho(n,ar,o).isSome()},nC=e=>{const t=mn(e.getBody());return((e,t)=>{const n=mc(e.dom,ja.fromRangeStart(t)).isNone(),o=uc(e.dom,ja.fromRangeEnd(t)).isNone();return!((e,t)=>tC(e,t.startContainer)||tC(e,t.endContainer))(e,t)&&n&&o})(t,e.selection.getRng())?(e=>M.some((()=>{e.setContent(""),e.selection.setCursorLocation()})))(e):((e,t)=>{const n=t.getRng();return Lt(Vy(e,mn(n.startContainer)),Vy(e,mn(n.endContainer)),((o,r)=>!1===bn(o,r)?M.some((()=>{n.deleteContents(),Zy(e,!0,o,r).each((e=>{t.setRng(e.toRange())}))})):M.none())).getOr(M.none())})(t,e.selection)},oC=(e,t)=>e.selection.isCollapsed()?M.none():nC(e),rC=Po,sC=Mo,aC=(e,t,n,o,r)=>M.from(t._selectionOverrides.showCaret(e,n,o,r)),iC=(e,t)=>e.dispatch("BeforeObjectSelected",{target:t}).isDefaultPrevented()?M.none():M.some((e=>{const t=e.ownerDocument.createRange();return t.selectNode(e),t})(t)),lC=(e,t,n)=>t.collapsed?((e,t,n)=>{const o=zd(1,e.getBody(),t),r=ja.fromRangeStart(o),s=r.getNode();if(vd(s))return aC(1,e,s,!r.isAtEnd(),!1);const a=r.getNode(!0);if(vd(a))return aC(1,e,a,!1,!1);const i=e.dom.getParent(r.getNode(),(e=>sC(e)||rC(e)));return vd(i)?aC(1,e,i,!1,n):M.none()})(e,t,n).getOr(t):t,dC=e=>Gf(e)||$f(e),cC=e=>Yf(e)||qf(e),uC=(e,t,n,o,r,s)=>{aC(o,e,s.getNode(!r),r,!0).each((n=>{if(t.collapsed){const e=t.cloneRange();r?e.setEnd(n.startContainer,n.startOffset):e.setStart(n.endContainer,n.endOffset),e.deleteContents()}else t.deleteContents();e.selection.setRng(n)})),((e,t)=>{No(t)&&0===t.data.length&&e.remove(t)})(e.dom,n)},mC=(e,t)=>((e,t)=>{const n=e.selection.getRng();if(!No(n.commonAncestorContainer))return M.none();const o=t?Wd.Forwards:Wd.Backwards,r=oc(e.getBody()),s=O($d,t?r.next:r.prev),a=t?dC:cC,i=Vd(o,e.getBody(),n),l=My(t,s(i));if(!l||!qd(i,l))return M.none();if(a(l))return M.some((()=>uC(e,n,i.getNode(),o,t,l)));const d=s(l);return d&&a(d)&&qd(l,d)?M.some((()=>uC(e,n,i.getNode(),o,t,d))):M.none()})(e,t),fC=mi([{remove:["element"]},{moveToElement:["element"]},{moveToPosition:["position"]}]),gC=(e,t,n)=>ic(t,e,n).bind((o=>{return r=o.getNode(),ar(mn(r))||rr(mn(r))||((e,t,n,o)=>{const r=t=>er(mn(t))&&!Dd(n,o,e);return jd(!t,n).fold((()=>jd(t,o).fold(L,r)),r)})(e,t,n,o)?M.none():t&&Mo(o.getNode())||!1===t&&Mo(o.getNode(!0))?((e,t,n,o)=>{const r=o.getNode(!1===t);return Vy(mn(e),mn(n.getNode())).map((e=>qr(e)?fC.remove(e.dom):fC.moveToElement(r))).orThunk((()=>M.some(fC.moveToElement(r))))})(e,t,n,o):t&&Yf(n)||!1===t&&Gf(n)?M.some(fC.moveToPosition(o)):M.none();var r})),pC=(e,t)=>M.from(dp(e.getBody(),t)),hC=(e,t)=>{const n=e.selection.getNode();return pC(e,n).filter(Mo).fold((()=>((e,t,n)=>{const o=zd(t?1:-1,e,n),r=ja.fromRangeStart(o),s=mn(e);return!1===t&&Yf(r)?M.some(fC.remove(r.getNode(!0))):t&&Gf(r)?M.some(fC.remove(r.getNode())):!1===t&&Gf(r)&&ug(s,r)?mg(s,r).map((e=>fC.remove(e.getNode()))):t&&Yf(r)&&cg(s,r)?fg(s,r).map((e=>fC.remove(e.getNode()))):((e,t,n)=>((e,t)=>{const n=t.getNode(!1===e),o=e?"after":"before";return yo(n)&&n.getAttribute("data-mce-caret")===o})(t,n)?((e,t)=>e&&Mo(t.nextSibling)?M.some(fC.moveToElement(t.nextSibling)):!1===e&&Mo(t.previousSibling)?M.some(fC.moveToElement(t.previousSibling)):M.none())(t,n.getNode(!1===t)).fold((()=>gC(e,t,n)),M.some):gC(e,t,n).bind((t=>((e,t,n)=>n.fold((e=>M.some(fC.remove(e))),(e=>M.some(fC.moveToElement(e))),(n=>Dd(t,n,e)?M.none():M.some(fC.moveToPosition(n)))))(e,n,t))))(e,t,r)})(e.getBody(),t,e.selection.getRng()).map((n=>()=>n.fold(((e,t)=>n=>(e._selectionOverrides.hideFakeCaret(),Mg(e,t,mn(n)),!0))(e,t),((e,t)=>n=>{const o=t?ja.before(n):ja.after(n);return e.selection.setRng(o.toRange()),!0})(e,t),(e=>t=>(e.selection.setRng(t.toRange()),!0))(e))))),(()=>M.some(S)))},bC=e=>{const t=e.dom,n=e.selection,o=dp(e.getBody(),n.getNode());if(Po(o)&&t.isBlock(o)&&t.isEmpty(o)){const e=t.create("br",{"data-mce-bogus":"1"});t.setHTML(o,""),o.appendChild(e),n.setRng(ja.before(e).toRange())}return!0},vC=(e,t)=>e.selection.isCollapsed()?hC(e,t):((e,t)=>{const n=e.selection.getNode();return Mo(n)&&!Io(n)?pC(e,n.parentNode).filter(Mo).fold((()=>M.some((()=>{var n;n=mn(e.getBody()),$(Js(n,".mce-offscreen-selection"),to),Mg(e,t,mn(e.selection.getNode())),Hy(e)}))),(()=>M.some(S))):M.none()})(e,t),yC=(e,t)=>e.selection.isCollapsed()?((e,t)=>{const n=ja.fromRangeStart(e.selection.getRng());return ic(t,e.getBody(),n).filter((e=>t?Vf(e):Hf(e))).bind((e=>M.from(Ld(t?0:-1,e)))).map((t=>()=>e.selection.select(t)))})(e,t):M.none(),CC=No,xC=e=>CC(e)&&e.data[0]===ur,wC=e=>CC(e)&&e.data[e.data.length-1]===ur,kC=e=>e.ownerDocument.createTextNode(ur),SC=(e,t)=>e?(e=>{if(CC(e.previousSibling))return wC(e.previousSibling)||e.previousSibling.appendData(ur),e.previousSibling;if(CC(e))return xC(e)||e.insertData(0,ur),e;{const t=kC(e);return e.parentNode.insertBefore(t,e),t}})(t):(e=>{if(CC(e.nextSibling))return xC(e.nextSibling)||e.nextSibling.insertData(0,ur),e.nextSibling;if(CC(e))return wC(e)||e.appendData(ur),e;{const t=kC(e);return e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t}})(t),_C=O(SC,!0),EC=O(SC,!1),NC=(e,t)=>No(e.container())?SC(t,e.container()):SC(t,e.getNode()),RC=(e,t)=>{const n=t.get();return n&&e.container()===n&&br(n)},AC=(e,t)=>t.fold((t=>{ud(e.get());const n=_C(t);return e.set(n),M.some(ja(n,n.length-1))}),(t=>fc(t).map((t=>{if(RC(t,e))return ja(e.get(),1);{ud(e.get());const n=NC(t,!0);return e.set(n),ja(n,1)}}))),(t=>gc(t).map((t=>{if(RC(t,e))return ja(e.get(),e.get().length-1);{ud(e.get());const n=NC(t,!1);return e.set(n),ja(n,n.length-1)}}))),(t=>{ud(e.get());const n=EC(t);return e.set(n),M.some(ja(n,1))})),OC=(e,t)=>{for(let n=0;n<e.length;n++){const o=e[n].apply(null,t);if(o.isSome())return o}return M.none()},TC=mi([{before:["element"]},{start:["element"]},{end:["element"]},{after:["element"]}]),BC=(e,t)=>Bd(t,e)||e,DC=(e,t,n)=>{const o=Iy(n),r=BC(t,o.container());return Py(e,r,o).fold((()=>uc(r,o).bind(O(Py,e,r)).map((e=>TC.before(e)))),M.none)},LC=(e,t)=>null===bc(e,t),PC=(e,t,n)=>Py(e,t,n).filter(O(LC,t)),MC=(e,t,n)=>{const o=Fy(n);return PC(e,t,o).bind((e=>mc(e,o).isNone()?M.some(TC.start(e)):M.none()))},IC=(e,t,n)=>{const o=Iy(n);return PC(e,t,o).bind((e=>uc(e,o).isNone()?M.some(TC.end(e)):M.none()))},FC=(e,t,n)=>{const o=Fy(n),r=BC(t,o.container());return Py(e,r,o).fold((()=>mc(r,o).bind(O(Py,e,r)).map((e=>TC.after(e)))),M.none)},UC=e=>{return!1===(t=jC(e),"rtl"===Us.DOM.getStyle(t,"direction",!0)||(e=>Dy.test(e))(t.textContent));var t},zC=(e,t,n)=>OC([DC,MC,IC,FC],[e,t,n]).filter(UC),jC=e=>e.fold(R,R,R,R),VC=e=>e.fold(N("before"),N("start"),N("end"),N("after")),HC=e=>e.fold(TC.before,TC.before,TC.after,TC.after),$C=e=>e.fold(TC.start,TC.start,TC.end,TC.end),qC=(e,t,n,o,r,s)=>Lt(Py(t,n,o),Py(t,n,r),((t,o)=>t!==o&&((e,t,n)=>{const o=Bd(t,e),r=Bd(n,e);return o&&o===r})(n,t,o)?TC.after(e?t:o):s)).getOr(s),WC=(e,t)=>e.fold(P,(e=>{return o=t,!(VC(n=e)===VC(o)&&jC(n)===jC(o));var n,o})),KC=(e,t)=>e?t.fold(_(M.some,TC.start),M.none,_(M.some,TC.after),M.none):t.fold(M.none,_(M.some,TC.before),M.none,_(M.some,TC.end)),GC=(e,t,n)=>{const o=e?1:-1;return t.setRng(ja(n.container(),n.offset()+o).toRange()),t.getSel().modify("move",e?"forward":"backward","word"),!0};var YC;!function(e){e[e.Br=0]="Br",e[e.Block=1]="Block",e[e.Wrap=2]="Wrap",e[e.Eol=3]="Eol"}(YC||(YC={}));const XC=(e,t)=>e===Wd.Backwards?ne(t):t,QC=(e,t,n)=>e===Wd.Forwards?t.next(n):t.prev(n),JC=(e,t,n,o)=>Do(o.getNode(t===Wd.Forwards))?YC.Br:!1===Dd(n,o)?YC.Block:YC.Wrap,ZC=(e,t,n,o)=>{const r=oc(n);let s=o;const a=[];for(;s;){const n=QC(t,r,s);if(!n)break;if(Do(n.getNode(!1)))return t===Wd.Forwards?{positions:XC(t,a).concat([n]),breakType:YC.Br,breakAt:M.some(n)}:{positions:XC(t,a),breakType:YC.Br,breakAt:M.some(n)};if(n.isVisible()){if(e(s,n)){const e=JC(0,t,s,n);return{positions:XC(t,a),breakType:e,breakAt:M.some(n)}}a.push(n),s=n}else s=n}return{positions:XC(t,a),breakType:YC.Eol,breakAt:M.none()}},ex=(e,t,n,o)=>t(n,o).breakAt.map((o=>{const r=t(n,o).positions;return e===Wd.Backwards?r.concat(o):[o].concat(r)})).getOr([]),tx=(e,t)=>Y(e,((e,n)=>e.fold((()=>M.some(n)),(o=>Lt(ie(o.getClientRects()),ie(n.getClientRects()),((e,r)=>{const s=Math.abs(t-e.left);return Math.abs(t-r.left)<=s?n:o})).or(e)))),M.none()),nx=(e,t)=>ie(t.getClientRects()).bind((t=>tx(e,t.left))),ox=O(ZC,ja.isAbove,-1),rx=O(ZC,ja.isBelow,1),sx=O(ex,-1,ox),ax=O(ex,1,rx),ix=Mo,lx=(e,t)=>Math.abs(e.left-t),dx=(e,t)=>Math.abs(e.right-t),cx=(e,t)=>Oe(e,((e,n)=>{const o=Math.min(lx(e,t),dx(e,t)),r=Math.min(lx(n,t),dx(n,t));return r===o&&ke(n,"node")&&ix(n.node)||r<o?n:e})),ux=e=>{const t=t=>H(t,(t=>{const n=ga(t);return n.node=e,n}));if(yo(e))return t(e.getClientRects());if(No(e)){const n=e.ownerDocument.createRange();return n.setStart(e,0),n.setEnd(e,e.data.length),t(n.getClientRects())}return[]},mx=e=>ee(e,ux);var fx;!function(e){e[e.Up=-1]="Up",e[e.Down=1]="Down"}(fx||(fx={}));const gx=(e,t,n,o,r,s)=>{let a=0;const i=[],l=o=>{let s=mx([o]);-1===e&&(s=s.reverse());for(let e=0;e<s.length;e++){const o=s[e];if(!n(o,d)){if(i.length>0&&t(o,Be(i))&&a++,o.line=a,r(o))return!0;i.push(o)}}},d=Be(s.getClientRects());if(!d)return i;const c=s.getNode();return l(c),((e,t,n,o)=>{for(;o=Td(o,e,Mr,t);)if(n(o))return})(e,o,l,c),i},px=O(gx,fx.Up,ba,va),hx=O(gx,fx.Down,va,ba),bx=e=>t=>((e,t)=>t.line>e)(e,t),vx=e=>t=>((e,t)=>t.line===e)(e,t),yx=(e,t)=>{e.selection.setRng(t),Im(e,e.selection.getRng())},Cx=(e,t,n)=>M.some(lC(e,t,n)),xx=(e,t,n,o,r,s)=>{const a=t===Wd.Forwards,i=oc(e.getBody()),l=O($d,a?i.next:i.prev),d=a?o:r;if(!n.collapsed){const o=Ca(n);if(s(o))return aC(t,e,o,t===Wd.Backwards,!1)}const c=Vd(t,e.getBody(),n);if(d(c))return iC(e,c.getNode(!a));const u=My(a,l(c)),m=_r(n);if(!u)return m?M.some(n):M.none();if(d(u))return aC(t,e,u.getNode(!a),a,!1);const f=l(u);return f&&d(f)&&qd(u,f)?aC(t,e,f.getNode(!a),a,!1):m?Cx(e,u.toRange(),!1):M.none()},wx=(e,t,n,o,r,s)=>{const a=Vd(t,e.getBody(),n),i=Be(a.getClientRects()),l=t===fx.Down;if(!i)return M.none();const d=(l?hx:px)(e.getBody(),bx(1),a),c=K(d,vx(1)),u=i.left,m=cx(c,u);if(m&&s(m.node)){const n=Math.abs(u-m.left),o=Math.abs(u-m.right);return aC(t,e,m.node,n<o,!1)}let f;if(f=o(a)?a.getNode():r(a)?a.getNode(!0):Ca(n),f){const n=((e,t,n,o)=>{const r=oc(t);let s,a,i,l;const d=[];let c=0;const u=e=>Be(e.getClientRects());1===e?(s=r.next,a=va,i=ba,l=ja.after(o)):(s=r.prev,a=ba,i=va,l=ja.before(o));const m=u(l);do{if(!l.isVisible())continue;const e=u(l);if(i(e,m))continue;d.length>0&&a(e,Be(d))&&c++;const t=ga(e);if(t.position=l,t.line=c,n(t))return d;d.push(t)}while(l=s(l));return d})(t,e.getBody(),bx(1),f);let o=cx(K(n,vx(1)),u);if(o)return Cx(e,o.position.toRange(),!1);if(o=Be(K(n,vx(0))),o)return Cx(e,o.position.toRange(),!1)}return 0===c.length?kx(e,l).filter(l?r:o).map((t=>lC(e,t.toRange(),!1))):M.none()},kx=(e,t)=>{const n=e.selection.getRng(),o=t?ja.fromRangeEnd(n):ja.fromRangeStart(n),r=(s=o.container(),a=e.getBody(),Ho(mn(s),(e=>Cd(e.dom)),(e=>e.dom===a)).map((e=>e.dom)).getOr(a));var s,a;if(t){const e=rx(r,o);return le(e.positions)}{const e=ox(r,o);return ie(e.positions)}},Sx=(e,t,n)=>kx(e,t).filter(n).exists((t=>(e.selection.setRng(t.toRange()),!0))),_x=(e,t)=>{const n=e.dom.createRng();n.setStart(t.container(),t.offset()),n.setEnd(t.container(),t.offset()),e.selection.setRng(n)},Ex=(e,t)=>{e?t.setAttribute("data-mce-selected","inline-boundary"):t.removeAttribute("data-mce-selected")},Nx=(e,t,n)=>AC(t,n).map((t=>(_x(e,t),n))),Rx=(e,t,n)=>!!gl(e)&&((e,t,n)=>{const o=e.getBody(),r=ja.fromRangeStart(e.selection.getRng());return((e,t,n,o)=>{const r=My(e,o),s=zC(t,n,r);return zC(t,n,r).bind(O(KC,e)).orThunk((()=>((e,t,n,o,r)=>{const s=My(e,r);return ic(e,n,s).map(O(My,e)).fold((()=>o.map(HC)),(r=>zC(t,n,r).map(O(qC,e,t,n,s,r)).filter(O(WC,o)))).filter(UC)})(e,t,n,s,o)))})(n,O(Ly,e),o,r).bind((n=>Nx(e,t,n)))})(e,t,n).isSome(),Ax=(e,t,n)=>!!gl(t)&&((e,t)=>{const n=t.selection.getRng(),o=e?ja.fromRangeEnd(n):ja.fromRangeStart(n);return!!(e=>x(e.selection.getSel().modify))(t)&&(e&&Cr(o)?GC(!0,t.selection,o):!(e||!xr(o))&&GC(!1,t.selection,o))})(e,t),Ox=e=>{const t=Vs(null),n=O(Ly,e);return e.on("NodeChange",(o=>{gl(e)&&(((e,t,n)=>{const o=H(Js(mn(t.getRoot()),'*[data-mce-selected="inline-boundary"]'),(e=>e.dom)),r=K(o,e),s=K(n,e);$(oe(r,s),O(Ex,!1)),$(oe(s,r),O(Ex,!0))})(n,e.dom,o.parents),((e,t)=>{if(e.selection.isCollapsed()&&!0!==e.composing&&t.get()){const n=ja.fromRangeStart(e.selection.getRng());ja.isTextPosition(n)&&!1===(e=>Cr(e)||xr(e))(n)&&(_x(e,cd(t.get(),n)),t.set(null))}})(e,t),((e,t,n,o)=>{if(t.selection.isCollapsed()){const r=K(o,e);$(r,(o=>{const r=ja.fromRangeStart(t.selection.getRng());zC(e,t.getBody(),r).bind((e=>Nx(t,n,e)))}))}})(n,e,t,o.parents))})),t},Tx=O(Ax,!0),Bx=O(Ax,!1),Dx=(e,t,n)=>{if(gl(e)){const o=kx(e,t).getOrThunk((()=>{const n=e.selection.getRng();return t?ja.fromRangeEnd(n):ja.fromRangeStart(n)}));return zC(O(Ly,e),e.getBody(),o).exists((t=>{const o=HC(t);return AC(n,o).exists((t=>(_x(e,t),!0)))}))}return!1},Lx=(e,t)=>n=>AC(t,n).map((t=>()=>_x(e,t))),Px=(e,t,n,o)=>{const r=e.getBody(),s=O(Ly,e);e.undoManager.ignore((()=>{e.selection.setRng(((e,t)=>{const n=document.createRange();return n.setStart(e.container(),e.offset()),n.setEnd(t.container(),t.offset()),n})(n,o)),zy(e),zC(s,r,ja.fromRangeStart(e.selection.getRng())).map($C).bind(Lx(e,t)).each(D)})),e.nodeChanged()},Mx=(e,t,n)=>{if(e.selection.isCollapsed()&&gl(e)){const o=ja.fromRangeStart(e.selection.getRng());return((e,t,n,o)=>{const r=((e,t)=>Bd(t,e)||e)(e.getBody(),o.container()),s=O(Ly,e),a=zC(s,r,o);return a.bind((e=>n?e.fold(N(M.some($C(e))),M.none,N(M.some(HC(e))),M.none):e.fold(M.none,N(M.some(HC(e))),M.none,N(M.some($C(e)))))).map(Lx(e,t)).getOrThunk((()=>{const i=lc(n,r,o),l=i.bind((e=>zC(s,r,e)));return Lt(a,l,(()=>Py(s,r,o).bind((t=>(e=>Lt(fc(e),gc(e),((t,n)=>{const o=My(!0,t),r=My(!1,n);return uc(e,o).forall((e=>e.isEqual(r)))})).getOr(!0))(t)?M.some((()=>{Mg(e,n,mn(t))})):M.none())))).getOrThunk((()=>l.bind((()=>i.map((r=>()=>{n?Px(e,t,o,r):Px(e,t,r,o)}))))))}))})(e,t,n,o)}return M.none()},Ix=e=>1===Tn(e),Fx=(e,t)=>{const n=mn(e.getBody()),o=mn(e.selection.getStart()),r=K(((e,t)=>{const n=Zf(t,e);return J(n,Zo).fold(N(n),(e=>n.slice(0,e)))})(n,o),Ix);return le(r).bind((n=>{const o=ja.fromRangeStart(e.selection.getRng());return!((e,t,n)=>Lt(fc(n),gc(n),((o,r)=>{const s=My(!0,o),a=My(!1,r),i=My(!1,t);return e?uc(n,i).exists((e=>e.isEqual(a)&&t.isEqual(s))):mc(n,i).exists((e=>e.isEqual(s)&&t.isEqual(a)))})).getOr(!0))(t,o,n.dom)||hc((s=n).dom)&&jp(s.dom)?M.none():M.some((()=>((e,t,n,o)=>{const r=O(Yp,t),s=H(K(o,r),(e=>e.dom));if(0===s.length)Mg(t,e,n);else{const e=((e,t)=>{const n=Hp(!1),o=Kp(t,n.dom);return Yn(mn(e),n),to(mn(e)),ja(o,0)})(n.dom,s);t.selection.setRng(e.toRange())}})(t,e,n,r)));var s}))},Ux=(e,t)=>e.selection.isCollapsed()?Fx(e,t):M.none(),zx=(e,t,n)=>M.some((()=>{e._selectionOverrides.hideFakeCaret(),Mg(e,t,mn(n))})),jx=(e,t)=>e.selection.isCollapsed()?((e,t)=>{const n=t?$f:qf,o=t?Wd.Forwards:Wd.Backwards,r=Vd(o,e.getBody(),e.selection.getRng());return n(r)?zx(e,t,r.getNode(!t)):M.from(My(t,r)).filter((e=>n(e)&&qd(r,e))).map((n=>()=>zx(e,t,n.getNode(!t))))})(e,t):((e,t)=>{const n=e.selection.getNode();return Fo(n)?zx(e,t,n):M.none()})(e,t),Vx=e=>{const t=parseInt(e,10);return isNaN(t)?0:t},Hx=(e,t)=>(e||"table"===Mt(t)?"margin":"padding")+("rtl"===$n(t,"direction")?"-right":"-left"),$x=e=>{const t=Wx(e);return!e.mode.isReadOnly()&&(t.length>1||((e,t)=>te(t,(t=>{const n=Hx(Ji(e),t),o=Wn(t,n).map(Vx).getOr(0);return"false"!==e.dom.getContentEditable(t.dom)&&o>0})))(e,t))},qx=e=>or(e)||rr(e),Wx=e=>{return K((t=e.selection.getSelectedBlocks(),H(t,mn)),(e=>!qx(e)&&!(e=>wn(e).exists(qx))(e)&&$o(e,(e=>Po(e.dom)||Mo(e.dom))).exists((e=>Po(e.dom)))));var t},Kx=(e,t)=>{const{dom:n}=e,o=Zi(e),r=/[a-z%]+$/i.exec(o)[0],s=parseInt(o,10),a=Ji(e);$(Wx(e),(e=>{((e,t,n,o,r,s)=>{const a=Hx(n,mn(s));if("outdent"===t){const t=Math.max(0,Vx(s.style[a])-o);e.setStyle(s,a,t?t+r:"")}else{const t=Vx(s.style[a])+o+r;e.setStyle(s,a,t)}})(n,t,a,s,r,e.dom)}))},Gx=e=>Kx(e,"outdent"),Yx=e=>{if(e.selection.isCollapsed()&&$x(e)){const t=e.dom,n=e.selection.getRng(),o=ja.fromRangeStart(n),r=t.getParent(n.startContainer,t.isBlock);if(null!==r&&rg(mn(r),o))return M.some((()=>Gx(e)))}return M.none()},Xx=(e,t,n)=>ce([Yx,vC,mC,(e,n)=>Mx(e,t,n),eC,lp,yC,jx,oC,Ux],(t=>t(e,n))),Qx=(e,t)=>{e.addCommand("delete",(()=>{((e,t)=>{Xx(e,t,!1).fold((()=>{zy(e),Hy(e)}),D)})(e,t)})),e.addCommand("forwardDelete",(()=>{((e,t)=>{Xx(e,t,!0).fold((()=>(e=>Uy(e,"ForwardDelete"))(e)),D)})(e,t)}))},Jx=e=>void 0===e.touches||1!==e.touches.length?M.none():M.some(e.touches[0]),Zx=(e,t)=>we(e,t.nodeName),ew=(e,t)=>!!No(t)||!!yo(t)&&!Zx(e,t)&&!Nc(t),tw=(e,t)=>{if(No(t)){if(0===t.nodeValue.length)return!0;if(/^\s+$/.test(t.nodeValue)&&(!t.nextSibling||Zx(e,t.nextSibling)))return!0}return!1},nw=e=>{const t=e.dom,n=e.selection,o=e.schema,r=o.getBlockElements();let s=n.getStart();const a=e.getBody();let i,l,d;const c=Di(e);if(!s||!yo(s))return;const u=a.nodeName.toLowerCase();if(!o.isValidChild(u,c.toLowerCase())||((e,t,n)=>V(Jf(mn(n),mn(t)),(t=>Zx(e,t.dom))))(r,a,s))return;const m=n.getRng(),f=m.startContainer,g=m.startOffset,p=m.endContainer,h=m.endOffset,b=rf(e);for(s=a.firstChild;s;)if(ew(r,s)){if(tw(r,s)){l=s,s=s.nextSibling,t.remove(l);continue}i||(i=t.create(c,Li(e)),s.parentNode.insertBefore(i,s),d=!0),l=s,s=s.nextSibling,i.appendChild(l)}else i=null,s=s.nextSibling;d&&b&&(m.setStart(f,g),m.setEnd(p,h),n.setRng(m),e.nodeChanged())},ow=e=>t=>-1!==(" "+t.attr("class")+" ").indexOf(e),rw=(e,t,n)=>function(o){const r=arguments,s=r[r.length-2],a=s>0?t.charAt(s-1):"";if('"'===a)return o;if(">"===a){const e=t.lastIndexOf("<",s);if(-1!==e&&-1!==t.substring(e,s).indexOf('contenteditable="false"'))return o}return'<span class="'+n+'" data-mce-content="'+e.dom.encode(r[0])+'">'+e.dom.encode("string"==typeof r[1]?r[1]:r[0])+"</span>"},sw=(e,t)=>{t.hasAttribute("data-mce-caret")&&(Sr(t),e.selection.setRng(e.selection.getRng()),e.selection.scrollIntoView(t))},aw=(e,t)=>{const n=(e=>Wo(mn(e.getBody()),"*[data-mce-caret]").map((e=>e.dom)).getOrNull())(e);if(n)return"compositionstart"===t.type?(t.preventDefault(),t.stopPropagation(),void sw(e,n)):void(yr(n)&&(sw(e,n),e.undoManager.add()))},iw=Mo,lw=(e,t,n)=>{const o=oc(e.getBody()),r=O($d,1===t?o.next:o.prev);if(n.collapsed){const o=e.dom.getParent(n.startContainer,"PRE");if(!o)return;if(!r(ja.fromRangeStart(n))){const n=mn((e=>{const t=e.dom.create(Di(e));return t.innerHTML='<br data-mce-bogus="1">',t})(e));1===t?Xn(mn(o),n):Yn(mn(o),n),e.selection.select(n.dom,!0),e.selection.collapse()}}},dw=(e,t)=>((e,t)=>{const n=t?Wd.Forwards:Wd.Backwards,o=e.selection.getRng();return((e,t,n)=>xx(t,e,n,Gf,Yf,iw))(n,e,o).orThunk((()=>(lw(e,n,o),M.none())))})(e,t).exists((t=>(yx(e,t),!0))),cw=(e,t)=>((e,t)=>{const n=t?1:-1,o=e.selection.getRng();return((e,t,n)=>wx(t,e,n,(e=>Gf(e)||Wf(e)),(e=>Yf(e)||Kf(e)),iw))(n,e,o).orThunk((()=>(lw(e,n,o),M.none())))})(e,t).exists((t=>(yx(e,t),!0))),uw=(e,t)=>Sx(e,t,t?Yf:Gf),mw=e=>j(["figcaption"],Mt(e)),fw=(e,t)=>{const n=mn(e.getBody()),o=ja.fromRangeStart(e.selection.getRng()),r=Di(e),s=Li(e);return((e,t)=>{const n=O(bn,t);return $o(mn(e.container()),Zo,n).filter(mw)})(o,n).exists((()=>{if(((e,t,n)=>t?((e,t)=>rx(e,t).breakAt.isNone())(e.dom,n):((e,t)=>ox(e,t).breakAt.isNone())(e.dom,n))(n,t,o)){const o=((e,t,n,o)=>{const r=cn(n),s=cn("br");return qt(r,o),Jn(r,s),((e,t,n)=>{n?Jn(e,t):Qn(e,t)})(e,r,t),(e=>{const t=document.createRange();return t.setStartBefore(e.dom),t.setEndBefore(e.dom),t})(s)})(n,t,r,s);return e.selection.setRng(o),!0}return!1}))},gw=(e,t)=>!!e.selection.isCollapsed()&&fw(e,t),pw={shiftKey:!1,altKey:!1,ctrlKey:!1,metaKey:!1,keyCode:0},hw=(e,t)=>t.keyCode===e.keyCode&&t.shiftKey===e.shiftKey&&t.altKey===e.altKey&&t.ctrlKey===e.ctrlKey&&t.metaKey===e.metaKey,bw=(e,...t)=>()=>e.apply(null,t),vw=(e,t)=>Q(((e,t)=>ee((e=>H(e,(e=>({...pw,action:S,...e}))))(e),(e=>hw(e,t)?[e]:[])))(e,t),(e=>e.action())),yw=(e,t)=>ce(((e,t)=>ee((e=>H(e,(e=>({...pw,action:()=>M.none(),...e}))))(e),(e=>hw(e,t)?[e]:[])))(e,t),(e=>e.action())),Cw=(e,t)=>{const n=t?Wd.Forwards:Wd.Backwards,o=e.selection.getRng();return xx(e,n,o,$f,qf,Fo).exists((t=>(yx(e,t),!0)))},xw=(e,t)=>{const n=t?1:-1,o=e.selection.getRng();return wx(e,n,o,$f,qf,Fo).exists((t=>(yx(e,t),!0)))},ww=(e,t)=>Sx(e,t,t?qf:$f),kw=mi([{none:["current"]},{first:["current"]},{middle:["current","target"]},{last:["current"]}]),Sw={...kw,none:e=>kw.none(e)},_w=(e,t,n)=>ee(Nn(e),(e=>pn(e,t)?n(e)?[e]:[]:_w(e,t,n))),Ew=(e,t)=>Ko(e,"table",t),Nw=(e,t,n,o,r=P)=>{const s=1===o;if(!s&&n<=0)return Sw.first(e[0]);if(s&&n>=e.length-1)return Sw.last(e[e.length-1]);{const s=n+o,a=e[s];return r(a)?Sw.middle(t,a):Nw(e,t,s,o,r)}},Rw=(e,t)=>Ew(e,t).bind((t=>{const n=_w(t,"th,td",P);return J(n,(t=>bn(e,t))).map((e=>({index:e,all:n})))})),Aw=(e,t=!1)=>{return zn(e)?e.dom.isContentEditable:(n=e,Ko(n,"[contenteditable]")).fold(N(t),(e=>"true"===Ow(e)));var n},Ow=e=>e.dom.contentEditable,Tw=(e,t,n,o,r)=>{const s=Js(mn(n),"td,th,caption").map((e=>e.dom)),a=K(((e,t)=>ee(t,(t=>{const n=((e,t)=>({left:e.left-t,top:e.top-t,right:e.right+-2,bottom:e.bottom+-2,width:e.width+t,height:e.height+t}))(ga(t.getBoundingClientRect()),-1);return[{x:n.left,y:e(n),cell:t},{x:n.right,y:e(n),cell:t}]})))(e,s),(e=>t(e,r)));return((e,t,n)=>Y(e,((e,o)=>e.fold((()=>M.some(o)),(e=>{const r=Math.sqrt(Math.abs(e.x-t)+Math.abs(e.y-n)),s=Math.sqrt(Math.abs(o.x-t)+Math.abs(o.y-n));return M.some(s<r?o:e)}))),M.none()))(a,o,r).map((e=>e.cell))},Bw=O(Tw,(e=>e.bottom),((e,t)=>e.y<t)),Dw=O(Tw,(e=>e.top),((e,t)=>e.y>t)),Lw=(e,t,n)=>{const o=e(t,n);return(e=>e.breakType===YC.Wrap&&0===e.positions.length)(o)||!Do(n.getNode())&&(e=>e.breakType===YC.Br&&1===e.positions.length)(o)?!((e,t,n)=>n.breakAt.exists((n=>e(t,n).breakAt.isSome())))(e,t,o):o.breakAt.isNone()},Pw=O(Lw,ox),Mw=O(Lw,rx),Iw=(e,t,n,o)=>{const r=e.selection.getRng(),s=t?1:-1;return!(!bd()||!((e,t,n)=>{const o=ja.fromRangeStart(t);return cc(!e,n).exists((e=>e.isEqual(o)))})(t,r,n)||(aC(s,e,n,!t,!1).each((t=>{yx(e,t)})),0))},Fw=(e,t,n)=>{const o=((e,t)=>{const n=t.getNode(e);return yo(n)&&"TABLE"===n.nodeName?M.some(n):M.none()})(!!t,n),r=!1===t;o.fold((()=>yx(e,n.toRange())),(o=>cc(r,e.getBody()).filter((e=>e.isEqual(n))).fold((()=>yx(e,n.toRange())),(n=>((e,t,n)=>{const o=Di(t);t.undoManager.transact((()=>{const r=cn(o);qt(r,Li(t)),Jn(r,cn("br")),e?Xn(mn(n),r):Yn(mn(n),r);const s=t.dom.createRng();s.setStart(r.dom,0),s.setEnd(r.dom,0),yx(t,s)}))})(t,e,o)))))},Uw=(e,t,n,o)=>{const r=e.selection.getRng(),s=ja.fromRangeStart(r),a=e.getBody();if(!t&&Pw(o,s)){const o=((e,t,n)=>((e,t)=>ie(t.getClientRects()).bind((t=>Bw(e,t.left,t.top))).bind((e=>{return nx(gc(n=e).map((e=>ox(n,e).positions.concat(e))).getOr([]),t);var n})))(t,n).orThunk((()=>ie(n.getClientRects()).bind((n=>tx(sx(e,ja.before(t)),n.left))))).getOr(ja.before(t)))(a,n,s);return Fw(e,t,o),!0}if(t&&Mw(o,s)){const o=((e,t,n)=>((e,t)=>le(t.getClientRects()).bind((t=>Dw(e,t.left,t.top))).bind((e=>{return nx(fc(n=e).map((e=>[e].concat(rx(n,e).positions))).getOr([]),t);var n})))(t,n).orThunk((()=>ie(n.getClientRects()).bind((n=>tx(ax(e,ja.after(t)),n.left))))).getOr(ja.after(t)))(a,n,s);return Fw(e,t,o),!0}return!1},zw=(e,t,n)=>M.from(e.dom.getParent(e.selection.getNode(),"td,th")).bind((o=>M.from(e.dom.getParent(o,"table")).map((r=>n(e,t,r,o))))).getOr(!1),jw=(e,t)=>zw(e,t,Iw),Vw=(e,t)=>zw(e,t,Uw),Hw=(e,t,n)=>n.fold(M.none,M.none,((e,t)=>{return(n=t,((e,t)=>{const n=e=>{for(let o=0;o<e.childNodes.length;o++){const r=mn(e.childNodes[o]);if(t(r))return M.some(r);const s=n(e.childNodes[o]);if(s.isSome())return s}return M.none()};return n(e.dom)})(n,ff)).map((e=>(e=>{const t=Ju.exact(e,0,e,0);return om(t)})(e)));var n}),(n=>(e.execCommand("mceTableInsertRowAfter"),$w(e,t,n)))),$w=(e,t,n)=>{return Hw(e,t,(r=Aw,Rw(o=n,void 0).fold((()=>Sw.none(o)),(e=>Nw(e.all,o,e.index,1,r)))));var o,r},qw=(e,t,n)=>{return Hw(e,t,(r=Aw,Rw(o=n,void 0).fold((()=>Sw.none()),(e=>Nw(e.all,o,e.index,-1,r)))));var o,r},Ww=(e,t)=>{const n=["table","li","dl"],o=mn(e.getBody()),r=e=>{const t=Mt(e);return bn(e,o)||j(n,t)},s=e.selection.getRng();return((e,t)=>((e,t,n=L)=>n(t)?M.none():j(e,Mt(t))?M.some(t):qo(t,e.join(","),(e=>pn(e,"table")||n(e))))(["td","th"],e,t))(mn(t?s.endContainer:s.startContainer),r).map((n=>(Ew(n,r).each((t=>{e.model.table.clearSelectedCells(t.dom)})),e.selection.collapse(!t),(t?$w:qw)(e,r,n).each((t=>{e.selection.setRng(t)})),!0))).getOr(!1)},Kw=(e,t)=>({container:e,offset:t}),Gw=Us.DOM,Yw=e=>t=>e===t?-1:0,Xw=(e,t,n)=>{if(No(e)&&t>=0)return M.some(Kw(e,t));{const o=ma(Gw);return M.from(o.backwards(e,t,Yw(e),n)).map((e=>Kw(e.container,e.container.data.length)))}},Qw=(e,t,n)=>{if(!No(e))return M.none();const o=e.textContent;if(t>=0&&t<=o.length)return M.some(Kw(e,t));{const o=ma(Gw);return M.from(o.backwards(e,t,Yw(e),n)).bind((e=>{const o=e.container.data;return Qw(e.container,t+o.length,n)}))}},Jw=(e,t,n)=>{if(!No(e))return M.none();const o=e.textContent;if(t<=o.length)return M.some(Kw(e,t));{const r=ma(Gw);return M.from(r.forwards(e,t,Yw(e),n)).bind((e=>Jw(e.container,t-o.length,n)))}},Zw=(e,t,n,o,r)=>{const s=ma(e,(e=>t=>e.isBlock(t)||j(["BR","IMG","HR","INPUT"],t.nodeName)||"false"===e.getContentEditable(t))(e));return M.from(s.backwards(t,n,o,r))},ek=e=>e.toString().replace(/\u00A0/g," ").replace(/\uFEFF/g,""),tk=e=>""!==e&&-1!==" \xa0\f\n\r\t\v".indexOf(e),nk=(e,t)=>e.substring(t.length),ok=(e,t,n,o=0)=>{return(r=mn(t.startContainer),Ko(r,gf)).fold((()=>((e,t,n,o=0)=>{if(!(r=t).collapsed||3!==r.startContainer.nodeType)return M.none();var r;const s=e.getParent(t.startContainer,e.isBlock)||e.getRoot();return Zw(e,t.startContainer,t.startOffset,((e,t,o)=>((e,t,n)=>{let o;for(o=t-1;o>=0;o--){const t=e.charAt(o);if(tk(t))return M.none();if(t===n)break}return M.some(o)})(o,t,n).getOr(t)),s).bind((e=>{const r=t.cloneRange();if(r.setStart(e.container,e.offset),r.setEnd(t.endContainer,t.endOffset),r.collapsed)return M.none();const s=ek(r);return 0!==s.lastIndexOf(n)||nk(s,n).length<o?M.none():M.some({text:nk(s,n),range:r,triggerChar:n})}))})(e,t,n,o)),(t=>{const o=e.createRng();o.selectNode(t.dom);const r=ek(o);return M.some({range:o,text:nk(r,n),triggerChar:n})}));var r},rk=e=>{if((e=>3===e.nodeType)(e))return Kw(e,e.data.length);{const t=e.childNodes;return t.length>0?rk(t[t.length-1]):Kw(e,t.length)}},sk=(e,t)=>{const n=e.childNodes;return n.length>0&&t<n.length?sk(n[t],0):n.length>0&&(e=>1===e.nodeType)(e)&&n.length===t?rk(n[n.length-1]):Kw(e,t)},ak=(e,t,n,o={})=>{const r=t(),s=e.selection.getRng().startContainer.nodeValue,a=K(r.lookupByChar(n.triggerChar),(t=>n.text.length>=t.minChars&&t.matches.getOrThunk((()=>(e=>t=>{const n=sk(t.startContainer,t.startOffset);return!((e,t)=>Zw(e,t.container,t.offset,((e,t)=>0===t?-1:t),e.getRoot()).filter((e=>{const t=e.container.data.charAt(e.offset-1);return!tk(t)})).isSome())(e,n)})(e.dom)))(n.range,s,n.text)));if(0===a.length)return M.none();const i=Promise.all(H(a,(e=>e.fetch(n.text,e.maxResults,o).then((t=>({matchText:n.text,items:t,columns:e.columns,onAction:e.onAction,highlightOn:e.highlightOn}))))));return M.some({lookupData:i,context:n})};var ik;!function(e){e[e.Error=0]="Error",e[e.Value=1]="Value"}(ik||(ik={}));const lk=(e,t,n)=>e.stype===ik.Error?t(e.serror):n(e.svalue),dk=e=>({stype:ik.Value,svalue:e}),ck=e=>({stype:ik.Error,serror:e}),uk=lk,mk=e=>f(e)&&ue(e).length>100?" removed due to size":JSON.stringify(e,null,2),fk=(e,t)=>ck([{path:e,getErrorInfo:t}]),gk=(e,t)=>({extract:(n,o)=>xe(o,e).fold((()=>((e,t)=>fk(e,(()=>'Choice schema did not contain choice key: "'+t+'"')))(n,e)),(e=>((e,t,n,o)=>xe(n,o).fold((()=>((e,t,n)=>fk(e,(()=>'The chosen schema: "'+n+'" did not exist in branches: '+mk(t))))(e,n,o)),(n=>n.extract(e.concat(["branch: "+o]),t))))(n,o,t,e))),toString:()=>"chooseOn("+e+"). Possible values: "+ue(t)}),pk=e=>(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const n={};for(let o=0;o<t.length;o++){const r=t[o];for(const t in r)we(r,t)&&(n[t]=e(n[t],r[t]))}return n},hk=pk(((e,t)=>g(e)&&g(t)?hk(e,t):t)),bk=(pk(((e,t)=>t)),e=>({tag:"defaultedThunk",process:N(e)})),vk=e=>{const t=(e=>{const t=[],n=[];return $(e,(e=>{lk(e,(e=>n.push(e)),(e=>t.push(e)))})),{values:t,errors:n}})(e);return t.errors.length>0?(n=t.errors,_(ck,Z)(n)):dk(t.values);var n},yk=(e,t,n)=>{switch(e.tag){case"field":return t(e.key,e.newKey,e.presence,e.prop);case"custom":return n(e.newKey,e.instantiator)}},Ck=e=>({extract:(t,n)=>{return o=e(n),r=e=>((e,t)=>fk(e,N(t)))(t,e),o.stype===ik.Error?r(o.serror):o;var o,r},toString:N("val")}),xk=Ck(dk),wk=(e,t,n,o)=>o(xe(e,t).getOrThunk((()=>n(e)))),kk=(e,t,n,o,r)=>{const s=e=>r.extract(t.concat([o]),e),a=e=>e.fold((()=>dk(M.none())),(e=>{const n=r.extract(t.concat([o]),e);return s=n,a=M.some,s.stype===ik.Value?{stype:ik.Value,svalue:a(s.svalue)}:s;var s,a}));switch(e.tag){case"required":return((e,t,n,o)=>xe(t,n).fold((()=>((e,t,n)=>fk(e,(()=>'Could not find valid *required* value for "'+t+'" in '+mk(n))))(e,n,t)),o))(t,n,o,s);case"defaultedThunk":return wk(n,o,e.process,s);case"option":return((e,t,n)=>n(xe(e,t)))(n,o,a);case"defaultedOptionThunk":return((e,t,n,o)=>o(xe(e,t).map((t=>!0===t?n(e):t))))(n,o,e.process,a);case"mergeWithThunk":return wk(n,o,N({}),(t=>{const o=hk(e.process(n),t);return s(o)}))}},Sk=e=>({extract:(t,n)=>((e,t,n)=>{const o={},r=[];for(const s of n)yk(s,((n,s,a,i)=>{const l=kk(a,e,t,n,i);uk(l,(e=>{r.push(...e)}),(e=>{o[s]=e}))}),((e,n)=>{o[e]=n(t)}));return r.length>0?ck(r):dk(o)})(t,n,e),toString:()=>{const t=H(e,(e=>yk(e,((e,t,n,o)=>e+" -> "+o.toString()),((e,t)=>"state("+e+")"))));return"obj{\n"+t.join("\n")+"}"}}),_k=e=>({extract:(t,n)=>{const o=H(n,((n,o)=>e.extract(t.concat(["["+o+"]"]),n)));return vk(o)},toString:()=>"array("+e.toString()+")"}),Ek=(e,t,n)=>{return o=((e,t,n)=>((e,t)=>e.stype===ik.Error?{stype:ik.Error,serror:t(e.serror)}:e)(t.extract([e],n),(e=>({input:n,errors:e}))))(e,t,n),lk(o,ui.error,ui.value);var o},Nk=(e,t)=>gk(e,ge(t,Sk)),Rk=N(xk),Ak=(e,t)=>Ck((n=>{const o=typeof n;return e(n)?dk(n):ck(`Expected type: ${t} but got: ${o}`)})),Ok=Ak(w,"number"),Tk=Ak(m,"string"),Bk=Ak(b,"boolean"),Dk=Ak(x,"function"),Lk=(e,t,n,o)=>({tag:"field",key:e,newKey:t,presence:n,prop:o}),Pk=(e,t)=>({tag:"custom",newKey:e,instantiator:t}),Mk=(e,t)=>Lk(e,e,{tag:"required",process:{}},t),Ik=e=>Mk(e,Tk),Fk=e=>Mk(e,Dk),Uk=(e,t)=>Lk(e,e,{tag:"option",process:{}},t),zk=e=>Uk(e,Tk),jk=(e,t,n)=>Lk(e,e,bk(t),n),Vk=(e,t)=>jk(e,t,Ok),Hk=(e,t,n)=>jk(e,t,(e=>{return t=t=>j(e,t)?ui.value(t):ui.error(`Unsupported value: "${t}", choose one of "${e.join(", ")}".`),Ck((e=>t(e).fold(ck,dk)));var t})(n)),$k=(e,t)=>jk(e,t,Bk),qk=(e,t)=>jk(e,t,Dk),Wk=Ik("type"),Kk=Fk("fetch"),Gk=Fk("onAction"),Yk=qk("onSetup",(()=>S)),Xk=zk("text"),Qk=zk("icon"),Jk=zk("tooltip"),Zk=zk("label"),eS=$k("active",!1),tS=$k("enabled",!0),nS=$k("primary",!1),oS=e=>((e,t)=>jk("type",t,Tk))(0,e),rS=Sk([Wk,Ik("ch"),Vk("minChars",1),(1,((e,t)=>Lk(e,e,bk(1),Rk()))("columns")),Vk("maxResults",10),("matches",Uk("matches",Dk)),Kk,Gk,(sS=Tk,jk("highlightOn",[],_k(sS)))]);var sS;const aS=[tS,Jk,Qk,Xk,Yk],iS=[eS].concat(aS),lS=[qk("predicate",L),Hk("scope","node",["node","editor"]),Hk("position","selection",["node","selection","line"])],dS=aS.concat([oS("contextformbutton"),nS,Gk,Pk("original",R)]),cS=iS.concat([oS("contextformbutton"),nS,Gk,Pk("original",R)]),uS=aS.concat([oS("contextformbutton")]),mS=iS.concat([oS("contextformtogglebutton")]),fS=Nk("type",{contextformbutton:dS,contextformtogglebutton:cS});Sk([oS("contextform"),qk("initValue",N("")),Zk,((e,t)=>Lk(e,e,{tag:"required",process:{}},_k(t)))("commands",fS),Uk("launch",Nk("type",{contextformbutton:uS,contextformtogglebutton:mS}))].concat(lS));const gS=e=>{const t=e.ui.registry.getAll().popups,n=ge(t,(e=>{return(t=e,Ek("Autocompleter",rS,t)).fold((e=>{throw new Error("Errors: \n"+(e=>{const t=e.length>10?e.slice(0,10).concat([{path:[],getErrorInfo:N("... (only showing first ten failures)")}]):e;return H(t,(e=>"Failed path: ("+e.path.join(" > ")+")\n"+e.getErrorInfo()))})((t=e).errors).join("\n")+"\n\nInput object: "+mk(t.input));var t}),R);var t})),o=Se(ye(n,(e=>e.ch))),r=Ce(n);return{dataset:n,triggerChars:o,lookupByChar:e=>K(r,(t=>t.ch===e))}},pS=e=>{const t=Gs(),n=Vs(!1),o=t.isSet,r=()=>{o()&&((e=>{Av(e).autocompleter.removeDecoration()})(e),(e=>{e.dispatch("AutocompleterEnd")})(e),n.set(!1),t.clear())},s=De((()=>gS(e))),a=a=>{(n=>t.get().map((t=>ok(e.dom,e.selection.getRng(),t.triggerChar).bind((t=>ak(e,s,t,n))))).getOrThunk((()=>((e,t)=>{const n=t(),o=e.selection.getRng();return((e,t,n)=>ce(n.triggerChars,(n=>ok(e,t,n))))(e.dom,o,n).bind((n=>ak(e,t,n)))})(e,s))))(a).fold(r,(s=>{(n=>{o()||(((e,t)=>{Av(e).autocompleter.addDecoration(t)})(e,n.range),t.set({triggerChar:n.triggerChar,matchLength:n.text.length}))})(s.context),s.lookupData.then((o=>{t.get().map((a=>{const i=s.context;a.triggerChar===i.triggerChar&&(i.text.length-a.matchLength>=10?r():(t.set({...a,matchLength:i.text.length}),n.get()?((e,t)=>{e.dispatch("AutocompleterUpdate",t)})(e,{lookupData:o}):(n.set(!0),((e,t)=>{e.dispatch("AutocompleterStart",t)})(e,{lookupData:o}))))}))}))}))};e.addCommand("mceAutocompleterReload",((e,t)=>{const n=f(t)?t.fetchOptions:{};a(n)})),e.addCommand("mceAutocompleterClose",r),((e,t)=>{const n=Xs(t.load,50);e.on("keypress compositionend",(e=>{27!==e.which&&n.throttle()})),e.on("keydown",(e=>{const o=e.which;8===o?n.throttle():27===o&&t.cancelIfNecessary()})),e.on("remove",n.cancel)})(e,{cancelIfNecessary:r,load:a})},hS=e=>(t,n,o={})=>{const r=t.getBody(),s={bubbles:!0,composed:!0,data:null,isComposing:!1,detail:0,view:null,target:r,currentTarget:r,eventPhase:Event.AT_TARGET,originalTarget:r,explicitOriginalTarget:r,isTrusted:!1,srcElement:r,cancelable:!1,preventDefault:S,inputType:n},a=ks(new InputEvent(e));return t.dispatch(e,{...a,...s,...o})},bS=hS("input"),vS=hS("beforeinput"),yS=(e,t)=>{let n,o=t;const r=e.dom,s=e.schema.getMoveCaretBeforeOnEnterElements();if(!t)return;if(/^(LI|DT|DD)$/.test(t.nodeName)){const e=(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);e&&/^(UL|OL|DL)$/.test(e.nodeName)&&t.insertBefore(r.doc.createTextNode(dr),t.firstChild)}const a=r.createRng();if(t.normalize(),t.hasChildNodes()){const e=new Xo(t,t);for(;n=e.current();){if(No(n)){a.setStart(n,0),a.setEnd(n,0);break}if(s[n.nodeName.toLowerCase()]){a.setStartBefore(n),a.setEndBefore(n);break}o=n,n=e.next()}n||(a.setStart(o,0),a.setEnd(o,0))}else Do(t)?t.nextSibling&&r.isBlock(t.nextSibling)?(a.setStartBefore(t),a.setEndBefore(t)):(a.setStartAfter(t),a.setEndAfter(t)):(a.setStart(t,0),a.setEnd(t,0));e.selection.setRng(a),Im(e,a)},CS=e=>M.from(e.dom.getParent(e.selection.getStart(!0),e.dom.isBlock)),xS=(e,t)=>e&&e.parentNode&&e.parentNode.nodeName===t,wS=e=>e&&/^(OL|UL|LI)$/.test(e.nodeName),kS=e=>{const t=e.parentNode;return/^(LI|DT|DD)$/.test(t.nodeName)?t:e},SS=(e,t,n)=>{let o=e[n?"firstChild":"lastChild"];for(;o&&!yo(o);)o=o[n?"nextSibling":"previousSibling"];return o===t},_S=(e,t)=>t&&"A"===t.nodeName&&e.isEmpty(t),ES=e=>{e.innerHTML='<br data-mce-bogus="1">'},NS=(e,t)=>e.nodeName===t||e.previousSibling&&e.previousSibling.nodeName===t,RS=(e,t)=>t&&e.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&!/^(fixed|absolute)/i.test(t.style.position)&&"true"!==e.getContentEditable(t),AS=(e,t,n)=>!1===No(t)?n:e?1===n&&t.data.charAt(n-1)===ur?0:n:n===t.data.length-1&&t.data.charAt(n)===ur?t.data.length:n,OS=(e,t)=>{const n=e.getRoot();let o,r;for(o=t;o!==n&&"false"!==e.getContentEditable(o);)"true"===e.getContentEditable(o)&&(r=o),o=o.parentNode;return o!==n?r:n},TS=(e,t)=>{Di(e).toLowerCase()===t.tagName.toLowerCase()&&((e,t,n)=>{const o=e.dom;M.from(n.style).map(o.parseStyle).each((e=>{const n={...Kn(mn(t)),...e};o.setStyles(t,n)}));const r=M.from(n.class).map((e=>e.split(/\s+/))),s=M.from(t.className).map((e=>K(e.split(/\s+/),(e=>""!==e))));Lt(r,s,((e,n)=>{const r=K(n,(t=>!j(e,t))),s=[...e,...r];o.setAttrib(t,"class",s.join(" "))}));const a=["style","class"],i=ve(n,((e,t)=>!j(a,t)));o.setAttribs(t,i)})(e,t,Li(e))},BS=(e,t)=>{let n,o,r,s,a,i,l,d,c;const u=e.dom,m=e.schema,f=m.getNonEmptyElements(),g=e.selection.getRng(),p=Di(e),h=t=>{let n,r,a,i=o;const l=m.getTextInlineElements();if(n=t||"TABLE"===d||"HR"===d?u.create(t||p):s.cloneNode(!1),a=n,!1===Ii(e))u.setAttrib(n,"style",null),u.setAttrib(n,"class",null);else do{if(l[i.nodeName]){if(hc(i)||Nc(i))continue;r=i.cloneNode(!1),u.setAttrib(r,"id",""),n.hasChildNodes()?(r.appendChild(n.firstChild),n.appendChild(r)):(a=r,n.appendChild(r))}}while((i=i.parentNode)&&i!==x);return TS(e,n),ES(a),n},b=e=>{let t,n;const a=AS(e,o,r);if(No(o)&&(e?a>0:a<o.nodeValue.length))return!1;if(o.parentNode===s&&c&&!e)return!0;if(e&&yo(o)&&o===s.firstChild)return!0;if(NS(o,"TABLE")||NS(o,"HR"))return c&&!e||!c&&e;const i=new Xo(o,s);for(No(o)&&(e&&0===a?i.prev():e||a!==o.nodeValue.length||i.next());t=i.current();){if(yo(t)){if(!t.getAttribute("data-mce-bogus")&&(n=t.nodeName.toLowerCase(),f[n]&&"br"!==n))return!1}else if(No(t)&&!Fr(t.nodeValue))return!1;e?i.prev():i.next()}return!0},v=()=>{a=/^(H[1-6]|PRE|FIGURE)$/.test(d)&&"HGROUP"!==w?h(p):h(),Fi(e)&&RS(u,l)&&u.isEmpty(s)?a=u.split(l,s):u.insertAfter(a,s),yS(e,a)};gm(u,g).each((e=>{g.setStart(e.startContainer,e.startOffset),g.setEnd(e.endContainer,e.endOffset)})),o=g.startContainer,r=g.startOffset;const y=!(!t||!t.shiftKey),C=!(!t||!t.ctrlKey);yo(o)&&o.hasChildNodes()&&(c=r>o.childNodes.length-1,o=o.childNodes[Math.min(r,o.childNodes.length-1)]||o,r=c&&No(o)?o.nodeValue.length:0);const x=OS(u,o);if(!x)return;y||(o=((e,t,n,o,r)=>{let s,a,i,l,d,c;const u=e.dom,m=OS(u,o);if(a=u.getParent(o,u.isBlock),!a||!RS(u,a)){if(a=a||m,c=a===e.getBody()||(e=>e&&/^(TD|TH|CAPTION)$/.test(e.nodeName))(a)?a.nodeName.toLowerCase():a.parentNode.nodeName.toLowerCase(),!a.hasChildNodes())return s=u.create(t),TS(e,s),a.appendChild(s),n.setStart(s,0),n.setEnd(s,0),s;for(l=o;l.parentNode!==a;)l=l.parentNode;for(;l&&!u.isBlock(l);)i=l,l=l.previousSibling;if(i&&e.schema.isValidChild(c,t.toLowerCase())){for(s=u.create(t),TS(e,s),i.parentNode.insertBefore(s,i),l=i;l&&!u.isBlock(l);)d=l.nextSibling,s.appendChild(l),l=d;n.setStart(o,r),n.setEnd(o,r)}}return o})(e,p,g,o,r)),s=u.getParent(o,u.isBlock),l=s?u.getParent(s.parentNode,u.isBlock):null,d=s?s.nodeName.toUpperCase():"";const w=l?l.nodeName.toUpperCase():"";"LI"!==w||C||(s=l,l=l.parentNode,d=w),/^(LI|DT|DD)$/.test(d)&&u.isEmpty(s)?((e,t,n,o,r)=>{const s=e.dom,a=e.selection.getRng();if(n===e.getBody())return;var i;wS(i=n)&&wS(i.parentNode)&&(r="LI");let l=t(r);if(SS(n,o,!0)&&SS(n,o,!1))if(xS(n,"LI")){const e=kS(n);s.insertAfter(l,e),(e=>{var t;return(null===(t=e.parentNode)||void 0===t?void 0:t.firstChild)===e})(n)?s.remove(e):s.remove(n)}else s.replace(l,n);else if(SS(n,o,!0))xS(n,"LI")?(s.insertAfter(l,kS(n)),l.appendChild(s.doc.createTextNode(" ")),l.appendChild(n)):n.parentNode.insertBefore(l,n),s.remove(o);else if(SS(n,o,!1))s.insertAfter(l,kS(n)),s.remove(o);else{n=kS(n);const e=a.cloneRange();e.setStartAfter(o),e.setEndAfter(n);const t=e.extractContents();"LI"===r&&((e,t)=>e.firstChild&&"LI"===e.firstChild.nodeName)(t)?(l=t.firstChild,s.insertAfter(t,n)):(s.insertAfter(t,n),s.insertAfter(l,n)),s.remove(o)}yS(e,l)})(e,h,l,s,p):s!==e.getBody()&&(hr(s)?(a=Sr(s),u.isEmpty(s)&&ES(s),TS(e,a),yS(e,a)):b()?v():b(!0)?(a=s.parentNode.insertBefore(h(),s),yS(e,NS(s,"HR")?a:s)):(n=(e=>{const t=e.cloneRange();return t.setStart(e.startContainer,AS(!0,e.startContainer,e.startOffset)),t.setEnd(e.endContainer,AS(!1,e.endContainer,e.endOffset)),t})(g).cloneRange(),n.setEndAfter(s),i=n.extractContents(),(e=>{$(Qs(mn(e),zt),(e=>{const t=e.dom;t.nodeValue=fr(t.nodeValue)}))})(i),(e=>{do{No(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild}while(e)})(i),a=i.firstChild,u.insertAfter(i,s),((e,t,n)=>{let o=n;const r=[];let s;if(o){for(;o=o.firstChild;){if(e.isBlock(o))return;yo(o)&&!t[o.nodeName.toLowerCase()]&&r.push(o)}for(s=r.length;s--;)o=r[s],(!o.hasChildNodes()||o.firstChild===o.lastChild&&""===o.firstChild.nodeValue||_S(e,o))&&e.remove(o)}})(u,f,a),((e,t)=>{t.normalize();const n=t.lastChild;n&&!/^(left|right)$/gi.test(e.getStyle(n,"float",!0))||e.add(t,"br")})(u,s),u.isEmpty(s)&&ES(s),a.normalize(),u.isEmpty(a)?(u.remove(a),v()):(TS(e,a),yS(e,a))),u.setAttrib(a,"id",""),e.dispatch("NewBlock",{newBlock:a}))},DS=(e,t,n)=>{const o=e.dom.createRng();n?(o.setStartBefore(t),o.setEndBefore(t)):(o.setStartAfter(t),o.setEndAfter(t)),e.selection.setRng(o),Im(e,o)},LS=(e,t)=>{const n=cn("br");Yn(mn(t),n),e.undoManager.add()},PS=(e,t)=>{MS(e.getBody(),t)||Xn(mn(t),cn("br"));const n=cn("br");Xn(mn(t),n),DS(e,n.dom,!1),e.undoManager.add()},MS=(e,t)=>{return n=ja.after(t),!!Do(n.getNode())||uc(e,ja.after(t)).map((e=>Do(e.getNode()))).getOr(!1);var n},IS=e=>e&&"A"===e.nodeName&&"href"in e,FS=e=>e.fold(L,IS,IS,L),US=(e,t)=>{t.fold(S,O(LS,e),O(PS,e),S)},zS=(e,t)=>{const n=(e=>{const t=O(Ly,e),n=ja.fromRangeStart(e.selection.getRng());return zC(t,e.getBody(),n).filter(FS)})(e);n.isSome()?n.each(O(US,e)):((e,t)=>{const n=e.selection,o=e.dom,r=n.getRng();let s,a;gm(o,r).each((e=>{r.setStart(e.startContainer,e.startOffset),r.setEnd(e.endContainer,e.endOffset)}));let i=r.startOffset,l=r.startContainer;if(1===l.nodeType&&l.hasChildNodes()){const e=i>l.childNodes.length-1;l=l.childNodes[Math.min(i,l.childNodes.length-1)]||l,i=e&&3===l.nodeType?l.nodeValue.length:0}let d=o.getParent(l,o.isBlock);const c=d?o.getParent(d.parentNode,o.isBlock):null,u=c?c.nodeName.toUpperCase():"",m=!(!t||!t.ctrlKey);"LI"!==u||m||(d=c),l&&3===l.nodeType&&i>=l.nodeValue.length&&(((e,t,n)=>{const o=new Xo(t,n);let r;const s=e.getNonEmptyElements();for(;r=o.next();)if(s[r.nodeName.toLowerCase()]||r.length>0)return!0})(e.schema,l,d)||(s=o.create("br"),r.insertNode(s),r.setStartAfter(s),r.setEndAfter(s),a=!0)),s=o.create("br"),Ha(o,r,s),DS(e,s,a),e.undoManager.add()})(e,t)},jS=(e,t)=>CS(e).filter((e=>t.length>0&&pn(mn(e),t))).isSome(),VS=mi([{br:[]},{block:[]},{none:[]}]),HS=(e,t)=>(e=>jS(e,Mi(e)))(e),$S=e=>(t,n)=>(e=>CS(e).filter((e=>rr(mn(e)))).isSome())(t)===e,qS=(e,t)=>(n,o)=>{const r=(e=>CS(e).fold(N(""),(e=>e.nodeName.toUpperCase())))(n)===e.toUpperCase();return r===t},WS=e=>qS("pre",e),KS=e=>(t,n)=>Bi(t)===e,GS=(e,t)=>(e=>jS(e,Pi(e)))(e),YS=(e,t)=>t,XS=e=>{const t=Di(e),n=((e,t)=>{const n=e.getRoot();let o,r;for(o=t;o!==n&&"false"!==e.getContentEditable(o);)"true"===e.getContentEditable(o)&&(r=o),o=o.parentNode;return o!==n?r:n})(e.dom,e.selection.getStart());return n&&e.schema.isValidChild(n.nodeName,t)},QS=(e,t)=>(n,o)=>Y(e,((e,t)=>e&&t(n,o)),!0)?M.some(t):M.none(),JS=(e,t)=>{((e,t)=>OC([QS([HS],VS.none()),QS([qS("summary",!0)],VS.br()),QS([WS(!0),KS(!1),YS],VS.br()),QS([WS(!0),KS(!1)],VS.block()),QS([WS(!0),KS(!0),YS],VS.block()),QS([WS(!0),KS(!0)],VS.br()),QS([$S(!0),YS],VS.br()),QS([$S(!0)],VS.block()),QS([GS],VS.br()),QS([YS],VS.br()),QS([XS],VS.block())],[e,!(!t||!t.shiftKey)]).getOr(VS.none()))(e,t).fold((()=>{C(t)&&vS(e,"insertLineBreak").isDefaultPrevented()||(zS(e,t),C(t)&&bS(e,"insertLineBreak"))}),(()=>{C(t)&&vS(e,"insertParagraph").isDefaultPrevented()||(BS(e,t),C(t)&&bS(e,"insertParagraph"))}),S)},ZS=Ct(),e_=e=>e.stopImmediatePropagation(),t_=e=>e.keyCode===ju.PAGE_UP||e.keyCode===ju.PAGE_DOWN,n_=(e,t,n)=>{n&&!e.get()?t.on("NodeChange",e_,!0):!n&&e.get()&&t.off("NodeChange",e_),e.set(n)},o_=(e,t)=>{const n=t.container(),o=t.offset();return No(n)?(n.insertData(o,e),M.some(ja(n,o+e.length))):Hd(t).map((n=>{const o=un(e);return t.isAtEnd()?Xn(n,o):Yn(n,o),ja(o.dom,e.length)}))},r_=O(o_,dr),s_=O(o_," "),a_=(e,t)=>n=>((e,t)=>!vg(t)&&(((e,t)=>((e,t)=>mc(e.dom,t).isNone())(e,t)||((e,t)=>uc(e.dom,t).isNone())(e,t)||rg(e,t)||sg(e,t)||ug(e,t)||cg(e,t))(e,t)||hg(e,t)||bg(e,t)))(e,n)?r_(t):s_(t),i_=e=>{const t=ja.fromRangeStart(e.selection.getRng()),n=mn(e.getBody());if(e.selection.isCollapsed()){const o=O(Ly,e),r=ja.fromRangeStart(e.selection.getRng());return zC(o,e.getBody(),r).bind((e=>t=>t.fold((t=>mc(e.dom,ja.before(t))),(e=>fc(e)),(e=>gc(e)),(t=>uc(e.dom,ja.after(t)))))(n)).map((o=>()=>a_(n,t)(o).each((e=>t=>(e.selection.setRng(t.toRange()),e.nodeChanged(),!0))(e))))}return M.none()},l_=e=>od(e)?[{keyCode:ju.TAB,action:bw(Ww,e,!0)},{keyCode:ju.TAB,shiftKey:!0,action:bw(Ww,e,!1)}]:[],d_=e=>{if(e.addShortcut("Meta+P","","mcePrint"),pS(e),Nv(e))return Vs(null);{const t=Ox(e);return(e=>{e.on("keyup compositionstart",O(aw,e))})(e),((e,t)=>{e.on("keydown",(n=>{!1===n.isDefaultPrevented()&&((e,t,n)=>{const o=Ct().os;vw([{keyCode:ju.RIGHT,action:bw(dw,e,!0)},{keyCode:ju.LEFT,action:bw(dw,e,!1)},{keyCode:ju.UP,action:bw(cw,e,!1)},{keyCode:ju.DOWN,action:bw(cw,e,!0)},{keyCode:ju.RIGHT,action:bw(jw,e,!0)},{keyCode:ju.LEFT,action:bw(jw,e,!1)},{keyCode:ju.UP,action:bw(Vw,e,!1)},{keyCode:ju.DOWN,action:bw(Vw,e,!0)},{keyCode:ju.RIGHT,action:bw(Cw,e,!0)},{keyCode:ju.LEFT,action:bw(Cw,e,!1)},{keyCode:ju.UP,action:bw(xw,e,!1)},{keyCode:ju.DOWN,action:bw(xw,e,!0)},{keyCode:ju.RIGHT,action:bw(Rx,e,t,!0)},{keyCode:ju.LEFT,action:bw(Rx,e,t,!1)},{keyCode:ju.RIGHT,ctrlKey:!o.isMacOS(),altKey:o.isMacOS(),action:bw(Tx,e,t)},{keyCode:ju.LEFT,ctrlKey:!o.isMacOS(),altKey:o.isMacOS(),action:bw(Bx,e,t)},{keyCode:ju.UP,action:bw(gw,e,!1)},{keyCode:ju.DOWN,action:bw(gw,e,!0)}],n).each((e=>{n.preventDefault()}))})(e,t,n)}))})(e,t),((e,t)=>{e.on("keydown",(n=>{!1===n.isDefaultPrevented()&&((e,t,n)=>{const o=n.keyCode===ju.BACKSPACE?"deleteContentBackward":"deleteContentForward";yw([{keyCode:ju.BACKSPACE,action:bw(Yx,e)},{keyCode:ju.BACKSPACE,action:bw(vC,e,!1)},{keyCode:ju.DELETE,action:bw(vC,e,!0)},{keyCode:ju.BACKSPACE,action:bw(mC,e,!1)},{keyCode:ju.DELETE,action:bw(mC,e,!0)},{keyCode:ju.BACKSPACE,action:bw(Mx,e,t,!1)},{keyCode:ju.DELETE,action:bw(Mx,e,t,!0)},{keyCode:ju.BACKSPACE,action:bw(lp,e,!1)},{keyCode:ju.DELETE,action:bw(lp,e,!0)},{keyCode:ju.BACKSPACE,action:bw(yC,e,!1)},{keyCode:ju.DELETE,action:bw(yC,e,!0)},{keyCode:ju.BACKSPACE,action:bw(jx,e,!1)},{keyCode:ju.DELETE,action:bw(jx,e,!0)},{keyCode:ju.BACKSPACE,action:bw(oC,e,!1)},{keyCode:ju.DELETE,action:bw(oC,e,!0)},{keyCode:ju.BACKSPACE,action:bw(eC,e,!1)},{keyCode:ju.DELETE,action:bw(eC,e,!0)},{keyCode:ju.BACKSPACE,action:bw(Ux,e,!1)},{keyCode:ju.DELETE,action:bw(Ux,e,!0)}],n).each((t=>{n.preventDefault(),vS(e,o).isDefaultPrevented()||(t(),bS(e,o))}))})(e,t,n)})),e.on("keyup",(t=>{!1===t.isDefaultPrevented()&&((e,t)=>{vw([{keyCode:ju.BACKSPACE,action:bw(bC,e)},{keyCode:ju.DELETE,action:bw(bC,e)}],t)})(e,t)}))})(e,t),(e=>{e.on("keydown",(t=>{t.keyCode===ju.ENTER&&((e,t)=>{var n;t.isDefaultPrevented()||(t.preventDefault(),(n=e.undoManager).typing&&(n.typing=!1,n.add()),e.undoManager.transact((()=>{!1===e.selection.isCollapsed()&&zy(e),JS(e,t)})))})(e,t)}))})(e),(e=>{e.on("keydown",(t=>{!1===t.isDefaultPrevented()&&((e,t)=>{yw([{keyCode:ju.SPACEBAR,action:bw(i_,e)}],t).each((n=>{t.preventDefault(),vS(e,"insertText",{data:" "}).isDefaultPrevented()||(n(),bS(e,"insertText",{data:" "}))}))})(e,t)}))})(e),(e=>{e.on("input",(t=>{!1===t.isComposing&&(e=>{const t=mn(e.getBody());e.selection.isCollapsed()&&Sg(t,ja.fromRangeStart(e.selection.getRng())).each((t=>{e.selection.setRng(t.toRange())}))})(e)}))})(e),(e=>{e.on("keydown",(t=>{!1===t.isDefaultPrevented()&&((e,t)=>{vw([...l_(e)],t).each((e=>{t.preventDefault()}))})(e,t)}))})(e),((e,t)=>{e.on("keydown",(n=>{!1===n.isDefaultPrevented()&&((e,t,n)=>{vw([{keyCode:ju.END,action:bw(uw,e,!0)},{keyCode:ju.HOME,action:bw(uw,e,!1)},{keyCode:ju.END,action:bw(ww,e,!0)},{keyCode:ju.HOME,action:bw(ww,e,!1)},{keyCode:ju.END,action:bw(Dx,e,!0,t)},{keyCode:ju.HOME,action:bw(Dx,e,!1,t)}],n).each((e=>{n.preventDefault()}))})(e,t,n)}))})(e,t),((e,t)=>{if(ZS.os.isMacOS())return;const n=Vs(!1);e.on("keydown",(t=>{t_(t)&&n_(n,e,!0)})),e.on("keyup",(o=>{!1===o.isDefaultPrevented()&&((e,t,n)=>{vw([{keyCode:ju.PAGE_UP,action:bw(Dx,e,!1,t)},{keyCode:ju.PAGE_DOWN,action:bw(Dx,e,!0,t)}],n)})(e,t,o),t_(o)&&n.get()&&(n_(n,e,!1),e.nodeChanged())}))})(e,t),t}};class c_{constructor(e){let t;this.lastPath=[],this.editor=e;const n=this;"onselectionchange"in e.getDoc()||e.on("NodeChange click mouseup keyup focus",(n=>{const o=e.selection.getRng(),r={startContainer:o.startContainer,startOffset:o.startOffset,endContainer:o.endContainer,endOffset:o.endOffset};"nodechange"!==n.type&&sm(r,t)||e.dispatch("SelectionChange"),t=r})),e.on("contextmenu",(()=>{e.dispatch("SelectionChange")})),e.on("SelectionChange",(()=>{const t=e.selection.getStart(!0);t&&Su(e)&&!n.isSameElementPath(t)&&e.dom.isChildOf(t,e.getBody())&&e.nodeChanged({selectionChange:!0})})),e.on("mouseup",(t=>{!t.isDefaultPrevented()&&Su(e)&&("IMG"===e.selection.getNode().nodeName?Xm.setEditorTimeout(e,(()=>{e.nodeChanged()})):e.nodeChanged())}))}nodeChanged(e){const t=this.editor.selection;let n,o,r;this.editor.initialized&&t&&!_l(this.editor)&&!this.editor.mode.isReadOnly()&&(r=this.editor.getBody(),n=t.getStart(!0)||r,n.ownerDocument===this.editor.getDoc()&&this.editor.dom.isChildOf(n,r)||(n=r),o=[],this.editor.dom.getParent(n,(e=>{if(e===r)return!0;o.push(e)})),(e=e||{}).element=n,e.parents=o,this.editor.dispatch("NodeChange",e))}isSameElementPath(e){let t;const n=this.editor,o=ne(n.dom.getParents(e,P,n.getBody()));if(o.length===this.lastPath.length){for(t=o.length;t>=0&&o[t]===this.lastPath[t];t--);if(-1===t)return this.lastPath=o,!0}return this.lastPath=o,!1}}const u_=N("x-tinymce/html"),m_="\x3c!-- x-tinymce/html --\x3e",f_=e=>m_+e,g_=e=>-1!==e.indexOf(m_),p_="%MCEPASTEBIN%",h_=e=>e.dom.get("mcepastebin"),b_=e=>e&&"mcepastebin"===e.id,v_=e=>e===p_,y_=(e,t)=>(Bt.each(t,(t=>{e=u(t,RegExp)?e.replace(t,""):e.replace(t[0],t[1])})),e),C_=e=>y_(e,[/^[\s\S]*<body[^>]*>\s*|\s*<\/body[^>]*>[\s\S]*$/gi,/<!--StartFragment-->|<!--EndFragment-->/g,[/( ?)<span class="Apple-converted-space">\u00a0<\/span>( ?)/g,(e,t,n)=>t||n?dr:" "],/<br class="Apple-interchange-newline">/g,/<br>$/i]),x_=(e,t)=>({content:e,cancelled:t}),w_=(e,t)=>(e.insertContent(t,{merge:Kl(e),paste:!0}),!0),k_=e=>/^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(e),S_=(e,t,n)=>!(e.selection.isCollapsed()||!k_(t))&&((e,t,n)=>(e.undoManager.extra((()=>{n(e,t)}),(()=>{e.execCommand("mceInsertLink",!1,t)})),!0))(e,t,n),__=(e,t,n)=>!!((e,t)=>k_(t)&&V(nd(e),(e=>je(t.toLowerCase(),`.${e.toLowerCase()}`))))(e,t)&&((e,t,n)=>(e.undoManager.extra((()=>{n(e,t)}),(()=>{e.insertContent('<img src="'+t+'">')})),!0))(e,t,n),E_=(e=>{let t=0;return()=>"mceclip"+t++})(),N_=(e,t,n,o)=>{const r=((e,t,n)=>((e,t,n)=>{const o=((e,t,n)=>e.dispatch("PastePreProcess",{content:t,internal:n}))(e,t,n),r=((e,t)=>{const n=Gb({},e.schema);n.addNodeFilter("meta",(e=>{Bt.each(e,(e=>{e.remove()}))}));const o=n.parse(t,{forced_root_block:!1,isRootContent:!0});return Of({validate:!0},e.schema).serialize(o)})(e,o.content);return e.hasEventListeners("PastePostProcess")&&!o.isDefaultPrevented()?((e,t,n)=>{const o=e.dom.create("div",{style:"display:none"},t),r=((e,t,n)=>e.dispatch("PastePostProcess",{node:t,internal:n}))(e,o,n);return x_(r.node.innerHTML,r.isDefaultPrevented())})(e,r,n):x_(r,o.isDefaultPrevented())})(e,t,n))(e,t,n);!1===r.cancelled&&((e,t,n)=>{n||!Gl(e)?w_(e,t):((e,t)=>{Bt.each([S_,__,w_],(n=>!0!==n(e,t,w_)))})(e,t)})(e,r.content,o)},R_=(e,t,n)=>{const o=n||g_(t);N_(e,(e=>e.replace(m_,""))(t),o,!1)},A_=(e,t)=>{const n=e.dom.encode(t).replace(/\r\n/g,"\n"),o=((e,t,n)=>{const o=e.split(/\n\n/),r=((e,t)=>{let n="<"+e;const o=ye(t,((e,t)=>t+'="'+ls.encodeAllRaw(e)+'"'));return o.length&&(n+=" "+o.join(" ")),n+">"})(t,n),s="</"+t+">",a=H(o,(e=>e.split(/\n/).join("<br />")));return 1===a.length?a[0]:H(a,(e=>r+e+s)).join("")})(zr(n,Xl(e)),Di(e),Li(e));N_(e,o,!1,!0)},O_=e=>{const t={};if(e&&e.types)for(let n=0;n<e.types.length;n++){const o=e.types[n];try{t[o]=e.getData(o)}catch(e){t[o]=""}}return t},T_=(e,t)=>t in e&&e[t].length>0,B_=e=>T_(e,"text/html")||T_(e,"text/plain"),D_=(e,t,n)=>{const o="paste"===t.type?t.clipboardData:t.dataTransfer;var r;if(Vl(e)&&o){const s=((e,t)=>{const n=t.items?ee(de(t.items),(e=>"file"===e.kind?[e.getAsFile()]:[])):[],o=t.files?de(t.files):[];return K(n.length>0?n:o,(e=>{const t=nd(e);return e=>ze(e.type,"image/")&&V(t,(t=>(e=>{const t=e.toLowerCase(),n={jpg:"jpeg",jpe:"jpeg",jfi:"jpeg",jif:"jpeg",jfif:"jpeg",pjpeg:"jpeg",pjp:"jpeg",svg:"svg+xml"};return Bt.hasOwn(n,t)?"image/"+n[t]:"image/"+t})(t)===e.type))})(e))})(e,o);if(s.length>0)return t.preventDefault(),(r=s,Promise.all(H(r,(e=>Ab(e).then((t=>({file:e,uri:t}))))))).then((t=>{n&&e.selection.setRng(n),$(t,(t=>{((e,t)=>{const{data:n,type:o}=Eb(t.uri),r=t.file,s=e.editorUpload.blobCache,a=s.getByData(n,o),i=null!=a?a:((e,t,n,o)=>{const r=E_(),s=zi(e)&&C(n.name),a=s?((e,t)=>{const n=t.match(/([\s\S]+?)(?:\.[a-z0-9.]+)$/i);return C(n)?e.dom.encode(n[1]):null})(e,n.name):r,i=s?n.name:void 0,l=t.create(r,n,o,a,i);return t.add(l),l})(e,s,r,n);R_(e,`<img src="${i.blobUri()}">`,!1)})(e,t)}))})),!0}return!1},L_=(e,t,n,o)=>{let r=C_(n);const s=T_(t,u_())||g_(n),a=!s&&(e=>!/<(?:\/?(?!(?:div|p|br|span)>)\w+|(?:(?!(?:span style="white-space:\s?pre;?">)|br\s?\/>))\w+\s[^>]+)>/i.test(e))(r),i=k_(r);(v_(r)||!r.length||a&&!i)&&(o=!0),(o||i)&&(r=T_(t,"text/plain")&&a?t["text/plain"]:(e=>{const t=Cs(),n=Gb({},t);let o="";const r=t.getVoidElements(),s=Bt.makeMap("script noscript style textarea video audio iframe object"," "),a=t.getBlockElements(),i=e=>{const n=e.name,l=e;if("br"!==n){if("wbr"!==n)if(r[n]&&(o+=" "),s[n])o+=" ";else{if(3===e.type&&(o+=e.value),!(e.name in t.getVoidElements())&&(e=e.firstChild))do{i(e)}while(e=e.next);a[n]&&l.next&&(o+="\n","p"===n&&(o+="\n"))}}else o+="\n"};return e=y_(e,[/<!\[[^\]]+\]>/g]),i(n.parse(e)),o})(r)),v_(r)||(o?A_(e,r):R_(e,r,s))},P_=(e,t,n)=>{((e,t,n)=>{let o;e.on("keydown",(e=>{(e=>ju.metaKeyPressed(e)&&86===e.keyCode||e.shiftKey&&45===e.keyCode)(e)&&!e.isDefaultPrevented()&&(o=e.shiftKey&&86===e.keyCode)})),e.on("paste",(r=>{if(r.isDefaultPrevented()||(e=>{var t,n;return Nt.os.isAndroid()&&0===(null===(n=null===(t=e.clipboardData)||void 0===t?void 0:t.items)||void 0===n?void 0:n.length)})(r))return;const s="text"===n.get()||o;o=!1;const a=O_(r.clipboardData);!B_(a)&&D_(e,r,t.getLastRng()||e.selection.getRng())||(T_(a,"text/html")?(r.preventDefault(),L_(e,a,a["text/html"],s)):(t.create(),Xm.setEditorTimeout(e,(()=>{const n=t.getHtml();t.remove(),L_(e,a,n,s)}),0)))}))})(e,t,n),(e=>{const t=e=>ze(e,"webkit-fake-url"),n=e=>ze(e,"data:");e.parser.addNodeFilter("img",((o,r,s)=>{if(!Vl(e)&&(e=>{var t;return!0===(null===(t=e.data)||void 0===t?void 0:t.paste)})(s))for(const r of o){const o=r.attr("src");m(o)&&!r.attr("data-mce-object")&&o!==Nt.transparentSrc&&(t(o)||!Ql(e)&&n(o))&&r.remove()}}))})(e)},M_=(e,t,n,o)=>{((e,t,n)=>{try{return e.clearData(),e.setData("text/html",t),e.setData("text/plain",n),e.setData(u_(),t),!0}catch(e){return!1}})(e.clipboardData,t.html,t.text)?(e.preventDefault(),o()):n(t.html,o)},I_=e=>(t,n)=>{const{dom:o,selection:r}=e,s=o.create("div",{contenteditable:"false","data-mce-bogus":"all"}),a=o.create("div",{contenteditable:"true"},t);o.setStyles(s,{position:"fixed",top:"0",left:"-3000px",width:"1000px",overflow:"hidden"}),s.appendChild(a),o.add(e.getBody(),s);const i=r.getRng();a.focus();const l=o.createRng();l.selectNodeContents(a),r.setRng(l),Xm.setEditorTimeout(e,(()=>{r.setRng(i),o.remove(s),n()}),0)},F_=e=>({html:f_(e.selection.getContent({contextual:!0})),text:e.selection.getContent({format:"text"})}),U_=e=>!e.selection.isCollapsed()||(e=>!!e.dom.getParent(e.selection.getStart(),"td[data-mce-selected],th[data-mce-selected]",e.getBody()))(e),z_=(e,t)=>{var n,o;return bm.getCaretRangeFromPoint(null!==(n=t.clientX)&&void 0!==n?n:0,null!==(o=t.clientY)&&void 0!==o?o:0,e.getDoc())},j_=(e,t)=>{e.focus(),t&&e.selection.setRng(t)},V_=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,H_=e=>Bt.trim(e).replace(V_,Ic).toLowerCase(),$_=(e,t,n)=>{const o=ql(e);if(n||"all"===o||!Wl(e))return t;const r=o?o.split(/[, ]/):[];if(r&&"none"!==o){const n=e.dom,o=e.selection.getNode();t=t.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,((e,t,s,a)=>{const i=n.parseStyle(n.decode(s)),l={};for(let e=0;e<r.length;e++){const t=i[r[e]];let s=t,a=n.getStyle(o,r[e],!0);/color/.test(r[e])&&(s=H_(s),a=H_(a)),a!==s&&(l[r[e]]=t)}const d=n.serializeStyle(l,"span");return d?t+' style="'+d+'"'+a:t+a}))}else t=t.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,"$1$3");return t=t.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi,((e,t,n,o)=>t+' style="'+n+'"'+o)),t},q_=e=>{const t=Vs(!1),n=Vs(Yl(e)?"text":"html"),o=(e=>{const t=Vs(null);return{create:()=>((e,t)=>{const{dom:n,selection:o}=e,r=e.getBody();t.set(o.getRng());const s=n.add(e.getBody(),"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"},p_);Nt.browser.isFirefox()&&n.setStyle(s,"left","rtl"===n.getStyle(r,"direction",!0)?65535:-65535),n.bind(s,"beforedeactivate focusin focusout",(e=>{e.stopPropagation()})),s.focus(),o.select(s,!0)})(e,t),remove:()=>((e,t)=>{const n=e.dom;if(h_(e)){let o;const r=t.get();for(;o=h_(e);)n.remove(o),n.unbind(o);r&&e.selection.setRng(r)}t.set(null)})(e,t),getEl:()=>h_(e),getHtml:()=>(e=>{const t=e.dom,n=(e,n)=>{e.appendChild(n),t.remove(n,!0)},[o,...r]=K(e.getBody().childNodes,b_);$(r,(e=>{n(o,e)}));const s=t.select("div[id=mcepastebin]",o);for(let e=s.length-1;e>=0;e--){const r=t.create("div");o.insertBefore(r,s[e]),n(r,s[e])}return o?o.innerHTML:""})(e),getLastRng:t.get}})(e);(e=>{(Nt.browser.isChromium()||Nt.browser.isSafari())&&((e,t)=>{e.on("PastePreProcess",(n=>{n.content=t(e,n.content,n.internal)}))})(e,$_)})(e),((e,t)=>{e.addCommand("mceTogglePlainTextPaste",(()=>{((e,t)=>{"text"===t.get()?(t.set("html"),zu(e,!1)):(t.set("text"),zu(e,!0)),e.focus()})(e,t)})),e.addCommand("mceInsertClipboardContent",((t,n)=>{n.html&&R_(e,n.html,n.internal),n.text&&A_(e,n.text)}))})(e,n),(e=>{const t=t=>n=>{t(e,n)},n=Hl(e);x(n)&&e.on("PastePreProcess",t(n));const o=$l(e);x(o)&&e.on("PastePostProcess",t(o))})(e),e.on("PreInit",(()=>{(e=>{e.on("cut",(e=>t=>{!t.isDefaultPrevented()&&U_(e)&&M_(t,F_(e),I_(e),(()=>{if(Nt.browser.isChromium()||Nt.browser.isFirefox()){const t=e.selection.getRng();Xm.setEditorTimeout(e,(()=>{e.selection.setRng(t),e.execCommand("Delete")}),0)}else e.execCommand("Delete")}))})(e)),e.on("copy",(e=>t=>{!t.isDefaultPrevented()&&U_(e)&&M_(t,F_(e),I_(e),S)})(e))})(e),((e,t)=>{jl(e)&&e.on("dragend dragover draggesture dragdrop drop drag",(e=>{e.preventDefault(),e.stopPropagation()})),Vl(e)||e.on("drop",(e=>{const t=e.dataTransfer;t&&(e=>V(e.files,(e=>/^image\//.test(e.type))))(t)&&e.preventDefault()})),e.on("drop",(n=>{if(n.isDefaultPrevented()||t.get())return;const o=z_(e,n);if(y(o))return;const r=O_(n.dataTransfer),s=T_(r,u_());if((!B_(r)||(e=>{const t=e["text/plain"];return!!t&&0===t.indexOf("file://")})(r))&&D_(e,n,o))return;const a=r[u_()],i=a||r["text/html"]||r["text/plain"];i&&(n.preventDefault(),Xm.setEditorTimeout(e,(()=>{e.undoManager.transact((()=>{a&&e.execCommand("Delete"),j_(e,o);const t=C_(i);r["text/html"]?R_(e,t,s):A_(e,t)}))})))})),e.on("dragstart",(e=>{t.set(!0)})),e.on("dragover dragend",(n=>{Vl(e)&&!1===t.get()&&(n.preventDefault(),j_(e,z_(e,n))),"dragend"===n.type&&t.set(!1)}))})(e,t),P_(e,o,n)}))},W_=e=>yo(e)&&nr(mn(e));var K_;!function(e){e.Before="before",e.After="after"}(K_||(K_={}));const G_=(e,t)=>Math.abs(e.left-t),Y_=(e,t)=>Math.abs(e.right-t),X_=(e,t)=>(e=>Y(e,((e,t)=>e.fold((()=>M.some(t)),(e=>{const n=Math.min(t.left,e.left),o=Math.min(t.top,e.top),r=Math.max(t.right,e.right),s=Math.max(t.bottom,e.bottom);return M.some({top:o,right:r,bottom:s,left:n,width:r-n,height:s-o})}))),M.none()))(K(e,(e=>{return(n=t)>=(o=e).top&&n<=o.bottom;var n,o}))).fold((()=>[[],e]),(t=>{const{pass:n,fail:o}=W(e,(e=>((e,t)=>{const n=((e,t)=>Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)))(e,t)/Math.min(e.height,t.height);return((e,t)=>e.top<t.bottom&&e.bottom>t.top)(e,t)&&n>.5})(e,t)));return[n,o]})),Q_=(e,t,n)=>t>e.left&&t<e.right?0:Math.min(Math.abs(e.left-t),Math.abs(e.right-t)),J_=(e,t,n)=>{const o=e=>Lr(e.node)?M.some(e):yo(e.node)?J_(de(e.node.childNodes),t,n):M.none(),r=(e,r)=>{const s=se(e,((e,o)=>r(e,t,n)-r(o,t,n)));return((e,r)=>{if(e.length>=2){const s=o(e[0]).getOr(e[0]),a=o(e[1]).getOr(e[1]);if(Math.abs(r(s,t,n)-r(a,t,n))<2){if(No(s.node))return M.some(s);if(No(a.node))return M.some(a)}}return M.none()})(s,r).orThunk((()=>ce(s,o)))},[s,a]=X_(mx(e),n),{pass:i,fail:l}=W(a,(e=>e.top<n));return r(s,Q_).orThunk((()=>r(l,ya))).orThunk((()=>r(i,ya)))},Z_=(e,t,n)=>((e,t,n)=>{const o=mn(e),r=Cn(o),s=fn(r,t,n).filter((e=>vn(o,e))).getOr(o);return((e,t,n,o)=>{const r=(t,s)=>s.fold((()=>J_(de(t.dom.childNodes),n,o)),(e=>{const r=K(de(t.dom.childNodes),(t=>t!==e.dom));return J_(r,n,o)})).orThunk((()=>{var n;return(bn(t,e)?M.none():(n=t,M.from(n.dom.parentElement).map(mn))).bind((e=>r(e,M.some(t))))}));return r(t,M.none())})(o,s,t,n)})(e,t,n).filter((e=>yd(e.node))).map((e=>((e,t)=>({node:e.node,position:G_(e,t)<Y_(e,t)?K_.Before:K_.After}))(e,t))),eE=e=>{const t=e.getBoundingClientRect(),n=e.ownerDocument,o=n.documentElement,r=n.defaultView;return{top:t.top+r.pageYOffset-o.clientTop,left:t.left+r.pageXOffset-o.clientLeft}},tE=Mo,nE=Po,oE=(e,t,n,o)=>{const r=e.dom,s=t.cloneNode(!0);r.setStyles(s,{width:n,height:o}),r.setAttrib(s,"data-mce-selected",null);const a=r.create("div",{class:"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return r.setStyles(a,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:n,height:o}),r.setStyles(s,{margin:0,boxSizing:"border-box"}),a.appendChild(s),a},rE=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)},sE=e=>{e.on((e=>{rE(e.ghost)})),e.clear()},aE=e=>{const t=Gs(),n=Us.DOM,o=document,r=((e,t)=>n=>{if((e=>0===e.button)(n)){const s=Q(t.dom.getParents(n.target),((...e)=>t=>{for(let n=0;n<e.length;n++)if(e[n](t))return!0;return!1})(tE,nE)).getOr(null);if(o=t.getBody(),tE(r=s)&&r!==o){const o=t.dom.getPos(s),r=t.getBody(),a=t.getDoc().documentElement;e.set({element:s,dragging:!1,screenX:n.screenX,screenY:n.screenY,maxX:(t.inline?r.scrollWidth:a.offsetWidth)-2,maxY:(t.inline?r.scrollHeight:a.offsetHeight)-2,relX:n.pageX-o.x,relY:n.pageY-o.y,width:s.offsetWidth,height:s.offsetHeight,ghost:oE(t,s,s.offsetWidth,s.offsetHeight)})}}var o,r})(t,e),s=((e,t)=>{const n=Ys(((e,n)=>{t._selectionOverrides.hideFakeCaret(),t.selection.placeCaretAt(e,n)}),0);return t.on("remove",n.cancel),o=>e.on((e=>{const r=Math.max(Math.abs(o.screenX-e.screenX),Math.abs(o.screenY-e.screenY));if(!e.dragging&&r>10){if(t.dispatch("dragstart",{target:e.element}).isDefaultPrevented())return;e.dragging=!0,t.focus()}if(e.dragging){const r=((e,t)=>({pageX:t.pageX-e.relX,pageY:t.pageY+5}))(e,((e,t)=>{return n=(e=>e.inline?eE(e.getBody()):{left:0,top:0})(e),o=(e=>{const t=e.getBody();return e.inline?{left:t.scrollLeft,top:t.scrollTop}:{left:0,top:0}})(e),r=((e,t)=>{if(t.target.ownerDocument!==e.getDoc()){const n=eE(e.getContentAreaContainer()),o=(e=>{const t=e.getBody(),n=e.getDoc().documentElement,o={left:t.scrollLeft,top:t.scrollTop},r={left:t.scrollLeft||n.scrollLeft,top:t.scrollTop||n.scrollTop};return e.inline?o:r})(e);return{left:t.pageX-n.left+o.left,top:t.pageY-n.top+o.top}}return{left:t.pageX,top:t.pageY}})(e,t),{pageX:r.left-n.left+o.left,pageY:r.top-n.top+o.top};var n,o,r})(t,o));s=e.ghost,a=t.getBody(),s.parentNode!==a&&a.appendChild(s),((e,t,n,o,r,s)=>{let a=0,i=0;e.style.left=t.pageX+"px",e.style.top=t.pageY+"px",t.pageX+n>r&&(a=t.pageX+n-r),t.pageY+o>s&&(i=t.pageY+o-s),e.style.width=n-a+"px",e.style.height=o-i+"px"})(e.ghost,r,e.width,e.height,e.maxX,e.maxY),n.throttle(o.clientX,o.clientY)}var s,a}))})(t,e),a=((e,t)=>n=>{e.on((e=>{if(e.dragging){if(((e,t,n)=>t!==n&&!e.dom.isChildOf(t,n)&&!tE(t))(t,(e=>{const t=e.getSel().getRangeAt(0).startContainer;return 3===t.nodeType?t.parentNode:t})(t.selection),e.element)){const o=(e=>{const t=e.cloneNode(!0);return t.removeAttribute("data-mce-selected"),t})(e.element);t.dispatch("drop",{clientX:n.clientX,clientY:n.clientY}).isDefaultPrevented()||t.undoManager.transact((()=>{rE(e.element),t.insertContent(t.dom.getOuterHTML(o)),t._selectionOverrides.hideFakeCaret()}))}t.dispatch("dragend")}})),sE(e)})(t,e),i=((e,t)=>()=>{e.on((e=>{e.dragging&&t.dispatch("dragend")})),sE(e)})(t,e);e.on("mousedown",r),e.on("mousemove",s),e.on("mouseup",a),n.bind(o,"mousemove",s),n.bind(o,"mouseup",i),e.on("remove",(()=>{n.unbind(o,"mousemove",s),n.unbind(o,"mouseup",i)})),e.on("keydown",(e=>{e.keyCode===ju.ESC&&i()}))},iE=Mo,lE=(e,t)=>dp(e.getBody(),t),dE=e=>{const t=e.selection,n=e.dom,o=n.isBlock,r=e.getBody(),s=hd(e,r,o,(()=>rf(e))),a="sel-"+n.uniqueId(),i="data-mce-selected";let l;const d=e=>e!==r&&(iE(e)||Fo(e))&&n.isChildOf(e,r),c=(n,o,r,a=!0)=>e.dispatch("ShowCaret",{target:o,direction:n,before:r}).isDefaultPrevented()?null:(a&&t.scrollIntoView(o,-1===n),s.show(r,o)),u=e=>vr(e)||wr(e)||kr(e),m=e=>u(e.startContainer)||u(e.endContainer),f=t=>{const o=e.schema.getVoidElements(),r=n.createRng(),s=t.startContainer,a=t.startOffset,i=t.endContainer,l=t.endOffset;return we(o,s.nodeName.toLowerCase())?0===a?r.setStartBefore(s):r.setStartAfter(s):r.setStart(s,a),we(o,i.nodeName.toLowerCase())?0===l?r.setEndBefore(i):r.setEndAfter(i):r.setEnd(i,l),r},g=(o,s)=>{if(!o)return null;if(o.collapsed){if(!m(o)){const e=s?1:-1,t=Vd(e,r,o),n=t.getNode(!s);if(yd(n))return c(e,n,!!s&&!t.isAtEnd(),!1);const a=t.getNode(s);if(yd(a))return c(e,a,!s&&!t.isAtEnd(),!1)}return null}let u=o.startContainer,f=o.startOffset;const g=o.endOffset;if(3===u.nodeType&&0===f&&iE(u.parentNode)&&(u=u.parentNode,f=n.nodeIndex(u),u=u.parentNode),1!==u.nodeType)return null;if(g===f+1&&u===o.endContainer){const o=u.childNodes[f];if(d(o))return(o=>{const r=o.cloneNode(!0),s=e.dispatch("ObjectSelected",{target:o,targetClone:r});if(s.isDefaultPrevented())return null;const d=((o,r)=>{const s=mn(e.getBody()),i=e.getDoc(),l=Wo(s,"#"+a).getOrThunk((()=>{const e=dn('<div data-mce-bogus="all" class="mce-offscreen-selection"></div>',i);return $t(e,"id",a),Jn(s,e),e})),d=n.createRng();eo(l),Zn(l,[un(dr,i),mn(r),un(dr,i)]),d.setStart(l.dom.firstChild,1),d.setEnd(l.dom.lastChild,0),Hn(l,{top:n.getPos(o,e.getBody()).y+"px"}),Fm(l);const c=t.getSel();return c.removeAllRanges(),c.addRange(d),d})(o,s.targetClone),c=mn(o);return $(Js(mn(e.getBody()),"*[data-mce-selected]"),(e=>{bn(c,e)||Yt(e,i)})),n.getAttrib(o,i)||o.setAttribute(i,"1"),l=o,h(),d})(o)}return null},p=()=>{l&&l.removeAttribute(i),Wo(mn(e.getBody()),"#"+a).each(to),l=null},h=()=>{s.hide()};return Nv(e)||(e.on("click",(t=>{const n=lE(e,t.target);n&&iE(n)&&(t.preventDefault(),e.focus())})),e.on("blur NewBlock",p),e.on("ResizeWindow FullscreenStateChanged",s.reposition),e.on("tap",(t=>{const n=t.target,o=lE(e,n);iE(o)?(t.preventDefault(),iC(e,o).each(g)):d(n)&&iC(e,n).each(g)}),!0),e.on("mousedown",(o=>{const s=o.target;if(s!==r&&"HTML"!==s.nodeName&&!n.isChildOf(s,r))return;if(!1===((e,t,n)=>{const o=mn(e.getBody()),r=e.inline?o:mn(Cn(o).dom.documentElement),s=((e,t,n,o)=>{const r=(e=>e.dom.getBoundingClientRect())(t);return{x:n-(e?r.left+t.dom.clientLeft+Zv(t):0),y:o-(e?r.top+t.dom.clientTop+Jv(t):0)}})(e.inline,r,t,n);return((e,t,n)=>{const o=Xv(e),r=Qv(e);return t>=0&&n>=0&&t<=o&&n<=r})(r,s.x,s.y)})(e,o.clientX,o.clientY))return;p(),h();const a=lE(e,s);iE(a)?(o.preventDefault(),iC(e,a).each(g)):Z_(r,o.clientX,o.clientY).each((n=>{var r;o.preventDefault(),(r=c(1,n.node,n.position===K_.Before,!1))&&t.setRng(r),yo(a)?a.focus():e.getBody().focus()}))})),e.on("keypress",(e=>{ju.modifierPressed(e)||iE(t.getNode())&&e.preventDefault()})),e.on("GetSelectionRange",(e=>{let t=e.range;if(l){if(!l.parentNode)return void(l=null);t=t.cloneRange(),t.selectNode(l),e.range=t}})),e.on("SetSelectionRange",(e=>{e.range=f(e.range);const t=g(e.range,e.forward);t&&(e.range=t)})),e.on("AfterSetSelectionRange",(e=>{const t=e.range,o=t.startContainer.parentNode;var r;m(t)||"mcepastebin"===o.id||h(),r=o,n.hasClass(r,"mce-offscreen-selection")||p()})),(e=>{aE(e),Ol(e)&&(e=>{const t=t=>{if(!t.isDefaultPrevented()){const n=t.dataTransfer;n&&(j(n.types,"Files")||n.files.length>0)&&(t.preventDefault(),"drop"===t.type&&sy(e,"Dropped file type is not supported"))}},n=n=>{Zm(e,n.target)&&t(n)},o=()=>{const o=Us.DOM,r=e.dom,s=document,a=e.inline?e.getBody():e.getDoc(),i=["drop","dragover"];$(i,(e=>{o.bind(s,e,n),r.bind(a,e,t)})),e.on("remove",(()=>{$(i,(e=>{o.unbind(s,e,n),r.unbind(a,e,t)}))}))};e.on("init",(()=>{Xm.setEditorTimeout(e,o,0)}))})(e)})(e),(e=>{const t=Ys((()=>{if(!e.removed&&e.getBody().contains(document.activeElement)){const t=e.selection.getRng();if(t.collapsed){const n=lC(e,t,!1);e.selection.setRng(n)}}}),0);e.on("focus",(()=>{t.throttle()})),e.on("blur",(()=>{t.cancel()}))})(e),(e=>{e.on("init",(()=>{e.on("focusin",(t=>{const n=t.target;if(Fo(n)){const t=dp(e.getBody(),n),o=Mo(t)?t:n;e.selection.getNode()!==o&&iC(e,o).each((t=>e.selection.setRng(t)))}}))}))})(e)),{showCaret:c,showBlockCaretContainer:e=>{e.hasAttribute("data-mce-caret")&&(Sr(e),t.scrollIntoView(e))},hideFakeCaret:h,destroy:()=>{s.destroy(),l=null}}},cE=(e,t,n)=>{if(No(t)&&(n<0||n>t.data.length))return[];const o=[n];let r=t;for(;r!==e&&r.parentNode;){const e=r.parentNode;for(let t=0;t<e.childNodes.length;t++)if(e.childNodes[t]===r){o.push(t);break}r=e}return r===e?o.reverse():[]},uE=(e,t,n,o,r)=>({start:cE(e,t,n),end:cE(e,o,r)}),mE=(e,t)=>{const n=t.slice(),o=n.pop();return Y(n,((e,t)=>e.bind((e=>M.from(e.childNodes[t])))),M.some(e)).bind((e=>No(e)&&(o<0||o>e.data.length)?M.none():M.some({node:e,offset:o})))},fE=(e,t)=>mE(e,t.start).bind((({node:n,offset:o})=>mE(e,t.end).map((({node:e,offset:t})=>{const r=document.createRange();return r.setStart(n,o),r.setEnd(e,t),r})))),gE=(e,t,n)=>{if(t&&e.isEmpty(t)&&!n(t)){const o=t.parentNode;e.remove(t),gE(e,o,n)}},pE=(e,t,n,o=!0)=>{const r=t.startContainer.parentNode,s=t.endContainer.parentNode;t.deleteContents(),o&&!n(t.startContainer)&&(No(t.startContainer)&&0===t.startContainer.data.length&&e.remove(t.startContainer),No(t.endContainer)&&0===t.endContainer.data.length&&e.remove(t.endContainer),gE(e,r,n),r!==s&&gE(e,s,n))},hE=(e,t)=>M.from(e.dom.getParent(t.startContainer,e.dom.isBlock)),bE=(e,t,n)=>{((e,t,n)=>{if(No(e)&&0>=e.length)return M.some(Kw(e,0));{const t=ma(Gw);return M.from(t.forwards(e,0,Yw(e),n)).map((e=>Kw(e.container,0)))}})(t,0,t).each((o=>{const r=o.container;Jw(r,n.start.length,t).each((n=>{const o=e.createRng();o.setStart(r,0),o.setEnd(n.container,n.offset),pE(e,o,(e=>e===t))}))}))},vE=(e,t)=>e.create("span",{"data-mce-type":"bookmark",id:t}),yE=(e,t)=>{const n=e.createRng();return n.setStartAfter(t.start),n.setEndBefore(t.end),n},CE=(e,t,n)=>{const o=fE(e.getRoot(),n).getOrDie("Unable to resolve path range"),r=o.startContainer,s=o.endContainer,a=0===o.endOffset?s:s.splitText(o.endOffset),i=0===o.startOffset?r:r.splitText(o.startOffset);return{prefix:t,end:a.parentNode.insertBefore(vE(e,t+"-end"),a),start:i.parentNode.insertBefore(vE(e,t+"-start"),i)}},xE=(e,t,n)=>{gE(e,e.get(t.prefix+"-end"),n),gE(e,e.get(t.prefix+"-start"),n)},wE=e=>0===e.start.length,kE=(e,t,n,o)=>{const r=t.start;var s;return Zw(e,o.container,o.offset,(s=r,(e,t)=>{const n=e.data.substring(0,t),o=n.lastIndexOf(s.charAt(s.length-1)),r=n.lastIndexOf(s);return-1!==r?r+s.length:-1!==o?o+1:-1}),n).bind((o=>{if(o.offset>=r.length){const t=e.createRng();return t.setStart(o.container,o.offset-r.length),t.setEnd(o.container,o.offset),M.some(t)}{const s=o.offset-r.length;return Qw(o.container,s,n).map((t=>{const n=e.createRng();return n.setStart(t.container,t.offset),n.setEnd(o.container,o.offset),n})).filter((e=>e.toString()===r)).orThunk((()=>kE(e,t,n,Kw(o.container,0))))}}))},SE=(e,t,n)=>{const o=e.dom,r=o.getRoot(),s=n.pattern,a=n.position.container,i=n.position.offset;return Qw(a,i-n.pattern.end.length,t).bind((l=>{const d=uE(r,l.container,l.offset,a,i);if(wE(s))return M.some({matches:[{pattern:s,startRng:d,endRng:d}],position:l});{const a=_E(e,n.remainingPatterns,l.container,l.offset,t),i=a.getOr({matches:[],position:l}),c=i.position,u=((e,t,n,o,r,s=!1)=>{if(0===t.start.length&&!s){const t=e.createRng();return t.setStart(n,o),t.setEnd(n,o),M.some(t)}return Xw(n,o,r).bind((n=>kE(e,t,r,n).bind((e=>{if(s){if(e.endContainer===n.container&&e.endOffset===n.offset)return M.none();if(0===n.offset&&e.endContainer.textContent.length===e.endOffset)return M.none()}return M.some(e)}))))})(o,s,c.container,c.offset,t,a.isNone());return u.map((e=>{const t=((e,t)=>uE(e,t.startContainer,t.startOffset,t.endContainer,t.endOffset))(r,e);return{matches:i.matches.concat([{pattern:s,startRng:t,endRng:d}]),position:Kw(e.startContainer,e.startOffset)}}))}}))},_E=(e,t,n,o,r)=>{const s=e.dom;return Xw(n,o,s.getRoot()).bind((a=>{const i=s.createRng();i.setStart(r,0),i.setEnd(n,o);const l=i.toString();for(let n=0;n<t.length;n++){const o=t[n];if(!je(l,o.end))continue;const s=t.slice();s.splice(n,1);const i=SE(e,r,{pattern:o,remainingPatterns:s,position:a});if(i.isSome())return i}return M.none()}))},EE=(e,t,n)=>{e.selection.setRng(n),"inline-format"===t.type?$(t.format,(t=>{e.formatter.apply(t)})):e.execCommand(t.cmd,!1,t.value)},NE=(e,t,n)=>{const o=e.selection.getRng();return!1===o.collapsed?[]:hE(e,o).bind((r=>{const s=Math.max(0,o.startOffset-(n?1:0));return _E(e,t,o.startContainer,s,r)})).fold((()=>[]),(e=>e.matches))},RE=(e,t)=>{if(0===t.length)return;const n=e.dom,o=e.selection.getBookmark(),r=((e,t)=>{const n=ia("mce_textpattern"),o=G(t,((t,o)=>{const r=CE(e,n+`_end${t.length}`,o.endRng);return t.concat([{...o,endMarker:r}])}),[]);return G(o,((t,r)=>{const s=o.length-t.length-1,a=wE(r.pattern)?r.endMarker:CE(e,n+`_start${s}`,r.startRng);return t.concat([{...r,startMarker:a}])}),[])})(n,t);$(r,(t=>{const o=n.getParent(t.startMarker.start,n.isBlock),r=e=>e===o;wE(t.pattern)?((e,t,n,o)=>{const r=yE(e.dom,n);pE(e.dom,r,o),EE(e,t,r)})(e,t.pattern,t.endMarker,r):((e,t,n,o,r)=>{const s=e.dom,a=yE(s,o),i=yE(s,n);pE(s,i,r),pE(s,a,r);const l={prefix:n.prefix,start:n.end,end:o.start},d=yE(s,l);EE(e,t,d)})(e,t.pattern,t.startMarker,t.endMarker,r),xE(n,t.endMarker,r),xE(n,t.startMarker,r)})),e.selection.moveToBookmark(o)},AE=(e,t)=>{if(!e.selection.isCollapsed()||!(e=>e.inlinePatterns.length>0||e.blockPatterns.length>0)(t))return!1;const n=NE(e,t.inlinePatterns,!1),o=((e,t)=>{const n=e.dom,o=e.selection.getRng();return hE(e,o).filter((t=>{const o=Di(e),r=n.is(t,o);return null!==t&&r})).bind((e=>{const o=e.textContent,r=((e,t)=>{const n=t.replace(dr," ");return Q(e,(e=>0===t.indexOf(e.start)||0===n.indexOf(e.start)))})(t,o);return r.map((t=>Bt.trim(o).length===t.start.length?[]:[{pattern:t,range:uE(n.getRoot(),e,0,e,0)}]))})).getOr([])})(e,t.blockPatterns);return(o.length>0||n.length>0)&&(e.undoManager.add(),e.undoManager.extra((()=>{e.execCommand("mceInsertNewLine")}),(()=>{e.insertContent(lr),RE(e,n),((e,t)=>{if(0===t.length)return;const n=e.selection.getBookmark();$(t,(t=>((e,t)=>{const n=e.dom,o=t.pattern,r=fE(n.getRoot(),t.range).getOrDie("Unable to resolve path range");return hE(e,r).each((t=>{"block-format"===o.type?((e,t)=>{const n=t.get(e);return p(n)&&ie(n).exists((e=>we(e,"block")))})(o.format,e.formatter)&&e.undoManager.transact((()=>{bE(e.dom,t,o),e.formatter.apply(o.format)})):"block-command"===o.type&&e.undoManager.transact((()=>{bE(e.dom,t,o),e.execCommand(o.cmd,!1,o.value)}))})),!0})(e,t))),e.selection.moveToBookmark(n)})(e,o);const t=e.selection.getRng(),r=Xw(t.startContainer,t.startOffset,e.dom.getRoot());e.execCommand("mceInsertNewLine"),r.each((t=>{const n=t.container;n.data.charAt(t.offset-1)===lr&&(n.deleteData(t.offset-1,1),gE(e.dom,n.parentNode,(t=>t===e.dom.getRoot())))}))})),!0)},OE=(e,t)=>{if(t.length>0){const n=NE(e,t,!0);n.length>0&&e.undoManager.transact((()=>{RE(e,n)}))}},TE=(e,t,n)=>{for(let o=0;o<e.length;o++)if(n(e[o],t))return!0;return!1},BE=e=>{const t=[",",".",";",":","!","?"],n=[32],o=()=>bi(Jl(e));e.on("keydown",(t=>{var n;13!==t.keyCode||ju.modifierPressed(t)||AE(e,(n=Jl(e),{inlinePatterns:bi(n),blockPatterns:hi(n)}))&&t.preventDefault()}),!0),e.on("keyup",(t=>{TE(n,t,((e,t)=>e===t.keyCode&&!1===ju.modifierPressed(t)))&&OE(e,o())})),e.on("keypress",(n=>{TE(t,n,((e,t)=>e.charCodeAt(0)===t.charCode))&&Xm.setEditorTimeout(e,(()=>{OE(e,o())}))}))},DE=e=>{const t=Bt.each,n=ju.BACKSPACE,o=ju.DELETE,r=e.dom,s=e.selection,a=e.parser,i=Nt.browser,l=i.isFirefox(),d=i.isChromium()||i.isSafari(),c=Nt.deviceType.isiPhone()||Nt.deviceType.isiPad(),u=Nt.os.isMacOS()||Nt.os.isiOS(),m=(t,n)=>{try{e.getDoc().execCommand(t,!1,n)}catch(e){}},f=e=>e.isDefaultPrevented(),g=()=>{e.shortcuts.add("meta+a",null,"SelectAll")},p=()=>{e.inline||r.bind(e.getDoc(),"mousedown mouseup",(t=>{let n;if(t.target===e.getDoc().documentElement)if(n=s.getRng(),e.getBody().focus(),"mousedown"===t.type){if(vr(n.startContainer))return;s.placeCaretAt(t.clientX,t.clientY)}else s.setRng(n)}))},h=()=>{Range.prototype.getClientRects||e.on("mousedown",(t=>{if(!f(t)&&"HTML"===t.target.nodeName){const t=e.getBody();t.blur(),Xm.setEditorTimeout(e,(()=>{t.focus()}))}}))},b=()=>{const t=Dl(e);e.on("click",(n=>{const o=n.target;/^(IMG|HR)$/.test(o.nodeName)&&"false"!==r.getContentEditableParent(o)&&(n.preventDefault(),e.selection.select(o),e.nodeChanged()),"A"===o.nodeName&&r.hasClass(o,t)&&0===o.childNodes.length&&(n.preventDefault(),s.select(o))}))},v=()=>{e.on("keydown",(e=>{if(!f(e)&&e.keyCode===n&&s.isCollapsed()&&0===s.getRng().startOffset){const t=s.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}}))},y=()=>{El(e)||e.on("BeforeExecCommand mousedown",(()=>{m("StyleWithCSS",!1),m("enableInlineTableEditing",!1),sl(e)||m("enableObjectResizing",!1)}))},C=()=>{e.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")},x=()=>{e.inline||e.on("keydown",(()=>{document.activeElement===document.body&&e.getWin().focus()}))},w=()=>{e.inline||(e.contentStyles.push("body {min-height: 150px}"),e.on("click",(t=>{let n;"HTML"===t.target.nodeName&&(n=e.selection.getRng(),e.getBody().focus(),e.selection.setRng(n),e.selection.normalize(),e.nodeChanged())})))},k=()=>{u&&e.on("keydown",(t=>{!ju.metaKeyPressed(t)||t.shiftKey||37!==t.keyCode&&39!==t.keyCode||(t.preventDefault(),e.selection.getSel().modify("move",37===t.keyCode?"backward":"forward","lineboundary"))}))},_=()=>{e.on("click",(e=>{let t=e.target;do{if("A"===t.tagName)return void e.preventDefault()}while(t=t.parentNode)})),e.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")},E=()=>{e.on("init",(()=>{e.dom.bind(e.getBody(),"submit",(e=>{e.preventDefault()}))}))},N=S;return Nv(e)?(d&&(p(),b(),E(),g(),c&&(x(),w(),_())),l&&(h(),y(),C(),k())):(e.on("keydown",(t=>{let n,o;if(f(t)||t.keyCode!==ju.BACKSPACE)return;n=s.getRng();const a=n.startContainer,i=n.startOffset,l=r.getRoot();if(o=a,n.collapsed&&0===i){for(;o&&o.parentNode&&o.parentNode.firstChild===o&&o.parentNode!==l;)o=o.parentNode;"BLOCKQUOTE"===o.tagName&&(e.formatter.toggle("blockquote",null,o),n=r.createRng(),n.setStart(a,0),n.setEnd(a,0),s.setRng(n))}})),(()=>{const t=e=>{const t=r.create("body"),n=e.cloneContents();return t.appendChild(n),s.serializer.serialize(t,{format:"html"})};e.on("keydown",(s=>{const a=s.keyCode;let i,l;if(!f(s)&&(a===o||a===n)){if(i=e.selection.isCollapsed(),l=e.getBody(),i&&!r.isEmpty(l))return;if(!i&&!(n=>{const o=t(n),s=r.createRng();return s.selectNode(e.getBody()),o===t(s)})(e.selection.getRng()))return;s.preventDefault(),e.setContent(""),l.firstChild&&r.isBlock(l.firstChild)?e.selection.setCursorLocation(l.firstChild,0):e.selection.setCursorLocation(l,0),e.nodeChanged()}}))})(),Nt.windowsPhone||e.on("keyup focusin mouseup",(e=>{ju.modifierPressed(e)||s.normalize()}),!0),d&&(p(),b(),e.on("init",(()=>{m("DefaultParagraphSeparator",Di(e))})),E(),v(),a.addNodeFilter("br",(e=>{let t=e.length;for(;t--;)"Apple-interchange-newline"===e[t].attr("class")&&e[t].remove()})),c?(x(),w(),_()):g()),l&&(e.on("keydown",(t=>{if(!f(t)&&t.keyCode===n){if(!e.getBody().getElementsByTagName("hr").length)return;if(s.isCollapsed()&&0===s.getRng().startOffset){const e=s.getNode(),n=e.previousSibling;if("HR"===e.nodeName)return r.remove(e),void t.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(r.remove(n),t.preventDefault())}}})),h(),(()=>{const n=()=>{const n=r.getAttribs(s.getStart().cloneNode(!1));return()=>{const o=s.getStart();o!==e.getBody()&&(r.setAttrib(o,"style",null),t(n,(e=>{o.setAttributeNode(e.cloneNode(!0))})))}},o=()=>!s.isCollapsed()&&r.getParent(s.getStart(),r.isBlock)!==r.getParent(s.getEnd(),r.isBlock);e.on("keypress",(t=>{let r;if(!f(t)&&(8===t.keyCode||46===t.keyCode)&&o())return r=n(),e.getDoc().execCommand("delete",!1,null),r(),t.preventDefault(),!1})),r.bind(e.getDoc(),"cut",(t=>{let r;!f(t)&&o()&&(r=n(),Xm.setEditorTimeout(e,(()=>{r()})))}))})(),y(),e.on("SetContent ExecCommand",(e=>{"setcontent"!==e.type&&"mceInsertLink"!==e.command||t(r.select("a"),(e=>{let t=e.parentNode;const n=r.getRoot();if(t.lastChild===e){for(;t&&!r.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}r.add(t,"br",{"data-mce-bogus":1})}}))})),C(),k(),v())),{refreshContentEditable:N,isHidden:()=>{if(!l||e.removed)return!1;const t=e.selection.getSel();return!t||!t.rangeCount||0===t.rangeCount}}},LE=Us.DOM,PE=e=>e.inline?e.getElement().nodeName.toLowerCase():void 0,ME=e=>ve(e,(e=>!1===v(e))),IE=e=>{const t=e.options.get,n=e.editorUpload.blobCache;return ME({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"),preserve_cdata:t("preserve_cdata"),remove_trailing_brs:t("remove_trailing_brs"),inline_styles:t("inline_styles"),root_name:PE(e),validate:!0,blob_cache:n,document:e.getDoc()})},FE=e=>{const t=e.options.get;return ME({custom_elements:t("custom_elements"),extended_valid_elements:t("extended_valid_elements"),invalid_elements:t("invalid_elements"),invalid_styles:t("invalid_styles"),schema:t("schema"),valid_children:t("valid_children"),valid_classes:t("valid_classes"),valid_elements:t("valid_elements"),valid_styles:t("valid_styles"),verify_html:t("verify_html"),padd_empty_block_inline_children:t("format_empty_lines")})},UE=e=>e.inline?e.ui.styleSheetLoader:e.dom.styleSheetLoader,zE=e=>{const t=UE(e),n=nl(e),o=e.contentCSS,r=()=>{t.unloadAll(o),e.inline||e.ui.styleSheetLoader.unloadAll(n)},s=()=>{e.removed?r():e.on("remove",r)};if(e.contentStyles.length>0){let t="";Bt.each(e.contentStyles,(e=>{t+=e+"\r\n"})),e.dom.addStyle(t)}const a=Promise.all(((e,t,n)=>{const o=[UE(e).loadAll(t)];return e.inline?o:o.concat([e.ui.styleSheetLoader.loadAll(n)])})(e,o,n)).then(s).catch(s),i=tl(e);return i&&((e,t)=>{const n=mn(e.getBody()),o=Mn(Pn(n)),r=cn("style");$t(r,"type","text/css"),Jn(r,un(t)),Jn(o,r),e.on("remove",(()=>{to(r)}))})(e,i),a},jE=e=>{!0!==e.removed&&((e=>{Nv(e)||e.load({initial:!0,format:"html"}),e.startContent=e.getContent({format:"raw"})})(e),(e=>{e.bindPendingEventDelegates(),e.initialized=!0,(e=>{e.dispatch("Init")})(e),e.focus(!0),(e=>{const t=e.dom.getRoot();e.inline||Su(e)&&e.selection.getStart(!0)!==t||fc(t).each((t=>{const n=t.getNode(),o=So(n)?fc(n).getOr(t):t;e.selection.setRng(o.toRange())}))})(e),e.nodeChanged({initial:!0});const t=Ml(e);x(t)&&t.call(e,e),(e=>{const t=Fl(e);t&&Xm.setEditorTimeout(e,(()=>{let n;n=!0===t?e:e.editorManager.get(t),n.destroyed||n.focus()}),100)})(e)})(e))},VE=e=>{const t=e.getElement();let n=e.getDoc();e.inline&&(LE.addClass(t,"mce-content-body"),e.contentDocument=n=document,e.contentWindow=window,e.bodyElement=t,e.contentAreaContainer=t);const o=e.getBody();o.disabled=!0,e.readonly=El(e),e.readonly||(e.inline&&"static"===LE.getStyle(o,"position",!0)&&(o.style.position="relative"),o.contentEditable="true"),o.disabled=!1,e.editorUpload=hy(e),e.schema=Cs(FE(e)),e.dom=Us(n,{keep_values:!0,url_converter:e.convertURL,url_converter_scope:e,update_styles:!0,root_element:e.inline?e.getBody():null,collect:()=>e.inline,schema:e.schema,contentCssCors:Gi(e),referrerPolicy:Yi(e),onSetAttrib:t=>{e.dispatch("SetAttrib",t)}}),e.parser=(e=>{const t=Gb(IE(e),e.schema);return t.addAttributeFilter("src,href,style,tabindex",((t,n)=>{let o,r,s=t.length;const a=e.dom,i="data-mce-"+n;for(;s--;)if(o=t[s],r=o.attr(n),r&&!o.attr(i)){if(0===r.indexOf("data:")||0===r.indexOf("blob:"))continue;"style"===n?(r=a.serializeStyle(a.parseStyle(r),o.name),r.length||(r=null),o.attr(i,r),o.attr(n,r)):"tabindex"===n?(o.attr(i,r),o.attr(n,null)):o.attr(i,e.convertURL(r,n,o.name))}})),t.addNodeFilter("script",(e=>{let t=e.length;for(;t--;){const n=e[t],o=n.attr("type")||"no/type";0!==o.indexOf("mce-")&&n.attr("type","mce-"+o)}})),e.options.get("preserve_cdata")&&t.addNodeFilter("#cdata",(t=>{let n=t.length;for(;n--;){const o=t[n];o.type=8,o.name="#comment",o.value="[CDATA["+e.dom.encode(o.value)+"]]"}})),t.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",(t=>{let n=t.length;const o=e.schema.getNonEmptyElements();for(;n--;){const e=t[n];e.isEmpty(o)&&0===e.getAll("br").length&&e.append(new xf("br",1))}})),t})(e),e.serializer=Fv((e=>{const t=e.options.get;return{...IE(e),...FE(e),...ME({url_converter:t("url_converter"),url_converter_scope:t("url_converter_scope"),element_format:t("element_format"),entities:t("entities"),entity_encoding:t("entity_encoding"),indent:t("indent"),indent_after:t("indent_after"),indent_before:t("indent_before")})}})(e),e),e.selection=Pv(e.dom,e.getWin(),e.serializer,e),e.annotator=Bu(e),e.formatter=Ey(e),e.undoManager=Ry(e),e._nodeChangeDispatcher=new c_(e),e._selectionOverrides=dE(e),(e=>{const t=Gs(),n=Vs(!1),o=Xs((t=>{e.dispatch("longpress",{...t,type:"longpress"}),n.set(!0)}),400);e.on("touchstart",(e=>{Jx(e).each((r=>{o.cancel();const s={x:r.clientX,y:r.clientY,target:e.target};o.throttle(e),n.set(!1),t.set(s)}))}),!0),e.on("touchmove",(r=>{o.cancel(),Jx(r).each((o=>{t.on((r=>{((e,t)=>{const n=Math.abs(e.clientX-t.x),o=Math.abs(e.clientY-t.y);return n>5||o>5})(o,r)&&(t.clear(),n.set(!1),e.dispatch("longpresscancel"))}))}))}),!0),e.on("touchend touchcancel",(r=>{o.cancel(),"touchcancel"!==r.type&&t.get().filter((e=>e.target.isEqualNode(r.target))).each((()=>{n.get()?r.preventDefault():e.dispatch("tap",{...r,type:"tap"})}))}),!0)})(e),(e=>{(e=>{e.on("click",(t=>{e.dom.getParent(t.target,"details")&&t.preventDefault()}))})(e),(e=>{e.parser.addNodeFilter("details",(e=>{$(e,(e=>{e.attr("data-mce-open",e.attr("open")),e.attr("open","open")}))})),e.serializer.addNodeFilter("details",(e=>{$(e,(e=>{const t=e.attr("data-mce-open");e.attr("open",m(t)?t:null),e.attr("data-mce-open",null)}))}))})(e)})(e),(e=>{const t="contenteditable",n=" "+Bt.trim(ed(e))+" ",o=" "+Bt.trim(Zl(e))+" ",r=ow(n),s=ow(o),a=td(e);a.length>0&&e.on("BeforeSetContent",(t=>{((e,t,n)=>{let o=t.length,r=n.content;if("raw"!==n.format){for(;o--;)r=r.replace(t[o],rw(e,r,Zl(e)));n.content=r}})(e,a,t)})),e.parser.addAttributeFilter("class",(e=>{let n=e.length;for(;n--;){const o=e[n];r(o)?o.attr(t,"true"):s(o)&&o.attr(t,"false")}})),e.serializer.addAttributeFilter(t,(e=>{let n=e.length;for(;n--;){const o=e[n];(r(o)||s(o))&&(a.length>0&&o.attr("data-mce-content")?(o.name="#text",o.type=3,o.raw=!0,o.value=o.attr("data-mce-content")):o.attr(t,null))}}))})(e),Nv(e)||((e=>{e.on("click",(t=>{t.detail>=3&&(e=>{const t=e.selection.getRng(),n=ja.fromRangeStart(t),o=ja.fromRangeEnd(t);if(ja.isElementPosition(n)){const e=n.container();W_(e)&&fc(e).each((e=>t.setStart(e.container(),e.offset())))}if(ja.isElementPosition(o)){const e=n.container();W_(e)&&gc(e).each((e=>t.setEnd(e.container(),e.offset())))}e.selection.setRng(yp(t))})(e)}))})(e),(e=>{BE(e)})(e));const r=d_(e);Qx(e,r),(e=>{e.on("NodeChange",O(nw,e))})(e),(e=>{const t=e.dom,n=Di(e),o=il(e),r=(s,a)=>{if((e=>{if(Ty(e)){const t=e.keyCode;return!By(e)&&(ju.metaKeyPressed(e)||e.altKey||t>=112&&t<=123||j(Ay,t))}return!1})(s))return;const i=e.getBody(),l=!(e=>Ty(e)&&!(By(e)||"keyup"===e.type&&229===e.keyCode))(s)&&((e,t,n)=>{if(qr(mn(t),!1)){const o=t.firstElementChild;return!o||!e.getStyle(t.firstElementChild,"padding-left")&&!e.getStyle(t.firstElementChild,"padding-right")&&n===o.nodeName.toLowerCase()}return!1})(t,i,n);(""!==t.getAttrib(i,Oy)!==l||a)&&(t.setAttrib(i,Oy,l?o:null),t.setAttrib(i,"aria-placeholder",l?o:null),((e,t)=>{e.dispatch("PlaceholderToggle",{state:t})})(e,l),e.on(l?"keydown":"keyup",r),e.off(l?"keyup":"keydown",r))};o&&e.on("init",(t=>{r(t,!0),e.on("change SetContent ExecCommand",r),e.on("paste",(t=>Xm.setEditorTimeout(e,(()=>r(t)))))}))})(e),q_(e);const s=(e=>{const t=e;return(e=>xe(e.plugins,"rtc").bind((e=>M.from(e.setup))))(e).fold((()=>(t.rtcInstance=Ev(e),M.none())),(e=>(t.rtcInstance=(()=>{const e=N(null),t=N("");return{init:{bindEvents:S},undoManager:{beforeChange:S,add:e,undo:e,redo:e,clear:S,reset:S,hasUndo:L,hasRedo:L,transact:e,ignore:S,extra:S},formatter:{match:L,matchAll:N([]),matchNode:N(void 0),canApply:L,closest:t,apply:S,remove:S,toggle:S,formatChanged:N({unbind:S})},editor:{getContent:t,setContent:N({content:"",html:""}),insertContent:N(""),addVisual:S},selection:{getContent:t},autocompleter:{addDecoration:S,removeDecoration:S},raw:{getModel:N(M.none())}}})(),M.some((()=>e().then((e=>(t.rtcInstance=(e=>{const t=e=>f(e)?e:{},{init:n,undoManager:o,formatter:r,editor:s,selection:a,autocompleter:i,raw:l}=e;return{init:{bindEvents:n.bindEvents},undoManager:{beforeChange:o.beforeChange,add:o.add,undo:o.undo,redo:o.redo,clear:o.clear,reset:o.reset,hasUndo:o.hasUndo,hasRedo:o.hasRedo,transact:(e,t,n)=>o.transact(n),ignore:(e,t)=>o.ignore(t),extra:(e,t,n,r)=>o.extra(n,r)},formatter:{match:(e,n,o,s)=>r.match(e,t(n),s),matchAll:r.matchAll,matchNode:r.matchNode,canApply:e=>r.canApply(e),closest:e=>r.closest(e),apply:(e,n,o)=>r.apply(e,t(n)),remove:(e,n,o,s)=>r.remove(e,t(n)),toggle:(e,n,o)=>r.toggle(e,t(n)),formatChanged:(e,t,n,o,s)=>r.formatChanged(t,n,o,s)},editor:{getContent:e=>s.getContent(e),setContent:(e,t)=>({content:s.setContent(e,t),html:""}),insertContent:(e,t)=>(s.insertContent(e),""),addVisual:s.addVisual},selection:{getContent:(e,t)=>a.getContent(t)},autocompleter:{addDecoration:i.addDecoration,removeDecoration:i.removeDecoration},raw:{getModel:()=>M.some(l.getRawModel())}}})(e),e.rtc.isRemote))))))))})(e);(e=>{const t=e.getDoc(),n=e.getBody();(e=>{e.dispatch("PreInit")})(e),Ul(e)||(t.body.spellcheck=!1,LE.setAttrib(n,"spellcheck","false")),e.quirks=DE(e),(e=>{e.dispatch("PostRender")})(e);const o=ol(e);void 0!==o&&(n.dir=o);const r=zl(e);r&&e.on("BeforeSetContent",(e=>{Bt.each(r,(t=>{e.content=e.content.replace(t,(e=>"\x3c!--mce:protected "+escape(e)+"--\x3e"))}))})),e.on("SetContent",(()=>{e.addVisual(e.getBody())})),e.on("compositionstart compositionend",(t=>{e.composing="compositionstart"===t.type}))})(e),s.fold((()=>{zE(e).then((()=>jE(e)))}),(t=>{e.setProgressState(!0),zE(e).then((()=>{t().then((t=>{e.setProgressState(!1),jE(e),Ov(e)}),(t=>{e.notificationManager.open({type:"error",text:String(t)}),jE(e),Ov(e)}))}))}))},HE=(e,t)=>{if(e.inline||(e.getElement().style.visibility=e.orgVisibility),t||e.inline)VE(e);else{const t=e.iframeElement,o=(n=mn(t),so(n,"load",cy,(()=>{o.unbind(),e.contentDocument=t.contentDocument,VE(e)})));t.srcdoc=e.iframeHTML}var n},$E=Us.DOM,qE=Us.DOM,WE=e=>({editorContainer:e,iframeContainer:e,api:{}}),KE=e=>{const t=e.getElement();return e.orgDisplay=t.style.display,m(cl(e))?(e=>e.theme.renderUI())(e):x(cl(e))?(e=>{const t=e.getElement(),n=cl(e)(e,t);return n.editorContainer.nodeType&&(n.editorContainer.id=n.editorContainer.id||e.id+"_parent"),n.iframeContainer&&n.iframeContainer.nodeType&&(n.iframeContainer.id=n.iframeContainer.id||e.id+"_iframecontainer"),n.height=n.iframeHeight?n.iframeHeight:t.offsetHeight,n})(e):(e=>{const t=e.getElement();return e.inline?WE(null):(e=>{const t=qE.create("div");return qE.insertAfter(t,e),WE(t)})(t)})(e)},GE=e=>{e.dispatch("ScriptsLoaded"),(e=>{const t=Bt.trim(Vi(e)),n=e.ui.registry.getAll().icons,o={...Wv.get("default").icons,...Wv.get(t).icons};fe(o,((t,o)=>{we(n,o)||e.ui.registry.addIcon(o,t)}))})(e),(e=>{const t=cl(e);if(m(t)){const n=ny.get(t);e.theme=n(e,ny.urls[t])||{},x(e.theme.init)&&e.theme.init(e,ny.urls[t]||e.documentBaseUrl.replace(/\/$/,""))}else e.theme={}})(e),(e=>{const t=ml(e),n=Kv.get(t);e.model=n(e,Kv.urls[t])})(e),(e=>{const t=[];$(Rl(e),(n=>{((e,t,n)=>{const o=ty.get(n),r=ty.urls[n]||e.documentBaseUrl.replace(/\/$/,"");if(n=Bt.trim(n),o&&-1===Bt.inArray(t,n)){if(e.plugins[n])return;try{const s=o(e,r)||{};e.plugins[n]=s,x(s.init)&&(s.init(e,r),t.push(n))}catch(t){((e,t,n)=>{const o=Ws.translate(["Failed to initialize plugin: {0}",t]);Pu(e,"PluginLoadError",{message:o}),ly(o,n),sy(e,o)})(e,n,t)}}})(e,t,(e=>e.replace(/^\-/,""))(n))}))})(e);const t=KE(e);((e,t)=>{const n={show:M.from(t.show).getOr(S),hide:M.from(t.hide).getOr(S),isEnabled:M.from(t.isEnabled).getOr(P),setEnabled:n=>{e.mode.isReadOnly()||M.from(t.setEnabled).each((e=>e(n)))}};e.ui={...e.ui,...n}})(e,M.from(t.api).getOr({}));const n={editorContainer:t.editorContainer,iframeContainer:t.iframeContainer};return e.editorContainer=n.editorContainer?n.editorContainer:null,(e=>{e.contentCSS=e.contentCSS.concat((e=>dy(e,el(e)))(e),(e=>dy(e,nl(e)))(e))})(e),e.inline?HE(e):((e,t)=>{((e,t)=>{const n=e.translate("Rich Text Area"),o=Kt(mn(e.getElement()),"tabindex").bind(Ge),r=((e,t,n,o)=>{const r=cn("iframe");return o.each((e=>$t(r,"tabindex",e))),qt(r,n),qt(r,{id:e+"_ifr",frameBorder:"0",allowTransparency:"true",title:t}),nn(r,"tox-edit-area__iframe"),r})(e.id,n,Ei(e),o).dom;r.onload=()=>{r.onload=null,e.dispatch("load")},e.contentAreaContainer=t.iframeContainer,e.iframeElement=r,e.iframeHTML=(e=>{let t=Ni(e)+"<html><head>";Ri(e)!==e.documentBaseUrl&&(t+='<base href="'+e.documentBaseURI.getURI()+'" />'),t+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';const n=Ai(e),o=Oi(e),r=e.translate(Ll(e));return Ti(e)&&(t+='<meta http-equiv="Content-Security-Policy" content="'+Ti(e)+'" />'),t+=`</head><body id="${n}" class="mce-content-body ${o}" data-id="${e.id}" aria-label="${r}"><br></body></html>`,t})(e),$E.add(t.iframeContainer,r)})(e,t),t.editorContainer&&($E.get(t.editorContainer).style.display=e.orgDisplay,e.hidden=$E.isHidden(t.editorContainer)),e.getElement().style.display="none",$E.setAttrib(e.id,"aria-hidden","true"),HE(e)})(e,n)},YE=Us.DOM,XE=e=>"-"===e.charAt(0),QE=(e,t,n)=>M.from(t).filter((e=>We(e)&&!Wv.has(e))).map((t=>({url:`${e.editorManager.baseURL}/icons/${t}/icons${n}.js`,name:M.some(t)}))),JE=(e,t)=>{const n=js.ScriptLoader,o=()=>{!e.removed&&(e=>{const t=cl(e);return!m(t)||C(ny.get(t))})(e)&&(e=>{const t=ml(e);return C(Kv.get(t))})(e)&&GE(e)};((e,t)=>{const n=cl(e);if(m(n)&&!XE(n)&&!we(ny.urls,n)){const o=ul(e),r=o?e.documentBaseURI.toAbsolute(o):`themes/${n}/theme${t}.js`;ny.load(n,r).catch((()=>{((e,t,n)=>{ay(e,"ThemeLoadError",iy("theme",t,n))})(e,r,n)}))}})(e,t),((e,t)=>{const n=ml(e);if("plugin"!==n&&!we(Kv.urls,n)){const o=fl(e),r=m(o)?e.documentBaseURI.toAbsolute(o):`models/${n}/model${t}.js`;Kv.load(n,r).catch((()=>{((e,t,n)=>{ay(e,"ModelLoadError",iy("model",t,n))})(e,r,n)}))}})(e,t),((e,t)=>{const n=Xi(t),o=Qi(t);if(!1===Ws.hasCode(n)&&"en"!==n){const r=We(o)?o:`${t.editorManager.baseURL}/langs/${n}.js`;e.add(r).catch((()=>{((e,t,n)=>{ay(e,"LanguageLoadError",iy("language",t,n))})(t,r,n)}))}})(n,e),((e,t,n)=>{const o=QE(t,"default",n),r=(e=>M.from(Hi(e)).filter(We).map((e=>({url:e,name:M.none()}))))(t).orThunk((()=>QE(t,Vi(t),"")));$((e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t<e.length;t++)e[t].each(n);return t})([o,r]),(n=>{e.add(n.url).catch((()=>{((e,t,n)=>{ay(e,"IconsLoadError",iy("icons",t,n))})(t,n.url,n.name.getOrUndefined())}))}))})(n,e,t),((e,t)=>{const n=(t,n)=>{ty.load(t,n).catch((()=>{((e,t,n)=>{ay(e,"PluginLoadError",iy("plugin",t,n))})(e,n,t)}))};fe(Al(e),((t,o)=>{n(o,t),e.options.set("plugins",Rl(e).concat(o))})),$(Rl(e),(e=>{!(e=Bt.trim(e))||ty.urls[e]||XE(e)||n(e,`plugins/${e}/plugin${t}.js`)}))})(e,t),n.loadQueue().then(o,o)},ZE=Ct().deviceType,eN=ZE.isPhone(),tN=ZE.isTablet(),nN=e=>{if(y(e))return[];{const t=p(e)?e:e.split(/[ ,]/),n=H(t,He);return K(n,We)}},oN=(e,t)=>{const n=((t,n)=>{const o={},r={};return be(t,((t,n)=>j(e,n)),he(o),he(r)),{t:o,f:r}})(t);return o=n.t,r=n.f,{sections:N(o),options:N(r)};var o,r},rN=(e,t)=>we(e.sections(),t),sN=(e,t)=>({table_grid:!1,object_resizing:!1,resize:!1,toolbar_mode:xe(e,"toolbar_mode").getOr("scrolling"),toolbar_sticky:!1,...t?{menubar:!1}:{}}),aN=(e,t)=>{var n;const o=null!==(n=t.external_plugins)&&void 0!==n?n:{};return e&&e.external_plugins?Bt.extend({},e.external_plugins,o):o},iN=(e,t,n,o,r)=>{var s;const a=e?{mobile:sN(null!==(s=r.mobile)&&void 0!==s?s:{},t)}:{},i=oN(["mobile"],hk(a,r)),l=Bt.extend(n,o,i.options(),((e,t)=>e&&rN(t,"mobile"))(e,i)?((e,t,n={})=>{const o=e.sections(),r=xe(o,t).getOr({});return Bt.extend({},n,r)})(i,"mobile"):{},{external_plugins:aN(o,i.options())});return((e,t,n,o)=>{const r=nN(n.forced_plugins),s=nN(o.plugins),a=((e,t)=>rN(e,t)?e.sections()[t]:{})(t,"mobile"),i=((e,t,n,o)=>e&&rN(t,"mobile")?o:n)(e,t,s,a.plugins?nN(a.plugins):s),l=((e,t)=>[].concat(nN(e)).concat(nN(t)))(r,i);return Bt.extend(o,{forced_plugins:r,plugins:l})})(e,i,o,l)},lN=e=>{(e=>{const t=t=>()=>{$("left,center,right,justify".split(","),(n=>{t!==n&&e.formatter.remove("align"+n)})),"none"!==t&&((t,n)=>{e.formatter.toggle(t,void 0),e.nodeChanged()})("align"+t)};e.editorCommands.addCommands({JustifyLeft:t("left"),JustifyCenter:t("center"),JustifyRight:t("right"),JustifyFull:t("justify"),JustifyNone:t("none")})})(e),(e=>{const t=t=>()=>{const n=e.selection,o=n.isCollapsed()?[e.dom.getParent(n.getNode(),e.dom.isBlock)]:n.getSelectedBlocks();return V(o,(n=>C(e.formatter.matchNode(n,t))))};e.editorCommands.addCommands({JustifyLeft:t("alignleft"),JustifyCenter:t("aligncenter"),JustifyRight:t("alignright"),JustifyFull:t("alignjustify")},"state")})(e)},dN=(e,t)=>{const n=e.selection,o=e.dom;return/^ | $/.test(t)?((e,t,n)=>{const o=mn(e.getRoot());return n=yg(o,ja.fromRangeStart(t))?n.replace(/^ /,"&nbsp;"):n.replace(/^&nbsp;/," "),Cg(o,ja.fromRangeEnd(t))?n.replace(/(&nbsp;| )(<br( \/)>)?$/,"&nbsp;"):n.replace(/&nbsp;(<br( \/)?>)?$/," ")})(o,n.getRng(),t):t},cN=(e,t)=>{const{content:n,details:o}=(e=>{if("string"!=typeof e){const t=Bt.extend({paste:e.paste,data:{paste:e.paste}},e);return{content:e.content,details:t}}return{content:e,details:{}}})(t);Jb(e,{content:dN(e,n),format:"html",set:!1,selection:!0,paste:o.paste}).each((t=>{const n=((e,t,n)=>Rv(e).editor.insertContent(t,n))(e,t.content,o);Zb(e,n,t),e.addVisual()}))},uN={"font-size":"size","font-family":"face"},mN=e=>(t,n)=>M.from(n).map(mn).filter(Ut).bind((n=>((e,t,n)=>Tp(mn(n),(t=>(t=>Wn(t,e).orThunk((()=>"font"===Mt(t)?xe(uN,e).bind((e=>Kt(t,e))):M.none())))(t)),(e=>bn(mn(t),e))))(e,t,n.dom).or(((e,t)=>M.from(Us.DOM.getStyle(t,e,!0)))(e,n.dom)))).getOr(""),fN=mN("font-size"),gN=_((e=>e.replace(/[\'\"\\]/g,"").replace(/,\s+/g,",")),mN("font-family")),pN=e=>fc(e.getBody()).map((e=>{const t=e.container();return No(t)?t.parentNode:t})),hN=(e,t)=>((e,t)=>(e=>M.from(e.selection.getRng()).bind((t=>{const n=e.getBody();return t.startContainer===n&&0===t.startOffset?M.none():M.from(e.selection.getStart(!0))})))(e).orThunk(O(pN,e)).map(mn).filter(Ut).bind(t))(e,E(M.some,t)),bN=(e,t)=>{if(/^[0-9.]+$/.test(t)){const n=parseInt(t,10);if(n>=1&&n<=7){const o=(e=>Bt.explode(e.options.get("font_size_style_values")))(e),r=(e=>Bt.explode(e.options.get("font_size_classes")))(e);return r?r[n-1]||t:o[n-1]||t}return t}return t},vN=e=>{const t=e.split(/\s*,\s*/);return H(t,(e=>-1===e.indexOf(" ")||ze(e,'"')||ze(e,"'")?e:`'${e}'`)).join(",")},yN=e=>{lN(e),(e=>{e.editorCommands.addCommands({"Cut,Copy,Paste":t=>{const n=e.getDoc();let o;try{n.execCommand(t)}catch(e){o=!0}if("paste"!==t||n.queryCommandEnabled(t)||(o=!0),o||!n.queryCommandSupported(t)){let t=e.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");(Nt.os.isMacOS()||Nt.os.isiOS())&&(t=t.replace(/Ctrl\+/g,"\u2318+")),e.notificationManager.open({text:t,type:"error"})}}})})(e),(e=>{e.editorCommands.addCommands({mceAddUndoLevel:()=>{e.undoManager.add()},mceEndUndoLevel:()=>{e.undoManager.add()},Undo:()=>{e.undoManager.undo()},Redo:()=>{e.undoManager.redo()}})})(e),(e=>{e.editorCommands.addCommands({mceSelectNodeDepth:(t,n,o)=>{let r=0;e.dom.getParent(e.selection.getNode(),(t=>{if(1===t.nodeType&&r++===o)return e.selection.select(t),!1}),e.getBody())},mceSelectNode:(t,n,o)=>{e.selection.select(o)},selectAll:()=>{const t=e.dom.getParent(e.selection.getStart(),Po);if(t){const n=e.dom.createRng();n.selectNodeContents(t),e.selection.setRng(n)}}})})(e),(e=>{e.editorCommands.addCommands({mceCleanup:()=>{const t=e.selection.getBookmark();e.setContent(e.getContent()),e.selection.moveToBookmark(t)},insertImage:(t,n,o)=>{cN(e,e.dom.createHTML("img",{src:o}))},insertHorizontalRule:()=>{e.execCommand("mceInsertContent",!1,"<hr>")},insertText:(t,n,o)=>{cN(e,e.dom.encode(o))},insertHTML:(t,n,o)=>{cN(e,o)},mceInsertContent:(t,n,o)=>{cN(e,o)},mceSetContent:(t,n,o)=>{e.setContent(o)},mceReplaceContent:(t,n,o)=>{e.execCommand("mceInsertContent",!1,o.replace(/\{\$selection\}/g,e.selection.getContent({format:"text"})))},mceNewDocument:()=>{e.setContent("")}})})(e),(e=>{const t=(t,n,o)=>{const r=m(o)?{href:o}:o,s=e.dom.getParent(e.selection.getNode(),"a");f(r)&&m(r.href)&&(r.href=r.href.replace(/ /g,"%20"),s&&r.href||e.formatter.remove("link"),r.href&&e.formatter.apply("link",r,s))};e.editorCommands.addCommands({unlink:()=>{if(e.selection.isCollapsed()){const t=e.dom.getParent(e.selection.getStart(),"a");t&&e.dom.remove(t,!0)}else e.formatter.remove("link")},mceInsertLink:t,createLink:t})})(e),(e=>{e.editorCommands.addCommands({Indent:()=>{(e=>{Kx(e,"indent")})(e)},Outdent:()=>{Gx(e)}}),e.editorCommands.addCommands({Outdent:()=>$x(e)},"state")})(e),(e=>{e.editorCommands.addCommands({insertParagraph:()=>{JS(e)},mceInsertNewLine:(t,n,o)=>{JS(e,o)},InsertLineBreak:(t,n,o)=>{zS(e,o)}})})(e),(e=>{(e=>{e.editorCommands.addCommands({"InsertUnorderedList,InsertOrderedList":t=>{e.getDoc().execCommand(t);const n=e.dom.getParent(e.selection.getNode(),"ol,ul");if(n){const t=n.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(t.nodeName)){const o=e.selection.getBookmark();e.dom.split(t,n),e.selection.moveToBookmark(o)}}}})})(e),(e=>{e.editorCommands.addCommands({"InsertUnorderedList,InsertOrderedList":t=>{const n=e.dom.getParent(e.selection.getNode(),"ul,ol");return n&&("insertunorderedlist"===t&&"UL"===n.tagName||"insertorderedlist"===t&&"OL"===n.tagName)}},"state")})(e)})(e),(e=>{(e=>{const t=(t,n)=>{e.formatter.toggle(t,n),e.nodeChanged()};e.editorCommands.addCommands({"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":e=>{t(e)},"ForeColor,HiliteColor":(e,n,o)=>{t(e,{value:o})},BackColor:(e,n,o)=>{t("hilitecolor",{value:o})},FontName:(t,n,o)=>{((e,t)=>{const n=bN(e,t);e.formatter.toggle("fontname",{value:vN(n)}),e.nodeChanged()})(e,o)},FontSize:(t,n,o)=>{((e,t)=>{e.formatter.toggle("fontsize",{value:bN(e,t)}),e.nodeChanged()})(e,o)},LineHeight:(t,n,o)=>{((e,t)=>{e.formatter.toggle("lineheight",{value:String(t)}),e.nodeChanged()})(e,o)},Lang:(e,n,o)=>{t(e,{value:o.code,customValue:o.customCode})},RemoveFormat:t=>{e.formatter.remove(t)},mceBlockQuote:()=>{t("blockquote")},FormatBlock:(e,n,o)=>{t(m(o)?o:"p")},mceToggleFormat:(e,n,o)=>{t(o)}})})(e),(e=>{const t=t=>e.formatter.match(t);e.editorCommands.addCommands({"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":e=>t(e),mceBlockQuote:()=>t("blockquote")},"state"),e.editorCommands.addQueryValueHandler("FontName",(()=>(e=>hN(e,(t=>gN(e.getBody(),t.dom))).getOr(""))(e))),e.editorCommands.addQueryValueHandler("FontSize",(()=>(e=>hN(e,(t=>fN(e.getBody(),t.dom))).getOr(""))(e))),e.editorCommands.addQueryValueHandler("LineHeight",(()=>(e=>hN(e,(t=>{const n=mn(e.getBody()),o=Tp(t,(e=>Wn(e,"line-height")),O(bn,n));return o.getOrThunk((()=>{const e=parseFloat($n(t,"line-height")),n=parseFloat($n(t,"font-size"));return String(e/n)}))})).getOr(""))(e)))})(e)})(e),(e=>{e.editorCommands.addCommands({mceRemoveNode:(t,n,o)=>{const r=null!=o?o:e.selection.getNode();if(r!==e.getBody()){const t=e.selection.getBookmark();e.dom.remove(r,!0),e.selection.moveToBookmark(t)}},mcePrint:()=>{e.getWin().print()},mceFocus:(t,n,o)=>{((e,t)=>{e.removed||(t?sf(e):(e=>{const t=e.selection,n=e.getBody();let o=t.getRng();e.quirks.refreshContentEditable(),void 0!==e.bookmark&&!1===rf(e)&&Gm(e).each((t=>{e.selection.setRng(t),o=t}));const r=((e,t)=>e.dom.getParent(t,(t=>"true"===e.dom.getContentEditable(t))))(e,t.getNode());if(e.dom.isChildOf(r,n))return of(r),nf(e,o),void sf(e);e.inline||(Nt.browser.isOpera()||of(n),e.getWin().focus()),(Nt.browser.isFirefox()||e.inline)&&(of(n),nf(e,o)),sf(e)})(e))})(e,o)},mceToggleVisualAid:()=>{e.hasVisual=!e.hasVisual,e.addVisual()}})})(e)};class CN{constructor(e){this.commands={state:{},exec:{},value:{}},this.editor=e}execCommand(e,t,n,o){const r=this.editor,s=e.toLowerCase(),a=null==o?void 0:o.skip_focus;if(r.removed)return!1;if("mcefocus"!==s&&(/^(mceAddUndoLevel|mceEndUndoLevel)$/i.test(s)||a?(e=>{Gm(e).each((t=>e.selection.setRng(t)))})(r):r.focus()),r.dispatch("BeforeExecCommand",{command:e,ui:t,value:n}).isDefaultPrevented())return!1;const i=this.commands.exec[s];return!!x(i)&&(i(s,t,n),r.dispatch("ExecCommand",{command:e,ui:t,value:n}),!0)}queryCommandState(e){if(this.editor.quirks.isHidden()||this.editor.removed)return!1;const t=e.toLowerCase(),n=this.commands.state[t];return!!x(n)&&n(t)}queryCommandValue(e){if(this.editor.quirks.isHidden()||this.editor.removed)return"";const t=e.toLowerCase(),n=this.commands.value[t];return x(n)?n(t):""}addCommands(e,t="exec"){const n=this.commands;fe(e,((e,o)=>{$(o.toLowerCase().split(","),(o=>{n[t][o]=e}))}))}addCommand(e,t,n){const o=e.toLowerCase();this.commands.exec[o]=(e,o,r)=>t.call(null!=n?n:this.editor,o,r)}queryCommandSupported(e){const t=e.toLowerCase();return!!this.commands.exec[t]}addQueryStateHandler(e,t,n){this.commands.state[e.toLowerCase()]=()=>t.call(null!=n?n:this.editor)}addQueryValueHandler(e,t,n){this.commands.value[e.toLowerCase()]=()=>t.call(null!=n?n:this.editor)}}const xN="data-mce-contenteditable",wN=(e,t,n)=>{try{e.getDoc().execCommand(t,!1,String(n))}catch(e){}},kN=(e,t)=>{e.dom.contentEditable=t?"true":"false"},SN=(e,t)=>{const n=mn(e.getBody());((e,t,n)=>{sn(e,t)&&!1===n?rn(e,t):n&&nn(e,t)})(n,"mce-content-readonly",t),t?(e.selection.controlSelection.hideResizeRect(),e._selectionOverrides.hideFakeCaret(),(e=>{M.from(e.selection.getNode()).each((e=>{e.removeAttribute("data-mce-selected")}))})(e),e.readonly=!0,kN(n,!1),$(Js(n,'*[contenteditable="true"]'),(e=>{$t(e,xN,"true"),kN(e,!1)}))):(e.readonly=!1,kN(n,!0),$(Js(n,'*[data-mce-contenteditable="true"]'),(e=>{Yt(e,xN),kN(e,!0)})),wN(e,"StyleWithCSS",!1),wN(e,"enableInlineTableEditing",!1),wN(e,"enableObjectResizing",!1),(e=>rf(e)||(e=>{const t=Pn(mn(e.getElement()));return zm(t).filter((t=>!(e=>{const t=e.classList;return void 0!==t&&(t.contains("tox-edit-area")||t.contains("tox-edit-area__iframe")||t.contains("mce-content-body"))})(t.dom)&&Zm(e,t.dom))).isSome()})(e))(e)&&e.focus(),(e=>{e.selection.setRng(e.selection.getRng())})(e),e.nodeChanged())},_N=e=>e.readonly,EN=e=>{e.parser.addAttributeFilter("contenteditable",(t=>{_N(e)&&$(t,(e=>{e.attr(xN,e.attr("contenteditable")),e.attr("contenteditable","false")}))})),e.serializer.addAttributeFilter(xN,(t=>{_N(e)&&$(t,(e=>{e.attr("contenteditable",e.attr(xN))}))})),e.serializer.addTempAttr(xN)},NN=Bt.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"," ");class RN{constructor(e){this.bindings={},this.settings=e||{},this.scope=this.settings.scope||this,this.toggleEvent=this.settings.toggleEvent||L}static isNative(e){return!!NN[e.toLowerCase()]}fire(e,t){return this.dispatch(e,t)}dispatch(e,t){const n=e.toLowerCase(),o=Ss(n,null!=t?t:{},this.scope);this.settings.beforeFire&&this.settings.beforeFire(o);const r=this.bindings[n];if(r)for(let e=0,t=r.length;e<t;e++){const t=r[e];if(!t.removed){if(t.once&&this.off(n,t.func),o.isImmediatePropagationStopped())return o;if(!1===t.func.call(this.scope,o))return o.preventDefault(),o}}return o}on(e,t,n,o){if(!1===t&&(t=L),t){const r={func:t,removed:!1};o&&Bt.extend(r,o);const s=e.toLowerCase().split(" ");let a=s.length;for(;a--;){const e=s[a];let t=this.bindings[e];t||(t=[],this.toggleEvent(e,!0)),t=n?[r,...t]:[...t,r],this.bindings[e]=t}}return this}off(e,t){if(e){const n=e.toLowerCase().split(" ");let o=n.length;for(;o--;){const r=n[o];let s=this.bindings[r];if(!r)return fe(this.bindings,((e,t)=>{this.toggleEvent(t,!1),delete this.bindings[t]})),this;if(s){if(t){const e=W(s,(e=>e.func===t));s=e.fail,this.bindings[r]=s,$(e.pass,(e=>{e.removed=!0}))}else s.length=0;s.length||(this.toggleEvent(e,!1),delete this.bindings[r])}}}else fe(this.bindings,((e,t)=>{this.toggleEvent(t,!1)})),this.bindings={};return this}once(e,t,n){return this.on(e,t,n,{once:!0})}has(e){return e=e.toLowerCase(),!(!this.bindings[e]||0===this.bindings[e].length)}}const AN=e=>(e._eventDispatcher||(e._eventDispatcher=new RN({scope:e,toggleEvent:(t,n)=>{RN.isNative(t)&&e.toggleNativeEvent&&e.toggleNativeEvent(t,n)}})),e._eventDispatcher),ON={fire(e,t,n){return this.dispatch(e,t,n)},dispatch(e,t,n){const o=this;if(o.removed&&"remove"!==e&&"detach"!==e)return Ss(e.toLowerCase(),null!=t?t:{},o);const r=AN(o).dispatch(e,t);if(!1!==n&&o.parent){let t=o.parent();for(;t&&!r.isPropagationStopped();)t.dispatch(e,r,!1),t=t.parent()}return r},on(e,t,n){return AN(this).on(e,t,n)},off(e,t){return AN(this).off(e,t)},once(e,t){return AN(this).once(e,t)},hasEventListeners(e){return AN(this).has(e)}},TN=Us.DOM;let BN;const DN=(e,t)=>{if("selectionchange"===t)return e.getDoc();if(!e.inline&&/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(t))return e.getDoc().documentElement;const n=ll(e);return n?(e.eventRoot||(e.eventRoot=TN.select(n)[0]),e.eventRoot):e.getBody()},LN=(e,t,n)=>{(e=>!e.hidden&&!_N(e))(e)?e.dispatch(t,n):_N(e)&&((e,t)=>{if((e=>"click"===e.type)(t)&&!ju.metaKeyPressed(t)){const n=mn(t.target);((e,t)=>Ko(t,"a",(t=>bn(t,mn(e.getBody())))).bind((e=>Kt(e,"href"))))(e,n).each((n=>{if(t.preventDefault(),/^#/.test(n)){const t=e.dom.select(`${n},[name="${o=n,ze(o,"#")?((e,t)=>e.substring(t))(o,"#".length):o}"]`);t.length&&e.selection.scrollIntoView(t[0],!0)}else window.open(n,"_blank","rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes");var o}))}})(e,n)},PN=(e,t)=>{let n;if(e.delegates||(e.delegates={}),e.delegates[t]||e.removed)return;const o=DN(e,t);if(ll(e)){if(BN||(BN={},e.editorManager.on("removeEditor",(()=>{e.editorManager.activeEditor||BN&&(fe(BN,((t,n)=>{e.dom.unbind(DN(e,n))})),BN=null)}))),BN[t])return;n=n=>{const o=n.target,r=e.editorManager.get();let s=r.length;for(;s--;){const e=r[s].getBody();(e===o||TN.isChildOf(o,e))&&LN(r[s],t,n)}},BN[t]=n,TN.bind(o,t,n)}else n=n=>{LN(e,t,n)},TN.bind(o,t,n),e.delegates[t]=n},MN={...ON,bindPendingEventDelegates(){const e=this;Bt.each(e._pendingNativeEvents,(t=>{PN(e,t)}))},toggleNativeEvent(e,t){const n=this;"focus"!==e&&"blur"!==e&&(n.removed||(t?n.initialized?PN(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&(n.dom.unbind(DN(n,e),e,n.delegates[e]),delete n.delegates[e])))},unbindAllNativeEvents(){const e=this,t=e.getBody(),n=e.dom;e.delegates&&(fe(e.delegates,((t,n)=>{e.dom.unbind(DN(e,n),n,t)})),delete e.delegates),!e.inline&&t&&n&&(t.onload=null,n.unbind(e.getWin()),n.unbind(e.getDoc())),n&&(n.unbind(t),n.unbind(e.getContainer()))}},IN=e=>m(e)?{value:e.split(/[ ,]/),valid:!0}:k(e,m)?{value:e,valid:!0}:{valid:!1,message:"The value must be a string[] or a comma/space separated string."},FN=(e,t)=>e+(Ke(t.message)?"":`. ${t.message}`),UN=e=>e.valid,zN=(e,t,n="")=>{const o=t(e);return b(o)?o?{value:e,valid:!0}:{valid:!1,message:n}:o},jN=["design","readonly"],VN=(e,t,n,o)=>{const r=n[t.get()],s=n[o];try{s.activate()}catch(e){return void console.error(`problem while activating editor mode ${o}:`,e)}r.deactivate(),r.editorReadOnly!==s.editorReadOnly&&SN(e,s.editorReadOnly),t.set(o),((e,t)=>{e.dispatch("SwitchMode",{mode:t})})(e,o)},HN=Bt.each,$N=Bt.explode,qN={f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123},WN=Bt.makeMap("alt,ctrl,shift,meta,access"),KN=e=>{let t;const n={},o=Nt.os.isMacOS()||Nt.os.isiOS();HN($N(e.toLowerCase(),"+"),(e=>{e in WN?n[e]=!0:/^[0-9]{2,}$/.test(e)?n.keyCode=parseInt(e,10):(n.charCode=e.charCodeAt(0),n.keyCode=qN[e]||e.toUpperCase().charCodeAt(0))}));const r=[n.keyCode];for(t in WN)n[t]?r.push(t):n[t]=!1;return n.id=r.join(","),n.access&&(n.alt=!0,o?n.ctrl=!0:n.shift=!0),n.meta&&(o?n.meta=!0:(n.ctrl=!0,n.meta=!1)),n};class GN{constructor(e){this.shortcuts={},this.pendingPatterns=[],this.editor=e;const t=this;e.on("keyup keypress keydown",(e=>{!t.hasModifier(e)&&!t.isFunctionKey(e)||e.isDefaultPrevented()||(HN(t.shortcuts,(n=>{if(t.matchShortcut(e,n))return t.pendingPatterns=n.subpatterns.slice(0),"keydown"===e.type&&t.executeShortcutAction(n),!0})),t.matchShortcut(e,t.pendingPatterns[0])&&(1===t.pendingPatterns.length&&"keydown"===e.type&&t.executeShortcutAction(t.pendingPatterns[0]),t.pendingPatterns.shift()))}))}add(e,t,n,o){const r=this,s=r.normalizeCommandFunc(n);return HN($N(Bt.trim(e)),(e=>{const n=r.createShortcut(e,t,s,o);r.shortcuts[n.id]=n})),!0}remove(e){const t=this.createShortcut(e);return!!this.shortcuts[t.id]&&(delete this.shortcuts[t.id],!0)}normalizeCommandFunc(e){const t=this,n=e;return"string"==typeof n?()=>{t.editor.execCommand(n,!1,null)}:Bt.isArray(n)?()=>{t.editor.execCommand(n[0],n[1],n[2])}:n}createShortcut(e,t,n,o){const r=Bt.map($N(e,">"),KN);return r[r.length-1]=Bt.extend(r[r.length-1],{func:n,scope:o||this.editor}),Bt.extend(r[0],{desc:this.editor.translate(t),subpatterns:r.slice(1)})}hasModifier(e){return e.altKey||e.ctrlKey||e.metaKey}isFunctionKey(e){return"keydown"===e.type&&e.keyCode>=112&&e.keyCode<=123}matchShortcut(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)}executeShortcutAction(e){return e.func?e.func.call(e.scope):null}}const YN=()=>{const e=(()=>{const e={},t={},n={},o={},r={},s={},a={},i=(e,t)=>(n,o)=>e[n.toLowerCase()]={...o,type:t};return{addButton:i(e,"button"),addGroupToolbarButton:i(e,"grouptoolbarbutton"),addToggleButton:i(e,"togglebutton"),addMenuButton:i(e,"menubutton"),addSplitButton:i(e,"splitbutton"),addMenuItem:i(t,"menuitem"),addNestedMenuItem:i(t,"nestedmenuitem"),addToggleMenuItem:i(t,"togglemenuitem"),addAutocompleter:i(n,"autocompleter"),addContextMenu:i(r,"contextmenu"),addContextToolbar:i(s,"contexttoolbar"),addContextForm:i(s,"contextform"),addSidebar:i(a,"sidebar"),addIcon:(e,t)=>o[e.toLowerCase()]=t,getAll:()=>({buttons:e,menuItems:t,icons:o,popups:n,contextMenus:r,contextToolbars:s,sidebars:a})}})();return{addAutocompleter:e.addAutocompleter,addButton:e.addButton,addContextForm:e.addContextForm,addContextMenu:e.addContextMenu,addContextToolbar:e.addContextToolbar,addIcon:e.addIcon,addMenuButton:e.addMenuButton,addMenuItem:e.addMenuItem,addNestedMenuItem:e.addNestedMenuItem,addSidebar:e.addSidebar,addSplitButton:e.addSplitButton,addToggleButton:e.addToggleButton,addGroupToolbarButton:e.addGroupToolbarButton,addToggleMenuItem:e.addToggleMenuItem,getAll:e.getAll}},XN=Us.DOM,QN=Bt.extend,JN=Bt.each;class ZN{constructor(e,t,n){this.plugins={},this.contentCSS=[],this.contentStyles=[],this.loadedCSS={},this.isNotDirty=!1,this.editorManager=n,this.documentBaseUrl=n.documentBaseURL,QN(this,MN);const o=this;this.id=e,this.hidden=!1;const r=((e,t)=>iN(eN||tN,eN,t,e,t))(n.defaultOptions,t);this.options=((e,t)=>{const n={},o={},r=(e,t,n)=>{const r=zN(t,n);return UN(r)?(o[e]=r.value,!0):(console.warn(FN(`Invalid value passed for the ${e} option`,r)),!1)},s=e=>we(n,e);return{register:(e,s)=>{const a=(e=>m(e.processor))(s)?(e=>{const t=(()=>{switch(e){case"array":return p;case"boolean":return b;case"function":return x;case"number":return w;case"object":return f;case"string":return m;case"string[]":return IN;case"object[]":return e=>k(e,f);case"regexp":return e=>u(e,RegExp)}})();return n=>zN(n,t,`The value must be a ${e}.`)})(s.processor):s.processor,i=((e,t,n)=>{if(!v(t)){const o=zN(t,n);if(UN(o))return o.value;console.error(FN(`Invalid default value passed for the "${e}" option`,o))}})(e,s.default,a);n[e]={...s,default:i,processor:a},xe(o,e).orThunk((()=>xe(t,e))).each((t=>r(e,t,a)))},isRegistered:s,get:e=>xe(o,e).orThunk((()=>xe(n,e).map((e=>e.default)))).getOrUndefined(),set:(e,t)=>{if(s(e)){const o=n[e];return o.immutable?(console.error(`"${e}" is an immutable option and cannot be updated`),!1):r(e,t,o.processor)}return console.warn(`"${e}" is not a registered option. Ensure the option has been registered before setting a value.`),!1},unset:e=>{const t=s(e);return t&&delete o[e],t},isSet:e=>we(o,e)}})(0,r),(e=>{const t=e.options.register;t("id",{processor:"string",default:e.id}),t("selector",{processor:"string"}),t("target",{processor:"object"}),t("suffix",{processor:"string"}),t("cache_suffix",{processor:"string"}),t("base_url",{processor:"string"}),t("referrer_policy",{processor:"string",default:""}),t("language_load",{processor:"boolean"}),t("inline",{processor:"boolean",default:!1}),t("iframe_attrs",{processor:"object",default:{}}),t("doctype",{processor:"string",default:"<!DOCTYPE html>"}),t("document_base_url",{processor:"string",default:e.documentBaseUrl}),t("body_id",{processor:_i(e,"tinymce"),default:"tinymce"}),t("body_class",{processor:_i(e),default:""}),t("content_security_policy",{processor:"string",default:""}),t("br_in_pre",{processor:"boolean",default:!0}),t("forced_root_block",{processor:e=>{const t=m(e)&&We(e);return t?{value:e,valid:t}:{valid:!1,message:"Must be a non-empty string."}},default:"p"}),t("forced_root_block_attrs",{processor:"object",default:{}}),t("br_newline_selector",{processor:"string",default:".mce-toc h2,figcaption,caption"}),t("no_newline_selector",{processor:"string",default:""}),t("keep_styles",{processor:"boolean",default:!0}),t("end_container_on_empty_block",{processor:"boolean",default:!1}),t("font_size_style_values",{processor:"string",default:"xx-small,x-small,small,medium,large,x-large,xx-large"}),t("font_size_legacy_values",{processor:"string",default:"xx-small,small,medium,large,x-large,xx-large,300%"}),t("font_size_classes",{processor:"string",default:""}),t("automatic_uploads",{processor:"boolean",default:!0}),t("images_reuse_filename",{processor:"boolean",default:!1}),t("images_replace_blob_uris",{processor:"boolean",default:!0}),t("icons",{processor:"string",default:""}),t("icons_url",{processor:"string",default:""}),t("images_upload_url",{processor:"string",default:""}),t("images_upload_base_path",{processor:"string",default:""}),t("images_upload_base_path",{processor:"string",default:""}),t("images_upload_credentials",{processor:"boolean",default:!1}),t("images_upload_handler",{processor:"function"}),t("language",{processor:"string",default:"en"}),t("language_url",{processor:"string",default:""}),t("entity_encoding",{processor:"string",default:"named"}),t("indent",{processor:"boolean",default:!0}),t("indent_before",{processor:"string",default:"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"}),t("indent_after",{processor:"string",default:"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"}),t("indent_use_margin",{processor:"boolean",default:!1}),t("indentation",{processor:"string",default:"40px"}),t("content_css",{processor:e=>{const t=!1===e||m(e)||k(e,m);return t?m(e)?{value:H(e.split(","),He),valid:t}:p(e)?{value:e,valid:t}:!1===e?{value:[],valid:t}:{value:e,valid:t}:{valid:!1,message:"Must be false, a string or an array of strings."}},default:yl(e)?[]:["default"]}),t("content_style",{processor:"string"}),t("content_css_cors",{processor:"boolean",default:!1}),t("font_css",{processor:e=>{const t=m(e)||k(e,m);return t?{value:p(e)?e:H(e.split(","),He),valid:t}:{valid:!1,message:"Must be a string or an array of strings."}},default:[]}),t("inline_boundaries",{processor:"boolean",default:!0}),t("inline_boundaries_selector",{processor:"string",default:"a[href],code,.mce-annotation"}),t("object_resizing",{processor:e=>{const t=b(e)||m(e);return t?!1===e||yi.isiPhone()||yi.isiPad()?{value:"",valid:t}:{value:!0===e?"table,img,figure.image,div,video,iframe":e,valid:t}:{valid:!1,message:"Must be boolean or a string"}},default:!Ci}),t("resize_img_proportional",{processor:"boolean",default:!0}),t("event_root",{processor:"object"}),t("service_message",{processor:"string"}),t("theme",{processor:e=>!1===e||m(e)||x(e),default:"silver"}),t("theme_url",{processor:"string"}),t("formats",{processor:"object"}),t("format_empty_lines",{processor:"boolean",default:!1}),t("preview_styles",{processor:e=>{const t=!1===e||m(e);return t?{value:!1===e?"":e,valid:t}:{valid:!1,message:"Must be false or a string"}},default:"font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow"}),t("custom_ui_selector",{processor:"string",default:""}),t("hidden_input",{processor:"boolean",default:!0}),t("submit_patch",{processor:"boolean",default:!0}),t("encoding",{processor:"string"}),t("add_form_submit_trigger",{processor:"boolean",default:!0}),t("add_unload_trigger",{processor:"boolean",default:!0}),t("custom_undo_redo_levels",{processor:"number",default:0}),t("disable_nodechange",{processor:"boolean",default:!1}),t("readonly",{processor:"boolean",default:!1}),t("plugins",{processor:"string[]",default:[]}),t("external_plugins",{processor:"object"}),t("forced_plugins",{processor:"string[]"}),t("model",{processor:"string",default:e.hasPlugin("rtc")?"plugin":"dom"}),t("model_url",{processor:"string"}),t("block_unsupported_drop",{processor:"boolean",default:!0}),t("visual",{processor:"boolean",default:!0}),t("visual_table_class",{processor:"string",default:"mce-item-table"}),t("visual_anchor_class",{processor:"string",default:"mce-item-anchor"}),t("iframe_aria_text",{processor:"string",default:"Rich Text Area. Press ALT-0 for help."}),t("setup",{processor:"function"}),t("init_instance_callback",{processor:"function"}),t("url_converter",{processor:"function",default:e.convertURL}),t("url_converter_scope",{processor:"object",default:e}),t("urlconverter_callback",{processor:"function"}),t("allow_conditional_comments",{processor:"boolean",default:!1}),t("allow_html_data_urls",{processor:"boolean",default:!1}),t("allow_svg_data_urls",{processor:"boolean"}),t("allow_html_in_named_anchor",{processor:"boolean",default:!1}),t("allow_script_urls",{processor:"boolean",default:!1}),t("allow_unsafe_link_target",{processor:"boolean",default:!1}),t("convert_fonts_to_spans",{processor:"boolean",default:!0,deprecated:!0}),t("fix_list_elements",{processor:"boolean",default:!1}),t("preserve_cdata",{processor:"boolean",default:!1}),t("remove_trailing_brs",{processor:"boolean"}),t("inline_styles",{processor:"boolean",default:!0,deprecated:!0}),t("element_format",{processor:"string",default:"html"}),t("entities",{processor:"string"}),t("schema",{processor:"string",default:"html5"}),t("convert_urls",{processor:"boolean",default:!0}),t("relative_urls",{processor:"boolean",default:!0}),t("remove_script_host",{processor:"boolean",default:!0}),t("custom_elements",{processor:"string"}),t("extended_valid_elements",{processor:"string"}),t("invalid_elements",{processor:"string"}),t("invalid_styles",{processor:Si}),t("valid_children",{processor:"string"}),t("valid_classes",{processor:Si}),t("valid_elements",{processor:"string"}),t("valid_styles",{processor:Si}),t("verify_html",{processor:"boolean",default:!0}),t("auto_focus",{processor:e=>m(e)||!0===e}),t("browser_spellcheck",{processor:"boolean",default:!1}),t("protect",{processor:"array"}),t("images_file_types",{processor:"string",default:"jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp"}),t("deprecation_warnings",{processor:"boolean",default:!0}),t("a11y_advanced_options",{processor:"boolean",default:!1}),t("api_key",{processor:"string"}),t("paste_block_drop",{processor:"boolean",default:!1}),t("paste_data_images",{processor:"boolean",default:!0}),t("paste_preprocess",{processor:"function"}),t("paste_postprocess",{processor:"function"}),t("paste_webkit_styles",{processor:"string",default:"none"}),t("paste_remove_styles_if_webkit",{processor:"boolean",default:!0}),t("paste_merge_formats",{processor:"boolean",default:!0}),t("smart_paste",{processor:"boolean",default:!0}),t("paste_as_text",{processor:"boolean",default:!1}),t("paste_tab_spaces",{processor:"number",default:4}),t("text_patterns",{processor:e=>k(e,f)||!1===e?{value:vi(!1===e?[]:e),valid:!0}:{valid:!1,message:"Must be an array of objects or false."},default:[{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"}]}),t("noneditable_class",{processor:"string",default:"mceNonEditable"}),t("editable_class",{processor:"string",default:"mceEditable"}),t("noneditable_regexp",{processor:e=>k(e,wi)?{value:e,valid:!0}:wi(e)?{value:[e],valid:!0}:{valid:!1,message:"Must be a RegExp or an array of RegExp."},default:[]}),t("table_tab_navigation",{processor:"boolean",default:!0}),e.on("ScriptsLoaded",(()=>{t("directionality",{processor:"string",default:Ws.isRtl()?"rtl":void 0}),t("placeholder",{processor:"string",default:xi.getAttrib(e.getElement(),"placeholder")})}))})(o);const s=this.options.get;s("deprecation_warnings")&&((e,t)=>{((e,t)=>{const n=Vv(e),o=Hv(t),r=o.length>0,s=n.length>0,a="mobile"===t.theme;if(r||s||a){const e="\n- ",t=a?`\n\nThemes:${e}mobile`:"",i=r?`\n\nPlugins:${e}${o.join(e)}`:"",l=s?`\n\nOptions:${e}${n.join(e)}`:"";console.warn("The following deprecated features are currently enabled and have been removed in TinyMCE 6.0. These features will no longer work and should be removed from the TinyMCE configuration. See https://www.tiny.cloud/docs/tinymce/6/migration-from-5x/ for more information."+t+i+l)}})(e,t)})(t,r);const a=s("suffix");a&&(n.suffix=a),this.suffix=n.suffix;const i=s("base_url");i&&n._setBaseUrl(i),this.baseUri=n.baseURI;const l=Yi(o);l&&(js.ScriptLoader._setReferrerPolicy(l),Us.DOM.styleSheetLoader._setReferrerPolicy(l)),Ks.languageLoad=s("language_load"),Ks.baseURL=n.baseURL,this.setDirty(!1),this.documentBaseURI=new Fb(Ri(o),{base_uri:this.baseUri}),this.baseURI=this.baseUri,this.inline=yl(o),this.shortcuts=new GN(this),this.editorCommands=new CN(this),yN(this);const d=s("cache_suffix");d&&(Nt.cacheSuffix=d.replace(/^[\?\&]+/,"")),this.ui={registry:YN(),styleSheetLoader:void 0,show:S,hide:S,setEnabled:S,isEnabled:P},this.mode=(e=>{const t=Vs("design"),n=Vs({design:{activate:S,deactivate:S,editorReadOnly:!1},readonly:{activate:S,deactivate:S,editorReadOnly:!0}});return(e=>{e.serializer?EN(e):e.on("PreInit",(()=>{EN(e)}))})(e),(e=>{e.on("ShowCaret",(t=>{_N(e)&&t.preventDefault()})),e.on("ObjectSelected",(t=>{_N(e)&&t.preventDefault()}))})(e),{isReadOnly:()=>_N(e),set:o=>((e,t,n,o)=>{if(o!==n.get()){if(!we(t,o))throw new Error(`Editor mode '${o}' is invalid`);e.initialized?VN(e,n,t,o):e.on("init",(()=>VN(e,n,t,o)))}})(e,n.get(),t,o),get:()=>t.get(),register:(e,t)=>{n.set(((e,t,n)=>{if(j(jN,t))throw new Error(`Cannot override default mode ${t}`);return{...e,[t]:{...n,deactivate:()=>{try{n.deactivate()}catch(e){console.error(`problem while deactivating editor mode ${t}:`,e)}}}}})(n.get(),e,t))}}})(o),n.dispatch("SetupEditor",{editor:this});const c=Pl(o);x(c)&&c.call(o,o)}render(){(e=>{const t=e.id;Ws.setCode(Xi(e));const n=()=>{YE.unbind(window,"ready",n),e.render()};if(!Os.Event.domLoaded)return void YE.bind(window,"ready",n);if(!e.getElement())return;const o=mn(e.getElement()),r=Xt(o);e.on("remove",(()=>{q(o.dom.attributes,(e=>Yt(o,e.name))),qt(o,r)})),e.ui.styleSheetLoader=((e,t)=>Yo.forElement(e,{contentCssCors:Nl(t),referrerPolicy:Yi(t)}))(o,e),yl(e)?e.inline=!0:(e.orgVisibility=e.getElement().style.visibility,e.getElement().style.visibility="hidden");const s=e.getElement().form||YE.getParent(t,"form");s&&(e.formElement=s,Cl(e)&&!Eo(e.getElement())&&(YE.insertAfter(YE.create("input",{type:"hidden",name:t}),t),e.hasHiddenInput=!0),e.formEventDelegate=t=>{e.dispatch(t.type,t)},YE.bind(s,"submit reset",e.formEventDelegate),e.on("reset",(()=>{e.resetContent()})),!xl(e)||s.submit.nodeType||s.submit.length||s._mceOldSubmit||(s._mceOldSubmit=s.submit,s.submit=()=>(e.editorManager.triggerSave(),e.setDirty(!1),s._mceOldSubmit(s)))),e.windowManager=oy(e),e.notificationManager=ey(e),(e=>"xml"===e.options.get("encoding"))(e)&&e.on("GetContent",(e=>{e.save&&(e.content=YE.encode(e.content))})),wl(e)&&e.on("submit",(()=>{e.initialized&&e.save()})),kl(e)&&(e._beforeUnload=()=>{!e.initialized||e.destroyed||e.isHidden()||e.save({format:"raw",no_events:!0,set_dirty:!1})},e.editorManager.on("BeforeUnload",e._beforeUnload)),e.editorManager.add(e),JE(e,e.suffix)})(this)}focus(e){this.execCommand("mceFocus",!1,e)}hasFocus(){return rf(this)}translate(e){return Ws.translate(e)}getParam(e,t,n){const o=this.options;return o.isRegistered(e)||(C(n)?o.register(e,{processor:n,default:t}):o.register(e,{processor:P,default:t})),o.isSet(e)||v(t)?o.get(e):t}hasPlugin(e,t){return!(!j(Rl(this),e)||t&&void 0===ty.get(e))}nodeChanged(e){this._nodeChangeDispatcher.nodeChanged(e)}addCommand(e,t,n){this.editorCommands.addCommand(e,t,n)}addQueryStateHandler(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)}addQueryValueHandler(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)}addShortcut(e,t,n,o){this.shortcuts.add(e,t,n,o)}execCommand(e,t,n,o){return this.editorCommands.execCommand(e,t,n,o)}queryCommandState(e){return this.editorCommands.queryCommandState(e)}queryCommandValue(e){return this.editorCommands.queryCommandValue(e)}queryCommandSupported(e){return this.editorCommands.queryCommandSupported(e)}show(){const e=this;e.hidden&&(e.hidden=!1,e.inline?e.getBody().contentEditable="true":(XN.show(e.getContainer()),XN.hide(e.id)),e.load(),e.dispatch("show"))}hide(){const e=this;e.hidden||(e.save(),e.inline?(e.getBody().contentEditable="false",e===e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(XN.hide(e.getContainer()),XN.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.dispatch("hide"))}isHidden(){return this.hidden}setProgressState(e,t){this.dispatch("ProgressState",{state:e,time:t})}load(e){const t=this;let n,o=t.getElement();if(t.removed)return"";if(o){(e=e||{}).load=!0;const r=Eo(o)?o.value:o.innerHTML;return n=t.setContent(r,e),e.element=o,e.no_events||t.dispatch("LoadContent",e),e.element=o=null,n}}save(e){const t=this;let n,o,r=t.getElement();if(r&&t.initialized&&!t.removed)return(e=e||{}).save=!0,e.element=r,n=e.content=t.getContent(e),e.no_events||t.dispatch("SaveContent",e),"raw"===e.format&&t.dispatch("RawSaveContent",e),n=e.content,Eo(r)?r.value=n:(!e.is_removing&&t.inline||(r.innerHTML=n),(o=XN.getParent(t.id,"form"))&&JN(o.elements,(e=>{if(e.name===t.id)return e.value=n,!1}))),e.element=r=null,!1!==e.set_dirty&&t.setDirty(!1),n}setContent(e,t){return Uv(this,e,t)}getContent(e){return((e,t={})=>{const n=((e,t)=>({...e,format:t,get:!0,getInner:!0}))(t,t.format?t.format:"html");return Xb(e,n).fold(R,(t=>{const n=((e,t)=>Rv(e).editor.getContent(t))(e,t);return Qb(e,n,t)}))})(this,e)}insertContent(e,t){t&&(e=QN({content:e},t)),this.execCommand("mceInsertContent",!1,e)}resetContent(e){void 0===e?Uv(this,this.startContent,{format:"raw"}):Uv(this,e),this.undoManager.reset(),this.setDirty(!1),this.nodeChanged()}isDirty(){return!this.isNotDirty}setDirty(e){const t=!this.isNotDirty;this.isNotDirty=!e,e&&e!==t&&this.dispatch("dirty")}getContainer(){const e=this;return e.container||(e.container=XN.get(e.editorContainer||e.id+"_parent")),e.container}getContentAreaContainer(){return this.contentAreaContainer}getElement(){return this.targetElm||(this.targetElm=XN.get(this.id)),this.targetElm}getWin(){const e=this;let t;return e.contentWindow||(t=e.iframeElement,t&&(e.contentWindow=t.contentWindow)),e.contentWindow}getDoc(){const e=this;let t;return e.contentDocument||(t=e.getWin(),t&&(e.contentDocument=t.document)),e.contentDocument}getBody(){const e=this.getDoc();return this.bodyElement||(e?e.body:null)}convertURL(e,t,n){const o=this,r=o.options.get,s=Il(o);return x(s)?s.call(o,e,n,!0,t):!r("convert_urls")||n&&"LINK"===n.nodeName||0===e.indexOf("file:")||0===e.length?e:r("relative_urls")?o.documentBaseURI.toRelative(e):e=o.documentBaseURI.toAbsolute(e,r("remove_script_host"))}addVisual(e){((e,t)=>{((e,t)=>{Av(e).editor.addVisual(t)})(e,t)})(this,e)}remove(){(e=>{if(!e.removed){const{_selectionOverrides:t,editorUpload:n}=e,o=e.getBody(),r=e.getElement();o&&e.save({is_removing:!0}),e.removed=!0,e.unbindAllNativeEvents(),e.hasHiddenInput&&r&&$v.remove(r.nextSibling),(e=>{e.dispatch("remove")})(e),e.editorManager.remove(e),!e.inline&&o&&(e=>{$v.setStyle(e.id,"display",e.orgDisplay)})(e),(e=>{e.dispatch("detach")})(e),$v.remove(e.getContainer()),qv(t),qv(n),e.destroy()}})(this)}destroy(e){((e,t)=>{const{selection:n,dom:o}=e;e.destroyed||(t||e.removed?(t||(e.editorManager.off("beforeunload",e._beforeUnload),e.theme&&e.theme.destroy&&e.theme.destroy(),qv(n),qv(o)),(e=>{const t=e.formElement;t&&(t._mceOldSubmit&&(t.submit=t._mceOldSubmit,t._mceOldSubmit=null),$v.unbind(t,"submit reset",e.formEventDelegate))})(e),(e=>{e.contentAreaContainer=e.formElement=e.container=e.editorContainer=null,e.bodyElement=e.contentDocument=e.contentWindow=null,e.iframeElement=e.targetElm=null,e.selection&&(e.selection=e.selection.win=e.selection.dom=e.selection.dom.doc=null)})(e),e.destroyed=!0):e.remove())})(this,e)}uploadImages(){return this.editorUpload.uploadImages()}_scanForImages(){return this.editorUpload.scanForImages()}}const eR=Us.DOM,tR=Bt.each;let nR,oR=!1,rR=[];const sR=e=>{const t=e.type;tR(dR.get(),(n=>{switch(t){case"scroll":n.dispatch("ScrollWindow",e);break;case"resize":n.dispatch("ResizeWindow",e)}}))},aR=e=>{if(e!==oR){const t=Us.DOM;e?(t.bind(window,"resize",sR),t.bind(window,"scroll",sR)):(t.unbind(window,"resize",sR),t.unbind(window,"scroll",sR)),oR=e}},iR=e=>{const t=rR;return rR=K(rR,(t=>e!==t)),dR.activeEditor===e&&(dR.activeEditor=rR.length>0?rR[0]:null),dR.focusedEditor===e&&(dR.focusedEditor=null),t.length!==rR.length},lR="CSS1Compat"!==document.compatMode,dR={...ON,baseURI:null,baseURL:null,defaultOptions:{},documentBaseURL:null,suffix:null,majorVersion:"6",minorVersion:"0.3",releaseDate:"2022-05-25",i18n:Ws,activeEditor:null,focusedEditor:null,setup(){const e=this;let t,n,o="";n=Fb.getDocumentBaseUrl(document.location),/^[^:]+:\/\/\/?[^\/]+\//.test(n)&&(n=n.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(n)||(n+="/"));const r=window.tinymce||window.tinyMCEPreInit;if(r)t=r.base||r.baseURL,o=r.suffix;else{const e=document.getElementsByTagName("script");for(let n=0;n<e.length;n++){const r=e[n].src||"";if(""===r)continue;const s=r.substring(r.lastIndexOf("/"));if(/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(r)){-1!==s.indexOf(".min")&&(o=".min"),t=r.substring(0,r.lastIndexOf("/"));break}}if(!t&&document.currentScript){const e=document.currentScript.src;-1!==e.indexOf(".min")&&(o=".min"),t=e.substring(0,e.lastIndexOf("/"))}}var s;e.baseURL=new Fb(n).toAbsolute(t),e.documentBaseURL=n,e.baseURI=new Fb(e.baseURL),e.suffix=o,(s=e).on("AddEditor",O(ef,s)),s.on("RemoveEditor",O(tf,s))},overrideDefaults(e){const t=e.base_url;t&&this._setBaseUrl(t);const n=e.suffix;e.suffix&&(this.suffix=n),this.defaultOptions=e;const o=e.plugin_base_urls;void 0!==o&&fe(o,((e,t)=>{Ks.PluginManager.urls[t]=e}))},init(e){const t=this;let n;const o=Bt.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"," ");let r=e=>{n=e};const s=()=>{let n=0;const a=[];let i;eR.unbind(window,"ready",s),(n=>{const o=e.onpageload;o&&o.apply(t,[])})(),i=((e,t)=>{const n=[],o=x(t)?e=>V(n,(n=>t(n,e))):e=>j(n,e);for(let t=0,r=e.length;t<r;t++){const r=e[t];o(r)||n.push(r)}return n})((e=>Nt.browser.isIE()||Nt.browser.isEdge()?(ly("TinyMCE does not support the browser you are using. For a list of supported browsers please see: https://www.tiny.cloud/docs/tinymce/6/support/#supportedwebbrowsers"),[]):lR?(ly("Failed to initialize the editor as the document is not in standards mode. TinyMCE requires standards mode."),[]):m(e.selector)?eR.select(e.selector):C(e.target)?[e.target]:[])(e)),Bt.each(i,(e=>{var n;(n=t.get(e.id))&&n.initialized&&!(n.getContainer()||n.getBody()).parentNode&&(iR(n),n.unbindAllNativeEvents(),n.destroy(!0),n.removed=!0,n=null)})),i=Bt.grep(i,(e=>!t.get(e.id))),0===i.length?r([]):tR(i,(s=>{((e,t)=>e.inline&&t.tagName.toLowerCase()in o)(e,s)?ly("Could not initialize inline editor on invalid inline target element",s):((e,o,s)=>{const l=new ZN(e,o,t);a.push(l),l.on("init",(()=>{++n===i.length&&r(a)})),l.targetElm=l.targetElm||s,l.render()})((e=>{let t=e.id;return t||(t=xe(e,"name").filter((e=>!eR.get(e))).getOrThunk(eR.uniqueId),e.setAttribute("id",t)),t})(s),e,s)}))};return eR.bind(window,"ready",s),new Promise((e=>{n?e(n):r=t=>{e(t)}}))},get(e){return 0===arguments.length?rR.slice(0):m(e)?Q(rR,(t=>t.id===e)).getOr(null):w(e)&&rR[e]?rR[e]:null},add(e){const t=this,n=t.get(e.id);return n===e||(null===n&&rR.push(e),aR(!0),t.activeEditor=e,t.dispatch("AddEditor",{editor:e}),nR||(nR=e=>{const n=t.dispatch("BeforeUnload");if(n.returnValue)return e.preventDefault(),e.returnValue=n.returnValue,n.returnValue},window.addEventListener("beforeunload",nR))),e},createEditor(e,t){return this.add(new ZN(e,t,this))},remove(e){const t=this;let n,o;if(e){if(!m(e))return o=e,h(t.get(o.id))?null:(iR(o)&&t.dispatch("RemoveEditor",{editor:o}),0===rR.length&&window.removeEventListener("beforeunload",nR),o.remove(),aR(rR.length>0),o);tR(eR.select(e),(e=>{o=t.get(e.id),o&&t.remove(o)}))}else for(n=rR.length-1;n>=0;n--)t.remove(rR[n])},execCommand(e,t,n){var o;const r=this,s=f(n)?null!==(o=n.id)&&void 0!==o?o:n.index:n;switch(e){case"mceAddEditor":if(!r.get(s)){const e=n.options;new ZN(s,e,r).render()}return!0;case"mceRemoveEditor":{const e=r.get(s);return e&&e.remove(),!0}case"mceToggleEditor":{const e=r.get(s);return e?(e.isHidden()?e.show():e.hide(),!0):(r.execCommand("mceAddEditor",!1,n),!0)}}return!!r.activeEditor&&r.activeEditor.execCommand(e,t,n)},triggerSave:()=>{tR(rR,(e=>{e.save()}))},addI18n:(e,t)=>{Ws.add(e,t)},translate:e=>Ws.translate(e),setActive(e){const t=this.activeEditor;this.activeEditor!==e&&(t&&t.dispatch("deactivate",{relatedTarget:e}),e.dispatch("activate",{relatedTarget:t})),this.activeEditor=e},_setBaseUrl(e){this.baseURL=new Fb(this.documentBaseURL).toAbsolute(e.replace(/\/+$/,"")),this.baseURI=new Fb(this.baseURL)}};dR.setup();const cR=(()=>{const e=Gs();return{FakeClipboardItem:e=>({items:e,types:ue(e),getType:t=>xe(e,t).getOrUndefined()}),write:t=>{e.set(t)},read:()=>e.get().getOrUndefined(),clear:e.clear}})(),uR=Math.min,mR=Math.max,fR=Math.round,gR=(e,t,n)=>{let o=t.x,r=t.y;const s=e.w,a=e.h,i=t.w,l=t.h,d=(n||"").split("");return"b"===d[0]&&(r+=l),"r"===d[1]&&(o+=i),"c"===d[0]&&(r+=fR(l/2)),"c"===d[1]&&(o+=fR(i/2)),"b"===d[3]&&(r-=a),"r"===d[4]&&(o-=s),"c"===d[3]&&(r-=fR(a/2)),"c"===d[4]&&(o-=fR(s/2)),pR(o,r,s,a)},pR=(e,t,n,o)=>({x:e,y:t,w:n,h:o}),hR={inflate:(e,t,n)=>pR(e.x-t,e.y-n,e.w+2*t,e.h+2*n),relativePosition:gR,findBestRelativePosition:(e,t,n,o)=>{let r,s;for(s=0;s<o.length;s++)if(r=gR(e,t,o[s]),r.x>=n.x&&r.x+r.w<=n.w+n.x&&r.y>=n.y&&r.y+r.h<=n.h+n.y)return o[s];return null},intersect:(e,t)=>{const n=mR(e.x,t.x),o=mR(e.y,t.y),r=uR(e.x+e.w,t.x+t.w),s=uR(e.y+e.h,t.y+t.h);return r-n<0||s-o<0?null:pR(n,o,r-n,s-o)},clamp:(e,t,n)=>{let o=e.x,r=e.y,s=e.x+e.w,a=e.y+e.h;const i=t.x+t.w,l=t.y+t.h,d=mR(0,t.x-o),c=mR(0,t.y-r),u=mR(0,s-i),m=mR(0,a-l);return o+=d,r+=c,n&&(s+=d,a+=c,o-=u,r-=m),s-=u,a-=m,pR(o,r,s-o,a-r)},create:pR,fromClientRect:e=>pR(e.left,e.top,e.width,e.height)},bR=(()=>{const e={},t={};return{load:(n,o)=>{const r=`Script at URL "${o}" failed to load`,s=`Script at URL "${o}" did not call \`tinymce.Resource.add('${n}', data)\` within 1 second`;if(void 0!==e[n])return e[n];{const a=new Promise(((e,a)=>{const i=((e,t,n=1e3)=>{let o=!1,r=null;const s=e=>(...t)=>{o||(o=!0,null!==r&&(clearTimeout(r),r=null),e.apply(null,t))},a=s(e),i=s(t);return{start:(...e)=>{o||null!==r||(r=setTimeout((()=>i.apply(null,e)),n))},resolve:a,reject:i}})(e,a);t[n]=i.resolve,js.ScriptLoader.loadScript(o).then((()=>i.start(s)),(()=>i.reject(r)))}));return e[n]=a,a}},add:(n,o)=>{void 0!==t[n]&&(t[n](o),delete t[n]),e[n]=Promise.resolve(o)},unload:t=>{delete e[t]}}})();let vR;try{const e="__storage_test__";vR=window.localStorage,vR.setItem(e,e),vR.removeItem(e)}catch(e){vR=(()=>{let e={},t=[];const n={getItem:t=>e[t]||null,setItem:(n,o)=>{t.push(n),e[n]=String(o)},key:e=>t[e],removeItem:n=>{t=t.filter((e=>e===n)),delete e[n]},clear:()=>{t=[],e={}},length:0};return Object.defineProperty(n,"length",{get:()=>t.length,configurable:!1,enumerable:!1}),n})()}const yR={geom:{Rect:hR},util:{Delay:Xm,Tools:Bt,VK:ju,URI:Fb,EventDispatcher:RN,Observable:ON,I18n:Ws,LocalStorage:vR,ImageUploader:e=>{const t=uy(),n=py(e,t);return{upload:(t,o=!0)=>n.upload(t,o?gy(e):void 0)}}},dom:{EventUtils:Os,TreeWalker:Xo,TextSeeker:ma,DOMUtils:Us,ScriptLoader:js,RangeUtils:bm,Serializer:Fv,StyleSheetLoader:Go,ControlSelection:Vu,BookmarkManager:Du,Selection:Pv,Event:Os.Event},html:{Styles:xs,Entities:ls,Node:xf,Schema:Cs,DomParser:Gb,Writer:Af,Serializer:Of},Env:Nt,AddOnManager:Ks,Annotator:Bu,Formatter:Ey,UndoManager:Ry,EditorCommands:CN,WindowManager:oy,NotificationManager:ey,EditorObservable:MN,Shortcuts:GN,Editor:ZN,FocusManager:Ym,EditorManager:dR,DOM:Us.DOM,ScriptLoader:js.ScriptLoader,PluginManager:ty,ThemeManager:ny,ModelManager:Kv,IconManager:Wv,Resource:bR,FakeClipboard:cR,trim:Bt.trim,isArray:Bt.isArray,is:Bt.is,toArray:Bt.toArray,makeMap:Bt.makeMap,each:Bt.each,map:Bt.map,grep:Bt.grep,inArray:Bt.inArray,extend:Bt.extend,walk:Bt.walk,resolve:Bt.resolve,explode:Bt.explode,_addCacheSuffix:Bt._addCacheSuffix},CR=Bt.extend(dR,yR);(e=>{window.tinymce=e,window.tinyMCE=e})(CR),(e=>{if("object"==typeof module)try{module.exports=e}catch(e){}})(CR)}();
\ No newline at end of file